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:
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
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
\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
# 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
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
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
# 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
\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
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
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
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
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
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
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'
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:
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)の方向を向いていないと具合が悪い
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])
while material_offset<len(io.materials):
mesh, meshObject=bl.createMesh(scene, 'mesh')
# create object
- #meshObject.layers = [1]
mesh_objects.append(meshObject)
# activate object
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',