STKMesh: Filter stkmesh using stencil and disable lightblend on them.

This commit is contained in:
Vincent Lejeune
2014-01-16 00:45:32 +01:00
parent 7cda534451
commit 734f320f75
4 changed files with 18 additions and 5 deletions

View File

@@ -61,6 +61,7 @@ GlowNode::~GlowNode()
void GlowNode::render()
{
return;
IVideoDriver * const drv = irr_driver->getVideoDriver();
drv->setTransform(ETS_WORLD, AbsoluteTransformation);
drv->setMaterial(mat);

View File

@@ -632,6 +632,8 @@ void PostProcessing::renderLightbBlend(ITexture *diffuse, ITexture *specular, IT
const SColorf s = irr_driver->getSceneManager()->getAmbientLight();
if (!LightBlendShader::Program)
LightBlendShader::init();
glStencilFunc(GL_EQUAL, 1, ~0);
glEnable(GL_STENCIL_TEST);
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
if (debug)
@@ -664,6 +666,7 @@ void PostProcessing::renderLightbBlend(ITexture *diffuse, ITexture *specular, IT
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glDisable(GL_STENCIL_TEST);
}

View File

@@ -193,14 +193,21 @@ void IrrDriver::renderGLSL(float dt)
m_video_driver->setRenderTarget(m_mrt, false, false);
m_renderpass = scene::ESNRP_CAMERA | scene::ESNRP_SOLID;
glClear(GL_STENCIL_BUFFER_BIT);
glStencilFunc(GL_ALWAYS, 1, ~0);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glEnable(GL_STENCIL_TEST);
m_scene_manager->drawAll(m_renderpass);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glDisable(GL_STENCIL_TEST);
irr_driver->setProjMatrix(irr_driver->getVideoDriver()->getTransform(video::ETS_PROJECTION));
irr_driver->setViewMatrix(irr_driver->getVideoDriver()->getTransform(video::ETS_VIEW));
irr_driver->genProjViewMatrix();
ShadowImportanceProvider * const sicb = (ShadowImportanceProvider *)
irr_driver->getCallback(ES_SHADOW_IMPORTANCE);
sicb->updateIPVMatrix();
// Todo : reenable glow and shadows
//ShadowImportanceProvider * const sicb = (ShadowImportanceProvider *)
// irr_driver->getCallback(ES_SHADOW_IMPORTANCE);
//sicb->updateIPVMatrix();
// Used to cull glowing items & lights
const core::aabbox3df cambox = camnode->getViewFrustum()->getBoundingBox();
@@ -208,14 +215,14 @@ void IrrDriver::renderGLSL(float dt)
// Render anything glowing.
if (!m_mipviz && !m_wireframe)
{
renderGlow(overridemat, glows, cambox, cam);
//renderGlow(overridemat, glows, cambox, cam);
} // end glow
// Shadows
if (!m_mipviz && !m_wireframe && UserConfigParams::m_shadows &&
World::getWorld()->getTrack()->hasShadows())
{
renderShadows(sicb, camnode, overridemat, camera);
//renderShadows(sicb, camnode, overridemat, camera);
}
// Lights

View File

@@ -155,6 +155,7 @@ void draw(const GLMesh &mesh, video::E_MATERIAL_TYPE type)
{
if (!mesh.textures)
return;
glStencilFunc(GL_ALWAYS, 0, ~0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_ALPHA_TEST);
glDepthMask(GL_TRUE);
@@ -185,6 +186,7 @@ void draw(const GLMesh &mesh, video::E_MATERIAL_TYPE type)
glDrawElements(ptype, count, itype, 0);
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glStencilFunc(GL_ALWAYS, 1, ~0);
video::SMaterial material;
material.MaterialType = irr_driver->getShader(ES_RAIN);