Fixes for Foliage with Large Worlds usage
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user