소스 검색

Makes point and spot lights be correctly culled with zoning like other objects.

Areloch 9 년 전
부모
커밋
dfb8f4f5e5

+ 1 - 1
Engine/source/T3D/lightBase.cpp

@@ -68,7 +68,7 @@ LightBase::LightBase()
       mFlareScale( 1.0f )
 {
    mNetFlags.set( Ghostable | ScopeAlways );
-   mTypeMask = EnvironmentObjectType | LightObjectType;
+   mTypeMask = LightObjectType;
 
    mLight = LightManager::createLightInfo();
 

+ 2 - 1
Engine/source/T3D/objectTypes.h

@@ -177,7 +177,8 @@ enum SceneObjectTypeMasks
                                  StaticShapeObjectType |
                                  DynamicShapeObjectType |
                                  EntityObjectType |
-                                 ZoneObjectType ), // This improves the result of zone traversals.
+                                 ZoneObjectType |
+                                 LightObjectType ), // This improves the result of zone traversals.
 
    /// Mask for objects that should be specifically excluded from zone culling.
    CULLING_EXCLUDE_TYPEMASK = (  TerrainObjectType |

+ 9 - 0
Engine/source/lighting/lightManager.cpp

@@ -227,6 +227,15 @@ void LightManager::registerGlobalLights( const Frustum *frustum, bool staticLigh
       // Cull the lights using the frustum.
       getSceneManager()->getContainer()->findObjectList( *frustum, lightMask, &activeLights );
 
+      for (U32 i = 0; i < activeLights.size(); ++i)
+      {
+         if (!getSceneManager()->mRenderedObjectsList.contains(activeLights[i]))
+         {
+            activeLights.erase(i);
+            --i;
+         }
+      }
+
       // Store the culling position for sun placement
       // later... see setSpecialLight.
       mCullPos = frustum->getPosition();

+ 7 - 0
Engine/source/scene/sceneManager.cpp

@@ -451,6 +451,13 @@ void SceneManager::_renderScene( SceneRenderState* state, U32 objectMask, SceneZ
 
    PROFILE_END();
 
+   //store our rendered objects into a list we can easily look up against later if required
+   mRenderedObjectsList.clear();
+   for (U32 i = 0; i < numRenderObjects; ++i)
+   {
+      mRenderedObjectsList.push_back(mBatchQueryList[i]);
+   }
+
    // Render the remaining objects.
 
    PROFILE_START( Scene_renderObjects );

+ 4 - 0
Engine/source/scene/sceneManager.h

@@ -117,6 +117,10 @@ class SceneManager
       /// If true, render the AABBs of objects for debugging.
       static bool smRenderBoundingBoxes;
 
+      //A cache list of objects that made it through culling, so we don't have to attempt to re-test
+      //visibility of objects later.
+      Vector< SceneObject* > mRenderedObjectsList;
+
    protected:
 
       /// Whether this is the client-side scene.