Conquer Space 0.0.0
A space themed grand strategy game set in the near future, with realistic orbital mechanics, and an emphasis on economics and politics.
framebuffer.h
Go to the documentation of this file.
1/* Conquer Space
2 * Copyright (C) 2021-2025 Conquer Space
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17#pragma once
18
19#include <glad/glad.h>
20
21#include <memory>
22#include <utility>
23#include <vector>
24
26#include "engine/window.h"
27
28namespace cqsp::engine {
29void GenerateFrameBuffer(unsigned int& framebuffer);
30
35 public:
36 virtual ~IFramebuffer() {}
37
38 virtual void InitTexture(int width = 1280, int height = 720) = 0;
39 virtual void Clear() = 0;
40 virtual void BeginDraw() = 0;
41 virtual void EndDraw() = 0;
42 virtual void RenderBuffer() = 0;
43 virtual void Free() = 0;
44 virtual void NewFrame(const Window& window) = 0;
45
46 virtual Mesh& GetMeshOutput() = 0;
47 virtual void SetMesh(Mesh_t) = 0;
48 virtual void SetShader(asset::ShaderProgram_t shader) = 0;
49};
50
52 public:
55
56 void InitTexture(int width, int height) override;
57 void Clear() override;
58 void BeginDraw() override;
59 void EndDraw() override;
60 void RenderBuffer() override;
61 void Free() override;
62 void NewFrame(const Window& window) override;
63 void SetMesh(Mesh_t mesh) override { mesh_output = mesh; }
64 Mesh& GetMeshOutput() override { return *mesh_output; }
65 void SetShader(asset::ShaderProgram_t shader) override { buffer_shader = shader; }
66 void FreeBuffer();
67
68 private:
69 unsigned int framebuffer;
70 unsigned int colorbuffer;
71 unsigned int rbo;
72 int width;
73 int height;
76};
77
79 public:
83
84 void InitTexture(int width, int height) override;
85 void Clear() override;
86 void BeginDraw() override;
87 void EndDraw() override;
88 void Free() override;
89 void RenderBuffer() override;
90 void NewFrame(const Window& window) override;
91 void FreeBuffer();
92
93 engine::Mesh& GetMeshOutput() override { return *mesh_output; }
94 void SetMesh(engine::Mesh_t mesh) override { mesh_output = mesh; }
95 void SetShader(asset::ShaderProgram_t shader) override { buffer_shader = shader; }
96
97 private:
98 int width;
99 int height;
100
101 unsigned int framebuffer;
102 unsigned int intermediateFBO;
103 unsigned int screenTexture;
104 unsigned int mscat;
105 unsigned int rbo;
108};
109
142 public:
144 template <class T>
146 std::unique_ptr<T> fb = std::make_unique<T>();
147 InitFramebuffer(fb.get(), shader, window);
148 framebuffers.push_back(std::move(fb));
149 return framebuffers.size() - 1;
150 }
151
152 void BeginDraw(int layer);
153 void EndDraw(int layer);
154 void DrawAllLayers();
156 int GetLayerCount();
157
158 IFramebuffer* GetFrameBuffer(int layer) { return framebuffers[layer].get(); }
159
160 private:
162 unsigned int blend_dest_factor;
163 std::vector<std::unique_ptr<IFramebuffer>> framebuffers;
165};
166
167const char* FramebufferStatusToString(GLenum error);
168} // namespace cqsp::engine
Definition: framebuffer.h:78
unsigned int screenTexture
Definition: framebuffer.h:103
void SetShader(asset::ShaderProgram_t shader) override
Definition: framebuffer.h:95
AAFrameBufferRenderer()
Definition: framebuffer.h:80
void BeginDraw() override
Definition: framebuffer.cpp:181
void FreeBuffer()
Definition: framebuffer.cpp:190
void Clear() override
Definition: framebuffer.cpp:174
engine::Mesh & GetMeshOutput() override
Definition: framebuffer.h:93
Mesh_t mesh_output
Definition: framebuffer.h:107
void EndDraw() override
Definition: framebuffer.cpp:186
unsigned int rbo
Definition: framebuffer.h:105
void InitTexture(int width, int height) override
Definition: framebuffer.cpp:130
int width
Definition: framebuffer.h:98
void SetMesh(engine::Mesh_t mesh) override
Definition: framebuffer.h:94
int height
Definition: framebuffer.h:99
unsigned int framebuffer
Definition: framebuffer.h:101
unsigned int intermediateFBO
Definition: framebuffer.h:102
void RenderBuffer() override
Definition: framebuffer.cpp:203
asset::ShaderProgram_t buffer_shader
Definition: framebuffer.h:106
void NewFrame(const Window &window) override
Definition: framebuffer.cpp:220
void Free() override
Definition: framebuffer.cpp:188
unsigned int mscat
Definition: framebuffer.h:104
~AAFrameBufferRenderer()
Definition: framebuffer.cpp:128
Definition: framebuffer.h:51
asset::ShaderProgram_t buffer_shader
Definition: framebuffer.h:74
int width
Definition: framebuffer.h:72
void SetMesh(Mesh_t mesh) override
Definition: framebuffer.h:63
FramebufferRenderer()
Definition: framebuffer.h:53
void Clear() override
Definition: framebuffer.cpp:74
void SetShader(asset::ShaderProgram_t shader) override
Definition: framebuffer.h:65
void BeginDraw() override
Definition: framebuffer.cpp:79
engine::Mesh_t mesh_output
Definition: framebuffer.h:75
void EndDraw() override
Definition: framebuffer.cpp:84
void FreeBuffer()
Definition: framebuffer.cpp:105
Mesh & GetMeshOutput() override
Definition: framebuffer.h:64
unsigned int rbo
Definition: framebuffer.h:71
void Free() override
Definition: framebuffer.cpp:103
void RenderBuffer() override
Definition: framebuffer.cpp:92
unsigned int colorbuffer
Definition: framebuffer.h:70
void InitTexture(int width, int height) override
Definition: framebuffer.cpp:46
void NewFrame(const Window &window) override
Definition: framebuffer.cpp:114
unsigned int framebuffer
Definition: framebuffer.h:69
~FramebufferRenderer()
Definition: framebuffer.cpp:44
int height
Definition: framebuffer.h:73
Interface for framebuffer renderers.
Definition: framebuffer.h:34
virtual void InitTexture(int width=1280, int height=720)=0
virtual void BeginDraw()=0
virtual void RenderBuffer()=0
virtual void SetShader(asset::ShaderProgram_t shader)=0
virtual Mesh & GetMeshOutput()=0
virtual void Clear()=0
virtual ~IFramebuffer()
Definition: framebuffer.h:36
virtual void EndDraw()=0
virtual void SetMesh(Mesh_t)=0
virtual void NewFrame(const Window &window)=0
Renders a series of framebuffers onto screen. This is a relatively simple way of allowing organizatio...
Definition: framebuffer.h:141
void EndDraw(int layer)
Definition: framebuffer.cpp:237
unsigned int blend_source_factor
Definition: framebuffer.h:161
LayerRenderer()
Definition: framebuffer.cpp:233
int AddLayer(asset::ShaderProgram_t shader, const engine::Window &window)
Definition: framebuffer.h:145
void InitFramebuffer(IFramebuffer *buffer, cqsp::asset::ShaderProgram_t shader, const cqsp::engine::Window &window)
Definition: framebuffer.cpp:262
unsigned int blend_dest_factor
Definition: framebuffer.h:162
void NewFrame(const cqsp::engine::Window &window)
Definition: framebuffer.cpp:253
void BeginDraw(int layer)
Definition: framebuffer.cpp:235
int GetLayerCount()
Definition: framebuffer.cpp:260
std::vector< std::unique_ptr< IFramebuffer > > framebuffers
Definition: framebuffer.h:163
void DrawAllLayers()
Definition: framebuffer.cpp:239
IFramebuffer * GetFrameBuffer(int layer)
Definition: framebuffer.h:158
Definition: mesh.h:24
The window handles the initialization of the callbacks, and all the input and output....
Definition: window.h:24
std::shared_ptr< ShaderProgram > ShaderProgram_t
The preferred way of using a shader program.
Definition: shader.h:113
Definition: application.cpp:56
const char * FramebufferStatusToString(GLenum error)
Definition: framebuffer.cpp:269
void GenerateFrameBuffer(unsigned int &framebuffer)
Definition: framebuffer.cpp:39
std::shared_ptr< Mesh > Mesh_t
Definition: mesh.h:43
GLFWwindow * window(Window *window)
Definition: application.cpp:61