Add gizmo handles for spline points

This commit is contained in:
Wojtek Figat
2021-01-27 12:13:00 +01:00
parent d0c0259ee2
commit fd96957819

View File

@@ -1,6 +1,8 @@
// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. // Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
using System;
using FlaxEngine; using FlaxEngine;
using FlaxEngine.Json;
namespace FlaxEditor.SceneGraph.Actors namespace FlaxEditor.SceneGraph.Actors
{ {
@@ -10,10 +12,78 @@ namespace FlaxEditor.SceneGraph.Actors
[HideInEditor] [HideInEditor]
public sealed class SplineNode : ActorNode public sealed class SplineNode : ActorNode
{ {
private sealed class SplinePointNode : ActorChildNode<SplineNode>
{
public SplinePointNode(SplineNode actor, Guid id, int index)
: base(actor, id, index)
{
}
public override bool CanBeSelectedDirectly => true;
public override Transform Transform
{
get
{
var actor = (Spline)_actor.Actor;
return actor.GetSplineTransform(Index);
}
set
{
var actor = (Spline)_actor.Actor;
actor.SetSplineTransform(Index, value);
}
}
public override bool RayCastSelf(ref RayCastData ray, out float distance, out Vector3 normal)
{
var actor = (Spline)_actor.Actor;
var pos = actor.GetSplinePoint(Index);
normal = -ray.Ray.Direction;
return new BoundingSphere(pos, 5.0f).Intersects(ref ray.Ray, out distance);
}
}
/// <inheritdoc /> /// <inheritdoc />
public SplineNode(Actor actor) public SplineNode(Actor actor)
: base(actor) : base(actor)
{ {
OnUpdate();
FlaxEngine.Scripting.Update += OnUpdate;
}
private unsafe void OnUpdate()
{
// Sync spline points with gizmo handles
var actor = (Spline)Actor;
var dstCount = actor.SplinePointsCount;
if (dstCount > 1 && actor.IsLoop)
dstCount--; // The last point is the same as the first one for loop mode
var srcCount = ActorChildNodes?.Count ?? 0;
if (dstCount != srcCount)
{
// Remove unused points
while (srcCount > dstCount)
ActorChildNodes[srcCount-- - 1].Dispose();
// Add new points
var id = ID;
var g = (JsonSerializer.GuidInterop*)&id;
g->D += (uint)srcCount;
while (srcCount < dstCount)
{
g->D += 1;
AddChildNode(new SplinePointNode(this, id, srcCount++));
}
}
}
/// <inheritdoc />
public override void OnDispose()
{
FlaxEngine.Scripting.Update -= OnUpdate;
base.OnDispose();
} }
} }
} }