Esempio n. 1
0
    def render_heightmap(self, heights, cell_size, colours=None):
        form = core.GeomVertexFormat.get_v3n3c4()

        vdata = core.GeomVertexData('terrain', form, core.Geom.UHStatic)
        vdata.setNumRows(len(heights))

        vertex = core.GeomVertexWriter(vdata, 'vertex')
        normal = core.GeomVertexWriter(vdata, 'normal')
        colour = core.GeomVertexWriter(vdata, 'color')

        for y in range(heights.shape[1]):
            for x in range(heights.shape[0]):
                vertex.addData3(x * cell_size, y * cell_size, heights[x][y])
                if not colours is None:
                    r, g, b = colours[x][y]
                    colour.addData4(r, g, b, 1)
                else:
                    colour.addData4(0.5, 0.5, 0.5, 1)
                normal.addData3(calculate_normal(heights, cell_size, x, y))

        prim = core.GeomTriangles(core.Geom.UHStatic)
        for y in range(heights.shape[1] - 1):
            for x in range(heights.shape[0] - 1):
                base = x + y * heights.shape[0]
                idx = y * heights.shape[0] + x
                prim.add_vertices(base, base + heights.shape[0] + 1,
                                  base + heights.shape[0])
                prim.add_vertices(base, base + 1, base + heights.shape[0] + 1)

        geom = core.Geom(vdata)
        geom.addPrimitive(prim)

        node = core.GeomNode('gnode')
        node.addGeom(geom)
        self.render.attachNewNode(node)
Esempio n. 2
0
def make_circle(scene: core.NodePath, position: core.Point3, radius: float,
                point_count: int):
    vertex_data = _make_vertex_data(point_count)
    position_writer = core.GeomVertexWriter(vertex_data, "vertex")
    colour_writer = core.GeomVertexWriter(vertex_data, "color")

    for index in range(point_count):
        theta = (2 * math.pi * index) / point_count
        x = math.cos(theta) * radius
        y = math.sin(theta) * radius

        position_writer.add_data3(position.x + x, position.y + y, position.z)
        colour_writer.add_data4(1, 1, 1, 1)

    primitive = core.GeomTriangles(core.Geom.UH_static)
    for index in range(1, point_count + 1):
        point_2 = (index + 1) % point_count
        point_3 = (index + 2) % point_count
        primitive.add_vertices(0, point_2, point_3)
    primitive.close_primitive()

    geometry = core.Geom(vertex_data)
    geometry.add_primitive(primitive)

    geometry_node = core.GeomNode("circle")
    geometry_node.add_geom(geometry)

    result: core.NodePath = scene.attach_new_node(geometry_node)
    result.set_two_sided(True)
    result.set_transparency(True)

    return result
Esempio n. 3
0
    def create_node(self):
        node = core.GeomNode(self.name)

        for geom in self.get_geoms():
            self.add_geom(node, geom)

        return node
Esempio n. 4
0
    def _init_terrain(self):
        vertex_data = core.GeomVertexData('Terrain',
                                          core.GeomVertexFormat.getV3n3c4(),
                                          core.Geom.UH_static)

        pos = core.GeomVertexWriter(vertex_data, 'vertex')
        nrm = core.GeomVertexWriter(vertex_data, 'normal')
        col = core.GeomVertexWriter(vertex_data, 'color')

        for i in range(self.w):
            for j in range(self.h):
                pos.addData3f(*self.positions[i, j])
                nrm.addData3f(*self.normals[i, j])
                col.addData4f(self.colors[i, j], self.colors[i, j],
                              self.colors[i, j], 1)

        triangles = core.GeomTriangles(core.Geom.UH_static)
        for i in range(self.w - 1):
            for j in range(self.h - 1):
                triangles.addVertices(i * self.h + j, i * self.h + (j + 1),
                                      (i + 1) * self.h + j)
                triangles.addVertices((i + 1) * self.h + (j + 1),
                                      (i + 1) * self.h + j,
                                      i * self.h + (j + 1))

        geom = core.Geom(vertex_data)
        geom.addPrimitive(triangles)

        geom_node = core.GeomNode('Terrain')
        geom_node.addGeom(geom)
        self.terrain_np = self.model_np.attachNewNode(geom_node)
Esempio n. 5
0
def get_widgets_node():
    format = core.GeomVertexFormat.get_v3()
    vdata = core.GeomVertexData('name', format, core.Geom.UHStatic)
    vertex = core.GeomVertexWriter(vdata, 'vertex')
    geom = core.Geom(vdata)
    node = core.GeomNode('widget_node')

    return node
