Constrains On StrategyTopDownCamera
This commit is contained in:
parent
a53865f099
commit
52b46024cc
|
@ -75,6 +75,38 @@ namespace Rokojori
|
||||||
ForEach<T>( root, callback );
|
ForEach<T>( root, callback );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<T> AllInScene<T>( Func<T,bool> filter = null) where T:class
|
||||||
|
{
|
||||||
|
var list = new List<T>();
|
||||||
|
ForEachInScene<T>(
|
||||||
|
t =>
|
||||||
|
{
|
||||||
|
if ( filter == null || filter( t ) )
|
||||||
|
{
|
||||||
|
list.Add( t );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<T> AllIn<T>( Node root, Func<T,bool> filter = null) where T:class
|
||||||
|
{
|
||||||
|
var list = new List<T>();
|
||||||
|
ForEach<T>( root,
|
||||||
|
t =>
|
||||||
|
{
|
||||||
|
if ( filter == null || filter( t ) )
|
||||||
|
{
|
||||||
|
list.Add( t );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
public static void ForEach<T>( Node root, Action<T> callback ) where T:class
|
public static void ForEach<T>( Node root, Action<T> callback ) where T:class
|
||||||
{
|
{
|
||||||
var walker = nodesWalker;
|
var walker = nodesWalker;
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Godot;
|
||||||
|
|
||||||
|
namespace Rokojori
|
||||||
|
{
|
||||||
|
public class Box3
|
||||||
|
{
|
||||||
|
public Vector3 min = Vector3.Zero;
|
||||||
|
public Vector3 max = Vector3.Zero;
|
||||||
|
|
||||||
|
public static Box3 FromPositionAndScale( Vector3 position, Vector3 scale )
|
||||||
|
{
|
||||||
|
var max = scale * 0.5f;
|
||||||
|
var min = -max;
|
||||||
|
|
||||||
|
return Box3.Create( min + position, max + position );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Box3 Create( Vector3 min, Vector3 max )
|
||||||
|
{
|
||||||
|
var b = new Box3();
|
||||||
|
b.min = min;
|
||||||
|
b.max = max;
|
||||||
|
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector3 Constrain( Vector3 point )
|
||||||
|
{
|
||||||
|
point = min.Max( point );
|
||||||
|
point = max.Min( point );
|
||||||
|
|
||||||
|
return point;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Vector3 Constrain( Vector3 point, Vector3 min, Vector3 max )
|
||||||
|
{
|
||||||
|
point = min.Max( point );
|
||||||
|
point = max.Min( point );
|
||||||
|
|
||||||
|
return point;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ContainsPoint( Vector3 point )
|
||||||
|
{
|
||||||
|
if ( ! Range.Contains( min.X, max.X, point.X ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! Range.Contains( min.Z, max.Z, point.Z ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! Range.Contains( min.Y, max.Y, point.Y ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void EnsureCorrectness()
|
||||||
|
{
|
||||||
|
if ( max.X < min.X )
|
||||||
|
{
|
||||||
|
var b = max.X; max.X = min.X; min.X = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( max.Y < min.Y )
|
||||||
|
{
|
||||||
|
var b = max.Y; max.Y = min.Y; min.Y = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( max.Z < min.Z )
|
||||||
|
{
|
||||||
|
var b = max.Z; max.Z = min.Z; min.Z = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -7,6 +7,21 @@ namespace Rokojori
|
||||||
{
|
{
|
||||||
public class Arrays
|
public class Arrays
|
||||||
{
|
{
|
||||||
|
public static bool Contains <T>( T[] values, T other )
|
||||||
|
{
|
||||||
|
return Array.IndexOf( values, other ) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static T[] Add<T>( T[] values, T other )
|
||||||
|
{
|
||||||
|
var newValues = new T[ values.Length + 1 ];
|
||||||
|
|
||||||
|
Array.Copy( values, newValues, values.Length );
|
||||||
|
newValues[ values.Length ] = other;
|
||||||
|
|
||||||
|
return newValues;
|
||||||
|
}
|
||||||
|
|
||||||
public static void ForEach<T>( T[] values, Action<T> callback )
|
public static void ForEach<T>( T[] values, Action<T> callback )
|
||||||
{
|
{
|
||||||
foreach ( var it in values )
|
foreach ( var it in values )
|
||||||
|
|
|
@ -12,6 +12,13 @@ namespace Rokojori
|
||||||
[GlobalClass]
|
[GlobalClass]
|
||||||
public partial class StrategyTopDownCamera:VirtualCamera3D
|
public partial class StrategyTopDownCamera:VirtualCamera3D
|
||||||
{
|
{
|
||||||
|
public enum ConstrainMode
|
||||||
|
{
|
||||||
|
Unconstrained,
|
||||||
|
Axis_Aligned_Box,
|
||||||
|
Circle_XZ_Range_Y
|
||||||
|
}
|
||||||
|
|
||||||
[Export]
|
[Export]
|
||||||
public Vector3 target;
|
public Vector3 target;
|
||||||
|
|
||||||
|
@ -27,6 +34,17 @@ namespace Rokojori
|
||||||
|
|
||||||
[ExportCategory("Move")]
|
[ExportCategory("Move")]
|
||||||
|
|
||||||
|
[Export]
|
||||||
|
public ConstrainMode constrainMode = ConstrainMode.Unconstrained;
|
||||||
|
|
||||||
|
[Export]
|
||||||
|
public Node3D constrainMin;
|
||||||
|
|
||||||
|
[Export]
|
||||||
|
public Node3D constrainMax;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[Export]
|
[Export]
|
||||||
public RJSensor moveUpButton;
|
public RJSensor moveUpButton;
|
||||||
[Export]
|
[Export]
|
||||||
|
@ -190,6 +208,43 @@ namespace Rokojori
|
||||||
|
|
||||||
target += ( xAmount + zAmount );
|
target += ( xAmount + zAmount );
|
||||||
|
|
||||||
|
ConstrainTarget();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConstrainTarget()
|
||||||
|
{
|
||||||
|
if ( ConstrainMode.Unconstrained == constrainMode )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ConstrainMode.Axis_Aligned_Box == constrainMode )
|
||||||
|
{
|
||||||
|
target = Box3.Constrain( target, constrainMin.GlobalPosition, constrainMax.GlobalPosition );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ConstrainMode.Circle_XZ_Range_Y == constrainMode )
|
||||||
|
{
|
||||||
|
var direction = ( constrainMax.GlobalPosition - constrainMin.GlobalPosition );
|
||||||
|
var directionXZ = direction; directionXZ.Y = 0;
|
||||||
|
var distanceXZ = directionXZ.Length();
|
||||||
|
|
||||||
|
var targetDirection = target - constrainMin.GlobalPosition;
|
||||||
|
var targetDirectionXZ = targetDirection; targetDirectionXZ.Y = 0;
|
||||||
|
|
||||||
|
target.Y = Mathf.Clamp( target.Y, constrainMin.GlobalPosition.Y, constrainMax.GlobalPosition.Y );
|
||||||
|
|
||||||
|
if ( targetDirectionXZ.Length() > distanceXZ )
|
||||||
|
{
|
||||||
|
targetDirectionXZ = targetDirectionXZ.Normalized() * distanceXZ;
|
||||||
|
var constrainedPosition = constrainMin.GlobalPosition + targetDirectionXZ;
|
||||||
|
target = new Vector3( constrainedPosition.X, target.Y, constrainedPosition.Z );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Orbit( float delta )
|
void Orbit( float delta )
|
||||||
|
|
Loading…
Reference in New Issue