OSDN Git Service

fix mqobuilder
authorousttrue <ousttrue@gmail.com>
Thu, 29 Sep 2011 01:38:45 +0000 (10:38 +0900)
committerousttrue <ousttrue@gmail.com>
Thu, 29 Sep 2011 01:38:45 +0000 (10:38 +0900)
examples/mqobuilder.py
examples/opengl/material.py
examples/opengl/rokuro.py
examples/opengl/vertexarray.py
examples/opengl/vertexarraymap.py
examples/pmdbuilder.py
examples/pymeshviewer.py

index b73fbe8..b0dcd88 100644 (file)
@@ -4,8 +4,9 @@
 import time\r
 import os\r
 import pymeshio.mqo\r
-from opengl import material\r
-from opengl import vertexarraymap\r
+import opengl.material\r
+import opengl.texture\r
+import opengl.vertexarraymap\r
 \r
 \r
 def build(path):\r
@@ -17,9 +18,15 @@ def build(path):
     print(time.time()-t, "sec")\r
     # build\r
     basedir=os.path.dirname(path)\r
-    vertexArrayMap=vertexarraymap.VertexArrayMapWithUV(\r
-            [material.MQOMaterial.create(m, basedir) \r
-                for m in io.materials])\r
+    vertexArrayMap=opengl.vertexarraymap.VertexArrayMapWithUV()\r
+    for m in io.materials:\r
+        material=opengl.material.MQOMaterial()\r
+        material.rgba=(m.color.r, m.color.g, m.color.b, m.color.a)\r
+        if m.tex:\r
+            texturepath=os.path.join(basedir, m.tex)\r
+            material.texture=opengl.texture.Texture(texturepath)\r
+        vertexArrayMap.addMaterial(material)\r
+\r
     for o in io.objects:\r
         # skip mikoto objects\r
         if o.name.startswith("anchor"):\r
index 1c0fe38..bc85762 100644 (file)
@@ -39,7 +39,7 @@ Material
 '''
 class MQOMaterial(object):
     def __init__(self):
-        self.rgba=(0, 0, 0, 0)
+        self.rgba=(1, 1, 1, 1)
         self.vcol=False
         self.texture=None
 
@@ -71,10 +71,3 @@ class MQOMaterial(object):
         #if self.texture:
         #    self.texture.onInitialize()
 
-    @staticmethod
-    def create(src, basedir):
-        m=MQOMaterial(src.color)
-        if src.tex:
-            m.texture=texture.Texture((basedir+'/'+src.tex).replace('\\', '/'))
-        return m
-
index 8bacfc2..e6b4c53 100644 (file)
@@ -22,6 +22,10 @@ class RokuroView(baseview.BaseView):
         self.n=1\r
         self.f=10000\r
 \r
+    def __str__(self):\r
+        return '<RokuroView shiftX: %f, shiftY: %f, distance: %f>' % (\r
+                self.shiftX, self.shiftY, self.distance)\r
\r
     def onResize(self, w=None, h=None):\r
         super(RokuroView, self).onResize(w, h)\r
         self.aspect=float(self.w)/float(self.h)\r
@@ -78,7 +82,7 @@ class RokuroView(baseview.BaseView):
         self.distance=min_v[2]+d\r
         cx=min_v[0]+max_v[0]\r
         cy=min_v[1]+max_v[1]\r
-        print(cx, cy)\r
         self.shiftX=-cx/2.0\r
         self.shiftY=-cy/2.0\r
+        print(self)\r
 \r
index ccc304b..b9dee7b 100644 (file)
@@ -61,6 +61,29 @@ class VertexArrayWithUV(object):
         glDisableClientState(GL_TEXTURE_COORD_ARRAY)\r
         glDisableClientState(GL_VERTEX_ARRAY)\r
 \r
+    def get_boundingbox(self):\r
+        vertices_size=len(self.vertices)\r
+        if(vertices_size==0):\r
+            return ([0, 0, 0], [0, 0, 0])\r
+        def vertex_gen_factory():\r
+            for i in range(0, vertices_size, 3):\r
+                yield [\r
+                        self.vertices[i],\r
+                        self.vertices[i+1],\r
+                        self.vertices[i+2]\r
+                        ]\r
+        vertex_gen=vertex_gen_factory()\r
+        v=next(vertex_gen)\r
+        max_v=v[:]\r
+        min_v=v[:]\r
+        for v in vertex_gen:\r
+            min_v[0]=min(min_v[0], v[0]) \r
+            min_v[1]=min(min_v[1], v[1]) \r
+            min_v[2]=min(min_v[2], v[2]) \r
+            max_v[0]=max(max_v[0], v[0]) \r
+            max_v[1]=max(max_v[1], v[1]) \r
+            max_v[2]=max(max_v[2], v[2]) \r
+        return (min_v, max_v)\r
 \r
 '''\r
 インデックス参照頂点配列\r
