X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=blender_export.py;h=c44694abc0ea5b6e41e36fec86cdfaa1ff5ce181;hb=ba5f879f85b9cab1e2b37241399d79709fe4f584;hp=04fd6c344b69245f172dc139801d24196f5c1b04;hpb=b4c9550f206c476bb38b0bb2855d35e6b31bee83;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/blender_export.py b/blender_export.py index 04fd6c3..c44694a 100644 --- a/blender_export.py +++ b/blender_export.py @@ -132,8 +132,7 @@ class classtype_route_node(Structure): class classtype_route(Structure): _pack_ = 1 - _fields_ = [("pstr_name",c_uint32), - ("id_start",c_uint32), + _fields_ = [("id_start",c_uint32), ("colour",c_float*3)] class classtype_skin(Structure): @@ -205,6 +204,9 @@ def write_model(collection_name): def emplace_material( mat ): nonlocal material_cache, material_buffer + if mat == None: + return 0 + if mat.name in material_cache: return material_cache[mat.name] @@ -395,7 +397,9 @@ def write_model(collection_name): can_use_cache = True for mod in obj.modifiers: - if mod.type == 'DATA_TRANSFER' or mod.type == 'SHRINKWRAP': + if mod.type == 'DATA_TRANSFER' or mod.type == 'SHRINKWRAP' or \ + mod.type == 'BOOLEAN' or mod.type == 'CURVE' or \ + mod.type == 'ARRAY': can_use_cache = False if mod.type == 'ARMATURE': @@ -471,7 +475,11 @@ def write_model(collection_name): # WEight groups # if armature_def: - weight_groups = sorted( data.vertices[vi].groups, key = \ + src_groups = [_ for _ in data.vertices[vi].groups \ + if obj.vertex_groups[_.group].name in \ + armature_def['bones']] + + weight_groups = sorted( src_groups, key = \ lambda a: a.weight, reverse=True ) tot = 0.0 for ml in range(3): @@ -653,12 +661,25 @@ def write_model(collection_name): for pb in armature.pose.bones: if pb.name == bone_name: rb = armature.data.bones[ bone_name ] - - loc, rot, sca = pb.matrix_basis.decompose() + + # relative bone matrix + if rb.parent is not None: + offset_mtx = rb.parent.matrix_local + offset_mtx = offset_mtx.inverted_safe() @ \ + rb.matrix_local + + inv_parent = pb.parent.matrix @ offset_mtx + inv_parent.invert_safe() + fpm = inv_parent @ pb.matrix + else: + bone_mtx = rb.matrix.to_4x4() + local_inv = rb.matrix_local.inverted_safe() + fpm = bone_mtx @ local_inv @ pb.matrix + + loc, rot, sca = fpm.decompose() # local position - vp = rb.matrix @ loc - final_pos = Vector(( vp[0], vp[2], -vp[1] )) + final_pos = Vector(( loc[0], loc[2], -loc[1] )) # rotation lc_m = pb.matrix_channel.to_3x3() @@ -833,7 +854,6 @@ def write_model(collection_name): node.classtype = 9 entdata_length += sizeof( classtype_route ) r = classtype_route() - r.pstr_name = emplace_string("not-implemented") r.colour[0] = obj.cv_data.colour[0] r.colour[1] = obj.cv_data.colour[1] r.colour[2] = obj.cv_data.colour[2] @@ -1011,7 +1031,7 @@ def cv_draw(): for obj in bpy.context.collection.objects: if obj.type == 'ARMATURE': for bone in obj.data.bones: - if bone.cv_data.collider: + if bone.cv_data.collider and obj.data.pose_position == 'REST': c = bone.head_local a = bone.cv_data.v0 b = bone.cv_data.v1 @@ -1336,17 +1356,10 @@ class CV_BONE_SETTINGS(bpy.types.PropertyGroup): v0: bpy.props.FloatVectorProperty(name="v0",size=3) v1: bpy.props.FloatVectorProperty(name="v1",size=3) + con0: bpy.props.BoolProperty(name="Constriant 0",default=False) mins: bpy.props.FloatVectorProperty(name="mins",size=3) maxs: bpy.props.FloatVectorProperty(name="maxs",size=3) - con0: bpy.props.BoolProperty(name="Constriant 0",default=False) - c0: bpy.props.FloatVectorProperty(name="dir",size=3) - s0: bpy.props.FloatVectorProperty(name="limits",size=3) - - con1: bpy.props.BoolProperty(name="Constriant 1",default=False) - c1: bpy.props.FloatVectorProperty(name="dir",size=3) - s1: bpy.props.FloatVectorProperty(name="limits",size=3) - class CV_BONE_PANEL(bpy.types.Panel): bl_label="Bone Config" bl_idname="SCENE_PT_cv_bone" @@ -1366,16 +1379,9 @@ class CV_BONE_PANEL(bpy.types.Panel): _.layout.prop( bone.cv_data, "v1" ) _.layout.label( text="Angle Limits" ) + _.layout.prop( bone.cv_data, "con0" ) _.layout.prop( bone.cv_data, "mins" ) _.layout.prop( bone.cv_data, "maxs" ) - - _.layout.prop( bone.cv_data, "con0" ) - _.layout.prop( bone.cv_data, "c0" ) - _.layout.prop( bone.cv_data, "s0" ) - - _.layout.prop( bone.cv_data, "con1" ) - _.layout.prop( bone.cv_data, "c1" ) - _.layout.prop( bone.cv_data, "s1" ) class CV_SCENE_SETTINGS(bpy.types.PropertyGroup): use_hidden: bpy.props.BoolProperty( name="use hidden", default=False )