From 1e12c7b278e0c7c689a219e9120342218d4c0837 Mon Sep 17 00:00:00 2001
From: Tomas Vybiral <tomas@vybiral.me>
Date: Tue, 8 Dec 2020 22:07:12 +0100
Subject: [PATCH] added rendering

---
 cmake/StaticAnalyzers.cmake             |  4 +--
 src/game/CMakeLists.txt                 |  2 ++
 src/game/game.cpp                       |  6 ++++
 src/game/game.h                         |  3 ++
 src/game/renderer/CMakeLists.txt        | 13 +++++++++
 src/game/renderer/abstract_renderer.cpp |  1 +
 src/game/renderer/abstract_renderer.h   | 12 ++++++++
 src/game/renderer/sdl_renderer.cpp      | 37 +++++++++++++++++++++++++
 src/game/renderer/sdl_renderer.h        | 24 ++++++++++++++++
 src/game/state/CMakeLists.txt           |  2 ++
 10 files changed, 102 insertions(+), 2 deletions(-)
 create mode 100644 src/game/renderer/CMakeLists.txt
 create mode 100644 src/game/renderer/abstract_renderer.cpp
 create mode 100644 src/game/renderer/abstract_renderer.h
 create mode 100644 src/game/renderer/sdl_renderer.cpp
 create mode 100644 src/game/renderer/sdl_renderer.h

diff --git a/cmake/StaticAnalyzers.cmake b/cmake/StaticAnalyzers.cmake
index ca136aa..4396444 100644
--- a/cmake/StaticAnalyzers.cmake
+++ b/cmake/StaticAnalyzers.cmake
@@ -1,5 +1,5 @@
-option(ENABLE_CPPCHECK "Enable static analysis with cppcheck" ON)
-option(ENABLE_CLANG_TIDY "Enable static analysis with clang-tidy" ON)
+option(ENABLE_CPPCHECK "Enable static analysis with cppcheck" OFF)
+option(ENABLE_CLANG_TIDY "Enable static analysis with clang-tidy" OFF)
 option(ENABLE_INCLUDE_WHAT_YOU_USE "Enable static analysis with include-what-you-use" OFF)
 
 if(ENABLE_CPPCHECK)
diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt
index 05287a7..ee9fdec 100644
--- a/src/game/CMakeLists.txt
+++ b/src/game/CMakeLists.txt
@@ -1,5 +1,6 @@
 add_subdirectory(state)
 add_subdirectory(input)
+add_subdirectory(renderer)
 
 add_library(game
             game.h game.cpp)
@@ -11,4 +12,5 @@ target_link_libraries(game
     CONAN_PKG::spdlog
     state
     input
+    renderer
 )
\ No newline at end of file
diff --git a/src/game/game.cpp b/src/game/game.cpp
index e55f090..476163a 100644
--- a/src/game/game.cpp
+++ b/src/game/game.cpp
@@ -2,16 +2,19 @@
 
 #include "spdlog/spdlog.h"
 #include "input/sdl_input.h"
+#include "renderer/sdl_renderer.h"
 
 #include <variant>
 
 game::game(uint32_t fps):current_state(),
                          input_processor(nullptr),
+                         renderer(nullptr),
                          player_position_delta(0),
                          player_angle_delta(0.0),
                          delta_time(1.0 / static_cast<double>(fps)),
                          is_running(false) {
     input_processor = new sdl_input();
+    renderer = new sdl_renderer();
     spdlog::get("game")->debug("Fps set to: {} and delta_time set to: {}", fps, delta_time);
     spdlog::get("game")->info("Finished game component initialization.");
 }
