예제 #1
0
    def __init__(self, logcsv):
        ShowBase.__init__(self)
        self.logcsv = logcsv
        self.log_count = 0
        self.log_time_offset = 0
        self.log_time = 0

        # Add the spinCameraTask procedure to the task manager.
        self.taskMgr.add(self.spinCameraTask, "SpinCameraTask")
        self.taskMgr.add(self.getSerialDataTask, "GetSerialDataTask")

        # Load and transform the panda actor.
        self.pandaActor = Actor("models/panda-model",
                                {"walk": "models/panda-walk4"})
        self.pandaActor.setScale(0.005, 0.005, 0.005)

        self.pandaActor.reparentTo(self.render)
        # Loop its animation.
        self.pandaActor.loop("walk")

        node_x, node_y, node_z = self.createAccelNodes(1, 1, 1)

        self.np_x = p3d.NodePath(node_x)
        self.np_y = p3d.NodePath(node_y)
        self.np_z = p3d.NodePath(node_z)

        self.np_x.reparentTo(self.render)
        self.np_y.reparentTo(self.render)
        self.np_z.reparentTo(self.render)
예제 #2
0
    def getSerialDataTask(self, task):
        quat, accel, gyro = get_data_via_serial()
        if not quat or not accel or not gyro:
            return Task.cont

        if self.log_time_offset == 0:
            self.log_time_offset = time.time()
        t = time.time() - self.log_time_offset

        self.logcsv.writerow([(t - self.log_time) * 1000, self.log_count] +
                             quat + accel + gyro)
        self.log_count += 1
        self.log_time = t

        if quat:
            self.pandaActor.setQuat(
                p3d.LQuaternionf(quat[0], quat[1], quat[2], quat[3]))
        if accel:
            self.np_x.removeNode()
            self.np_y.removeNode()
            self.np_z.removeNode()

            node_x, node_y, node_z = self.createAccelNodes(
                accel[0] * 10, accel[1] * 10, accel[2] * 10)

            self.np_x = p3d.NodePath(node_x)
            self.np_y = p3d.NodePath(node_y)
            self.np_z = p3d.NodePath(node_z)

            self.np_x.reparentTo(self.render)
            self.np_y.reparentTo(self.render)
            self.np_z.reparentTo(self.render)

        return Task.cont
예제 #3
0
        def process_tile(x, y):
            tile = self._bsp[y][x]

            if tile != '.':
                tilenp = self._tile_root.attach_new_node('TileNode')
                tile_model.instance_to(tilenp)
                tile_pos = p3d.LVector3(x - sizex / 2.0, y - sizey / 2.0,
                                        -random.random() * 0.1)
                tilenp.set_pos(tile_pos)

                if tile == '*':
                    # Player start
                    self.player_start.x = tile_pos.x
                    self.player_start.y = tile_pos.y
                elif tile == '&':
                    # Exit
                    self.exit_loc.x = tile_pos.x
                    self.exit_loc.y = tile_pos.y

                    exitnp = p3d.NodePath('Exit')
                    tele_model.instance_to(exitnp)
                    exitnp.set_pos(tile_pos + p3d.LVector3(0, 0, 1))
                    exitnp.reparent_to(self.model_root)
                elif tile == '$':
                    # Monster spawn
                    spawnnp = p3d.NodePath('Spawn')
                    spawn_model.instance_to(spawnnp)
                    spawnnp.set_pos(tile_pos + p3d.LVector3(0, 0, 1))
                    spawnnp.set_h(180)
                    spawnnp.reparent_to(self.model_root)
                    self.spawners.append(spawnnp)
                elif tile.isdigit():
                    # Teleporter
                    telenp = self.model_root.attach_new_node('Teleporter')
                    tele_model.instance_to(telenp)
                    telenp.set_pos(tile_pos + p3d.LVector3(0, 0, 1))

                    if tile not in self._telemap:
                        self._telemap[tile] = [(x, y)]
                    else:
                        self._telemap[tile].append((x, y))

                        # This is the second teleporter we found for this pair so add a link
                        tlnp = self.model_root.attach_new_node(
                            'TeleporterLink')
                        telelink_model.instance_to(tlnp)
                        tlnp.set_pos(tile_pos + p3d.LVector3(0, 0, 1))

                        teleloc = self._tile_to_world(
                            *self._get_tele_loc_from_tile(x, y))
                        tovec = p3d.LVector3(teleloc, tlnp.get_z())
                        linkvec = tovec - tlnp.get_pos()

                        tlnp.set_scale(1, linkvec.length(), 1)
                        tlnp.look_at(tovec)
