mirror of
https://github.com/RetroDECK/Supermodel.git
synced 2024-11-22 05:45:38 +00:00
implement scroll fog, fixes a tonne of missing fx
This commit is contained in:
parent
ef11990d19
commit
f0a15febd1
|
@ -81,6 +81,20 @@ void CNew3D::UploadTextures(unsigned x, unsigned y, unsigned width, unsigned hei
|
||||||
m_texSheet.Invalidate(x, y, width, height);
|
m_texSheet.Invalidate(x, y, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CNew3D::DrawScrollFog()
|
||||||
|
{
|
||||||
|
for (auto &n : m_nodes) {
|
||||||
|
|
||||||
|
if (n.viewport.scrollFog > 0) {
|
||||||
|
|
||||||
|
float *rgb = n.viewport.fogParams;
|
||||||
|
m_r3dScrollFog.DrawScrollFog(rgb[0], rgb[1], rgb[2], n.viewport.scrollFog);
|
||||||
|
|
||||||
|
return; // only allowed once per frame?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CNew3D::RenderScene(int priority, bool alpha)
|
void CNew3D::RenderScene(int priority, bool alpha)
|
||||||
{
|
{
|
||||||
if (alpha) {
|
if (alpha) {
|
||||||
|
@ -178,6 +192,10 @@ void CNew3D::RenderFrame(void)
|
||||||
m_modelMat.Release(); // would hope we wouldn't need this but no harm in checking
|
m_modelMat.Release(); // would hope we wouldn't need this but no harm in checking
|
||||||
m_nodeAttribs.Reset();
|
m_nodeAttribs.Reset();
|
||||||
|
|
||||||
|
RenderViewport(0x800000); // build model structure
|
||||||
|
|
||||||
|
DrawScrollFog(); // fog layer if applicable must be drawn here
|
||||||
|
|
||||||
glDepthFunc (GL_LEQUAL);
|
glDepthFunc (GL_LEQUAL);
|
||||||
glEnable (GL_DEPTH_TEST);
|
glEnable (GL_DEPTH_TEST);
|
||||||
glActiveTexture (GL_TEXTURE0);
|
glActiveTexture (GL_TEXTURE0);
|
||||||
|
@ -185,10 +203,8 @@ void CNew3D::RenderFrame(void)
|
||||||
glFrontFace (GL_CW);
|
glFrontFace (GL_CW);
|
||||||
|
|
||||||
glStencilFunc (GL_EQUAL, 0, 0xFF); // basically stencil test passes if the value is zero
|
glStencilFunc (GL_EQUAL, 0, 0xFF); // basically stencil test passes if the value is zero
|
||||||
glStencilOp (GL_KEEP, GL_INCR, GL_INCR); // if the stencil test passes, we incriment the value
|
glStencilOp (GL_KEEP, GL_INCR, GL_INCR); // if the stencil test passes, we incriment the value
|
||||||
glStencilMask (0xFF);
|
glStencilMask (0xFF);
|
||||||
|
|
||||||
RenderViewport(0x800000); // build model structure
|
|
||||||
|
|
||||||
m_vbo.Bind(true);
|
m_vbo.Bind(true);
|
||||||
m_vbo.BufferSubData(MAX_ROM_POLYS*sizeof(Poly), m_polyBufferRam.size()*sizeof(Poly), m_polyBufferRam.data()); // upload all the dynamic data to GPU in one go
|
m_vbo.BufferSubData(MAX_ROM_POLYS*sizeof(Poly), m_polyBufferRam.size()*sizeof(Poly), m_polyBufferRam.data()); // upload all the dynamic data to GPU in one go
|
||||||
|
@ -224,7 +240,7 @@ void CNew3D::RenderFrame(void)
|
||||||
glNormalPointer (GL_FLOAT, sizeof(Vertex), (void*)offsetof(Vertex, normal));
|
glNormalPointer (GL_FLOAT, sizeof(Vertex), (void*)offsetof(Vertex, normal));
|
||||||
glTexCoordPointer (2, GL_FLOAT, sizeof(Vertex), (void*)offsetof(Vertex, texcoords));
|
glTexCoordPointer (2, GL_FLOAT, sizeof(Vertex), (void*)offsetof(Vertex, texcoords));
|
||||||
glColorPointer (4, GL_UNSIGNED_BYTE, sizeof(Vertex), (void*)offsetof(Vertex, color));
|
glColorPointer (4, GL_UNSIGNED_BYTE, sizeof(Vertex), (void*)offsetof(Vertex, color));
|
||||||
|
|
||||||
m_r3dShader.SetShader(true);
|
m_r3dShader.SetShader(true);
|
||||||
|
|
||||||
for (int pri = 0; pri <= 3; pri++) {
|
for (int pri = 0; pri <= 3; pri++) {
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#include "R3DData.h"
|
#include "R3DData.h"
|
||||||
#include "Plane.h"
|
#include "Plane.h"
|
||||||
#include "Vec.h"
|
#include "Vec.h"
|
||||||
|
#include "R3DScrollFog.h"
|
||||||
|
|
||||||
namespace New3D {
|
namespace New3D {
|
||||||
|
|
||||||
|
@ -177,6 +178,7 @@ private:
|
||||||
float Determinant3x3(const float m[16]);
|
float Determinant3x3(const float m[16]);
|
||||||
bool IsDynamicModel(UINT32 *data); // check if the model has a colour palette
|
bool IsDynamicModel(UINT32 *data); // check if the model has a colour palette
|
||||||
bool IsVROMModel(UINT32 modelAddr);
|
bool IsVROMModel(UINT32 modelAddr);
|
||||||
|
void DrawScrollFog();
|
||||||
|
|
||||||
void CalcTexOffset(int offX, int offY, int page, int x, int y, int& newX, int& newY);
|
void CalcTexOffset(int offX, int offY, int page, int x, int y, int& newX, int& newY);
|
||||||
|
|
||||||
|
@ -216,6 +218,7 @@ private:
|
||||||
|
|
||||||
VBO m_vbo; // large VBO to hold our poly data, start of VBO is ROM data, ram polys follow
|
VBO m_vbo; // large VBO to hold our poly data, start of VBO is ROM data, ram polys follow
|
||||||
R3DShader m_r3dShader;
|
R3DShader m_r3dShader;
|
||||||
|
R3DScrollFog m_r3dScrollFog;
|
||||||
|
|
||||||
Plane m_planes[6];
|
Plane m_planes[6];
|
||||||
|
|
||||||
|
|
104
Src/Graphics/New3D/R3DScrollFog.cpp
Normal file
104
Src/Graphics/New3D/R3DScrollFog.cpp
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
#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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
54
Src/Graphics/New3D/R3DScrollFog.h
Normal file
54
Src/Graphics/New3D/R3DScrollFog.h
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
#ifndef _R3DSCROLLFOG_H_
|
||||||
|
#define _R3DSCROLLFOG_H_
|
||||||
|
|
||||||
|
#include "VBO.h"
|
||||||
|
|
||||||
|
namespace New3D {
|
||||||
|
|
||||||
|
class R3DScrollFog
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
R3DScrollFog();
|
||||||
|
~R3DScrollFog();
|
||||||
|
|
||||||
|
void DrawScrollFog(float r, float g, float b, float a);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void AllocResources();
|
||||||
|
void DeallocResources();
|
||||||
|
|
||||||
|
struct SFVertex
|
||||||
|
{
|
||||||
|
void Set(float x, float y, float z) {
|
||||||
|
v[0] = x;
|
||||||
|
v[1] = y;
|
||||||
|
v[2] = z;
|
||||||
|
}
|
||||||
|
|
||||||
|
float v[3];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SFTriangle
|
||||||
|
{
|
||||||
|
SFVertex p1;
|
||||||
|
SFVertex p2;
|
||||||
|
SFVertex p3;
|
||||||
|
};
|
||||||
|
|
||||||
|
SFTriangle m_triangles[2];
|
||||||
|
|
||||||
|
GLuint m_shaderProgram;
|
||||||
|
GLuint m_vertexShader;
|
||||||
|
GLuint m_fragmentShader;
|
||||||
|
|
||||||
|
GLuint m_locFogColour;
|
||||||
|
GLuint m_locMVP;
|
||||||
|
|
||||||
|
VBO m_vbo;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -317,6 +317,7 @@ xcopy /D /Y "$(ProjectDir)\SDL\$(Platform)\$(Configuration)\SDL.dll" "$(TargetDi
|
||||||
<ClCompile Include="..\Src\Graphics\New3D\New3D.cpp" />
|
<ClCompile Include="..\Src\Graphics\New3D\New3D.cpp" />
|
||||||
<ClCompile Include="..\Src\Graphics\New3D\PolyHeader.cpp" />
|
<ClCompile Include="..\Src\Graphics\New3D\PolyHeader.cpp" />
|
||||||
<ClCompile Include="..\Src\Graphics\New3D\R3DFloat.cpp" />
|
<ClCompile Include="..\Src\Graphics\New3D\R3DFloat.cpp" />
|
||||||
|
<ClCompile Include="..\Src\Graphics\New3D\R3DScrollFog.cpp" />
|
||||||
<ClCompile Include="..\Src\Graphics\New3D\R3DShader.cpp" />
|
<ClCompile Include="..\Src\Graphics\New3D\R3DShader.cpp" />
|
||||||
<ClCompile Include="..\Src\Graphics\New3D\Texture.cpp" />
|
<ClCompile Include="..\Src\Graphics\New3D\Texture.cpp" />
|
||||||
<ClCompile Include="..\Src\Graphics\New3D\TextureSheet.cpp" />
|
<ClCompile Include="..\Src\Graphics\New3D\TextureSheet.cpp" />
|
||||||
|
@ -542,6 +543,7 @@ xcopy /D /Y "$(ProjectDir)\SDL\$(Platform)\$(Configuration)\SDL.dll" "$(TargetDi
|
||||||
<ClInclude Include="..\Src\Graphics\New3D\PolyHeader.h" />
|
<ClInclude Include="..\Src\Graphics\New3D\PolyHeader.h" />
|
||||||
<ClInclude Include="..\Src\Graphics\New3D\R3DData.h" />
|
<ClInclude Include="..\Src\Graphics\New3D\R3DData.h" />
|
||||||
<ClInclude Include="..\Src\Graphics\New3D\R3DFloat.h" />
|
<ClInclude Include="..\Src\Graphics\New3D\R3DFloat.h" />
|
||||||
|
<ClInclude Include="..\Src\Graphics\New3D\R3DScrollFog.h" />
|
||||||
<ClInclude Include="..\Src\Graphics\New3D\R3DShader.h" />
|
<ClInclude Include="..\Src\Graphics\New3D\R3DShader.h" />
|
||||||
<ClInclude Include="..\Src\Graphics\New3D\Texture.h" />
|
<ClInclude Include="..\Src\Graphics\New3D\Texture.h" />
|
||||||
<ClInclude Include="..\Src\Graphics\New3D\TextureSheet.h" />
|
<ClInclude Include="..\Src\Graphics\New3D\TextureSheet.h" />
|
||||||
|
|
|
@ -434,6 +434,9 @@
|
||||||
<ClCompile Include="..\Src\OSD\Logger.cpp">
|
<ClCompile Include="..\Src\OSD\Logger.cpp">
|
||||||
<Filter>Source Files\OSD</Filter>
|
<Filter>Source Files\OSD</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\Src\Graphics\New3D\R3DScrollFog.cpp">
|
||||||
|
<Filter>Source Files\Graphics\New</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<MASM Include="..\Src\CPU\68K\Turbo68K\Turbo68K.asm">
|
<MASM Include="..\Src\CPU\68K\Turbo68K\Turbo68K.asm">
|
||||||
|
@ -802,6 +805,9 @@
|
||||||
<ClInclude Include="..\Src\Pkgs\tinyxml2.h">
|
<ClInclude Include="..\Src\Pkgs\tinyxml2.h">
|
||||||
<Filter>Header Files\Pkgs</Filter>
|
<Filter>Header Files\Pkgs</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\Src\Graphics\New3D\R3DScrollFog.h">
|
||||||
|
<Filter>Source Files\Graphics\New</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<CustomBuild Include="..\Src\Debugger\ReadMe.txt">
|
<CustomBuild Include="..\Src\Debugger\ReadMe.txt">
|
||||||
|
|
Loading…
Reference in a new issue