コード例 #1
0
 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
コード例 #2
0
 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)
コード例 #3
0
 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)
コード例 #4
0
    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