@@ -20,6 +23,9 @@ game::~game() {
     spdlog::get("game")->debug("Deleting allocated resources");
     if (!input_processor)
         delete input_processor;
+    if (!renderer) {
+        delete renderer;
+    }
 }
 
 void game::run_loop() {
diff --git a/src/game/game.h b/src/game/game.h
index b9028d6..a58fe95 100644
--- a/src/game/game.h
+++ b/src/game/game.h
@@ -6,6 +6,7 @@
 
 #include "state/state.h"
 #include "input/abstract_input.h"
+#include "renderer/abstract_renderer.h"
 
 /**
  * Basic game structure - behaves like controler in MVC schema.
@@ -32,6 +33,8 @@ protected:
     state current_state;
     /// Current input processor
     abstract_input* input_processor;
+    /// Current game renderer
+    abstract_renderer* renderer;
     /// Player position is updated every second by this value
     uint32_t player_position_delta;
     /// Player angle is updated every second by this value
diff --git a/src/game/renderer/CMakeLists.txt b/src/game/renderer/CMakeLists.txt
new file mode 100644
index 0000000..827c7b5
--- /dev/null
+++ b/src/game/renderer/CMakeLists.txt
@@ -0,0 +1,13 @@
+add_library(renderer
+    abstract_renderer.h abstract_renderer.cpp
+    sdl_renderer.h sdl_renderer.cpp)
+
+target_link_libraries(input
+    PUBLIC
+    project_options
+    project_warnings
+    CONAN_PKG::spdlog
+    ${SDL2_LIBRARY}
+    ${SDL2_IMAGE_LIBRARY}
+    ${SDL2_TTF_LIBRARY}
+    state)
\ No newline at end of file
diff --git a/src/game/renderer/abstract_renderer.cpp b/src/game/renderer/abstract_renderer.cpp
new file mode 100644
index 0000000..d377f27
--- /dev/null
+++ b/src/game/renderer/abstract_renderer.cpp
@@ -0,0 +1 @@
+#include "abstract_renderer.h"
\ No newline at end of file
diff --git a/src/game/renderer/abstract_renderer.h b/src/game/renderer/abstract_renderer.h
new file mode 100644
index 0000000..94d6912
--- /dev/null
+++ b/src/game/renderer/abstract_renderer.h
@@ -0,0 +1,12 @@
+#ifndef ABSTRACT_RENDERER_H
+#define ABSTRACT_RENDERER_H
+
+#include "../state/state.h"
+
+class abstract_renderer{
+public:
+    virtual ~abstract_renderer() {}
+    virtual void render_state(const state& current_state) = 0;
+};
+
+#endif//ABSTRACT_RENDERER_H
\ No newline at end of file
diff --git a/src/game/renderer/sdl_renderer.cpp b/src/game/renderer/sdl_renderer.cpp
new file mode 100644
index 0000000..e0dec3e
--- /dev/null
+++ b/src/game/renderer/sdl_renderer.cpp
@@ -0,0 +1,37 @@
+#include "sdl_renderer.h"
+
+#include <SDL2/SDL.h>
+
+#include <stdexcept>
+
+sdl_renderer::sdl_renderer() {
+    SDL_Init(SDL_INIT_VIDEO);
+    window = SDL_CreateWindow("Window NAME - Replace me",
+                              SDL_WINDOWPOS_CENTERED,
+                              SDL_WINDOWPOS_CENTERED,
+                              640, 480, 0);
+    if (window == nullptr) {
+        throw std::runtime_error(SDL_GetError());
+    }
+
+    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
+    if (renderer == nullptr) {
+        throw std::runtime_error(SDL_GetError());
+    }
+
+    SDL_SetRenderDrawColor(renderer, 100, 100, 100, 0);
+    SDL_Rect screen{0, 0, 640, 480};
+    SDL_RenderFillRect(renderer, &screen);
+}
+
+sdl_renderer::~sdl_renderer() {
+    if (renderer != nullptr)
+        SDL_DestroyRenderer(renderer);
+    if (window != nullptr)
+        SDL_DestroyWindow(window);
+    SDL_QuitSubSystem(SDL_INIT_VIDEO);
+}
+
+void sdl_renderer::render_state(const state& cs) {
+
+}
\ No newline at end of file
diff --git a/src/game/renderer/sdl_renderer.h b/src/game/renderer/sdl_renderer.h
new file mode 100644
index 0000000..a4df68f
--- /dev/null
+++ b/src/game/renderer/sdl_renderer.h
@@ -0,0 +1,24 @@
+#ifndef SDL_RENDERER_H
+#define SDL_RENDERER_H
+
+#include <SDL2/SDL.h>
+
+#include "abstract_renderer.h"
+
+/// Game renderer class. Using SDL2 to render game
+class sdl_renderer: public abstract_renderer {
+public:
+    /// Default contructor (initializes SDL, window, renderer and loads texture into memory)
+    sdl_renderer();
+    /// Closes window and deintializes sdl video module
+    virtual ~sdl_renderer();
+
+    /// Renders passed state to created window
+    void render_state(const state& current_state) override;
+protected:
+    /// SDL window struct
+    SDL_Window* window;
+    SDL_Renderer* renderer;
+};
+
+#endif//SDL_RENDERER_H
\ No newline at end of file
diff --git a/src/game/state/CMakeLists.txt b/src/game/state/CMakeLists.txt
index 469a40a..38db7a0 100644
--- a/src/game/state/CMakeLists.txt
+++ b/src/game/state/CMakeLists.txt
@@ -2,6 +2,8 @@ add_library(state
             state.h state.cpp
             shooter.h shooter.cpp)
 
+target_include_directories(state PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
+
 target_link_libraries(state
     PRIVATE
     project_options
-- 
GitLab