env map rendering

This commit is contained in:
aap
2021-01-10 11:59:51 +01:00
parent b0e395e853
commit 0ee87d7b46
24 changed files with 991 additions and 20 deletions

View File

@@ -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");
}