OSDN Git Service

add pmxbuilder
authorousttrue <ousttrue@gmail.com>
Sat, 1 Oct 2011 02:04:05 +0000 (11:04 +0900)
committerousttrue <ousttrue@gmail.com>
Sat, 1 Oct 2011 02:04:05 +0000 (11:04 +0900)
examples/pmxbuilder.py [new file with mode: 0644]
examples/pymeshviewer.py
pymeshio/pmx/__init__.py
pymeshio/pmx/loader.py
setup.py

diff --git a/examples/pmxbuilder.py b/examples/pmxbuilder.py
new file mode 100644 (file)
index 0000000..76f39f4
--- /dev/null
@@ -0,0 +1,67 @@
+#!/usr/bin/env python\r
+# coding: utf-8\r
+\r
+import time\r
+import os\r
+import pymeshio.pmx.loader\r
+import opengl.material\r
+import opengl.texture\r
+import opengl.vertexarray\r
+\r
+\r
+def build(path):\r
+    # load scenee\r
+    t=time.time()\r
+    model=pymeshio.pmx.loader.load(path)\r
+    if not model:\r
+        return\r
+    print(time.time()-t, "sec")\r
+    # build\r
+    basedir=os.path.dirname(path)\r
+    indexedVertexArray=opengl.vertexarray.IndexedVertexArray()\r
+    for v in model.vertices:\r
+        # left-handed y-up to right-handed y-up                \r
+        if v.deform.__class__ is pymeshio.pmx.Bdef1:\r
+            indexedVertexArray.addVertex(\r
+                    (v.position[0], v.position[1], -v.position[2], 1), \r
+                    (v.normal[0], v.normal[1], -v.normal[2]), \r
+                    (v.uv[0], v.uv[1]), \r
+                    (1, 1, 1, 1),\r
+                    v.deform.index0, 0, 1.0)\r
+        elif v.deform.__class__ is pymeshio.pmx.Bdef2:\r
+            indexedVertexArray.addVertex(\r
+                    (v.position[0], v.position[1], -v.position[2], 1), \r
+                    (v.normal[0], v.normal[1], -v.normal[2]), \r
+                    (v.uv[0], v.uv[1]), \r
+                    (1, 1, 1, 1),\r
+                    v.deform.index0, v.deform.index1, v.deform.weight0)\r
+        else:\r
+            print("unknown deform: {0}".format(v.deform))\r
+    \r
+    # material\r
+    textureMap={}\r
+    faceIndex=0\r
+    def indices():\r
+        for i in model.indices:\r
+            yield i\r
+    indexGen=indices()\r
+    for i, m in enumerate(model.materials):\r
+        material=opengl.material.MQOMaterial()\r
+        material.vcol=True\r
+        material.rgba=(\r
+                m.diffuse_color[0], \r
+                m.diffuse_color[1], \r
+                m.diffuse_color[2], \r
+                m.diffuse_alpha)\r
+        if m.texture_index!=255:\r
+            texturepath=os.path.join(basedir, model.textures[m.texture_index])\r
+            if os.path.isfile(texturepath):\r
+                if not texturepath in textureMap:\r
+                    texture=opengl.texture.Texture(texturepath)\r
+                    textureMap[texturepath]=texture\r
+                material.texture=textureMap[texturepath]\r
+        indices=indexedVertexArray.addMaterial(material)\r
+        indices+=[next(indexGen) for n in range(m.vertex_count)]\r
+    indexedVertexArray.optimize()\r
+    return indexedVertexArray\r
+\r
index 29e7f48..9e0e26c 100644 (file)
@@ -10,6 +10,7 @@ import opengl
 import opengl.rokuro\r
 import mqobuilder\r
 import pmdbuilder\r
+import pmxbuilder\r
 \r
 \r
 class Frame(tkinter.Frame):\r
@@ -39,7 +40,7 @@ class Frame(tkinter.Frame):
     def onOpen(self):\r
         path=tkinter.filedialog.askopenfilename(\r
                 filetypes=[\r
-                    ('poloygon model files', '*.mqo;*.pmd'),\r
+                    ('poloygon model files', '*.mqo;*.pmd;*.pmx'),\r
                     ], \r
                 initialdir=self.current)\r
         self.current=os.path.dirname(path)\r
@@ -63,6 +64,10 @@ class Frame(tkinter.Frame):
             return mqobuilder.build(path)\r
         elif path.lower().endswith(".pmd"):\r
             return pmdbuilder.build(path)\r
+        elif path.lower().endswith(".pmx"):\r
+            return pmxbuilder.build(path)\r
+        else:\r
+            print("unknown file format: {0}".format(path))\r
 \r
     def onKeyDown(self, event):\r
         key=event.keycode\r
index 90caeb2..0bc1dfc 100644 (file)
@@ -132,7 +132,7 @@ class Material(object):
             'toon_sharing_flag',\r
             'toon_texture_index',\r
             'comment',\r
-            'index_count',\r
+            'vertex_count',\r
             ]\r
     def __init__(self,\r
             name: str,\r
@@ -167,7 +167,12 @@ class Material(object):
         #\r
         self.toon_texture_index=None\r
         self.comment=''\r
-        self.index_count=0\r
+        self.vertex_count=0\r
+\r
+    def __str__(self):\r
+        return ("<pmx.Material {name}>".format(\r
+            name=self.english_name\r
+            ))\r
 \r
 \r
 class Deform(object):\r
@@ -179,9 +184,9 @@ class Bdef1(object):
 \r
     Attributes: see __init__\r
     """\r
-    __slots__=[ 'bone_index']\r
-    def __init__(self, bone_index: int):\r
-        self.bone_index=bone_index\r
+    __slots__=[ 'index0']\r
+    def __init__(self, index0: int):\r
+        self.index0=index0\r
 \r
 \r
 class Bdef2(object):\r
@@ -501,3 +506,10 @@ class Model(object):
         self.rigidbodies=[]\r
         self.joints=[]\r
 \r
+    def __str__(self):\r
+        return ('<pmx-{version} "{name}" {vertices}vertices>'.format(\r
+            version=self.version,\r
+            name=self.english_name,\r
+            vertices=len(self.vertices)\r
+            ))\r
+\r
index 033665a..82cb7e5 100644 (file)
@@ -99,7 +99,7 @@ class Loader(pymeshio.common.BinaryLoader):
                     "unknown toon_sharing_flag {0}".format(\r
                         material.toon_sharing_flag))\r
         material.comment=self.read_text()\r
-        material.index_count=self.read_uint(4)\r
+        material.vertex_count=self.read_uint(4)\r
         return material\r
 \r
     def read_bone(self):\r
@@ -272,6 +272,8 @@ def load(path: str) -> pymeshio.pmx.Model:
     loader=pymeshio.common.BinaryLoader(\r
             io.BytesIO(\r
                 pymeshio.common.readall(path)))\r
+    #loader=pymeshio.common.BinaryLoader(open(path, 'rb'))\r
+\r
 \r
     # header\r
     signature=loader.unpack("4s", 4)\r
index e160cae..7ceb7eb 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -1,10 +1,12 @@
+#!/usr/bin/env python
+
 from setuptools import setup
 import sys
 import os
 import shutil
 
 name='pymeshio'
-version='2.0.0'
+version='2.0.1'
 short_description='pure python 3d model io library'
 long_description='''\
 `pymeshio` is a package for 3d model io.
@@ -33,21 +35,38 @@ Setup
    $ cd pymeshio-x.x.x
    $ python setup.py install
 
+Usage
+-----
+::
+
+    >>> import pymeshio.pmx.loader
+    >>> m=pymeshio.pmx.loader.load('resources/初音ミクVer2.pmx')
+    >>> print(m)
+    <pmx-2.0 "Miku Hatsune" 12354vertices>
+    >>> print(dir(m))
+    ['__class__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', 'bones', 'comment', 'display_slots', 'english_comment', 'english_name', 'indices', 'joints', 'materials', 'morphs', 'name', 'rigidbodies', 'textures', 'version', 'vertices']
+
+ToDo
+--------
+
+* pmx writer
+* pmd to pmx converter
+* blender importer for pmx
+* blender exporter for pmx
+
+
 History
 -------
+2.0.0 (2011-10-01)
+~~~~~~~~~~~~~~~~~~
+* fix pymeshio.pmx.Bdef1.bone_index to index0
+* fix pymeshio.pmx.Material.index_count to vertex_count
+* add pmx example
+
 2.0.0 (2011-9-30)
 ~~~~~~~~~~~~~~~~~~
 * add pmx loader
 
-    >>> import pymeshio.pmx.loader
-    >>> m=pymeshio.pmx.loader.load('resources/初音ミクVer2.pmx')
-    >>> print(m)
-    <pymeshio.pmx.Model object at 0x0281DD50>
-    >>> print(m.name)
-    初音ミク
-    >>> print(m.english_name)
-    Miku Hatsune
-
 1.9.2 (2011-9-29)
 ~~~~~~~~~~~~~~~~~~
 * add tkinter viewer sample