@@ -129,8 +152,6 @@ class IndexedVertexArray(object):
         vertices_size=len(self.vertices)\r
         if(vertices_size==0):\r
             return ([0, 0, 0], [0, 0, 0])\r
-        print('vertices_size %d' % vertices_size)\r
-        print(self.vertices[0])\r
         def vertex_gen_factory():\r
             for i in range(0, vertices_size, 4):\r
                 yield [\r
index d242419..8f51fa7 100644 (file)
@@ -42,20 +42,20 @@ class VertexArrayMap(object):
         for v in self.vertexArrayMap.values():
             v.vertices=numpy.array(v.vertices, 'f') 
 
-
 '''
 頂点配列をマテリアル毎に分別する(UV付き)
 '''
 class VertexArrayMapWithUV(object):
-    def __init__(self, materials):
-        self.materials=materials
+    def __init__(self):
+        self.materials=[]
         self.vertexArrayWithUVMap={}
 
+    def addMaterial(self, material):
+        self.materials.append(material)
+        self.vertexArrayWithUVMap[material]=vertexarray.VertexArrayWithUV([], [])
+
     def getVertexArray(self, material_index):
         material=self.materials[material_index]
-        if not material in self.vertexArrayWithUVMap:
-            vertexArray=vertexarray.VertexArrayWithUV([], [])
-            self.vertexArrayWithUVMap[material]=vertexArray
         return self.vertexArrayWithUVMap[material]
 
     def addTriangle(self, material_index, v0, v1, v2, uv0, uv1, uv2):
@@ -88,5 +88,21 @@ class VertexArrayMapWithUV(object):
             v.uvarray=numpy.array(v.uvarray, 'f') 
 
     def onInitialize(self):
-        [m.onInitialize() for m in self.materials]
+        #[m.onInitialize() for m in self.materials]
+        pass
+
+    def get_boundingbox(self):
+        if len(self.vertexArrayWithUVMap)==0:
+            return ([0, 0, 0], [0, 0, 0])
 
+        gen=iter(self.vertexArrayWithUVMap.values())
+        (min_v, max_v)=next(gen).get_boundingbox()
+        for va in gen:
+            (va_min_v, va_max_v)=va.get_boundingbox()
+            min_v[0]=min(min_v[0], va_min_v[0]) 
+            min_v[1]=min(min_v[1], va_min_v[1]) 
+            min_v[2]=min(min_v[2], va_min_v[2]) 
+            max_v[0]=max(max_v[0], va_max_v[0]) 
+            max_v[1]=max(max_v[1], va_max_v[1]) 
+            max_v[2]=max(max_v[2], va_max_v[2]) 
+        return (min_v, max_v)
index c758e34..846c7b2 100644 (file)
@@ -16,7 +16,6 @@ def build(path):
     if not io.read(path):\r
         return\r
     print(time.time()-t, "sec")\r
-    print(io)\r
     # build\r
     basedir=os.path.dirname(path)\r
     indexedVertexArray=opengl.vertexarray.IndexedVertexArray()\r
@@ -37,7 +36,6 @@ def build(path):
             yield i\r
     indexGen=indices()\r
     for i, m in enumerate(io.materials):\r
-        print(i, m)\r
         material=opengl.material.MQOMaterial()\r
         material.vcol=True\r
         material.rgba=(\r
@@ -46,8 +44,8 @@ def build(path):
                 m.diffuse[2], \r
                 m.diffuse[3])\r
         texturefile=m.texture.decode('cp932')\r
-        if texturefile!="":\r
-            texturepath=os.path.join(basedir, texturefile)\r
+        texturepath=os.path.join(basedir, texturefile)\r
+        if os.path.isfile(texturepath):\r
             if not texturepath in textureMap:\r
                 texture=opengl.texture.Texture(texturepath)\r
                 textureMap[texturepath]=texture\r
index f617d2a..6aa79ac 100644 (file)
@@ -49,9 +49,12 @@ class Frame(tkinter.Frame):
         if not model:\r
             print('fail to load %s' % path)\r
             return\r
-        self.glworld.setRoot(model)\r
         print('load %s' % path)\r
-        self.view.look_bb(*model.get_boundingbox())\r
+        print(model)\r
+        self.glworld.setRoot(model)\r
+        bb=model.get_boundingbox()\r
+        print(bb)\r
+        self.view.look_bb(*bb)\r
         self.glwidget.onDraw()\r
 \r
     def loadModel(self, path):\r