Beispiel #1
0
    def generateVertices(self):
        self.vertexBuffer.setNumRows(len(self.vertices))

        vwriter = GeomVertexWriter(self.vertexBuffer, "vertex")
        cwriter = GeomVertexWriter(self.vertexBuffer, "color")
        for i in range(len(self.vertices)):
            vwriter.setData3f(self.vertices[i])
            cwriter.setData4f(self.color)

        Geometry.generateVertices(self)
Beispiel #2
0
class PointCloudVertexBuffer(object):
    def __init__(self, point_cloud_size):
        format = GeomVertexFormat.getV3c4t2()
        vdata = GeomVertexData('point', format, Geom.UHDynamic)
        self._pos_writer = GeomVertexWriter(vdata, 'vertex')
        self._color_writer = GeomVertexWriter(vdata, 'color')
        self._tex_writer = GeomVertexWriter(vdata, 'texcoord')
        self._point_cloud_size = point_cloud_size
        self._prev_point_cloud_size = 0

        assert point_cloud_size > 0
        vdata.setNumRows(point_cloud_size * 6)
        self._tex_writer.set_row(0)
        set_texture(self._tex_writer, point_cloud_size)
        pnts = GeomTriangles(Geom.UHStatic)
        pnts.addConsecutiveVertices(0, 3 * 2 * point_cloud_size)
        pnts.closePrimitive()
        points_geom = Geom(vdata)
        points_geom.addPrimitive(pnts)
        snode = GeomNode('points')
        snode.addGeom(points_geom)
        dir_name = osp.dirname(__file__)
        # print(osp.join(dir_name, 'pnts_vs.glsl'))
        vs_shader = osp.join(dir_name, 'pnts_vs.glsl')
        fs_shader = osp.join(dir_name, 'pnts_fs.glsl')
        myShader = Shader.load(
            Shader.SL_GLSL,
            vertex=Filename.fromOsSpecific(vs_shader).getFullpath(),
            fragment=Filename.fromOsSpecific(fs_shader).getFullpath())

        assert myShader is not None
        self.points_node = base.render.attachNewNode(snode)
        self.points_node.setPos(0., 0., 0.)
        self.points_node.set_shader(myShader)
        self.points_node.set_shader_input(
            "view_size", (base.win.getXSize(), base.win.getYSize()))
        self.points_node.node().setBounds(
            BoundingBox((-1000., -1000., -1000.), (1000., 1000., 1000.)))
        self.points_node.setTransparency(TransparencyAttrib.MAlpha)

    def assign_points(self, point_cloud, color):
        assert color.shape[1] == 4
        assert color.shape[0] == point_cloud.shape[0]
        load_point_cloud(self._pos_writer, self._color_writer,
                         point_cloud.astype(np.float64),
                         color.astype(np.float64), self._point_cloud_size,
                         self._prev_point_cloud_size)
        self._prev_point_cloud_size = point_cloud.shape[0]

    def clear_pc(self):
        self._color_writer.set_row(0)
        for i in range(self._point_cloud_size * 6):
            self._color_writer.setData4f(1., 1., 1., 0.)
Beispiel #3
0
 def rain(self, task):
     # animate level
     self.flood()
     # Animate Rain
     speed = 1.0
     vertex = GeomVertexRewriter(self.rain_vdata, 'vertex')
     color = GeomVertexWriter(self.rain_vdata, 'color')
     moving = np.random.choice([0, 1],
                               size=(self.n_points, self.n_points),
                               p=[999 / 1000, 1. / 1000])
     moved = 0
     for j in range(self.n_points):
         for i in range(self.n_points):
             # rain
             v = vertex.getData3f()
             # start falling
             if v[2] == self.n_points:
                 if moving[j][i] == 1 and self.raining == True:
                     self.rz[j][i] -= speed
                     vertex.setData3f(v[0], v[1], self.rz[j][i])
                     color.setData4f(0.3, 0.3, 1, 1)
                     moved += 1
                 else:
                     vertex.setData3f(v[0], v[1], v[2])
                     color.setData4f(0.3, 0.3, 1, 0)
             # keep falling
             elif self.rz[j][i] > self.lz[j][i]:
                 if self.rz[j][i] - speed > self.lz[j][i]:
                     self.rz[j][i] -= speed
                 else:
                     self.rz[j][i] = self.lz[j][i]
                 vertex.setData3f(v[0], v[1], self.rz[j][i])
                 if self.rz[j][i] > self.wz[j][i]:
                     color.setData4f(0.3, 0.3, 1, 1)
                 else:
                     color.setData4f(0.3, 0.3, 1, 0)
                 moved += 1
             # stop falling
             else:
                 # handle rolling drops
                 v = list(map(int, v))
                 moved += self.rolling_drops(v, vertex, color, moved, i, j)
     if moved == 0:
         self.flooding = False
         return task.done
     return task.cont
