Example #1
0
    def build_node_path(self, parent_node_path, bullet_world):
        land_geom = self.__build_land_mesh()
        ocean_geom = self.__build_ocean_mesh()
        land_mesh = BulletTriangleMesh()
        land_mesh.addGeom(land_geom)
        land_shape = BulletTriangleMeshShape(land_mesh, dynamic=False)
        ocean_shape = BulletSphereShape(self.__radius)

        land_bullet_node = BulletRigidBodyNode('land collider')
        land_bullet_node.addShape(land_shape)
        bullet_world.attachRigidBody(land_bullet_node)
        land_bullet_node_path = parent_node_path.attachNewNode(
            land_bullet_node)

        ocean_bullet_node = BulletGhostNode('ocean collider')
        ocean_bullet_node.addShape(ocean_shape)
        bullet_world.attachGhost(ocean_bullet_node)
        ocean_bullet_node_path = land_bullet_node_path.attachNewNode(
            ocean_bullet_node)

        land_node = GeomNode('land')
        land_node.addGeom(land_geom)
        land_node_path = land_bullet_node_path.attachNewNode(land_node)
        ocean_node = GeomNode('ocean')
        ocean_node.addGeom(ocean_geom)
        ocean_node_path = ocean_bullet_node_path.attachNewNode(ocean_node)
        ocean_node_path.setTransparency(TransparencyAttrib.MAlpha)

        self.__node_path = land_bullet_node_path
        land_bullet_node.setPythonTag('planet', self)
        return land_bullet_node_path
    def __init__(self):
        super().__init__()
        self.set_background_color(0.1, 0.1, 0.1, 1)

        square1 = create_colored_rect(0, 0, 200, 200)
        square2 = create_colored_rect(350, 100, 200, 200, (0, 0, 1, 1))
        square3 = create_colored_rect(-640, -360, 200, 200, (0, 1, 0, 1))

        gnode = GeomNode('square')
        gnode.addGeom(square1)
        gnode.addGeom(square2)
        gnode.addGeom(square3)

        self.render.attachNewNode(gnode)

        gnode2 = GeomNode('square2')
        textured_rect = create_textured_rect(-320, 0, 200, 280)
        gnode2.addGeom(textured_rect)

        texture = self.loader.loadTexture("assets/images/PlayerShip.png")
        ship = self.render.attachNewNode(gnode2)
        ship.setTransparency(TransparencyAttrib.MAlpha)
        ship.setTexture(texture)

        lens = OrthographicLens()
        lens.setFilmSize(1280, 720)
        lens.setNearFar(-50, 50)
        self.cam.setPos(0, 0, 0)
        self.cam.node().setLens(lens)
    def __init__(self):
        ShowBase.__init__(self)

        PanditorDisableMouseFunc()
        camera.setPos(0.0, 0.0, 50.0)
        camera.lookAt(0.0)
        PanditorEnableMouseFunc()

        # 1) create GeomVertexData
        frmt = GeomVertexFormat.getV3n3cp()
        vdata = GeomVertexData('triangle', frmt, Geom.UHDynamic)

        # 2) create Writers/Rewriters (must all be created before any readers and readers are one-pass-temporary)
        vertex = GeomVertexRewriter(vdata, 'vertex')
        normal = GeomVertexRewriter(vdata, 'normal')
        color = GeomVertexRewriter(vdata, 'color')

        zUp = Vec3(0, 0, 1)
        wt = Vec4(1.0, 1.0, 1.0, 1.0)
        gr = Vec4(0.5, 0.5, 0.5, 1.0)

        # 3) write each column on the vertex data object (for speed, have a different writer for each column)
        def addPoint(x, y, z):
            vertex.addData3f(x, y, z)
            normal.addData3f(zUp)
            color.addData4f(wt)

        addPoint(0.0, 0.0, 0.0)
        addPoint(5.0, 0.0, 0.0)
        addPoint(0.0, 5.0, 0.0)
        addPoint(5.0, 5.0, 0.0)

        # 4) create a primitive and add the vertices via index (not truely associated with the actual vertex table, yet)
        tris = GeomTriangles(Geom.UHDynamic)
        tris.addVertices(0, 1, 2)
        tris.closePrimitive(
        )  # exception thrown if verts added != 3, other types inform Panda how many verts/primitive
        tris.addVertices(2, 1, 3)
        print "vdataPoints", vdata.getArrays()[0]
        # 5.1) (adding to scene) create a Geom and add primitives of like base-type i.e. triangles and triangle strips
        geom = Geom(vdata)
        geom.addPrimitive(tris)
        # 5.2) create a GeomNode to hold the Geom(s) and add the Geom(s)
        gn = GeomNode('gnode')
        gn.addGeom(geom)
        # 5.3) attache the node to the scene
        gnNodePath = render.attachNewNode(gn)

        geomPts = Geom(vdata)
        pts = GeomPoints(Geom.UHStatic)
        pts.addVertices(0, 1, 2)
        pts.closePrimitive()
        geomPts.addPrimitive(pts)
        pointsNode = GeomNode('points_node')
        pointsNode.addGeom(geomPts)
        pointsNP = render.attachNewNode(pointsNode)
        pointsNP.setZ(0.5)

        render.ls()