Esempio n. 6
0
 def build(self):
     array = self.primitive.modifyVertices()
     fmt = array.getArrayFormat().getFormatString()
     data = struct.pack(fmt * len(self.indices), *self.indices)
     array.modifyHandle().setData(data)
     geom = core.Geom(self.master.vertexdata)
     geom.addPrimitive(self.primitive)
     gnode = core.GeomNode('{}-node'.format(self.name))
     gnode.addGeom(geom)
     return gnode
Esempio n. 7
0
def create_cylinder_segment(parent_node, delta_azimuth):

    vdata = pcore.GeomVertexData('name', pcore.GeomVertexFormat.getV3t2(),
                                 pcore.Geom.UHDynamic)

    vertex_writer = pcore.GeomVertexWriter(vdata, 'vertex')
    texcoord_writer = pcore.GeomVertexWriter(vdata, 'texcoord')

    prim_wall = pcore.GeomTristrips(pcore.Geom.UHStatic)

    unit_count = int(delta_azimuth)
    units = 360  #360
    #print unit_count
    for i in range(unit_count):

        angle1 = i / float(units) * 2 * 3.1452  #/float(parts)
        angle2 = (i + 1) / float(units) * 2 * 3.1452  #/float(parts)

        x1 = math.sin(angle1)
        y1 = math.cos(angle1)

        x2 = math.sin(angle2)
        y2 = math.cos(angle2)

        vertex_writer.addData3f(x1, y1, 1 / 2.)
        vertex_writer.addData3f(x1, y1, -1 / 2.)
        vertex_writer.addData3f(x2, y2, 1 / 2.)
        vertex_writer.addData3f(x2, y2, -1 / 2.)

        #texcoord_writer.addData2f(i/float(units),1)
        #texcoord_writer.addData2f(i/float(units),0)
        #texcoord_writer.addData2f((i+1)/float(units),1)
        #texcoord_writer.addData2f((i+1)/float(units),0)
        texcoord_writer.addData2f(i / float(unit_count), 1)
        texcoord_writer.addData2f(i / float(unit_count), 0)
        texcoord_writer.addData2f((i + 1) / float(unit_count), 1)
        texcoord_writer.addData2f((i + 1) / float(unit_count), 0)

        prim_wall.addConsecutiveVertices(i * 4, 4)
        prim_wall.closePrimitive()

    geom_wall = pcore.Geom(vdata)
    geom_wall.addPrimitive(prim_wall)

    cylinder_parts = []

    cylinder = parent_node.attachNewNode("cylinder")

    cylinder_geomnode_part = pcore.GeomNode('cylinder_part')
    cylinder_geomnode_part.addGeom(geom_wall)

    cylinder_part = cylinder.attachNewNode(cylinder_geomnode_part)
    cylinder_parts.append(cylinder_part)

    return cylinder
Esempio n. 8
0
    def reset(self):
        if self._display is not None:
            self._display_node = None

            self._display.remove_node()
            self._display = None

            self._seen.clear()

        if not self._map_scene.is_empty():
            self._display_node = core.GeomNode("target_debug")
            self._display = self._map_scene.attach_new_node(self._display_node)
            self._display.set_transparency(True)
Esempio n. 9
0
def create_cylinder_parts(parent_node, parts, units):
    vdata = pcore.GeomVertexData('name', pcore.GeomVertexFormat.getV3t2(),
                                 pcore.Geom.UHDynamic)

    vertex_writer = pcore.GeomVertexWriter(vdata, 'vertex')
    texcoord_writer = pcore.GeomVertexWriter(vdata, 'texcoord')

    prim_wall = pcore.GeomTristrips(pcore.Geom.UHStatic)

    for i in range(units):

        angle1 = i / float(units) * 2 * 3.1452 / float(parts)
        angle2 = (i + 1) / float(units) * 2 * 3.1452 / float(parts)

        x1 = math.sin(angle1)
        y1 = math.cos(angle1)

        x2 = math.sin(angle2)
        y2 = math.cos(angle2)

        vertex_writer.addData3f(x1, y1, 0.5)
        vertex_writer.addData3f(x1, y1, -0.5)
        vertex_writer.addData3f(x2, y2, 0.5)
        vertex_writer.addData3f(x2, y2, -0.5)

        texcoord_writer.addData2f(i / float(units), 1)
        texcoord_writer.addData2f(i / float(units), 0)
        texcoord_writer.addData2f((i + 1) / float(units), 1)
        texcoord_writer.addData2f((i + 1) / float(units), 0)

        prim_wall.addConsecutiveVertices(i * 4, 4)
        prim_wall.closePrimitive()

    geom_wall = pcore.Geom(vdata)
    geom_wall.addPrimitive(prim_wall)

    cylinder_parts = []

    cylinder = parent_node.attachNewNode("cylinder")

    for part in range(parts):
        cylinder_geomnode_part = pcore.GeomNode('cylinder_part %d' % part)
        cylinder_geomnode_part.addGeom(geom_wall)

        cylinder_part = cylinder.attachNewNode(cylinder_geomnode_part)
        cylinder_parts.append(cylinder_part)

    if parts > 1:
        return (cylinder, cylinder_parts)
    else:
        return cylinder
