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