Example #4
0
    def __init__(self, size, translation, rotation, color, text):
        self._visible = False
        wy, wx, wz = size[0], size[1], size[2]
        format = GeomVertexFormat.getV3c4()
        vdata = GeomVertexData('cu_points', format, Geom.UHStatic)
        vdata.setNumRows(8)
        self._pos_writer = GeomVertexWriter(vdata, 'vertex')
        self._color_writer = GeomVertexWriter(vdata, 'color')
        self._pos_writer.set_row(0)
        self._color_writer.set_row(0)
        self._pos_writer.addData3f(-0.5 * wx, -0.5 * wy, 0.)
        self._pos_writer.addData3f(-0.5 * wx, -0.5 * wy, wz)
        self._pos_writer.addData3f(0.5 * wx, -0.5 * wy, wz)
        self._pos_writer.addData3f(0.5 * wx, -0.5 * wy, 0.)
        self._pos_writer.addData3f(-0.5 * wx, 0.5 * wy, 0.)
        self._pos_writer.addData3f(-0.5 * wx, 0.5 * wy, wz)
        self._pos_writer.addData3f(0.5 * wx, 0.5 * wy, wz)
        self._pos_writer.addData3f(0.5 * wx, 0.5 * wy, 0.)
        for i in range(8):
            self._color_writer.addData4f(color[0], color[1], color[2],
                                         color[3])

        lines = GeomLines(Geom.UHStatic)
        lines.addVertices(0, 1)
        lines.addVertices(1, 2)
        lines.addVertices(2, 3)
        lines.addVertices(3, 0)
        lines.addVertices(4, 5)
        lines.addVertices(5, 6)
        lines.addVertices(6, 7)
        lines.addVertices(7, 4)
        lines.addVertices(0, 4)
        lines.addVertices(1, 5)
        lines.addVertices(2, 6)
        lines.addVertices(3, 7)
        cuboid = Geom(vdata)
        cuboid.addPrimitive(lines)
        node = GeomNode('cuboid')
        node.addGeom(cuboid)
        self._node_path = NodePath(node)
        # self.title = OnscreenText(text=text, style=1, fg=(1, 1, 1, 1), pos=(-0.1, 0.1), scale=.05,
        #                           parent=self._node_path, align=TextNode.ARight)

        self._txt_node = TextNode('id')
        self._txt_node.setText(text)
        self._txt_node.setTextScale(0.2)
        self._txt_node.setCardColor(0, 0, 1, 1)
        self._txt_node.setCardAsMargin(0, 0, 0, 0)
        self._txt_node.setCardDecal(True)
        self._txt_node.set_align(2)
        text_geom = GeomNode('text')
        text_geom.addChild(self._txt_node)
        self._txt_np = NodePath(text_geom)
        self._txt_np.reparentTo(self._node_path)

        self.show()
        self.update_values(size, translation, rotation, color, text)
Example #5
0
    def build_node(
        cls,
        loader: Loader,
        build_plate_size: LVector2d,
        grid_spacing: float = _GRID_SPACING,
        name: str = "",
    ) -> NodePath:
        """Build build area NodePath.

        Parameters
        ----------
        loader : Loader
            Panda3D asset loader.
        build_plate_size : LVector2D
            Build plate size.
        grid_spacing: float
            Build plate grid spacing.
            Defaults to _GRID_SPACING.
        name : str
            Name for the returned NodePath.

        Returns
        -------
        NodePath
            Built build plate NodePath.
        """
        # X
        geom_data_x = cls._get_geom_data_grid_x(build_plate_size)
        primitive_x = cls._get_primitive_linestrips(
            line_count=int(build_plate_size.x / grid_spacing) - 1)
        geom_x = Geom(geom_data_x)
        geom_x.addPrimitive(primitive_x)

        # Y
        geom_data_y = cls._get_geom_data_grid_y(build_plate_size)
        primitive_y = cls._get_primitive_linestrips(
            line_count=int(build_plate_size.y / grid_spacing) - 1)
        geom_y = Geom(geom_data_y)
        geom_y.addPrimitive(primitive_y)

        # Assemble into one NodePath
        node_path = NodePath(top_node_name="")

        geom_node_x = GeomNode(f"{name}_x")
        geom_node_x.addGeom(geom_x)
        node_path.attachNewNode(geom_node_x)

        geom_node_y = GeomNode(f"{name}_y")
        geom_node_y.addGeom(geom_y)
        node_path.attachNewNode(geom_node_y)

        node_path_plate = cls._get_node_plate(
            loader=loader, build_plate_size=build_plate_size)
        node_path_plate.reparentTo(node_path)

        return node_path
