Esempio n. 1
0
def main():
    scanner = SimpleScanner()

    gl.glClearColor(0.1, 0.1, 0.2, 1.0)
    timer_msec = int(1000 / 60)  # 60 times per second
    renderer = Renderer()
    drawings_list = []
    fish_queue = Queue(
    )  # Queue to maintain order of the fish and kill the oldest ones
    fish_limit = 10  # Maximum amount of fish to draw
    scanned_fish_queue = Queue()
    draw_ocean(drawings_list)

    fish_shader_program = Renderer.create_shader(gl.GL_VERTEX_SHADER,
                                                 FISH_SHADER_CODE)
    bubble_texture = Renderer.create_texture_from_file(
        'ocean/images/bubble.png')
    load_fish_from_files(scanner, drawings_list, fish_queue,
                         fish_shader_program, bubble_texture)

    glut.glutDisplayFunc(partial(renderer.render, drawings_list))
    glut.glutIgnoreKeyRepeat(True)
    glut.glutKeyboardFunc(create_key_processor(scanner, scanned_fish_queue))
    glut.glutTimerFunc(
        timer_msec,
        create_animation_function(renderer, drawings_list, scanned_fish_queue,
                                  fish_queue, fish_limit, timer_msec,
                                  fish_shader_program, bubble_texture), 0)

    glut.glutMainLoop()
Esempio n. 2
0
def draw_sails(
    drawings_list: List[Drawing],
    shader: int,
) -> None:
    """
    Support function to draw sails
    :param drawings_list: List of sprites to draw
    :param shader: Shader to animate the sails
    :return:
    """
    drawing = DrawingSeaweed(
        Renderer.create_texture_from_file('ocean/images/sail_1.png'),
        shader=shader)
    drawing.position = np.array([1.2, -0.43, -0.77])
    drawing.scale = np.array([0.6, 0.4, 1.0])
    drawings_list.append(drawing)

    drawing = DrawingSeaweed(
        Renderer.create_texture_from_file('ocean/images/sail_2.png'),
        shader=shader)
    drawing.position = np.array([1.6, -0.34, -0.77])
    drawing.scale = np.array([0.3, 0.5, 1.0])
    drawings_list.append(drawing)

    drawing = DrawingSeaweed(
        Renderer.create_texture_from_file('ocean/images/sail_3.png'),
        shader=shader)
    drawing.position = np.array([1.7, -0.71, -0.77])
    drawing.scale = np.array([0.2, 0.3, 1.0])
    drawings_list.append(drawing)
Esempio n. 3
0
def load_fish_from_files(
    scanner: SimpleScanner,
    drawings_list: List[Drawing],
    fish_queue: Queue,
    fish_shader_program: int = 0,
    bubble_texture: int = 0,
) -> None:
    """
    Load all the predrawing fish from the folder
    :param scanner: Object of scanner to process photos
    :param drawings_list: Lists of sprites to add fish in it
    :param fish_queue: Queue to maintain order of fish
    :param fish_shader_program: ID of fish shader
    :param bubble_texture: ID of bubble texture
    :return:
    """
    files = glob('./photos/*.jpg')
    for filename in files:
        frame = cv2.imread(filename)
        if frame is None:
            raise ValueError(f'Error reading image with filename: {filename}')
        scanned_fish = scan_from_frame(frame, scanner)
        drawing = DrawingFish(Renderer.create_texture(scanned_fish),
                              shader=fish_shader_program,
                              bubble_texture_id=bubble_texture)
        drawings_list.append(drawing)
        fish_queue.put(drawing)
Esempio n. 4
0
def create_back_layer(
    filename: str,
    z: float,
    shader: int = 0,
) -> DrawingStatic:
    """
    Create sprite for the scene background
    :param filename: Path to the background image
    :param z: Depth position of the sprite
    :param shader: Shader ID for the background
    :return: Sprite object for the background
    """
    drawing_back = DrawingStatic(Renderer.create_texture_from_file(filename),
                                 shader=shader)
    drawing_back.position = np.array([0, 0., z])
    drawing_back.scale = np.array([3.6, 2.0, 1.0])
    return drawing_back
Esempio n. 5
0
    def animate(value):
        renderer.animate(drawings_list)
        glut.glutTimerFunc(timer_msec, animate, 0)

        # Get fish scan from scanner thread
        if scanned_fish_queue.qsize() > 0:
            scanned_fish = scanned_fish_queue.get()
            drawing = DrawingFish(Renderer.create_texture(scanned_fish),
                                  shader=fish_shader_program,
                                  bubble_texture_id=bubble_texture)
            drawings_list.append(drawing)
            fish_queue.put(drawing)

        if fish_queue.qsize() > fish_limit:
            fish = fish_queue.get()
            fish.go_away()

        # Remove dead fish from drawing list
        for drawing in drawings_list:
            if isinstance(drawing, DrawingFish) and not drawing.is_alive:
                drawings_list.remove(drawing)