Esempio n. 10
0
    def _init_trajectory(self):
        # Create dots on ground
        self.traj_dots_np = []

        small_dot = self._create_dot_geom(1, 20)
        big_dot = self._create_dot_geom(2, 50)

        for i in range(12):
            frame_idx = 10 * (i - 6)
            geom_node = core.GeomNode('TrajPosFrame' + str(frame_idx))
            geom_node.addGeom(big_dot)
            nodepath = self.model_np.attachNewNode(geom_node)
            nodepath.set_color(0.7, 0.4, 0.4)
            nodepath.hide()
            self.traj_dots_np.append(nodepath)
            for j in range(1, 10):
                frame_idx = 10 * (i - 6) + j
                geom_node = core.GeomNode('TrajPosFrame' + str(frame_idx))
                geom_node.addGeom(small_dot)
                nodepath = self.model_np.attachNewNode(geom_node)
                nodepath.set_color(0.7, 0.6, 0.6)
                nodepath.hide()
                self.traj_dots_np.append(nodepath)

        # Create arrows
        self.traj_arrs_np = []

        arrow = self._create_arrow_geom(0.15)

        for i in range(12):
            frame_idx = 10 * (i - 6)
            geom_node = core.GeomNode('TrajDirFrame' + str(frame_idx))
            geom_node.addGeom(arrow)
            nodepath = self.model_np.attachNewNode(geom_node)
            nodepath.set_render_mode_thickness(3)
            nodepath.set_color(0.7, 0.4, 0.4)
            nodepath.hide()
            self.traj_arrs_np.append(nodepath)
Esempio n. 11
0
    def _make_fullscreen_quad(self):
        tris = p3d.GeomTristrips(p3d.GeomEnums.UH_static)
        tris.add_next_vertices(4)
        vdata = p3d.GeomVertexData('abc', p3d.GeomVertexFormat.get_empty(),
                                   p3d.GeomEnums.UH_static)

        geom = p3d.Geom(vdata)
        geom.add_primitive(tris)
        geom.set_bounds(p3d.OmniBoundingVolume())

        node = p3d.GeomNode(f'{self.name}_fullscreen_quad')
        node.add_geom(geom)

        return p3d.NodePath(node)
Esempio n. 12
0
    def __init__(self,
                 render=None,
                 sprite_map='',
                 sprite_layout=(8, 8),
                 loop=True,
                 pool_size=1024,
                 check_bounds=False,
                 scale=0.02):
        self.render = render or base.render
        self.check_bounds = check_bounds
        self.scale = scale

        tex = base.loader.load_texture(sprite_map)
        tex.set_minfilter(core.SamplerState.FT_nearest)
        tex.set_magfilter(core.SamplerState.FT_nearest)
        tex.set_wrap_u(core.SamplerState.WM_repeat if loop else core.
                       SamplerState.WM_clamp)
        tex.set_wrap_v(core.SamplerState.WM_repeat)

        self.geom_node = core.GeomNode('fireworks')
        path = self.render.attach_new_node(self.geom_node)
        path.set_render_mode_thickness(32)
        path.set_texture(tex)
        path.set_tex_gen(core.TextureStage.get_default(),
                         core.TexGenAttrib.M_point_sprite)
        path.set_antialias(core.AntialiasAttrib.M_point)
        path.set_depth_test(True)
        path.set_depth_write(True)
        path.set_z(1.0)
        path.set_transparency(core.TransparencyAttrib.M_binary)
        path.set_shader(
            core.Shader.load(core.Shader.SL_GLSL, 'assets/shaders/bullet.vert',
                             'assets/shaders/bullet.frag'))
        path.set_shader_input('sprite_layout', sprite_layout)
        self.sprite_layout = sprite_layout
        self.root = path

        self._generate_pool(pool_size)

        self.patterns = []
        self.pool_usage = core.SparseArray()
        self.clock = 0
        self.colliders = []

        self.accept('window-event', self._update_size)
        self._update_size(base.win)