Example #6
0
    def __init__(self, max_r):
        self.max_r = max_r
        format = GeomVertexFormat.getV3c4()
        vdata = GeomVertexData('point', format, Geom.UHDynamic)
        self._pos_writer = GeomVertexWriter(vdata, 'vertex')
        self._color_writer = GeomVertexWriter(vdata, 'color')

        line_num = 60
        vdata.setNumRows(line_num)

        angles = np.linspace(0, np.pi * 2 - np.pi * 2 / line_num, line_num)

        other_rgba = (0., 0., 0.3, 0.1)
        other2_rgba = (0.1, 0.1, 0.4, 0.4)
        axis_rgba = (0.2, 0.2, 0.5, 1.0)
        max_r = 250
        for indx, angle in enumerate(angles):
            if indx % 5 == 0:
                rgba = axis_rgba
            else:
                rgba = other_rgba
            self._pos_writer.addData3d(0, 0, 0.)
            self._color_writer.addData4f(rgba[0], rgba[1], rgba[2], rgba[3])
            self._pos_writer.addData3d(max_r * np.sin(angle),
                                       max_r * np.cos(angle), 0.)
            self._color_writer.addData4f(rgba[0], rgba[1], rgba[2], rgba[3])

        grnd_prmtv = GeomLines(Geom.UHStatic)
        grnd_prmtv.addConsecutiveVertices(0, 2 * line_num)
        grnd_prmtv.closePrimitive()
        ground_geom = Geom(vdata)
        ground_geom.addPrimitive(grnd_prmtv)
        snode = GeomNode('ground_lines')
        snode.addGeom(ground_geom)

        self.points_node = base.render.attachNewNode(snode)
        self.points_node.setTwoSided(True)

        for rad in range(int(max_r)):
            color = axis_rgba
            pp = makeArc(angleDegrees=360,
                         numSteps=160,
                         scale=rad,
                         color=color)
            tn = TextNode('dd')
            tn.setText(str(rad))
            tn.setTextScale(0.2)
            tn.setTextColor(color)
            text_geom = GeomNode('text')
            text_geom.addChild(tn)
            tp = NodePath(text_geom)
            tp.setPos((0, rad - 0.2, 0))
            tp.setHpr((0, -90, 0))
            tp.reparentTo(self.points_node)
            pp.reparentTo(self.points_node)
Example #7
0
 def __init__(self, wheel_pos, radius, heading):
     self.radius = radius
     v_f = GeomVertexFormat.getV3()
     self.vdata = GeomVertexData('skid', v_f, Geom.UHDynamic)
     self.vdata.setNumRows(1)
     self.vertex = GeomVertexWriter(self.vdata, 'vertex')
     self.prim = GeomTriangles(Geom.UHStatic)
     self.cnt = 1
     self.last_pos = wheel_pos
     geom = Geom(self.vdata)
     geom.addPrimitive(self.prim)
     node = GeomNode('gnode')
     node.addGeom(geom)
     nodePath = render.attachNewNode(node)
     nodePath.setTransparency(True)
     nodePath.setDepthOffset(1)
     self.__set_material(nodePath)
     nodePath.node().setBounds(OmniBoundingVolume())
     self.add_vertices(radius, heading)
     self.add_vertices(radius, heading)
     self.remove_seq = Sequence(
         Wait(8),
         LerpFunc(nodePath.setAlphaScale, 8, 1, 0, 'easeInOut'),
         Func(nodePath.remove_node))
     self.remove_seq.start()
Example #8
0
 def _make_fullscreen_tri(self):
     """ Creates the oversized triangle used for rendering """
     vformat = GeomVertexFormat.get_v3()
     vdata = GeomVertexData("vertices", vformat, Geom.UH_static)
     vdata.set_num_rows(3)
     vwriter = GeomVertexWriter(vdata, "vertex")
     vwriter.add_data3f(-1, 0, -1)
     vwriter.add_data3f(3, 0, -1)
     vwriter.add_data3f(-1, 0, 3)
     gtris = GeomTriangles(Geom.UH_static)
     gtris.add_next_vertices(3)
     geom = Geom(vdata)
     geom.add_primitive(gtris)
     geom_node = GeomNode("gn")
     geom_node.add_geom(geom)
     geom_node.set_final(True)
     geom_node.set_bounds(OmniBoundingVolume())
     tri = NodePath(geom_node)
     tri.set_depth_test(False)
     tri.set_depth_write(False)
     tri.set_attrib(TransparencyAttrib.make(TransparencyAttrib.M_none), 10000)
     tri.set_color(Vec4(1))
     tri.set_bin("unsorted", 10)
     tri.reparent_to(self._node)
     self._tri = tri
