diff --git a/.gitignore b/.gitignore index ff9047e..b8ffe01 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /cmake-build-debug/ +.name \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 4cf6def..af36c8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ project(rla_iipp) # Defines the project name. conan_basic_setup() # Prepares the CMakeList.txt for Conan.]] # $source_files is a space-delimited list of filenames. -add_executable(rla_iipp src/main.cpp src/engine/engine.hpp src/engine/game/game.hpp src/engine/rendering/renderer.hpp src/game/visualizer.hpp src/game/visualizer.cpp src/engine/rendering/sdl/sdlrenderer.cpp src/engine/rendering/sdl/sdlrenderer.hpp src/engine/rendering/sdl/sdlrenderer.cpp src/engine/rendering/sdl/sdlrenderer.hpp src/engine/engine.cpp src/engine/engine.hpp src/engine/rendering/sdl/sdltexturemanager.cpp src/engine/rendering/sdl/sdltexturemanager.hpp src/engine/resources/resourcemanager.hpp src/engine/rendering/sdl/sdlfontmanager.cpp src/engine/rendering/sdl/sdlfontmanager.hpp src/engine/input/inputprocessor.hpp src/engine/input/sdlinputprocessor.cpp src/engine/input/sdlinputprocessor.hpp src/engine/utility/camera.cpp src/engine/utility/camera.hpp src/engine/utility/point.hpp src/engine/utility/rectangle.hpp src/engine/utility/grid2d.hpp src/engine/scripting/luacontextmanager.cpp src/engine/scripting/luacontextmanager.hpp src/game/algorithmmanager.cpp src/game/algorithmmanager.hpp src/game/tilemap.cpp src/game/tilemap.hpp src/engine/rlengineexception.hpp) # Specifies the executable to build. +add_executable(rla_iipp src/main.cpp src/engine/engine.hpp src/engine/game/game.hpp src/engine/rendering/renderer.hpp src/game/visualizer.hpp src/game/visualizer.cpp src/engine/rendering/sdl/sdlrenderer.cpp src/engine/rendering/sdl/sdlrenderer.hpp src/engine/rendering/sdl/sdlrenderer.cpp src/engine/rendering/sdl/sdlrenderer.hpp src/engine/engine.cpp src/engine/engine.hpp src/engine/rendering/sdl/sdltexturemanager.cpp src/engine/rendering/sdl/sdltexturemanager.hpp src/engine/resources/resourcemanager.hpp src/engine/rendering/sdl/sdlfontmanager.cpp src/engine/rendering/sdl/sdlfontmanager.hpp src/engine/input/inputprocessor.hpp src/engine/input/sdlinputprocessor.cpp src/engine/input/sdlinputprocessor.hpp src/engine/utility/camera.cpp src/engine/utility/camera.hpp src/engine/utility/point.hpp src/engine/utility/rectangle.hpp src/engine/utility/grid2d.hpp src/engine/scripting/luacontextmanager.cpp src/engine/scripting/luacontextmanager.hpp src/game/algorithmmanager.cpp src/game/algorithmmanager.hpp src/game/tilemap.cpp src/game/tilemap.hpp src/engine/rlengineexception.hpp src/engine/rendering/renderingpipelinestep.hpp src/engine/rendering/pipeline_steps/gamerenderingstep.cpp src/engine/rendering/pipeline_steps/gamerenderingstep.hpp src/engine/rendering/pipeline_steps/fpscounterrenderingstep.cpp src/engine/rendering/pipeline_steps/fpscounterrenderingstep.hpp) # Specifies the executable to build. # vcpkg packages find_package(SDL2 CONFIG REQUIRED) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index df6841f..50adeab 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -5,6 +5,8 @@ #include "engine.hpp" #include "rendering/sdl/sdlrenderer.hpp" #include "rlengineexception.hpp" +#include "rendering/pipeline_steps/gamerenderingstep.hpp" +#include "rendering/pipeline_steps/fpscounterrenderingstep.hpp" #include #include #include @@ -21,21 +23,27 @@ void Engine::start_loop() { renderer->flush(); auto game_params = GameInitArgs{this->config.target_fps, this->config.window_width, this->config.window_height}; game->initialize(game_params); + std::vector> rendering_steps = build_render_pipline(); auto duration_per_frame = one_second_milli / this->config.target_fps; - auto last_frame = std::chrono::high_resolution_clock::now(); while(true) { auto starttime = std::chrono::high_resolution_clock::now(); + + // Input and update auto input = this->input_processor->process_input(); bool end = game->update(input); if(end) { break; } - game->render(renderer.get()); + + // Rendering + std::for_each(rendering_steps.begin(), rendering_steps.end(), [this](std::unique_ptr& step) { + step->render_step(this->renderer.get()); + }); + renderer->flush(); + + // timing and sleep auto endtime = std::chrono::high_resolution_clock::now(); auto update_duration = std::chrono::duration_cast(endtime - starttime); - last_frame = render_fps(endtime, last_frame); - renderer->flush(); // not technically correct to do this here, but is done so we can put the fps over the display - std::this_thread::sleep_for(duration_per_frame - update_duration); } } @@ -48,18 +56,6 @@ Engine::Engine(std::unique_ptr game, this->setup_renderer(this->config.selected_renderer); } -std::chrono::time_point -Engine::render_fps(std::chrono::time_point end, - std::chrono::time_point lastframe) { - double frames = 1; - std::chrono::duration dur = end - lastframe; - if(this->config.show_fps) { - //printf("fps: %f\n", frames/dur.count()); - this->renderer->draw_text(std::nullopt, fmt::format("{:.2f}", frames/dur.count()), 0, 0); - } - return end; -} - void Engine::load_config(const std::string &path, const std::function& f) { std::string full_path = fmt::format("{}/{}", CONFIG_DIR, path); auto table = toml::parse_file(full_path); @@ -92,6 +88,15 @@ void Engine::setup_renderer(RendererTypes rendering_engine) { this->renderer = std::move(rendering_engine_ptr); } +std::vector> Engine::build_render_pipline() { + std::vector> result = std::vector>(); + result.push_back(std::make_unique(this->game.get())); + if(this->config.show_fps) { + result.push_back(std::make_unique()); + } + return result; +} + Engine::~Engine() = default; diff --git a/src/engine/engine.hpp b/src/engine/engine.hpp index b668efd..8cef691 100644 --- a/src/engine/engine.hpp +++ b/src/engine/engine.hpp @@ -13,6 +13,8 @@ #include #include "rendering/renderer.hpp" #include "input/inputprocessor.hpp" +#include "rendering/renderingpipelinestep.hpp" + #define MISSING_GAME_ERROR "Game pointer is null" #define MISSING_RENDERER_ERROR "Renderer pointer is null" #define RESOURCE_DIR "assets" @@ -54,9 +56,9 @@ private: std::unique_ptr game = nullptr; std::unique_ptr renderer = nullptr; std::unique_ptr input_processor = nullptr; - std::chrono::time_point render_fps(std::chrono::time_point end, std::chrono::time_point lastframe); void parse_config(const std::string& config_file_path); void setup_renderer(RendererTypes rendering_engine); + std::vector> build_render_pipline(); }; class MissingGameException : public std::exception { diff --git a/src/engine/rendering/pipeline_steps/fpscounterrenderingstep.cpp b/src/engine/rendering/pipeline_steps/fpscounterrenderingstep.cpp new file mode 100644 index 0000000..a75c1cd --- /dev/null +++ b/src/engine/rendering/pipeline_steps/fpscounterrenderingstep.cpp @@ -0,0 +1,18 @@ +// +// Created by m on 7/18/23. +// + +#include +#include "fpscounterrenderingstep.hpp" + +void FpsCounterRenderingStep::render_step(Renderer *renderer) { + double frames = 1; + std::chrono::time_point end = std::chrono::system_clock::now(); + std::chrono::duration dur = end - this->lastFrame; + renderer->draw_text(std::nullopt, fmt::format("{:.2f}", frames/dur.count()), 0, 0); + this->lastFrame = end; +} + +FpsCounterRenderingStep::FpsCounterRenderingStep() { + this->lastFrame = std::chrono::high_resolution_clock::now(); +} diff --git a/src/engine/rendering/pipeline_steps/fpscounterrenderingstep.hpp b/src/engine/rendering/pipeline_steps/fpscounterrenderingstep.hpp new file mode 100644 index 0000000..d7d8cee --- /dev/null +++ b/src/engine/rendering/pipeline_steps/fpscounterrenderingstep.hpp @@ -0,0 +1,22 @@ +// +// Created by m on 7/18/23. +// + +#ifndef RLA_IIPP_FPSCOUNTERRENDERINGSTEP_HPP +#define RLA_IIPP_FPSCOUNTERRENDERINGSTEP_HPP + + +#include +#include "../renderingpipelinestep.hpp" + +class FpsCounterRenderingStep : public RenderingPipelineStep { + void render_step(Renderer *renderer) override; +public: + FpsCounterRenderingStep(); + +private: + std::chrono::time_point lastFrame; +}; + + +#endif //RLA_IIPP_FPSCOUNTERRENDERINGSTEP_HPP diff --git a/src/engine/rendering/pipeline_steps/gamerenderingstep.cpp b/src/engine/rendering/pipeline_steps/gamerenderingstep.cpp new file mode 100644 index 0000000..772a8fb --- /dev/null +++ b/src/engine/rendering/pipeline_steps/gamerenderingstep.cpp @@ -0,0 +1,11 @@ +// +// Created by m on 7/18/23. +// + +#include "gamerenderingstep.hpp" + +void GameRenderingStep::render_step(Renderer *renderer) { + game->render(renderer); +} + +GameRenderingStep::GameRenderingStep(Game *game) : game(game) {} diff --git a/src/engine/rendering/pipeline_steps/gamerenderingstep.hpp b/src/engine/rendering/pipeline_steps/gamerenderingstep.hpp new file mode 100644 index 0000000..93c4617 --- /dev/null +++ b/src/engine/rendering/pipeline_steps/gamerenderingstep.hpp @@ -0,0 +1,22 @@ +// +// Created by m on 7/18/23. +// + +#ifndef RLA_IIPP_GAMERENDERINGSTEP_HPP +#define RLA_IIPP_GAMERENDERINGSTEP_HPP + + +#include "../renderingpipelinestep.hpp" +#include "../../game/game.hpp" + +class GameRenderingStep : public RenderingPipelineStep { + void render_step(Renderer *renderer) override; +private: + Game* game; +public: + explicit GameRenderingStep(Game *game); + +}; + + +#endif //RLA_IIPP_GAMERENDERINGSTEP_HPP diff --git a/src/engine/rendering/renderingpipelinestep.hpp b/src/engine/rendering/renderingpipelinestep.hpp new file mode 100644 index 0000000..d1baff6 --- /dev/null +++ b/src/engine/rendering/renderingpipelinestep.hpp @@ -0,0 +1,17 @@ +// +// Created by m on 7/18/23. +// + +#ifndef RLA_IIPP_RENDERINGPIPELINESTEP_HPP +#define RLA_IIPP_RENDERINGPIPELINESTEP_HPP + +#include "renderer.hpp" + +class RenderingPipelineStep { +public: + virtual ~RenderingPipelineStep() = default; + + virtual void render_step(Renderer* renderer) = 0; +}; + +#endif //RLA_IIPP_RENDERINGPIPELINESTEP_HPP diff --git a/src/game/visualizer.cpp b/src/game/visualizer.cpp index a9d9d2e..d27063f 100644 --- a/src/game/visualizer.cpp +++ b/src/game/visualizer.cpp @@ -31,7 +31,6 @@ void Visualizer::render(Renderer *renderer) { auto grass = Sprite{&tiles, 0}; auto wall = Sprite{&tiles, 497}; auto character = Sprite{&characters, this->sprite_index}; - auto bounds = this->camera.get_bounds(); for(Point p : camera.get_range()) { auto wp = camera.camera_coords_to_screen_coords(p); int wx = wp.x, wy = wp.y; @@ -64,9 +63,6 @@ void Visualizer::initialize(GameInitArgs args) { this->camera = Camera(Point{x,y}, tilesx, tilesy, tile_map.get_width(), tile_map.get_height()); this->algorithm_manager = AlgorithmManager(args.target_fps); this->initialize_context(); - - - } void Visualizer::initialize_map(int width, int height) {