("ik_target",c_uint32),
("ik_pole",c_uint32),
("collider",c_uint32),
+ ("use_limits",c_uint32),
+ ("angle_limits",(c_float*3)*2),
("hitbox",(c_float*3)*2)]
+class subclass_audio_channel(Structure):
+ _pack_ = 1
+ _fields_ = [("sound",c_uint32),
+ ("target",c_uint32),
+ ("")]
+
+class classtype_audio_system(Structure):
+ _pack_ = 1
+ _fields_ = [("sounds", subclass_audio_channel * 4),
+ ("len", c_uint32)]
+
+class classtype_audio_zone(Structure):
+ _pack_ = 1
+ _fields_ = [("system",c_uint32)]
+
# Exporter
# ==============================================================================
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]
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':
# 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):
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()
bone.hitbox[1][1] = 0.0
bone.hitbox[1][2] = 0.0
+ if obj.cv_data.con0:
+ bone.use_limits = 1
+ bone.angle_limits[0][0] = obj.cv_data.mins[0]
+ bone.angle_limits[0][1] = obj.cv_data.mins[2]
+ bone.angle_limits[0][2] = -obj.cv_data.maxs[1]
+ bone.angle_limits[1][0] = obj.cv_data.maxs[0]
+ bone.angle_limits[1][1] = obj.cv_data.maxs[2]
+ bone.angle_limits[1][2] = -obj.cv_data.mins[1]
+ else:
+ bone.use_limits = 0
+ bone.angle_limits[0][0] = 0.0
+ bone.angle_limits[0][1] = 0.0
+ bone.angle_limits[0][2] = 0.0
+ bone.angle_limits[1][0] = 0.0
+ bone.angle_limits[1][1] = 0.0
+ bone.angle_limits[1][2] = 0.0
+
bone.deform = node_def['deform']
entdata_buffer += [bone]
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
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"
_.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 )