Browse Source

Optimize StaticModelGroup by going through the objects in one pass during transform / bounding box update.
Change light color in HugeObjectCount when the group optimization is enabled.

Lasse Öörni 12 years ago
parent
commit
0f965d3443

+ 8 - 22
Source/Engine/Graphics/StaticModelGroup.cpp

@@ -35,8 +35,7 @@ namespace Urho3D
 extern const char* GEOMETRY_CATEGORY;
 
 StaticModelGroup::StaticModelGroup(Context* context) :
-    StaticModel(context),
-    transformsDirty_(true)
+    StaticModel(context)
 {
 }
 
@@ -114,43 +113,30 @@ Node* StaticModelGroup::GetInstanceNode(unsigned index) const
     return index < instanceNodes_.Size() ? instanceNodes_[index] : (Node*)0;
 }
 
-void StaticModelGroup::OnMarkedDirty(Node* node)
-{
-    Drawable::OnMarkedDirty(node);
-    transformsDirty_ = true;
-}
-
 void StaticModelGroup::OnNodeSetEnabled(Node* node)
 {
     Drawable::OnMarkedDirty(node);
-    transformsDirty_ = true;
 }
 
 void StaticModelGroup::OnWorldBoundingBoxUpdate()
 {
-    if (transformsDirty_)
-        UpdateTransforms();
-    
+    // Update transforms and bounding box at the same time to have to go through the objects only once
     worldBoundingBox_.defined_ = false;
-    for (unsigned i = 0; i < worldTransforms_.Size(); ++i)
-        worldBoundingBox_.Merge(boundingBox_.Transformed(worldTransforms_[i]));
-}
-
-void StaticModelGroup::UpdateTransforms()
-{
     worldTransforms_.Resize(instanceNodes_.Size());
     unsigned index = 0;
 
     for (unsigned i = 0; i < instanceNodes_.Size(); ++i)
     {
-        Node* instanceNode = instanceNodes_[i];
-        if (!instanceNode || !instanceNode->IsEnabled())
+        Node* node = instanceNodes_[i];
+        if (!node || !node->IsEnabled())
             continue;
-        worldTransforms_[index++] = instanceNode->GetWorldTransform();
+        
+        const Matrix3x4& worldTransform = node->GetWorldTransform();
+        worldTransforms_[index++] = worldTransform;
+        worldBoundingBox_.Merge(boundingBox_.Transformed(worldTransform));
     }
     
     worldTransforms_.Resize(index);
-    transformsDirty_ = false;
 }
 
 }

+ 0 - 7
Source/Engine/Graphics/StaticModelGroup.h

@@ -60,23 +60,16 @@ public:
     Node* GetInstanceNode(unsigned index) const;
     
 protected:
-   /// Handle node transform being dirtied.
-    virtual void OnMarkedDirty(Node* node);
     /// Handle scene node enabled status changing.
     virtual void OnNodeSetEnabled(Node* node);
     /// Recalculate the world-space bounding box.
     virtual void OnWorldBoundingBoxUpdate();
     
 private:
-    /// Gather the instances' transforms.
-    void UpdateTransforms();
-    
     /// Instance nodes.
     Vector<WeakPtr<Node> > instanceNodes_;
     /// World transforms of enabled instances.
     PODVector<Matrix3x4> worldTransforms_;
-    /// Instance transforms dirty flag.
-    bool transformsDirty_;
 };
 
 }

+ 5 - 2
Source/Samples/20_HugeObjectCount/HugeObjectCount.cpp

@@ -97,13 +97,14 @@ void HugeObjectCount::CreateScene()
     
     // Create a directional light
     Node* lightNode = scene_->CreateChild("DirectionalLight");
-    lightNode->SetDirection(Vector3(0.5f, -1.0f, 0.5f)); // The direction vector does not need to be normalized
+    lightNode->SetDirection(Vector3(-0.6f, -1.0f, -0.8f)); // The direction vector does not need to be normalized
     Light* light = lightNode->CreateComponent<Light>();
     light->SetLightType(LIGHT_DIRECTIONAL);
-    light->SetColor(Color(0.7f, 0.35f, 0.0f));
 
     if (!useGroups_)
     {
+        light->SetColor(Color(0.7f, 0.35f, 0.0f));
+        
         // Create individual box StaticModels in the scene
         for (int y = -125; y < 125; ++y)
         {
@@ -120,6 +121,8 @@ void HugeObjectCount::CreateScene()
     }
     else
     {
+        light->SetColor(Color::WHITE);
+        
         // Create StaticModelGroups in the scene
         StaticModelGroup* lastGroup = 0;