update to new shader system
[carveJwlIkooP6JGAAIwe30JlM.git] / blender_export.py
index e599ee7b5ab5371093e87b7f83fef2f504224d24..3e7567d8b09734f4616c976a4f585a5c42dde575 100644 (file)
@@ -6,7 +6,8 @@ class model(Structure):
    _fields_ = [("identifier",c_uint32),
                ("vertex_count",c_uint32),
                ("indice_count",c_uint32),
-               ("layer_count",c_uint32)]
+               ("layer_count",c_uint32),
+               ("marker_count",c_uint32)]
 
 class sdf_primative(Structure):
    _pack_ = 1
@@ -25,6 +26,13 @@ class submodel(Structure):
                ("sdf_type",c_int32),
                ("name",c_char*32)]
 
+class marker(Structure):
+   _pack_ = 1
+   _fields_ = [("co",c_float*3),
+               ( "q",c_float*4),
+               ( "s",c_float*3),
+               ("name",c_char*32)]
+
 class model_vert(Structure):
    _pack_ = 1
    _fields_ = [("co",c_float*3),
@@ -32,10 +40,93 @@ class model_vert(Structure):
                ("colour",c_float*4),
                ("uv",c_float*2)]
 
-def fixed_string(dest,string):
-   return
-   for i in range(len(string)):
-      dest[i] = string[i]
+def v4_dot( a, b ):
+       return a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*a[3]
+
+def v4_length( a ):
+   return math.sqrt( v4_dot(a,a) )
+
+def m3x3_mul( a, b, d ):
+   a00 = a[0][0]
+   a01 = a[0][1]
+   a02 = a[0][2]
+   a10 = a[1][0]
+   a11 = a[1][1]
+   a12 = a[1][2]
+   a20 = a[2][0]
+   a21 = a[2][1]
+   a22 = a[2][2]
+   b00 = b[0][0]
+   b01 = b[0][1]
+   b02 = b[0][2]
+   b10 = b[1][0]
+   b11 = b[1][1]
+   b12 = b[1][2]
+   b20 = b[2][0]
+   b21 = b[2][1]
+   b22 = b[2][2]
+   d[0][0] = a00*b00 + a10*b01 + a20*b02
+   d[0][1] = a01*b00 + a11*b01 + a21*b02
+   d[0][2] = a02*b00 + a12*b01 + a22*b02
+   d[1][0] = a00*b10 + a10*b11 + a20*b12
+   d[1][1] = a01*b10 + a11*b11 + a21*b12
+   d[1][2] = a02*b10 + a12*b11 + a22*b12
+   d[2][0] = a00*b20 + a10*b21 + a20*b22
+   d[2][1] = a01*b20 + a11*b21 + a21*b22
+   d[2][2] = a02*b20 + a12*b21 + a22*b22
+
+def q_m3x3( q, d ):
+   l = v4_length(q)
+   s = 2.0 if l > 0.0 else 0.0
+   xx = s*q[0]*q[0]
+   xy = s*q[0]*q[1]
+   wx = s*q[3]*q[0]
+   yy = s*q[1]*q[1]
+   yz = s*q[1]*q[2]
+   wy = s*q[3]*q[1]
+   zz = s*q[2]*q[2]
+   xz = s*q[0]*q[2]
+   wz = s*q[3]*q[2]
+   d[0][0] = 1.0 - yy - zz
+   d[1][1] = 1.0 - xx - zz
+   d[2][2] = 1.0 - xx - yy
+   d[0][1] = xy + wz
+   d[1][2] = yz + wx
+   d[2][0] = xz + wy
+   d[1][0] = xy - wz
+   d[2][1] = yz - wx
+   d[0][2] = xz - wy
+
+def m3x3_q( m, q ):
+   diag = m[0][0] + m[1][1] + m[2][2]
+   if diag >= 0.0:
+      r    = math.sqrt( 1.0 + diag )
+      rinv = 0.5 / r
+      q[0] = rinv * (m[1][2] - m[2][1])
+      q[1] = rinv * (m[2][0] - m[0][2])
+      q[2] = rinv * (m[0][1] - m[1][0])
+      q[3] = r    * 0.5
+   elif m[0][0] >= m[1][1] and m[0][0] >= m[2][2]:
+      r    = math.sqrt( 1.0 - m[1][1] - m[2][2] + m[0][0] )
+      rinv = 0.5 / r
+      q[0] = r    * 0.5
+      q[1] = rinv * (m[0][1] + m[1][0])
+      q[2] = rinv * (m[0][2] + m[2][0])
+      q[3] = rinv * (m[1][2] - m[2][1])
+   elif m[1][1] >= m[2][2]:
+      r    = math.sqrt( 1.0 - m[0][0] - m[2][2] + m[1][1] )
+      rinv = 0.5 / r
+      q[0] = rinv * (m[0][1] + m[1][0])
+      q[1] = r    * 0.5
+      q[2] = rinv * (m[1][2] + m[2][1])
+      q[3] = rinv * (m[2][0] - m[0][2])
+   else:
+      r    = math.sqrt( 1.0 - m[0][0] - m[1][1] + m[2][2] )
+      rinv = 0.5 / r
+      q[0] = rinv * (m[0][2] + m[2][0])
+      q[1] = rinv * (m[1][2] + m[2][1])
+      q[2] = r    * 0.5
+      q[3] = rinv * (m[0][1] - m[1][0])
 
 def write_model(name):
    fp = open(F"/home/harry/Documents/carve/models/{name}.mdl", "wb")
@@ -48,11 +139,33 @@ def write_model(name):
    header.layer_count = 0
 
    layers = []
+   markers = []
    vertex_buffer = []
    indice_buffer = []
 
    for obj in collection.objects:
-      if obj.type == 'MESH':
+      if obj.type == 'EMPTY':
+         mk = marker()
+         mk.co[0] =  obj.location[0]
+         mk.co[1] =  obj.location[2]
+         mk.co[2] = -obj.location[1]
+         
+         # Convert rotation quat to our space type
+         quat = obj.matrix_world.to_quaternion()
+         mk.q[0] =  quat[1]
+         mk.q[1] =  quat[3]
+         mk.q[2] = -quat[2]
+         mk.q[3] =  quat[0]
+         
+         mk.s[0] = obj.scale[0]
+         mk.s[1] = obj.scale[2]
+         mk.s[2] = obj.scale[1]
+         mk.name = obj.name.encode('utf-8')
+
+         markers += [mk]
+         header.marker_count += 1
+
+      elif obj.type == 'MESH':
          dgraph = bpy.context.evaluated_depsgraph_get()
          data = obj.evaluated_get(dgraph).data
          data.calc_loop_triangles()
@@ -134,6 +247,8 @@ def write_model(name):
    fp.write( bytearray( header ) )
    for l in layers:
       fp.write( bytearray(l) )
+   for m in markers:
+      fp.write( bytearray(m) )
    for v in vertex_buffer:
       fp.write( bytearray(v) )
    for i in indice_buffer:
@@ -141,11 +256,5 @@ def write_model(name):
 
    fp.close()
 
-write_model( "test" )
-write_model( "free_dev" )
-write_model( "char_dev" )
-write_model( "skydome" )
-write_model( "cement_r1" )
-
 for col in bpy.data.collections["export"].children:
    write_model( col.name )