env map rendering
This commit is contained in:
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user