Esempio n. 13
0
def make_z_grid(
    camera_collection: cameras.Cameras,
    name: str,
    thickness: float,
    segment_count: int,
    colour: core.Vec4,
):
    cache_path = f"bloom/pre_cache/vertical_{name}.bam"
    if os.path.exists(cache_path):
        return camera_collection.load_model_into_scene(cache_path)

    grid_node = core.GeomNode(name)
    grid: core.NodePath = camera_collection.scene.attach_new_node(grid_node)

    half_segment_count = int(segment_count / 2)

    cell_segments = core.LineSegs()
    cell_segments.set_thickness(thickness)
    cell_segments.set_color(colour)

    cell_segments.draw_to(0, 0, -half_segment_count)
    cell_segments.draw_to(0, 0, half_segment_count)
    cell_segments.create(grid_node)

    for z in range(segment_count):
        cell_segments = core.LineSegs()
        cell_segments.set_thickness(thickness)
        cell_segments.set_color(colour)

        offset = z - half_segment_count

        cell_segments.draw_to(-0.125, -0.125, offset)
        cell_segments.draw_to(-0.125, 0.125, offset)
        cell_segments.draw_to(0.125, 0.125, offset)
        cell_segments.draw_to(0.125, -0.125, offset)
        cell_segments.draw_to(-0.125, -0.125, offset)

        cell_segments.create(grid_node)

    grid.flatten_strong()
    grid.set_transparency(True)

    grid.write_bam_file(cache_path)

    return grid
Esempio n. 14
0
def half_screen_quad():
    vdata = p3d.GeomVertexData('half_screen_quad',
                               p3d.GeomVertexFormat.get_v3n3c4t2(),
                               p3d.Geom.UHStatic)
    vdata.set_num_rows(4)

    vertex = p3d.GeomVertexWriter(vdata, 'vertex')
    normal = p3d.GeomVertexWriter(vdata, 'normal')
    color = p3d.GeomVertexWriter(vdata, 'color')
    texcoord = p3d.GeomVertexWriter(vdata, 'texcoord')

    scale = 10

    vertex.addData3f(-scale, 5, scale)
    normal.addData3f(0, 1, 0)
    color.addData4f(0.1, 0.2, 0.3, 1.0)
    texcoord.addData2f(0.0, 0.0)

    vertex.addData3f(0, 5, scale)
    normal.addData3f(0, 1, 0)
    color.addData4f(0.1, 0.2, 0.3, 1.0)
    texcoord.addData2f(0.0, 0.1)

    vertex.addData3f(0, 5, -scale)
    normal.addData3f(0, 1, 0)
    color.addData4f(0.1, 0.2, 0.3, 1.0)
    texcoord.addData2f(0.0, 0.2)

    vertex.addData3f(-scale, 5, -scale)
    normal.addData3f(0, 1, 0)
    color.addData4f(0.1, 0.2, 0.3, 1.0)
    texcoord.addData2f(0.0, 0.3)

    prim = p3d.GeomTriangles(p3d.Geom.UHStatic)
    prim.addVertices(2, 1, 0)
    prim.addVertices(0, 3, 2)

    geom = p3d.Geom(vdata)
    geom.addPrimitive(prim)

    node = p3d.GeomNode('gnode')
    node.addGeom(geom)

    nodepath = p3d.NodePath(node)
    return nodepath
Esempio n. 15
0
    def _make(vformat, vertices, faces):
        vdata = p3d.GeomVertexData('#vdata', vformat, p3d.Geom.UHStatic)
        vdata.unclean_set_num_rows(len(vertices))
        vdata.modify_array_handle(0).set_subdata(0, len(vertices),
                                                 vertices.astype(np.float32))

        prim = p3d.GeomTriangles(p3d.Geom.UHStatic)
        prim.clear_vertices()
        for v1, v2, v3 in faces:
            prim.add_vertices(v1, v2, v3)
        prim.close_primitive()

        geom = p3d.Geom(vdata)
        geom.add_primitive(prim)

        node = p3d.GeomNode('#geom')
        node.add_geom(geom)
        return node