Example #9
0
def createColoredUnitDisk(color_vec4=Vec4(0., 0., 1., 1.), num_of_verts=10, origin_point=Vec3(0., 0., 0.), radius=1.):
    # Own Geometry
    # format = GeomVertexFormat.getV3c4t2()
    format = GeomVertexFormat.getV3c4()
    vdata = GeomVertexData("colored_circle", format, Geom.UHStatic)
    vdata.setNumRows(4)

    vertexPosWriter = GeomVertexWriter(vdata, "vertex")

    # num_of_verts = 10

    # phi = 0.
    r = radius

    # origin_point_x = 0.
    # origin_point_z = 0.
    vertexPosWriter.addData3f(origin_point[0], origin_point[1], origin_point[2])

    circle_points = math_utils.get_circle_vertices(num_of_verts=num_of_verts, radius=r)

    circle_points[:,0] += origin_point[0]
    circle_points[:,1] += origin_point[1]
    circle_points[:,2] += origin_point[2]

    _normal_vector_info = Vec3(0., 1., 0.)      # this is returned just as info about the normal vector of the generated geometry
    for p in circle_points:
        vertexPosWriter.addData3f(p[0], 0, p[1])

    # for i in range(num_of_verts):
    #     phi += 2. * np.pi / num_of_verts
    #     x = r * np.cos(phi)
    #     z = r * np.sin(phi)
    #     vertexPosWriter.addData3f(x, 0, z)

    # let's also add color to each vertex
    colorWriter = GeomVertexWriter(vdata, "color")

    colorWriter.addData4f(color_vec4)  # origin point

    for i in range(num_of_verts):
        colorWriter.addData4f(color_vec4)

    # make primitives and assign vertices to them (primitives and primitive
    # groups can be made independently from vdata, and are later assigned
    # to vdata)
    tris = GeomTrifans(Geom.UHStatic)  # the first vertex is a vertex that all triangles share

    tris.add_consecutive_vertices(0, num_of_verts+1)
    tris.addVertex(1)

    tris.closePrimitive()  # the 1st primitive is finished

    # make a Geom object to hold the primitives
    geom = Geom(vdata)
    geom.addPrimitive(tris)

    geom_node = GeomNode("colored_circle_node")
    geom_node.addGeom(geom)

    return geom_node, _normal_vector_info
Example #10
0
 def create_instance(self):
     self.vertexData = GeomVertexData('vertexData',
                                      GeomVertexFormat.getV3c4(),
                                      Geom.UHStatic)
     self.vertexWriter = GeomVertexWriter(self.vertexData, 'vertex')
     self.colorwriter = GeomVertexWriter(self.vertexData, 'color')
     for point in self.points:
         position = point.project(0,
                                  self.context.observer.camera_global_pos,
                                  self.context.observer.infinity)
         self.vertexWriter.addData3f(*position)
         self.colorwriter.addData4f(*self.color)
     self.lines = GeomLines(Geom.UHStatic)
     index = 0
     for i in range(len(self.points) - 1):
         self.lines.addVertex(index)
         self.lines.addVertex(index + 1)
         self.lines.closePrimitive()
         index += 1
     self.geom = Geom(self.vertexData)
     self.geom.addPrimitive(self.lines)
     self.node = GeomNode("boundary")
     self.node.addGeom(self.geom)
     self.instance = NodePath(self.node)
     self.instance.setRenderModeThickness(settings.boundary_thickness)
     self.instance.reparentTo(self.context.annotation)
     self.instance.setBin('background', settings.boundaries_depth)
     self.instance.set_depth_write(False)
Example #11
0
 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)
Example #12
0
    def __build_Tris(self, sphere, mode):
        vdata = GeomVertexData("Data", self.__vformat[mode], Geom.UHStatic)
        _num_rows = len(sphere.pts)

        # Vertices.
        vertices = GeomVertexWriter(vdata, "vertex")
        vertices.reserveNumRows(_num_rows)
        for pt in sphere.pts:
            vertices.addData3f(*pt)

        # Map coords.
        if mode == "mid":
            mapcoords = GeomVertexWriter(vdata, "mapcoord")
            mapcoords.reserveNumRows(_num_rows)
            for mc in sphere.coords:
                u, v = mc[:2]
                mapcoords.addData2f(u, v)

        # Tris.
        prim = GeomTriangles(Geom.UHStatic)
        prim.reserveNumVertices(len(sphere.tris))
        for tri in sphere.tris:
            prim.addVertices(*tri)
        prim.closePrimitive()

        # Geom.
        geom = Geom(vdata)
        geom.addPrimitive(prim)
        geom_node = GeomNode("geom")
        geom_node.addGeom(geom)
        geom_np = NodePath(geom_node)
        return geom_np
Example #13
0
    def __build_Star_Sphere(self, bg_stars):
        from panda3d.core import GeomVertexWriter, GeomVertexFormat, GeomVertexData
        from panda3d.core import Geom, GeomNode, GeomPoints, AmbientLight
        self.star_sphere_np.removeNode()

        # Fill GeomVertexData.
        vformat = GeomVertexFormat.getV3c4()
        vdata = GeomVertexData("Data", vformat, Geom.UHStatic)
        vertices = GeomVertexWriter(vdata, "vertex")
        colours = GeomVertexWriter(vdata, "color")
        for coords in bg_stars:
            x, y, z = coords
            vertices.addData3f(x, y, z)
            colours.addData4f(1, 1, 1, 1)

        # Render bg stars.
        bg_stars = GeomPoints(Geom.UHStatic)
        bg_stars.addNextVertices(_env.STAR_COUNT)
        bg_stars_geom = Geom(vdata)
        bg_stars_geom.addPrimitive(bg_stars)
        star_sphere = GeomNode("star_sphere")
        star_sphere.addGeom(bg_stars_geom)
        star_sphere_np = NodePath(star_sphere)

        star_sphere_np.reparentTo(self.NP)
        return star_sphere_np
