|
@@ -1,46 +1,35 @@
|
|
#include "Wrapper.h"
|
|
#include "Wrapper.h"
|
|
-#include <random>
|
|
+#include <cmath>
|
|
|
|
|
|
DummyClient DummyClient::dummy;
|
|
DummyClient DummyClient::dummy;
|
|
|
|
|
|
IClient* Engine::client = &DummyClient::dummy;
|
|
IClient* Engine::client = &DummyClient::dummy;
|
|
-GLFWwindow* Engine::window = nullptr;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-GLuint Engine::activeProgram = 0;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-ShaderProgram Engine::worldShader;
|
|
|
|
-GLuint Engine::worldFrameBuffer = 0;
|
|
|
|
-GLuint Engine::worldPositionTexture = 0;
|
|
|
|
-GLuint Engine::worldNormalTexture = 0;
|
|
|
|
-GLuint Engine::worldColorTexture = 0;
|
|
|
|
-GLuint Engine::worldDepthTexture = 0;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-ShaderProgram Engine::ssaoShader;
|
|
|
|
-GLuint Engine::ssaoFrameBuffer = 0;
|
|
|
|
-GLuint Engine::ssaoTexture = 0;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-GLuint Engine::postVba = 0;
|
|
|
|
-GLuint Engine::postVbo = 0;
|
|
|
|
-ShaderProgram Engine::postShader;
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
+GLFWwindow* Engine::window = nullptr;
|
|
int Engine::scale = 1;
|
|
int Engine::scale = 1;
|
|
int Engine::width = 0;
|
|
int Engine::width = 0;
|
|
int Engine::height = 0;
|
|
int Engine::height = 0;
|
|
|
|
|
|
-bool Engine::lineMode = false;
|
|
+
|
|
-
|
|
+float Engine::fovY = 60;
|
|
-float Engine::testX = 0;
|
|
+float Engine::nearClip = 0.1f;
|
|
-float Engine::testY = 0;
|
|
+float Engine::farClip = 1000.0f;
|
|
-float Engine::testZ = 0;
|
|
+Matrix3D Engine::projMatrix;
|
|
-
|
|
+
|
|
-
|
|
+
|
|
-Vector3D Engine::ssaoKernel[ssaoKernelAmount];
|
|
+FramebufferRectangle Engine::rectangle;
|
|
-GLuint Engine::noiseTexture = 0;
|
|
+
|
|
-Matrix3D Engine::testMat;
|
|
+
|
|
|
|
+WorldShader Engine::worldShader;
|
|
|
|
+
|
|
|
|
+SSAOShader Engine::ssaoShader;
|
|
|
|
+
|
|
|
|
+SSAOBlurShader Engine::ssaoBlurShader;
|
|
|
|
+
|
|
|
|
+WorldPostShader Engine::worldPostShader;
|
|
|
|
+
|
|
|
|
+OverlayShader Engine::overlayShader;
|
|
|
|
|
|
bool Engine::init(int width, int height, const char* name)
|
|
bool Engine::init(int width, int height, const char* name)
|
|
{
|
|
{
|
|
@@ -78,25 +67,7 @@ bool Engine::init(int width, int height, const char* name)
|
|
}
|
|
}
|
|
cout << "Status: Using GLEW " << glewGetString(GLEW_VERSION) << endl;
|
|
cout << "Status: Using GLEW " << glewGetString(GLEW_VERSION) << endl;
|
|
|
|
|
|
- worldShader.compile("shader/worldVertex.vs", "shader/worldFragment.fs");
|
|
+ if(!worldShader.init() || !ssaoShader.init() || !ssaoBlurShader.init() || !worldPostShader.init() || !overlayShader.init() || !rectangle.init())
|
|
- if(!worldShader.isValid())
|
|
|
|
- {
|
|
|
|
- glfwDestroyWindow(window);
|
|
|
|
- glfwTerminate();
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- activeProgram = worldShader.getProgram();
|
|
|
|
-
|
|
|
|
- ssaoShader.compile("shader/ssaoVertex.vs", "shader/ssaoFragment.fs");
|
|
|
|
- if(!ssaoShader.isValid())
|
|
|
|
- {
|
|
|
|
- glfwDestroyWindow(window);
|
|
|
|
- glfwTerminate();
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- postShader.compile("shader/postVertex.vs", "shader/postFragment.fs");
|
|
|
|
- if(!postShader.isValid())
|
|
|
|
{
|
|
{
|
|
glfwDestroyWindow(window);
|
|
glfwDestroyWindow(window);
|
|
glfwTerminate();
|
|
glfwTerminate();
|
|
@@ -118,8 +89,6 @@ void Engine::start(IClient* client)
|
|
Engine::client = client;
|
|
Engine::client = client;
|
|
}
|
|
}
|
|
|
|
|
|
- onInit();
|
|
|
|
-
|
|
|
|
glEnable(GL_CULL_FACE);
|
|
glEnable(GL_CULL_FACE);
|
|
glDepthFunc(GL_LEQUAL);
|
|
glDepthFunc(GL_LEQUAL);
|
|
|
|
|
|
@@ -158,7 +127,6 @@ void Engine::start(IClient* client)
|
|
glfwPollEvents();
|
|
glfwPollEvents();
|
|
}
|
|
}
|
|
|
|
|
|
- onTerm();
|
|
|
|
glfwDestroyWindow(window);
|
|
glfwDestroyWindow(window);
|
|
glfwTerminate();
|
|
glfwTerminate();
|
|
}
|
|
}
|
|
@@ -184,15 +152,10 @@ void Engine::onWindowResize(GLFWwindow* w, int width, int height)
|
|
Engine::width = width;
|
|
Engine::width = width;
|
|
Engine::height = height;
|
|
Engine::height = height;
|
|
updateScale();
|
|
updateScale();
|
|
-
|
|
+ worldShader.resize();
|
|
-
|
|
+ ssaoShader.resize();
|
|
- glBindTexture(GL_TEXTURE_2D, frameTexture);
|
|
+ ssaoBlurShader.resize();
|
|
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
|
+ worldPostShader.resize();
|
|
- glBindTexture(GL_TEXTURE_2D, 0);
|
|
|
|
- glBindRenderbuffer(GL_RENDERBUFFER, depthTexture);
|
|
|
|
- glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
|
|
|
|
- glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
|
|
|
- glBindFramebuffer(GL_FRAMEBUFFER, 0);*/
|
|
|
|
}
|
|
}
|
|
|
|
|
|
void Engine::updateScale()
|
|
void Engine::updateScale()
|
|
@@ -219,24 +182,19 @@ int Engine::getHeight()
|
|
return height;
|
|
return height;
|
|
}
|
|
}
|
|
|
|
|
|
-GLint Engine::getUniformLocation(const GLchar* name)
|
|
+float Engine::getFieldOfView()
|
|
-{
|
|
|
|
- return glGetUniformLocation(activeProgram, name);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void Engine::setMatrix(GLint location, const GLfloat* m)
|
|
|
|
{
|
|
{
|
|
- glUniformMatrix4fv(location, 1, 0, m);
|
|
+ return fovY;
|
|
}
|
|
}
|
|
|
|
|
|
-void Engine::setInt(GLint location, GLint i)
|
|
+float Engine::getNearClip()
|
|
{
|
|
{
|
|
- glUniform1i(location, i);
|
|
+ return nearClip;
|
|
}
|
|
}
|
|
|
|
|
|
-void Engine::setFloat(GLint location, GLfloat f1, GLfloat f2, GLfloat f3, GLfloat f4)
|
|
+float Engine::getFarClip()
|
|
{
|
|
{
|
|
- glUniform4f(location, f1, f2, f3, f4);
|
|
+ return farClip;
|
|
}
|
|
}
|
|
|
|
|
|
void Engine::printError()
|
|
void Engine::printError()
|
|
@@ -273,205 +231,86 @@ void Engine::printError()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-void Engine::onInit()
|
|
+void Engine::onRenderTick(float lag)
|
|
{
|
|
{
|
|
-
|
|
+
|
|
- glGenFramebuffers(1, &worldFrameBuffer);
|
|
+ float tan = tanf((0.5f * fovY) * M_PI / 180.0f);
|
|
- glBindFramebuffer(GL_FRAMEBUFFER, worldFrameBuffer);
|
|
+ float q = 1.0f / tan;
|
|
-
|
|
+ float aspect = (float) width / height;
|
|
- glGenTextures(1, &worldPositionTexture);
|
|
+
|
|
- glBindTexture(GL_TEXTURE_2D, worldPositionTexture);
|
|
+ projMatrix.set(0, 0, q / aspect);
|
|
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, width, height, 0, GL_RGB, GL_FLOAT, NULL);
|
|
+ projMatrix.set(1, 1, q);
|
|
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
+ projMatrix.set(2, 2, (nearClip + farClip) / (nearClip - farClip));
|
|
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
+ projMatrix.set(3, 2, -1.0f);
|
|
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
+ projMatrix.set(2, 3, (2.0f * nearClip * farClip) / (nearClip - farClip));
|
|
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
+ projMatrix.set(3, 3, 0);
|
|
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, worldPositionTexture, 0);
|
|
|
|
-
|
|
|
|
- glGenTextures(1, &worldNormalTexture);
|
|
|
|
- glBindTexture(GL_TEXTURE_2D, worldNormalTexture);
|
|
|
|
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, width, height, 0, GL_RGB, GL_FLOAT, NULL);
|
|
|
|
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
|
|
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
|
|
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, worldNormalTexture, 0);
|
|
|
|
-
|
|
|
|
- glGenTextures(1, &worldColorTexture);
|
|
|
|
- glBindTexture(GL_TEXTURE_2D, worldColorTexture);
|
|
|
|
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
|
|
|
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
|
|
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
|
|
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, worldColorTexture, 0);
|
|
|
|
-
|
|
|
|
- GLuint attachments[3] =
|
|
|
|
- {
|
|
|
|
- GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2
|
|
|
|
- };
|
|
|
|
- glDrawBuffers(3, attachments);
|
|
|
|
-
|
|
|
|
- glGenTextures(1, &worldDepthTexture);
|
|
|
|
- glBindTexture(GL_TEXTURE_2D, worldDepthTexture);
|
|
|
|
- glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, width, height, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL);
|
|
|
|
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
|
|
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
|
|
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, worldDepthTexture, 0);
|
|
|
|
-
|
|
|
|
- if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
|
|
|
- {
|
|
|
|
- cout << "world frame buffer is not complete!" << endl;
|
|
|
|
- }
|
|
|
|
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
|
|
|
|
|
|
|
-
|
|
+
|
|
- glGenVertexArrays(1, &postVba);
|
|
+
|
|
- glBindVertexArray(postVba);
|
|
+
|
|
|
|
+ worldShader.preRender(projMatrix.getValues());
|
|
|
|
+
|
|
|
|
+ client->render3DTick(lag);
|
|
|
|
|
|
- glGenBuffers(1, &postVbo);
|
|
+
|
|
- glBindBuffer(GL_ARRAY_BUFFER, postVbo);
|
|
+
|
|
-
|
|
+
|
|
- glVertexAttribPointer(0, 2, GL_FLOAT, 0, sizeof(float) * 4, (GLvoid*) 0);
|
|
+ ssaoShader.preRender(projMatrix.getValues());
|
|
- glEnableVertexAttribArray(0);
|
|
+
|
|
-
|
|
+
|
|
- glVertexAttribPointer(1, 2, GL_FLOAT, 0, sizeof(float) * 4, (GLvoid*) (sizeof(float) * 2));
|
|
+ worldShader.bindPositionTexture(1);
|
|
- glEnableVertexAttribArray(1);
|
|
+ worldShader.bindNormalTexture(2);
|
|
|
|
+ worldShader.bindColorTexture(3);
|
|
|
|
+ worldShader.bindDepthTexture(4);
|
|
|
|
+ ssaoShader.bindNoiseTexture(5);
|
|
|
|
|
|
- float data[] =
|
|
+ rectangle.draw();
|
|
- {
|
|
|
|
- -1.0f, 1.0f, 0.0f, 1.0f,
|
|
|
|
- -1.0f, -1.0f, 0.0f, 0.0f,
|
|
|
|
- 1.0f, -1.0f, 1.0f, 0.0f,
|
|
|
|
- -1.0f, 1.0f, 0.0f, 1.0f,
|
|
|
|
- 1.0f, -1.0f, 1.0f, 0.0f,
|
|
|
|
- 1.0f, 1.0f, 1.0f, 1.0f
|
|
|
|
- };
|
|
|
|
|
|
|
|
- glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 24, data, GL_STATIC_DRAW);
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ ssaoBlurShader.preRender();
|
|
|
|
+ ssaoShader.bindTexture(6);
|
|
|
|
+ rectangle.draw();
|
|
|
|
|
|
-
|
|
+
|
|
- glGenFramebuffers(1, &ssaoFrameBuffer);
|
|
+
|
|
- glBindFramebuffer(GL_FRAMEBUFFER, ssaoFrameBuffer);
|
|
+
|
|
-
|
|
+ worldPostShader.preRender();
|
|
- glGenTextures(1, &ssaoTexture);
|
|
+ ssaoBlurShader.bindTexture(7);
|
|
- glBindTexture(GL_TEXTURE_2D, ssaoTexture);
|
|
+ rectangle.draw();
|
|
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, height, 0, GL_RGB, GL_FLOAT, NULL);
|
|
|
|
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
|
|
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
|
|
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ssaoTexture, 0);
|
|
|
|
-
|
|
|
|
- if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
|
|
|
- {
|
|
|
|
- cout << "ssao frame buffer is not complete!" << endl;
|
|
|
|
- }
|
|
|
|
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
|
|
|
|
|
|
|
- std::uniform_real_distribution<float> randomF(0.0, 1.0);
|
|
+
|
|
- std::default_random_engine gen;
|
|
+
|
|
- for(int i = 0; i < ssaoKernelAmount; i++)
|
|
+
|
|
- {
|
|
|
|
- ssaoKernel[i].set(randomF(gen) * 2.0 - 1.0, randomF(gen) * 2.0 - 1.0, randomF(gen));
|
|
|
|
- ssaoKernel[i].normalize();
|
|
|
|
- ssaoKernel[i].mul(randomF(gen));
|
|
|
|
-
|
|
|
|
- float scale = (float) i / ssaoKernelAmount;
|
|
|
|
- scale = 0.1f + (scale * scale) * 0.9f;
|
|
|
|
- ssaoKernel[i].mul(scale);
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
|
|
|
|
- float noise[48];
|
|
+ overlayShader.preRender();
|
|
- for(int i = 0; i < 16; i++)
|
|
+ worldPostShader.bindTexture(0);
|
|
- {
|
|
+ rectangle.draw();
|
|
- noise[i * 3] = randomF(gen) * 2.0 - 1.0;
|
|
+ overlayShader.setViewMatrix();
|
|
- noise[i * 3 + 1] = randomF(gen) * 2.0 - 1.0;
|
|
|
|
- noise[i * 3 + 2] = 0.0f;
|
|
|
|
- }
|
|
|
|
|
|
|
|
- glGenTextures(1, &noiseTexture);
|
|
+ overlayShader.setUseColor(true);
|
|
- glBindTexture(GL_TEXTURE_2D, noiseTexture);
|
|
+ overlayShader.setUseTexture(true);
|
|
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, 4, 4, 0, GL_RGB, GL_FLOAT, noise);
|
|
+
|
|
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
+ glEnable(GL_BLEND);
|
|
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
|
+ glBlendEquation(GL_FUNC_ADD);
|
|
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
|
+ client->render2DTick(lag);
|
|
|
|
+ glDisable(GL_BLEND);
|
|
}
|
|
}
|
|
|
|
|
|
-void Engine::onRenderTick(float lag)
|
|
+void Engine::setWorldViewMatrix(const float* data)
|
|
{
|
|
{
|
|
-
|
|
+ worldShader.setViewMatrix(data);
|
|
-
|
|
|
|
-
|
|
|
|
- glActiveTexture(GL_TEXTURE0);
|
|
|
|
-
|
|
|
|
- activeProgram = worldShader.getProgram();
|
|
|
|
- glUseProgram(activeProgram);
|
|
|
|
-
|
|
|
|
- glBindFramebuffer(GL_FRAMEBUFFER, worldFrameBuffer);
|
|
|
|
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
|
|
|
- glEnable(GL_DEPTH_TEST);
|
|
|
|
- if(lineMode)
|
|
|
|
- {
|
|
|
|
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
|
|
|
- Engine::client->renderTick(lag);
|
|
|
|
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- Engine::client->renderTick(lag);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- glActiveTexture(GL_TEXTURE1);
|
|
|
|
- glBindTexture(GL_TEXTURE_2D, worldPositionTexture);
|
|
|
|
- glActiveTexture(GL_TEXTURE2);
|
|
|
|
- glBindTexture(GL_TEXTURE_2D, worldNormalTexture);
|
|
|
|
- glActiveTexture(GL_TEXTURE3);
|
|
|
|
- glBindTexture(GL_TEXTURE_2D, worldColorTexture);
|
|
|
|
- glActiveTexture(GL_TEXTURE4);
|
|
|
|
- glBindTexture(GL_TEXTURE_2D, worldDepthTexture);
|
|
|
|
- glActiveTexture(GL_TEXTURE5);
|
|
|
|
- glBindTexture(GL_TEXTURE_2D, noiseTexture);
|
|
|
|
-
|
|
|
|
- activeProgram = ssaoShader.getProgram();
|
|
|
|
- glUseProgram(activeProgram);
|
|
|
|
-
|
|
|
|
- for(int i = 0; i < ssaoKernelAmount; i++)
|
|
|
|
- {
|
|
|
|
- glUniform3f(glGetUniformLocation(activeProgram, (string("ssaoKernel[") + std::to_string(i) + "]").c_str()),
|
|
|
|
- ssaoKernel[i].getX(), ssaoKernel[i].getY(), ssaoKernel[i].getZ());
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- Engine::setMatrix(glGetUniformLocation(activeProgram, "projMatrix"), testMat.getValues());
|
|
|
|
-
|
|
|
|
- glBindFramebuffer(GL_FRAMEBUFFER, ssaoFrameBuffer);
|
|
|
|
- glClear(GL_COLOR_BUFFER_BIT);
|
|
|
|
- glDisable(GL_DEPTH_TEST);
|
|
|
|
- glBindVertexArray(postVba);
|
|
|
|
- glBindBuffer(GL_ARRAY_BUFFER, postVbo);
|
|
|
|
- glDrawArrays(GL_TRIANGLES, 0, 6);
|
|
|
|
-
|
|
|
|
- glActiveTexture(GL_TEXTURE6);
|
|
|
|
- glBindTexture(GL_TEXTURE_2D, ssaoTexture);
|
|
|
|
- glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
|
|
|
- glClear(GL_COLOR_BUFFER_BIT);
|
|
|
|
- activeProgram = postShader.getProgram();
|
|
|
|
- glUseProgram(activeProgram);
|
|
|
|
- glDrawArrays(GL_TRIANGLES, 0, 6);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-void Engine::onTerm()
|
|
+void Engine::setWorldModelMatrix(const float* data)
|
|
{
|
|
{
|
|
- glDeleteVertexArrays(1, &postVba);
|
|
+ worldShader.setModelMatrix(data);
|
|
- glDeleteBuffers(1, &postVbo);
|
|
|
|
-
|
|
|
|
- glDeleteFramebuffers(1, &worldFrameBuffer);
|
|
|
|
- glDeleteTextures(1, &worldPositionTexture);
|
|
|
|
- glDeleteTextures(1, &worldNormalTexture);
|
|
|
|
- glDeleteTextures(1, &worldColorTexture);
|
|
|
|
- glDeleteTextures(1, &worldDepthTexture);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-void Engine::setLineMode(bool mode)
|
|
+void Engine::setOverlayModelMatrix(const float* data)
|
|
{
|
|
{
|
|
- lineMode = mode;
|
|
+ overlayShader.setModelMatrix(data);
|
|
-}
|
|
+}
|
|
|
|
+
|