Browse Source

Moved a compare outside the OctreeQuery inner loop.

Lasse Öörni 13 years ago
parent
commit
0380c2d403
2 changed files with 140 additions and 44 deletions
  1. 72 20
      Engine/Graphics/OctreeQuery.cpp
  2. 68 24
      Engine/Graphics/View.cpp

+ 72 - 20
Engine/Graphics/OctreeQuery.cpp

@@ -36,16 +36,29 @@ Intersection PointOctreeQuery::TestOctant(const BoundingBox& box, bool inside)
 
 void PointOctreeQuery::TestDrawables(const PODVector<Drawable*>& drawables, bool inside)
 {
-    for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
+    if (inside)
     {
-        Drawable* drawable = *i;
-        
-        if ((drawable->GetDrawableFlags() & drawableFlags_) && drawable->IsVisible() && (drawable->GetViewMask() & viewMask_))
+        for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
         {
-            if (inside || drawable->GetWorldBoundingBox().IsInside(point_))
+            Drawable* drawable = *i;
+            
+            if ((drawable->GetDrawableFlags() & drawableFlags_) && drawable->IsVisible() && (drawable->GetViewMask() & viewMask_))
                 result_.Push(drawable);
         }
     }
+    else
+    {
+        for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
+        {
+            Drawable* drawable = *i;
+            
+            if ((drawable->GetDrawableFlags() & drawableFlags_) && drawable->IsVisible() && (drawable->GetViewMask() & viewMask_))
+            {
+                if (drawable->GetWorldBoundingBox().IsInside(point_))
+                    result_.Push(drawable);
+            }
+        }
+    }
 }
 
 Intersection SphereOctreeQuery::TestOctant(const BoundingBox& box, bool inside)
@@ -58,16 +71,29 @@ Intersection SphereOctreeQuery::TestOctant(const BoundingBox& box, bool inside)
 
 void SphereOctreeQuery::TestDrawables(const PODVector<Drawable*>& drawables, bool inside)
 {
-    for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
+    if (inside)
     {
-        Drawable* drawable = *i;
-        
-        if ((drawable->GetDrawableFlags() & drawableFlags_) && drawable->IsVisible() && (drawable->GetViewMask() & viewMask_))
+        for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
         {
-            if (inside || sphere_.IsInsideFast(drawable->GetWorldBoundingBox()))
+            Drawable* drawable = *i;
+            
+            if ((drawable->GetDrawableFlags() & drawableFlags_) && drawable->IsVisible() && (drawable->GetViewMask() & viewMask_))
                 result_.Push(drawable);
         }
     }
+    else
+    {
+        for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
+        {
+            Drawable* drawable = *i;
+            
+            if ((drawable->GetDrawableFlags() & drawableFlags_) && drawable->IsVisible() && (drawable->GetViewMask() & viewMask_))
+            {
+                if (sphere_.IsInsideFast(drawable->GetWorldBoundingBox()))
+                    result_.Push(drawable);
+            }
+        }
+    }
 }
 
 Intersection BoxOctreeQuery::TestOctant(const BoundingBox& box, bool inside)
@@ -80,16 +106,29 @@ Intersection BoxOctreeQuery::TestOctant(const BoundingBox& box, bool inside)
 
 void BoxOctreeQuery::TestDrawables(const PODVector<Drawable*>& drawables, bool inside)
 {
-    for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
+    if (inside)
     {
-        Drawable* drawable = *i;
-        
-        if ((drawable->GetDrawableFlags() & drawableFlags_) && drawable->IsVisible() && (drawable->GetViewMask() & viewMask_))
+        for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
         {
-            if (inside || box_.IsInsideFast(drawable->GetWorldBoundingBox()))
+            Drawable* drawable = *i;
+            
+            if ((drawable->GetDrawableFlags() & drawableFlags_) && drawable->IsVisible() && (drawable->GetViewMask() & viewMask_))
                 result_.Push(drawable);
         }
     }
+    else
+    {
+        for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
+        {
+            Drawable* drawable = *i;
+            
+            if ((drawable->GetDrawableFlags() & drawableFlags_) && drawable->IsVisible() && (drawable->GetViewMask() & viewMask_))
+            {
+                if (box_.IsInsideFast(drawable->GetWorldBoundingBox()))
+                    result_.Push(drawable);
+            }
+        }
+    }
 }
 
 Intersection FrustumOctreeQuery::TestOctant(const BoundingBox& box, bool inside)
@@ -102,14 +141,27 @@ Intersection FrustumOctreeQuery::TestOctant(const BoundingBox& box, bool inside)
 
 void FrustumOctreeQuery::TestDrawables(const PODVector<Drawable*>& drawables, bool inside)
 {
-    for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
+    if (inside)
     {
-        Drawable* drawable = *i;
-        
-        if ((drawable->GetDrawableFlags() & drawableFlags_) && drawable->IsVisible() && (drawable->GetViewMask() & viewMask_))
+        for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
         {
-            if (inside || frustum_.IsInsideFast(drawable->GetWorldBoundingBox()))
+            Drawable* drawable = *i;
+            
+            if ((drawable->GetDrawableFlags() & drawableFlags_) && drawable->IsVisible() && (drawable->GetViewMask() & viewMask_))
                 result_.Push(drawable);
         }
     }
+    else
+    {
+        for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
+        {
+            Drawable* drawable = *i;
+            
+            if ((drawable->GetDrawableFlags() & drawableFlags_) && drawable->IsVisible() && (drawable->GetViewMask() & viewMask_))
+            {
+                if (frustum_.IsInsideFast(drawable->GetWorldBoundingBox()))
+                    result_.Push(drawable);
+            }
+        }
+    }
 }

