From c374b9c09551e3c6c431c5fb34f38f09d8e5846e Mon Sep 17 00:00:00 2001 From: ousttrue Date: Sat, 24 Jul 2010 17:53:41 +0900 Subject: [PATCH] update for blender2.53. --- swig/blender/bl24.py | 11 ++- swig/blender/bl25.py | 35 +++++--- swig/blender/cp.py | 18 ++-- swig/blender/mqo_export.py | 95 ++++++++++++++------- swig/blender/mqo_import.py | 38 +++++---- swig/blender/pmd_export.py | 201 +++++++++++++++++++++++---------------------- swig/blender/pmd_import.py | 60 ++++++++------ swig/setup.py | 2 +- 8 files changed, 270 insertions(+), 190 deletions(-) diff --git a/swig/blender/bl24.py b/swig/blender/bl24.py index 9c28140..349e2db 100755 --- a/swig/blender/bl24.py +++ b/swig/blender/bl24.py @@ -27,6 +27,11 @@ def to_internal_encoding(fn): for v in args]) return newfn +def register(): + pass + +def unregister(): + pass SCENE=None def initialize(name, scene): @@ -155,6 +160,11 @@ class object: return empty @staticmethod + def each(): + for o in SCENE.objects: + yield o + + @staticmethod def makeParent(parent, child): parent.makeParent([child]) @@ -615,4 +625,3 @@ class constraint: def isIKSolver(c): return c.type==Blender.Constraint.Type.IKSOLVER - diff --git a/swig/blender/bl25.py b/swig/blender/bl25.py index d0138b3..47b2465 100755 --- a/swig/blender/bl25.py +++ b/swig/blender/bl25.py @@ -18,6 +18,12 @@ if os.path.exists(os.path.dirname(sys.argv[0])+"/utf8"): else: INTERNAL_ENCODING=FS_ENCODING +def register(): + pass + +def unregister(): + pass + SCENE=None def initialize(name, scene): global SCENE @@ -122,6 +128,11 @@ class object: return empty @staticmethod + def each(): + for o in SCENE.objects: + yield o + + @staticmethod def makeParent(parent, child): child.parent=parent @@ -129,7 +140,7 @@ class object: 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 @@ -149,12 +160,12 @@ class object: @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 @@ -178,7 +189,7 @@ class object: @staticmethod def isVisible(o): - return o.restrict_view + return False if o.hide else True @staticmethod def getShapeKeys(o): @@ -291,11 +302,14 @@ class texture: 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 @@ -303,7 +317,7 @@ class texture: if t.type=="IMAGE": image=t.image if image: - return image.filename + return image.filepath class material: @@ -357,7 +371,7 @@ class material: image=texture.image if not image: continue - yield image.filename + yield image.filepath @staticmethod def eachEnalbeTexturePath(m): @@ -368,7 +382,7 @@ class material: image=texture.image if not image: continue - yield image.filename + yield image.filepath class mesh: @@ -454,7 +468,7 @@ 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') @@ -636,4 +650,3 @@ class constraint: def isIKSolver(c): return c.type=='IK' - diff --git a/swig/blender/cp.py b/swig/blender/cp.py index accde24..971459e 100644 --- a/swig/blender/cp.py +++ b/swig/blender/cp.py @@ -12,17 +12,19 @@ DST_24=[ 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", ] diff --git a/swig/blender/mqo_export.py b/swig/blender/mqo_export.py index 5199baa..f7f2b73 100644 --- a/swig/blender/mqo_export.py +++ b/swig/blender/mqo_export.py @@ -9,7 +9,7 @@ Tooltip: 'Save as Metasequoia MQO File' """ __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. @@ -22,14 +22,52 @@ Run this script from "File->Export" menu. 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 @@ -40,8 +78,12 @@ if isBlender24(): 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 @@ -51,10 +93,14 @@ else: 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 @@ -162,7 +208,7 @@ class MqoExporter(object): # 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): @@ -207,6 +253,9 @@ class MqoExporter(object): 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 @@ -296,19 +345,9 @@ else: # 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", @@ -321,15 +360,9 @@ else: 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) @@ -342,10 +375,12 @@ else: # 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) diff --git a/swig/blender/mqo_import.py b/swig/blender/mqo_import.py index 630501e..b111ad0 100644 --- a/swig/blender/mqo_import.py +++ b/swig/blender/mqo_import.py @@ -8,7 +8,7 @@ Tooltip: 'Import from Metasequoia file format (.mqo)' """ __author__=['ousttrue'] __url__ = ["http://gunload.web.fc2.com/blender/"] -__version__= '0.6 2010/05/05' +__version__= '2.0' __bpydoc__= '''\ MQO Importer @@ -23,8 +23,21 @@ This script imports a mqo into Blender for editing. 0.7 20100606: integrate 2.4 and 2.5. 0.8 20100619: fix multibyte object name. 0.9 20100626: refactoring. +2.0 20100724: update for Blender2.53. ''' +bl_addon_info = { + 'category': 'Import/Export', + 'name': 'Import: Metasequioa Model Format (.mqo)', + 'author': 'ousttrue', + 'version': '2.0', + 'blender': (2, 5, 3), + 'location': 'File > Import', + 'description': 'Import from 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 @@ -60,7 +73,6 @@ if isBlender24(): else: # for 2.5 import bpy - from bpy.props import * # wrapper import bl25 as bl @@ -654,19 +666,11 @@ else: # List of operator properties, the attributes will be assigned # to the class instance from the operator settings before calling. + filepath = bpy.props.StringProperty() + filename = bpy.props.StringProperty() + directory = bpy.props.StringProperty() - path = StringProperty( - name="File Path", - description="File path used for importing the MQO file", - maxlen= 1024, default= "") - filename = StringProperty( - name="File Name", - description="Name of the file.") - directory = StringProperty( - name="Directory", - description="Directory of the file.") - - scale = FloatProperty( + scale = bpy.props.FloatProperty( name="Scale", description="Scale the MQO by this value", min=0.0001, max=1000000.0, @@ -674,7 +678,7 @@ else: def execute(self, context): execute_25( - self.properties.path, + self.properties.filepath, context.scene, self.properties.scale) return 'FINISHED' @@ -689,7 +693,9 @@ else: def menu_func(self, context): self.layout.operator( IMPORT_OT_mqo.bl_idname, - text="Metasequoia (.mqo)") + text="Metasequoia (.mqo)", + icon='PLUGIN' + ) def register(): bpy.types.register(IMPORT_OT_mqo) diff --git a/swig/blender/pmd_export.py b/swig/blender/pmd_export.py index 67ff836..2e246c9 100644 --- a/swig/blender/pmd_export.py +++ b/swig/blender/pmd_export.py @@ -7,7 +7,7 @@ Tooltip: 'Export PMD file for MikuMikuDance.' """ __author__= ["ousttrue"] -__version__= "1.6" +__version__= "2.0" __url__=() __bpydoc__=""" pmd Importer @@ -24,10 +24,27 @@ This script exports a pmd model. 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' @@ -97,7 +114,6 @@ if isBlender24(): else: # for 2.5 import bpy - from bpy.props import * import mathutils # wrapper @@ -314,16 +330,12 @@ class IKSolver(object): 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 "" % ( @@ -331,7 +343,7 @@ class OneSkinMesh(object): 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) @@ -494,29 +506,27 @@ class OneSkinMesh(object): # メッシュのコピーを生成してオブジェクトの行列を適用する 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): @@ -628,7 +638,7 @@ class OneSkinMesh(object): 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 @@ -636,7 +646,7 @@ class Bone(object): 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): @@ -678,20 +688,12 @@ class BoneBuilder(object): # 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) @@ -811,6 +813,7 @@ class BoneBuilder(object): 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: @@ -842,11 +845,13 @@ class BoneBuilder(object): 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) @@ -858,33 +863,43 @@ class BoneBuilder(object): 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) @@ -908,10 +923,10 @@ class PmdExporter(object): 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 # 頂点 @@ -1064,15 +1079,18 @@ class PmdExporter(object): #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) @@ -1089,9 +1107,11 @@ class PmdExporter(object): # 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 @@ -1165,24 +1185,23 @@ class PmdExporter(object): 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( @@ -1194,7 +1213,7 @@ else: # for 2.5 def execute_25(filename, scene): bl.initialize('pmd_export', scene) - __execute(filename, scene) + __execute(filename) bl.finalize() # operator @@ -1205,29 +1224,13 @@ else: # 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' @@ -1239,10 +1242,12 @@ else: # 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) diff --git a/swig/blender/pmd_import.py b/swig/blender/pmd_import.py index 0dd29a1..a6996be 100755 --- a/swig/blender/pmd_import.py +++ b/swig/blender/pmd_import.py @@ -7,7 +7,7 @@ Tooltip: 'Import PMD file for MikuMikuDance.' """ __author__= ["ousttrue"] -__version__= "1.8" +__version__= "2.0" __url__=() __bpydoc__=""" pmd Importer @@ -31,10 +31,27 @@ This script imports a pmd into Blender for editing. 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' @@ -122,7 +139,6 @@ if isBlender24(): else: # for 2.5 import bpy - from bpy.props import * import mathutils # wrapper @@ -686,10 +702,8 @@ def __importConstraints(io): 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) @@ -736,14 +750,12 @@ def __importRigidBodies(io): 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] @@ -779,7 +791,8 @@ def __importRigidBodies(io): 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' @@ -828,6 +841,9 @@ def _execute(filename): 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) @@ -886,21 +902,13 @@ else: # 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' @@ -912,7 +920,9 @@ else: # 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) diff --git a/swig/setup.py b/swig/setup.py index b5b6277..4304e92 100644 --- a/swig/setup.py +++ b/swig/setup.py @@ -64,7 +64,7 @@ else: 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', -- 2.11.0