예제 #4
0
    def init_components(self, components):
        for comp in components[pcomps.NodePathComponent]:
            comp.nodepath = p3d.NodePath(p3d.PandaNode(comp.name))
            if comp.parent is not None:
                comp.nodepath.reparent_to(comp.parent)

        for comp in components[pcomps.StaticMeshComponent]:
            nodepath = self.get_nodepath(comp)
            comp.model = p3d.NodePath(p3d.Loader().get_global_ptr().load_sync(
                comp.modelpath))
            comp.model.reparent_to(nodepath)
예제 #5
0
    def __init__(self):
        super().__init__()

        self.assetlib = gestalt.assetlibrary.AssetLibrary()
        self.camera = None

        # Viewport Widgets
        self.viewport_widgets = p3d.NodePath('Viewport Widgets')
        self.floorplane = gestalt.floorplane.FloorPlane(scale=1_000)
        self.floorplane.nodepath.reparent_to(self.viewport_widgets)

        # Scene
        self.scene_root = p3d.NodePath('Scene Root')
예제 #6
0
def three_rings():
    node_path = core.NodePath('three_rings')
    o1 = obelisk((1.5, 0.8))
    o2 = obelisk((1.5, 0.8))
    o1.reparent_to(node_path)
    o2.reparent_to(node_path)
    o1.set_pos(common.TR_O1_OFFSET)
    o2.set_pos(common.TR_O2_OFFSET)
    random.shuffle(common.TR_COLORS)
    rings = []
    symbol_cards = []
    for r, h, c in zip(common.TR_RADII, common.TR_HEIGHTS, common.TR_COLORS):
        rings.append(
            node_path.attach_new_node(
                sg.cone(origin=core.Vec3(0),
                        direction=core.Vec3.up(),
                        radius=r,
                        polygon=common.TR_POLYGON,
                        length=h,
                        color=c,
                        nac=False)))
        symbol_cards.append([])
        for i in range(6):
            r_node = rings[-1].attach_new_node('rot')
            c = core.CardMaker(f'symbol {len(rings)}/{i}')
            c.set_frame(core.Vec4(-1, 1, -1, 1))
            symbol_cards[-1].append(r_node.attach_new_node(c.generate()))
            r_node.set_h(i * 60)
            r_node.set_transparency(core.TransparencyAttrib.M_alpha)
            r_node.set_alpha_scale(common.TR_SYM_ALPHA)
            symbol_cards[-1][-1].set_y(r - 0.5)
            symbol_cards[-1][-1].set_z(h)
            symbol_cards[-1][-1].set_billboard_axis()

    return node_path, rings, symbol_cards
예제 #7
0
def obelisk(r=(2.5, 1.8)):
    node_path = core.NodePath('obelisk')
    base = node_path.attach_new_node(
        sg.cone(origin=core.Vec3(0),
                direction=core.Vec3.up(),
                radius=r,
                polygon=4,
                length=15.0,
                smooth=False,
                capsule=False,
                origin_offset=0,
                color=core.Vec4(core.Vec3(0.2), 1),
                nac=False))
    top = node_path.attach_new_node(
        sg.cone(origin=core.Vec3(0),
                direction=core.Vec3.up(),
                radius=(r[1], 0),
                polygon=4,
                length=1.5,
                smooth=False,
                capsule=False,
                origin_offset=0,
                color=core.Vec4(core.Vec3(0.2), 1),
                nac=False))
    top.set_z(15)
    # mat = core.Material()
    # mat.set_emission(core.Vec4(.35, 1.0, 0.52, 0.1))
    # mat.set_shininess(5.0)
    # node_path.set_material(mat)
    return node_path
