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); }
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); } } } }
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); }
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); }