Skip to content

Commit fb12f34

Browse files
committed
Fix pmx exporter for bone/vertex morphs, and fix consistency of shape key "mmd_bind" driver
1 parent aa816c4 commit fb12f34

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

mmd_tools/core/morph.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,9 @@ def __cleanup(self, names_in_use=None):
324324
if kb.name not in names_in_use:
325325
if kb.name.startswith('mmd_bind'):
326326
kb.driver_remove('value')
327+
ms = morph_sliders[kb.relative_key.name]
328+
kb.relative_key.slider_min, kb.relative_key.slider_max = min(ms.slider_min, floor(ms.value)), max(ms.slider_max, ceil(ms.value))
329+
kb.relative_key.value = ms.value
327330
kb.relative_key.mute = False
328331
ObjectOp(mesh).shape_key_remove(kb)
329332
elif kb.name in morph_sliders and self.__shape_key_driver_check(kb):

mmd_tools/core/pmx/exporter.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -672,8 +672,26 @@ def __export_bone_morphs(self, root):
672672
return
673673
categories = self.CATEGORIES
674674
pose_bones = self.__armature.pose.bones
675-
use_pose_mode = mmd_root.is_built and self.__armature.data.pose_position != 'REST'
676-
bone_util_cls = BoneConverterPoseMode if use_pose_mode else BoneConverter
675+
matrix_world = self.__armature.matrix_world
676+
bone_util_cls = BoneConverterPoseMode if self.__armature.data.pose_position != 'REST' else BoneConverter
677+
678+
class _RestBone:
679+
def __init__(self, b):
680+
self.matrix_local = matmul(matrix_world, b.bone.matrix_local)
681+
682+
class _PoseBone: # world space
683+
def __init__(self, b):
684+
self.bone = _RestBone(b)
685+
self.matrix = matmul(matrix_world, b.matrix)
686+
self.matrix_basis = b.matrix_basis
687+
self.location = b.location
688+
689+
converter_cache = {}
690+
def _get_converter(b):
691+
if b not in converter_cache:
692+
converter_cache[b] = bone_util_cls(_PoseBone(blender_bone), self.__scale, invert=True)
693+
return converter_cache[b]
694+
677695
for morph in mmd_root.bone_morphs:
678696
bone_morph = pmx.BoneMorph(
679697
name=morph.name,
@@ -690,7 +708,7 @@ def __export_bone_morphs(self, root):
690708
if blender_bone is None:
691709
logging.warning('Bone Morph (%s): Bone "%s" was not found.', morph.name, data.bone)
692710
continue
693-
converter = bone_util_cls(blender_bone, self.__scale, invert=True)
711+
converter = _get_converter(blender_bone)
694712
morph_data.location_offset = converter.convert_location(data.location)
695713
rw, rx, ry, rz = data.rotation
696714
rw, rx, ry, rz = converter.convert_rotation([rx, ry, rz, rw])
@@ -1126,10 +1144,12 @@ def __init__(self, uvs):
11261144
shape_key_name = kb.name
11271145
logging.info(' - processing shape key: %s', shape_key_name)
11281146
kb_mute, kb.mute = kb.mute, False
1147+
kb_value, kb.value = kb.value, 1.0
11291148
meshObj.active_shape_key_index = i
11301149
mesh = _to_mesh(meshObj)
11311150
mesh.transform(pmx_matrix)
11321151
kb.mute = kb_mute
1152+
kb.value = kb_value
11331153
if len(mesh.vertices) != len(base_vertices):
11341154
logging.warning(' * Error! vertex count mismatch!')
11351155
continue
@@ -1174,7 +1194,6 @@ def __init__(self, uvs):
11741194

11751195
def __loadMeshData(self, meshObj, bone_map):
11761196
show_only_shape_key = meshObj.show_only_shape_key
1177-
meshObj.show_only_shape_key = True
11781197
active_shape_key_index = meshObj.active_shape_key_index
11791198
meshObj.active_shape_key_index = 0
11801199
uv_textures = getattr(meshObj.data, 'uv_textures', meshObj.data.uv_layers)
@@ -1191,6 +1210,7 @@ def __loadMeshData(self, meshObj, bone_map):
11911210

11921211
try:
11931212
logging.info('Loading mesh: %s', meshObj.name)
1213+
meshObj.show_only_shape_key = bool(muted_modifiers)
11941214
return self.__doLoadMeshData(meshObj, bone_map)
11951215
finally:
11961216
meshObj.show_only_shape_key = show_only_shape_key

0 commit comments

Comments
 (0)