2.0
[tar-legacy.git] / MCDV / main2.cpp
1 #include "globals.h"
2 #include "vmf_new.hpp"
3
4 #ifdef entry_point_testing
5
6 #include <glad\glad.h>
7 #include <GLFW\glfw3.h>
8
9 #include <glm\glm.hpp>
10 #include <glm\gtc\matrix_transform.hpp>
11 #include <glm\gtc\type_ptr.hpp>
12
13 #include <iostream>
14 #include <vector>
15
16 #include "GBuffer.hpp"
17 #include "Shader.hpp"
18 #include "Mesh.hpp"
19 #include "Texture.hpp"
20 #include "GradientMap.hpp"
21 #include "SSAOKernel.hpp"
22 #include "tar_config.hpp"
23
24 std::string m_game_path = "D:/SteamLibrary/steamapps/common/Counter-Strike Global Offensive/csgo";
25
26 void render_config(tar_config_layer layer);
27
28 glm::mat4 g_mat4_viewm;
29 glm::mat4 g_mat4_projm;
30
31 Shader* g_shader_gBuffer;
32 Shader* g_shader_iBuffer;
33 Shader* g_shader_comp;
34
35 GBuffer* g_gbuffer;
36 GBuffer* g_gbuffer_clean;
37 MBuffer* g_mask_playspace;
38 MBuffer* g_mask_buyzone;
39 MBuffer* g_mask_objectives;
40
41 vmf* g_vmf_file;
42 tar_config* g_tar_config;
43 BoundingBox g_vmf_info_bounds;
44
45 Mesh* g_mesh_screen_quad;
46 Texture* g_texture_background;
47 Texture* g_texture_modulate;
48 std::vector<glm::vec3> g_ssao_samples;
49 Texture* g_ssao_rotations;
50
51 int main(){
52 #pragma region opengl_setup
53 glfwInit();
54 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
55 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
56 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
57 glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
58
59 //glfwWindowHint(GLFW_VISIBLE, GL_FALSE);
60
61 GLFWwindow* window = glfwCreateWindow(1024, 1024, "Ceci n'est pas une window", NULL, NULL);
62
63 if (window == NULL) {
64 printf("GLFW died\n");
65 glfwTerminate();
66 return -1;
67 }
68
69 glfwMakeContextCurrent(window);
70
71 // Deal with GLAD
72 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
73 printf("GLAD died\n");
74 return -1;
75 }
76
77 const unsigned char* glver = glGetString(GL_VERSION);
78 printf("(required: min core 3.3.0) opengl version: %s\n", glver);
79 #pragma endregion
80
81 vfilesys* filesys = new vfilesys(m_game_path + "/gameinfo.txt");
82
83 vmf::LinkVFileSystem(filesys);
84 g_vmf_file = vmf::from_file("sample_stuff/de_tavr_test.vmf");
85 g_vmf_file->InitModelDict();
86 g_tar_config = new tar_config(g_vmf_file);
87 g_vmf_info_bounds = g_vmf_file->getVisgroupBounds(g_tar_config->m_visgroup_layout);
88
89 #pragma region opengl_extra
90
91 std::vector<float> __meshData = {
92 -1, -1,
93 -1, 1,
94 1, -1,
95 -1, 1,
96 1, 1,
97 1, -1
98 };
99 g_mesh_screen_quad = new Mesh(__meshData, MeshMode::SCREEN_SPACE_UV);
100
101 // Set up shaders
102 g_shader_gBuffer = new Shader("shaders/gBuffer.vs", "shaders/gBuffer.fs");
103 g_shader_iBuffer = new Shader("shaders/gBuffer.vs", "shaders/iBuffer.fs");
104 g_shader_comp = new Shader("shaders/fullscreenbase.vs", "shaders/fullscreenbase.fs");
105
106 // Set up draw buffers
107 g_mask_playspace = new MBuffer(1024, 1024);
108 g_mask_objectives = new MBuffer(1024, 1024);
109 g_mask_buyzone = new MBuffer(1024, 1024);
110 g_gbuffer = new GBuffer(1024, 1024);
111 g_gbuffer_clean = new GBuffer(1024, 1024);
112
113 // Setup camera projection matrices
114 g_mat4_projm = glm::ortho(-2000.0f, 2000.0f, -2000.0f, 2000.0f, -1024.0f, 1024.0f);
115 g_mat4_viewm = glm::lookAt(glm::vec3(0, 0, 0), glm::vec3(0.0f, -1.0f, 0.0f), glm::vec3(0, 0, 1));
116
117 // Load textures
118 g_texture_background = g_tar_config->m_texture_background;//new Texture("textures/grid.png");
119 g_texture_modulate = new Texture("textures/modulate.png");
120 g_ssao_samples = get_ssao_samples(256);
121 g_ssao_rotations = new ssao_rotations_texture();
122
123 glEnable(GL_DEPTH_TEST);
124 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
125 glFrontFace(GL_CW);
126
127 std::vector<entity*> configs = g_vmf_file->get_entities_by_classname("tar_config");
128
129 #pragma endregion
130
131 while (!glfwWindowShouldClose(window)) {
132 Sleep(1000);
133
134 render_config(tar_config_layer());
135
136 glfwSwapBuffers(window);
137 glfwPollEvents();
138 }
139 IL_EXIT:
140 glfwTerminate();
141 return 0;
142 }
143
144 #endif
145
146 void render_config(tar_config_layer layer) {
147 // G BUFFER GENERATION ======================================================================================
148 #pragma region buffer_gen_geo
149
150 g_gbuffer->Bind();
151
152 glClearColor(0.0, 0.0, 0.0, 1.0);
153 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
154 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
155 glEnable(GL_CULL_FACE);
156 glCullFace(GL_BACK);
157
158 g_shader_gBuffer->use();
159 g_shader_gBuffer->setMatrix("projection", g_mat4_projm);
160 g_shader_gBuffer->setMatrix("view", g_mat4_viewm);
161
162 glm::mat4 model = glm::mat4();
163 g_shader_gBuffer->setMatrix("model", model);
164
165 // Draw everything
166 g_vmf_file->SetFilters({}, { "func_detail", "prop_static" });
167 g_vmf_file->DrawWorld(g_shader_gBuffer);
168 g_vmf_file->DrawEntities(g_shader_gBuffer);
169
170 // Clear depth
171 glClear(GL_DEPTH_BUFFER_BIT);
172
173 // Render again BUT JUST THE IMPORTANT BITS
174 g_vmf_file->SetFilters({ g_tar_config->m_visgroup_layout, g_tar_config->m_visgroup_mask }, { "func_detail", "prop_static" });
175 g_vmf_file->DrawWorld(g_shader_gBuffer);
176 g_vmf_file->DrawEntities(g_shader_gBuffer);
177
178 g_vmf_file->SetFilters({ g_tar_config->m_visgroup_overlap }, { "func_detail", "prop_static" });
179 g_vmf_file->DrawWorld(g_shader_gBuffer, {}, TAR_MIBUFFER_OVERLAP);
180 g_vmf_file->DrawEntities(g_shader_gBuffer, {}, TAR_MIBUFFER_OVERLAP);
181
182 // Draw cover with cover flag set
183 g_vmf_file->SetFilters({ g_tar_config->m_visgroup_cover }, { "func_detail", "prop_static" });
184 g_vmf_file->DrawWorld(g_shader_gBuffer, {}, TAR_MIBUFFER_COVER0);
185 g_vmf_file->DrawEntities(g_shader_gBuffer, {}, TAR_MIBUFFER_COVER0);
186
187 GBuffer::Unbind();
188
189 g_gbuffer_clean->Bind();
190 glClearColor(0.0, 0.0, 0.0, 1.0);
191 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
192
193 g_vmf_file->SetFilters({ g_tar_config->m_visgroup_layout, g_tar_config->m_visgroup_mask }, { "func_detail", "prop_static" });
194 g_vmf_file->DrawWorld(g_shader_gBuffer);
195 g_vmf_file->DrawEntities(g_shader_gBuffer);
196
197 GBuffer::Unbind();
198
199 #pragma endregion
200
201 #pragma region mask_gen
202
203 g_mask_playspace->Bind();
204 glClearColor(0.0, 0.0, 0.0, 1.0);
205 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
206
207 g_shader_iBuffer->use();
208 g_shader_iBuffer->setMatrix("projection", g_mat4_projm);
209 g_shader_iBuffer->setMatrix("view", g_mat4_viewm);
210
211 // LAYOUT ================================================================
212
213 g_shader_iBuffer->setUnsigned("srcChr", 0x1U);
214 g_vmf_file->SetFilters({ g_tar_config->m_visgroup_layout }, { "func_detail", "prop_static" });
215 g_vmf_file->DrawWorld(g_shader_iBuffer);
216 g_vmf_file->DrawEntities(g_shader_iBuffer);
217
218 // Subtractive brushes
219 g_shader_iBuffer->setUnsigned("srcChr", 0x0U);
220 g_vmf_file->SetFilters({ g_tar_config->m_visgroup_mask }, { "func_detail", "prop_static" });
221 g_vmf_file->DrawWorld(g_shader_iBuffer);
222 g_vmf_file->DrawEntities(g_shader_iBuffer);
223
224 // OBJECTIVES ============================================================
225
226 g_mask_objectives->Bind();
227 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
228
229 g_shader_iBuffer->setUnsigned("srcChr", 0x1U);
230 g_vmf_file->SetFilters({}, { "func_bomb_target", "func_hostage_rescue" });
231 g_vmf_file->DrawEntities(g_shader_iBuffer);
232
233 // BUY ZONES =============================================================
234
235 g_mask_buyzone->Bind();
236 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
237
238 g_shader_iBuffer->setUnsigned("srcChr", 0x1U);
239 g_vmf_file->SetFilters({}, { "func_buyzone" });
240 g_vmf_file->DrawEntities(g_shader_iBuffer);
241
242 #pragma endregion
243
244 // FINAL COMPOSITE ===============================================================
245 #pragma region final_composite
246
247 MBuffer::Unbind(); // Release any frame buffer
248
249 glClearColor(0.0, 0.0, 0.0, 1.0);
250 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
251 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
252 glDisable(GL_CULL_FACE);
253
254 g_shader_comp->use();
255
256 // Bind RT's
257 //g_texture_background->bindOnSlot ( 0 );
258 //g_shader_comp->setInt("tex_background", 0 );
259
260 g_tar_config->m_texture_gradient->bindOnSlot( 1 );
261 g_shader_comp->setInt("tex_gradient", 1 );
262
263 g_gbuffer->BindPositionBufferToTexSlot ( 2 );
264 g_shader_comp->setInt("gbuffer_position", 2 );
265
266 g_gbuffer->BindNormalBufferToTexSlot ( 3 );
267 g_shader_comp->setInt("gbuffer_normal", 3 );
268
269 g_gbuffer->BindInfoBufferToTexSlot ( 4 );
270 g_shader_comp->setInt("gbuffer_info", 4 );
271
272 g_mask_playspace->BindMaskBufferToTexSlot ( 5 );
273 g_shader_comp->setInt("umask_playspace", 5 );
274
275 g_mask_objectives->BindMaskBufferToTexSlot( 6 );
276 g_shader_comp->setInt("umask_objectives", 6 );
277
278 g_mask_buyzone->BindMaskBufferToTexSlot ( 7 );
279 g_shader_comp->setInt("umask_buyzone", 7 );
280
281 g_gbuffer_clean->BindPositionBufferToTexSlot(8);
282 g_shader_comp->setInt("gbuffer_clean_position", 8);
283
284 g_texture_modulate->bindOnSlot(10);
285 g_shader_comp->setInt("tex_modulate", 10);
286
287 g_ssao_rotations->bindOnSlot ( 9 );
288 g_shader_comp->setInt("ssaoRotations", 9 );
289 g_shader_comp->setFloat("ssaoScale", 1000.0f);
290 g_shader_comp->setMatrix("projection", g_mat4_projm);
291 g_shader_comp->setMatrix("view", g_mat4_viewm);
292
293 for (int i = 0; i < 256; i++) {
294 g_shader_comp->setVec3("samples[" + std::to_string(i) + "]", g_ssao_samples[i]);
295 }
296
297 // Bind uniforms
298 g_shader_comp->setVec3("bounds_NWU", g_vmf_info_bounds.NWU);
299 g_shader_comp->setVec3("bounds_SEL", g_vmf_info_bounds.SEL);
300
301 g_shader_comp->setVec4("color_objective", g_tar_config->m_color_objective);
302 g_shader_comp->setVec4("color_buyzone", g_tar_config->m_color_buyzone);
303 g_shader_comp->setVec4("color_cover", g_tar_config->m_color_cover);
304 g_shader_comp->setVec4("color_cover2", g_tar_config->m_color_cover2);
305
306 g_mesh_screen_quad->Draw();
307 #pragma endregion
308 }