def mesh(vertices, normals, colours, triangles): # TODO: Make this name meaningful in some way name = 'test' v3n3c4 = GeomVertexFormat.get_v3n3c4() data = GeomVertexData(name, v3n3c4, Geom.UHStatic) data.set_num_rows(len(vertices)) vertex_writer = GeomVertexWriter(data, 'vertex') normal_writer = GeomVertexWriter(data, 'normal') colour_writer = GeomVertexWriter(data, 'color') for vertex in vertices: vertex_writer.add_data3(*vertex) for normal in normals: normal_writer.add_data3(*normal) for colour in colours: colour_writer.add_data4(*colour) prim = GeomTriangles(Geom.UHStatic) for triangle in triangles: prim.add_vertices(*triangle) geom = Geom(data) geom.add_primitive(prim) node = GeomNode(name) node.add_geom(geom) return node
class PointMaker(): def __init__(self, name): self.name = name self.new() def new(self): self.point = 0 self.vdata = GeomVertexData( self.name, GeomVertexFormat.get_v3c4(), Geom.UHStatic) self.vdata.set_num_rows(2) self.vertex = GeomVertexWriter(self.vdata, 'vertex') self.color = GeomVertexWriter(self.vdata, 'color') self.prim = GeomPoints(Geom.UHStatic) def add(self, pos=(0,0,0), color=(1,1,1,1)): self.vertex.add_data3(pos[0],pos[1],pos[2]+0.02) self.color.add_data4(color) self.prim.add_vertex(self.point) self.point += 1 def wrap_up(self): self.prim.close_primitive() geom = Geom(self.vdata) geom.add_primitive(self.prim) node = GeomNode('point') node.add_geom(geom) return NodePath(node)
class VertexArray(object): def __init__(self, name='Unnamed Shape'): self._name = name self._vert_data = GeomVertexData( self._name, GeomVertexFormat.get_v3n3c4t2(), Geom.UH_static ) self._vert_writer = GeomVertexWriter(self._vert_data, 'vertex') self._norm_writer = GeomVertexWriter(self._vert_data, 'normal') self._color_writer = GeomVertexWriter(self._vert_data, 'color') self._tex_writer = GeomVertexWriter(self._vert_data, 'texcoord') self._prim = GeomTriangles(Geom.UH_static) self._v_id = 0 def set_num_rows(self, num_rows): self._vert_data.set_num_rows(num_rows) def add_row(self, point, normal, color, tex): self._vert_writer.add_data3(point) self._norm_writer.add_data3(normal) self._color_writer.add_data4(color) self._tex_writer.add_data2(tex) self._v_id += 1 return self._v_id - 1 def add_triangle(self, va, vb, vc): self._prim.add_vertices(va, vb, vc) def get_node(self): geom = Geom(self._vert_data) geom.add_primitive(self._prim) node = GeomNode(self._name) node.add_geom(geom) return node