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
class SquareMesh(): name: Final[str] mesh: Final[Geom] depth: Final[float] __vertex_data_format: GeomVertexFormat __vertex_data: GeomVertexData __triangles: GeomTriangles __triangle_data: GeomVertexArrayData __vertex: GeomVertexWriter __normal: GeomVertexWriter __texcoord: GeomVertexWriter def __init__(self, width: int = 1, height: int = 1, depth: Real = 0.1, name: str = 'SquareMesh') -> None: self.name = name self.depth = depth self.__vertex_data_format = GeomVertexFormat. getV3n3t2() self.__vertex_data = GeomVertexData(name, self.__vertex_data_format, Geom.UHStatic) self.__vertex_data.set_num_rows(4) self.mesh = Geom(self.__vertex_data) self.__triangles = GeomTriangles(Geom.UHStatic) self.__triangle_data = self.__triangles.modifyVertices() self.__vertex = GeomVertexWriter(self.__vertex_data, 'vertex') self.__normal = GeomVertexWriter(self.__vertex_data, 'normal') self.__texcoord = GeomVertexWriter(self.__vertex_data, 'texcoord') self.__face_count = 0 def make(x1, y1, z1, x2, y2, z2, tex) -> None: if x1 == x2: self.__vertex.add_data3f(x1, y1, z1) self.__vertex.add_data3f(x2, y2, z1) self.__vertex.add_data3f(x2, y2, z2) self.__vertex.add_data3f(x1, y1, z2) self.__normal.add_data3(normalise(2 * x1 - 1, 2 * y1 - 1, 2 * z1 - 1)) self.__normal.add_data3(normalise(2 * x2 - 1, 2 * y2 - 1, 2 * z1 - 1)) self.__normal.add_data3(normalise(2 * x2 - 1, 2 * y2 - 1, 2 * z2 - 1)) self.__normal.add_data3(normalise(2 * x1 - 1, 2 * y1 - 1, 2 * z2 - 1)) else: self.__vertex.add_data3f(x1, y1, z1) self.__vertex.add_data3f(x2, y1, z1) self.__vertex.add_data3f(x2, y2, z2) self.__vertex.add_data3f(x1, y2, z2) self.__normal.add_data3(normalise(2 * x1 - 1, 2 * y1 - 1, 2 * z1 - 1)) self.__normal.add_data3(normalise(2 * x2 - 1, 2 * y1 - 1, 2 * z1 - 1)) self.__normal.add_data3(normalise(2 * x2 - 1, 2 * y2 - 1, 2 * z2 - 1)) self.__normal.add_data3(normalise(2 * x1 - 1, 2 * y2 - 1, 2 * z2 - 1)) for data in tex: self.__texcoord.addData2f(*data) vertex_id = self.__face_count * 4 self.__triangles.addVertices(vertex_id, vertex_id + 1, vertex_id + 3) self.__triangles.addVertices(vertex_id + 1, vertex_id + 2, vertex_id + 3) self.__face_count += 1 if self.depth == 0: make(0, 0, 0, width, height, 0, [(1.0, 1.0), (0.0, 1.0), (0.0, 0.0), (1.0, 0.0)]) else: make(0, height, -self.depth, 0, 0, 0, ((0.0, 1.0), (0.0, 0.0), (0.0, 0.0), (0.0, 1.0))) # SIDE make(0, 0, -self.depth, width, 0, 0, ((0.0, 0.0), (1.0, 0.0), (1.0, 0.0), (0.0, 0.0))) # SIDE make(width, height, -self.depth, 0, height, 0, ((1.0, 1.0), (0.0, 1.0), (0.0, 1.0), (1.0, 1.0))) # SIDE make(width, 0, -self.depth, width, height, 0, ((1.0, 0.0), (1.0, 1.0), (1.0, 1.0), (1.0, 0.0))) # SIDE make(width, height, 0, 0, 0, 0, ((1.0, 1.0), (0.0, 1.0), (0.0, 0.0), (1.0, 0.0))) # TOP make(0, height, -self.depth, width, 0, -self.depth, ((0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0))) # BOTTOM self.__triangles.close_primitive() self.mesh.add_primitive(self.__triangles) @property def geom_node(self) -> str: return 'geom_node' @geom_node.getter def geom_node(self) -> GeomNode: node = GeomNode(self.name) node.addGeom(self.mesh) return node