Esempio n. 6
0
def draw_ocean(drawings_list: List[Drawing]) -> None:
    """
    Draw all the sprites in the ocean scene
    :param drawings_list: Lists of sprites to draw
    :return:
    """
    seaweed_shader_program = Renderer.create_shader(gl.GL_VERTEX_SHADER,
                                                    SEAWEED_SHADER_CODE)

    drawings_list.append(create_back_layer('ocean/images/back_down.png', -0.8))
    drawings_list.append(
        create_back_layer('ocean/images/back_middle.png', -0.78))
    drawings_list.append(create_back_layer('ocean/images/back_reef.png', 0.8))

    draw_sails(drawings_list, seaweed_shader_program)

    seaweed_texture = Renderer.create_texture_from_file(
        'ocean/images/seaweed_2.png')
    # Draw seaweed under the ship
    drawing = DrawingSeaweed(seaweed_texture, shader=seaweed_shader_program)
    drawing.position = np.array([1.2, 0.4, -0.75])
    drawing.scale = np.array([0.8, 0.4, 1.0])
    drawings_list.append(drawing)

    seaweed_texture = Renderer.create_texture_from_file(
        'ocean/images/seaweed_1.png')
    # Draw seaweed in the right corner
    drawing = DrawingSeaweed(seaweed_texture, shader=seaweed_shader_program)
    drawing.position = np.array([1.2, 1.0, 0.9])
    drawing.scale = np.array([0.8, 1.4, 1.0])
    # drawing.color = np.array([0.5, 0.5, 1.0])
    drawings_list.append(drawing)

    # Draw seaweed in the front of the rock
    drawing = DrawingSeaweed(seaweed_texture, shader=seaweed_shader_program)
    drawing.position = np.array([0.2, 0.15, -0.7])
    drawing.scale = np.array([0.4, 0.4, 1.0])
    # drawing.color = np.array([0.6, 0.6, 1.0])
    drawings_list.append(drawing)

    seaweed_texture = Renderer.create_texture_from_file(
        'ocean/images/seaweed_3.png')
    # Draw seaweed in the left corner
    drawing = DrawingSeaweed(seaweed_texture, shader=seaweed_shader_program)
    drawing.position = np.array([-1.2, 0.6, 0.9])
    drawing.scale = np.array([0.3, 1.0, 1.0])
    # drawing.color = np.array([0.5, 0.5, 1.0])
    drawings_list.append(drawing)

    # Draw seaweed on the background
    drawing = DrawingSeaweed(seaweed_texture, shader=seaweed_shader_program)
    drawing.position = np.array([-0.8, -0.5, -0.795])
    drawing.scale = np.array([0.3, 1.0, 1.0])
    drawing.color = np.array([0.3, 0.3, 0.8])
    drawings_list.append(drawing)

    drawing = DrawingSeaweed(seaweed_texture, shader=seaweed_shader_program)
    drawing.position = np.array([0.0, -0.2, -0.795])
    drawing.scale = np.array([-0.3, 1.0, 1.0])
    drawing.color = np.array([0.3, 0.3, 0.8])
    drawings_list.append(drawing)

    drawing = DrawingSeaweed(seaweed_texture, shader=seaweed_shader_program)
    drawing.position = np.array([-0.4, -0.2, -0.795])
    drawing.scale = np.array([0.1, 0.3, 1.0])
    drawing.color = np.array([0.1, 0.1, 0.4])
    drawings_list.append(drawing)
Esempio n. 7
0

class Builder(Actor):
    def __init__(self):
        self.has_started = False

    def replicate(self) -> 'Builder':
        return Builder()

    def act(self, sight: List[View]) -> Action:
        action = Action.WORK if self.has_started else Action.START_REPLICA
        self.has_started = True
        return action


if __name__ == "__main__":
    world = World(Vector(12, 12))
    position = Vector(4, 4)
    world.insert(Builder(), position, Direction.BACKWARD)
    position = Direction.BACKWARD.translate_vector(position)
    world.insert(Resource(), position, Direction.BACKWARD)
    position = Direction.BACKWARD.translate_vector(position)
    world.insert(Resource(), position, Direction.BACKWARD)

    renderer = Renderer(world)
    interactor = Interactor(world)
    renderer.render()
    for _ in range(12):
        interactor.tick()
        renderer.render()