Example #14
0
    def __init__(self):
        ShowBase.__init__(self)

        mesh = Mesh.create_plate(position=(0, 0),
                                 width=6,
                                 height=2,
                                 num_elements_width=6,
                                 num_elements_height=3)
        geom = mesh.get_render_mesh()

        node = GeomNode('g-node')
        node.addGeom(geom)

        node_path = self.render.attachNewNode(node)

        # noinspection PyArgumentList
        shader = Shader.load(lang=Shader.SL_GLSL,
                             vertex="../shaders/grid_shader.vert",
                             fragment="../shaders/grid_shader.frag")
        node_path.setShader(shader)
        node_path.set_shader_input('color', (0.2, 0.5, 0))

        self.camera.setPos(0, 0, 10)
        self.camera.lookAt(node_path)

        self.disableMouse()
        controller = MouseController(self.camera, self)
        controller.zoom()
Example #15
0
def empty_node(prefix, color=False):
    path = NodePath(prefix + '_path')
    node = GeomNode(prefix + '_node')
    path.attachNewNode(node)
    if color:
        path.setAttrib(ColorAttrib.makeVertex())
    return (path, node)
Example #16
0
    def draw(self):
        if self.rendered_mesh != None:
            self.reset_draw()

        format = GeomVertexFormat.getV3n3cp()
        vdata = GeomVertexData('tri', format, Geom.UHDynamic)

        vertex = GeomVertexWriter(vdata, 'vertex')
        normal = GeomVertexWriter(vdata, 'normal')
        color = GeomVertexWriter(vdata, 'color')
        v_mapping = {}

        i = 0
        for v in self.verts.values():
            vertex.addData3f(v.pos.x, v.pos.y, v.pos.z)
            normal.addData3f(v.norm.x, v.norm.y, v.norm.z)
            color.addData4f(v.color[0], v.color[1], v.color[2], v.color[3])
            v_mapping[v.ID] = i
            i += 1

        mesh = Geom(vdata)

        for f in self.faces.values():
            tri = GeomTriangles(Geom.UHDynamic)
            tri.addVertex(v_mapping[f.v1.ID])
            tri.addVertex(v_mapping[f.v2.ID])
            tri.addVertex(v_mapping[f.v3.ID])
            tri.closePrimitive()
            mesh.addPrimitive(tri)

        snode = GeomNode(self.name)
        snode.addGeom(mesh)
        self.rendered_mesh = render.attachNewNode(snode)
        self.rendered_mesh.setTwoSided(True)
Example #17
0
    def __init__(self, whl_pos, whl_radius, car_h):
        GameObject.__init__(self)
        self.radius = whl_radius
        v_f = GeomVertexFormat.getV3()
        vdata = GeomVertexData('skid', v_f, Geom.UHDynamic)
        prim = GeomTriangles(Geom.UHStatic)
        self.vtx_cnt = 1
        self.last_pos = whl_pos
        geom = Geom(vdata)
        geom.add_primitive(prim)
        self.node = GeomNode('gnode')
        self.node.add_geom(geom)
        nodepath = self.eng.gfx.root.attach_node(self.node)
        nodepath.set_transparency(True)
        nodepath.set_depth_offset(1)
        nodepath.node.set_two_sided(True)  # for self-shadowing issues
        self.__set_material(nodepath)
        nodepath.p3dnode.set_bounds(OmniBoundingVolume())
        self.add_vertices(whl_radius, car_h)
        self.add_vertices(whl_radius, car_h)

        def alpha(time, n_p):
            if not n_p.is_empty:
                n_p.node.set_shader_input('alpha', time)
            # this if seems necessary since, if there are skidmarks and you
            # exit from the race (e.g. back to the menu), then alpha is being
            # called from the interval manager even if the interval manager
            # correctly says that there are 0 intervals.

        self.remove_seq = Sequence(
            Wait(8), LerpFunc(alpha, 8, .5, 0, 'easeInOut', [nodepath]),
            Func(nodepath.remove_node))
        self.remove_seq.start()
Example #18
0
 def __init__(self, scale=10):
     axisNode = GeomNode('axis')
     axisGeom = makeAxis()
     axisNode.addGeom(axisGeom)
     axis = render.attachNewNode(axisNode)
     axis.setScale(scale, scale, scale)
     axis.setRenderModeThickness(2)
