X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=blender_export.py;h=3e7567d8b09734f4616c976a4f585a5c42dde575;hb=7758c7efec3956c68294bc914e7524045a2b1bd7;hp=05f2b6ffc833747ef8d2d9b90b2e5a625a940b21;hpb=fc32ce17923a42f9a0f250e4ab21a08411a41acb;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/blender_export.py b/blender_export.py index 05f2b6f..3e7567d 100644 --- a/blender_export.py +++ b/blender_export.py @@ -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 @@ -20,10 +21,18 @@ class submodel(Structure): ("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), @@ -31,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") @@ -47,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() @@ -63,6 +177,10 @@ def write_model(name): 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 @@ -129,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: @@ -136,8 +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 )