OSDN Git Service

fix pmd. fix mqo.
authorousttrue <ousttrue@gmail.com>
Sun, 20 Jun 2010 14:24:15 +0000 (23:24 +0900)
committerousttrue <ousttrue@gmail.com>
Sun, 20 Jun 2010 14:24:15 +0000 (23:24 +0900)
swig/blender/bl24.py
swig/blender/bl25.py
swig/blender/mqo_export.py
swig/blender/mqo_import.py
swig/blender/pmd_import.py
swig/setup.py

index a843938..4eceed0 100644 (file)
@@ -532,7 +532,7 @@ def meshAddMaterial(mesh, material):
 def meshAddMqoGeometry(mesh, o, materials, imageMap, scale):
     # add vertices
     mesh.verts.extend(Mathutils.Vector(0, 0, 0)) # dummy
-    mesh.verts.extend([(v.x, -v.z, v.y) for v in o.vertices])
+    mesh.verts.extend([(v.x * scale, -v.z * scale, v.y * scale) for v in o.vertices])
     # add faces
     mesh_faces=[]
     for face in o.faces:
@@ -779,6 +779,13 @@ def boneLayerMask(bone, layers):
             mask+=(1<<i)
     bone.layerMask=mask
 
+def objectLayerMask(object, layers):
+    mask=0
+    for i, enable in enumerate(layers):
+        if enable!=0:
+            mask+=(1<<i)
+    object.layerMask=mask
+
 def objectPinShape(o):
     o.pinShape=True
 
index 536b1c0..6b8d723 100644 (file)
@@ -424,6 +424,15 @@ def boneLayerMask(bone, layers):
             layer.append(False)
     bone.layer=layer
 
+def objectLayerMask(object, layers):
+    layer=[]
+    for i in range(20):
+        try:
+            layer.append(True if layers[i]!=0 else False)
+        except IndexError:
+            layer.append(False)
+    object.layers=layer
+
 def objectPinShape(o):
     o.shape_key_lock=True
 
index c80f608..55a3668 100644 (file)
@@ -82,10 +82,12 @@ class ObjectInfo(object):
 \r
 \r
 class MqoExporter(object):\r
-    __slots__=["materials", "objects"]\r
-    def __init__(self):\r
+    __slots__=["materials", "objects", 'scale',]\r
+    def __init__(self, scale):\r
         self.objects=[]\r
         self.materials=[]\r
+        self.scale=scale\r
+        print('scaling', self.scale)\r
 \r
     def setup(self, scene):\r
         # 木構造を構築する\r
@@ -187,7 +189,7 @@ class MqoExporter(object):
         # mirroring                \r
         isMirrorring=False\r
         for mod in obj.modifiers:\r
-                if mod.name=="Mirror":\r
+                if mod.name.upper()=="MIRROR":\r
                         isMirrorring=True\r
                         break\r
         if isMirrorring:\r
@@ -198,7 +200,8 @@ class MqoExporter(object):
         io.write("\tvertex %d {\r\n" % len(mesh.verts))\r
         for vert in mesh.verts:\r
             x, y, z = convert_to_mqo(vert.co)\r
-            io.write("\t\t%f %f %f\r\n" % (x, y, z)) # rotate to y-up\r
+            io.write("\t\t%f %f %f\r\n" % \r
+                    (x*self.scale, y*self.scale, z*self.scale)) # rotate to y-up\r
         io.write("\t}\r\n")\r
 \r
         # faces\r
@@ -207,7 +210,11 @@ class MqoExporter(object):
             count=bl.faceVertexCount(face)\r
             # V\r
             io.write("\t\t%d V(" % count)\r
+            face_list=[]\r
             for j in bl.faceVertices(face):\r
+                face_list.insert(0, j)\r
+            # flip face\r
+            for j in face_list:\r
                 io.write("%d " % j)\r
             io.write(")")\r
             # mat\r
@@ -217,8 +224,12 @@ class MqoExporter(object):
             # UV\r
             if bl.meshHasUV(mesh) and bl.faceHasUV(mesh, i, face):\r
                 io.write(" UV(")\r
+                uv_list=[]\r
                 for uv in bl.faceGetUV(mesh, i, face, count):\r
                     # reverse vertical value\r
+                    uv_list.insert(0, uv)\r
+                # flip face\r
+                for uv in uv_list:\r
                     io.write("%f %f " % (uv[0], 1.0-uv[1])) \r
                 io.write(")")\r
             io.write("\r\n")\r
@@ -231,7 +242,7 @@ class MqoExporter(object):
 \r
 \r
 def __execute(filename, scene, scale):\r
-    exporter=MqoExporter()\r
+    exporter=MqoExporter(scale)\r
     exporter.setup(scene)\r
     exporter.write(filename, scene)\r
 \r
@@ -287,18 +298,18 @@ else:
                 name="Directory", \r
                 description="Directory of the file.")\r
 \r
+        scale = FloatProperty(\r
+                name="Scale", \r
+                description="Scale the MQO by this value", \r
+                min=0.0001, max=1000000.0, \r
+                soft_min=0.001, soft_max=100.0, default=100.0)\r
+\r
         check_existing = BoolProperty(\r
                 name="Check Existing",\r
                 description="Check and warn on overwriting existing files",\r
                 default=True,\r
                 options=set('HIDDEN'))\r
 \r