Example #19
0
    def __build_Patches(self, sphere):
        vdata = GeomVertexData("Data", self.__vformat['high'], Geom.UHStatic)
        vertices = GeomVertexWriter(vdata, "vertex")
        mapcoords = GeomVertexWriter(vdata, "mapcoord")
        texcoords = GeomVertexWriter(vdata, "texcoord")

        _num_rows = len(sphere.pts)
        vertices.reserveNumRows(_num_rows)
        mapcoords.reserveNumRows(_num_rows)
        texcoords.reserveNumRows(_num_rows)

        # Pts.
        for pt, uv, coords, in zip(sphere.pts, sphere.uvs, sphere.coords):
            vertices.addData3f(*pt)
            mapcoords.addData2f(*coords)
            texcoords.addData2f(*uv)  ## *.99+.01)

        # Patches.
        prim = GeomPatches(3, Geom.UHStatic)
        prim.reserveNumVertices(len(sphere.tris))
        for tri in sphere.tris:
            prim.addVertices(*tri)
        prim.closePrimitive()

        # Geom.
        geom = Geom(vdata)
        geom.addPrimitive(prim)
        geom_node = GeomNode("geom")
        geom_node.addGeom(geom)
        geom_np = NodePath(geom_node)
        return geom_np
Example #20
0
 def create_model(self):
     # Set up the vertex arrays
     vformat = GeomVertexFormat.get_v3c4()
     vdata = GeomVertexData("Data", vformat, Geom.UHStatic)
     vertex = GeomVertexWriter(vdata, 'vertex')
     color = GeomVertexWriter(vdata, 'color')
     geom = Geom(vdata)
     # Vertex data
     vertex.addData3f(1.5, 0, -1)
     color.addData4f(1, 0, 0, 1)
     vertex.addData3f(-1.5, 0, -1)
     color.addData4f(0, 1, 0, 1)
     vertex.addData3f(0, 0, 1)
     color.addData4f(0, 0, 1, 1)
     # Primitive
     tri = GeomTriangles(Geom.UHStatic)
     tri.add_vertex(2)
     tri.add_vertex(1)
     tri.add_vertex(0)
     tri.close_primitive()
     geom.addPrimitive(tri)
     # Create the actual node
     node = GeomNode('geom_node')
     node.addGeom(geom)
     np = NodePath(node)
     # Shader and initial shader vars
     np.set_shader(
         Shader.load(Shader.SL_GLSL, "shader/shader.vert",
                     "shader/shader.frag"))
     np.set_shader_input("time", 0.0)
     # No instancing necessary
     #np.set_instance_count(27)
     # return np
     np.reparent_to(base.render)
     self.model = np
Example #21
0
 def create_instance(self):
     self.vertexData = GeomVertexData('vertexData',
                                      GeomVertexFormat.getV3(),
                                      Geom.UHStatic)
     self.vertexWriter = GeomVertexWriter(self.vertexData, 'vertex')
     radius = 1.0
     top = LPoint3d(0, 0, radius * 1.25)
     north_pole = LPoint3d(0, 0, radius)
     south_pole = LPoint3d(0, 0, -radius)
     bottom = LPoint3d(0, 0, -radius * 1.25)
     self.vertexWriter.addData3f(*top)
     self.vertexWriter.addData3f(*north_pole)
     self.vertexWriter.addData3f(*south_pole)
     self.vertexWriter.addData3f(*bottom)
     self.lines = GeomLines(Geom.UHStatic)
     self.lines.addVertex(0)
     self.lines.addVertex(1)
     self.lines.addVertex(2)
     self.lines.addVertex(3)
     self.lines.closePrimitive()
     self.geom = Geom(self.vertexData)
     self.geom.addPrimitive(self.lines)
     self.node = GeomNode(self.body.get_ascii_name() + '-axis')
     self.node.addGeom(self.geom)
     self.instance = NodePath(self.node)
     self.instance.setRenderModeThickness(settings.axis_thickness)
     self.instance.setColor(self.parent.get_orbit_color())
     self.instance.setAntialias(AntialiasAttrib.MMultisample)
     self.instance.reparentTo(self.context.annotation)
Example #22
0
 def draw_rain_mesh(self):
     _format = GeomVertexFormat.get_v3cp()
     self.rain_vdata = GeomVertexData('rain', _format, Geom.UHDynamic)
     self.rain_vdata.setNumRows(self.n_points**2)
     vertex = GeomVertexWriter(self.rain_vdata, 'vertex')
     color = GeomVertexWriter(self.rain_vdata, 'color')
     for j in range(self.n_points):
         for i in range(self.n_points):
             # Rain Vertices
             vertex.addData3f(self.x[j][i], self.y[j][i], self.n_points)
             # Rain Colors
             color.addData4f(0.3, 0.3, 1, 0)
     # Rain Primitive
     prim = GeomPoints(Geom.UHDynamic)
     for j in range(self.n_points):
         for i in range(self.n_points):
             prim.add_vertices(j * (self.n_points) + i,
                               j * (self.n_points) + i,
                               j * (self.n_points) + i)
     geom = Geom(self.rain_vdata)
     prim.closePrimitive()
     geom.addPrimitive(prim)
     node = GeomNode('gnode')
     node.addGeom(geom)
     rain_nodePath = render.attachNewNode(node)
     rain_nodePath.setTransparency(TransparencyAttrib.MAlpha)
     rain_nodePath.setAntialias(AntialiasAttrib.MAuto)
     rain_nodePath.setRenderModeThickness(2)
     rain_nodePath.setPos(-50, -50, 0)
