0.1 20080128:\r
0.2 20100518: refactoring.\r
0.3 20100606: integrate 2.4 and 2.5.\r
+0.4 20100626: refactoring.\r
"""\r
\r
-\r
-###############################################################################\r
-# import\r
-###############################################################################\r
import os\r
import sys\r
\r
# wrapper\r
import bl24 as bl\r
\r
+ def materialToMqo(m):\r
+ return "\"%s\" shader(3) col(%f %f %f %f)" % (\r
+ m.name, m.rgbCol[0], m.rgbCol[1], m.rgbCol[2], m.alpha)\r
+\r
else:\r
# for 2.5\r
import bpy\r
# wrapper\r
import bl25 as bl\r
\r
+ def materialToMqo(m):\r
+ return "\"%s\" shader(3) col(%f %f %f %f)" % (\r
+ m.name, \r
+ m.diffuse_color[0], m.diffuse_color[1], m.diffuse_color[2], \r
+ m.alpha)\r
+\r
def apply_transform(vec, matrix):\r
x, y, z = vec\r
xloc, yloc, zloc = matrix[3][0], matrix[3][1], matrix[3][2]\r
\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
\r
def setup(self, scene):\r
# 木構造を構築する\r
self.materials.append(material)\r
return index\r
\r
- def write(self, path, scene):\r
+ def write(self, path):\r
io=bl.Writer(path, 'cp932')\r
self.__write_header(io)\r
self.__write_scene(io)\r
self.__write_materials(io, os.path.dirname(path))\r
print("Writing ObjectChunk")\r
for info in self.objects:\r
- self.__write_object(io, info, scene)\r
+ self.__write_object(io, info)\r
io.write("Eof\r\n")\r
io.flush()\r
io.close()\r
# each material \r
io.write("Material %d {\r\n" % (len(self.materials)))\r
for m in self.materials:\r
- tex, aplane=bl.getTexture(m, dirname)\r
- if len(tex):\r
- # textureがある場合は下地を白に\r
- io.write("\"%s\" shader(3) col(1 1 1 1)" % m.name)\r
- else:\r
- # 無い場合はそのまま\r
- io.write(bl.materialToMqo(m))\r
- io.write(tex)\r
- io.write(aplane)\r
+ io.write(materialToMqo(m))\r
+ # ToDo separated alpha texture\r
+ for filename in bl.material.eachTexturePath(m):\r
+ if len(dirname)>0 and filename.startswith(dirname):\r
+ # 相対パスに変換する\r
+ filename=filename[len(dirname)+1:]\r
+ io.write(" tex(\"%s\")" % filename)\r
+ break\r
io.write("\r\n") \r
# end of chunk\r
io.write("}\r\n") \r
\r
- def __write_object(self, io, info, scene):\r
+ def __write_object(self, io, info):\r
print(info)\r
\r
obj=info.object\r
- if obj.type.upper()!='MESH':\r
+ if obj.type.upper()=='MESH' or obj.type.upper()=='EMPTY':\r
+ pass\r
+ else:\r
+ print(obj.type)\r
return\r
\r
- # duplicate and applyMatrix\r
- mesh, dumy=bl.objectDuplicate(scene, obj)\r
-\r
############################################################\r
# write\r
############################################################\r
# depth\r
io.write("\tdepth %d\r\n" % info.depth)\r
\r
- # mirroring \r
- isMirrorring=False\r
- for mod in obj.modifiers:\r
- if mod.name=="Mirror":\r
- isMirrorring=True\r
- break\r
- if isMirrorring:\r
+ if bl.modifier.hasType(obj, 'MIRROR'):\r
io.write("\tmirror 1\r\n")\r
io.write("\tmirror_axis 1\r\n")\r
\r
- # vertices\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}\r\n")\r
-\r
- # faces\r
- io.write("\tface %d {\r\n" % len(mesh.faces))\r
- for i, face in enumerate(mesh.faces):\r
- count=bl.faceVertexCount(face)\r
- # V\r
- io.write("\t\t%d V(" % count)\r
- for j in bl.faceVertices(face):\r
- io.write("%d " % j)\r
- io.write(")")\r
- # mat\r
- if len(mesh.materials):\r
- io.write(" M(%d)" % \r
- info.material_map[bl.faceMaterialIndex(face)])\r
- # UV\r
- if bl.meshHasUV(mesh) and bl.faceHasUV(mesh, i, face):\r
- io.write(" UV(")\r
- for uv in bl.faceGetUV(mesh, i, face, count):\r
- # reverse vertical value\r
- io.write("%f %f " % (uv[0], 1.0-uv[1])) \r
+ if obj.type.upper()=='MESH':\r
+ # duplicate and applyMatrix\r
+ mesh, dumy=bl.object.duplicate(obj)\r
+\r
+ # vertices\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" % \r
+ (x*self.scale, y*self.scale, z*self.scale)) # rotate to y-up\r
+ io.write("\t}\r\n")\r
+\r
+ # faces\r
+ io.write("\tface %d {\r\n" % len(mesh.faces))\r
+ for i, face in enumerate(mesh.faces):\r
+ count=bl.face.getVertexCount(face)\r
+ # V\r
+ io.write("\t\t%d V(" % count)\r
+ for j in reversed(bl.face.getVertices(face)):\r
+ io.write("%d " % j)\r
io.write(")")\r
- io.write("\r\n")\r
- io.write("\t}\r\n") # end of faces\r
+ # mat\r
+ if len(mesh.materials):\r
+ io.write(" M(%d)" % \r
+ info.material_map[bl.face.getMaterialIndex(face)])\r
+ # UV\r
+ if bl.mesh.hasUV(mesh) and bl.mesh.hasFaceUV(mesh, i, face):\r
+ io.write(" UV(")\r
+ for uv in reversed(bl.mesh.getFaceUV(mesh, i, face, count)):\r
+ # reverse vertical value\r
+ io.write("%f %f " % (uv[0], 1.0-uv[1])) \r
+ io.write(")")\r
+ io.write("\r\n")\r
+ io.write("\t}\r\n") # end of faces\r
+\r
+ # 削除する\r
+ bl.object.delete(dumy)\r
+\r
io.write("}\r\n") # end of object\r
- ############################################################\r
\r
- # 削除する\r
- scene.objects.unlink(dumy)\r
\r
+def __execute(filename, scene, scale=10):\r
+ if not scene.objects.active:\r
+ bl.message('no active object !')\r
+ return\r
\r
-def __execute(filename, scene, scale):\r
- exporter=MqoExporter()\r
+ exporter=MqoExporter(scale)\r
exporter.setup(scene)\r
- exporter.write(filename, scene)\r
+ exporter.write(filename)\r
\r
\r
if isBlender24():\r
# for 2.4\r
def execute_24(filename):\r
- """\r
- export mqo.\r
- """\r
- filename=filename.decode(bl.INTERNAL_ENCODING)\r
- print("mqo exporter: %s" % filename)\r
-\r
- Blender.Window.WaitCursor(1) \r
- t = Blender.sys.time() \r
-\r
- __execute(filename, Blender.Scene.GetCurrent(), 1.0)\r
-\r
- print('finished in %.2f seconds' % (Blender.sys.time()-t) )\r
- Blender.Redraw()\r
- Blender.Window.WaitCursor(0) \r
+ scene=Blender.Scene.GetCurrent()\r
+ bl.initialize('mqo_export', scene)\r
+ __execute(\r
+ filename.decode(bl.INTERNAL_ENCODING), \r
+ scene)\r
+ bl.finalize()\r
\r
# execute\r
Blender.Window.FileSelector(\r
\r
else:\r
# for 2.5\r
- def execute_25(*args):\r
- __execute(*args)\r
+ def execute_25(path, scene, scale):\r
+ bl.initialize('mqo_export', scene)\r
+ __execute(path, scene, scale)\r
+ bl.finalize()\r
\r
# operator\r
class EXPORT_OT_mqo(bpy.types.Operator):\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=10.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
\r
# register menu\r
def menu_func(self, context): \r
- default_path=bpy.data.filename.replace(".blend", ".mqo")\r
+ #default_path=bpy.data.filename.replace(".blend", ".mqo")\r
self.layout.operator(\r
EXPORT_OT_mqo.bl_idname, \r
- text="Metasequoia (.mqo)").path=default_path\r
+ text="Metasequoia (.mqo)")#.path=default_path\r
\r
def register():\r
bpy.types.register(EXPORT_OT_mqo)\r