Engine-Pong/Game/Physics2D/Collider2DAABBBehaviour.cs

71 lines
2.2 KiB
C#
Raw Normal View History

2023-12-05 17:39:38 +03:00
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Syntriax.Engine.Core;
using Syntriax.Engine.Core.Abstract;
using Syntriax.Engine.Physics2D.Abstract;
namespace Syntriax.Engine.Physics2D;
2023-12-06 13:25:16 +03:00
public class Collider2DAABBBehaviour : BehaviourOverride, ICollider2D
2023-12-05 17:39:38 +03:00
{
2023-12-06 13:25:16 +03:00
public AABB AABBLocal { get; set; } = null!;
public AABB AABBWorld { get; private set; } = null!;
2023-12-05 17:55:38 +03:00
2023-12-05 17:39:38 +03:00
private IRigidBody2D? _rigidBody2D = null;
2023-12-06 13:25:16 +03:00
private List<Vector2> vertices = new List<Vector2>(4);
private IReadOnlyList<Vector2>? _verticesReadOnly = null;
2023-12-05 17:39:38 +03:00
public IRigidBody2D? RigidBody2D
{
get
{
if (_rigidBody2D is null)
BehaviourController.TryGetBehaviour(out _rigidBody2D);
return _rigidBody2D;
}
}
public Action<ICollider2D, ICollider2D>? OnCollisionPreResolve { get; set; } = null;
public Action<IAssignableTransform>? OnTransformAssigned { get => GameObject.OnTransformAssigned; set => GameObject.OnTransformAssigned = value; }
ITransform IAssignableTransform.Transform => Transform;
public bool Assign(ITransform transform) => GameObject.Assign(transform);
2023-12-06 13:25:16 +03:00
public IReadOnlyList<Vector2> Vertices { get { if (_verticesReadOnly is null) _verticesReadOnly = vertices.AsReadOnly(); return _verticesReadOnly; } }
2023-12-05 17:39:38 +03:00
2023-12-06 13:25:16 +03:00
public bool CheckCollision(Vector2 point)
{
return AABBWorld.Inside(point);
2023-12-05 17:39:38 +03:00
}
public void Recalculate()
{
2023-12-06 13:25:16 +03:00
AABBWorld = new AABB(
AABBLocal.LowerBoundary + Transform.Position,
AABBLocal.UpperBoundary + Transform.Position
);
vertices.Clear();
vertices.Add(AABBWorld.LowerBoundary);
vertices.Add(new(AABBWorld.LowerBoundary.X, AABBWorld.UpperBoundary.Y));
vertices.Add(AABBWorld.UpperBoundary);
vertices.Add(new(AABBWorld.LowerBoundary.Y, AABBWorld.UpperBoundary.X));
}
public Collider2DAABBBehaviour(Vector2 lowerBoundary, Vector2 upperBoundary)
{
AABBLocal = new AABB(lowerBoundary, upperBoundary);
AABBWorld = new AABB(lowerBoundary, upperBoundary);
}
public Collider2DAABBBehaviour()
{
AABBLocal = new(Vector2.Zero, Vector2.Zero);
AABBWorld = new(Vector2.Zero, Vector2.Zero);
2023-12-05 17:39:38 +03:00
}
}