rokojori_action_library/Runtime/Interactions/Caster.cs

117 lines
2.4 KiB
C#
Raw Normal View History

2025-01-08 18:46:17 +00:00
using Godot;
using System.Collections;
using System.Collections.Generic;
using Godot.Collections;
namespace Rokojori
{
2025-05-21 20:44:28 +00:00
[Tool]
2025-01-08 18:46:17 +00:00
[GlobalClass]
2025-12-11 14:47:57 +00:00
public abstract partial class Caster:Node3D
2025-01-08 18:46:17 +00:00
{
[Export]
public Selector includeSelector;
[Export]
public Selector excludeSelector;
2025-12-11 14:47:57 +00:00
[Export]
public bool sortByPointerPriority;
2025-01-08 18:46:17 +00:00
2025-12-11 14:47:57 +00:00
public int NumColliders()
2025-01-08 18:46:17 +00:00
{
2025-12-11 14:47:57 +00:00
return collisions == null ? 0 : numCollisions;
2025-01-08 18:46:17 +00:00
}
2025-12-11 14:47:57 +00:00
public Node GetCollider( int index )
2025-01-08 18:46:17 +00:00
{
2025-12-11 14:47:57 +00:00
return collisions[ index ].collider;
2025-01-08 18:46:17 +00:00
}
2025-12-11 14:47:57 +00:00
public Vector3 GetCollisionNormal( int index )
2025-01-08 18:46:17 +00:00
{
2025-12-11 14:47:57 +00:00
return collisions[ index ].normal;
2025-01-08 18:46:17 +00:00
}
2025-12-11 14:47:57 +00:00
public Vector3 GetCollisionPosition( int index )
2025-01-08 18:46:17 +00:00
{
2025-12-11 14:47:57 +00:00
return collisions[ index ].position;
2025-01-08 18:46:17 +00:00
}
2025-12-11 14:47:57 +00:00
public Shape3D GetCollisionShape( int index )
{
return collisions[ index ].shape;
}
ValueSorter<CollisionData> singleSorter;
MultiValueSorter<CollisionData> multiSorter;
protected List<CollisionData> collisions = new List<CollisionData>();
protected int numCollisions = 0;
protected bool IsSelected( Node node )
{
if ( includeSelector != null && ! includeSelector.Selects( node ) )
{
return false;
}
if ( excludeSelector != null && excludeSelector.Selects( node ) )
{
return false;
}
return true;
}
protected bool IsSelected( CollisionData cd )
{
return IsSelected( cd.collider );
}
protected void SortCollisions()
{
if ( ! sortByPointerPriority )
{
if ( singleSorter == null )
{
singleSorter = ValueSorter<CollisionData>.Create( cd => GetDistance( cd ) );
}
singleSorter.Sort( 0, numCollisions, collisions );
}
else
{
if ( multiSorter == null )
{
multiSorter = MultiValueSorter<CollisionData>.Create(
cd => GetPointablePriority( cd ),
cd => GetDistance( cd )
);
}
multiSorter.Sort( 0, numCollisions, collisions );
}
}
protected float GetPointablePriority( CollisionData cd )
{
float priority = 0;
var pointable = Nodes.Find<Pointable>( cd.collider );
if ( pointable != null )
{
priority = pointable.pointingPriority;
}
return priority;
}
protected float GetDistance( CollisionData cd )
2025-01-08 18:46:17 +00:00
{
2025-12-11 14:47:57 +00:00
return ( cd.position - GlobalPosition ).Length();
2025-01-08 18:46:17 +00:00
}
}
}