Esempio n. 16
0
    def __init__(
            self,
            start_sector: EditorSector,
            camera_collection: cameras.Cameras,
            clipping_debug: core.NodePath,
            sector_offset=core.Point3(0, 0, 0),
    ):
        self._start_sector = start_sector
        self._clip_buffer = numpy.array([WallBunch.ABSOLUTE_MAX_Z] *
                                        self._CLIP_WIDTH).astype("float32")
        self._camera_collection = camera_collection
        self._transformation_matrix = (
            core.Mat4.translate_mat(-sector_offset.x, -sector_offset.y, 0) *
            self._camera_collection.get_clipping_transform())
        self._visible_sectors: typing.Set[EditorSector] = set()
        self._sector_offset = sector_offset

        self._clipping_debug = clipping_debug
        if constants.PORTALS_DEBUGGING_ENABLED:
            self._inverse_transformation_matrix = core.Mat4()
            self._inverse_transformation_matrix.invert_from(
                self._transformation_matrix)

            self._clip_view: core.NodePath = self._clipping_debug.attach_new_node(
                "clip_view")
            self._clip_view.set_transparency(True)
            self._clip_view.set_bin("fixed", constants.FRONT_MOST)

            self._clip_card_maker = core.CardMaker("clip_view")
            self._clip_buffer_colours = numpy.array(
                [[0, 0, 0]] * self._CLIP_WIDTH).astype("float32")

            self._debug_colour_index = 0
            self._debug_geometry_node = core.GeomNode("clipper")
            self._debug_geometry: core.NodePath = self._clipping_debug.attach_new_node(
                self._debug_geometry_node)
            self._debug_geometry.set_depth_write(False)
            self._debug_geometry.set_depth_test(False)
            self._debug_geometry.set_bin("fixed", constants.FRONT_MOST)
            self._debug_geometry.set_transparency(True)

            inverse_projection = core.Mat4().invert_from(
                self._transformation_matrix)
Esempio n. 17
0
def make_arc(
    scene: core.NodePath,
    position: core.Point3,
    radius: float,
    theta_degrees: float,
    point_count: int,
):
    theta_radians = math.radians(theta_degrees)
    vertex_data = _make_vertex_data(point_count + 1)
    position_writer = core.GeomVertexWriter(vertex_data, "vertex")
    colour_writer = core.GeomVertexWriter(vertex_data, "color")

    position_writer.add_data3(position.x, position.y, position.z)
    colour_writer.add_data4(1, 1, 1, 1)

    for index in range(point_count):
        theta = (theta_radians * index) / (point_count - 1)
        x = math.cos(theta) * radius
        y = math.sin(theta) * radius

        position_writer.add_data3(position.x + x, position.y + y, position.z)
        colour_writer.add_data4(1, 1, 1, 1)

    primitive = core.GeomTriangles(core.Geom.UH_static)
    total_point_count = point_count + 1
    for index in range(point_count):
        point_2 = (index + 1) % total_point_count
        point_3 = (index + 2) % total_point_count
        primitive.add_vertices(0, point_2, point_3)
    primitive.close_primitive()

    geometry = core.Geom(vertex_data)
    geometry.add_primitive(primitive)

    geometry_node = core.GeomNode("arc")
    geometry_node.add_geom(geometry)

    result: core.NodePath = scene.attach_new_node(geometry_node)
    result.set_two_sided(True)
    result.set_transparency(True)

    return result
Esempio n. 18
0
def get_f_plane_node(v_matrix, list_x, list_y):
    format = core.GeomVertexFormat.get_v3c4()
    vdata = core.GeomVertexData('name', format, core.Geom.UHStatic)
    vertex = core.GeomVertexWriter(vdata, 'vertex')
    color = core.GeomVertexWriter(vdata, 'color')
    geom = core.Geom(vdata)
    node = core.GeomNode('f_node')

    num_vertices = 0
    for row in v_matrix:
        num_vertices += len(row)
    # vertices in f_plane + 3 axes
    vdata.setNumRows(num_vertices + 6)

    add_vertices(v_matrix, vertex, color)
    add_lines(list_x, geom)
    add_lines(list_y, geom)
    add_axes(num_vertices, vertex, color, geom)

    node.addGeom(geom)

    return node
