Răsfoiți Sursa

Fixed AnimatedModel unnecessary update in case it is within the influence of an invisible light.

Lasse Öörni 15 ani în urmă
părinte
comite
4e7da409cc

+ 1 - 1
Engine/Renderer/AnimatedModel.cpp

@@ -548,7 +548,7 @@ void AnimatedModel::updateNode(const FrameInfo& frame)
     
     // If node was invisible last frame, need to decide animation LOD distance here
     // If headless, retain the current animation distance (should be 0)
-    if ((frame.mCamera) && (abs((int)frame.mFrameNumber - (int)mAnimationLodFrameNumber) > 1))
+    if ((frame.mCamera) && (abs((int)frame.mFrameNumber - (int)mViewFrameNumber) > 1))
     {
         if (mInvisibleLodFactor == 0.0f)
             return;

+ 3 - 0
Engine/Renderer/View.cpp

@@ -769,7 +769,10 @@ void View::processLightQuery(unsigned index, const std::vector<VolumeNode*>& res
                         
                         // Update geometry now if not updated yet
                         if (!geom->isInView(mFrame))
+                        {
+                            geom->markInShadowView(mFrame);
                             geom->updateGeometry(mFrame, renderer);
+                        }
                         sShadowCasters[index].push_back(geom);
                     }
                     break;

+ 9 - 0
Engine/Renderer/VolumeNode.cpp

@@ -305,6 +305,15 @@ void VolumeNode::markInView(const FrameInfo& frame)
     mViewCamera = frame.mCamera;
 }
 
+void VolumeNode::markInShadowView(const FrameInfo& frame)
+{
+    if (mViewFrameNumber != frame.mFrameNumber)
+    {
+        mViewFrameNumber = frame.mFrameNumber;
+        mViewCamera = 0;
+    }
+}
+
 void VolumeNode::setSortValue(float value)
 {
     mSortValue = value;

+ 2 - 0
Engine/Renderer/VolumeNode.h

@@ -119,6 +119,8 @@ public:
     void setSortValue(float value);
     //! Mark in view this frame. Called by View
     void markInView(const FrameInfo& frame);
+    //! Mark in a shadow camera view this frame. If an actual view is already set, does not override it. Called by View
+    void markInShadowView(const FrameInfo& frame);
     //! Return distance from camera
     float getDistance() const { return mDistance; }
     //! Return sorting value