Fixes for Foliage with Large Worlds usage

This commit is contained in:
Wojtek Figat
2022-07-03 16:08:22 +02:00
parent 62ff305fad
commit d9dc23afc1
8 changed files with 61 additions and 56 deletions

View File

@@ -216,10 +216,9 @@ namespace FlaxEditor.Tools.Foliage
var model = foliage.GetFoliageType(instance.Type).Model;
if (model)
{
foliage.GetLocalToWorldMatrix(out var world);
instance.Transform.GetWorld(out var matrix);
Matrix.Multiply(ref matrix, ref world, out var instanceWorld);
model.Draw(ref renderContext, _highlightMaterial, ref instanceWorld, StaticFlags.None, false);
var transform = foliage.Transform.LocalToWorld(instance.Transform);
renderContext.View.GetWorldMatrix(ref transform, out var world);
model.Draw(ref renderContext, _highlightMaterial, ref world, StaticFlags.None, false);
}
}

View File

@@ -250,11 +250,13 @@ void FoliageTools::Paint(Foliage* foliage, Span<int32> foliageTypesIndices, cons
{
// Skip if any places instance is close that placement location
bool isInvalid = false;
const Transform foliageTransform = foliage->GetTransform();
// TODO: use quad tree to boost this logic
for (auto i = foliage->Instances.Begin(); i.IsNotEnd(); ++i)
{
const auto& instance = *i;
if (Vector3::DistanceSquared(instance.World.GetTranslation(), placement.Location) <= paintRadiusSqr)
const Vector3 instancePosition = foliageTransform.LocalToWorld(instance.Transform.Translation);
if (Vector3::DistanceSquared(instancePosition, placement.Location) <= paintRadiusSqr)
{
isInvalid = true;
break;
@@ -339,11 +341,6 @@ void FoliageTools::Paint(Foliage* foliage, Span<int32> foliageTypesIndices, cons
// Convert instance transformation into the local-space of the foliage actor
foliage->GetTransform().WorldToLocal(instance.Transform, instance.Transform);
// Calculate foliage instance geometry transformation matrix
instance.Transform.GetWorld(matrix);
Matrix::Multiply(matrix, world, instance.World);
instance.DrawState.PrevWorld = instance.World;
// Add foliage instance
foliage->AddInstance(instance);
}
@@ -361,12 +358,14 @@ void FoliageTools::Remove(Foliage* foliage, Span<int32> foliageTypesIndices, con
// For each selected foliage instance type try to remove something
const BoundingSphere brush(brushPosition, brushRadius);
const Transform foliageTransform = foliage->GetTransform();
for (auto i = foliage->Instances.Begin(); i.IsNotEnd(); ++i)
{
auto& instance = *i;
// Skip instances outside the brush
if (CollisionsHelper::SphereContainsPoint(brush, instance.World.GetTranslation()) == ContainmentType::Disjoint)
const Vector3 instancePosition = foliageTransform.LocalToWorld(instance.Transform.Translation);
if (CollisionsHelper::SphereContainsPoint(brush, instancePosition) == ContainmentType::Disjoint)
continue;
// Skip instances not existing in a filter

View File

@@ -93,7 +93,7 @@ namespace FlaxEditor.Tools.Foliage
rotation = Quaternion.RotationZ(Mathf.Pi);
else
rotation = Quaternion.LookRotation(Vector3.Cross(Vector3.Cross(brushNormal, Vector3.Forward), brushNormal), brushNormal);
Matrix transform = Matrix.Scaling(Mode.CurrentBrush.Size * 0.01f) * Matrix.RotationQuaternion(rotation) * Matrix.Translation(brushPosition);
Matrix transform = Matrix.Scaling(Mode.CurrentBrush.Size * 0.01f) * Matrix.RotationQuaternion(rotation) * Matrix.Translation(brushPosition - renderContext.View.Origin);
_brushModel.Draw(ref renderContext, brushMaterial, ref transform);
}
}