Browse Source

Set Skybox distance to a fixed 0.
Store StaticModel per-geometry extra data to a structure instead of separate arrays.

Lasse Öörni 13 years ago
parent
commit
4548687d1b

+ 2 - 2
Engine/Graphics/AnimatedModel.cpp

@@ -235,7 +235,7 @@ void AnimatedModel::UpdateBatches(const FrameInfo& frame)
     {
     {
         for (unsigned i = 0; i < batches_.Size(); ++i)
         for (unsigned i = 0; i < batches_.Size(); ++i)
         {
         {
-            batches_[i].distance_ = frame.camera_->GetDistance(worldTransform * geometryCenters_[i]);
+            batches_[i].distance_ = frame.camera_->GetDistance(worldTransform * geometryData_[i].center_);
             batches_[i].worldTransform_ = &worldTransform;
             batches_[i].worldTransform_ = &worldTransform;
         }
         }
     }
     }
@@ -312,7 +312,7 @@ void AnimatedModel::SetModel(Model* model, bool createBones)
     for (unsigned i = 0; i < geometries.Size(); ++i)
     for (unsigned i = 0; i < geometries.Size(); ++i)
     {
     {
         geometries_[i] = geometries[i];
         geometries_[i] = geometries[i];
-        geometryCenters_[i] = geometryCenters[i];
+        geometryData_[i].center_ = geometryCenters[i];
     }
     }
     
     
     // Copy geometry bone mappings
     // Copy geometry bone mappings

+ 2 - 0
Engine/Graphics/Skybox.cpp

@@ -54,6 +54,8 @@ void Skybox::ProcessRayQuery(const RayOctreeQuery& query, PODVector<RayQueryResu
 
 
 void Skybox::UpdateBatches(const FrameInfo& frame)
 void Skybox::UpdateBatches(const FrameInfo& frame)
 {
 {
+    distance_ = 0.0f;
+    
     // Follow only the camera rotation, not position
     // Follow only the camera rotation, not position
     Matrix3x4 customView(Vector3::ZERO, frame.camera_->GetNode()->GetWorldRotation().Inverse(), Vector3::ONE);
     Matrix3x4 customView(Vector3::ZERO, frame.camera_->GetNode()->GetWorldRotation().Inverse(), Vector3::ONE);
     customWorldTransform_ = customView * node_->GetWorldTransform();
     customWorldTransform_ = customView * node_->GetWorldTransform();

+ 9 - 10
Engine/Graphics/StaticModel.cpp

@@ -112,7 +112,7 @@ void StaticModel::ProcessRayQuery(const RayOctreeQuery& query, PODVector<RayQuer
                     unsigned lodLevel;
                     unsigned lodLevel;
                     // Check whether to use same LOD as visible, or a specific LOD
                     // Check whether to use same LOD as visible, or a specific LOD
                     if (softwareLodLevel_ == M_MAX_UNSIGNED)
                     if (softwareLodLevel_ == M_MAX_UNSIGNED)
-                        lodLevel = lodLevels_[i];
+                        lodLevel = geometryData_[i].lodLevel_;
                     else
                     else
                         lodLevel = Clamp(softwareLodLevel_, 0, geometries_[i].Size());
                         lodLevel = Clamp(softwareLodLevel_, 0, geometries_[i].Size());
                     
                     
@@ -147,7 +147,7 @@ void StaticModel::UpdateBatches(const FrameInfo& frame)
     {
     {
         for (unsigned i = 0; i < batches_.Size(); ++i)
         for (unsigned i = 0; i < batches_.Size(); ++i)
         {
         {
-            batches_[i].distance_ = frame.camera_->GetDistance(worldTransform * geometryCenters_[i]);
+            batches_[i].distance_ = frame.camera_->GetDistance(worldTransform * geometryData_[i].center_);
             batches_[i].worldTransform_ = &worldTransform;
             batches_[i].worldTransform_ = &worldTransform;
         }
         }
     }
     }
@@ -176,7 +176,7 @@ unsigned StaticModel::GetNumOccluderTriangles()
         unsigned lodLevel;
         unsigned lodLevel;
         // Check whether to use same LOD as visible, or a specific LOD
         // Check whether to use same LOD as visible, or a specific LOD
         if (softwareLodLevel_ == M_MAX_UNSIGNED)
         if (softwareLodLevel_ == M_MAX_UNSIGNED)
-            lodLevel = lodLevels_[i];
+            lodLevel = geometryData_[i].lodLevel_;
         else
         else
             lodLevel = Clamp(softwareLodLevel_, 0, geometries_[i].Size());
             lodLevel = Clamp(softwareLodLevel_, 0, geometries_[i].Size());
         
         
@@ -204,7 +204,7 @@ bool StaticModel::DrawOcclusion(OcclusionBuffer* buffer)
         unsigned lodLevel;
         unsigned lodLevel;
         // Check whether to use same LOD as visible, or a specific LOD
         // Check whether to use same LOD as visible, or a specific LOD
         if (softwareLodLevel_ == M_MAX_UNSIGNED)
         if (softwareLodLevel_ == M_MAX_UNSIGNED)
-            lodLevel = lodLevels_[i];
+            lodLevel = geometryData_[i].lodLevel_;
         else
         else
             lodLevel = Clamp(softwareLodLevel_, 0, geometries_[i].Size());
             lodLevel = Clamp(softwareLodLevel_, 0, geometries_[i].Size());
         
         
@@ -267,7 +267,7 @@ void StaticModel::SetModel(Model* model)
     for (unsigned i = 0; i < geometries.Size(); ++i)
     for (unsigned i = 0; i < geometries.Size(); ++i)
     {
     {
         geometries_[i] = geometries[i];
         geometries_[i] = geometries[i];
-        geometryCenters_[i] = geometryCenters[i];
+        geometryData_[i].center_ = geometryCenters[i];
     }
     }
     
     
     SetBoundingBox(model->GetBoundingBox());
     SetBoundingBox(model->GetBoundingBox());
@@ -317,8 +317,7 @@ void StaticModel::SetNumGeometries(unsigned num)
 {
 {
     batches_.Resize(num);
     batches_.Resize(num);
     geometries_.Resize(num);
     geometries_.Resize(num);
-    geometryCenters_.Resize(num);
-    lodLevels_.Resize(num);
+    geometryData_.Resize(num);
     ResetLodLevels();
     ResetLodLevels();
 }
 }
 
 
@@ -362,7 +361,7 @@ void StaticModel::ResetLodLevels()
         if (!geometries_[i].Size())
         if (!geometries_[i].Size())
             geometries_[i].Resize(1);
             geometries_[i].Resize(1);
         batches_[i].geometry_ = geometries_[i][0];
         batches_[i].geometry_ = geometries_[i][0];
-        lodLevels_[i] = 0;
+        geometryData_[i].lodLevel_ = 0;
     }
     }
     
     
     // Find out the real LOD levels on next geometry update
     // Find out the real LOD levels on next geometry update
@@ -383,9 +382,9 @@ void StaticModel::CalculateLodLevels()
         }
         }
         
         
         unsigned newLodLevel = j - 1;
         unsigned newLodLevel = j - 1;
