Test1
This commit is contained in:
parent
9ec92c1beb
commit
670842c1e3
|
@ -0,0 +1,23 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using Microsoft.Xna.Framework;
|
||||
|
||||
using Syntriax.Engine.Core.Abstract;
|
||||
|
||||
namespace Syntriax.Engine.Physics2D.Abstract;
|
||||
|
||||
public interface ICollider2D : IBehaviour, IAssignableTransform
|
||||
{
|
||||
Action<ICollider2D, ICollider2D>? OnCollision { get; set; }
|
||||
|
||||
Vector2 OffsetPosition { get; set; }
|
||||
Vector2 OffsetScale { get; set; }
|
||||
float OffsetRotation { get; set; }
|
||||
|
||||
IReadOnlyList<Vector2> Vertices { get; }
|
||||
|
||||
bool CheckCollision(ICollider2D collider);
|
||||
|
||||
void RecalculateVertices();
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
namespace Syntriax.Engine.Physics2D.Abstract;
|
||||
|
||||
public interface ICollisionResolver2D
|
||||
{
|
||||
void ResolveCollision(ICollider2D colliderA, ICollider2D colliderB);
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
namespace Syntriax.Engine.Physics2D.Abstract;
|
||||
|
||||
public interface IPhysicsEngine2D
|
||||
{
|
||||
int IterationCount { get; set; }
|
||||
|
||||
void AddRigidBody(IRigidBody2D rigidBody);
|
||||
void RemoveRigidBody(IRigidBody2D rigidBody);
|
||||
|
||||
void Step(float deltaTime);
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
namespace Syntriax.Engine.Physics2D.Abstract;
|
||||
|
||||
public interface IPhysicsMaterial2D
|
||||
{
|
||||
float Friction { get; set; }
|
||||
float Restitution { get; set; }
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
using Microsoft.Xna.Framework;
|
||||
|
||||
using Syntriax.Engine.Core.Abstract;
|
||||
|
||||
namespace Syntriax.Engine.Physics2D.Abstract;
|
||||
|
||||
public interface IRigidBody2D : IBehaviour, IAssignableTransform
|
||||
{
|
||||
IPhysicsMaterial2D Material { get; set; }
|
||||
|
||||
Vector2 Velocity { get; set; }
|
||||
float AngularVelocity { get; set; }
|
||||
|
||||
float Mass { get; set; }
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
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;
|
||||
|
||||
public abstract class Collider2DBehaviourBase : BehaviourOverride, ICollider2D
|
||||
{
|
||||
public Action<IAssignableTransform>? OnTransformAssigned { get => GameObject.OnTransformAssigned; set => GameObject.OnTransformAssigned = value; }
|
||||
public Action<ICollider2D, ICollider2D>? OnCollision { get; set; } = null;
|
||||
|
||||
public Vector2 OffsetPosition { get; set; } = Vector2.Zero;
|
||||
public Vector2 OffsetScale { get; set; } = Vector2.One;
|
||||
public float OffsetRotation { get; set; } = 0f;
|
||||
|
||||
ITransform IAssignableTransform.Transform => Transform;
|
||||
|
||||
|
||||
public bool Assign(ITransform transform) => GameObject.Assign(transform);
|
||||
|
||||
public void RecalculateVertices()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool CheckCollision(ICollider2D collider)
|
||||
{
|
||||
return false;
|
||||
|
||||
OnCollision?.Invoke(this, collider);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public abstract IReadOnlyList<Vector2> Vertices { get; }
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
using System;
|
||||
|
||||
using Syntriax.Engine.Physics2D.Abstract;
|
||||
|
||||
namespace Syntriax.Engine.Physics2D;
|
||||
|
||||
// public class Collider2DBox : Collider2DBehaviourBase
|
||||
// {
|
||||
// protected override bool ProcessCollision(ICollider2D collider)
|
||||
// {
|
||||
// if (collider is not Collider2DBox)
|
||||
// return false;
|
||||
|
||||
|
||||
// }
|
||||
// }
|
|
@ -0,0 +1,78 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Syntriax.Engine.Core.Abstract;
|
||||
using Syntriax.Engine.Physics2D.Abstract;
|
||||
|
||||
namespace Syntriax.Engine.Physics2D;
|
||||
|
||||
public class PhysicsEngine2D : IPhysicsEngine2D
|
||||
{
|
||||
private IList<IRigidBody2D> rigidBodies = new List<IRigidBody2D>(32);
|
||||
private IList<ICollider2D> colliders = new List<ICollider2D>(64);
|
||||
|
||||
private int _iterationCount = 1;
|
||||
|
||||
|
||||
public int IterationCount { get => _iterationCount; set => _iterationCount = value < 1 ? 1 : value; }
|
||||
|
||||
public void AddRigidBody(IRigidBody2D rigidBody)
|
||||
{
|
||||
if (rigidBodies.Contains(rigidBody))
|
||||
return;
|
||||
|
||||
rigidBodies.Add(rigidBody);
|
||||
|
||||
foreach (var collider2D in rigidBody.BehaviourController.GetBehaviours<ICollider2D>())
|
||||
colliders.Add(collider2D);
|
||||
|
||||
rigidBody.BehaviourController.OnBehaviourAdded += OnBehaviourAdded;
|
||||
rigidBody.BehaviourController.OnBehaviourRemoved += OnBehaviourRemoved;
|
||||
}
|
||||
|
||||
public void RemoveRigidBody(IRigidBody2D rigidBody)
|
||||
{
|
||||
rigidBodies.Remove(rigidBody);
|
||||
}
|
||||
|
||||
public void Step(float deltaTime)
|
||||
{
|
||||
float intervalDeltaTime = deltaTime / IterationCount;
|
||||
|
||||
for (int i = 0; i < IterationCount; i++)
|
||||
{
|
||||
foreach (var rigidBody in rigidBodies)
|
||||
{
|
||||
Vector2 nextPosition = rigidBody.Transform.Position;
|
||||
nextPosition += rigidBody.Velocity * intervalDeltaTime;
|
||||
|
||||
rigidBody.Transform.Position += nextPosition;
|
||||
}
|
||||
|
||||
for (int colliderIX = 0; colliderIX < colliders.Count; colliderIX++)
|
||||
{
|
||||
ICollider2D colliderX = colliders[colliderIX];
|
||||
for (int colliderIY = colliderIX + 1; colliderIY < colliders.Count; colliderIY++)
|
||||
if (colliderX.CheckCollision(colliders[colliderIY]))
|
||||
Console.WriteLine($"Collision");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void OnBehaviourAdded(IBehaviourController controller, IBehaviour behaviour)
|
||||
{
|
||||
if (behaviour is not ICollider2D collider2D)
|
||||
return;
|
||||
|
||||
colliders.Add(collider2D);
|
||||
}
|
||||
|
||||
private void OnBehaviourRemoved(IBehaviourController controller, IBehaviour behaviour)
|
||||
{
|
||||
if (behaviour is not ICollider2D collider2D)
|
||||
return;
|
||||
|
||||
colliders.Remove(collider2D);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
using System;
|
||||
|
||||
using Microsoft.Xna.Framework;
|
||||
|
||||
using Syntriax.Engine.Core;
|
||||
using Syntriax.Engine.Core.Abstract;
|
||||
using Syntriax.Engine.Physics2D.Abstract;
|
||||
|
||||
namespace Syntriax.Engine.Physics2D;
|
||||
|
||||
public class RigidBody2D : BehaviourOverride, IRigidBody2D
|
||||
{
|
||||
public Action<IAssignableTransform>? OnTransformAssigned { get => GameObject.OnTransformAssigned; set => GameObject.OnTransformAssigned = value; }
|
||||
|
||||
|
||||
public IPhysicsMaterial2D Material { get; set; } = null!;
|
||||
|
||||
public Vector2 Velocity { get; set; } = Vector2.Zero;
|
||||
public float AngularVelocity { get; set; } = 0f;
|
||||
public float Mass { get; set; } = 0f;
|
||||
ITransform IAssignableTransform.Transform => Transform;
|
||||
|
||||
|
||||
public bool Assign(ITransform transform) => GameObject.Assign(transform);
|
||||
}
|
Loading…
Reference in New Issue