예제 #8
0
def test_component_handling():
    baseitem = DirectGuiBase()
    testoptiondefs = (('test-1', 0, None), )
    baseitem.defineoptions({}, testoptiondefs)

    assert len(baseitem.components()) == 0

    baseitem.createcomponent(
        'componentName',  # componentName
        (),  # componentAliases
        'componentGroup',  # componentGroup
        OnscreenText,  # widgetClass
        (),  # *widgetArgs
        text='Test',  # **kw
        parent=core.NodePath())

    # check if we have exactly one component now
    assert len(baseitem.components()) == 1
    # check if we have a component named like the one we just created
    assert baseitem.hascomponent('componentName')

    # get our new component
    component = baseitem.component('componentName')
    # check some of its values
    assert component.text == 'Test'

    # destroy our recently created component
    baseitem.destroycomponent('componentName')
    # check if it really is gone
    assert baseitem.hascomponent('componentName') == False
예제 #9
0
def light_attrib():
    light = core.AmbientLight('amb')
    light.color = (1, 1, 1, 1)
    light_attrib = core.LightAttrib.make()
    light_attrib = light_attrib.add_on_light(core.NodePath(light))

    return light_attrib
예제 #10
0
    def __init__(self, room):
        self.root = core.NodePath('Room')
        self.room_model = room
        self.room_model.reparent_to(self.root)
        self.name = room.name

        self.doors = [i for i in self.room_model.find_all_matches('**/door*')]
        self.portals = [Portal(self, i) for i in self.doors]

        for i in self.doors:
            i.set_transparency(core.TransparencyAttrib.M_alpha)
            i.set_alpha_scale(0.0)
            i.set_color(core.Vec4(0))
            for np in i.find_all_matches('**/+GeomNode'):
                geom_node = np.node()
                process_geom_node(geom_node)

        portal_vert_str = load_shader_str('portal.vert')
        portal_frag_str = load_shader_str('portal_screenspace.frag')
        portalshader = core.Shader.make(
            core.Shader.SL_GLSL,
            vertex=portal_vert_str,
            fragment=portal_frag_str,
        )
        for i in self.doors:
            i.set_shader(portalshader)
        self._active = False
        self.room_model.node().set_bounds(core.OmniBoundingVolume())
        self.room_model.node().set_final(True)

        for i in self.room_model.find_all_matches('**/Sun*/Sun*'):
            try:
                self.root.set_light(i)
            except AssertionError:
                pass
예제 #11
0
def test_glsl_mat4(gsg):
    param1 = core.LMatrix4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)

    param2 = core.NodePath("param2")
    param2.set_mat(core.LMatrix4(
        17, 18, 19, 20,
        21, 22, 23, 24,
        25, 26, 27, 28,
        29, 30, 31, 32))

    preamble = """
    uniform mat4 param1;
    uniform mat4 param2;
    """
    code = """
    assert(param1[0] == vec4(1, 2, 3, 4));
    assert(param1[1] == vec4(5, 6, 7, 8));
    assert(param1[2] == vec4(9, 10, 11, 12));
    assert(param1[3] == vec4(13, 14, 15, 16));
    assert(param2[0] == vec4(17, 18, 19, 20));
    assert(param2[1] == vec4(21, 22, 23, 24));
    assert(param2[2] == vec4(25, 26, 27, 28));
    assert(param2[3] == vec4(29, 30, 31, 32));
    """
    run_glsl_test(gsg, code, preamble, {'param1': param1, 'param2': param2})
