Constrains On StrategyTopDownCamera
This commit is contained in:
parent
a53865f099
commit
52b46024cc
|
@ -75,6 +75,38 @@ namespace Rokojori
|
|||
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
|
||||
{
|
||||
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 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 )
|
||||
{
|
||||
foreach ( var it in values )
|
||||
|
|
|
@ -12,6 +12,13 @@ namespace Rokojori
|
|||
[GlobalClass]
|
||||
public partial class StrategyTopDownCamera:VirtualCamera3D
|
||||
{
|
||||
public enum ConstrainMode
|
||||
{
|
||||
Unconstrained,
|
||||
Axis_Aligned_Box,
|
||||
Circle_XZ_Range_Y
|
||||
}
|
||||
|
||||
[Export]
|
||||
public Vector3 target;
|
||||
|
||||
|
@ -27,6 +34,17 @@ namespace Rokojori
|
|||
|
||||
[ExportCategory("Move")]
|
||||
|
||||
[Export]
|
||||
public ConstrainMode constrainMode = ConstrainMode.Unconstrained;
|
||||
|
||||
[Export]
|
||||
public Node3D constrainMin;
|
||||
|
||||
[Export]
|
||||
public Node3D constrainMax;
|
||||
|
||||
|
||||
|
||||
[Export]
|
||||
public RJSensor moveUpButton;
|
||||
[Export]
|
||||
|
@ -190,6 +208,43 @@ namespace Rokojori
|
|||
|
||||
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 )
|
||||
|
|
Loading…
Reference in New Issue