for v in args])
return newfn
+def register():
+ pass
+
+def unregister():
+ pass
SCENE=None
def initialize(name, scene):
return empty
@staticmethod
+ def each():
+ for o in SCENE.objects:
+ yield o
+
+ @staticmethod
def makeParent(parent, child):
parent.makeParent([child])
def isIKSolver(c):
return c.type==Blender.Constraint.Type.IKSOLVER
-
else:
INTERNAL_ENCODING=FS_ENCODING
+def register():
+ pass
+
+def unregister():
+ pass
+
SCENE=None
def initialize(name, scene):
global SCENE
return empty
@staticmethod
+ def each():
+ for o in SCENE.objects:
+ yield o
+
+ @staticmethod
def makeParent(parent, child):
child.parent=parent
def duplicate(o):
global SCENE
bpy.ops.object.select_all(action='DESELECT')
- o.selected=True
+ o.select=True
SCENE.objects.active=o
bpy.ops.object.duplicate()
dumy=SCENE.objects.active
@staticmethod
def select(o):
- o.selected=True
+ o.select=True
@staticmethod
def activate(o):
global SCENE
- o.selected=True
+ o.select=True
SCENE.objects.active=o
@staticmethod
@staticmethod
def isVisible(o):
- return o.restrict_view
+ return False if o.hide else True
@staticmethod
def getShapeKeys(o):
texture=bpy.data.textures.new(os.path.basename(path))
texture.type='IMAGE'
texture=texture.recast_type()
- image=bpy.data.images.load(path)
- texture.image=image
texture.mipmap=True
texture.interpolation=True
texture.use_alpha=True
+ try:
+ image=bpy.data.images.load(path)
+ except SystemError:
+ image=bpy.data.images.new('Image')
+ texture.image=image
return texture, image
@staticmethod
if t.type=="IMAGE":
image=t.image
if image:
- return image.filename
+ return image.filepath
class material:
image=texture.image
if not image:
continue
- yield image.filename
+ yield image.filepath
@staticmethod
def eachEnalbeTexturePath(m):
image=texture.image
if not image:
continue
- yield image.filename
+ yield image.filepath
class mesh:
enterObjectMode()
for i in remove_vertices:
- m.verts[i].selected=True
+ m.verts[i].select=True
enterEditMode()
bpy.ops.mesh.delete(type='VERT')
def isIKSolver(c):
return c.type=='IK'
-
MAP_25={
"bl24.py": "bl24.py",
"bl25.py": "bl25.py",
- "mqo_import.py": "import_scene_mqo.py",
- "mqo_export.py": "export_scene_mqo.py",
- "pmd_import.py": "import_scene_pmd.py",
- "pmd_export.py": "export_scene_pmd.py",
+ "mqo_import.py": "io_import_scene_mqo.py",
+ "mqo_export.py": "io_export_scene_mqo.py",
+ "pmd_import.py": "io_import_scene_pmd.py",
+ "pmd_export.py": "io_export_scene_pmd.py",
}
DST_25=[
- "T:/Blender/blender-2.5-alpha2-win32/.blender/scripts/io",
- "T:/Blender/bf-blender/build2.5/bin/Debug/.blender/scripts/io",
- "T:/Blender/bf-blender/build2.5git/bin/Release/.blender/scripts/io",
- "T:/Blender/1340_Release/Release/.blender/scripts/io",
+ #"T:/Blender/blender-2.5-alpha2-win32/.blender/scripts/io",
+ #"T:/Blender/bf-blender/build2.5/bin/Debug/.blender/scripts/io",
+ #"T:/Blender/bf-blender/build2.5git/bin/Release/.blender/scripts/io",
+ #"T:/Blender/1340_Release/Release/.blender/scripts/io",
+ "T:/Blender/bf-blender/build2.5git/bin/Release/2.53/scripts/addons",
+ "T:/Blender/blender-2.53-beta-windows32/2.53/scripts/addons",
"io",
]
"""
__author__= 'ousttrue'
__url__ = ["http://gunload.web.fc2.com/blender/"]
-__version__= '0.3 2010/06/06'
+__version__= '2.0'
__bpydoc__ = """\
This script is an exporter to MQO file format.
0.3 20100606: integrate 2.4 and 2.5.
0.4 20100626: refactoring.
0.5 20100710: add [apply_modifier] option(2.5 only).
+0.6 20100714: remove shape_key when apply_modifier. fix material.
+2.0 20100724: update for Blender2.53.
"""
+bl_addon_info = {
+ 'category': 'Import/Export',
+ 'name': 'Export: Metasequioa Model Format (.mqo)',
+ 'author': 'ousttrue',
+ 'version': '2.0',
+ 'blender': (2, 5, 3),
+ 'location': 'File > Export',
+ 'description': 'Export to the Metasequioa Model Format (.mqo)',
+ 'warning': '', # used for warning icon and text in addons panel
+ 'wiki_url': 'http://sourceforge.jp/projects/meshio/wiki/FrontPage',
+ }
+
import os
import sys
def isBlender24():
return sys.version_info[0]<3
+
+class MQOMaterial(object):
+ __slots__=[
+ 'name', 'shader', 'r', 'g', 'b', 'a',
+ 'dif', 'amb', 'emi',
+ ]
+ def __init__(self, name, shader=3):
+ self.name=name
+ self.shader=shader
+ self.r=0.5
+ self.g=0.5
+ self.b=0.5
+ self.a=1
+ self.dif=1
+ self.amb=0
+ self.emi=0
+
+ def __str__(self):
+ return "\"%s\" shader(%d) col(%f %f %f %f) dif(%f) amb(%f) emi(%f)" % (
+ self.name, self.shader, self.r, self.g, self.b, self.a,
+ self.dif, self.amb, self.emi
+ )
+
+
if isBlender24():
# for 2.4
import Blender
import bl24 as bl
def materialToMqo(m):
- return "\"%s\" shader(3) col(%f %f %f %f)" % (
- m.name, m.rgbCol[0], m.rgbCol[1], m.rgbCol[2], m.alpha)
+ material=MQOMaterial(m.name, 3)
+ material.r=m.rgbCol[0]
+ material.g=m.rgbCol[1]
+ material.b=m.rgbCol[2]
+ material.a=m.alpha
+ return material
else:
# for 2.5
import bl25 as bl
def materialToMqo(m):
- return "\"%s\" shader(3) col(%f %f %f %f)" % (
- m.name,
- m.diffuse_color[0], m.diffuse_color[1], m.diffuse_color[2],
- m.alpha)
+ material=MQOMaterial(m.name, 3)
+ material.r=m.diffuse_color[0]
+ material.g=m.diffuse_color[1]
+ material.b=m.diffuse_color[2]
+ material.a=m.alpha
+ material.amb=m.ambient
+ material.emi=m.emit
+ return material
def apply_transform(vec, matrix):
x, y, z = vec
# each material
io.write("Material %d {\r\n" % (len(self.materials)))
for m in self.materials:
- io.write(materialToMqo(m))
+ io.write(str(materialToMqo(m)))
# ToDo separated alpha texture
for filename in bl.material.eachTexturePath(m):
if len(dirname)>0 and filename.startswith(dirname):
bpy.ops.object.location_apply()
# apply modifier
if self.apply_modifier:
+ # remove shape key
+ while bl.object.hasShapeKey(copyObj):
+ bpy.ops.object.shape_key_remove()
for m in [m for m in copyObj.modifiers]:
if m.type=='SOLIDFY':
continue
# List of operator properties, the attributes will be assigned
# to the class instance from the operator settings before calling.
-
- path = bpy.props.StringProperty(
- name="File Path",
- description="File path used for exporting the MQO file",
- maxlen= 1024,
- default= ""
- )
- filename = bpy.props.StringProperty(
- name="File Name",
- description="Name of the file.")
- directory = bpy.props.StringProperty(
- name="Directory",
- description="Directory of the file.")
+ filepath = bpy.props.StringProperty()
+ filename = bpy.props.StringProperty()
+ directory = bpy.props.StringProperty()
scale = bpy.props.FloatProperty(
name="Scale",
description="Would apply modifiers",
default=False)
- check_existing = bpy.props.BoolProperty(
- name="Check Existing",
- description="Check and warn on overwriting existing files",
- default=True,
- options=set('HIDDEN'))
-
def execute(self, context):
execute_25(
- self.properties.path,
+ self.properties.filepath,
context.scene,
self.properties.scale,
self.properties.apply_modifier)
# register menu
def menu_func(self, context):
- #default_path=bpy.data.filename.replace(".blend", ".mqo")
+ default_path=bpy.data.filepath.replace(".blend", ".mqo")
self.layout.operator(
EXPORT_OT_mqo.bl_idname,
- text="Metasequoia (.mqo)")#.path=default_path
+ text="Metasequoia (.mqo)",
+ icon='PLUGIN'
+ ).filepath=default_path
def register():
bpy.types.register(EXPORT_OT_mqo)
"""\r
__author__=['ousttrue']\r
__url__ = ["http://gunload.web.fc2.com/blender/"]\r
-__version__= '0.6 2010/05/05'\r
+__version__= '2.0'\r
__bpydoc__= '''\\r
\r
MQO Importer\r
0.7 20100606: integrate 2.4 and 2.5.\r
0.8 20100619: fix multibyte object name.\r
0.9 20100626: refactoring.\r
+2.0 20100724: update for Blender2.53.\r
'''\r
\r
+bl_addon_info = {\r
+ 'category': 'Import/Export',\r
+ 'name': 'Import: Metasequioa Model Format (.mqo)',\r
+ 'author': 'ousttrue',\r
+ 'version': '2.0',\r
+ 'blender': (2, 5, 3),\r
+ 'location': 'File > Import',\r
+ 'description': 'Import from the Metasequioa Model Format (.mqo)',\r
+ 'warning': '', # used for warning icon and text in addons panel\r
+ 'wiki_url': 'http://sourceforge.jp/projects/meshio/wiki/FrontPage',\r
+ }\r
+\r
import os\r
import sys\r
\r
else:\r
# for 2.5\r
import bpy\r
- from bpy.props import *\r
\r
# wrapper\r
import bl25 as bl\r
\r
# List of operator properties, the attributes will be assigned\r
# to the class instance from the operator settings before calling.\r
+ filepath = bpy.props.StringProperty()\r
+ filename = bpy.props.StringProperty()\r
+ directory = bpy.props.StringProperty()\r
\r
- path = StringProperty(\r
- name="File Path", \r
- description="File path used for importing the MQO file", \r
- maxlen= 1024, default= "")\r
- filename = StringProperty(\r
- name="File Name", \r
- description="Name of the file.")\r
- directory = StringProperty(\r
- name="Directory", \r
- description="Directory of the file.")\r
-\r
- scale = FloatProperty(\r
+ scale = bpy.props.FloatProperty(\r
name="Scale", \r
description="Scale the MQO by this value", \r
min=0.0001, max=1000000.0, \r
\r
def execute(self, context):\r
execute_25(\r
- self.properties.path, \r
+ self.properties.filepath, \r
context.scene, \r
self.properties.scale)\r
return 'FINISHED'\r
def menu_func(self, context): \r
self.layout.operator(\r
IMPORT_OT_mqo.bl_idname, \r
- text="Metasequoia (.mqo)")\r
+ text="Metasequoia (.mqo)",\r
+ icon='PLUGIN'\r
+ )\r
\r
def register():\r
bpy.types.register(IMPORT_OT_mqo)\r
Tooltip: 'Export PMD file for MikuMikuDance.'
"""
__author__= ["ousttrue"]
-__version__= "1.6"
+__version__= "2.0"
__url__=()
__bpydoc__="""
pmd Importer
1.5 20100629: sphere map.
1.6 20100710: toon texture & bone group.
1.7 20100711: separate vertex with normal or uv.
+2.0 20100724: update for Blender2.53.
"""
+bl_addon_info = {
+ 'category': 'Import/Export',
+ 'name': 'Export: MikuMikuDance Model Format (.pmd)',
+ 'author': 'ousttrue',
+ 'version': '2.0',
+ 'blender': (2, 5, 3),
+ 'location': 'File > Export',
+ 'description': 'Export to the MikuMikuDance Model Format (.pmd)',
+ 'warning': '', # used for warning icon and text in addons panel
+ 'wiki_url': 'http://sourceforge.jp/projects/meshio/wiki/FrontPage',
+ }
+
MMD_SHAPE_GROUP_NAME='_MMD_SHAPE'
+MMD_MB_NAME='mb_name'
+MMD_MB_COMMENT='mb_comment'
+MMD_COMMENT='comment'
BASE_SHAPE_NAME='Basis'
+RIGID_NAME='rigid_name'
RIGID_SHAPE_TYPE='rigid_shape_type'
RIGID_PROCESS_TYPE='rigid_process_type'
RIGID_BONE_NAME='rigid_bone_name'
else:
# for 2.5
import bpy
- from bpy.props import *
import mathutils
# wrapper
class OneSkinMesh(object):
- __slots__=['scene', 'vertexArray', 'morphList',
- 'rigidbodies',
- 'constraints',
- ]
- def __init__(self, scene):
+ __slots__=['vertexArray', 'morphList', 'rigidbodies', 'constraints', ]
+ def __init__(self):
self.vertexArray=VertexArray()
self.morphList=[]
self.rigidbodies=[]
self.constraints=[]
- self.scene=scene
def __str__(self):
return "<OneSkinMesh %s, morph:%d>" % (
len(self.morphList))
def addMesh(self, obj):
- if bl.object.isVisible(obj):
+ if not bl.object.isVisible(obj):
return
self.__mesh(obj)
self.__skin(obj)
# メッシュのコピーを生成してオブジェクトの行列を適用する
copyMesh, copyObj=bl.object.duplicate(obj)
- if len(copyMesh.verts)==0:
- return
- # apply transform
- copyObj.scale=obj.scale
- bpy.ops.object.scale_apply()
- copyObj.rotation_euler=obj.rotation_euler
- bpy.ops.object.rotation_apply()
- copyObj.location=obj.location
- bpy.ops.object.location_apply()
- # apply modifier
- for m in [m for m in copyObj.modifiers]:
- if m.type=='SOLIDFY':
- continue
- elif m.type=='ARMATURE':
- continue
- elif m.type=='MIRROR':
- bpy.ops.object.modifier_apply(modifier=m.name)
- else:
- print(m.type)
-
- weightMap, secondWeightMap=self.__getWeightMap(copyObj, copyMesh)
- self.__processFaces(obj.name, copyMesh, weightMap, secondWeightMap)
+ if len(copyMesh.verts)>0:
+ # apply transform
+ copyObj.scale=obj.scale
+ bpy.ops.object.scale_apply()
+ copyObj.rotation_euler=obj.rotation_euler
+ bpy.ops.object.rotation_apply()
+ copyObj.location=obj.location
+ bpy.ops.object.location_apply()
+ # apply modifier
+ for m in [m for m in copyObj.modifiers]:
+ if m.type=='SOLIDFY':
+ continue
+ elif m.type=='ARMATURE':
+ continue
+ elif m.type=='MIRROR':
+ bpy.ops.object.modifier_apply(modifier=m.name)
+ else:
+ print(m.type)
+ weightMap, secondWeightMap=self.__getWeightMap(copyObj, copyMesh)
+ self.__processFaces(obj.name, copyMesh, weightMap, secondWeightMap)
bl.object.delete(copyObj)
def createEmptyBasicSkin(self):
class Bone(object):
__slots__=['index', 'name', 'ik_index',
'pos', 'tail', 'parent_index', 'tail_index', 'type', 'isConnect']
- def __init__(self, name, pos, tail):
+ def __init__(self, name, pos, tail, isConnect):
self.index=-1
self.name=name
self.pos=pos
self.parent_index=None
self.tail_index=None
self.type=0
- self.isConnect=False
+ self.isConnect=isConnect
self.ik_index=0
def __eq__(self, rhs):
# get bones
####################
for b in armature.bones.values():
- if b.name=='center':
- # root bone
- bone=Bone(b.name,
- bl.bone.getHeadLocal(b),
- bl.bone.getTailLocal(b))
- self.__addBone(bone)
- self.__getBone(bone, b)
-
- for b in armature.bones.values():
- if not b.parent and b.name!='center':
+ if not b.parent:
# root bone
bone=Bone(b.name,
bl.bone.getHeadLocal(b),
- bl.bone.getTailLocal(b))
+ bl.bone.getTailLocal(b),
+ False)
self.__addBone(bone)
self.__getBone(bone, b)
if b.type==6 or b.type==7:
# fix tail bone
parent=self.bones[b.parent_index]
+ #print('parnet', parent.name)
parent.tail_index=b.index
for b in self.bones:
for i, c in enumerate(b.children):
bone=Bone(c.name,
bl.bone.getHeadLocal(c),
- bl.bone.getTailLocal(c))
+ bl.bone.getTailLocal(c),
+ bl.bone.isConnected(c))
self.__addBone(bone)
if parent:
bone.parent_index=parent.index
- if i==0:
+ #if i==0:
+ if bone.isConnect or (not parent.tail_index and parent.tail==bone.pos):
parent.tail_index=bone.index
self.__getBone(bone, c)
class PmdExporter(object):
- def setup(self, scene):
+ __slots__=[
+ 'armatureObj',
+ 'oneSkinMesh',
+ 'englishName',
+ 'englishComment',
+ 'name',
+ 'comment',
+ 'skeleton',
+ ]
+ def setup(self):
self.armatureObj=None
- self.scene=scene
# 木構造を構築する
object_node_map={}
- for o in scene.objects:
+ for o in bl.object.each():
object_node_map[o]=Node(o)
- for o in scene.objects:
- #for node in object_node_map.values():
+ for o in bl.object.each():
node=object_node_map[o]
if node.o.parent:
object_node_map[node.o.parent].children.append(node)
# ルートを得る
- root=object_node_map[scene.objects.active]
+ root=object_node_map[bl.object.getActive()]
+ o=root.o
+ self.englishName=o.name
+ self.englishComment=o[MMD_COMMENT] if MMD_COMMENT in o else 'blender export\n'
+ self.name=o[MMD_MB_NAME] if MMD_MB_NAME in o else 'Blenderエクスポート'
+ self.comment=o[MMD_MB_COMMENT] if MMD_MB_COMMENT in o else 'Blnderエクスポート\n'
# ワンスキンメッシュを作る
- self.oneSkinMesh=OneSkinMesh(scene)
+ self.oneSkinMesh=OneSkinMesh()
self.__createOneSkinMesh(root)
bl.message(self.oneSkinMesh)
if len(self.oneSkinMesh.morphList)==0:
# create emtpy skin
self.oneSkinMesh.createEmptyBasicSkin()
- self.name=root.o.name
-
# skeleton
self.skeleton=BoneBuilder()
self.skeleton.build(self.armatureObj)
for child in node.children:
self.__createOneSkinMesh(child)
- def write(self, path, scene):
+ def write(self, path):
io=pmd.IO()
- io.name=self.name
- io.comment="blender export"
+ io.setName(toCP932(self.name))
+ io.setComment(toCP932(self.comment))
io.version=1.0
# 頂点
#assert(len(io.bones)==len(io.bone_display_list)+1)
# English
- io.setEnglishName(toCP932("blender export\n"))
- io.setEnglishComment(toCP932("blender export comment"))
+ io.setEnglishName(toCP932(self.englishName))
+ io.setEnglishComment(toCP932(self.englishComment))
# toon
toonMeshObject=None
- for o in scene.objects:
- if o.name.startswith(TOON_TEXTURE_OBJECT):
- toonMeshObject=o
- break
+ for o in bl.object.each():
+ try:
+ if o.name.startswith(TOON_TEXTURE_OBJECT):
+ toonMeshObject=o
+ except:
+ p(o.name)
+ break
if toonMeshObject:
toonMesh=bl.object.getData(toonMeshObject)
toonMaterial=bl.mesh.getMaterial(toonMesh, 0)
# rigid body
rigidNameMap={}
for i, obj in enumerate(self.oneSkinMesh.rigidbodies):
+ name=obj[RIGID_NAME] if RIGID_NAME in obj else obj.name
+ print(name)
rigidBody=io.addRigidBody()
- rigidBody.setName(obj.name.encode('cp932'))
- rigidNameMap[obj.name]=i
+ rigidBody.setName(name.encode('cp932'))
+ rigidNameMap[name]=i
boneIndex=boneNameMap[obj[RIGID_BONE_NAME]]
if boneIndex==0:
boneIndex=0xFFFF
return io.write(path)
-def __execute(filename, scene):
- if not scene.objects.active:
+def __execute(filename):
+ active=bl.object.getActive()
+ if not active:
print("abort. no active object.")
return
-
- active=bl.object.getActive()
exporter=PmdExporter()
- exporter.setup(scene)
- exporter.write(filename, scene)
+ exporter.setup()
+ print(exporter)
+ exporter.write(filename)
bl.object.activate(active)
if isBlender24():
# for 2.4
def execute_24(filename):
- scene = bpy.data.scenes.active
- bl.initialize('pmd_export', scene)
- __execute(filename.decode(bl.INTERNAL_ENCODING), scene)
+ bl.initialize('pmd_export', bpy.data.scenes.active)
+ __execute(filename.decode(bl.INTERNAL_ENCODING))
bl.finalize()
Blender.Window.FileSelector(
# for 2.5
def execute_25(filename, scene):
bl.initialize('pmd_export', scene)
- __execute(filename, scene)
+ __execute(filename)
bl.finalize()
# operator
# List of operator properties, the attributes will be assigned
# to the class instance from the operator settings before calling.
-
- path = StringProperty(
- name="File Path",
- description="File path used for exporting the PMD file",
- maxlen= 1024,
- default= ""
- )
- filename = StringProperty(
- name="File Name",
- description="Name of the file.")
- directory = StringProperty(
- name="Directory",
- description="Directory of the file.")
-
- check_existing = BoolProperty(
- name="Check Existing",
- description="Check and warn on overwriting existing files",
- default=True,
- options=set('HIDDEN'))
+ filepath = bpy.props.StringProperty()
+ filename = bpy.props.StringProperty()
+ directory = bpy.props.StringProperty()
def execute(self, context):
execute_25(
- self.properties.path,
+ self.properties.filepath,
context.scene
)
return 'FINISHED'
# register menu
def menu_func(self, context):
- #default_path=bpy.data.filename.replace(".blend", ".pmd")
+ default_path=bpy.data.filepath.replace(".blend", ".pmd")
self.layout.operator(
EXPORT_OT_pmd.bl_idname,
- text="Miku Miku Dance Model(.pmd)")#.path=default_path
+ text="Miku Miku Dance Model(.pmd)",
+ icon='PLUGIN'
+ ).filepath=default_path
def register():
bpy.types.register(EXPORT_OT_pmd)
Tooltip: 'Import PMD file for MikuMikuDance.'
"""
__author__= ["ousttrue"]
-__version__= "1.8"
+__version__= "2.0"
__url__=()
__bpydoc__="""
pmd Importer
1.6 20100629: sphere map.
1.7 20100703: implement bone group.
1.8 20100710: implement toon texture.
+1.9 20100718: keep model name, comment.
+2.0 20100724: update for Blender2.53.
"""
+bl_addon_info = {
+ 'category': 'Import/Export',
+ 'name': 'Import: MikuMikuDance Model Format (.pmd)',
+ 'author': 'ousttrue',
+ 'version': '2.0',
+ 'blender': (2, 5, 3),
+ 'location': 'File > Import',
+ 'description': 'Import from the MikuMikuDance Model Format (.pmd)',
+ 'warning': '', # used for warning icon and text in addons panel
+ 'wiki_url': 'http://sourceforge.jp/projects/meshio/wiki/FrontPage',
+ }
MMD_SHAPE_GROUP_NAME='_MMD_SHAPE'
+MMD_MB_NAME='mb_name'
+MMD_MB_COMMENT='mb_comment'
+MMD_COMMENT='comment'
BASE_SHAPE_NAME='Basis'
+RIGID_NAME='rigid_name'
RIGID_SHAPE_TYPE='rigid_shape_type'
RIGID_PROCESS_TYPE='rigid_process_type'
RIGID_BONE_NAME='rigid_bone_name'
else:
# for 2.5
import bpy
- from bpy.props import *
import mathutils
# wrapper
print("create constraint")
container=bl.object.createEmpty('Constraints')
layer=[
- True, False, False, False, False, False, False, False,
- False, False, False, False, False, False, False, False,
- False, False, False, False, False, False, False, False,
- False, False, False, False, False, False, False, False,
+ True, False, False, False, False, False, False, False, False, False,
+ False, False, False, False, False, False, False, False, False, False,
]
material=bl.material.create('constraint')
material.diffuse_color=(1, 0, 0)
container=bl.object.createEmpty('RigidBodies')
layer=[
- True, False, False, False, False, False, False, False,
- False, False, False, False, False, False, False, False,
- False, False, False, False, False, False, False, False,
- False, False, False, False, False, False, False, False,
+ True, False, False, False, False, False, False, False, False, False,
+ False, False, False, False, False, False, False, False, False, False,
]
material=bl.material.create('rigidBody')
rigidMeshes=[]
- for rigid in io.rigidbodies:
+ for i, rigid in enumerate(io.rigidbodies):
if rigid.boneIndex==0xFFFF:
# no reference bone
bone=io.bones[0]
mesh=bl.object.getData(meshObject)
rigidMeshes.append(meshObject)
bl.mesh.addMaterial(mesh, material)
- meshObject.name=rigid.getName()
+ meshObject.name='r_%d' % i
+ meshObject[RIGID_NAME]=rigid.getName()
#meshObject.draw_transparent=True
#meshObject.draw_wire=True
meshObject.max_draw_type='WIRE'
if len(model_name)==0:
model_name=io.getName()
root=bl.object.createEmpty(model_name)
+ root[MMD_MB_NAME]=io.getName()
+ root[MMD_MB_COMMENT]=io.getComment()
+ root[MMD_COMMENT]=io.getEnglishComment()
# toon textures
tex_dir=os.path.dirname(filename)
# List of operator properties, the attributes will be assigned
# to the class instance from the operator settings before calling.
-
- path = StringProperty(
- name="File Path",
- description="File path used for importing the PMD file",
- maxlen= 1024, default= "")
- filename = StringProperty(
- name="File Name",
- description="Name of the file.")
- directory = StringProperty(
- name="Directory",
- description="Directory of the file.")
+ filepath = bpy.props.StringProperty()
+ filename = bpy.props.StringProperty()
+ directory = bpy.props.StringProperty()
def execute(self, context):
bl.initialize('pmd_import', context.scene)
- _execute(self.properties.path)
+ _execute(self.properties.filepath)
bl.finalize()
return 'FINISHED'
# register menu
def menu_func(self, context):
self.layout.operator(IMPORT_OT_pmd.bl_idname,
- text="MikuMikuDance model (.pmd)")
+ text="MikuMikuDance model (.pmd)",
+ icon='PLUGIN'
+ )
def register():
bpy.types.register(IMPORT_OT_pmd)
for i in range(len(ext_modules)+1):
try:
setup(name="meshio",
- version='0.14',
+ version='1.00',
description='polygon mesh io utilities',
author='ousttrue',
author_email='ousttrue@gmail.com',