예제 #12
0
def generate(parent=None, texture=None, foreground=False):
    bgnp = p3d.NodePath(p3d.CardMaker('bgimg').generate())
    bgnp.set_shader(p3d.Shader.make(p3d.Shader.SL_GLSL, _BG_VERT, _BG_FRAG))
    bgnp.set_shader_input('exposure_inv', 1.0 / base.render_pipeline.exposure)
    bgnp.set_bin('fixed' if foreground else 'background', 0)
    bgnp.set_depth_test(False)
    bgnp.set_depth_write(False)
    bgnp.node().set_bounds(p3d.OmniBoundingVolume())
    bgnp.node().set_final(True)

    if parent is not None:
        bgnp.reparent_to(parent)

    if texture is not None:
        suffix = 'fg' if foreground else 'bg'
        tex = base.loader.load_texture(f'backgrounds/{texture}{suffix}.png')
        if tex.num_components == 4:
            bgnp.set_transparency(p3d.TransparencyAttrib.M_alpha)
            tex.set_format(p3d.Texture.F_srgb_alpha)
        else:
            tex.set_format(p3d.Texture.F_srgb)
    else:
        tex = p3d.Texture()
    bgnp.set_shader_input('tex', tex)

    return bgnp
예제 #13
0
    def __init__(self, *, scale=10, grid_color=None):
        self.scale = scale

        if grid_color is None:
            grid_color = p3d.LColor(1, 1, 1, 0.8)

        # Create a plane
        cardmaker = p3d.CardMaker('Floor Plane')
        geom = cardmaker.generate()
        geomnp = p3d.NodePath(geom)

        # Transform the plane
        geomnp.set_scale(scale)
        geomnp.set_p(-90)
        half_scale = scale / 2
        geomnp.set_x(-half_scale)
        geomnp.set_y(-half_scale)

        # Push transforms to the geometry
        geomnp.flatten_strong()

        # Add a shader to draw grid lines
        geomnp.set_transparency(p3d.TransparencyAttrib.M_alpha)
        shader = p3d.Shader.make(p3d.Shader.SL_GLSL, FP_VERT, FP_FRAG)
        geomnp.set_shader(shader)
        geomnp.set_shader_input('grid_color', grid_color)

        self.nodepath = geomnp
예제 #14
0
    def __init__(self, refNode, length, key):
        self.cosy = pcore.NodePath('cosy')
        self.cosy_visible = False
        self.refNode = refNode
        self.length = length

        #for i in range(0,51):
        #x_axis = self.printText("X", "|", (1,0,0)).setPos(i,0,0)  # note that "X" is the name of the TextNode, not its content.
        ##Also note that we are going up in increments of 1.
        #for i in range(0,51):
        #y_axis = self.printText("Y", "|", (0,1,0)).setPos(0,i,0)
        #for i in range(-50,51):
        #z_axis = self.printText("Z", "-", (0,0,1)).setPos(0,0,i)

        (self.x_axis, _, self.x_axis_points,
         _) = self.drawLine(0, 0, 0, self.length, 0, 0)
        self.x_axis.setColor(1, 0, 0, 1)

        (self.y_axis, _, self.y_axis_points,
         _) = self.drawLine(0, 0, 0, 0, self.length, 0)
        self.y_axis.setColor(0, 1, 0, 1)

        (self.z_axis, _, self.z_axis_points,
         _) = self.drawLine(0, 0, 0, 0, 0, self.length)
        self.z_axis.setColor(0, 0, 1, 1)

        x_label = self.printText("XL", "X",
                                 (0, 0, 0)).setPos(self.length / 3., 0, 0)
        y_label = self.printText("YL", "Y",
                                 (0, 0, 0)).setPos(0, self.length / 3., 0.5)
        z_label = self.printText("YL", "Z",
                                 (0, 0, 0)).setPos(0, 0, self.length / 3.)

        self.accept(key, self.switch_on_off)
예제 #15
0
def optimize_bam(path):
    path = core.Filename.from_os_specific(path)
    loader = core.Loader.get_global_ptr()
    node = loader.load_sync(path)
    model = core.NodePath(node)

    print("Before:")
    analyze_node(node)

    any_changed = False

    for child in model.find_all_matches('**/+GeomNode'):
        gnode = child.node()
        for i in range(gnode.get_num_geoms()):
            if optimize_geom(gnode, i):
                any_changed = True

    for tex in model.find_all_textures():
        if tex.name and not tex.filename:
            rel_path = 'layers/' + tex.name + '.png'
            dir = core.Filename(path.get_dirname())
            fn = core.Filename(dir, rel_path)
            if tex.write(fn):
                print(f"{tex.name}: wrote to {fn}")
                tex.filename = 'assets/' + dir.get_basename() + '/' + rel_path
                tex.fullpath = fn
            any_changed = True

    if any_changed:
        model.write_bam_file(path)

        print("After:")
        analyze_node(node)
    else:
        print("File is already optimized, no changes needed.")