Esempio n. 19
0
def make_grid(
    camera_collection: cameras.Cameras,
    name: str,
    thickness: float,
    line_count: int,
    colour: core.Vec4,
):
    cache_path = f"bloom/pre_cache/{name}.bam"
    if os.path.exists(cache_path):
        return camera_collection.load_model_into_scene(cache_path)

    grid_node = core.GeomNode(name)
    grid: core.NodePath = camera_collection.scene.attach_new_node(grid_node)

    half_line_count = int(line_count / 2)
    for x in range(line_count):
        for y in range(line_count):
            cell_segments = core.LineSegs()
            cell_segments.set_thickness(thickness)
            cell_segments.set_color(colour)

            offset_x = x - half_line_count
            offset_y = y - half_line_count

            cell_segments.draw_to(offset_x, offset_y, 0)
            cell_segments.draw_to(offset_x, offset_y + 1, 0)
            cell_segments.draw_to(offset_x + 1, offset_y + 1, 0)
            cell_segments.draw_to(offset_x + 1, offset_y, 0)
            cell_segments.draw_to(offset_x, offset_y, 0)

            cell_segments.create(grid_node)

    grid.flatten_strong()
    grid.set_transparency(True)

    grid.write_bam_file(cache_path)

    return grid
Esempio n. 20
0
        def cb_update_draw_calls(cbdata):
            for np in self.temp_nps:
                np.remove_node()
            self.temp_nps = []

            tex = self.draw_manager._indirect_buffer
            gsg = self.win.get_gsg()
            if self.graphics_engine.extract_texture_data(tex, gsg):
                tex_view = memoryview(tex.get_ram_image()).cast('i')
                for call_idx in range(tex.get_x_size()):
                    i = call_idx * 4
                    primcount = tex_view[i + 1]
                    first = tex_view[i + 2]

                    prims = p3d.GeomPoints(p3d.GeomEnums.UH_dynamic)
                    prims.add_next_vertices(primcount)
                    geom = p3d.Geom(vdata)
                    geom.add_primitive(prims)
                    geom.set_bounds(p3d.OmniBoundingVolume())
                    node = p3d.GeomNode('Draw Call {}'.format(call_idx))
                    node.add_geom(geom)
                    path = p3d.NodePath(node)
                    path.set_bin('fixed', 50)
                    path.set_depth_test(False)
                    path.set_depth_write(False)
                    path.set_shader(resolve_shader)
                    path.set_shader_input('first', first)
                    window_size = p3d.LVector2i(win_width, win_height)
                    path.set_shader_input('window_size', window_size)
                    path.set_shader_input('vertex_cache',
                                          self.mesh_cache.vert_texture)
                    path.set_shader_input('index_cache',
                                          self.mesh_cache.index_texture)
                    path.set_shader_input('intersections', self.int_texture)
                    self.material_cache.bind(path)
                    path.reparent_to(self.render)
                    self.temp_nps.append(path)
            cbdata.upcall()
Esempio n. 21
0
def render_color_pixel(region, state, vertex_color=None):
    """Renders a fragment using the specified render settings, and returns the
    resulting color value."""

    # Skip auto-shader tests if we don't support Cg shaders.
    if not region.window.gsg.supports_basic_shaders:
        sattr = state.get_attrib(core.ShaderAttrib)
        if sattr and sattr.auto_shader():
            pytest.skip("Cannot test auto-shader without Cg shader support")

    # Set up the scene with a blank card rendering at specified distance.
    scene = core.NodePath("root")
    scene.set_attrib(core.DepthTestAttrib.make(core.RenderAttrib.M_always))

    camera = scene.attach_new_node(core.Camera("camera"))
    camera.node().get_lens(0).set_near_far(1, 3)
    camera.node().set_cull_bounds(core.OmniBoundingVolume())

    if vertex_color is not None:
        format = core.GeomVertexFormat.get_v3cp()
    else:
        format = core.GeomVertexFormat.get_v3()

    vdata = core.GeomVertexData("card", format, core.Geom.UH_static)
    vdata.unclean_set_num_rows(4)

    vertex = core.GeomVertexWriter(vdata, "vertex")
    vertex.set_data3(core.Vec3.rfu(-1, 0, 1))
    vertex.set_data3(core.Vec3.rfu(-1, 0, -1))
    vertex.set_data3(core.Vec3.rfu(1, 0, 1))
    vertex.set_data3(core.Vec3.rfu(1, 0, -1))

    if vertex_color is not None:
        color = core.GeomVertexWriter(vdata, "color")
        color.set_data4(vertex_color)
        color.set_data4(vertex_color)
        color.set_data4(vertex_color)
        color.set_data4(vertex_color)

    strip = core.GeomTristrips(core.Geom.UH_static)
    strip.set_shade_model(core.Geom.SM_uniform)
    strip.add_next_vertices(4)
    strip.close_primitive()

    geom = core.Geom(vdata)
    geom.add_primitive(strip)

    gnode = core.GeomNode("card")
    gnode.add_geom(geom, state)
    card = scene.attach_new_node(gnode)
    card.set_pos(0, 2, 0)
    card.set_scale(60)

    region.active = True
    region.camera = camera

    color_texture = core.Texture("color")
    region.window.add_render_texture(color_texture,
                                     core.GraphicsOutput.RTM_copy_ram,
                                     core.GraphicsOutput.RTP_color)

    region.window.engine.render_frame()
    region.window.clear_render_textures()

    col = core.LColor()
    color_texture.peek().lookup(col, 0.5, 0.5)
    return col
