_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
("vertex_start",c_uint32),
("vertex_count",c_uint32),
("bbx",(c_float*3)*2),
+ ("pivot",c_float*3),
("sdf",sdf_primative),
("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),
("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")
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()
sm.vertex_count = len(data.vertices)
sm.indice_count = len(data.loop_triangles)*3
sm.sdf_type = 0
+ sm.pivot[0] = obj.matrix_world.translation[0]
+ sm.pivot[1] = obj.matrix_world.translation[2]
+ sm.pivot[2] = -obj.matrix_world.translation[1]
+
for i in range(3):
sm.bbx[0][i] = 999999
sm.bbx[1][i] = -999999
v.co[0] = vert.co[0]
v.co[1] = vert.co[2]
v.co[2] = -vert.co[1]
- v.colour[0] = 0.0
- v.colour[1] = 0.0
- v.colour[2] = 0.0
+ v.colour[0] = 1.0
+ v.colour[1] = 1.0
+ v.colour[2] = 1.0
v.colour[3] = 1.0
vertex_buffer += [v]
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:
fp.close()
-write_model( "test" )
-write_model( "free_dev" )
-write_model( "char_dev" )
+for col in bpy.data.collections["export"].children:
+ write_model( col.name )