-        if (lodLevels_[i] != newLodLevel)
+        if (geometryData_[i].lodLevel_ != newLodLevel)
         {
         {
-            lodLevels_[i] = newLodLevel;
+            geometryData_[i].lodLevel_ = newLodLevel;
             batches_[i].geometry_ = batchGeometries[newLodLevel];
             batches_[i].geometry_ = batchGeometries[newLodLevel];
         }
         }
     }
     }

+ 11 - 4
Engine/Graphics/StaticModel.h

@@ -27,6 +27,15 @@
 
 
 class Model;
 class Model;
 
 
+/// Static model per-geometry extra data.
+struct StaticModelGeometryData
+{
+    /// Geometry center.
+    Vector3 center_;
+    /// Current LOD level.
+    unsigned lodLevel_;
+};
+
 /// Static model component.
 /// Static model component.
 class StaticModel : public Drawable
 class StaticModel : public Drawable
 {
 {
@@ -92,10 +101,8 @@ protected:
     
     
     /// Bounding box.
     /// Bounding box.
     BoundingBox boundingBox_;
     BoundingBox boundingBox_;
-    /// Current LOD levels.
-    PODVector<unsigned> lodLevels_;
-    /// Geometry centers.
-    PODVector<Vector3> geometryCenters_;
+    /// Extra per-geometry data.
+    PODVector<StaticModelGeometryData> geometryData_;
     /// All geometries.
     /// All geometries.
     Vector<Vector<SharedPtr<Geometry> > > geometries_;
     Vector<Vector<SharedPtr<Geometry> > > geometries_;
     /// Model.
     /// Model.