: ISceneNode(0, 0), Driver(driver),\r
CursorControl(cursorControl),\r
ActiveCamera(0), ShadowColor(150,0,0,0), AmbientLight(0,0,0,0), Parameters(0),\r
- MeshCache(cache), CurrentRenderPass(ESNRP_NONE)\r
+ MeshCache(cache), CurrentRenderPass(ESNRP_NONE), LightManager(0)\r
{\r
#ifdef _DEBUG\r
ISceneManager::setDebugName("CSceneManager ISceneManager");\r
if (Parameters)\r
Parameters->drop();\r
\r
+ if (LightManager)\r
+ LightManager->drop();\r
+\r
// remove all nodes before dropping the driver\r
// as render targets may be destroyed twice\r
\r
// let all nodes register themselves\r
OnRegisterSceneNode();\r
\r
+ if (LightManager)\r
+ LightManager->OnPreRender(LightList);\r
+\r
//render camera scenes\r
{\r
CurrentRenderPass = ESNRP_CAMERA;\r
Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRenderPass) != 0);\r
\r
+ if (LightManager)\r
+ LightManager->OnRenderPassPreRender(CurrentRenderPass);\r
+\r
for (i=0; i<CameraList.size(); ++i)\r
CameraList[i]->render();\r
\r
CameraList.set_used(0);\r
+\r
+ if (LightManager)\r
+ LightManager->OnRenderPassPostRender(CurrentRenderPass);\r
}\r
\r
//render lights scenes\r
CurrentRenderPass = ESNRP_LIGHT;\r
Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRenderPass) != 0);\r
\r
- core::vector3df camWorldPos(0, 0, 0);\r
- if (ActiveCamera)\r
- camWorldPos = ActiveCamera->getAbsolutePosition();\r
+ if (LightManager)\r
+ {\r
+ LightManager->OnRenderPassPreRender(CurrentRenderPass);\r
+ }\r
+ else\r
+ {\r
+ // Sort the lights by distance from the camera\r
+ core::vector3df camWorldPos(0, 0, 0);\r
+ if (ActiveCamera)\r
+ camWorldPos = ActiveCamera->getAbsolutePosition();\r
\r
- core::array<DistanceNodeEntry> SortedLights;\r
- SortedLights.set_used(LightList.size());\r
- for (s32 light = (s32)LightList.size() - 1; light >= 0; --light)\r
- SortedLights[light].setNodeAndDistanceFromPosition(LightList[light], camWorldPos);\r
+ core::array<DistanceNodeEntry> SortedLights;\r
+ SortedLights.set_used(LightList.size());\r
+ for (s32 light = (s32)LightList.size() - 1; light >= 0; --light)\r
+ SortedLights[light].setNodeAndDistanceFromPosition(LightList[light], camWorldPos);\r
\r
- SortedLights.set_sorted(false);\r
- SortedLights.sort();\r
+ SortedLights.set_sorted(false);\r
+ SortedLights.sort();\r
\r
- for(s32 light = (s32)LightList.size() - 1; light >= 0; --light)\r
- LightList[light] = SortedLights[light].Node;\r
+ for(s32 light = (s32)LightList.size() - 1; light >= 0; --light)\r
+ LightList[light] = SortedLights[light].Node;\r
+ }\r
\r
Driver->deleteAllDynamicLights();\r
\r
\r
u32 maxLights = LightList.size();\r
\r
+ if (!LightManager)\r
+ maxLights = core::min_ ( Driver->getMaximalDynamicLightAmount(), maxLights);\r
+\r
for (i=0; i< maxLights; ++i)\r
LightList[i]->render();\r
+\r
+ if (LightManager)\r
+ LightManager->OnRenderPassPostRender(CurrentRenderPass);\r
}\r
\r
// render skyboxes\r
CurrentRenderPass = ESNRP_SKY_BOX;\r
Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRenderPass) != 0);\r
\r
- for (i=0; i<SkyBoxList.size(); ++i)\r
- SkyBoxList[i]->render();\r
+ if (LightManager)\r
+ {\r
+ LightManager->OnRenderPassPreRender(CurrentRenderPass);\r
+ for (i=0; i<SkyBoxList.size(); ++i)\r
+ {\r
+ ISceneNode* node = SkyBoxList[i];\r
+ LightManager->OnNodePreRender(node);\r
+ node->render();\r
+ LightManager->OnNodePostRender(node);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ for (i=0; i<SkyBoxList.size(); ++i)\r
+ SkyBoxList[i]->render();\r
+ }\r
\r
SkyBoxList.set_used(0);\r
+\r
+ if (LightManager)\r
+ LightManager->OnRenderPassPostRender(CurrentRenderPass);\r
}\r
\r
// render default objects\r
\r
SolidNodeList.sort(); // sort by textures\r
\r
- for (i=0; i<SolidNodeList.size(); ++i)\r
- SolidNodeList[i].Node->render();\r
+ if (LightManager)\r
+ {\r
+ LightManager->OnRenderPassPreRender(CurrentRenderPass);\r
+ for (i=0; i<SolidNodeList.size(); ++i)\r
+ {\r
+ ISceneNode* node = SolidNodeList[i].Node;\r
+ LightManager->OnNodePreRender(node);\r
+ node->render();\r
+ LightManager->OnNodePostRender(node);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ for (i=0; i<SolidNodeList.size(); ++i)\r
+ SolidNodeList[i].Node->render();\r
+ }\r
\r
SolidNodeList.set_used(0);\r
+\r
+ if (LightManager)\r
+ LightManager->OnRenderPassPostRender(CurrentRenderPass);\r
}\r
\r
// render shadows\r
CurrentRenderPass = ESNRP_SHADOW;\r
Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRenderPass) != 0);\r
\r
- for (i=0; i<ShadowNodeList.size(); ++i)\r
- ShadowNodeList[i]->render();\r
+ if (LightManager)\r
+ {\r
+ LightManager->OnRenderPassPreRender(CurrentRenderPass);\r
+ for (i=0; i<ShadowNodeList.size(); ++i)\r
+ {\r
+ ISceneNode* node = ShadowNodeList[i];\r
+ LightManager->OnNodePreRender(node);\r
+ node->render();\r
+ LightManager->OnNodePostRender(node);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ for (i=0; i<ShadowNodeList.size(); ++i)\r
+ ShadowNodeList[i]->render();\r
+ }\r
\r
if (!ShadowNodeList.empty())\r
Driver->drawStencilShadow(true,ShadowColor, ShadowColor,\r
ShadowColor, ShadowColor);\r
\r
ShadowNodeList.set_used(0);\r
+\r
+ if (LightManager)\r
+ LightManager->OnRenderPassPostRender(CurrentRenderPass);\r
}\r
\r
// render transparent objects.\r
Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRenderPass) != 0);\r
\r
TransparentNodeList.sort(); // sort by distance from camera\r
- for (i=0; i<TransparentNodeList.size(); ++i)\r
- TransparentNodeList[i].Node->render();\r
+ if (LightManager)\r
+ {\r
+ LightManager->OnRenderPassPreRender(CurrentRenderPass);\r
+\r
+ for (i=0; i<TransparentNodeList.size(); ++i)\r
+ {\r
+ ISceneNode* node = TransparentNodeList[i].Node;\r
+ LightManager->OnNodePreRender(node);\r
+ node->render();\r
+ LightManager->OnNodePostRender(node);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ for (i=0; i<TransparentNodeList.size(); ++i)\r
+ TransparentNodeList[i].Node->render();\r
+ }\r
\r
TransparentNodeList.set_used(0);\r
+\r
+ if (LightManager)\r
+ LightManager->OnRenderPassPostRender(CurrentRenderPass);\r
}\r
\r
// render transparent effect objects.\r
\r
TransparentEffectNodeList.sort(); // sort by distance from camera\r
\r
- for (i=0; i<TransparentEffectNodeList.size(); ++i)\r
- TransparentEffectNodeList[i].Node->render();\r
+ if (LightManager)\r
+ {\r
+ LightManager->OnRenderPassPreRender(CurrentRenderPass);\r
+\r
+ for (i=0; i<TransparentEffectNodeList.size(); ++i)\r
+ {\r
+ ISceneNode* node = TransparentEffectNodeList[i].Node;\r
+ LightManager->OnNodePreRender(node);\r
+ node->render();\r
+ LightManager->OnNodePostRender(node);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ for (i=0; i<TransparentEffectNodeList.size(); ++i)\r
+ TransparentEffectNodeList[i].Node->render();\r
+ }\r
\r
TransparentEffectNodeList.set_used(0);\r
}\r
CurrentRenderPass = ESNRP_GUI;\r
Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRenderPass) != 0);\r
\r
- for (i=0; i<GuiNodeList.size(); ++i)\r
- GuiNodeList[i]->render();\r
+ if (LightManager)\r
+ {\r
+ LightManager->OnRenderPassPreRender(CurrentRenderPass);\r
+\r
+ for (i=0; i<GuiNodeList.size(); ++i)\r
+ {\r
+ ISceneNode* node = GuiNodeList[i];\r
+ LightManager->OnNodePreRender(node);\r
+ node->render();\r
+ LightManager->OnNodePostRender(node);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ for (i=0; i<GuiNodeList.size(); ++i)\r
+ GuiNodeList[i]->render();\r
+ }\r
\r
GuiNodeList.set_used(0);\r
}\r
\r
+\r
+ if (LightManager)\r
+ LightManager->OnPostRender();\r
+\r
LightList.set_used(0);\r
clearDeletionList();\r
\r
CurrentRenderPass = ESNRP_NONE;\r
}\r
\r
+void CSceneManager::setLightManager(ILightManager* lightManager)\r
+{\r
+ if (lightManager)\r
+ lightManager->grab();\r
+ if (LightManager)\r
+ LightManager->drop();\r
+\r
+ LightManager = lightManager;\r
+}\r
+\r
\r
//! Sets the color of stencil buffers shadows drawn by the scene manager.\r
void CSceneManager::setShadowColor(video::SColor color)\r