Esempio n. 8
0
    def __init__(self,
                 game_name,
                 window_width,
                 window_height,
                 font,
                 fps=None,
                 floor_manager=None,
                 main_menu=None,
                 message_log=True):
        # Game console props
        self.game_name = game_name
        self.window_width = window_width
        self.window_height = window_height
        self.font = font
        self.fps = fps

        # if the game had fps specified, update the console fps
        if (self.fps != None):
            tcod.sys_set_fps(self.fps)

        # Initialize font
        tcod.console_set_custom_font(self.font.path, self.font.options)

        # Initialize root console
        self.root_console = tcod.console_init_root(self.window_width,
                                                   self.window_height,
                                                   self.game_name)

        # Initialize the main menu
        self.main_menu = main_menu
        if (self.main_menu):
            self.main_menu.game = self

        # Initially game is not running
        self.game_state = "not_running"

        # Additional props
        self.props = {}

        # Floor handling DEBUG bring into own handler class
        if (floor_manager is None):
            self.floor_manager = FloorManager((self.window_width * 3) // 4,
                                              self.window_height,
                                              game=self)

        # Dashboards
        self.dashboards = []

        if (message_log == True):
            margin = 4
            message_log_dashboard = LogDashboard((self.window_width * 3) // 4,
                                                 margin,
                                                 self.window_width // 4,
                                                 self.window_height - margin,
                                                 messages=[])
            add_dashboard_to_game(self, message_log_dashboard)
        # World map
        # TODO make the map width + height configurable
        #self.map = GameMap((self.window_width * 3) // 4, self.window_height) DEAD

        # Input handlers
        self.input_handlers = []

        #Renderer
        self.game_renderer = Renderer(game=self)
Esempio n. 9
0
class Game:

    # params
    # name of game, width of console window, height of console window, game font, game fps

    def __init__(self,
                 game_name,
                 window_width,
                 window_height,
                 font,
                 fps=None,
                 floor_manager=None,
                 main_menu=None,
                 message_log=True):
        # Game console props
        self.game_name = game_name
        self.window_width = window_width
        self.window_height = window_height
        self.font = font
        self.fps = fps

        # if the game had fps specified, update the console fps
        if (self.fps != None):
            tcod.sys_set_fps(self.fps)

        # Initialize font
        tcod.console_set_custom_font(self.font.path, self.font.options)

        # Initialize root console
        self.root_console = tcod.console_init_root(self.window_width,
                                                   self.window_height,
                                                   self.game_name)

        # Initialize the main menu
        self.main_menu = main_menu
        if (self.main_menu):
            self.main_menu.game = self

        # Initially game is not running
        self.game_state = "not_running"

        # Additional props
        self.props = {}

        # Floor handling DEBUG bring into own handler class
        if (floor_manager is None):
            self.floor_manager = FloorManager((self.window_width * 3) // 4,
                                              self.window_height,
                                              game=self)

        # Dashboards
        self.dashboards = []

        if (message_log == True):
            margin = 4
            message_log_dashboard = LogDashboard((self.window_width * 3) // 4,
                                                 margin,
                                                 self.window_width // 4,
                                                 self.window_height - margin,
                                                 messages=[])
            add_dashboard_to_game(self, message_log_dashboard)
        # World map
        # TODO make the map width + height configurable
        #self.map = GameMap((self.window_width * 3) // 4, self.window_height) DEAD

        # Input handlers
        self.input_handlers = []

        #Renderer
        self.game_renderer = Renderer(game=self)

    # Start the main game loop
    def start_loop(self, logic):
        # set the game to be running
        if (self.main_menu):
            self.game_state = "in_menu"
        else:
            self.game_state = "playing"

        # game loop
        while (self.game_state != "not_running"):
            # game logic
            logic(self)

            # TODO
            # run through all the input handlers

            # Render
            if (self.game_state == "playing"):
                self.game_renderer.render_all()
                self.game_renderer.update_console()
                self.game_renderer.clear_all()
            elif (self.game_state == "in_menu"):
                # TODO implement me
                self.game_renderer.render_menu(self.main_menu)
                self.game_renderer.update_console()
                tcod.console_clear(self.root_console)

    # Stop the game loop
    def stop_loop(self):
        self.game_state = "not_running"
Esempio n. 10
0
args = parse_args()

ti.init(arch=ti.cuda,
        use_unified_memory=False,
        device_memory_GB=args.gpu_memory)

output_folder = args.out_dir
os.makedirs(output_folder, exist_ok=True)

from engine.renderer import Renderer

res = args.res
renderer = Renderer(dx=1 / res,
                    sphere_radius=0.3 / res,
                    shutter_time=args.shutter_time,
                    max_num_particles_million=args.max_particles,
                    taichi_logo=False)

with_gui = args.gui
if with_gui:
    gui = ti.GUI('Particle Renderer', (1280, 720))

spp = 200

# 0.23, (0.0, 0.8, 5.5)


def main():
    for f in range(args.begin, args.end, args.step):
        print('frame', f, end=' ')