-        scale = FloatProperty(\r
-                name="Scale", \r
-                description="Scale the MQO by this value", \r
-                min=0.0001, max=1000000.0, \r
-                soft_min=0.001, soft_max=100.0, default=1.0)\r
-\r
         def execute(self, context):\r
             execute_25(\r
                     self.properties.path, \r
index 7f38f0e..d5c7142 100644 (file)
@@ -21,6 +21,7 @@ This script imports a mqo into Blender for editing.
 0.5 20100311: create armature from mikoto bone.\r
 0.6 20100505: C extension.\r
 0.7 20100606: integrate 2.4 and 2.5.\r
+0.8 20100619: fix multibyte object name.\r
 '''\r
 \r
 \r
@@ -98,7 +99,7 @@ def __createMaterials(scene, mqo, directory):
     return materials, imageMap\r
 \r
 \r
-def __createObjects(scene, mqo, root, materials, imageMap, scale=1.0):\r
+def __createObjects(scene, mqo, root, materials, imageMap, scale):\r
     """\r
     create blender mesh objects.\r
     """\r
@@ -117,15 +118,12 @@ def __createObjects(scene, mqo, root, materials, imageMap, scale=1.0):
         bl.objectMakeParent(stack[-1], mesh_object)\r
         stack.append(mesh_object)\r
 \r
-        if o.name.startswith('sdef'):\r
-            # add sdef object\r
+        if o.getName().startswith('sdef'):\r
             objects.append(mesh_object)\r
-        elif o.name.startswith('anchor'):\r
-            #print("hide %s" % o.name)\r
-            #mesh_object.restrictDisplay=False\r
-            mesh_object.layers=[2]\r
-        elif o.name.startswith('bone'):\r
-            mesh_object.layers=[2]\r
+        elif o.getName().startswith('anchor'):\r
+            bl.objectLayerMask(mesh_object, [0, 1])\r
+        elif o.getName().startswith('bone'):\r
+            bl.objectLayerMask(mesh_object, [0, 1])\r
 \r
         bl.meshAddMqoGeometry(mesh, o, materials, imageMap, scale)\r
 \r
@@ -214,7 +212,7 @@ else:
                 name="Scale", \r
                 description="Scale the MQO by this value", \r
                 min=0.0001, max=1000000.0, \r
-                soft_min=0.001, soft_max=100.0, default=1.0)\r
+                soft_min=0.001, soft_max=100.0, default=0.01)\r
 \r
         def execute(self, context):\r
             execute_25(\r
index 3f7b33b..7ae67a4 100644 (file)
@@ -25,6 +25,7 @@ This script imports a pmd into Blender for editing.
 1.0: 20100530: add invisilbe bone tail(armature layer 2).
 1.1: 20100608: integrate 2.4 and 2.5.
 1.2: 20100616: implement rigid body.
+1.3: 20100619: fix for various models.
 """
 
 MMD_SHAPE_GROUP_NAME='_MMD_SHAPE'
@@ -99,8 +100,16 @@ def to_radian(degree):
 
 
 def get_bone_name(l, index):
-    name=englishmap.getEnglishBoneName(l.bones[index].getName())
-    return name if name else l.bones[index].getName()
+    if index==0xFFFF:
+        return l.bones[0].getName()
+
+    if index < len(l.bones):
+        name=englishmap.getEnglishBoneName(l.bones[index].getName())
+        if name:
+            return name
+        return l.bones[index].getName()
+    print('invalid bone index', index)
+    return l.bones[0].getName()
 
 def __importShape(obj, l, vertex_map):
     if len(l.morph_list)==0:
@@ -209,12 +218,9 @@ def __build(armature, b, p, parent):
 
     bone=bl.createArmatureBone(armature, name)
 
-    if b.tail_index==0:
-        # 先端ボーン
-        assert(b.type==6 or b.type==7 or b.type==9)
+    if parent and (b.tail_index==0 or b.type==6 or b.type==7 or b.type==9):
         bone.head = bl.createVector(*convert_coord(b.pos))
         bone.tail=bone.head+bl.createVector(0, 1, 0)
-        assert(parent)
         bone.parent=parent
         if bone.name=="center_t":
             # センターボーンは(0, 1, 0)の方向を向いていないと具合が悪い
@@ -222,7 +228,11 @@ def __build(armature, b, p, parent):
             bone.head=parent.tail
             bone.tail=bone.head+bl.createVector(0, 1, 0)
         else:
-            assert(parent.tail==bone.head)
+            if parent.tail==bone.head:
+                pass
+            else:
+                print('diffurence with parent.tail and head', name)
+
         bl.boneSetConnected(bone)
         # armature layer 2
         bl.boneLayerMask(bone, [0, 1])
@@ -531,7 +541,6 @@ def __importMesh(scene, io, tex_dir):
     while material_offset<len(io.materials):
         mesh, meshObject=bl.createMesh(scene, 'mesh')
         # create object
-        #meshObject.layers = [1]
         mesh_objects.append(meshObject)
 
         # activate object
index 9202076..61652f9 100644 (file)
@@ -64,7 +64,7 @@ else:
 for i in range(len(ext_modules)+1):
     try:
         setup(name="meshio",
-                version='0.8',
+                version='0.9',
                 description='polygon mesh io utilities',
                 author='ousttrue',
                 author_email='ousttrue@gmail.com',