From 25b68c179355cd917488c2081c481bb982fe223c Mon Sep 17 00:00:00 2001 From: ousttrue Date: Mon, 12 Jul 2010 03:31:50 +0900 Subject: [PATCH] fix. --- swig/blender/mqo_export.py | 720 ++++++++++++++++++++++----------------------- swig/blender/pmd_export.py | 1 - swig/blender/pmd_import.py | 3 +- 3 files changed, 362 insertions(+), 362 deletions(-) diff --git a/swig/blender/mqo_export.py b/swig/blender/mqo_export.py index aeb971c..5199baa 100644 --- a/swig/blender/mqo_export.py +++ b/swig/blender/mqo_export.py @@ -1,360 +1,360 @@ -#!BPY -# coding: utf-8 - -""" -Name: 'Metasequoia (.mqo)...' -Blender: 245 -Group: 'Export' -Tooltip: 'Save as Metasequoia MQO File' -""" -__author__= 'ousttrue' -__url__ = ["http://gunload.web.fc2.com/blender/"] -__version__= '0.3 2010/06/06' -__bpydoc__ = """\ -This script is an exporter to MQO file format. - -Usage: - -Run this script from "File->Export" menu. - -0.1 20080128: -0.2 20100518: refactoring. -0.3 20100606: integrate 2.4 and 2.5. -0.4 20100626: refactoring. -0.5 20100710: add [apply_modifier] option(2.5 only). -""" - -import os -import sys - -def isBlender24(): - return sys.version_info[0]<3 - -if isBlender24(): - # for 2.4 - import Blender - from Blender import Mathutils - import bpy - - # wrapper - 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) - -else: - # for 2.5 - import bpy - - # wrapper - 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) - -def apply_transform(vec, matrix): - x, y, z = vec - xloc, yloc, zloc = matrix[3][0], matrix[3][1], matrix[3][2] - return x*matrix[0][0] + y*matrix[1][0] + z*matrix[2][0] + xloc,\ - x*matrix[0][1] + y*matrix[1][1] + z*matrix[2][1] + yloc,\ - x*matrix[0][2] + y*matrix[1][2] + z*matrix[2][2] + zloc - -def convert_to_mqo(vec): - return vec.x, vec.z, -vec.y - - -class OutlineNode(object): - __slots__=['o', 'children'] - def __init__(self, o): - self.o=o - self.children=[] - - def __str__(self): - return "" % self.o - - -class ObjectInfo(object): - __slots__=['object', 'depth', 'material_map'] - def __init__(self, o, depth): - self.object=o - self.depth=depth - self.material_map={} - - def __str__(self): - return "" % (self.depth, self.object) - - -class MqoExporter(object): - __slots__=["materials", "objects", 'scale', 'apply_modifier',] - def __init__(self, scale, apply_modifier): - self.objects=[] - self.materials=[] - self.scale=scale - self.apply_modifier=apply_modifier - - def setup(self, scene): - # 木構造を構築する - object_node_map={} - for o in scene.objects: - object_node_map[o]=OutlineNode(o) - for node in object_node_map.values(): - if node.o.parent: - object_node_map[node.o.parent].children.append(node) - - # ルートを得る - root=object_node_map[scene.objects.active] - - # 情報を集める - if root.o.type.upper()=='EMPTY': - # depth調整 - for node in root.children: - self.__setup(node) - else: - self.__setup(root) - - def __setup(self, node, depth=0): - info=ObjectInfo(node.o, depth) - self.objects.append(info) - if node.o.type.upper()=='MESH': - # set material index - for i, m in enumerate(node.o.data.materials): - info.material_map[i]=self.__getOrAddMaterial(m) - # recursive - for child in node.children: - self.__setup(child, depth+1) - - def __getOrAddMaterial(self, material): - for i, m in enumerate(self.materials): - if m==material: - return i - index=len(self.materials) - self.materials.append(material) - return index - - def write(self, path): - io=bl.Writer(path, 'cp932') - self.__write_header(io) - self.__write_scene(io) - print("Writing MaterialChunk") - self.__write_materials(io, os.path.dirname(path)) - print("Writing ObjectChunk") - for info in self.objects: - self.__write_object(io, info) - io.write("Eof\r\n") - io.flush() - io.close() - - def __write_header(self, io): - io.write("Metasequoia Document\r\n") - io.write("Format Text Ver 1.0\r\n") - io.write("\r\n") - - def __write_scene(self, io): - print("Writing SceneChunk") - io.write("Scene {\r\n") - io.write("}\r\n") - - def __write_materials(self, io, dirname): - # each material - io.write("Material %d {\r\n" % (len(self.materials))) - for m in self.materials: - io.write(materialToMqo(m)) - # ToDo separated alpha texture - for filename in bl.material.eachTexturePath(m): - if len(dirname)>0 and filename.startswith(dirname): - # 相対パスに変換する - filename=filename[len(dirname)+1:] - io.write(" tex(\"%s\")" % filename) - break - io.write("\r\n") - # end of chunk - io.write("}\r\n") - - def __write_object(self, io, info): - print(info) - - obj=info.object - if obj.type.upper()=='MESH' or obj.type.upper()=='EMPTY': - pass - else: - print(obj.type) - return - - io.write("Object \""+obj.name+"\" {\r\n") - - # depth - io.write("\tdepth %d\r\n" % info.depth) - - # mirror - if not self.apply_modifier: - if bl.modifier.hasType(obj, 'MIRROR'): - io.write("\tmirror 1\r\n") - io.write("\tmirror_axis 1\r\n") - - if obj.type.upper()=='MESH': - # duplicate and applyMatrix - copyMesh, copyObj=bl.object.duplicate(obj) - # 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 - if self.apply_modifier: - for m in [m for m in copyObj.modifiers]: - if m.type=='SOLIDFY': - continue - elif m.type=='ARMATURE': - bpy.ops.object.modifier_apply(modifier=m.name) - elif m.type=='MIRROR': - bpy.ops.object.modifier_apply(modifier=m.name) - else: - print(m.type) - # write mesh - self.__write_mesh(io, copyMesh, info.material_map) - bl.object.delete(copyObj) - - io.write("}\r\n") # end of object - - def __write_mesh(self, io, mesh, material_map): - # vertices - io.write("\tvertex %d {\r\n" % len(mesh.verts)) - for vert in mesh.verts: - x, y, z = convert_to_mqo(vert.co) - io.write("\t\t%f %f %f\r\n" % - (x*self.scale, y*self.scale, z*self.scale)) # rotate to y-up - io.write("\t}\r\n") - - # faces - io.write("\tface %d {\r\n" % len(mesh.faces)) - for i, face in enumerate(mesh.faces): - count=bl.face.getVertexCount(face) - # V - io.write("\t\t%d V(" % count) - for j in reversed(bl.face.getVertices(face)): - io.write("%d " % j) - io.write(")") - # mat - if len(mesh.materials): - io.write(" M(%d)" % - material_map[bl.face.getMaterialIndex(face)]) - # UV - if bl.mesh.hasUV(mesh) and bl.mesh.hasFaceUV(mesh, i, face): - io.write(" UV(") - for uv in reversed(bl.mesh.getFaceUV(mesh, i, face, count)): - # reverse vertical value - io.write("%f %f " % (uv[0], 1.0-uv[1])) - io.write(")") - io.write("\r\n") - io.write("\t}\r\n") # end of faces - - -def __execute(filename, scene, scale=10, apply_modifier=False): - if not scene.objects.active: - bl.message('no active object !') - return - - exporter=MqoExporter(scale, apply_modifier) - exporter.setup(scene) - exporter.write(filename) - - -if isBlender24(): - # for 2.4 - def execute_24(filename): - scene=Blender.Scene.GetCurrent() - bl.initialize('mqo_export', scene) - __execute( - filename.decode(bl.INTERNAL_ENCODING), - scene, False) - bl.finalize() - - # execute - Blender.Window.FileSelector( - execute_24, - 'Export Metasequoia MQO', - Blender.sys.makename(ext='.mqo')) - -else: - # for 2.5 - def execute_25(path, scene, scale, apply_modifier): - bl.initialize('mqo_export', scene) - __execute(path, scene, scale, apply_modifier) - bl.finalize() - - # operator - class EXPORT_OT_mqo(bpy.types.Operator): - '''Save a Metasequoia MQO file.''' - bl_idname = "export_scene.mqo" - bl_label = 'Export MQO' - - # 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.") - - scale = bpy.props.FloatProperty( - name="Scale", - description="Scale the MQO by this value", - min=0.0001, max=1000000.0, - soft_min=0.001, soft_max=100.0, default=10.0) - - apply_modifier = bpy.props.BoolProperty( - name="ApplyModifier", - 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, - context.scene, - self.properties.scale, - self.properties.apply_modifier) - return 'FINISHED' - - def invoke(self, context, event): - wm=context.manager - wm.add_fileselect(self) - return 'RUNNING_MODAL' - - # register menu - def menu_func(self, context): - #default_path=bpy.data.filename.replace(".blend", ".mqo") - self.layout.operator( - EXPORT_OT_mqo.bl_idname, - text="Metasequoia (.mqo)")#.path=default_path - - def register(): - bpy.types.register(EXPORT_OT_mqo) - bpy.types.INFO_MT_file_export.append(menu_func) - - def unregister(): - bpy.types.unregister(EXPORT_OT_mqo) - bpy.types.INFO_MT_file_export.remove(menu_func) - - if __name__ == "__main__": - register() - +#!BPY +# coding: utf-8 + +""" +Name: 'Metasequoia (.mqo)...' +Blender: 245 +Group: 'Export' +Tooltip: 'Save as Metasequoia MQO File' +""" +__author__= 'ousttrue' +__url__ = ["http://gunload.web.fc2.com/blender/"] +__version__= '0.3 2010/06/06' +__bpydoc__ = """\ +This script is an exporter to MQO file format. + +Usage: + +Run this script from "File->Export" menu. + +0.1 20080128: +0.2 20100518: refactoring. +0.3 20100606: integrate 2.4 and 2.5. +0.4 20100626: refactoring. +0.5 20100710: add [apply_modifier] option(2.5 only). +""" + +import os +import sys + +def isBlender24(): + return sys.version_info[0]<3 + +if isBlender24(): + # for 2.4 + import Blender + from Blender import Mathutils + import bpy + + # wrapper + 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) + +else: + # for 2.5 + import bpy + + # wrapper + 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) + +def apply_transform(vec, matrix): + x, y, z = vec + xloc, yloc, zloc = matrix[3][0], matrix[3][1], matrix[3][2] + return x*matrix[0][0] + y*matrix[1][0] + z*matrix[2][0] + xloc,\ + x*matrix[0][1] + y*matrix[1][1] + z*matrix[2][1] + yloc,\ + x*matrix[0][2] + y*matrix[1][2] + z*matrix[2][2] + zloc + +def convert_to_mqo(vec): + return vec.x, vec.z, -vec.y + + +class OutlineNode(object): + __slots__=['o', 'children'] + def __init__(self, o): + self.o=o + self.children=[] + + def __str__(self): + return "" % self.o + + +class ObjectInfo(object): + __slots__=['object', 'depth', 'material_map'] + def __init__(self, o, depth): + self.object=o + self.depth=depth + self.material_map={} + + def __str__(self): + return "" % (self.depth, self.object) + + +class MqoExporter(object): + __slots__=["materials", "objects", 'scale', 'apply_modifier',] + def __init__(self, scale, apply_modifier): + self.objects=[] + self.materials=[] + self.scale=scale + self.apply_modifier=apply_modifier + + def setup(self, scene): + # 木構造を構築する + object_node_map={} + for o in scene.objects: + object_node_map[o]=OutlineNode(o) + for node in object_node_map.values(): + if node.o.parent: + object_node_map[node.o.parent].children.append(node) + + # ルートを得る + root=object_node_map[scene.objects.active] + + # 情報を集める + if root.o.type.upper()=='EMPTY': + # depth調整 + for node in root.children: + self.__setup(node) + else: + self.__setup(root) + + def __setup(self, node, depth=0): + info=ObjectInfo(node.o, depth) + self.objects.append(info) + if node.o.type.upper()=='MESH': + # set material index + for i, m in enumerate(node.o.data.materials): + info.material_map[i]=self.__getOrAddMaterial(m) + # recursive + for child in node.children: + self.__setup(child, depth+1) + + def __getOrAddMaterial(self, material): + for i, m in enumerate(self.materials): + if m==material: + return i + index=len(self.materials) + self.materials.append(material) + return index + + def write(self, path): + io=bl.Writer(path, 'cp932') + self.__write_header(io) + self.__write_scene(io) + print("Writing MaterialChunk") + self.__write_materials(io, os.path.dirname(path)) + print("Writing ObjectChunk") + for info in self.objects: + self.__write_object(io, info) + io.write("Eof\r\n") + io.flush() + io.close() + + def __write_header(self, io): + io.write("Metasequoia Document\r\n") + io.write("Format Text Ver 1.0\r\n") + io.write("\r\n") + + def __write_scene(self, io): + print("Writing SceneChunk") + io.write("Scene {\r\n") + io.write("}\r\n") + + def __write_materials(self, io, dirname): + # each material + io.write("Material %d {\r\n" % (len(self.materials))) + for m in self.materials: + io.write(materialToMqo(m)) + # ToDo separated alpha texture + for filename in bl.material.eachTexturePath(m): + if len(dirname)>0 and filename.startswith(dirname): + # 相対パスに変換する + filename=filename[len(dirname)+1:] + io.write(" tex(\"%s\")" % filename) + break + io.write("\r\n") + # end of chunk + io.write("}\r\n") + + def __write_object(self, io, info): + print(info) + + obj=info.object + if obj.type.upper()=='MESH' or obj.type.upper()=='EMPTY': + pass + else: + print(obj.type) + return + + io.write("Object \""+obj.name+"\" {\r\n") + + # depth + io.write("\tdepth %d\r\n" % info.depth) + + # mirror + if not self.apply_modifier: + if bl.modifier.hasType(obj, 'MIRROR'): + io.write("\tmirror 1\r\n") + io.write("\tmirror_axis 1\r\n") + + if obj.type.upper()=='MESH': + # duplicate and applyMatrix + copyMesh, copyObj=bl.object.duplicate(obj) + # 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 + if self.apply_modifier: + for m in [m for m in copyObj.modifiers]: + if m.type=='SOLIDFY': + continue + elif m.type=='ARMATURE': + bpy.ops.object.modifier_apply(modifier=m.name) + elif m.type=='MIRROR': + bpy.ops.object.modifier_apply(modifier=m.name) + else: + print(m.type) + # write mesh + self.__write_mesh(io, copyMesh, info.material_map) + bl.object.delete(copyObj) + + io.write("}\r\n") # end of object + + def __write_mesh(self, io, mesh, material_map): + # vertices + io.write("\tvertex %d {\r\n" % len(mesh.verts)) + for vert in mesh.verts: + x, y, z = convert_to_mqo(vert.co) + io.write("\t\t%f %f %f\r\n" % + (x*self.scale, y*self.scale, z*self.scale)) # rotate to y-up + io.write("\t}\r\n") + + # faces + io.write("\tface %d {\r\n" % len(mesh.faces)) + for i, face in enumerate(mesh.faces): + count=bl.face.getVertexCount(face) + # V + io.write("\t\t%d V(" % count) + for j in reversed(bl.face.getVertices(face)): + io.write("%d " % j) + io.write(")") + # mat + if len(mesh.materials): + io.write(" M(%d)" % + material_map[bl.face.getMaterialIndex(face)]) + # UV + if bl.mesh.hasUV(mesh) and bl.mesh.hasFaceUV(mesh, i, face): + io.write(" UV(") + for uv in reversed(bl.mesh.getFaceUV(mesh, i, face, count)): + # reverse vertical value + io.write("%f %f " % (uv[0], 1.0-uv[1])) + io.write(")") + io.write("\r\n") + io.write("\t}\r\n") # end of faces + + +def __execute(filename, scene, scale=10, apply_modifier=False): + if not scene.objects.active: + bl.message('no active object !') + return + + exporter=MqoExporter(scale, apply_modifier) + exporter.setup(scene) + exporter.write(filename) + + +if isBlender24(): + # for 2.4 + def execute_24(filename): + scene=Blender.Scene.GetCurrent() + bl.initialize('mqo_export', scene) + __execute( + filename.decode(bl.INTERNAL_ENCODING), + scene, False) + bl.finalize() + + # execute + Blender.Window.FileSelector( + execute_24, + 'Export Metasequoia MQO', + Blender.sys.makename(ext='.mqo')) + +else: + # for 2.5 + def execute_25(path, scene, scale, apply_modifier): + bl.initialize('mqo_export', scene) + __execute(path, scene, scale, apply_modifier) + bl.finalize() + + # operator + class EXPORT_OT_mqo(bpy.types.Operator): + '''Save a Metasequoia MQO file.''' + bl_idname = "export_scene.mqo" + bl_label = 'Export MQO' + + # 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.") + + scale = bpy.props.FloatProperty( + name="Scale", + description="Scale the MQO by this value", + min=0.0001, max=1000000.0, + soft_min=0.001, soft_max=100.0, default=10.0) + + apply_modifier = bpy.props.BoolProperty( + name="ApplyModifier", + 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, + context.scene, + self.properties.scale, + self.properties.apply_modifier) + return 'FINISHED' + + def invoke(self, context, event): + wm=context.manager + wm.add_fileselect(self) + return 'RUNNING_MODAL' + + # register menu + def menu_func(self, context): + #default_path=bpy.data.filename.replace(".blend", ".mqo") + self.layout.operator( + EXPORT_OT_mqo.bl_idname, + text="Metasequoia (.mqo)")#.path=default_path + + def register(): + bpy.types.register(EXPORT_OT_mqo) + bpy.types.INFO_MT_file_export.append(menu_func) + + def unregister(): + bpy.types.unregister(EXPORT_OT_mqo) + bpy.types.INFO_MT_file_export.remove(menu_func) + + if __name__ == "__main__": + register() + diff --git a/swig/blender/pmd_export.py b/swig/blender/pmd_export.py index 9f5eec4..67ff836 100644 --- a/swig/blender/pmd_export.py +++ b/swig/blender/pmd_export.py @@ -380,7 +380,6 @@ class OneSkinMesh(object): # 合計値が1になるようにする for i in xrange(len(mesh.verts)): - #for i, name_weight in weightMap.items(): if i in secondWeightMap: secondWeightMap[i]=(secondWeightMap[i][0], 1.0-weightMap[i][1]) elif i in weightMap: diff --git a/swig/blender/pmd_import.py b/swig/blender/pmd_import.py index f8062e0..0dd29a1 100755 --- a/swig/blender/pmd_import.py +++ b/swig/blender/pmd_import.py @@ -446,6 +446,8 @@ def __import16MaerialAndMesh(meshObject, l, except KeyError: break + material=createPmdMaterial(m, material_index) + # main texture texture_name=m.getTexture() if texture_name!='': @@ -466,7 +468,6 @@ def __import16MaerialAndMesh(meshObject, l, setSphereMap(material, texture_index, 'ADD') # toon texture - material=createPmdMaterial(m, material_index) toon_index=bl.material.addTexture( material, bl.material.getTexture( -- 2.11.0