예제 #16
0
def manager3d():
    root = core.NodePath("root")
    manager = core.AudioManager.create_AudioManager()
    manager3d = Audio3DManager(manager, root=root)
    yield manager3d
    del manager3d
    manager.shutdown()
예제 #17
0
    def __init__(self):
        super().__init__()

        x = float(base.win.get_x_size())
        y = float(base.win.get_y_size())
        y_aspect = y / x
        inventory_base_width = INVENTORY_VERTICAL_FRACTION * y_aspect
        inventory_half_width = inventory_base_width * INVENTORY_HORIZONTAL_FACTOR * 0.5
        
        self.region = base.win.make_display_region(
            0.5 - inventory_half_width,  # left
            0.5 + inventory_half_width,  # right
            0.0,  # bottom
            INVENTORY_VERTICAL_FRACTION,  # top
        )
        self.region.set_sort(INVENTORY_DISPLAY_REGION_SORT)

        self.cam_node = p3d.Camera('inventory_cam')
        lens = OrthographicLens()
        lens.set_film_size(INVENTORY_HORIZONTAL_FACTOR, 1)
        self.cam_node.set_lens(lens)
        self.cam_np = NodePath(self.cam_node)
        self.region.set_camera(self.cam_np)

        self.inventory = NodePath('inventory')
        self.cam_np.reparentTo(self.inventory)

        background_maker = CardMaker('inventory')
        background_maker.set_frame(-INVENTORY_HORIZONTAL_FACTOR / 2.0, INVENTORY_HORIZONTAL_FACTOR / 2.0, 0, 1)
        background = p3d.NodePath(background_maker.generate())
        background.reparent_to(self.inventory)
        background.set_pos(0, 5, -0.5)
예제 #18
0
def main():
    parser = argparse.ArgumentParser(
        description=
        'A tool for creating BAM files from Panda3D supported file formats')

    parser.add_argument('src', type=str, help='source path')
    parser.add_argument('dst', type=str, help='destination path')

    args = parser.parse_args()

    src = p3d.Filename.from_os_specific(os.path.abspath(args.src))
    dst = p3d.Filename.from_os_specific(os.path.abspath(args.dst))

    dst.make_dir()

    loader = p3d.Loader.get_global_ptr()
    options = p3d.LoaderOptions()
    options.flags |= p3d.LoaderOptions.LF_no_cache

    scene = p3d.NodePath(loader.load_sync(src, options))

    # Update texture paths
    converted_textures = set()
    for node in scene.find_all_matches('**/+GeomNode'):
        make_texpath_relative(node, src.get_dirname(), converted_textures)

    scene.write_bam_file(dst)
예제 #19
0
    def create_lights(self):
        # function for converting cylindrical coordinates to cartesian
        # coordinates
        rtz2xyz = lambda r, t, z: (r * np.cos(t), r * np.sin(t), z)

        # positions for point lights
        plight_pos = [
            rtz2xyz(1.5, 4 * np.pi / 12., 0),
            rtz2xyz(1.5, 12 * np.pi / 12., 0),
            rtz2xyz(1.5, 20 * np.pi / 12., 0),
            (0, 0, 1.3),
        ]

        # create point lights
        self.plights = p3d.NodePath("plights")
        for i, pos in enumerate(plight_pos):
            plight = pm.PointLight('plight%d' % i)
            plight.setColor((0.5, 0.5, 0.5, 1.0))
            plight.setAttenuation((0, 0, 0.5))
            plnp = self.plights.attachNewNode(plight)
            plnp.setPos(pos)
            self.render.setLight(plnp)
        self.plights.reparentTo(self.lights)
        self.plights.setPos(0, 0, 4 / 3.)

        # update the position and color of the spotlight
        slnp = self.lights.find('slight')
        slnp.setPos((8, 6, 20))
        slnp.lookAt(self.look_at)
        slnp.node().setColor((1, 1, 1, 1))

        # update the color of the ambient light
        alnp = self.lights.find('alight')
        alnp.node().setColor((0.2, 0.2, 0.2, 1))
