From 7b2a0719b12196e729614341a776a209124c745e Mon Sep 17 00:00:00 2001 From: littlefoot Date: Fri, 3 Dec 2021 19:45:52 -0500 Subject: [PATCH] initial commit --- .gitignore | 1 + .idea/.gitignore | 8 ++++ .idea/misc.xml | 4 ++ .idea/modules.xml | 8 ++++ .idea/rla_iipp.iml | 2 + .idea/vcs.xml | 6 +++ CMakeLists.txt | 10 +++++ conanfile.txt | 4 ++ src/engine/engine.cpp | 57 ++++++++++++++++++++++++ src/engine/engine.hpp | 23 ++++++++++ src/engine/game/game.hpp | 16 +++++++ src/engine/rendering/renderer.hpp | 31 +++++++++++++ src/engine/rendering/sdl/sdlrenderer.cpp | 32 +++++++++++++ src/engine/rendering/sdl/sdlrenderer.hpp | 22 +++++++++ src/game/visualizer.cpp | 32 +++++++++++++ src/game/visualizer.hpp | 24 ++++++++++ src/main.cpp | 17 +++++++ 17 files changed, 297 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/rla_iipp.iml create mode 100644 .idea/vcs.xml create mode 100644 CMakeLists.txt create mode 100644 conanfile.txt create mode 100644 src/engine/engine.cpp create mode 100644 src/engine/engine.hpp create mode 100644 src/engine/game/game.hpp create mode 100644 src/engine/rendering/renderer.hpp create mode 100644 src/engine/rendering/sdl/sdlrenderer.cpp create mode 100644 src/engine/rendering/sdl/sdlrenderer.hpp create mode 100644 src/game/visualizer.cpp create mode 100644 src/game/visualizer.hpp create mode 100644 src/main.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ff9047e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/cmake-build-debug/ diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..73f69e0 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..79b3c94 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..9e9dcc8 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/rla_iipp.iml b/.idea/rla_iipp.iml new file mode 100644 index 0000000..f08604b --- /dev/null +++ b/.idea/rla_iipp.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..9c6a0e3 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.22) # Specifies the required CMake version. +project(rla_iipp) # Defines the project name. + +include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) # Includes the contents of the conanbuildinfo.cmake file. +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) # Specifies the executable to build. +target_link_libraries(rla_iipp ${CONAN_LIBS}) # Specifies what libraries to link, using Conan. +file(COPY assets DESTINATION ${CMAKE_BINARY_DIR}/bin) \ No newline at end of file diff --git a/conanfile.txt b/conanfile.txt new file mode 100644 index 0000000..cdca3ed --- /dev/null +++ b/conanfile.txt @@ -0,0 +1,4 @@ +[requires] +sdl/2.0.16 +[generators] +cmake \ No newline at end of file diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp new file mode 100644 index 0000000..abdc8bb --- /dev/null +++ b/src/engine/engine.cpp @@ -0,0 +1,57 @@ +// +// Created by m on 12/3/21. +// + +#include "engine.hpp" +#include +#include +#include +#include +#include +using namespace std::chrono_literals; +void Engine::start_loop() { + const auto one_second_milli = std::chrono::milliseconds(1s); + if(game == nullptr) { + printf("game is null\n"); + return; + } + if(renderer == nullptr) { + printf("renderer is null\n"); + return; + } + RendererParams renderParams = game->get_renderer_params(); + renderer->initialize(renderParams); + renderer->flush(); + auto duration_per_frame = one_second_milli / game->get_framerate(); + auto last_frame = std::chrono::high_resolution_clock::now(); + while(true) { + auto starttime = std::chrono::high_resolution_clock::now(); + bool end = game->update(); + if(end) { + break; + } + game->render(renderer.get()); + renderer->flush(); + auto endtime = std::chrono::high_resolution_clock::now(); + last_frame = render_fps(endtime, last_frame); + + std::this_thread::sleep_for(duration_per_frame); + } +} + +Engine::Engine(std::unique_ptr game, std::unique_ptr renderer) { + this->renderer = std::move(renderer); + this->game = std::move(game); +} + +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(SHOW_FPS) { + printf("fps: %f\n", frames/dur.count()); + } + return end; +} + diff --git a/src/engine/engine.hpp b/src/engine/engine.hpp new file mode 100644 index 0000000..c66b12d --- /dev/null +++ b/src/engine/engine.hpp @@ -0,0 +1,23 @@ +// +// Created by m on 12/3/21. +// + +#ifndef RLA_IIPP_ENGINE_HPP +#define RLA_IIPP_ENGINE_HPP +#include +#include +#include "game/game.hpp" +#include "rendering/renderer.hpp" +static const bool SHOW_FPS = true; +class Engine { +public: + Engine(std::unique_ptr game, std::unique_ptr renderer); + void start_loop(); + std::chrono::time_point render_fps(std::chrono::time_point end, std::chrono::time_point lastframe); +private: + std::unique_ptr game; + std::unique_ptr renderer; +}; + + +#endif //RLA_IIPP_ENGINE_HPP diff --git a/src/engine/game/game.hpp b/src/engine/game/game.hpp new file mode 100644 index 0000000..8db5246 --- /dev/null +++ b/src/engine/game/game.hpp @@ -0,0 +1,16 @@ +// +// Created by m on 12/3/21. +// + +#ifndef RLA_IIPP_GAME_HPP +#define RLA_IIPP_GAME_HPP +#include "../rendering/renderer.hpp" +class Game { +public: + virtual bool update() = 0; + virtual void render(Renderer* renderer) = 0; + virtual RendererParams get_renderer_params() = 0; + virtual unsigned int get_framerate() = 0; +}; + +#endif //RLA_IIPP_GAME_HPP diff --git a/src/engine/rendering/renderer.hpp b/src/engine/rendering/renderer.hpp new file mode 100644 index 0000000..1f493d9 --- /dev/null +++ b/src/engine/rendering/renderer.hpp @@ -0,0 +1,31 @@ +// +// Created by m on 12/3/21. +// + +#ifndef RLA_IIPP_RENDERER_HPP +#define RLA_IIPP_RENDERER_HPP + +struct Color { +public: + unsigned char r; + unsigned char g; + unsigned char b; + unsigned char a; + + Color(unsigned char r, unsigned char g, unsigned char b, unsigned char a) : r(r), g(g), b(b), a(a) {} +}; + +struct RendererParams { + char* title; + unsigned int width; + unsigned int height; +}; + +class Renderer { +public: + virtual void initialize(RendererParams params)=0; + virtual void flush() = 0; + virtual void draw_point(int x, int y, Color color) = 0; +}; + +#endif //RLA_IIPP_RENDERER_HPP diff --git a/src/engine/rendering/sdl/sdlrenderer.cpp b/src/engine/rendering/sdl/sdlrenderer.cpp new file mode 100644 index 0000000..5fc4e3a --- /dev/null +++ b/src/engine/rendering/sdl/sdlrenderer.cpp @@ -0,0 +1,32 @@ +// +// Created by m on 12/3/21. +// +#include +#include "sdlrenderer.hpp" + +void SdlRenderer::initialize(RendererParams params) { + if(SDL_Init(SDL_INIT_VIDEO) < 0) { + printf("SDL vide oinit failed: %s\n", SDL_GetError()); + } + SDL_Window* sdl_window = SDL_CreateWindow(params.title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, params.width, params.height, SDL_WINDOW_SHOWN); + if(sdl_window == nullptr) { + printf("error making window: %s\n", SDL_GetError()); + } + else { + this->window = sdl_window; + SDL_Renderer* sdl_renderer = SDL_CreateRenderer(this->window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); + this->renderer = sdl_renderer; + SDL_RenderClear(this->renderer); + } +} + +void SdlRenderer::flush() { + SDL_RenderPresent(this->renderer); + SDL_SetRenderDrawColor(this->renderer, 0, 0, 0, 255); + SDL_RenderClear(this->renderer); +} + +void SdlRenderer::draw_point(int x, int y, Color color) { + SDL_SetRenderDrawColor(this->renderer, color.r, color.g, color.b, color.a); + SDL_RenderDrawPoint(this->renderer, x, y); +} diff --git a/src/engine/rendering/sdl/sdlrenderer.hpp b/src/engine/rendering/sdl/sdlrenderer.hpp new file mode 100644 index 0000000..75d2ce0 --- /dev/null +++ b/src/engine/rendering/sdl/sdlrenderer.hpp @@ -0,0 +1,22 @@ +// +// Created by m on 12/3/21. +// + +#ifndef RLA_IIPP_SDLRENDERER_HPP +#define RLA_IIPP_SDLRENDERER_HPP +#include "../renderer.hpp" +#include + +class SdlRenderer : public Renderer { + void initialize(RendererParams params) override; + + void flush() override; + + void draw_point(int x, int y, Color color) override; +private: + SDL_Window* window = nullptr; + SDL_Renderer* renderer = nullptr; +}; + + +#endif //RLA_IIPP_SDLRENDERER_HPP diff --git a/src/game/visualizer.cpp b/src/game/visualizer.cpp new file mode 100644 index 0000000..71724ff --- /dev/null +++ b/src/game/visualizer.cpp @@ -0,0 +1,32 @@ +// +// Created by m on 12/3/21. +// + +#include "visualizer.hpp" +#define TITLE "test" +#define WIN_WIDTH 800 +#define WIN_HEIGHT 600 +#define TARGET_FPS 60 +bool Visualizer::update() { + this->x += 1; + if(this->x > WIN_WIDTH) { + this->x = 0; + return true; + } + return false; +} + +RendererParams Visualizer::get_renderer_params() { + return {.title = TITLE, .width = WIN_WIDTH, .height = WIN_HEIGHT}; +} + +unsigned int Visualizer::get_framerate() { + return TARGET_FPS; +} + +void Visualizer::render(Renderer *renderer) { + Color color = Color(255, 255, 255, 255); + for(int y=0;ydraw_point(this->x, y, color); + } +} diff --git a/src/game/visualizer.hpp b/src/game/visualizer.hpp new file mode 100644 index 0000000..46e108a --- /dev/null +++ b/src/game/visualizer.hpp @@ -0,0 +1,24 @@ +// +// Created by m on 12/3/21. +// +#include "../engine/game/game.hpp" +#ifndef RLA_IIPP_VISUALIZER_HPP +#define RLA_IIPP_VISUALIZER_HPP + + +class Visualizer : public Game { +public: + bool update() override; + + void render(Renderer* renderer) override; + + RendererParams get_renderer_params() override; + + unsigned int get_framerate() override; + +private: + int x = 0; + +}; + +#endif //RLA_IIPP_VISUALIZER_HPP diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..6c8ea02 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,17 @@ +#include +#include +#include "engine/rendering/renderer.hpp" +#include "engine/rendering/sdl/sdlrenderer.hpp" +#include "engine/engine.hpp" +#include "game/visualizer.hpp" + +int main() { + const char* TITLE = "Test"; + + std::unique_ptr renderer = std::make_unique(); + std::unique_ptr game = std::make_unique(); + Engine* engine = new Engine(std::move(game), std::move(renderer)); + engine->start_loop(); + + return 0; +}