aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/facade
diff options
context:
space:
mode:
authorheavydemon21 <nielsstunnebrink1@gmail.com>2024-10-08 15:43:45 +0200
committerheavydemon21 <nielsstunnebrink1@gmail.com>2024-10-08 15:43:45 +0200
commitafdd12277a43d3ad7755f028e85c569dece84f0b (patch)
tree1b619bbd2c95cb676c53f2410a94dd16b5fb54fe /src/crepe/facade
parent035444c1b7ee2e76c235e16eafd6115e849eec73 (diff)
rendering system
Diffstat (limited to 'src/crepe/facade')
-rw-r--r--src/crepe/facade/SdlContext.cpp145
-rw-r--r--src/crepe/facade/SdlContext.h19
-rw-r--r--src/crepe/facade/Texture.cpp6
-rw-r--r--src/crepe/facade/Texture.h8
4 files changed, 98 insertions, 80 deletions
diff --git a/src/crepe/facade/SdlContext.cpp b/src/crepe/facade/SdlContext.cpp
index 7e2d79f..b2043e5 100644
--- a/src/crepe/facade/SdlContext.cpp
+++ b/src/crepe/facade/SdlContext.cpp
@@ -2,54 +2,88 @@
#include "SdlContext.h"
#include "SDL_rect.h"
-#include "api/spritesheet.h"
+#include "api/Sprite.h"
+#include "api/Transform.h"
#include "facade/Texture.h"
#include "util/log.h"
#include <SDL2/SDL.h>
+#include <SDL2/SDL_image.h>
#include <SDL2/SDL_render.h>
#include <SDL2/SDL_surface.h>
#include <SDL2/SDL_video.h>
-#include <SDL2/SDL_image.h>
+#include <cstddef>
#include <iostream>
-#include <iterator>
#include <ostream>
using namespace crepe;
-
-SdlContext& SdlContext::get_instance(){
+SdlContext & SdlContext::get_instance() {
static SdlContext instance;
return instance;
}
+void SdlContext::handleEvents(bool & running) {
+ SDL_Event event;
+ while (SDL_PollEvent(&event)) {
+ if (event.type == SDL_QUIT) {
+ running = false;
+ }
+ }
+}
+void SdlContext::clearScreen() { SDL_RenderClear(this->m_game_renderer); }
+
+void SdlContext::presentScreen() { SDL_RenderPresent(this->m_game_renderer); }
-SdlContext::SdlContext(){
- if (SDL_Init(SDL_INIT_VIDEO) < 0) {
- std::cerr << "SDL could not initialize! SDL_Error: " << SDL_GetError() << std::endl;
- return;
- }
+void SdlContext::draw(const api::Sprite & sprite, const api::Transform& transform) {
+ static SDL_RendererFlip renderFlip
+ = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * sprite.flip.flipX)
+ | (SDL_FLIP_VERTICAL * sprite.flip.flipY));
- m_game_window = SDL_CreateWindow("Crepe Game Engine", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN);
- if (!m_game_window) {
- std::cerr << "Window could not be created! SDL_Error: " << SDL_GetError() << std::endl;
- }
+ // needs maybe camera for position
+ static SDL_Rect dstrect = {
+ .x = static_cast<int>(transform.position.x),
+ .y = static_cast<int>(transform.position.y),
+ .w = static_cast<int>(sprite.sprite_image->get_rect().w * transform.scale),
+ .h = static_cast<int>(sprite.sprite_image->get_rect().h * transform.scale),
+ };
- m_game_renderer = SDL_CreateRenderer(m_game_window, -1, SDL_RENDERER_ACCELERATED);
- if (!m_game_renderer) {
- std::cerr << "Renderer could not be created! SDL_Error: " << SDL_GetError() << std::endl;
+ SDL_RenderCopyEx(this->m_game_renderer, sprite.sprite_image->get_texture(),
+ &sprite.sprite_image->get_rect(), &dstrect, 0, NULL, renderFlip);
+}
+
+SdlContext::SdlContext() {
+ if (SDL_Init(SDL_INIT_VIDEO) < 0) {
+ std::cerr << "SDL could not initialize! SDL_Error: " << SDL_GetError()
+ << std::endl;
+ return;
+ }
+
+ m_game_window
+ = SDL_CreateWindow("Crepe Game Engine", SDL_WINDOWPOS_CENTERED,
+ SDL_WINDOWPOS_CENTERED, 1920, 1080, SDL_WINDOW_SHOWN);
+ if (!m_game_window) {
+ std::cerr << "Window could not be created! SDL_Error: "
+ << SDL_GetError() << std::endl;
+ }
+
+ m_game_renderer
+ = SDL_CreateRenderer(m_game_window, -1, SDL_RENDERER_ACCELERATED);
+ if (!m_game_renderer) {
+ std::cerr << "Renderer could not be created! SDL_Error: "
+ << SDL_GetError() << std::endl;
SDL_DestroyWindow(m_game_window);
- return;
- }
- int imgFlags = IMG_INIT_PNG;
- if( !( IMG_Init( imgFlags ) & imgFlags ) )
- {
- std::cout << "SDL_image could not initialize! SDL_image Error: " << IMG_GetError() << std::endl;
- }
+ return;
+ }
+ int imgFlags = IMG_INIT_PNG;
+ if (!(IMG_Init(imgFlags) & imgFlags)) {
+ std::cout << "SDL_image could not initialize! SDL_image Error: "
+ << IMG_GetError() << std::endl;
+ }
+ SDL_SetHint(SDL_HINT_RENDER_BATCHING, "1");
}
-SdlContext::~SdlContext(){
- if(m_game_renderer)
- SDL_DestroyRenderer(m_game_renderer);
+SdlContext::~SdlContext() {
+ if (m_game_renderer) SDL_DestroyRenderer(m_game_renderer);
if (m_game_window) {
SDL_DestroyWindow(m_game_window);
@@ -58,69 +92,46 @@ SdlContext::~SdlContext(){
SDL_Quit();
}
-SDL_Texture* SdlContext::setTextureFromPath(const char* path, SDL_Rect& clip, const int row, const int col){
+SDL_Texture * SdlContext::setTextureFromPath(const char * path, SDL_Rect & clip,
+ const int row, const int col) {
dbg_trace();
-
- SDL_Surface* tmp = IMG_Load(path);
+
+ SDL_Surface * tmp = IMG_Load(path);
if (!tmp) {
std::cerr << "Error surface " << IMG_GetError << std::endl;
}
- clip.w = tmp->w / col;
- clip.h = tmp->h / row;
+ clip.w = tmp->w / col;
+ clip.h = tmp->h / row;
- SDL_Texture* CreatedTexture = SDL_CreateTextureFromSurface(m_game_renderer, tmp);
+ SDL_Texture * CreatedTexture
+ = SDL_CreateTextureFromSurface(m_game_renderer, tmp);
if (!CreatedTexture) {
- std::cerr << "Error could not create texture " << IMG_GetError << std::endl;
+ std::cerr << "Error could not create texture " << IMG_GetError
+ << std::endl;
}
SDL_FreeSurface(tmp);
return CreatedTexture;
}
-SDL_Texture* SdlContext::setTextureFromPath(const char* path){
+SDL_Texture * SdlContext::setTextureFromPath(const char * path) {
dbg_trace();
-
- SDL_Surface* tmp = IMG_Load(path);
+
+ SDL_Surface * tmp = IMG_Load(path);
if (!tmp) {
std::cerr << "Error surface " << IMG_GetError << std::endl;
}
- SDL_Texture* CreatedTexture = SDL_CreateTextureFromSurface(m_game_renderer, tmp);
+ SDL_Texture * CreatedTexture
+ = SDL_CreateTextureFromSurface(m_game_renderer, tmp);
if (!CreatedTexture) {
- std::cerr << "Error could not create texture " << IMG_GetError << std::endl;
+ std::cerr << "Error could not create texture " << IMG_GetError
+ << std::endl;
}
SDL_FreeSurface(tmp);
return CreatedTexture;
}
-
-void SdlContext::loop(const Texture& texture, api::Spritesheet& ss){
- SDL_RenderClear(m_game_renderer);
- bool quit = false;
- SDL_Event event;
-
- while (!quit) {
- Uint32 ticks = SDL_GetTicks();
- int sprite = (ticks / 100) % 4;
- ss.select_sprite(sprite, 0);
-
- while (SDL_PollEvent(&event) != NULL) {
- switch (event.type) {
- case SDL_QUIT:
- quit = true;
- break;
- }
-
- }
-
- SDL_RenderClear(m_game_renderer);
- SDL_RenderCopy(m_game_renderer, texture.get_texture(), NULL, NULL);
- ss.draw_selected_sprite(10, 10);
- SDL_RenderPresent(m_game_renderer);
- }
-}
-
-
diff --git a/src/crepe/facade/SdlContext.h b/src/crepe/facade/SdlContext.h
index 329a374..c8f1304 100644
--- a/src/crepe/facade/SdlContext.h
+++ b/src/crepe/facade/SdlContext.h
@@ -1,23 +1,28 @@
#pragma once
#include "SDL_rect.h"
-#include "Texture.h"
-#include "api/spritesheet.h"
+#include "api/Sprite.h"
+#include "api/Transform.h"
#include <SDL2/SDL_render.h>
#include <SDL2/SDL_video.h>
namespace crepe {
-class Texture;
-class Spritesheet;
class SdlContext {
public:
- void loop(const Texture& , api::Spritesheet&);
+
+ void handleEvents(bool& running);
+ void clearScreen();
+ void presentScreen();
+ void draw(const api::Sprite&, const api::Transform&);
// singleton
static SdlContext & get_instance();
+ SDL_Texture* setTextureFromPath(const char*);
+ SDL_Texture* setTextureFromPath(const char*, SDL_Rect& clip, const int row, const int col);
+
private:
SdlContext();
virtual ~SdlContext();
@@ -27,12 +32,8 @@ private:
SdlContext & operator=(const SdlContext &) = delete;
SdlContext & operator=(SdlContext &&) = delete;
- SDL_Texture* setTextureFromPath(const char*);
- SDL_Texture* setTextureFromPath(const char*, SDL_Rect& clip, const int row, const int col);
private:
- friend class Texture;
- friend class api::Spritesheet;
SDL_Window* m_game_window;
SDL_Renderer* m_game_renderer;
diff --git a/src/crepe/facade/Texture.cpp b/src/crepe/facade/Texture.cpp
index 220ef2e..b4e3aa8 100644
--- a/src/crepe/facade/Texture.cpp
+++ b/src/crepe/facade/Texture.cpp
@@ -27,9 +27,13 @@ Texture::~Texture(){
void Texture::load(std::unique_ptr<api::Resource> res) {
dbg_trace();
SdlContext& ctx = SdlContext::get_instance();
- m_texture = ctx.setTextureFromPath(res->canonical());
+ m_texture = ctx.setTextureFromPath(res->canonical(), srcrect, 1, 1);
}
SDL_Texture* Texture::get_texture() const{
return m_texture;
}
+
+SDL_Rect& Texture::get_rect() {
+ return srcrect;
+}
diff --git a/src/crepe/facade/Texture.h b/src/crepe/facade/Texture.h
index a5fcca9..db2f1f9 100644
--- a/src/crepe/facade/Texture.h
+++ b/src/crepe/facade/Texture.h
@@ -1,13 +1,15 @@
#pragma once
+#include "SDL_rect.h"
#include "api/baseResource.h"
-#include "facade/SdlContext.h"
#include "api/Resource.h"
#include <SDL2/SDL_render.h>
#include <memory>
namespace crepe {
+
+
class Texture : public api::BaseResource{
public:
@@ -16,13 +18,13 @@ public:
~Texture();
SDL_Texture* get_texture() const;
+ SDL_Rect& get_rect() ;
private:
void load(std::unique_ptr<api::Resource> res);
private:
SDL_Texture* m_texture;
-
- friend class SdlContext;
+ SDL_Rect srcrect;
};
} // namespace crepe