Commit f84412dc authored by Nadro's avatar Nadro

- Fixed D3D9 shadow bug visible in Example no. 8.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@4313 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 0755c18c
...@@ -1507,17 +1507,19 @@ void CSceneManager::drawAll() ...@@ -1507,17 +1507,19 @@ void CSceneManager::drawAll()
LightManager->OnRenderPassPostRender(CurrentRendertime); LightManager->OnRenderPassPostRender(CurrentRendertime);
} }
// render shadows // render transparent objects.
{ {
CurrentRendertime = ESNRP_SHADOW; CurrentRendertime = ESNRP_TRANSPARENT;
Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRendertime) != 0); Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRendertime) != 0);
TransparentNodeList.sort(); // sort by distance from camera
if (LightManager) if (LightManager)
{ {
LightManager->OnRenderPassPreRender(CurrentRendertime); LightManager->OnRenderPassPreRender(CurrentRendertime);
for (i=0; i<ShadowNodeList.size(); ++i)
for (i=0; i<TransparentNodeList.size(); ++i)
{ {
ISceneNode* node = ShadowNodeList[i]; ISceneNode* node = TransparentNodeList[i].Node;
LightManager->OnNodePreRender(node); LightManager->OnNodePreRender(node);
node->render(); node->render();
LightManager->OnNodePostRender(node); LightManager->OnNodePostRender(node);
...@@ -1525,33 +1527,28 @@ void CSceneManager::drawAll() ...@@ -1525,33 +1527,28 @@ void CSceneManager::drawAll()
} }
else else
{ {
for (i=0; i<ShadowNodeList.size(); ++i) for (i=0; i<TransparentNodeList.size(); ++i)
ShadowNodeList[i]->render(); TransparentNodeList[i].Node->render();
} }
if (!ShadowNodeList.empty()) Parameters.setAttribute ( "drawn_transparent", (s32) TransparentNodeList.size() );
Driver->drawStencilShadow(true,ShadowColor, ShadowColor, TransparentNodeList.set_used(0);
ShadowColor, ShadowColor);
ShadowNodeList.set_used(0);
if (LightManager) if (LightManager)
LightManager->OnRenderPassPostRender(CurrentRendertime); LightManager->OnRenderPassPostRender(CurrentRendertime);
} }
// render transparent objects. // render shadows
{ {
CurrentRendertime = ESNRP_TRANSPARENT; CurrentRendertime = ESNRP_SHADOW;
Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRendertime) != 0); Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRendertime) != 0);
TransparentNodeList.sort(); // sort by distance from camera
if (LightManager) if (LightManager)
{ {
LightManager->OnRenderPassPreRender(CurrentRendertime); LightManager->OnRenderPassPreRender(CurrentRendertime);
for (i=0; i<ShadowNodeList.size(); ++i)
for (i=0; i<TransparentNodeList.size(); ++i)
{ {
ISceneNode* node = TransparentNodeList[i].Node; ISceneNode* node = ShadowNodeList[i];
LightManager->OnNodePreRender(node); LightManager->OnNodePreRender(node);
node->render(); node->render();
LightManager->OnNodePostRender(node); LightManager->OnNodePostRender(node);
...@@ -1559,12 +1556,15 @@ void CSceneManager::drawAll() ...@@ -1559,12 +1556,15 @@ void CSceneManager::drawAll()
} }
else else
{ {
for (i=0; i<TransparentNodeList.size(); ++i) for (i=0; i<ShadowNodeList.size(); ++i)
TransparentNodeList[i].Node->render(); ShadowNodeList[i]->render();
} }
Parameters.setAttribute ( "drawn_transparent", (s32) TransparentNodeList.size() ); if (!ShadowNodeList.empty())
TransparentNodeList.set_used(0); Driver->drawStencilShadow(true,ShadowColor, ShadowColor,
ShadowColor, ShadowColor);
ShadowNodeList.set_used(0);
if (LightManager) if (LightManager)
LightManager->OnRenderPassPostRender(CurrentRendertime); LightManager->OnRenderPassPostRender(CurrentRendertime);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment