--- /dev/null
+#!/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
import opengl.rokuro\r
import mqobuilder\r
import pmdbuilder\r
+import pmxbuilder\r
\r
\r
class Frame(tkinter.Frame):\r
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
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
'toon_sharing_flag',\r
'toon_texture_index',\r
'comment',\r
- 'index_count',\r
+ 'vertex_count',\r
]\r
def __init__(self,\r
name: str,\r
#\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
\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
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
"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
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
+#!/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.
$ 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