Example #23
0
def pg_draw_tris(pg, render):
    format = GeomVertexFormat.getV3c4()
    vdata = GeomVertexData('pgtris', format, Geom.UHStatic)
    vdata.setNumRows(len(pg.nodes))
    vertex = GeomVertexWriter(vdata, 'vertex')
    color = GeomVertexWriter(vdata, 'color')
    prim = GeomTriangles(Geom.UHStatic)

    for pt in pg.nodes:
        vertex.addData3f(pt.x, pt.y, pt.z)
        color.addData4f(random.random(), random.random(), random.random(), 1.0)

    for pt in pg.nodes:
        if len(pt.conn) > 0:
            for i, cpt in enumerate(pt.conn):
                next_cpt = pt.conn[(i + 1) % len(pt.conn)]
                prim.addVertices(pt.idx, cpt.idx, next_cpt.idx)
                print("%d - %d - %d" % (pt.idx, cpt.idx, next_cpt.idx))

    geom = Geom(vdata)
    geom.addPrimitive(prim)
    node = GeomNode('TheTris')
    node.addGeom(geom)
    nodePath = render.attachNewNode(node)
    nodePath.setPos(0, 10, 0)
Example #24
0
def gen_submesh(verts, faces, rgba=[1, 0, 0, 1]):
    """
    TODO 20201202: replace pandanode with trimesh
    :param verts: np.array([[v00, v01, v02], [v10, v11, v12], ...]
    :param faces: np.array([[ti00, ti01, ti02], [ti10, ti11, ti12], ...]
    :param color: rgba
    :return:
    author: weiwei
    date: 20171219
    """
    # gen vert normals
    vertnormals = np.zeros((len(verts), 3))
    for fc in faces:
        vert0 = verts[fc[0], :]
        vert1 = verts[fc[1], :]
        vert2 = verts[fc[2], :]
        facenormal = np.cross(vert2 - vert1, vert0 - vert1)
        vertnormals[fc[0], :] = vertnormals[fc[0]] + facenormal
        vertnormals[fc[1], :] = vertnormals[fc[1]] + facenormal
        vertnormals[fc[2], :] = vertnormals[fc[2]] + facenormal
    for i in range(0, len(vertnormals)):
        vertnormals[i, :] = vertnormals[i, :] / np.linalg.norm(
            vertnormals[i, :])
    geom = da.pandageom_from_vvnf(verts, vertnormals, faces)
    node = GeomNode('surface')
    node.addGeom(geom)
    surface_nodepath = NodePath('surface')
    surface_nodepath.attachNewNode(node)
    surface_nodepath.setColor(rgba[0], rgba[1], rgba[2], rgba[3])
    surface_nodepath.setTransparency(TransparencyAttrib.MDual)
    surface_nodepath.setTwoSided(True)
    surface_sgm = StaticGeometricModel(surface_nodepath)
    return surface_sgm
Example #25
0
def create_GeomNode_Single_Point(color_vec4=Vec4(1., 1., 1., 1.)):
    # ---- step 1: create point at (0,0,0) and close the primitive

    format = GeomVertexFormat.getV3c4()
    vdata = GeomVertexData("colored_point", format, Geom.UHStatic)
    vdata.setNumRows(4)

    # add color to each vertex
    colorWriter = GeomVertexWriter(vdata, "color")

    # add a vertex position to each vertex
    vertexPosWriter = GeomVertexWriter(vdata, "vertex")

    # just one origin point vertex, it gets transformed later
    # to it's intended position
    vertexPosWriter.addData3f(0., 0., 0.)
    colorWriter.addData4f(color_vec4)

    # build the primitive
    pointsprimitive = GeomPoints(Geom.UHStatic)
    pointsprimitive.addVertex(0)
    pointsprimitive.closePrimitive()  # this resets all the data contained in the vertexPosWriter and colorWriter

    # ----- step 3: make a GeomNode out of the Geom (to which the Primitives have been added)

    # make a Geom object to hold the primitives
    geom = Geom(vdata)
    geom.addPrimitive(pointsprimitive)

    geom_node = GeomNode("colored_point_node")
    geom_node.addGeom(geom)

    return geom_node
