def makeGeom(self, points, colors, sizes): #format = GeomVertexFormat.getV3c4() array = GeomVertexArrayFormat() array.addColumn(InternalName.get_vertex(), 3, Geom.NTFloat32, Geom.CPoint) array.addColumn(InternalName.get_color(), 4, Geom.NTFloat32, Geom.CColor) array.addColumn(InternalName.get_size(), 1, Geom.NTFloat32, Geom.COther) format = GeomVertexFormat() format.addArray(array) format = GeomVertexFormat.registerFormat(format) vdata = GeomVertexData('vdata', format, Geom.UH_static) vdata.unclean_set_num_rows(len(points)) self.vwriter = GeomVertexWriter(vdata, InternalName.get_vertex()) self.colorwriter = GeomVertexWriter(vdata, InternalName.get_color()) self.sizewriter = GeomVertexWriter(vdata, InternalName.get_size()) geompoints = GeomPoints(Geom.UH_static) geompoints.reserve_num_vertices(len(points)) index = 0 for (point, color, size) in zip(points, colors, sizes): self.vwriter.addData3f(*point) self.colorwriter.addData4f(*color) self.sizewriter.addData1f(size) geompoints.addVertex(index) #geompoints.closePrimitive() index += 1 geom = Geom(vdata) geom.addPrimitive(geompoints) return geom
def update_geom(self, points, colors, sizes): geom = self.instance.children[0].node().modify_geom(0) vdata = geom.modify_vertex_data() vdata.unclean_set_num_rows(len(points)) vwriter = GeomVertexRewriter(vdata, InternalName.get_vertex()) colorwriter = GeomVertexWriter(vdata, InternalName.get_color()) sizewriter = GeomVertexWriter(vdata, InternalName.get_size()) for (point, color, size) in zip(points, colors, sizes): vwriter.addData3f(*point) colorwriter.addData4f(*color) sizewriter.addData1f(size)
def update_geom(self): geom = self.node.modify_geom(0) vdata = geom.modify_vertex_data() vwriter = GeomVertexRewriter(vdata, InternalName.get_vertex()) #TODO: refactor with above code !!! delta = self.body.parent.get_local_position() if self.orbit.is_periodic(): epoch = self.context.time.time_full - self.orbit.period step = self.orbit.period / (self.nbOfPoints - 1) else: #TODO: Properly calculate orbit start and end time epoch = self.orbit.get_time_of_perihelion() - self.orbit.period * 5.0 step = self.orbit.period * 10.0 / (self.nbOfPoints - 1) for i in range(self.nbOfPoints): time = epoch + step * i pos = self.orbit.get_position_at(time) - delta vwriter.setData3f(*pos)
def create_hidden_area_mesh(self, mask): """ Using the provided mask configuration, create the mesh that will cover the area not visible from the HMD """ gvf = GeomVertexFormat.get_v3() gvd = GeomVertexData('gvd', gvf, Geom.UH_static) geom = Geom(gvd) gvw = GeomVertexWriter(gvd, InternalName.get_vertex()) for i in range(mask.unTriangleCount * 3): vertex = mask.pVertexData[i] # The clip space in Panda3D has [-1, 1] coordinates, the received coordinates are in [0, 1] gvw.add_data3(vertex[0] * 2 - 1, vertex[1] * 2 - 1, -1) prim = GeomTriangles(Geom.UH_static) for i in range(mask.unTriangleCount): prim.add_vertices(i * 3, i * 3 + 1, i * 3 + 2) geom.add_primitive(prim) node = GeomNode('hidden-area-mesh') node.add_geom(geom) return node