moved new renderer; implemented leeds building rendering
This commit is contained in:
@@ -245,7 +245,7 @@ worldRenderCB(rw::Atomic *atomic, rw::gl3::InstanceDataHeader *header)
|
||||
|
||||
setTexture(0, m->texture);
|
||||
|
||||
setMaterial(m->color, m->surfaceProps);
|
||||
setMaterial(m->color, m->surfaceProps, 0.5f);
|
||||
|
||||
rw::SetRenderState(VERTEXALPHA, inst->vertexAlpha || m->color.alpha != 0xFF);
|
||||
|
||||
@@ -616,5 +616,190 @@ CustomPipeRegisterGL(void)
|
||||
|
||||
}
|
||||
|
||||
#ifdef NEW_RENDERER
|
||||
|
||||
namespace WorldRender
|
||||
{
|
||||
|
||||
struct BuildingInst
|
||||
{
|
||||
rw::Matrix matrix;
|
||||
rw::gl3::InstanceDataHeader *instHeader;
|
||||
uint8 fadeAlpha;
|
||||
bool lighting;
|
||||
};
|
||||
BuildingInst blendInsts[3][2000];
|
||||
int numBlendInsts[3];
|
||||
|
||||
static RwRGBAReal black;
|
||||
|
||||
static bool
|
||||
IsTextureTransparent(RwTexture *tex)
|
||||
{
|
||||
if(tex == nil || tex->raster == nil)
|
||||
return false;
|
||||
return PLUGINOFFSET(rw::gl3::Gl3Raster, tex->raster, rw::gl3::nativeRasterOffset)->hasAlpha;
|
||||
}
|
||||
|
||||
// Render all opaque meshes and put atomics that needs blending
|
||||
// into the deferred list.
|
||||
void
|
||||
AtomicFirstPass(RpAtomic *atomic, int pass)
|
||||
{
|
||||
using namespace rw;
|
||||
using namespace rw::gl3;
|
||||
|
||||
BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]];
|
||||
|
||||
atomic->getPipeline()->instance(atomic);
|
||||
building->instHeader = (gl3::InstanceDataHeader*)atomic->geometry->instData;
|
||||
assert(building->instHeader != nil);
|
||||
assert(building->instHeader->platform == PLATFORM_GL3);
|
||||
building->fadeAlpha = 255;
|
||||
building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT);
|
||||
|
||||
bool setupDone = false;
|
||||
bool defer = false;
|
||||
building->matrix = *atomic->getFrame()->getLTM();
|
||||
|
||||
float colorscale[4];
|
||||
|
||||
InstanceData *inst = building->instHeader->inst;
|
||||
for(rw::uint32 i = 0; i < building->instHeader->numMeshes; i++, inst++){
|
||||
Material *m = inst->material;
|
||||
|
||||
if(inst->vertexAlpha || m->color.alpha != 255 ||
|
||||
IsTextureTransparent(m->texture)){
|
||||
defer = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
// alright we're rendering this atomic
|
||||
if(!setupDone){
|
||||
CustomPipes::leedsWorldShader->use();
|
||||
// defaultShader->use();
|
||||
setWorldMatrix(&building->matrix);
|
||||
#ifdef RW_GL_USE_VAOS
|
||||
glBindVertexArray(building->instHeader->vao);
|
||||
#else
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, building->instHeader->ibo);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, building->instHeader->vbo);
|
||||
setAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs);
|
||||
#endif
|
||||
|
||||
RGBAf amb, emiss;
|
||||
amb.red = CTimeCycle::GetAmbientRed();
|
||||
amb.green = CTimeCycle::GetAmbientGreen();
|
||||
amb.blue = CTimeCycle::GetAmbientBlue();
|
||||
amb.alpha = 1.0f;
|
||||
emiss = pAmbient->color;
|
||||
|
||||
glUniform4fv(U(CustomPipes::u_amb), 1, (float*)&amb);
|
||||
glUniform4fv(U(CustomPipes::u_emiss), 1, (float*)&emiss);
|
||||
|
||||
colorscale[3] = 1.0f;
|
||||
|
||||
setupDone = true;
|
||||
}
|
||||
|
||||
setMaterial(m->color, m->surfaceProps, 0.5f);
|
||||
|
||||
float cs = 1.0f;
|
||||
if(m->texture)
|
||||
cs = 255/128.0f;
|
||||
colorscale[0] = colorscale[1] = colorscale[2] = cs;
|
||||
glUniform4fv(U(CustomPipes::u_colorscale), 1, colorscale);
|
||||
|
||||
setTexture(0, m->texture);
|
||||
|
||||
drawInst(building->instHeader, inst);
|
||||
}
|
||||
#ifndef RW_GL_USE_VAOS
|
||||
disableAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs);
|
||||
#endif
|
||||
if(defer)
|
||||
numBlendInsts[pass]++;
|
||||
}
|
||||
|
||||
void
|
||||
AtomicFullyTransparent(RpAtomic *atomic, int pass, int fadeAlpha)
|
||||
{
|
||||
using namespace rw;
|
||||
using namespace rw::gl3;
|
||||
|
||||
BuildingInst *building = &blendInsts[pass][numBlendInsts[pass]];
|
||||
|
||||
atomic->getPipeline()->instance(atomic);
|
||||
building->instHeader = (gl3::InstanceDataHeader*)atomic->geometry->instData;
|
||||
assert(building->instHeader != nil);
|
||||
assert(building->instHeader->platform == PLATFORM_GL3);
|
||||
building->fadeAlpha = fadeAlpha;
|
||||
building->lighting = !!(atomic->geometry->flags & rw::Geometry::LIGHT);
|
||||
building->matrix = *atomic->getFrame()->getLTM();
|
||||
numBlendInsts[pass]++;
|
||||
}
|
||||
|
||||
void
|
||||
RenderBlendPass(int pass)
|
||||
{
|
||||
using namespace rw;
|
||||
using namespace rw::gl3;
|
||||
|
||||
CustomPipes::leedsWorldShader->use();
|
||||
|
||||
RGBAf amb, emiss;
|
||||
amb.red = CTimeCycle::GetAmbientRed();
|
||||
amb.green = CTimeCycle::GetAmbientGreen();
|
||||
amb.blue = CTimeCycle::GetAmbientBlue();
|
||||
amb.alpha = 1.0f;
|
||||
emiss = pAmbient->color;
|
||||
|
||||
glUniform4fv(U(CustomPipes::u_amb), 1, (float*)&amb);
|
||||
glUniform4fv(U(CustomPipes::u_emiss), 1, (float*)&emiss);
|
||||
|
||||
float colorscale[4];
|
||||
colorscale[3] = 1.0f;
|
||||
|
||||
int i;
|
||||
for(i = 0; i < numBlendInsts[pass]; i++){
|
||||
BuildingInst *building = &blendInsts[pass][i];
|
||||
|
||||
#ifdef RW_GL_USE_VAOS
|
||||
glBindVertexArray(building->instHeader->vao);
|
||||
#else
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, building->instHeader->ibo);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, building->instHeader->vbo);
|
||||
setAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs);
|
||||
#endif
|
||||
setWorldMatrix(&building->matrix);
|
||||
|
||||
InstanceData *inst = building->instHeader->inst;
|
||||
for(rw::uint32 j = 0; j < building->instHeader->numMeshes; j++, inst++){
|
||||
Material *m = inst->material;
|
||||
if(!inst->vertexAlpha && m->color.alpha == 255 && !IsTextureTransparent(m->texture) && building->fadeAlpha == 255)
|
||||
continue; // already done this one
|
||||
|
||||
rw::RGBA color = m->color;
|
||||
color.alpha = (color.alpha * building->fadeAlpha)/255;
|
||||
setMaterial(color, m->surfaceProps, 0.5f);
|
||||
|
||||
float cs = 1.0f;
|
||||
if(m->texture)
|
||||
cs = 255/128.0f;
|
||||
colorscale[0] = colorscale[1] = colorscale[2] = cs;
|
||||
glUniform4fv(U(CustomPipes::u_colorscale), 1, colorscale);
|
||||
|
||||
setTexture(0, m->texture);
|
||||
|
||||
drawInst(building->instHeader, inst);
|
||||
}
|
||||
#ifndef RW_GL_USE_VAOS
|
||||
disableAttribPointers(building->instHeader->attribDesc, building->instHeader->numAttribs);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user