Example #26
0
        def makeSB(pos, hpr):

            import torus
            geom = torus.makeGeom()

            #geom = loader.loadModel('models/torus.egg') \
            #    .findAllMatches('**/+GeomNode').getPath(0).node() \
            #    .modifyGeom(0)

            geomNode = GeomNode('')
            geomNode.addGeom(geom)

            node = BulletSoftBodyNode.makeTriMesh(info, geom)
            node.linkGeom(geomNode.modifyGeom(0))

            node.generateBendingConstraints(2)
            node.getCfg().setPositionsSolverIterations(2)
            node.getCfg().setCollisionFlag(
                BulletSoftBodyConfig.CFVertexFaceSoftSoft, True)
            node.randomizeConstraints()
            node.setTotalMass(50, True)

            softNP = self.worldNP.attachNewNode(node)
            softNP.setPos(pos)
            softNP.setHpr(hpr)
            self.world.attachSoftBody(node)

            geomNP = softNP.attachNewNode(geomNode)
Example #27
0
def getFacesNode(x,y,z, color): 
    """ Returns node with 6 cube face sides """
    node_name = 'faces' + str(x+y+z)
    faces_node = GeomNode(node_name)

    # Note: it isn't particularly efficient to make every face as a separate Geom.
    # instead, it would be better to create one Geom holding all of the faces.
    # Since xyz are centers of the voxel, getting the vertices means we treat the xyz's as the origin

    x,y,z = 2*x, 2*y, 2*z
    square0 = makeSquare(x-1, y-1, z-1, x+1, y-1, z+1, color)
    square1 = makeSquare(x-1, y+1, z-1, x+1, y+1, z+1, color)
    square2 = makeSquare(x-1, y+1, z+1, x+1, y-1, z+1, color)
    square3 = makeSquare(x-1, y+1, z-1, x+1, y-1, z-1, color)
    square4 = makeSquare(x-1, y-1, z-1, x-1, y+1, z+1, color)
    square5 = makeSquare(x+1, y-1, z-1, x+1, y+1, z+1, color)

    faces_node.addGeom(square0)
    faces_node.addGeom(square1)
    faces_node.addGeom(square2)
    faces_node.addGeom(square3)
    faces_node.addGeom(square4)
    faces_node.addGeom(square5)

    return faces_node
Example #28
0
def makeSimpleGeomBuffer(array, color, geomType=GeomPoints):
    """ massively faster than the nonbuffer version """

    full = [tuple(d) for d in np.hstack((array, color))]

    fmt = GeomVertexFormat.getV3c4()

    vertexData = GeomVertexData(
        'points', fmt, Geom.UHDynamic
    )  #FIXME use the index for these too? with setPythonTag, will have to 'reserve' some
    cloudGeom = Geom(vertexData)
    cloudNode = GeomNode('just some points')

    vertexData.setNumRows(len(array))
    mem_array = vertexData.modifyArray(0)
    view = memoryview(mem_array)
    arr = np.asarray(view)
    arr[:] = full

    points = geomType(Geom.UHDynamic)
    points.addConsecutiveVertices(0, len(array))
    points.closePrimitive()

    cloudGeom.addPrimitive(points)
    cloudNode.addGeom(cloudGeom)

    return cloudNode
        def make_SB(pos, hpr):

            #use this to construct a torus geom.
            #import torus
            #geom = torus.make_geom()

            geom = (loader.load_model('models/torus.egg').find_all_matches(
                '**/+GeomNode').get_path(0).node().modify_geom(0))

            geomNode = GeomNode('')
            geomNode.add_geom(geom)

            node = BulletSoftBodyNode.make_tri_mesh(info, geom)
            node.link_geom(geomNode.modify_geom(0))

            node.generate_bending_constraints(2)
            node.get_cfg().set_positions_solver_iterations(2)
            node.get_cfg().set_collision_flag(
                BulletSoftBodyConfig.CF_vertex_face_soft_soft, True)
            node.randomize_constraints()
            node.set_total_mass(50, True)

            softNP = self.worldNP.attach_new_node(node)
            softNP.set_pos(pos)
            softNP.set_hpr(hpr)
            self.world.attach(node)

            geomNP = softNP.attach_new_node(geomNode)
Example #30
0
    def __init__(self, num=99999, its=99):
        self.num = num
        self.its = its
        self.accept("escape", sys.exit)

        #pointcloud
        #self.clouds=[]
        for i in range(its):
            cloudGeom = makePoints(
                self.num
            )  #save us the pain in this version make it the same one probably a more efficient way to do this
            self.cloudNode = GeomNode('points')
            self.cloudNode.addGeom(cloudGeom)  #ooops dont forget this!
            self.cloud = render.attachNewNode(self.cloudNode)
            #self.cloud.setPos(10,10,10)
        #for i in range(its):
        #self.clouds.append(cloudNode)

        #self.poses = np.random.randint(-1000,1000,(its,3))
        #self.cloud = None
        #self.cloud = render.attachNewNode(self.cloudNode)
        #cloud.hprInterval(1.5,Point3(360,360,360)).loop()

        #self.counter = 0
        #self.count = genLabelText('%s'%self.counter,3)
        #self.count.reparentTo(base.a2dTopLeft)
        """