예제 #20
0
    def __init__(self, world):
        notify.info('Initializing world geometry')

        self.world = world
        self.node = core.NodePath('world')
        # shader = core.Shader.load(core.Shader.SLGLSL, 'media/shaders/vertex.glsl', 'media/shaders/fragment.glsl')
        # self.node.setShader(shader)
        self.node.setShaderInput('color_scale', 1.0)

        self.bordertexture = loader.loadTexture('media/textures/border.png',
                                                anisotropicDegree=16,
                                                minfilter=core.Texture.FTLinearMipmapLinear)
        self.node.setShaderInput('border_texture', self.bordertexture)

        self.slices = []

        for z in range(self.world.depth):
            slice = Slice(self.world, z)
            slice.reparentTo(self.node)
            self.slices.append(slice)

            for x, y in self.world.columns():
                f, s, h = self.world.get_raw(x, y, z)
                if s and not h:
                    slice.update_all()
                    break

        self.accept('slice-changed', self.slice_changed)
        self.accept('block-update', self.block_update)
        self.accept('entity-z-change', self.reparent_entity)
        self.accept('designation-add', self.designation)

        notify.info('Initializing world geometry complete')
예제 #21
0
    def __init__(self, form, parent_node=None, weapon=None):
        self.form = form

        mesh = self.form.mesh

        if hasattr(builtins, 'base'):
            if self._ANIMS is None:
                anim_root = base.loader.load_model(self._ANIM_FILE)
                self.__class__._ANIMS = p3d.NodePath('anims')
                for bundle in anim_root.find_all_matches('**/+AnimBundleNode'):
                    bundle.reparent_to(self._ANIMS)
            model = base.loader.load_model('models/{}.bam'.format(
                mesh['bam_file']))
            root_node = model.find('**/{}'.format(mesh['root_node']))
            if root_node.is_empty():
                print(f"Warning: root node ({mesh['root_node']}) not found in "
                      f"bam_file ({mesh['bam_file']}) for {form.id}")
            else:
                self._ANIMS.instance_to(root_node)
            self._path = Actor(root_node)
            if weapon:
                self.update_weapon(weapon)
            self.play_anim('idle', loop=True)
            if parent_node:
                self._path.reparent_to(parent_node)
        else:
            self._path = Actor()
    def __init__(self):
        ShowBase.__init__(self)
        self.accept('escape', sys.exit)

        texture = p3d.Texture()
        texture.setup_buffer_texture(10, p3d.Texture.T_unsigned_int,
                                     p3d.Texture.F_rgba32,
                                     p3d.GeomEnums.UH_dynamic)

        gsg = self.win.get_gsg()
        pobs = gsg.get_prepared_objects()
        tex_ctx = texture.prepare_now(0, pobs, gsg)

        compute_node = p3d.ComputeNode('compute_node')
        compute_node.add_dispatch(10, 1, 1)
        compute_np = p3d.NodePath(compute_node)
        compute_np.reparent_to(self.render)
        compute_shader = p3d.Shader.make_compute(p3d.Shader.SL_GLSL,
                                                 SHADER_SRC)
        compute_np.set_shader(compute_shader)
        compute_np.set_shader_input('test_buffer', texture, False, True, -1, 0)

        def extract_texture(task):
            self.graphics_engine.extract_texture_data(texture,
                                                      self.win.get_gsg())
            view = memoryview(texture.get_ram_image()).cast('i')
            for i in range(10):
                print(view[i], end=' ')
            print()
            return task.cont

        taskMgr.add(extract_texture, 'extract_texture', sort=55)
예제 #23
0
파일: player.py 프로젝트: pmp-p/sigurd
 def __init__(self, modelpath=None):
     super().__init__()
     self.synchronize = True
     self._modelpath = modelpath if modelpath else ''
     if modelpath is not None:
         self.nodepath = base.loader.loadModel(modelpath)
     else:
         self.nodepath = p3d.NodePath(p3d.PandaNode('node'))
