mirror of
https://github.com/RetroDECK/Supermodel.git
synced 2024-11-23 14:15:40 +00:00
104 lines
2.3 KiB
C++
104 lines
2.3 KiB
C++
|
#include "R3DScrollFog.h"
|
||
|
#include "Graphics/Shader.h"
|
||
|
#include "Mat4.h"
|
||
|
|
||
|
namespace New3D {
|
||
|
|
||
|
static const char *vertexShaderFog =
|
||
|
|
||
|
"uniform mat4 mvp;\n"
|
||
|
|
||
|
"void main(void)\n"
|
||
|
"{\n"
|
||
|
"gl_Position = mvp * gl_Vertex;\n"
|
||
|
"}\n";
|
||
|
|
||
|
static const char *fragmentShaderFog =
|
||
|
|
||
|
"uniform vec4 fogColour;\n"
|
||
|
|
||
|
"void main()\n"
|
||
|
"{\n"
|
||
|
"gl_FragColor = fogColour;\n"
|
||
|
"}\n";
|
||
|
|
||
|
|
||
|
R3DScrollFog::R3DScrollFog()
|
||
|
{
|
||
|
//default coordinates are NDC -1,1 etc
|
||
|
|
||
|
m_triangles[0].p1.Set(-1,-1, 0);
|
||
|
m_triangles[0].p2.Set(-1, 1, 0);
|
||
|
m_triangles[0].p3.Set( 1, 1, 0);
|
||
|
|
||
|
m_triangles[1].p1.Set(-1,-1, 0);
|
||
|
m_triangles[1].p2.Set( 1, 1, 0);
|
||
|
m_triangles[1].p3.Set( 1,-1, 0);
|
||
|
|
||
|
m_shaderProgram = 0;
|
||
|
m_vertexShader = 0;
|
||
|
m_fragmentShader = 0;
|
||
|
|
||
|
AllocResources();
|
||
|
}
|
||
|
|
||
|
R3DScrollFog::~R3DScrollFog()
|
||
|
{
|
||
|
DeallocResources();
|
||
|
}
|
||
|
|
||
|
void R3DScrollFog::DrawScrollFog(float r, float g, float b, float a)
|
||
|
{
|
||
|
//=======
|
||
|
Mat4 mvp;
|
||
|
//=======
|
||
|
|
||
|
// yeah this would have been much easier with immediate mode and fixed function .. >_<
|
||
|
|
||
|
// some ogl states
|
||
|
glDepthMask (GL_FALSE); // disable z writes
|
||
|
glDisable (GL_DEPTH_TEST); // disable depth testing
|
||
|
glEnable (GL_BLEND);
|
||
|
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||
|
|
||
|
m_vbo.Bind (true);
|
||
|
glUseProgram (m_shaderProgram);
|
||
|
glUniform4f (m_locFogColour, r, g, b, a);
|
||
|
glUniformMatrix4fv (m_locMVP, 1, GL_FALSE, mvp);
|
||
|
|
||
|
glEnableClientState (GL_VERTEX_ARRAY);
|
||
|
glVertexPointer (3, GL_FLOAT, sizeof(SFVertex), 0);
|
||
|
glDrawArrays (GL_TRIANGLES, 0, 6);
|
||
|
glDisableClientState(GL_VERTEX_ARRAY);
|
||
|
|
||
|
glUseProgram (0);
|
||
|
m_vbo.Bind (false);
|
||
|
|
||
|
glDisable (GL_BLEND);
|
||
|
glDepthMask (GL_TRUE);
|
||
|
}
|
||
|
|
||
|
void R3DScrollFog::AllocResources()
|
||
|
{
|
||
|
bool success = LoadShaderProgram(&m_shaderProgram, &m_vertexShader, &m_fragmentShader, nullptr, nullptr, vertexShaderFog, fragmentShaderFog);
|
||
|
|
||
|
m_locMVP = glGetUniformLocation(m_shaderProgram, "mvp");
|
||
|
m_locFogColour = glGetUniformLocation(m_shaderProgram, "fogColour");
|
||
|
|
||
|
m_vbo.Create(GL_ARRAY_BUFFER, GL_STATIC_DRAW, sizeof(SFTriangle) * (2), m_triangles);
|
||
|
}
|
||
|
|
||
|
void R3DScrollFog::DeallocResources()
|
||
|
{
|
||
|
if (m_shaderProgram) {
|
||
|
DestroyShaderProgram(m_shaderProgram, m_vertexShader, m_fragmentShader);
|
||
|
}
|
||
|
|
||
|
m_shaderProgram = 0;
|
||
|
m_vertexShader = 0;
|
||
|
m_fragmentShader = 0;
|
||
|
|
||
|
m_vbo.Destroy();
|
||
|
}
|
||
|
|
||
|
}
|