From 2e947ab85ac8227f22e46ec1b2fb8d5099044329 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Mon, 4 Jul 2022 20:35:29 +0200 Subject: [PATCH] Fixes for large worlds --- Source/Editor/ViewportDebugDrawData.cs | 2 +- Source/Engine/Content/Assets/Model.cpp | 2 +- Source/Engine/UI/SpriteRender.cpp | 7 +++---- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Source/Editor/ViewportDebugDrawData.cs b/Source/Editor/ViewportDebugDrawData.cs index 3c39534d1..a983af168 100644 --- a/Source/Editor/ViewportDebugDrawData.cs +++ b/Source/Editor/ViewportDebugDrawData.cs @@ -113,7 +113,7 @@ namespace FlaxEditor var bounds = BoundingSphere.FromBox(staticModel.Box); // Pick a proper LOD - var center = (Float3)bounds.Center; // TODO: large-worlds + Float3 center = bounds.Center - renderContext.View.Origin; int lodIndex = RenderTools.ComputeModelLOD(model, ref center, (float)bounds.Radius, ref renderContext); var lods = model.LODs; if (lods == null || lods.Length < lodIndex || lodIndex < 0) diff --git a/Source/Engine/Content/Assets/Model.cpp b/Source/Engine/Content/Assets/Model.cpp index 11ccd841a..870d359de 100644 --- a/Source/Engine/Content/Assets/Model.cpp +++ b/Source/Engine/Content/Assets/Model.cpp @@ -196,7 +196,7 @@ void Model::Draw(const RenderContext& renderContext, MaterialBase* material, con const BoundingBox box = GetBox(world); BoundingSphere sphere; BoundingSphere::FromBox(box, sphere); - int32 lodIndex = RenderTools::ComputeModelLOD(this, sphere.Center, (float)sphere.Radius, renderContext); // TODO: large-worlds + int32 lodIndex = RenderTools::ComputeModelLOD(this, sphere.Center - renderContext.View.Origin, (float)sphere.Radius, renderContext); if (lodIndex == -1) return; lodIndex += renderContext.View.ModelLODBias; diff --git a/Source/Engine/UI/SpriteRender.cpp b/Source/Engine/UI/SpriteRender.cpp index e5ece58fc..e5a70cc89 100644 --- a/Source/Engine/UI/SpriteRender.cpp +++ b/Source/Engine/UI/SpriteRender.cpp @@ -113,22 +113,21 @@ void SpriteRender::Draw(RenderContext& renderContext) auto model = _quadModel.As(); if (model->GetLoadedLODs() == 0) return; - auto& view = renderContext.View; + const auto& view = renderContext.View; Matrix m1, m2, m3, world; Matrix::Scaling(_size.X, _size.Y, 1.0f, m2); Matrix::RotationY(PI, m3); Matrix::Multiply(m2, m3, m1); - // TODO: large-worlds if (FaceCamera) { - Matrix::Billboard(_transform.Translation, view.Position, Vector3::Up, view.Direction, m2); + Matrix::Billboard(_transform.Translation - view.Origin, view.Position, Vector3::Up, view.Direction, m2); Matrix::Multiply(m1, m2, m3); Matrix::Scaling(_transform.Scale, m1); Matrix::Multiply(m1, m3, world); } else { - _transform.GetWorld(m2); + view.GetWorldMatrix(_transform, m2); Matrix::Multiply(m1, m2, world); } model->LODs[0].Draw(renderContext, _materialInstance, world, GetStaticFlags(), false, DrawModes, GetPerInstanceRandom());