TerraForge3D  2.3.1
3D Terrain And Landscape Generator
CubeMap.cpp
1#include "Sky/CubeMap.h"
2
3#include <cstdint>
4#include <vector>
5#include <string>
6#include <iostream>
7#include <TextureCubemap.h>
8#include <stb/stb_image.h>
9#include <glad/glad.h>
10#include <Shader.h>
11#include <glm/glm.hpp>
12
13#include "Platform.h"
14#include "Base/Model.h"
15#include "Base/ModelImporter.h"
16#include "Utils/Utils.h"
17#include "Data/ApplicationState.h"
18
19static bool tmpb = false;
20static std::string vertShader = ReadShaderSourceFile(GetExecutableDir() + PATH_SEPARATOR "Data" PATH_SEPARATOR "shaders" PATH_SEPARATOR "skybox" PATH_SEPARATOR "vert.glsl", &tmpb);
21static std::string fragShader = ReadShaderSourceFile(GetExecutableDir() + PATH_SEPARATOR "Data" PATH_SEPARATOR "shaders" PATH_SEPARATOR "skybox" PATH_SEPARATOR "frag.glsl", &tmpb);
22static std::string fragProShader = ReadShaderSourceFile(GetExecutableDir() + PATH_SEPARATOR "Data" PATH_SEPARATOR "shaders" PATH_SEPARATOR "skybox" PATH_SEPARATOR "procedural_clouds.glsl", &tmpb);
23
24
25static float skyboxVertices[] =
26{
27 // positions
28 -1.0f, 1.0f, -1.0f,
29 -1.0f, -1.0f, -1.0f,
30 1.0f, -1.0f, -1.0f,
31 1.0f, -1.0f, -1.0f,
32 1.0f, 1.0f, -1.0f,
33 -1.0f, 1.0f, -1.0f,
34
35 -1.0f, -1.0f, 1.0f,
36 -1.0f, -1.0f, -1.0f,
37 -1.0f, 1.0f, -1.0f,
38 -1.0f, 1.0f, -1.0f,
39 -1.0f, 1.0f, 1.0f,
40 -1.0f, -1.0f, 1.0f,
41
42 1.0f, -1.0f, -1.0f,
43 1.0f, -1.0f, 1.0f,
44 1.0f, 1.0f, 1.0f,
45 1.0f, 1.0f, 1.0f,
46 1.0f, 1.0f, -1.0f,
47 1.0f, -1.0f, -1.0f,
48
49 -1.0f, -1.0f, 1.0f,
50 -1.0f, 1.0f, 1.0f,
51 1.0f, 1.0f, 1.0f,
52 1.0f, 1.0f, 1.0f,
53 1.0f, -1.0f, 1.0f,
54 -1.0f, -1.0f, 1.0f,
55
56 -1.0f, 1.0f, -1.0f,
57 1.0f, 1.0f, -1.0f,
58 1.0f, 1.0f, 1.0f,
59 1.0f, 1.0f, 1.0f,
60 -1.0f, 1.0f, 1.0f,
61 -1.0f, 1.0f, -1.0f,
62
63 -1.0f, -1.0f, -1.0f,
64 -1.0f, -1.0f, 1.0f,
65 1.0f, -1.0f, -1.0f,
66 1.0f, -1.0f, -1.0f,
67 -1.0f, -1.0f, 1.0f,
68 1.0f, -1.0f, 1.0f
69 };
70
71CubeMapManager::~CubeMapManager()
72{
73 if(skyboxShader)
74 {
75 delete skyboxShader;
76 }
77
78 if(skyproShader)
79 {
80 delete skyproShader;
81 }
82
83 if(skySphere)
84 {
85 delete skySphere;
86 }
87
88 if(cubemap)
89 {
90 delete cubemap;
91 }
92}
93
94CubeMapManager::CubeMapManager(ApplicationState *as)
95{
96 appState = as;
97 static std::vector<std::string> faces =
98 {
99 appState->constants.skyboxDir + PATH_SEPARATOR "px.jpg",
100 appState->constants.skyboxDir + PATH_SEPARATOR "nx.jpg",
101 appState->constants.skyboxDir + PATH_SEPARATOR "py.jpg",
102 appState->constants.skyboxDir + PATH_SEPARATOR "ny.jpg",
103 appState->constants.skyboxDir + PATH_SEPARATOR "pz.jpg",
104 appState->constants.skyboxDir + PATH_SEPARATOR "nz.jpg"
105 };
106 cubemap = new TextureCubemap();
107 cubemap->SetUpOnGPU();
108 cubemap->LoadFaces(faces);
109 cubemap->UploadDataToGPU();
110 skyboxShader = new Shader(vertShader, fragShader);
111 skyproShader = new Shader(vertShader, fragProShader);
112 glGenVertexArrays(1, &vao);
113 glBindVertexArray(vao);
114 unsigned int VBO;
115 glGenBuffers(1, &VBO);
116 glBindBuffer(GL_ARRAY_BUFFER, VBO);
117 glBufferData(GL_ARRAY_BUFFER, sizeof(skyboxVertices), skyboxVertices, GL_STATIC_DRAW);
118 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void *)0);
119 glEnableVertexAttribArray(0);
120 skySphere = LoadModel(GetExecutableDir() + PATH_SEPARATOR "Data" PATH_SEPARATOR "models" PATH_SEPARATOR "icosphere.obj");
121 skySphere->SetupMeshOnGPU();
122 skySphere->UploadToGPU();
123}
124
125
126void CubeMapManager::RenderSkybox(glm::mat4 view, glm::mat4 proj, bool useBox, bool useProcedural, float cirrus, float cumulus, float time, float *fsun, float upf)
127{
128 glDisable(GL_DEPTH_TEST);
129 glDepthMask(GL_FALSE);
130 glBindVertexArray(vao);
131 Shader *shd = skyboxShader;
132
133 if(useProcedural)
134 {
135 shd = skyproShader;
136 }
137
138 shd->Bind();
139 cubemap->Bind(0);
140 view = glm::mat4(glm::mat3(view));
141 shd->SetUniformMat4("_P", proj);
142 shd->SetUniformMat4("_V", view);
143 shd->SetUniformf("time", time);
144 shd->SetUniformf("cirrus", cirrus);
145 shd->SetUniformf("upf", upf);
146 shd->SetUniformf("cumulus", cumulus);
147 shd->SetUniform3f("fsun", fsun);
148 glUniform1i(glGetUniformLocation(shd->m_Shader, "skybox"), 0);
149
150 if(useBox)
151 {
152 glDrawArrays(GL_TRIANGLES, 0, 36);
153 }
154
155 else
156 {
157 skySphere->Update();
158 skySphere->Render();
159 }
160
161 glDepthMask(GL_TRUE);
162 glEnable(GL_DEPTH_TEST);
163}
164
165TextureCubemap *CubeMapManager::GetSkyboxCubemapTexture()
166{
167 return cubemap;
168}
Definition: Shader.h:7