Esempio n. 22
0
def create_sphere(parent_node, units):

    vdata = pcore.GeomVertexData('name', pcore.GeomVertexFormat.getV3t2(),
                                 pcore.Geom.UHDynamic)

    vertex_writer = pcore.GeomVertexWriter(vdata, 'vertex')
    texcoord_writer = pcore.GeomVertexWriter(vdata, 'texcoord')

    prim_wall = pcore.GeomTriangles(pcore.Geom.UHStatic)

    vertex_count = 0
    for i in range(units):

        phi1 = i / float(units) * 2 * 3.1452
        phi2 = (i + 1) / float(units) * 2 * 3.1452

        for j in range(int(np.floor(units / 2))):

            theta1 = j / float(units / 2) * 1 * 3.1452
            theta2 = (j + 1) / float(units / 2) * 1 * 3.1452

            x1 = math.cos(phi1) * math.sin(theta1)
            y1 = math.sin(phi1) * math.sin(theta1)
            z1 = math.cos(theta1)

            x2 = math.cos(phi2) * math.sin(theta1)
            y2 = math.sin(phi2) * math.sin(theta1)
            z2 = math.cos(theta1)

            x3 = math.cos(phi1) * math.sin(theta2)
            y3 = math.sin(phi1) * math.sin(theta2)
            z3 = math.cos(theta2)

            x4 = math.cos(phi2) * math.sin(theta2)
            y4 = math.sin(phi2) * math.sin(theta2)
            z4 = math.cos(theta2)

            vertex_writer.addData3f(x1, y1, z1)
            vertex_writer.addData3f(x2, y2, z2)
            vertex_writer.addData3f(x3, y3, z3)

            texcoord_writer.addData2f(
                math.sin(theta1) * math.cos(phi1),
                math.sin(theta1) * math.sin(phi1))
            texcoord_writer.addData2f(
                math.sin(theta1) * math.cos(phi2),
                math.sin(theta1) * math.sin(phi2))
            texcoord_writer.addData2f(
                math.sin(theta2) * math.cos(phi1),
                math.sin(theta2) * math.sin(phi1))

            vertex_count = vertex_count + 3

            prim_wall.addConsecutiveVertices(vertex_count - 3, 3)
            prim_wall.closePrimitive()

            vertex_writer.addData3f(x2, y2, z2)
            vertex_writer.addData3f(x3, y3, z3)
            vertex_writer.addData3f(x4, y4, z4)

            texcoord_writer.addData2f(
                math.sin(theta1) * math.cos(phi2),
                math.sin(theta1) * math.sin(phi2))
            texcoord_writer.addData2f(
                math.sin(theta2) * math.cos(phi1),
                math.sin(theta2) * math.sin(phi1))
            texcoord_writer.addData2f(
                math.sin(theta2) * math.cos(phi2),
                math.sin(theta2) * math.sin(phi2))

            vertex_count = vertex_count + 3

            prim_wall.addConsecutiveVertices(vertex_count - 3, 3)
            prim_wall.closePrimitive()

    geom_wall = pcore.Geom(vdata)
    geom_wall.addPrimitive(prim_wall)

    sphere = parent_node.attachNewNode("sphere")

    sphere_geomnode = pcore.GeomNode("sphere")
    sphere_geomnode.addGeom(geom_wall)

    sphere_model = sphere.attachNewNode(sphere_geomnode)

    return (sphere, sphere_model)
