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
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
'''
class MQOMaterial(object):
def __init__(self):
- self.rgba=(0, 0, 0, 0)
+ self.rgba=(1, 1, 1, 1)
self.vcol=False
self.texture=None
#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
-
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
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
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
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
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):
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)
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
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
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
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