From 59c9ecf38678e09fa3159409cba65827d979d5e5 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 28 Sep 2011 11:32:12 +0900 Subject: [PATCH] add mqo loader --- .gitignore | 1 + examples/cube.mqo | 52 ++++++++++++++++++++ examples/front.jpg | Bin 0 -> 4034 bytes examples/material.py | 72 +++++++++++++++++++++++++++ examples/mqobuilder.py | 61 +++++++++++++++++++++++ examples/opengl/__init__.py | 16 ++++-- examples/pymeshviewer.py | 32 +++++++++--- examples/texture.py | 62 +++++++++++++++++++++++ examples/vertexarray.py | 116 ++++++++++++++++++++++++++++++++++++++++++++ examples/vertexarraymap.py | 92 +++++++++++++++++++++++++++++++++++ 10 files changed, 493 insertions(+), 11 deletions(-) create mode 100644 examples/cube.mqo create mode 100644 examples/front.jpg create mode 100644 examples/material.py create mode 100644 examples/mqobuilder.py create mode 100644 examples/texture.py create mode 100644 examples/vertexarray.py create mode 100644 examples/vertexarraymap.py diff --git a/.gitignore b/.gitignore index cfe6115..3687164 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ Makefile build dist pymeshio.egg-info +*.pyc diff --git a/examples/cube.mqo b/examples/cube.mqo new file mode 100644 index 0000000..e56de65 --- /dev/null +++ b/examples/cube.mqo @@ -0,0 +1,52 @@ +Metasequoia Document +Format Text Ver 1.0 + +Scene { + pos 48.0899 60.6742 2400.0000 + lookat 0.0000 0.0000 0.0000 + head 0.0000 + pich 0.0000 + ortho 1 + zoom2 3.1250 + amb 0.250 0.250 0.250 +} +Material 6 { + "mat1" shader(3) col(1.000 0.000 0.000 1.000) dif(0.800) amb(0.600) emi(0.000) spc(0.000) power(5.00) + "mat2" shader(3) col(0.000 0.000 1.000 1.000) dif(0.800) amb(0.600) emi(0.000) spc(0.000) power(5.00) tex("front.jpg") + "mat3" shader(3) col(1.000 1.000 0.000 1.000) dif(0.800) amb(0.600) emi(0.000) spc(0.000) power(5.00) + "mat4" shader(3) col(0.000 0.749 0.169 1.000) dif(0.800) amb(0.600) emi(0.000) spc(0.000) power(5.00) + "mat5" shader(3) col(1.000 1.000 1.000 1.000) dif(0.800) amb(0.600) emi(0.000) spc(0.000) power(5.00) + "mat6" shader(3) col(1.000 0.000 1.000 1.000) dif(0.800) amb(0.600) emi(0.000) spc(0.000) power(5.00) +} +Object "obj1" { + depth 0 + folding 0 + scale 1.000000 1.000000 1.000000 + rotation 0.000000 0.000000 0.000000 + translation 0.000000 0.000000 0.000000 + visible 15 + locking 0 + shading 1 + facet 59.5 + color 0.898 0.498 0.698 + color_type 0 + vertex 8 { + -100.0000 100.0000 100.0000 + -100.0000 -100.0000 100.0000 + 100.0000 100.0000 100.0000 + 100.0000 -100.0000 100.0000 + 100.0000 100.0000 -100.0000 + 100.0000 -100.0000 -100.0000 + -100.0000 100.0000 -100.0000 + -100.0000 -100.0000 -100.0000 + } + face 6 { + 4 V(0 2 3 1) M(1) UV(0.00000 0.00000 1.00000 0.00000 1.00000 1.00000 0.00000 1.00000) + 4 V(2 4 5 3) M(0) UV(0.00000 0.00000 1.00000 0.00000 1.00000 1.00000 0.00000 1.00000) + 4 V(4 6 7 5) M(2) UV(0.00000 0.00000 1.00000 0.00000 1.00000 1.00000 0.00000 1.00000) + 4 V(6 0 1 7) M(3) UV(0.00000 0.00000 1.00000 0.00000 1.00000 1.00000 0.00000 1.00000) + 4 V(6 4 2 0) M(4) UV(0.00000 0.00000 1.00000 0.00000 1.00000 1.00000 0.00000 1.00000) + 4 V(1 3 5 7) M(5) UV(0.00000 0.00000 1.00000 0.00000 1.00000 1.00000 0.00000 1.00000) + } +} +Eof diff --git a/examples/front.jpg b/examples/front.jpg new file mode 100644 index 0000000000000000000000000000000000000000..19bb34ec46031dfd8643ff0f471795c13500efcf GIT binary patch literal 4034 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', self.onKeyDown) - self.bind('', lambda e: self.glworld.onWheel(-e.delta) and glwidget.onDraw()) + self.bind('', lambda e: self.glworld.onWheel(-e.delta) and self.glwidget.onDraw()) def onOpen(self): filename=tkinter.filedialog.askopenfilename( @@ -39,7 +40,24 @@ class Frame(tkinter.Frame): ('poloygon model files', '*.mqo;*.pmd'), ], initialdir=self.current) - print('open: %s' % filename) + if filename.lower().endswith(".mqo"): + self.loadMqo(filename) + elif filename.lower().endswith(".pmd"): + self.loadPmd(filename) + self.current=os.path.dirname(filename) + + def loadMqo(self, path): + # load scenee + model=mqobuilder.build(path) + if not model: + print('fail to load %s' % path) + return + self.glworld.setRoot(model) + print('loadMqo %s' % path) + self.glwidget.onDraw() + + def loadPmd(self, path): + print('loadPmd %s' % path) def onKeyDown(self, event): key=event.keycode diff --git a/examples/texture.py b/examples/texture.py new file mode 100644 index 0000000..548e423 --- /dev/null +++ b/examples/texture.py @@ -0,0 +1,62 @@ +#!/usr/bin/python +# coding: utf-8 + +from PIL import Image +from OpenGL.GL import * + + +class Texture(object): + + def __init__(self, path): + self.path=path + self.image=None + + 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 + + def createTexture(self): + self.texture=glGenTextures(1) + if self.texture==0: + print("fail to glGenTextures") + return False + + channels=len(self.image.getbands()) + w, h=self.image.size + glBindTexture(GL_TEXTURE_2D, self.texture) + 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) + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) + if channels==4: + print("RGBA") + glPixelStorei(GL_UNPACK_ALIGNMENT, 4) + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, + 0, GL_RGBA, GL_UNSIGNED_BYTE, self.image.tostring()) + elif channels==3: + print("RGB") + glPixelStorei(GL_UNPACK_ALIGNMENT, 1) + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, + 0, GL_RGB, GL_UNSIGNED_BYTE, self.image.tostring()) + + def begin(self): + glEnable(GL_TEXTURE_2D) + glBindTexture(GL_TEXTURE_2D, self.texture) + + def end(self): + glDisable(GL_TEXTURE_2D) + + diff --git a/examples/vertexarray.py b/examples/vertexarray.py new file mode 100644 index 0000000..749b6e0 --- /dev/null +++ b/examples/vertexarray.py @@ -0,0 +1,116 @@ +#!/usr/bin/python +# coding: utf-8 + +from OpenGL.GL import * + +''' +頂点配列 + +==== +属性 +==== +* 位置 +''' +class VertexArray(object): + def __init__(self, vertices): + self.vertices=vertices + + def __str__(self): + return "" % len(self.vertices) + + def draw(self): + # 位置属性 + glEnableClientState(GL_VERTEX_ARRAY) + glVertexPointer(3, GL_FLOAT, 0, self.vertices) + # 描画 + glDrawArrays(GL_TRIANGLES, 0, len(self.vertices)) + # 後始末 + glDisableClientState(GL_VERTEX_ARRAY) + + + +''' +頂点配列 + +==== +属性 +==== +* 位置 +* UV +''' +class VertexArrayWithUV(object): + def __init__(self, vertices, uvarray): + self.vertices=vertices + self.uvarray=uvarray + + def __str__(self): + return "" % len(self.vertices) + + def draw(self): + # 位置属性 + glEnableClientState(GL_VERTEX_ARRAY) + glVertexPointer(3, GL_FLOAT, 0, self.vertices) + # UV属性 + glEnableClientState(GL_TEXTURE_COORD_ARRAY) + glTexCoordPointer(2, GL_FLOAT, 0, self.uvarray) + # 描画 + triangle_count=int(len(self.vertices)/3) + glDrawArrays(GL_TRIANGLES, 0, triangle_count) + # 後始末 + glDisableClientState(GL_TEXTURE_COORD_ARRAY) + glDisableClientState(GL_VERTEX_ARRAY) + + +''' +インデックス参照頂点配列 + +==== +属性 +==== +* 位置 +''' +class IndexedVertexArray(object): + def __init__(self, vertices, indices): + self.vertices=vertices + self.indices=indices + + def draw(self): + # 位置属性 + glEnableClientState(GL_VERTEX_ARRAY) + glVertexPointer(3, GL_FLOAT, 0, self.vertices) + # indexによる描画 + glDrawElements(GL_TRIANGLES, len(self.indices), + GL_UNSIGNED_INT, self.indices) + # 後始末 + glDisableClientState(GL_VERTEX_ARRAY) + + +''' +インデックス参照頂点配列 + +==== +属性 +==== +* 位置 +* 色 +''' +class IndexedVertexArrayWithColor(object): + def __init__(self, vertices, colors, indices): + self.vertices=vertices + self.colors=colors + self.indices=indices + + def draw(self): + # 位置属性 + glEnableClientState(GL_VERTEX_ARRAY) + glVertexPointer(3, GL_FLOAT, 0, self.vertices) + # 色属性 + glEnableClientState(GL_COLOR_ARRAY) + glColorPointer(3, GL_FLOAT, 0, self.colors) + # indexによる描画 + glDrawElements(GL_TRIANGLES, len(self.indices), + GL_UNSIGNED_INT, self.indices) + # 後始末 + glDisableClientState(GL_COLOR_ARRAY) + glDisableClientState(GL_VERTEX_ARRAY) + diff --git a/examples/vertexarraymap.py b/examples/vertexarraymap.py new file mode 100644 index 0000000..6994483 --- /dev/null +++ b/examples/vertexarraymap.py @@ -0,0 +1,92 @@ +#!/usr/bin/python +# coding: utf-8 + +import numpy +import vertexarray + + +''' +頂点配列をマテリアル毎に分別する +''' +class VertexArrayMap(object): + def __init__(self, materials): + self.materials=materials + self.vertexArrayMap={} + + def getVertexArray(self, material_index): + material=self.materials[material_index] + if not material in self.vertexArrayMap: + vertexArray=vertexarray.VertexArray([]) + self.vertexArrayMap[material]=vertexArray + return self.vertexArrayMap[material] + + def addTriangle(self, material_index, v0, v1, v2): + vertexArray=self.getVertexArray(material_index) + vertexArray.vertices.append(v0.x) + vertexArray.vertices.append(v0.y) + vertexArray.vertices.append(v0.z) + vertexArray.vertices.append(v1.x) + vertexArray.vertices.append(v1.y) + vertexArray.vertices.append(v1.z) + vertexArray.vertices.append(v2.x) + vertexArray.vertices.append(v2.y) + vertexArray.vertices.append(v2.z) + + def draw(self): + for m, vertexArray in self.vertexArrayMap.items(): + m.begin() + vertexArray.draw() + m.end() + + def optimize(self): + for v in self.vertexArrayMap.values(): + v.vertices=numpy.array(v.vertices, 'f') + + +''' +頂点配列をマテリアル毎に分別する(UV付き) +''' +class VertexArrayMapWithUV(object): + def __init__(self, materials): + self.materials=materials + self.vertexArrayWithUVMap={} + + 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): + vertexArray=self.getVertexArray(material_index) + vertexArray.vertices.append(v0.x) + vertexArray.vertices.append(v0.y) + vertexArray.vertices.append(v0.z) + vertexArray.vertices.append(v1.x) + vertexArray.vertices.append(v1.y) + vertexArray.vertices.append(v1.z) + vertexArray.vertices.append(v2.x) + vertexArray.vertices.append(v2.y) + vertexArray.vertices.append(v2.z) + vertexArray.uvarray.append(uv0.x) + vertexArray.uvarray.append(uv0.y) + vertexArray.uvarray.append(uv1.x) + vertexArray.uvarray.append(uv1.y) + vertexArray.uvarray.append(uv2.x) + vertexArray.uvarray.append(uv2.y) + + def draw(self): + for m, vertexArray in self.vertexArrayWithUVMap.items(): + m.begin() + vertexArray.draw() + m.end() + + def optimize(self): + for v in self.vertexArrayWithUVMap.values(): + v.vertices=numpy.array(v.vertices, 'f') + v.uvarray=numpy.array(v.uvarray, 'f') + + def onInitialize(self): + [m.onInitialize() for m in self.materials] + -- 2.11.0