summaryrefslogtreecommitdiffstats
path: root/src/extras/custompipes_gl.cpp
diff options
context:
space:
mode:
authoraap <aap@papnet.eu>2021-01-10 11:59:51 +0100
committeraap <aap@papnet.eu>2021-01-10 11:59:57 +0100
commit0ee87d7b46c4e340554f25d38d01bc1accb8c826 (patch)
tree6021adcb61abe61cdceb691a867117b0e116eff3 /src/extras/custompipes_gl.cpp
parentMerge pull request #942 from majesticCoding/lcs (diff)
downloadre3-0ee87d7b46c4e340554f25d38d01bc1accb8c826.tar
re3-0ee87d7b46c4e340554f25d38d01bc1accb8c826.tar.gz
re3-0ee87d7b46c4e340554f25d38d01bc1accb8c826.tar.bz2
re3-0ee87d7b46c4e340554f25d38d01bc1accb8c826.tar.lz
re3-0ee87d7b46c4e340554f25d38d01bc1accb8c826.tar.xz
re3-0ee87d7b46c4e340554f25d38d01bc1accb8c826.tar.zst
re3-0ee87d7b46c4e340554f25d38d01bc1accb8c826.zip
Diffstat (limited to 'src/extras/custompipes_gl.cpp')
-rw-r--r--src/extras/custompipes_gl.cpp141
1 files changed, 139 insertions, 2 deletions
diff --git a/src/extras/custompipes_gl.cpp b/src/extras/custompipes_gl.cpp
index 193a4ac6..e9350802 100644
--- a/src/extras/custompipes_gl.cpp
+++ b/src/extras/custompipes_gl.cpp
@@ -3,6 +3,8 @@
#ifdef RW_OPENGL
#ifdef EXTENDED_PIPELINES
+#include "rpmatfx.h"
+
#include "main.h"
#include "RwHelper.h"
#include "Lights.h"
@@ -37,14 +39,126 @@ static int32 u_amb;
static int32 u_emiss;
static int32 u_colorscale;
+static int32 u_texMatrix;
+static int32 u_fxparams;
+
#define U(i) currentShader->uniformLocations[i]
/*
- * Neo Vehicle pipe
+ * Leeds & Neo Vehicle pipe
*/
+rw::gl3::Shader *leedsVehicleShader_add;
+rw::gl3::Shader *leedsVehicleShader_blend;
+
rw::gl3::Shader *neoVehicleShader;
+static rw::RawMatrix normal2texcoord_flipU = {
+ { -0.5f, 0.0f, 0.0f }, 0.0f,
+ { 0.0f, -0.5f, 0.0f }, 0.0f,
+ { 0.0f, 0.0f, 1.0f }, 0.0f,
+ { 0.5f, 0.5f, 0.0f }, 1.0f
+};
+
+static void
+uploadEnvMatrix(rw::Frame *frame)
+{
+ using namespace rw;
+ using namespace rw::gl3;
+
+ Matrix invMat;
+ if(frame == nil)
+ frame = engine->currentCamera->getFrame();
+
+ // cache the matrix across multiple meshes
+ static RawMatrix envMtx;
+// can't do it, frame matrix may change
+// if(frame != lastEnvFrame){
+// lastEnvFrame = frame;
+ {
+
+ Matrix tmp = *frame->getLTM();
+ // Now the weird part: we remove the camera pitch
+ tmp.at.z = 0.0f;
+ tmp.at = normalize(tmp.at);
+ tmp.right.x = -tmp.at.y;
+ tmp.right.y = tmp.at.x;
+ tmp.right.z = 0.0f;;
+ tmp.up.set(0.0f, 0.0f, 1.0f);
+ tmp.pos.set(0.0f, 0.0f, 0.0f);
+ tmp.flags = Matrix::TYPEORTHONORMAL;
+
+ RawMatrix invMtx;
+ Matrix::invert(&invMat, &tmp);
+ convMatrix(&invMtx, &invMat);
+ RawMatrix::mult(&envMtx, &invMtx, &normal2texcoord_flipU);
+ }
+ glUniformMatrix4fv(U(u_texMatrix), 1, GL_FALSE, (float*)&envMtx);
+}
+
+static void
+leedsVehicleRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header)
+{
+ using namespace rw;
+ using namespace rw::gl3;
+
+ Material *m;
+
+ setWorldMatrix(atomic->getFrame()->getLTM());
+ lightingCB(atomic);
+
+#ifdef RW_GL_USE_VAOS
+ glBindVertexArray(header->vao);
+#else
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo);
+ glBindBuffer(GL_ARRAY_BUFFER, header->vbo);
+ setAttribPointers(header->attribDesc, header->numAttribs);
+#endif
+
+ InstanceData *inst = header->inst;
+ rw::int32 n = header->numMeshes;
+
+ if(bChromeCheat)
+ leedsVehicleShader_blend->use();
+ else
+ leedsVehicleShader_add->use();
+
+ setTexture(1, EnvMapTex);
+ uploadEnvMatrix(nil);
+
+ SetRenderState(SRCBLEND, BLENDONE);
+
+ while(n--){
+ m = inst->material;
+
+ rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF);
+
+ float coef = 0.0f;
+ if(RpMatFXMaterialGetEffects(m) == rpMATFXEFFECTENVMAP)
+ coef = RpMatFXMaterialGetEnvMapCoefficient(m);
+ coef *= 0.5f;
+ if(bChromeCheat && coef > 0.0f)
+ coef = 1.0f;
+ glUniform1f(U(u_fxparams), coef);
+
+ setMaterial(m->color, m->surfaceProps);
+
+ setTexture(0, m->texture);
+
+ drawInst(header, inst);
+ inst++;
+ }
+
+ setTexture(1, nil);
+
+ SetRenderState(SRCBLEND, BLENDSRCALPHA);
+
+#ifndef RW_GL_USE_VAOS
+ disableAttribPointers(header->attribDesc, header->numAttribs);
+#endif
+}
+
+
static void
uploadSpecLights(void)
{
@@ -85,7 +199,8 @@ vehicleRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header)
// TODO: make this less of a kludge
if(VehiclePipeSwitch == VEHICLEPIPE_MATFX){
- matFXGlobals.pipelines[rw::platform]->render(atomic);
+ leedsVehicleRenderCB(atomic, header);
+// matFXGlobals.pipelines[rw::platform]->render(atomic);
return;
}
@@ -172,6 +287,19 @@ CreateVehiclePipe(void)
assert(neoVehicleShader);
}
+ {
+#include "shaders/leedsVehicle_add_gl.inc"
+#include "shaders/leedsVehicle_blend_gl.inc"
+#include "shaders/leedsVehicle_vs_gl.inc"
+ const char *vs[] = { shaderDecl, header_vert_src, leedsVehicle_vert_src, nil };
+ const char *fs_add[] = { shaderDecl, header_frag_src, leedsVehicle_add_frag_src, nil };
+ const char *fs_blend[] = { shaderDecl, header_frag_src, leedsVehicle_blend_frag_src, nil };
+ leedsVehicleShader_add = Shader::create(vs, fs_add);
+ assert(leedsVehicleShader_add);
+ leedsVehicleShader_blend = Shader::create(vs, fs_blend);
+ assert(leedsVehicleShader_blend);
+ }
+
rw::gl3::ObjPipeline *pipe = rw::gl3::ObjPipeline::create();
pipe->instanceCB = rw::gl3::defaultInstanceCB;
@@ -186,6 +314,12 @@ DestroyVehiclePipe(void)
neoVehicleShader->destroy();
neoVehicleShader = nil;
+ leedsVehicleShader_add->destroy();
+ leedsVehicleShader_add = nil;
+
+ leedsVehicleShader_blend->destroy();
+ leedsVehicleShader_blend = nil;
+
((rw::gl3::ObjPipeline*)vehiclePipe)->destroy();
vehiclePipe = nil;
}
@@ -611,6 +745,9 @@ CustomPipeRegisterGL(void)
u_amb = rw::gl3::registerUniform("u_amb");
u_emiss = rw::gl3::registerUniform("u_emiss");
u_colorscale = rw::gl3::registerUniform("u_colorscale");
+
+ u_texMatrix = rw::gl3::registerUniform("u_texMatrix");
+ u_fxparams = rw::gl3::registerUniform("u_fxparams");
}