예제 #24
0
    def add(self, w, x, y, z):
        n = core.NodePath('designation')
        n.setPos(x, y, z)
        n.setShader(self.shader)
        n.setShaderInput('color', core.Vec4(0.5, 1.0, 0.5, 0.5))
        self.model.instanceTo(n)

        messenger.send('designation-add', [x, y, z, n])
예제 #25
0
    def __init__(self):
        super().__init__()

        self.accept('toggle-debug-cam', self.toggle_debug_cam)
        self.accept('move', self.move_player)
        self.accept('ability1', self.toggle_range, [0])
        self.accept('ability2', self.toggle_range, [1])
        self.accept('ability3', self.toggle_range, [2])
        self.accept('ability4', self.toggle_range, [3])

        self.mapgen = 'static'
        dungeon = Dungeon(self.mapgen, self.DUNGEON_SX, self.DUNGEON_SY)
        dungeon.model_root.reparent_to(self.root_node)

        dlight = p3d.DirectionalLight('sun')
        dlight.set_color(p3d.LVector3(0.2, 0.2, 0.2))
        dlight.set_shadow_caster(True, 4096, 4096)
        dlnp = self.root_node.attach_new_node(dlight)
        dlnp.set_z(10)
        dlnp.set_p(-90)
        lens = dlight.get_lens()
        lens.set_film_size(60)
        lens.set_near(1)
        lens.set_far(100)
        self.root_node.set_light(dlnp)

        dlight2 = p3d.DirectionalLight('ground')
        dlight2.set_color(p3d.LVector3(0.1, 0.1, 0.1))
        dlnp2 = self.root_node.attach_new_node(dlight2)
        self.root_node.set_light(dlnp2)

        loader = p3d.Loader.get_global_ptr()
        player = p3d.NodePath(
            loader.load_sync('dungeon.bam')).find('**/MonsterSpawn').node()
        playernp = self.root_node.attach_new_node(player)
        playernp.set_pos(dungeon.player_start)
        playernp.set_z(1.5)
        self.player_ranges = [
            RangeIndicator('box', length=5, width=1),
            RangeIndicator('circle', radius=2),
            RangeIndicator('circle', radius=3),
            RangeIndicator('circle', radius=4),
        ]
        for rangeindicator in self.player_ranges:
            rangeindicator.graphics.reparent_to(playernp)
            rangeindicator.visible = False

        # self.root_node.ls()
        # self.root_node.analyze()

        self.dungeons = [dungeon]
        self.dungeon_idx = 0
        self.dungeon = dungeon
        self.player = playernp
        self.last_tele_loc = None
        self.target = self.player.get_pos()
        self.debug_cam = False
        self.reset_camera()
예제 #26
0
def map_property(**items):
    """ Returns a mapping property initialized with the given values. """

    # It doesn't matter which property we use; I just happened to pick
    # NodePath.tags.
    np = core.NodePath("")
    for k, v in items.items():
        np.set_tag(k, v)
    return np.tags
예제 #27
0
    def __init__(self):
        super().__init__()

        self.physics_world = bullet.BulletWorld()
        self.physics_world.set_gravity(p3d.LVector3(0, 0, -9.8))
        phydebug = bullet.BulletDebugNode('Physics Debug')
        phydebug.show_wireframe(True)
        #phydebug.show_bounding_boxes(True)
        self._debugnp = p3d.NodePath(phydebug)
        self.physics_world.set_debug_node(phydebug)
예제 #28
0
    def __init__(self):
        super().__init__()
        self.root_node = p3d.NodePath('State Root')
        self.root_node.reparent_to(base.render)
        self.root_node2d = p3d.NodePath('State Root 2D')
        self.root_node2d.reparent_to(base.render2d)
        self.dgui = None
        self.menu_helper = MenuHelper(self.update_ui)
        self._input_state = None
        self._next_input_state = None
        self._next_state_args = None
        self._next_state_kwargs = None

        def handle_fade(task):
            if base.transitions.fadeOutActive():
                base.transitions.fadeIn()
            return task.done

        base.taskMgr.do_method_later(0, handle_fade, 'Fade In')
