OSDN Git Service

implement loading texture in pmdbuilder
authorousttrue <ousttrue@gmail.com>
Wed, 28 Sep 2011 18:39:29 +0000 (03:39 +0900)
committerousttrue <ousttrue@gmail.com>
Wed, 28 Sep 2011 18:39:29 +0000 (03:39 +0900)
examples/opengl/material.py
examples/opengl/texture.py
examples/opengl/vertexarray.py
examples/pmdbuilder.py

index 734749d..1c0fe38 100644 (file)
@@ -43,6 +43,12 @@ class MQOMaterial(object):
         self.vcol=False
         self.texture=None
 
+    def __enter__(self):
+        self.begin()
+
+    def __exit__(self):
+        self.end()
+
     def begin(self):
         glColor4f(*self.rgba)
         if self.texture:
@@ -61,8 +67,9 @@ class MQOMaterial(object):
             self.texture.end()
 
     def onInitialize(self):
-        if self.texture:
-            self.texture.onInitialize()
+        pass
+        #if self.texture:
+        #    self.texture.onInitialize()
 
     @staticmethod
     def create(src, basedir):
index 548e423..cb03f01 100644 (file)
@@ -10,33 +10,22 @@ class Texture(object):
     def __init__(self, path):
         self.path=path
         self.image=None
+        self.id=0
+        self.isInitialized=False
 
     def onInitialize(self):
-        if not self.image:
-            self.loadImage()
-
-        assert(self.image)
-        if self.createTexture():
-            return True
-
-    def loadImage(self):
-        self.image=Image.open(self.path)
-        if self.image:
-            print("load image:", self.path)
-            return True
-        else:
-            print("failt to load image:", self.path)
-            return False
+        self.isInitialized=False
 
     def createTexture(self):
-        self.texture=glGenTextures(1)
-        if self.texture==0:
+        self.id=glGenTextures(1)
+        if self.id==0:
             print("fail to glGenTextures")
             return False
+        print("createTexture: %d" % self.id)
 
         channels=len(self.image.getbands())
         w, h=self.image.size
-        glBindTexture(GL_TEXTURE_2D, self.texture)
+        glBindTexture(GL_TEXTURE_2D, self.id)
         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
@@ -53,10 +42,28 @@ class Texture(object):
                     0, GL_RGB, GL_UNSIGNED_BYTE, self.image.tostring())
 
     def begin(self):
-        glEnable(GL_TEXTURE_2D)
-        glBindTexture(GL_TEXTURE_2D, self.texture)
+        if not self.isInitialized:
+            try:
+                # load image
+                if not self.image:
+                    self.image=Image.open(self.path)
+                    if self.image:
+                        print("load image:", self.path)
+                    else:
+                        print("failt to load image:", self.path)
+                        return
+                # createTexture
+                if self.image:
+                    self.createTexture()
+            except Exception as e:
+                print(e)
+                return
+            finally:
+                self.isInitialized=True
+        if self.id!=0:
+            glEnable(GL_TEXTURE_2D)
+            glBindTexture(GL_TEXTURE_2D, self.id)
 
     def end(self):
         glDisable(GL_TEXTURE_2D)
 
-
index 5b1a0c4..4dc51c3 100644 (file)
@@ -84,7 +84,7 @@ class IndexedVertexArray(object):
         self.materials=[]\r
         self.indicesMap={}\r
 \r
-    def addVertex(self, pos, normal, color, uv, b0, b1, w0):\r
+    def addVertex(self, pos, normal, uv, color, b0, b1, w0):\r
         self.vertices+=pos\r
         self.normal+=normal\r
         self.colors+=color\r
@@ -103,13 +103,19 @@ class IndexedVertexArray(object):
         # 位置属性\r
         glEnableClientState(GL_VERTEX_ARRAY)\r
         glVertexPointer(4, GL_FLOAT, 0, self.vertices)\r
+        # UV属性\r
+        glEnableClientState(GL_TEXTURE_COORD_ARRAY)\r
+        glTexCoordPointer(2, GL_FLOAT, 0, self.uvlist)\r
         # マテリアル毎の描画\r
         for m in self.materials:\r
+            m.begin()\r
             # 順序維持\r
             indices=self.indicesMap[m]\r
             # indexによる描画\r
             glDrawElements(GL_TRIANGLES, len(indices), GL_UNSIGNED_INT, indices)\r
+            m.end()\r
         # 後始末\r
+        glDisableClientState(GL_TEXTURE_COORD_ARRAY)\r
         glDisableClientState(GL_VERTEX_ARRAY)\r
 \r
     def optimize(self):\r
index e41112c..96feccb 100644 (file)
@@ -44,8 +44,9 @@ def build(path):
                 m.diffuse[1], \r
                 m.diffuse[2], \r
                 m.diffuse[3])\r
-        if m.texture!="":\r
-            texturepath="%s/%s" % (basedir, m.texture)\r
+        texturefile=m.texture.decode('cp932')\r
+        if texturefile!="":\r
+            texturepath=os.path.join(basedir, texturefile)\r
             if not texturepath in textureMap:\r
                 texture=opengl.texture.Texture(texturepath)\r
                 textureMap[texturepath]=texture\r