]> git.lizzy.rs Git - irrlicht.git/blobdiff - source/Irrlicht/CSceneManager.cpp
Add back LightManager
[irrlicht.git] / source / Irrlicht / CSceneManager.cpp
index 6882a5b36790a273c6ec0c0746882bc8cdd340ca..de80609ff455435fe0e7ad2dec15ba2adde942c8 100644 (file)
@@ -46,7 +46,7 @@ CSceneManager::CSceneManager(video::IVideoDriver* driver,
 : 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
@@ -117,6 +117,9 @@ CSceneManager::~CSceneManager()
        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
@@ -585,15 +588,24 @@ void CSceneManager::drawAll()
        // 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
@@ -601,20 +613,28 @@ void CSceneManager::drawAll()
                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
@@ -622,8 +642,14 @@ void CSceneManager::drawAll()
 \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
@@ -631,10 +657,27 @@ void CSceneManager::drawAll()
                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
@@ -644,10 +687,27 @@ void CSceneManager::drawAll()
 \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
@@ -655,14 +715,31 @@ void CSceneManager::drawAll()
                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
@@ -671,10 +748,28 @@ void CSceneManager::drawAll()
                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
@@ -684,8 +779,23 @@ void CSceneManager::drawAll()
 \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
@@ -695,18 +805,47 @@ void CSceneManager::drawAll()
                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