Beispiel #1
0
        public void UpdateLod(List <int> activePassIds, MyLodStrategyPreprocessor preprocessor)
        {
            MyLodStrategyInfo lodStrategyInfo = StandardModel.GetLodStrategyInfo();
            Vector3D          cameraPos       = MyRender11.Environment.Matrices.CameraPosition;
            Vector3D          instancePos     = m_transformStrategy.GetCoreTranslation();

            m_lodStrategy.SmoothResolve(lodStrategyInfo, MyCommon.FrameCounter, MyCommon.LastFrameDelta(), cameraPos, instancePos, activePassIds, preprocessor);
        }
Beispiel #2
0
        public void UpdateLods(List <MyRenderPass> renderPasses, List <MyInstanceComponent>[] visibleInstances)
        {
            {
                m_tmpActivePassIds.Clear();
                foreach (var pass in renderPasses)
                {
                    m_tmpActivePassIds.Add(pass.PassId);
                }
            }
            MyLodStrategyPreprocessor preprocessor = MyLodStrategyPreprocessor.Perform();
            {
                Vector3D deltaCameraPosition = MyRender11.Environment.Matrices.CameraPosition - m_prevCameraPositionOnUpdateLods;
                m_prevCameraPositionOnUpdateLods = MyRender11.Environment.Matrices.CameraPosition;
                bool isCameraSkipped = deltaCameraPosition.Length() > m_globalLoddingSettings.MaxDistanceForSmoothCameraMovement;

                if (m_globalLoddingSettings.EnableLodSelection)
                {
                    foreach (var pass in renderPasses)
                    {
                        foreach (var instance in visibleInstances[pass.PassId])
                        {
                            instance.UpdateLodExplicit(m_tmpActivePassIds, m_globalLoddingSettings.LodSelection);
                        }
                    }
                }
                else if (isCameraSkipped)
                {
                    foreach (var pass in renderPasses)
                    {
                        foreach (var instance in visibleInstances[pass.PassId])
                        {
                            instance.UpdateLodNoTransition(m_tmpActivePassIds, preprocessor);
                        }
                    }
                }
                else
                {
                    foreach (var pass in renderPasses)
                    {
                        foreach (var instance in visibleInstances[pass.PassId])
                        {
                            instance.UpdateLodSmoothly(m_tmpActivePassIds, preprocessor);
                        }
                    }
                }
            }
        }
 public void UpdateLods(List <MyRenderPass> renderPasses, List <MyInstanceComponent>[] visibleInstances)
 {
     {
         m_tmpActivePassIds.Clear();
         foreach (var pass in renderPasses)
         {
             m_tmpActivePassIds.Add(pass.PassId);
         }
     }
     MyLodStrategyPreprocessor preprocessor = MyLodStrategyPreprocessor.Perform();
     {
         foreach (var pass in renderPasses)
         {
             foreach (var instance in visibleInstances[pass.PassId])
             {
                 instance.UpdateLod(m_tmpActivePassIds, preprocessor);
             }
         }
     }
 }
Beispiel #4
0
        public void SmoothResolve(MyLodStrategyInfo strategyInfo, ulong currentFrameId, float timeDeltaSeconds, Vector3D cameraPos, Vector3D instancePos, List <int> activePassIds, MyLodStrategyPreprocessor preprocessor)
        {
            if (strategyInfo.IsEmpty)
            {
                return;
            }

            if (currentFrameId == m_updatedAtFrameId)
            {
                return;
            }

            float distance = (float)(cameraPos - instancePos).Length();

            distance *= preprocessor.DistanceMult;
            distance += m_objectDistanceAdd;
            distance *= m_objectDistanceMult;

            if (MISSING_FRAMES_TO_JUMP < currentFrameId - m_updatedAtFrameId) // the lod was not updated for a long time, we can jump to the lod
            {
                m_currentLod    = GetTheBestLod(strategyInfo, distance);
                m_transitionLod = -1;
                m_transition    = 0;
            }
            else
            {
                SmoothTransition(strategyInfo, timeDeltaSeconds, distance, ref m_currentLod, ref m_transitionLod, ref m_transition);
            }

            m_updatedAtFrameId = currentFrameId;
            int maxLod = strategyInfo.GetLodsCount() - 1;

            /*m_currentLod = strategyInfo.GetLodsCount() - 1;
             * m_transition = 0;*/

            UpdateCachedResults(maxLod, activePassIds);
        }
Beispiel #5
0
        public void SkippingResolve(MyLodStrategyInfo strategyInfo, ulong currentFrameId, Vector3D cameraPos, Vector3D instancePos, List <int> activePassIds, MyLodStrategyPreprocessor preprocessor)
        {
            if (strategyInfo.IsEmpty)
            {
                return;
            }

            float distance = (float)(cameraPos - instancePos).Length();

            distance *= preprocessor.DistanceMult;
            distance += m_objectDistanceAdd;
            distance *= m_objectDistanceMult;

            m_currentLod    = GetTheBestLod(strategyInfo, distance);
            m_transitionLod = -1;
            m_transition    = 0;

            m_updatedAtFrameId = currentFrameId;
            int maxLod = strategyInfo.GetLodsCount() - 1;

            UpdateCachedResults(maxLod, activePassIds);
        }