+ 68 - 24
Engine/Graphics/View.cpp

@@ -86,17 +86,31 @@ public:
     /// Intersection test for drawables.
     virtual void TestDrawables(const PODVector<Drawable*>& drawables, bool inside)
     {
-        for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
-        {
-            Drawable* drawable = *i;
-            
-            if ((drawable->GetDrawableFlags() & drawableFlags_) && drawable->GetCastShadows() && drawable->IsVisible() &&
-                (drawable->GetViewMask() & viewMask_))
-            {
-                if (inside || frustum_.IsInsideFast(drawable->GetWorldBoundingBox()))
+        if (inside)
+        {
+            for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
+            {
+                Drawable* drawable = *i;
+                
+                if ((drawable->GetDrawableFlags() & drawableFlags_) && drawable->GetCastShadows() && drawable->IsVisible() &&
+                    (drawable->GetViewMask() & viewMask_))
                     result_.Push(drawable);
             }
         }
+        else
+        {
+            for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
+            {
+                Drawable* drawable = *i;
+                
+                if ((drawable->GetDrawableFlags() & drawableFlags_) && drawable->GetCastShadows() && drawable->IsVisible() &&
+                    (drawable->GetViewMask() & viewMask_))
+                {
+                    if (frustum_.IsInsideFast(drawable->GetWorldBoundingBox()))
+                        result_.Push(drawable);
+                }
+            }
+        }
     }
     
     /// Frustum.
@@ -127,18 +141,33 @@ public:
     /// Intersection test for drawables.
     virtual void TestDrawables(const PODVector<Drawable*>& drawables, bool inside)
     {
-        for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
-        {
-            Drawable* drawable = *i;
-            unsigned char flags = drawable->GetDrawableFlags();
-            
-            if ((flags == DRAWABLE_ZONE || (flags == DRAWABLE_GEOMETRY && drawable->IsOccluder())) && drawable->IsVisible() &&
-                (drawable->GetViewMask() & viewMask_))
-            {
-                if (inside || frustum_.IsInsideFast(drawable->GetWorldBoundingBox()))
+        if (inside)
+        {
+            for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
+            {
+                Drawable* drawable = *i;
+                unsigned char flags = drawable->GetDrawableFlags();
+                
+                if ((flags == DRAWABLE_ZONE || (flags == DRAWABLE_GEOMETRY && drawable->IsOccluder())) && drawable->IsVisible() &&
+                    (drawable->GetViewMask() & viewMask_))
                     result_.Push(drawable);
             }
         }
+        else
+        {
+            for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
+            {
+                Drawable* drawable = *i;
+                unsigned char flags = drawable->GetDrawableFlags();
+                
+                if ((flags == DRAWABLE_ZONE || (flags == DRAWABLE_GEOMETRY && drawable->IsOccluder())) && drawable->IsVisible() &&
+                    (drawable->GetViewMask() & viewMask_))
+                {
+                    if (frustum_.IsInsideFast(drawable->GetWorldBoundingBox()))
+                        result_.Push(drawable);
+                }
+            }
+        }
     }
     
     /// Frustum.
@@ -175,15 +204,30 @@ public:
     /// Intersection test for drawables. Note: drawable occlusion is performed later in worker threads.
     virtual void TestDrawables(const PODVector<Drawable*>& drawables, bool inside)
     {
-        for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
-        {
-            Drawable* drawable = *i;
-        
-            if ((drawable->GetDrawableFlags() & drawableFlags_) && drawable->IsVisible() && (drawable->GetViewMask() & viewMask_))
+        if (inside)
+        {
+            for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
             {
-                if (inside || frustum_.IsInsideFast(drawable->GetWorldBoundingBox()))
+                Drawable* drawable = *i;
+            
+                if ((drawable->GetDrawableFlags() & drawableFlags_) && drawable->IsVisible() &&
+                    (drawable->GetViewMask() & viewMask_))
                     result_.Push(drawable);
-            }
+            }
+        }
+        else
+        {
+            for (PODVector<Drawable*>::ConstIterator i = drawables.Begin(); i != drawables.End(); ++i)
+            {
+                Drawable* drawable = *i;
+            
+                if ((drawable->GetDrawableFlags() & drawableFlags_) && drawable->IsVisible() &&
+                    (drawable->GetViewMask() & viewMask_))
+                {
+                    if (frustum_.IsInsideFast(drawable->GetWorldBoundingBox()))
+                        result_.Push(drawable);
+                }
+            }
         }
     }