From a558a16fb23f8a8e1c43d327efcd9bb3239a8071 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Thu, 29 Sep 2011 10:38:45 +0900 Subject: [PATCH] fix mqobuilder --- examples/mqobuilder.py | 17 ++++++++++++----- examples/opengl/material.py | 9 +-------- examples/opengl/rokuro.py | 6 +++++- examples/opengl/vertexarray.py | 25 +++++++++++++++++++++++-- examples/opengl/vertexarraymap.py | 30 +++++++++++++++++++++++------- examples/pmdbuilder.py | 6 ++---- examples/pymeshviewer.py | 7 +++++-- 7 files changed, 71 insertions(+), 29 deletions(-) diff --git a/examples/mqobuilder.py b/examples/mqobuilder.py index b73fbe8..b0dcd88 100644 --- a/examples/mqobuilder.py +++ b/examples/mqobuilder.py @@ -4,8 +4,9 @@ import time import os import pymeshio.mqo -from opengl import material -from opengl import vertexarraymap +import opengl.material +import opengl.texture +import opengl.vertexarraymap def build(path): @@ -17,9 +18,15 @@ def build(path): print(time.time()-t, "sec") # build basedir=os.path.dirname(path) - vertexArrayMap=vertexarraymap.VertexArrayMapWithUV( - [material.MQOMaterial.create(m, basedir) - for m in io.materials]) + vertexArrayMap=opengl.vertexarraymap.VertexArrayMapWithUV() + for m in io.materials: + material=opengl.material.MQOMaterial() + material.rgba=(m.color.r, m.color.g, m.color.b, m.color.a) + if m.tex: + texturepath=os.path.join(basedir, m.tex) + material.texture=opengl.texture.Texture(texturepath) + vertexArrayMap.addMaterial(material) + for o in io.objects: # skip mikoto objects if o.name.startswith("anchor"): diff --git a/examples/opengl/material.py b/examples/opengl/material.py index 1c0fe38..bc85762 100644 --- a/examples/opengl/material.py +++ b/examples/opengl/material.py @@ -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 - diff --git a/examples/opengl/rokuro.py b/examples/opengl/rokuro.py index 8bacfc2..e6b4c53 100644 --- a/examples/opengl/rokuro.py +++ b/examples/opengl/rokuro.py @@ -22,6 +22,10 @@ class RokuroView(baseview.BaseView): self.n=1 self.f=10000 + def __str__(self): + return '' % ( + self.shiftX, self.shiftY, self.distance) + def onResize(self, w=None, h=None): super(RokuroView, self).onResize(w, h) self.aspect=float(self.w)/float(self.h) @@ -78,7 +82,7 @@ class RokuroView(baseview.BaseView): self.distance=min_v[2]+d cx=min_v[0]+max_v[0] cy=min_v[1]+max_v[1] - print(cx, cy) self.shiftX=-cx/2.0 self.shiftY=-cy/2.0 + print(self) diff --git a/examples/opengl/vertexarray.py b/examples/opengl/vertexarray.py index ccc304b..b9dee7b 100644 --- a/examples/opengl/vertexarray.py +++ b/examples/opengl/vertexarray.py @@ -61,6 +61,29 @@ class VertexArrayWithUV(object): glDisableClientState(GL_TEXTURE_COORD_ARRAY) glDisableClientState(GL_VERTEX_ARRAY) + def get_boundingbox(self): + vertices_size=len(self.vertices) + if(vertices_size==0): + return ([0, 0, 0], [0, 0, 0]) + def vertex_gen_factory(): + for i in range(0, vertices_size, 3): + yield [ + self.vertices[i], + self.vertices[i+1], + self.vertices[i+2] + ] + vertex_gen=vertex_gen_factory() + v=next(vertex_gen) + max_v=v[:] + min_v=v[:] + for v in vertex_gen: + min_v[0]=min(min_v[0], v[0]) + min_v[1]=min(min_v[1], v[1]) + min_v[2]=min(min_v[2], v[2]) + max_v[0]=max(max_v[0], v[0]) + max_v[1]=max(max_v[1], v[1]) + max_v[2]=max(max_v[2], v[2]) + return (min_v, max_v) ''' インデックス参照頂点配列 @@ -129,8 +152,6 @@ class IndexedVertexArray(object): vertices_size=len(self.vertices) if(vertices_size==0): return ([0, 0, 0], [0, 0, 0]) - print('vertices_size %d' % vertices_size) - print(self.vertices[0]) def vertex_gen_factory(): for i in range(0, vertices_size, 4): yield [ diff --git a/examples/opengl/vertexarraymap.py b/examples/opengl/vertexarraymap.py index d242419..8f51fa7 100644 --- a/examples/opengl/vertexarraymap.py +++ b/examples/opengl/vertexarraymap.py @@ -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) diff --git a/examples/pmdbuilder.py b/examples/pmdbuilder.py index c758e34..846c7b2 100644 --- a/examples/pmdbuilder.py +++ b/examples/pmdbuilder.py @@ -16,7 +16,6 @@ def build(path): if not io.read(path): return print(time.time()-t, "sec") - print(io) # build basedir=os.path.dirname(path) indexedVertexArray=opengl.vertexarray.IndexedVertexArray() @@ -37,7 +36,6 @@ def build(path): yield i indexGen=indices() for i, m in enumerate(io.materials): - print(i, m) material=opengl.material.MQOMaterial() material.vcol=True material.rgba=( @@ -46,8 +44,8 @@ def build(path): m.diffuse[2], m.diffuse[3]) texturefile=m.texture.decode('cp932') - if texturefile!="": - texturepath=os.path.join(basedir, texturefile) + texturepath=os.path.join(basedir, texturefile) + if os.path.isfile(texturepath): if not texturepath in textureMap: texture=opengl.texture.Texture(texturepath) textureMap[texturepath]=texture diff --git a/examples/pymeshviewer.py b/examples/pymeshviewer.py index f617d2a..6aa79ac 100644 --- a/examples/pymeshviewer.py +++ b/examples/pymeshviewer.py @@ -49,9 +49,12 @@ class Frame(tkinter.Frame): if not model: print('fail to load %s' % path) return - self.glworld.setRoot(model) print('load %s' % path) - self.view.look_bb(*model.get_boundingbox()) + print(model) + self.glworld.setRoot(model) + bb=model.get_boundingbox() + print(bb) + self.view.look_bb(*bb) self.glwidget.onDraw() def loadModel(self, path): -- 2.11.0