Beispiel #4
0
    def generateVertices(self):

        self.vertexBuffer.setNumRows(4)

        vwriter = GeomVertexWriter(self.vertexBuffer, "vertex")
        cwriter = GeomVertexWriter(self.vertexBuffer, "color")

        vwriter.setData3f(self.mins.x, 0, self.mins.z)
        cwriter.setData4f(self.color)

        vwriter.setData3f(self.mins.x, 0, self.maxs.z)
        cwriter.setData4f(self.color)

        vwriter.setData3f(self.maxs.x, 0, self.maxs.z)
        cwriter.setData4f(self.color)

        vwriter.setData3f(self.maxs.x, 0, self.mins.z)
        cwriter.setData4f(self.color)

        Geometry.generateVertices(self)
Beispiel #5
0
    def generateVertices(self):

        if self.handleType == HandleType.Square:
            self.vertexBuffer.setNumRows(len(self.handleOrigins) * 8)
            vwriter = GeomVertexWriter(self.vertexBuffer, "vertex")
            cwriter = GeomVertexWriter(self.vertexBuffer, "color")
            radius = self.radius / self.zoom
            add = radius * 0.08

            for origin in self.handleOrigins:
                ul = Point3(origin.x - radius, 0, origin.z - radius)
                lr = Point3(origin.x + radius + add, 0,
                            origin.z + radius + add)

                # Border
                vwriter.setData3f(ul.x, 0.1, ul.z)
                cwriter.setData4f(self.Black)
                vwriter.setData3f(lr.x, 0.1, ul.z)
                cwriter.setData4f(self.Black)
                vwriter.setData3f(lr.x, 0.1, lr.z)
                cwriter.setData4f(self.Black)
                vwriter.setData3f(ul.x, 0.1, lr.z)
                cwriter.setData4f(self.Black)

                ul.x += add
                ul.z += add
                lr.x -= add
                lr.z -= add

                vwriter.setData3f(ul.x, 0, ul.z)
                cwriter.setData4f(self.White)
                vwriter.setData3f(lr.x, 0, ul.z)
                cwriter.setData4f(self.White)
                vwriter.setData3f(lr.x, 0, lr.z)
                cwriter.setData4f(self.White)
                vwriter.setData3f(ul.x, 0, lr.z)
                cwriter.setData4f(self.White)

        Geometry.generateVertices(self)
Beispiel #6
0
    def __init__(self):

        super().__init__()
        self.model = 'radiosity_test'
        # self.texture = 'project_browser_bg'
        self.scale *= 4
        player = FirstPersonController()

        # self.vertices_colored = 0
        #
        geomNodeCollection = self.model.findAllMatches('**/+GeomNode')
        for nodePath in geomNodeCollection:
            geomNode = nodePath.node()
            for i in range(geomNode.getNumGeoms()):
                # geom = geomNode.getGeom(i)      # read
                geom = geomNode.modifyGeom(i)
                # vdata = geom.getVertexData()
                vdata = geom.modifyVertexData()

                vertex = GeomVertexReader(vdata, 'vertex')
                vert_color = GeomVertexReader(vdata, 'color')
                print(vert_color)
                normal = GeomVertexReader(vdata, 'normal')
                new_color = GeomVertexWriter(vdata, 'color')

                verts = list()
                while not vertex.isAtEnd():
                    v = vertex.getData3f()
                    verts.append(v)
                    n = normal.getData3f()
                    try:
                        c = vert_color.getData4f()
                        if c == color.yellow:
                            light_position = v
                        #     light_normal = n
                    except:
                        pass
                print(len(verts))

                vertex = GeomVertexReader(vdata, 'vertex')
                # print(vertex)
                while not vertex.isAtEnd():
                    v = vertex.getData3f()
                    n = normal.getData3f()
                    try:
                        c = vert_color.getData4f()
                        if c != color.yellow:
                            # if n[0] > .5:
                            dist = distance(light_position, v)
                            new_color.setData4f(color.color(0, 0, 1-dist/2))
                            # new_color.setData4f(color.rgba(n[0], n[1], n[2]))
                            # break_outer = False
                            # temp_point = v
                            # for i in range(1):
                            #     if break_outer:
                            #         break
                            #
                            #     temp_point = (temp_point[0] + n[0], temp_point[1] + n[1], temp_point[2] + n[2])
                            #     # if distance(temp_point, light_position) < i * i * .2:
                            #     #     new_color.setData4f(color.color(60, 1, i/10 , 1))
                            #     #     break
                            #     for p in verts:
                            #         dist = distance(temp_point, p)
                            #         if dist < .01:
                            #             print('hit self')
                            #             continue
                            #         elif dist < .5:
                            #             print('hit after', i)
                            #             break
                            #             break_outer = True
                                # print('ignore')
                    except:
                        pass