Add gizmo handles for spline points
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user