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)
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)
-
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
# 位置属性\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
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