예제 #29
0
    def __init__(self, file_path, name=None, layers={}, \
                  rows=1, cols=1, scale=1.0, two_sided=True, alpha=TRANS_ALPHA, \
                  repeat_x=1, repeat_y=1, anchor_x=ALIGN_LEFT, anchor_y=ALIGN_BOTTOM):

        scale *= self.PIXEL_SCALE

        self._animations = {}
        self._scale = scale
        self._repeat_x = repeat_x
        self._repeat_y = repeat_y
        self._flip = {'x': False, 'y': False}
        self._rows = rows
        self._cols = cols

        self._current_frame = 0
        self._current_anim = None
        self._loop_anim = False
        self._frame_interrupt = True
        self._play_task = None

        # Resolve file path
        base_img_file = self.__resolve_vfs_relative_path(
            file_path=file_path, file_type='spritesheet')

        # Create the root node
        extension = name if name else base_img_file.get_basename_wo_extension()
        node_name = '%s:%s' % (self.__class__.__name__, extension)
        self._node = core.NodePath(node_name)
        if alpha:
            self._node.node().set_attrib(core.TransparencyAttrib.make(alpha))
        self._node.set_two_sided(two_sided)

        # Load the base sprite sheet
        self._img_file = None
        self._size_x = 0
        self._size_y = 0
        self._frames = []
        self._real_size_x = 0
        self._real_size_y = 0
        self._padded_img = None
        self._final_img = None

        self.__load_base_sheet(base_img_file)
        self.__construct_sprite_card(anchor_x, anchor_y)

        # Define layers
        self._layers = {}
        for layer_name in layers:
            layer_path = layers[layer_name]
            self.add_layer(layer_name, layer_path)

        # Build final image
        self.__update_final_image()
        self.__construct_sprite_texture()
예제 #30
0
    def _place_dense(self, left, right):
        # FIXME: Account for possibly more than two prop with 100% density
        placed = 0
        dense_parts = self._part_mgr.get_prop_by_prefix(self._level, 0)
        random.shuffle(dense_parts)
        for part in dense_parts:
            if placed > 1:
                break
            if random.random() > part.density:
                continue
            np = core.NodePath('prop')
            part.model.copy_to(np)
            np.reparent_to(base.render)
            np.set_shader(PROP_SHADER)
            np.set_shader_input('i_hue', self._current_hue)
            np.set_shader_input('i_zmax', part.bounds.mmax.z)
            np.set_shader_input('i_height',
                                part.bounds.mmax.z - part.bounds.mmin.z)
            np.set_shader_input('i_shade', SH_Z_SHADE_COLOR)
            np.set_shader_input('i_shade_exp', SH_Z_SHADE_EXP)
            np.set_shader_input('i_alpha_f', 1.0)

            for n in np.get_children():
                bmin, bmax = np.get_tight_bounds()
                origin = Vec3(
                    (bmax.x - bmin.x) / 2 + bmin.x,
                    (bmax.y - bmin.y) / 2 + bmin.y,
                    bmax.z,
                )
                end = Vec3(
                    (bmax.x - bmin.x) / 2 + bmin.x,
                    (bmax.y - bmin.y) / 2 + bmin.y,
                    bmin.z,
                )
                n.set_shader(LIGHT_SHADER)
                n.set_shader_input('i_hue', self._current_hue)
                n.set_shader_input('i_end', end)
                n.set_shader_input('i_origin', origin)
                n.set_shader_input('i_shade', SH_Z_SHADE_COLOR)
                n.set_shader_input('i_shade_exp', SH_Z_SHADE_EXP)
                n.set_shader_input('i_alpha_f', 0.1)

            if (self._dense_counter + placed) % 2:
                np.set_scale(PR_SCALE)
                np.set_pos(left, self._next_part_y, 0)
            else:
                np.set_h(180)
                np.set_scale(PR_SCALE)
                np.set_pos(right, self._next_part_y, 0)

            self._parts.append(np)
            placed += 1

        self._dense_counter += 1