Esempio n. 23
0
    def __init__(self, models):
        ShowBase.ShowBase.__init__(self)

        self.models = models

        unique_meshes = set(m.mesh for m in models)
        mesh2nodepath = {}
        for mesh in unique_meshes:
            scene_members = pcore.getSceneMembers(mesh)

            rotateNode = p3d.GeomNode("rotater")
            rotatePath = p3d.NodePath(rotateNode)
            matrix = numpy.identity(4)
            if mesh.assetInfo.upaxis == collada.asset.UP_AXIS.X_UP:
                r = collada.scene.RotateTransform(0, 1, 0, 90)
                matrix = r.matrix
            elif mesh.assetInfo.upaxis == collada.asset.UP_AXIS.Y_UP:
                r = collada.scene.RotateTransform(1, 0, 0, 90)
                matrix = r.matrix
            rotatePath.setMat(p3d.Mat4(*matrix.T.flatten().tolist()))

            rbc = p3d.RigidBodyCombiner('combiner')
            rbcPath = rotatePath.attachNewNode(rbc)

            for geom, renderstate, mat4 in scene_members:
                node = p3d.GeomNode("primitive")
                node.addGeom(geom)
                if renderstate is not None:
                    node.setGeomState(0, renderstate)
                geomPath = rbcPath.attachNewNode(node)
                geomPath.setMat(mat4)

            rbc.collect()

            mesh2nodepath[mesh] = centerAndScale(
                rotatePath, print_bounds.getBoundsInfo(mesh))

        scenepath = render.attachNewNode("scene")
        for model in self.models:
            np = mesh2nodepath[model.mesh]
            instance = scenepath.attachNewNode("model")
            np.instanceTo(instance)
            instance.setPos(model.x, model.y, model.z)
            instance.setScale(model.scale, model.scale, model.scale)
            q = p3d.Quat()
            q.setI(model.orient_x)
            q.setJ(model.orient_y)
            q.setK(model.orient_z)
            q.setR(model.orient_w)
            instance.setQuat(q)

        base.camLens.setFar(sys.maxint)
        base.camLens.setNear(8.0)

        pcore.attachLights(render)

        render.setShaderAuto()
        render.setTransparency(p3d.TransparencyAttrib.MDual, 1)
        render.setAntialias(p3d.AntialiasAttrib.MAuto)

        controls.KeyboardMovement()
        controls.ButtonUtils(scenepath)
        controls.MouseDrag(scenepath)
        controls.MouseCamera()
        controls.MouseScaleZoom(scenepath)
Esempio n. 24
0
    def drawLine(self, x1, y1, z1, x2, y2, z2):

        # axis
        vdata_line = pcore.GeomVertexData('vdata_line',
                                          pcore.GeomVertexFormat.getV3(),
                                          pcore.Geom.UHDynamic)
        vertex_writer = pcore.GeomVertexWriter(vdata_line, 'vertex')

        prim_line = pcore.GeomLines(pcore.Geom.UHStatic)

        vertex_writer.addData3f(x1, y1, z1)
        vertex_writer.addData3f(x2, y2, z2)

        prim_line.addConsecutiveVertices(0, 2)
        prim_line.closePrimitive()

        geom_line = pcore.Geom(vdata_line)
        geom_line.addPrimitive(prim_line)

        line = self.cosy.attachNewNode("line")

        line_geomnode = pcore.GeomNode("line")
        line_geomnode.addGeom(geom_line)

        line_model = line.attachNewNode(line_geomnode)

        line.setRenderModeThickness(2)

        # points
        length = math.sqrt((x2 - x1)**2 + (y2 - y1)**2 + (z2 - z1)**2)
        u1 = (x2 - x1) / length
        u2 = (y2 - y1) / length
        u3 = (z2 - z1) / length

        vdata_points = pcore.GeomVertexData('vdata_points',
                                            pcore.GeomVertexFormat.getV3(),
                                            pcore.Geom.UHDynamic)
        point_writer = pcore.GeomVertexWriter(vdata_points, 'vertex')
        prim_points = pcore.GeomPoints(pcore.Geom.UHStatic)

        for i in range(int(length)):
            point_writer.addData3f(i * u1, i * u2, i * u3)
            prim_points.addConsecutiveVertices(i, 1)
            prim_points.closePrimitive()

        #prim_points.addConsecutiveVertices(0, int(length))
        #prim_points.closePrimitive()

        geom_points = pcore.Geom(vdata_points)
        geom_points.addPrimitive(prim_points)

        points = self.cosy.attachNewNode("points")

        points_geomnode = pcore.GeomNode("points")
        points_geomnode.addGeom(geom_points)

        points_model = points.attachNewNode(points_geomnode)

        points.setRenderModeThickness(3)

        return (line, line_model, points, points_model)
Esempio n. 25
0
 def node(self):
     geom = core.Geom(self._vdata)
     geom.add_primitive(self._prim)
     node = core.GeomNode(self._name)
     node.add_geom(geom)
     return node