Chira Engine
A customizable MIT-licensed game engine.
BackendSDL.h
1 #pragma once
2 
3 #include <cstddef>
4 #include <string_view>
5 #include <vector>
6 #include <loader/image/Image.h>
7 #include <math/Color.h>
8 #include <math/Vertex.h>
9 #include "../RenderTypes.h"
10 
11 struct SDL_Window;
12 struct SDL_Renderer;
13 struct SDL_Texture;
14 
16 namespace chira::Renderer {
17 
18 struct TextureHandle {
19  unsigned int handle = 0;
20  SDL_Texture* texture = nullptr;
21 
22  TextureType type = TextureType::TWO_DIMENSIONAL;
23 
24  explicit inline operator bool() const { return handle; }
25  inline bool operator!() const { return !handle; }
26 };
27 
28 struct FrameBufferHandle {
29  SDL_Texture* texture = nullptr;
30  unsigned int colorHandle = 0;
31 
32  bool hasDepth = true;
33  int width = -1;
34  int height = -1;
35 
36  explicit inline operator bool() const { return texture; }
37  inline bool operator!() const { return !texture; }
38 };
39 
40 struct ShaderModuleHandle {
41  int handle = 0;
42 
43  explicit inline operator bool() const { return handle; }
44  inline bool operator!() const { return !handle; }
45 };
46 
47 struct ShaderHandle {
48  int handle = 0;
49  ShaderModuleHandle vertex{};
50  ShaderModuleHandle fragment{};
51 
52  explicit inline operator bool() const { return handle && vertex && fragment; }
53  inline bool operator!() const { return !handle || !vertex || !fragment; }
54 };
55 
56 struct UniformBufferHandle {
57  unsigned int handle = 0;
58  unsigned int bindingPoint = 0;
59 
60  explicit inline operator bool() const { return handle; }
61  inline bool operator!() const { return !handle; }
62 };
63 
64 struct MeshHandle {
65  std::vector<Vertex> vertices;
66  std::vector<int> indices;
67  int numIndices = 0;
68  int numVertices = 0;
69 
70  explicit inline operator bool() const { return numIndices; }
71  inline bool operator!() const { return !numIndices; }
72 };
73 
74 [[nodiscard]] std::string_view getHumanName();
75 [[nodiscard]] bool setupForDebugging();
76 
77 void setClearColor(ColorRGBA color);
78 
79 [[nodiscard]] TextureHandle createTexture2D(const Image& image, WrapMode wrapS, WrapMode wrapT, FilterMode filter,
80  bool genMipmaps, TextureUnit activeTextureUnit);
81 [[nodiscard]] TextureHandle createTextureCubemap(const Image& imageRT, const Image& imageLT, const Image& imageUP,
82  const Image& imageDN, const Image& imageFD, const Image& imageBK,
83  WrapMode wrapS, WrapMode wrapT, WrapMode wrapR, FilterMode filter,
84  bool genMipmaps, TextureUnit activeTextureUnit);
85 void useTexture(TextureHandle handle, TextureUnit activeTextureUnit);
86 [[nodiscard]] void* getImGuiTextureHandle(TextureHandle handle);
87 void destroyTexture(TextureHandle handle);
88 
89 [[nodiscard]] FrameBufferHandle createFrameBuffer(int width, int height, WrapMode wrapS, WrapMode wrapT, FilterMode filter, bool hasDepth);
90 void recreateFrameBuffer(Renderer::FrameBufferHandle* handle, int width, int height, WrapMode wrapS, WrapMode wrapT, FilterMode filter, bool hasDepth);
91 void pushFrameBuffer(FrameBufferHandle handle);
92 void popFrameBuffer();
93 void useFrameBufferTexture(const FrameBufferHandle handle, TextureUnit activeTextureUnit);
94 [[nodiscard]] void* getImGuiFrameBufferHandle(FrameBufferHandle handle);
95 void destroyFrameBuffer(FrameBufferHandle handle);
96 [[nodiscard]] int getFrameBufferWidth(FrameBufferHandle handle);
97 [[nodiscard]] int getFrameBufferHeight(FrameBufferHandle handle);
98 
99 [[nodiscard]] ShaderHandle createShader(std::string_view vertex, std::string_view fragment);
100 void useShader(ShaderHandle handle);
101 void destroyShader(ShaderHandle handle);
102 
103 void setShaderUniform1b(ShaderHandle handle, std::string_view name, bool value);
104 void setShaderUniform1u(ShaderHandle handle, std::string_view name, unsigned int value);
105 void setShaderUniform1i(ShaderHandle handle, std::string_view name, int value);
106 void setShaderUniform1f(ShaderHandle handle, std::string_view name, float value);
107 void setShaderUniform2b(ShaderHandle handle, std::string_view name, glm::vec2b value);
108 void setShaderUniform2u(ShaderHandle handle, std::string_view name, glm::vec2u value);
109 void setShaderUniform2i(ShaderHandle handle, std::string_view name, glm::vec2i value);
110 void setShaderUniform2f(ShaderHandle handle, std::string_view name, glm::vec2f value);
111 void setShaderUniform3b(ShaderHandle handle, std::string_view name, glm::vec3b value);
112 void setShaderUniform3u(ShaderHandle handle, std::string_view name, glm::vec3u value);
113 void setShaderUniform3i(ShaderHandle handle, std::string_view name, glm::vec3i value);
114 void setShaderUniform3f(ShaderHandle handle, std::string_view name, glm::vec3f value);
115 void setShaderUniform4b(ShaderHandle handle, std::string_view name, glm::vec4b value);
116 void setShaderUniform4u(ShaderHandle handle, std::string_view name, glm::vec4u value);
117 void setShaderUniform4i(ShaderHandle handle, std::string_view name, glm::vec4i value);
118 void setShaderUniform4f(ShaderHandle handle, std::string_view name, glm::vec4f value);
119 void setShaderUniform4m(ShaderHandle handle, std::string_view name, glm::mat4 value);
120 
121 [[nodiscard]] UniformBufferHandle createUniformBuffer(std::ptrdiff_t size);
122 void bindUniformBufferToShader(ShaderHandle shaderHandle, UniformBufferHandle uniformBufferHandle, std::string_view name);
123 void updateUniformBuffer(UniformBufferHandle handle, const void* buffer, std::ptrdiff_t length);
124 void updateUniformBufferPart(UniformBufferHandle handle, std::ptrdiff_t start, const void* buffer, std::ptrdiff_t length);
125 void destroyUniformBuffer(UniformBufferHandle handle);
126 
127 [[nodiscard]] MeshHandle createMesh(const std::vector<Vertex>& vertices, const std::vector<Index>& indices, MeshDrawMode drawMode);
128 void updateMesh(MeshHandle* handle, const std::vector<Vertex>& vertices, const std::vector<Index>& indices, MeshDrawMode drawMode);
129 void drawMesh(MeshHandle handle, MeshDepthFunction depthFunction, MeshCullType cullType);
130 void destroyMesh(MeshHandle handle);
131 
132 void initImGui(SDL_Window* window, SDL_Renderer* renderer);
133 void startImGuiFrame();
134 void endImGuiFrame();
135 void destroyImGui();
136 
137 } // namespace chira::Renderer
OpenGL render backend.
Definition: BackendGL.h:14