Compare commits
No commits in common. "feat/hierarchy" and "main" have entirely different histories.
feat/hiera
...
main
|
@ -1,3 +1,5 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Abstract;
|
namespace Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -8,7 +10,7 @@ public interface IAssignable
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when the <see cref="IAssignable"/>'s fields are unassigned and completely ready to recycle.
|
/// Event triggered when the <see cref="IAssignable"/>'s fields are unassigned and completely ready to recycle.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnUnassignedDelegate? OnUnassigned;
|
Action<IAssignable>? OnUnassigned { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Unassign <see cref="IAssignable"/>'s all fields and make it ready to recycle.
|
/// Unassign <see cref="IAssignable"/>'s all fields and make it ready to recycle.
|
||||||
|
@ -17,6 +19,4 @@ public interface IAssignable
|
||||||
/// <see cref="true"/>, if the fields are unsigned successfully, <see cref="false"/> if not.
|
/// <see cref="true"/>, if the fields are unsigned successfully, <see cref="false"/> if not.
|
||||||
/// </returns>
|
/// </returns>
|
||||||
bool Unassign();
|
bool Unassign();
|
||||||
|
|
||||||
delegate void OnUnassignedDelegate(IAssignable sender);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Abstract;
|
namespace Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -8,7 +10,7 @@ public interface IAssignableBehaviourController : IAssignable
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when the <see cref="IBehaviourController"/> value has has been assigned a new value.
|
/// Event triggered when the <see cref="IBehaviourController"/> value has has been assigned a new value.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnBehaviourControllerAssignedDelegate? OnBehaviourControllerAssigned;
|
Action<IAssignableBehaviourController>? OnBehaviourControllerAssigned { get; set; }
|
||||||
|
|
||||||
/// <inheritdoc cref="IBehaviourController" />
|
/// <inheritdoc cref="IBehaviourController" />
|
||||||
IBehaviourController BehaviourController { get; }
|
IBehaviourController BehaviourController { get; }
|
||||||
|
@ -21,6 +23,4 @@ public interface IAssignableBehaviourController : IAssignable
|
||||||
/// <see cref="true"/>, if the value given assigned successfully assigned, <see cref="false"/> if not.
|
/// <see cref="true"/>, if the value given assigned successfully assigned, <see cref="false"/> if not.
|
||||||
/// </returns>
|
/// </returns>
|
||||||
bool Assign(IBehaviourController behaviourController);
|
bool Assign(IBehaviourController behaviourController);
|
||||||
|
|
||||||
delegate void OnBehaviourControllerAssignedDelegate(IAssignableBehaviourController sender);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Abstract;
|
namespace Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -8,7 +10,7 @@ public interface IAssignableEntity : IAssignable
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when the <see cref="IEntity"/> value has has been assigned a new value.
|
/// Event triggered when the <see cref="IEntity"/> value has has been assigned a new value.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnEntityAssignedDelegate? OnEntityAssigned;
|
Action<IAssignableEntity>? OnEntityAssigned { get; set; }
|
||||||
|
|
||||||
/// <inheritdoc cref="IEntity" />
|
/// <inheritdoc cref="IEntity" />
|
||||||
IEntity Entity { get; }
|
IEntity Entity { get; }
|
||||||
|
@ -21,6 +23,4 @@ public interface IAssignableEntity : IAssignable
|
||||||
/// <see cref="true"/>, if the value given assigned successfully assigned, <see cref="false"/> if not.
|
/// <see cref="true"/>, if the value given assigned successfully assigned, <see cref="false"/> if not.
|
||||||
/// </returns>
|
/// </returns>
|
||||||
bool Assign(IEntity entity);
|
bool Assign(IEntity entity);
|
||||||
|
|
||||||
delegate void OnEntityAssignedDelegate(IAssignableEntity sender);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Abstract;
|
namespace Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -8,7 +10,7 @@ public interface IAssignableGameManager : IAssignable
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when the <see cref="IGameManager"/> value has has been assigned a new value.
|
/// Event triggered when the <see cref="IGameManager"/> value has has been assigned a new value.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnGameManagerAssignedDelegate? OnGameManagerAssigned;
|
Action<IAssignableGameManager>? OnGameManagerAssigned { get; set; }
|
||||||
|
|
||||||
/// <inheritdoc cref="IGameManager" />
|
/// <inheritdoc cref="IGameManager" />
|
||||||
IGameManager GameManager { get; }
|
IGameManager GameManager { get; }
|
||||||
|
@ -21,6 +23,4 @@ public interface IAssignableGameManager : IAssignable
|
||||||
/// <see cref="true"/>, if the value given assigned successfully assigned, <see cref="false"/> if not.
|
/// <see cref="true"/>, if the value given assigned successfully assigned, <see cref="false"/> if not.
|
||||||
/// </returns>
|
/// </returns>
|
||||||
bool Assign(IGameManager gameManager);
|
bool Assign(IGameManager gameManager);
|
||||||
|
|
||||||
delegate void OnGameManagerAssignedDelegate(IAssignableGameManager sender);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Abstract;
|
namespace Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -8,7 +10,7 @@ public interface IAssignableGameObject : IAssignable
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when the <see cref="IGameObject"/> value has has been assigned a new value.
|
/// Event triggered when the <see cref="IGameObject"/> value has has been assigned a new value.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnGameObjectAssignedDelegate? OnGameObjectAssigned;
|
Action<IAssignableGameObject>? OnGameObjectAssigned { get; set; }
|
||||||
|
|
||||||
/// <inheritdoc cref="IGameObject" />
|
/// <inheritdoc cref="IGameObject" />
|
||||||
IGameObject GameObject { get; }
|
IGameObject GameObject { get; }
|
||||||
|
@ -21,6 +23,4 @@ public interface IAssignableGameObject : IAssignable
|
||||||
/// <see cref="true"/>, if the value given assigned successfully assigned, <see cref="false"/> if not.
|
/// <see cref="true"/>, if the value given assigned successfully assigned, <see cref="false"/> if not.
|
||||||
/// </returns>
|
/// </returns>
|
||||||
bool Assign(IGameObject gameObject);
|
bool Assign(IGameObject gameObject);
|
||||||
|
|
||||||
delegate void OnGameObjectAssignedDelegate(IAssignableGameObject sender);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Abstract;
|
namespace Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -8,7 +10,7 @@ public interface IAssignableStateEnable : IAssignable
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when the <see cref="IStateEnable"/> value has has been assigned a new value.
|
/// Event triggered when the <see cref="IStateEnable"/> value has has been assigned a new value.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnStateEnableAssignedDelegate? OnStateEnableAssigned;
|
Action<IAssignableStateEnable>? OnStateEnableAssigned { get; set; }
|
||||||
|
|
||||||
/// <inheritdoc cref="IStateEnable" />
|
/// <inheritdoc cref="IStateEnable" />
|
||||||
IStateEnable StateEnable { get; }
|
IStateEnable StateEnable { get; }
|
||||||
|
@ -21,6 +23,4 @@ public interface IAssignableStateEnable : IAssignable
|
||||||
/// <see cref="true"/>, if the value given assigned successfully assigned, <see cref="false"/> if not.
|
/// <see cref="true"/>, if the value given assigned successfully assigned, <see cref="false"/> if not.
|
||||||
/// </returns>
|
/// </returns>
|
||||||
bool Assign(IStateEnable stateEnable);
|
bool Assign(IStateEnable stateEnable);
|
||||||
|
|
||||||
delegate void OnStateEnableAssignedDelegate(IAssignableStateEnable sender);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Abstract;
|
namespace Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -8,7 +10,7 @@ public interface IAssignableTransform : IAssignable
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when the <see cref="ITransform"/> value has has been assigned a new value.
|
/// Event triggered when the <see cref="ITransform"/> value has has been assigned a new value.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnTransformAssignedDelegate? OnTransformAssigned;
|
Action<IAssignableTransform>? OnTransformAssigned { get; set; }
|
||||||
|
|
||||||
/// <inheritdoc cref="ITransform" />
|
/// <inheritdoc cref="ITransform" />
|
||||||
ITransform Transform { get; }
|
ITransform Transform { get; }
|
||||||
|
@ -21,6 +23,4 @@ public interface IAssignableTransform : IAssignable
|
||||||
/// <see cref="true"/>, if the value given assigned successfully assigned, <see cref="false"/> if not.
|
/// <see cref="true"/>, if the value given assigned successfully assigned, <see cref="false"/> if not.
|
||||||
/// </returns>
|
/// </returns>
|
||||||
bool Assign(ITransform transform);
|
bool Assign(ITransform transform);
|
||||||
|
|
||||||
delegate void OnTransformAssignedDelegate(IAssignableTransform sender);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,13 +4,13 @@ namespace Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
public abstract class BaseEntity : IEntity
|
public abstract class BaseEntity : IEntity
|
||||||
{
|
{
|
||||||
public event IEntity.OnIdChangedDelegate? OnIdChanged = null;
|
public Action<IEntity, string>? OnIdChanged { get; set; } = null;
|
||||||
|
|
||||||
public event IInitialize.OnInitializedDelegate? OnInitialized = null;
|
public Action<IAssignable>? OnUnassigned { get; set; } = null;
|
||||||
public event IInitialize.OnFinalizedDelegate? OnFinalized = null;
|
public Action<IAssignableStateEnable>? OnStateEnableAssigned { get; set; } = null;
|
||||||
|
|
||||||
public event IAssignableStateEnable.OnStateEnableAssignedDelegate? OnStateEnableAssigned = null;
|
public Action<IInitialize>? OnInitialized { get; set; } = null;
|
||||||
public event IAssignable.OnUnassignedDelegate? OnUnassigned = null;
|
public Action<IInitialize>? OnFinalized { get; set; } = null;
|
||||||
|
|
||||||
|
|
||||||
private IStateEnable _stateEnable = null!;
|
private IStateEnable _stateEnable = null!;
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Abstract;
|
namespace Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -8,7 +10,7 @@ public interface IBehaviour : IEntity, IAssignableBehaviourController, IAssignab
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when the priority of the <see cref="IBehaviour"/> changes.
|
/// Event triggered when the priority of the <see cref="IBehaviour"/> changes.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnPriorityChangedDelegate? OnPriorityChanged;
|
Action<IBehaviour>? OnPriorityChanged { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The priority of the <see cref="IBehaviour"/>.
|
/// The priority of the <see cref="IBehaviour"/>.
|
||||||
|
@ -19,6 +21,4 @@ public interface IBehaviour : IEntity, IAssignableBehaviourController, IAssignab
|
||||||
/// The value indicating whether the <see cref="IBehaviour"/> is active.
|
/// The value indicating whether the <see cref="IBehaviour"/> is active.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
bool IsActive { get; }
|
bool IsActive { get; }
|
||||||
|
|
||||||
delegate void OnPriorityChangedDelegate(IBehaviour sender, int previousPriority);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics.CodeAnalysis;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
|
||||||
|
@ -11,27 +12,27 @@ public interface IBehaviourController : IAssignableGameObject, IEnumerable<IBeha
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered before the update of <see cref="IBehaviour"/>s.
|
/// Event triggered before the update of <see cref="IBehaviour"/>s.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnPreUpdateDelegate? OnPreUpdate;
|
Action<IBehaviourController>? OnPreUpdate { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered during the update of <see cref="IBehaviour"/>s.
|
/// Event triggered during the update of <see cref="IBehaviour"/>s.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnUpdateDelegate? OnUpdate;
|
Action<IBehaviourController>? OnUpdate { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered before the drawing phase.
|
/// Event triggered before the drawing phase.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnPreDrawDelegate? OnPreDraw;
|
Action<IBehaviourController>? OnPreDraw { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when a <see cref="IBehaviour"/> is added to the <see cref="IBehaviourController"/>.
|
/// Event triggered when a <see cref="IBehaviour"/> is added to the <see cref="IBehaviourController"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnBehaviourAddedDelegate? OnBehaviourAdded;
|
Action<IBehaviourController, IBehaviour>? OnBehaviourAdded { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when a <see cref="IBehaviour"/> is removed from the <see cref="IBehaviourController"/>.
|
/// Event triggered when a <see cref="IBehaviour"/> is removed from the <see cref="IBehaviourController"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnBehaviourRemovedDelegate? OnBehaviourRemoved;
|
Action<IBehaviourController, IBehaviour>? OnBehaviourRemoved { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Adds a <see cref="IBehaviour"/> to the <see cref="IBehaviourController"/>.
|
/// Adds a <see cref="IBehaviour"/> to the <see cref="IBehaviourController"/>.
|
||||||
|
@ -101,11 +102,4 @@ public interface IBehaviourController : IAssignableGameObject, IEnumerable<IBeha
|
||||||
/// Performs pre-draw operations.
|
/// Performs pre-draw operations.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void UpdatePreDraw();
|
void UpdatePreDraw();
|
||||||
|
|
||||||
delegate void OnPreUpdateDelegate(IBehaviourController sender);
|
|
||||||
delegate void OnUpdateDelegate(IBehaviourController sender);
|
|
||||||
delegate void OnPreDrawDelegate(IBehaviourController sender);
|
|
||||||
delegate void OnBehaviourAddedDelegate(IBehaviourController sender, IBehaviour behaviourAdded);
|
|
||||||
delegate void OnBehaviourRemovedDelegate(IBehaviourController sender, IBehaviour behaviourRemoved);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Abstract;
|
namespace Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -9,12 +11,10 @@ public interface IEntity : IInitialize, IAssignableStateEnable
|
||||||
/// Event triggered when the <see cref="Id"/> of the <see cref="IEntity"/> changes.
|
/// Event triggered when the <see cref="Id"/> of the <see cref="IEntity"/> changes.
|
||||||
/// The string action parameter is the previous <see cref="Id"/> of the <see cref="IEntity"/>.
|
/// The string action parameter is the previous <see cref="Id"/> of the <see cref="IEntity"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnIdChangedDelegate? OnIdChanged;
|
Action<IEntity, string>? OnIdChanged { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The ID of the <see cref="IEntity"/>.
|
/// The ID of the <see cref="IEntity"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
string Id { get; set; }
|
string Id { get; set; }
|
||||||
|
|
||||||
delegate void OnIdChangedDelegate(IEntity sender, string previousId);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Abstract;
|
namespace Syntriax.Engine.Core.Abstract;
|
||||||
|
@ -10,12 +11,12 @@ public interface IGameManager : IEntity, IEnumerable<IGameObject>
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when a <see cref="IGameObject"/> is registered to the <see cref="IGameManager"/>.
|
/// Event triggered when a <see cref="IGameObject"/> is registered to the <see cref="IGameManager"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnGameObjectRegisteredDelegate? OnGameObjectRegistered;
|
Action<IGameManager, IGameObject>? OnGameObjectRegistered { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when a <see cref="IGameObject"/> is unregistered from the <see cref="IGameManager"/>.
|
/// Event triggered when a <see cref="IGameObject"/> is unregistered from the <see cref="IGameManager"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnGameObjectUnRegisteredDelegate? OnGameObjectUnRegistered;
|
Action<IGameManager, IGameObject>? OnGameObjectUnRegistered { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a read-only list of <see cref="IGameObject"/>s managed by the <see cref="IGameManager"/>.
|
/// Gets a read-only list of <see cref="IGameObject"/>s managed by the <see cref="IGameManager"/>.
|
||||||
|
@ -53,7 +54,4 @@ public interface IGameManager : IEntity, IEnumerable<IGameObject>
|
||||||
/// Performs operations that should be done before the draw calls.
|
/// Performs operations that should be done before the draw calls.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void PreDraw();
|
void PreDraw();
|
||||||
|
|
||||||
delegate void OnGameObjectRegisteredDelegate(IGameManager sender, IGameObject gameObjectRegistered);
|
|
||||||
delegate void OnGameObjectUnRegisteredDelegate(IGameManager sender, IGameObject gameObjectUnregistered);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Abstract;
|
namespace Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -8,12 +10,10 @@ public interface IGameObject : IEntity, IAssignableGameManager, IAssignableTrans
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when the <see cref="Update"/> method is called.
|
/// Event triggered when the <see cref="Update"/> method is called.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnUpdatedDelegate? OnUpdated;
|
Action<IGameObject>? OnUpdated { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Updates the game object.
|
/// Updates the game object.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void Update();
|
void Update();
|
||||||
|
|
||||||
delegate void OnUpdatedDelegate(IGameObject sender);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Abstract;
|
namespace Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -8,12 +10,12 @@ public interface IInitialize
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when the <see cref="Initialize"/> method is called successfully.
|
/// Event triggered when the <see cref="Initialize"/> method is called successfully.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnInitializedDelegate? OnInitialized;
|
Action<IInitialize>? OnInitialized { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when the <see cref="Finalize"/> method is called successfully.
|
/// Event triggered when the <see cref="Finalize"/> method is called successfully.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnFinalizedDelegate? OnFinalized;
|
Action<IInitialize>? OnFinalized { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The value indicating whether the entity has been initialized.
|
/// The value indicating whether the entity has been initialized.
|
||||||
|
@ -31,7 +33,4 @@ public interface IInitialize
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns><see cref="true"/> if finalization is successful, otherwise <see cref="false"/>.</returns>
|
/// <returns><see cref="true"/> if finalization is successful, otherwise <see cref="false"/>.</returns>
|
||||||
bool Finalize();
|
bool Finalize();
|
||||||
|
|
||||||
delegate void OnInitializedDelegate(IInitialize sender);
|
|
||||||
delegate void OnFinalizedDelegate(IInitialize sender);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Abstract;
|
namespace Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -8,12 +10,10 @@ public interface INameable
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when the name of the entity changes.
|
/// Event triggered when the name of the entity changes.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnNameChangedDelegate? OnNameChanged;
|
Action<IEntity>? OnNameChanged { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The name of the entity.
|
/// The name of the entity.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
string Name { get; set; }
|
string Name { get; set; }
|
||||||
|
|
||||||
delegate void OnNameChangedDelegate(INameable sender, string previousName);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Abstract;
|
namespace Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -8,12 +10,10 @@ public interface IStateEnable : IAssignableEntity
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when the <see cref="Enabled"/> state of the <see cref="IStateEnable"/> changes.
|
/// Event triggered when the <see cref="Enabled"/> state of the <see cref="IStateEnable"/> changes.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnNameChangedDelegate? OnEnabledChanged;
|
Action<IStateEnable>? OnEnabledChanged { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The value indicating whether the <see cref="IStateEnable"/> is enabled.
|
/// The value indicating whether the <see cref="IStateEnable"/> is enabled.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
bool Enabled { get; set; }
|
bool Enabled { get; set; }
|
||||||
|
|
||||||
delegate void OnNameChangedDelegate(IStateEnable sender, bool previousState);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,105 +1,39 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core.Abstract;
|
namespace Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents the transformation properties of an object such as position, scale, and rotation.
|
/// Represents the transformation properties of an object such as position, scale, and rotation.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface ITransform : IAssignableGameObject, IEnumerable<ITransform>
|
public interface ITransform
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when the <see cref="Position"/> of the <see cref="ITransform"/> changes.
|
/// Event triggered when the <see cref="Position"/> of the <see cref="ITransform"/> changes.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnPositionChangedDelegate? OnPositionChanged;
|
Action<ITransform>? OnPositionChanged { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when the <see cref="Scale"/> of the <see cref="ITransform"/> changes.
|
/// Event triggered when the <see cref="Scale"/> of the <see cref="ITransform"/> changes.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnScaleChangedDelegate? OnScaleChanged;
|
Action<ITransform>? OnScaleChanged { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when the <see cref="Rotation"/> of the <see cref="ITransform"/> changes.
|
/// Event triggered when the <see cref="Rotation"/> of the <see cref="ITransform"/> changes.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnRotationChangedDelegate? OnRotationChanged;
|
Action<ITransform>? OnRotationChanged { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when the <see cref="Parent"/> of the <see cref="ITransform"/> changes. The second parameter is the old <see cref="ITransform"/>.
|
/// The position of the <see cref="ITransform"/> in 2D space.
|
||||||
/// </summary>
|
|
||||||
event OnParentChangedDelegate? OnParentChanged;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Event triggered when a new <see cref="ITransform"/> is added to the <see cref="Children"/>.
|
|
||||||
/// </summary>
|
|
||||||
event OnChildrenAddedDelegate? OnChildrenAdded;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Event triggered when an <see cref="ITransform"/> is removed from the <see cref="Children"/>.
|
|
||||||
/// </summary>
|
|
||||||
event OnChildrenRemovedDelegate? OnChildrenRemoved;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The world position of the <see cref="ITransform"/> in 2D space.
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Vector2D Position { get; set; }
|
Vector2D Position { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The world scale of the <see cref="ITransform"/>.
|
/// The scale of the <see cref="ITransform"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Vector2D Scale { get; set; }
|
Vector2D Scale { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The world rotation of the <see cref="ITransform"/> in degrees.
|
/// The rotation of the <see cref="ITransform"/> in degrees.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
float Rotation { get; set; }
|
float Rotation { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The local position of the <see cref="ITransform"/> in 2D space.
|
|
||||||
/// </summary>
|
|
||||||
Vector2D LocalPosition { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The local scale of the <see cref="ITransform"/>.
|
|
||||||
/// </summary>
|
|
||||||
Vector2D LocalScale { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The local rotation of the <see cref="ITransform"/> in degrees.
|
|
||||||
/// </summary>
|
|
||||||
float LocalRotation { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The parent <see cref="ITransform"/> of the <see cref="ITransform"/>.
|
|
||||||
/// </summary>
|
|
||||||
ITransform? Parent { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The <see cref="ITransform"/>s that have this <see cref="ITransform"/> as their <see cref="Parent"/>.
|
|
||||||
/// </summary>
|
|
||||||
IReadOnlyList<ITransform> Children { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sets the parent <see cref="ITransform"/> of this <see cref="ITransform"/>.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="transform">The parent <see cref="ITransform"/> to set.</param>
|
|
||||||
void SetParent(ITransform? transform);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Adds a child <see cref="ITransform"/> to this <see cref="ITransform"/>.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="transform">The child <see cref="ITransform"/> to add.</param>
|
|
||||||
void AddChild(ITransform transform);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Removes a child <see cref="ITransform"/> from this <see cref="ITransform"/>.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="transform">The child <see cref="ITransform"/> to remove.</param>
|
|
||||||
void RemoveChild(ITransform transform);
|
|
||||||
|
|
||||||
delegate void OnPositionChangedDelegate(ITransform sender);
|
|
||||||
delegate void OnScaleChangedDelegate(ITransform sender);
|
|
||||||
delegate void OnRotationChangedDelegate(ITransform sender);
|
|
||||||
delegate void OnParentChangedDelegate(ITransform sender, ITransform? newParent);
|
|
||||||
delegate void OnChildrenAddedDelegate(ITransform sender, ITransform childrenAdded);
|
|
||||||
delegate void OnChildrenRemovedDelegate(ITransform sender, ITransform childrenRemoved);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
using Syntriax.Engine.Core.Abstract;
|
using Syntriax.Engine.Core.Abstract;
|
||||||
using Syntriax.Engine.Core.Exceptions;
|
using Syntriax.Engine.Core.Exceptions;
|
||||||
|
|
||||||
|
@ -6,16 +8,15 @@ namespace Syntriax.Engine.Core;
|
||||||
[System.Diagnostics.DebuggerDisplay("{GetType().Name, nq}, Priority: {Priority}, Initialized: {Initialized}")]
|
[System.Diagnostics.DebuggerDisplay("{GetType().Name, nq}, Priority: {Priority}, Initialized: {Initialized}")]
|
||||||
public abstract class Behaviour : BaseEntity, IBehaviour
|
public abstract class Behaviour : BaseEntity, IBehaviour
|
||||||
{
|
{
|
||||||
public event IAssignableBehaviourController.OnBehaviourControllerAssignedDelegate? OnBehaviourControllerAssigned = null;
|
public Action<IAssignableBehaviourController>? OnBehaviourControllerAssigned { get; set; } = null;
|
||||||
|
|
||||||
public event IBehaviour.OnPriorityChangedDelegate? OnPriorityChanged = null;
|
public Action<IBehaviour>? OnPriorityChanged { get; set; } = null;
|
||||||
|
|
||||||
|
|
||||||
private IBehaviourController _behaviourController = null!;
|
private IBehaviourController _behaviourController = null!;
|
||||||
|
|
||||||
private int _priority = 0;
|
private int _priority = 0;
|
||||||
|
|
||||||
|
|
||||||
public IBehaviourController BehaviourController => _behaviourController;
|
public IBehaviourController BehaviourController => _behaviourController;
|
||||||
|
|
||||||
public override bool IsActive => base.IsActive && BehaviourController.GameObject.StateEnable.Enabled;
|
public override bool IsActive => base.IsActive && BehaviourController.GameObject.StateEnable.Enabled;
|
||||||
|
@ -28,9 +29,8 @@ public abstract class Behaviour : BaseEntity, IBehaviour
|
||||||
if (value == _priority)
|
if (value == _priority)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int previousPriority = _priority;
|
|
||||||
_priority = value;
|
_priority = value;
|
||||||
OnPriorityChanged?.Invoke(this, previousPriority);
|
OnPriorityChanged?.Invoke(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,13 +6,13 @@ using Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core;
|
namespace Syntriax.Engine.Core;
|
||||||
|
|
||||||
public class BehaviourCollector<T> : IAssignableGameManager, IEnumerable<T>
|
public class BehaviourCacher<T> : IAssignableGameManager, IEnumerable<T>
|
||||||
{
|
{
|
||||||
public event IAssignable.OnUnassignedDelegate? OnUnassigned = null;
|
public Action<IAssignable>? OnUnassigned { get; set; } = null;
|
||||||
public event IAssignableGameManager.OnGameManagerAssignedDelegate? OnGameManagerAssigned = null;
|
public Action<IAssignableGameManager>? OnGameManagerAssigned { get; set; } = null;
|
||||||
|
|
||||||
public event OnCollectedDelegate? OnCollected = null;
|
public Action<BehaviourCacher<T>, T>? OnCached { get; set; } = null;
|
||||||
public event OnRemovedDelegate? OnRemoved = null;
|
public Action<BehaviourCacher<T>, T>? OnUncached { get; set; } = null;
|
||||||
|
|
||||||
private readonly List<T> _behaviours = new(32);
|
private readonly List<T> _behaviours = new(32);
|
||||||
|
|
||||||
|
@ -21,8 +21,8 @@ public class BehaviourCollector<T> : IAssignableGameManager, IEnumerable<T>
|
||||||
|
|
||||||
public T this[Index index] => _behaviours[index];
|
public T this[Index index] => _behaviours[index];
|
||||||
|
|
||||||
public BehaviourCollector() { }
|
public BehaviourCacher() { }
|
||||||
public BehaviourCollector(IGameManager gameManager) => Assign(gameManager);
|
public BehaviourCacher(IGameManager gameManager) => Assign(gameManager);
|
||||||
|
|
||||||
private void OnGameObjectRegistered(IGameManager manager, IGameObject gameObject)
|
private void OnGameObjectRegistered(IGameManager manager, IGameObject gameObject)
|
||||||
{
|
{
|
||||||
|
@ -42,7 +42,7 @@ public class BehaviourCollector<T> : IAssignableGameManager, IEnumerable<T>
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_behaviours.Add(tBehaviour);
|
_behaviours.Add(tBehaviour);
|
||||||
OnCollected?.Invoke(this, tBehaviour);
|
OnCached?.Invoke(this, tBehaviour);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnBehaviourRemoved(IBehaviourController controller, IBehaviour behaviour)
|
private void OnBehaviourRemoved(IBehaviourController controller, IBehaviour behaviour)
|
||||||
|
@ -53,7 +53,7 @@ public class BehaviourCollector<T> : IAssignableGameManager, IEnumerable<T>
|
||||||
if (!_behaviours.Remove(tBehaviour))
|
if (!_behaviours.Remove(tBehaviour))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
OnRemoved?.Invoke(this, tBehaviour);
|
OnUncached?.Invoke(this, tBehaviour);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Assign(IGameManager gameManager)
|
public bool Assign(IGameManager gameManager)
|
||||||
|
@ -99,8 +99,4 @@ public class BehaviourCollector<T> : IAssignableGameManager, IEnumerable<T>
|
||||||
|
|
||||||
public IEnumerator<T> GetEnumerator() => _behaviours.GetEnumerator();
|
public IEnumerator<T> GetEnumerator() => _behaviours.GetEnumerator();
|
||||||
IEnumerator IEnumerable.GetEnumerator() => _behaviours.GetEnumerator();
|
IEnumerator IEnumerable.GetEnumerator() => _behaviours.GetEnumerator();
|
||||||
|
|
||||||
|
|
||||||
public delegate void OnCollectedDelegate(BehaviourCollector<T> sender, T behaviourCollected);
|
|
||||||
public delegate void OnRemovedDelegate(BehaviourCollector<T> sender, T behaviourRemoved);
|
|
||||||
}
|
}
|
|
@ -11,14 +11,14 @@ namespace Syntriax.Engine.Core;
|
||||||
[System.Diagnostics.DebuggerDisplay("Behaviour Count: {behaviours.Count}")]
|
[System.Diagnostics.DebuggerDisplay("Behaviour Count: {behaviours.Count}")]
|
||||||
public class BehaviourController : IBehaviourController
|
public class BehaviourController : IBehaviourController
|
||||||
{
|
{
|
||||||
public event IBehaviourController.OnPreUpdateDelegate? OnPreUpdate = null;
|
public Action<IBehaviourController>? OnPreUpdate { get; set; }
|
||||||
public event IBehaviourController.OnUpdateDelegate? OnUpdate = null;
|
public Action<IBehaviourController>? OnUpdate { get; set; } = null;
|
||||||
public event IBehaviourController.OnPreDrawDelegate? OnPreDraw = null;
|
public Action<IBehaviourController>? OnPreDraw { get; set; } = null;
|
||||||
|
|
||||||
public event IBehaviourController.OnBehaviourAddedDelegate? OnBehaviourAdded = null;
|
public Action<IBehaviourController, IBehaviour>? OnBehaviourAdded { get; set; } = null;
|
||||||
public event IBehaviourController.OnBehaviourRemovedDelegate? OnBehaviourRemoved = null;
|
public Action<IBehaviourController, IBehaviour>? OnBehaviourRemoved { get; set; } = null;
|
||||||
public event IAssignable.OnUnassignedDelegate? OnUnassigned;
|
public Action<IAssignable>? OnUnassigned { get; set; } = null;
|
||||||
public event IAssignableGameObject.OnGameObjectAssignedDelegate? OnGameObjectAssigned = null;
|
public Action<IAssignableGameObject>? OnGameObjectAssigned { get; set; } = null;
|
||||||
|
|
||||||
|
|
||||||
private readonly IList<IBehaviour> behaviours = new List<IBehaviour>(Constants.BEHAVIOURS_SIZE_INITIAL);
|
private readonly IList<IBehaviour> behaviours = new List<IBehaviour>(Constants.BEHAVIOURS_SIZE_INITIAL);
|
||||||
|
@ -165,11 +165,10 @@ public class BehaviourController : IBehaviourController
|
||||||
behaviours.Add(behaviour);
|
behaviours.Add(behaviour);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnPriorityChange(IBehaviour behaviour)
|
||||||
private void OnPriorityChange(IBehaviour sender, int previousPriority)
|
|
||||||
{
|
{
|
||||||
behaviours.Remove(sender);
|
behaviours.Remove(behaviour);
|
||||||
InsertBehaviourByPriority(sender);
|
InsertBehaviourByPriority(behaviour);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerator<IBehaviour> GetEnumerator() => behaviours.GetEnumerator();
|
public IEnumerator<IBehaviour> GetEnumerator() => behaviours.GetEnumerator();
|
||||||
|
|
|
@ -1,47 +0,0 @@
|
||||||
using System.Diagnostics.CodeAnalysis;
|
|
||||||
|
|
||||||
using Syntriax.Engine.Core.Abstract;
|
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core;
|
|
||||||
|
|
||||||
public static class BehaviourControllerExtensions
|
|
||||||
{
|
|
||||||
public static bool TryGetBehaviourInParent<T>(this IBehaviourController behaviourController, [NotNullWhen(returnValue: true)] out T? behaviour) where T : class
|
|
||||||
{
|
|
||||||
behaviour = GetBehaviourInParent<T>(behaviourController);
|
|
||||||
return behaviour is not null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static T? GetBehaviourInParent<T>(this IBehaviourController behaviourController) where T : class
|
|
||||||
{
|
|
||||||
IBehaviourController? controller = behaviourController;
|
|
||||||
|
|
||||||
while (controller is not null)
|
|
||||||
{
|
|
||||||
if (behaviourController.GetBehaviour<T>() is T behaviour)
|
|
||||||
return behaviour;
|
|
||||||
|
|
||||||
controller = controller.GameObject.Transform.Parent?.GameObject.BehaviourController;
|
|
||||||
}
|
|
||||||
|
|
||||||
return default;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static bool TryGetBehaviourInChildren<T>(this IBehaviourController behaviourController, [NotNullWhen(returnValue: true)] out T? behaviour) where T : class
|
|
||||||
{
|
|
||||||
behaviour = GetBehaviourInChildren<T>(behaviourController);
|
|
||||||
return behaviour is not null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static T? GetBehaviourInChildren<T>(this IBehaviourController behaviourController) where T : class
|
|
||||||
{
|
|
||||||
if (behaviourController.GetBehaviour<T>() is T localBehaviour)
|
|
||||||
return localBehaviour;
|
|
||||||
|
|
||||||
foreach (ITransform transform in behaviourController.GameObject.Transform)
|
|
||||||
if (GetBehaviourInChildren<T>(transform.GameObject.BehaviourController) is T behaviour)
|
|
||||||
return behaviour;
|
|
||||||
|
|
||||||
return default;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -7,22 +7,18 @@ namespace Syntriax.Engine.Core;
|
||||||
|
|
||||||
public static class BehaviourExtensions
|
public static class BehaviourExtensions
|
||||||
{
|
{
|
||||||
public static T? FindBehaviour<T>(this IEnumerable<IGameObject> gameObjects) where T : class
|
public static bool TryFindBehaviour<T>(this IEnumerable<IGameObject> gameObjects, [NotNullWhen(returnValue: true)] out T? behaviour)
|
||||||
{
|
{
|
||||||
|
behaviour = default;
|
||||||
|
|
||||||
foreach (IGameObject gameObject in gameObjects)
|
foreach (IGameObject gameObject in gameObjects)
|
||||||
if (gameObject.BehaviourController.TryGetBehaviour(out T? behaviour))
|
if (gameObject.BehaviourController.TryGetBehaviour(out behaviour))
|
||||||
return behaviour;
|
return true;
|
||||||
|
|
||||||
return default;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool TryFindBehaviour<T>(this IEnumerable<IGameObject> gameObjects, [NotNullWhen(returnValue: true)] out T? behaviour) where T : class
|
public static void FindBehaviours<T>(this IEnumerable<IGameObject> gameObjects, List<T> behaviours)
|
||||||
{
|
|
||||||
behaviour = FindBehaviour<T>(gameObjects);
|
|
||||||
return behaviour is not null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void FindBehaviours<T>(this IEnumerable<IGameObject> gameObjects, List<T> behaviours) where T : class
|
|
||||||
{
|
{
|
||||||
behaviours.Clear();
|
behaviours.Clear();
|
||||||
List<T> cache = [];
|
List<T> cache = [];
|
||||||
|
|
|
@ -4,16 +4,11 @@ namespace Syntriax.Engine.Core;
|
||||||
|
|
||||||
public static class TransformExtensions
|
public static class TransformExtensions
|
||||||
{
|
{
|
||||||
public static ITransform SetTransform(this ITransform transform,
|
public static ITransform SetTransform(this ITransform transform, Vector2D? position = null, float? rotation = null, Vector2D? scale = null)
|
||||||
Vector2D? position = null, float? rotation = null, Vector2D? scale = null,
|
|
||||||
Vector2D? localPosition = null, float? localRotation = null, Vector2D? localScale = null)
|
|
||||||
{
|
{
|
||||||
if (position.HasValue) transform.Position = position.Value;
|
if (position.HasValue) transform.Position = position.Value;
|
||||||
if (rotation.HasValue) transform.Rotation = rotation.Value;
|
if (rotation.HasValue) transform.Rotation = rotation.Value;
|
||||||
if (scale.HasValue) transform.Scale = scale.Value;
|
if (scale.HasValue) transform.Scale = scale.Value;
|
||||||
if (localPosition.HasValue) transform.LocalPosition = localPosition.Value;
|
|
||||||
if (localRotation.HasValue) transform.LocalRotation = localRotation.Value;
|
|
||||||
if (localScale.HasValue) transform.LocalScale = localScale.Value;
|
|
||||||
return transform;
|
return transform;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,9 +22,6 @@ public class GameObjectFactory
|
||||||
behaviourController ??= TypeFactory.Get<BehaviourController>();
|
behaviourController ??= TypeFactory.Get<BehaviourController>();
|
||||||
stateEnable ??= TypeFactory.Get<StateEnable>();
|
stateEnable ??= TypeFactory.Get<StateEnable>();
|
||||||
|
|
||||||
if (!transform.Assign(gameObject))
|
|
||||||
throw AssignException.From(transform, gameObject);
|
|
||||||
|
|
||||||
if (!behaviourController.Assign(gameObject))
|
if (!behaviourController.Assign(gameObject))
|
||||||
throw AssignException.From(behaviourController, gameObject);
|
throw AssignException.From(behaviourController, gameObject);
|
||||||
if (!stateEnable.Assign(gameObject))
|
if (!stateEnable.Assign(gameObject))
|
||||||
|
|
|
@ -11,8 +11,8 @@ namespace Syntriax.Engine.Core;
|
||||||
[System.Diagnostics.DebuggerDisplay("GameObject Count: {_gameObjects.Count}")]
|
[System.Diagnostics.DebuggerDisplay("GameObject Count: {_gameObjects.Count}")]
|
||||||
public class GameManager : BaseEntity, IGameManager
|
public class GameManager : BaseEntity, IGameManager
|
||||||
{
|
{
|
||||||
public event IGameManager.OnGameObjectRegisteredDelegate? OnGameObjectRegistered = null;
|
public Action<IGameManager, IGameObject>? OnGameObjectRegistered { get; set; } = null;
|
||||||
public event IGameManager.OnGameObjectUnRegisteredDelegate? OnGameObjectUnRegistered = null;
|
public Action<IGameManager, IGameObject>? OnGameObjectUnRegistered { get; set; } = null;
|
||||||
|
|
||||||
|
|
||||||
private readonly List<IGameObject> _gameObjects = new(Constants.GAME_OBJECTS_SIZE_INITIAL);
|
private readonly List<IGameObject> _gameObjects = new(Constants.GAME_OBJECTS_SIZE_INITIAL);
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
using Syntriax.Engine.Core.Abstract;
|
using Syntriax.Engine.Core.Abstract;
|
||||||
using Syntriax.Engine.Core.Exceptions;
|
using Syntriax.Engine.Core.Exceptions;
|
||||||
|
|
||||||
|
@ -6,13 +8,13 @@ namespace Syntriax.Engine.Core;
|
||||||
[System.Diagnostics.DebuggerDisplay("Name: {Name}, Initialized: {Initialized}")]
|
[System.Diagnostics.DebuggerDisplay("Name: {Name}, Initialized: {Initialized}")]
|
||||||
public class GameObject : BaseEntity, IGameObject
|
public class GameObject : BaseEntity, IGameObject
|
||||||
{
|
{
|
||||||
public event IAssignableTransform.OnTransformAssignedDelegate? OnTransformAssigned = null;
|
public Action<IAssignableTransform>? OnTransformAssigned { get; set; } = null;
|
||||||
public event IAssignableGameManager.OnGameManagerAssignedDelegate? OnGameManagerAssigned = null;
|
public Action<IAssignableBehaviourController>? OnBehaviourControllerAssigned { get; set; } = null;
|
||||||
public event IAssignableBehaviourController.OnBehaviourControllerAssignedDelegate? OnBehaviourControllerAssigned = null;
|
public Action<IAssignableGameManager>? OnGameManagerAssigned { get; set; } = null;
|
||||||
|
|
||||||
public event INameable.OnNameChangedDelegate? OnNameChanged = null;
|
public Action<IEntity>? OnNameChanged { get; set; } = null;
|
||||||
|
|
||||||
public event IGameObject.OnUpdatedDelegate? OnUpdated = null;
|
public Action<IGameObject>? OnUpdated { get; set; } = null;
|
||||||
|
|
||||||
|
|
||||||
private ITransform _transform = null!;
|
private ITransform _transform = null!;
|
||||||
|
@ -33,9 +35,8 @@ public class GameObject : BaseEntity, IGameObject
|
||||||
{
|
{
|
||||||
if (value == _name) return;
|
if (value == _name) return;
|
||||||
|
|
||||||
string previousName = _name;
|
|
||||||
_name = value;
|
_name = value;
|
||||||
OnNameChanged?.Invoke(this, previousName);
|
OnNameChanged?.Invoke(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,7 +107,6 @@ public class GameObject : BaseEntity, IGameObject
|
||||||
}
|
}
|
||||||
|
|
||||||
public GameObject() { OnBehaviourControllerAssigned += ConnectBehaviourController; }
|
public GameObject() { OnBehaviourControllerAssigned += ConnectBehaviourController; }
|
||||||
|
|
||||||
private void ConnectBehaviourController(IAssignableBehaviourController controller)
|
private void ConnectBehaviourController(IAssignableBehaviourController controller)
|
||||||
{
|
{
|
||||||
controller.BehaviourController.OnBehaviourAdded += OnBehaviourAdded;
|
controller.BehaviourController.OnBehaviourAdded += OnBehaviourAdded;
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
using Syntriax.Engine.Core.Abstract;
|
using Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core;
|
namespace Syntriax.Engine.Core;
|
||||||
|
|
||||||
public class StateEnable : IStateEnable
|
public class StateEnable : IStateEnable
|
||||||
{
|
{
|
||||||
public event IAssignable.OnUnassignedDelegate? OnUnassigned = null;
|
public Action<IAssignable>? OnUnassigned { get; set; } = null;
|
||||||
public event IAssignableEntity.OnEntityAssignedDelegate? OnEntityAssigned = null;
|
public Action<IAssignableEntity>? OnEntityAssigned { get; set; } = null;
|
||||||
public event IStateEnable.OnNameChangedDelegate? OnEnabledChanged = null;
|
public Action<IStateEnable>? OnEnabledChanged { get; set; } = null;
|
||||||
|
|
||||||
private bool _enabled = true;
|
private bool _enabled = true;
|
||||||
private IEntity _entity = null!;
|
private IEntity _entity = null!;
|
||||||
|
@ -21,9 +23,8 @@ public class StateEnable : IStateEnable
|
||||||
if (value == _enabled)
|
if (value == _enabled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bool previousState = _enabled;
|
|
||||||
_enabled = value;
|
_enabled = value;
|
||||||
OnEnabledChanged?.Invoke(this, previousState);
|
OnEnabledChanged?.Invoke(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,41 +1,20 @@
|
||||||
using System.Collections;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
using Syntriax.Engine.Core.Abstract;
|
using Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Core;
|
namespace Syntriax.Engine.Core;
|
||||||
|
|
||||||
[System.Diagnostics.DebuggerDisplay("Name: {GameObject.Name, nq} Position: {Position.ToString(), nq}, Scale: {Scale.ToString(), nq}, Rotation: {Rotation}")]
|
[System.Diagnostics.DebuggerDisplay("Position: {Position.ToString(), nq}, Scale: {Scale.ToString(), nq}, Rotation: {Rotation}")]
|
||||||
public class Transform : ITransform
|
public class Transform : ITransform
|
||||||
{
|
{
|
||||||
public event IAssignableGameObject.OnGameObjectAssignedDelegate? OnGameObjectAssigned = null;
|
public Action<ITransform>? OnPositionChanged { get; set; } = null;
|
||||||
|
public Action<ITransform>? OnScaleChanged { get; set; } = null;
|
||||||
public event IAssignable.OnUnassignedDelegate? OnUnassigned = null;
|
public Action<ITransform>? OnRotationChanged { get; set; } = null;
|
||||||
|
|
||||||
public event ITransform.OnPositionChangedDelegate? OnPositionChanged = null;
|
|
||||||
public event ITransform.OnScaleChangedDelegate? OnScaleChanged = null;
|
|
||||||
public event ITransform.OnRotationChangedDelegate? OnRotationChanged = null;
|
|
||||||
|
|
||||||
public event ITransform.OnParentChangedDelegate? OnParentChanged = null;
|
|
||||||
public event ITransform.OnChildrenAddedDelegate? OnChildrenAdded = null;
|
|
||||||
public event ITransform.OnChildrenRemovedDelegate? OnChildrenRemoved = null;
|
|
||||||
|
|
||||||
|
|
||||||
private Vector2D _position = Vector2D.Zero;
|
private Vector2D _position = Vector2D.Zero;
|
||||||
private Vector2D _scale = Vector2D.One;
|
private Vector2D _scale = Vector2D.One;
|
||||||
private float _rotation = 0f;
|
private float _rotation = 0f;
|
||||||
|
|
||||||
private Vector2D _localPosition = Vector2D.Zero;
|
|
||||||
private Vector2D _localScale = Vector2D.One;
|
|
||||||
private float _localRotation = 0f;
|
|
||||||
|
|
||||||
private readonly List<ITransform> _children = [];
|
|
||||||
|
|
||||||
public IGameObject GameObject { get; private set; } = null!;
|
|
||||||
public ITransform? Parent { get; private set; } = null;
|
|
||||||
|
|
||||||
public IReadOnlyList<ITransform> Children => _children;
|
|
||||||
|
|
||||||
public Vector2D Position
|
public Vector2D Position
|
||||||
{
|
{
|
||||||
get => _position;
|
get => _position;
|
||||||
|
@ -45,7 +24,6 @@ public class Transform : ITransform
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_position = value;
|
_position = value;
|
||||||
UpdateLocalPosition();
|
|
||||||
OnPositionChanged?.Invoke(this);
|
OnPositionChanged?.Invoke(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -59,7 +37,6 @@ public class Transform : ITransform
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_scale = value;
|
_scale = value;
|
||||||
UpdateLocalScale();
|
|
||||||
OnScaleChanged?.Invoke(this);
|
OnScaleChanged?.Invoke(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,210 +50,7 @@ public class Transform : ITransform
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_rotation = value;
|
_rotation = value;
|
||||||
UpdateLocalPosition();
|
|
||||||
OnRotationChanged?.Invoke(this);
|
OnRotationChanged?.Invoke(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Vector2D LocalPosition
|
|
||||||
{
|
|
||||||
get => _localPosition;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (value == _localPosition)
|
|
||||||
return;
|
|
||||||
|
|
||||||
_localPosition = value;
|
|
||||||
UpdatePosition();
|
|
||||||
OnPositionChanged?.Invoke(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vector2D LocalScale
|
|
||||||
{
|
|
||||||
get => _localScale;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (value == _localScale)
|
|
||||||
return;
|
|
||||||
|
|
||||||
_localScale = value;
|
|
||||||
UpdateScale();
|
|
||||||
OnScaleChanged?.Invoke(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public float LocalRotation
|
|
||||||
{
|
|
||||||
get => _localRotation;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (value == _localRotation)
|
|
||||||
return;
|
|
||||||
|
|
||||||
_localRotation = value;
|
|
||||||
UpdateRotation();
|
|
||||||
OnRotationChanged?.Invoke(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetParent(ITransform? transform)
|
|
||||||
{
|
|
||||||
if (transform == this || Parent == transform)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ITransform? previousParent = Parent;
|
|
||||||
if (previousParent is not null)
|
|
||||||
{
|
|
||||||
previousParent.RemoveChild(this);
|
|
||||||
previousParent.OnPositionChanged -= RecalculatePosition;
|
|
||||||
previousParent.OnScaleChanged -= RecalculateScale;
|
|
||||||
previousParent.OnRotationChanged -= RecalculateRotation;
|
|
||||||
previousParent.OnParentChanged -= NotifyChildrenOnParentChange;
|
|
||||||
}
|
|
||||||
|
|
||||||
Parent = transform;
|
|
||||||
|
|
||||||
if (transform is not null)
|
|
||||||
{
|
|
||||||
transform.AddChild(this);
|
|
||||||
transform.OnPositionChanged += RecalculatePosition;
|
|
||||||
transform.OnScaleChanged += RecalculateScale;
|
|
||||||
transform.OnRotationChanged += RecalculateRotation;
|
|
||||||
transform.OnParentChanged += NotifyChildrenOnParentChange;
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateLocalPosition();
|
|
||||||
UpdateLocalScale();
|
|
||||||
UpdateLocalRotation();
|
|
||||||
|
|
||||||
OnParentChanged?.Invoke(this, previousParent);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddChild(ITransform transform)
|
|
||||||
{
|
|
||||||
if (_children.Contains(transform))
|
|
||||||
return;
|
|
||||||
|
|
||||||
_children.Add(transform);
|
|
||||||
transform.SetParent(this);
|
|
||||||
OnChildrenAdded?.Invoke(this, transform);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RemoveChild(ITransform transform)
|
|
||||||
{
|
|
||||||
if (!_children.Remove(transform))
|
|
||||||
return;
|
|
||||||
|
|
||||||
transform.SetParent(null);
|
|
||||||
OnChildrenRemoved?.Invoke(this, transform);
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerator<ITransform> GetEnumerator() => _children.GetEnumerator();
|
|
||||||
IEnumerator IEnumerable.GetEnumerator() => _children.GetEnumerator();
|
|
||||||
|
|
||||||
private void NotifyChildrenOnParentChange(ITransform transform, ITransform? previousParent)
|
|
||||||
{
|
|
||||||
// TODO No idea how logical this is to propagate this to the children the way I'm doing right now.
|
|
||||||
// I was originally gonna just call `child.OnParentChanged?.Invoke(child, child.Parent);` but seems an unnecessary call too?
|
|
||||||
foreach (var child in Children) // TODO CHECK ERRORS
|
|
||||||
child.SetParent(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RecalculatePosition(ITransform _)
|
|
||||||
{
|
|
||||||
if (Parent is null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
UpdatePosition();
|
|
||||||
OnPositionChanged?.Invoke(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RecalculateScale(ITransform _)
|
|
||||||
{
|
|
||||||
if (Parent is null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
UpdateScale();
|
|
||||||
OnScaleChanged?.Invoke(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RecalculateRotation(ITransform _)
|
|
||||||
{
|
|
||||||
if (Parent is null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
UpdatePosition();
|
|
||||||
UpdateRotation();
|
|
||||||
OnPositionChanged?.Invoke(this);
|
|
||||||
OnRotationChanged?.Invoke(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateLocalPosition()
|
|
||||||
{
|
|
||||||
if (Parent is null)
|
|
||||||
_localPosition = Position;
|
|
||||||
else
|
|
||||||
_localPosition = Parent.Position.FromTo(Position).Scale(Parent.Scale);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateLocalScale()
|
|
||||||
{
|
|
||||||
if (Parent is null)
|
|
||||||
_localScale = Scale;
|
|
||||||
else
|
|
||||||
_localScale = Scale.Scale(new(1f / Parent.Scale.X, 1f / Parent.Scale.Y));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateLocalRotation()
|
|
||||||
{
|
|
||||||
if (Parent is null)
|
|
||||||
_localRotation = Rotation;
|
|
||||||
else
|
|
||||||
_localRotation = Rotation - Parent.Rotation;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdatePosition()
|
|
||||||
{
|
|
||||||
if (Parent is null)
|
|
||||||
_position = LocalPosition.Scale(Vector2D.One).Rotate(0f * Math.DegreeToRadian);
|
|
||||||
else
|
|
||||||
_position = Parent.Position + LocalPosition.Scale(new(1f / Parent.Scale.X, 1f / Parent.Scale.Y)).Rotate(Parent.Rotation * Math.DegreeToRadian);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateScale()
|
|
||||||
{
|
|
||||||
if (Parent is null)
|
|
||||||
_scale = LocalScale;
|
|
||||||
else
|
|
||||||
_scale = Vector2D.Scale(Parent.Scale, LocalScale);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateRotation()
|
|
||||||
{
|
|
||||||
if (Parent is null)
|
|
||||||
_rotation = LocalRotation;
|
|
||||||
else
|
|
||||||
_rotation = Parent.Rotation + LocalRotation;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Assign(IGameObject gameObject)
|
|
||||||
{
|
|
||||||
if (GameObject is not null && GameObject.Initialized)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
GameObject = gameObject;
|
|
||||||
OnGameObjectAssigned?.Invoke(this);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Unassign()
|
|
||||||
{
|
|
||||||
if (GameObject is not null && GameObject.Initialized)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
GameObject = null!;
|
|
||||||
OnUnassigned?.Invoke(this);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
using Syntriax.Engine.Core.Abstract;
|
using Syntriax.Engine.Core.Abstract;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Physics2D.Abstract;
|
namespace Syntriax.Engine.Physics2D.Abstract;
|
||||||
|
@ -10,17 +12,17 @@ public interface ICollider2D : IBehaviour, IAssignableTransform
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when a collision is detected.
|
/// Event triggered when a collision is detected.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnCollisionDetectedDelegate? OnCollisionDetected;
|
Action<ICollider2D, CollisionDetectionInformation>? OnCollisionDetected { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when a collision is resolved.
|
/// Event triggered when a collision is resolved.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnCollisionResolvedDelegate? OnCollisionResolved;
|
Action<ICollider2D, CollisionDetectionInformation>? OnCollisionResolved { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event triggered when another <see cref="ICollider2D"/> triggers this <see cref="ICollider2D"/>.
|
/// Event triggered when another <see cref="ICollider2D"/> triggers this <see cref="ICollider2D"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event OnTriggeredDelegate? OnTriggered;
|
Action<ICollider2D, ICollider2D>? OnTriggered { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The <see cref="IRigidBody2D"/> associated with the <see cref="ICollider2D"/>.
|
/// The <see cref="IRigidBody2D"/> associated with the <see cref="ICollider2D"/>.
|
||||||
|
@ -36,12 +38,4 @@ public interface ICollider2D : IBehaviour, IAssignableTransform
|
||||||
/// Recalculates <see cref="ICollider2D"/> properties.
|
/// Recalculates <see cref="ICollider2D"/> properties.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void Recalculate();
|
void Recalculate();
|
||||||
|
|
||||||
void Detect(CollisionDetectionInformation collisionDetectionInformation);
|
|
||||||
void Resolve(CollisionDetectionInformation collisionDetectionInformation);
|
|
||||||
void Trigger(ICollider2D initiator);
|
|
||||||
|
|
||||||
delegate void OnCollisionDetectedDelegate(ICollider2D sender, CollisionDetectionInformation collisionDetectionInformation);
|
|
||||||
delegate void OnCollisionResolvedDelegate(ICollider2D sender, CollisionDetectionInformation collisionDetectionInformation);
|
|
||||||
delegate void OnTriggeredDelegate(ICollider2D sender, ICollider2D initiatorCollider);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
using Syntriax.Engine.Core;
|
using Syntriax.Engine.Core;
|
||||||
using Syntriax.Engine.Core.Abstract;
|
using Syntriax.Engine.Core.Abstract;
|
||||||
using Syntriax.Engine.Physics2D.Abstract;
|
using Syntriax.Engine.Physics2D.Abstract;
|
||||||
|
@ -6,9 +8,9 @@ namespace Syntriax.Engine.Physics2D;
|
||||||
|
|
||||||
public abstract class Collider2DBehaviourBase : BehaviourOverride, ICollider2D
|
public abstract class Collider2DBehaviourBase : BehaviourOverride, ICollider2D
|
||||||
{
|
{
|
||||||
public event ICollider2D.OnCollisionDetectedDelegate? OnCollisionDetected = null;
|
public Action<ICollider2D, CollisionDetectionInformation>? OnCollisionDetected { get; set; } = null;
|
||||||
public event ICollider2D.OnCollisionResolvedDelegate? OnCollisionResolved = null;
|
public Action<ICollider2D, CollisionDetectionInformation>? OnCollisionResolved { get; set; } = null;
|
||||||
public event ICollider2D.OnTriggeredDelegate? OnTriggered = null;
|
public Action<ICollider2D, ICollider2D>? OnTriggered { get; set; } = null;
|
||||||
|
|
||||||
|
|
||||||
protected bool NeedsRecalculation { get; private set; } = true;
|
protected bool NeedsRecalculation { get; private set; } = true;
|
||||||
|
@ -18,7 +20,7 @@ public abstract class Collider2DBehaviourBase : BehaviourOverride, ICollider2D
|
||||||
public bool IsTrigger { get; set; } = false;
|
public bool IsTrigger { get; set; } = false;
|
||||||
|
|
||||||
ITransform IAssignableTransform.Transform => Transform;
|
ITransform IAssignableTransform.Transform => Transform;
|
||||||
public event IAssignableTransform.OnTransformAssignedDelegate? OnTransformAssigned { add => GameObject.OnTransformAssigned += value; remove => GameObject.OnTransformAssigned -= value; }
|
Action<IAssignableTransform>? IAssignableTransform.OnTransformAssigned { get => GameObject.OnTransformAssigned; set => GameObject.OnTransformAssigned = value; }
|
||||||
|
|
||||||
bool IAssignableTransform.Assign(ITransform transform) => GameObject.Assign(transform);
|
bool IAssignableTransform.Assign(ITransform transform) => GameObject.Assign(transform);
|
||||||
|
|
||||||
|
@ -35,7 +37,7 @@ public abstract class Collider2DBehaviourBase : BehaviourOverride, ICollider2D
|
||||||
|
|
||||||
protected override void OnInitialize()
|
protected override void OnInitialize()
|
||||||
{
|
{
|
||||||
BehaviourController.TryGetBehaviourInParent(out _rigidBody2D);
|
BehaviourController.TryGetBehaviour(out _rigidBody2D);
|
||||||
|
|
||||||
BehaviourController.OnBehaviourAdded += OnBehaviourAddedToController;
|
BehaviourController.OnBehaviourAdded += OnBehaviourAddedToController;
|
||||||
BehaviourController.OnBehaviourRemoved += OnBehaviourRemovedFromController;
|
BehaviourController.OnBehaviourRemoved += OnBehaviourRemovedFromController;
|
||||||
|
@ -43,12 +45,6 @@ public abstract class Collider2DBehaviourBase : BehaviourOverride, ICollider2D
|
||||||
Transform.OnPositionChanged += SetNeedsRecalculation;
|
Transform.OnPositionChanged += SetNeedsRecalculation;
|
||||||
Transform.OnRotationChanged += SetNeedsRecalculation;
|
Transform.OnRotationChanged += SetNeedsRecalculation;
|
||||||
Transform.OnScaleChanged += SetNeedsRecalculation;
|
Transform.OnScaleChanged += SetNeedsRecalculation;
|
||||||
Transform.OnParentChanged += UpdateRigidBody2D;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateRigidBody2D(ITransform _1, ITransform? _2)
|
|
||||||
{
|
|
||||||
BehaviourController.TryGetBehaviourInParent(out _rigidBody2D);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnBehaviourAddedToController(IBehaviourController _, IBehaviour behaviour)
|
private void OnBehaviourAddedToController(IBehaviourController _, IBehaviour behaviour)
|
||||||
|
@ -74,8 +70,4 @@ public abstract class Collider2DBehaviourBase : BehaviourOverride, ICollider2D
|
||||||
Transform.OnPositionChanged -= SetNeedsRecalculation;
|
Transform.OnPositionChanged -= SetNeedsRecalculation;
|
||||||
Transform.OnRotationChanged -= SetNeedsRecalculation;
|
Transform.OnRotationChanged -= SetNeedsRecalculation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Detect(CollisionDetectionInformation collisionDetectionInformation) => OnCollisionDetected?.Invoke(this, collisionDetectionInformation);
|
|
||||||
public void Resolve(CollisionDetectionInformation collisionDetectionInformation) => OnCollisionResolved?.Invoke(this, collisionDetectionInformation);
|
|
||||||
public void Trigger(ICollider2D initiator) => OnTriggered?.Invoke(this, initiator);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ public class CollisionResolver2D : ICollisionResolver2D
|
||||||
left.Recalculate();
|
left.Recalculate();
|
||||||
right.Recalculate();
|
right.Recalculate();
|
||||||
|
|
||||||
left.Resolve(collisionInformation);
|
left.OnCollisionResolved?.Invoke(collisionInformation.Left, collisionInformation);
|
||||||
right.Resolve(collisionInformation);
|
right.OnCollisionResolved?.Invoke(right, collisionInformation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,33 +1,13 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
using Syntriax.Engine.Core;
|
using Syntriax.Engine.Core;
|
||||||
|
using Syntriax.Engine.Physics2D;
|
||||||
using Syntriax.Engine.Physics2D.Primitives;
|
using Syntriax.Engine.Physics2D.Primitives;
|
||||||
|
|
||||||
namespace Engine.Physics2D;
|
namespace Engine.Physics2D;
|
||||||
|
|
||||||
public static partial class Physics2D
|
public static partial class Physics2D
|
||||||
{
|
{
|
||||||
public static bool Overlaps(this Shape shape, Vector2D point) => Overlaps(shape, point, out var _);
|
|
||||||
public static bool Overlaps(this Shape shape, Vector2D point, out float depth)
|
|
||||||
{
|
|
||||||
depth = float.MaxValue;
|
|
||||||
var vertices = shape.Vertices;
|
|
||||||
int count = vertices.Count;
|
|
||||||
|
|
||||||
for (int indexProjection = 0; indexProjection < count; indexProjection++)
|
|
||||||
{
|
|
||||||
Vector2D projectionVector = vertices[indexProjection].FromTo(vertices[(indexProjection + 1) % count]).Perpendicular().Normalized;
|
|
||||||
|
|
||||||
Projection shapeProjection = shape.ToProjection(projectionVector);
|
|
||||||
float projectedPoint = point.Dot(projectionVector);
|
|
||||||
|
|
||||||
if (shapeProjection.Max < projectedPoint || shapeProjection.Min > projectedPoint)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
depth = Math.Min(depth, Math.Abs(Math.AbsMin(shapeProjection.Max - projectedPoint, shapeProjection.Min - projectedPoint)));
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static bool Overlaps(this Circle left, Circle right)
|
public static bool Overlaps(this Circle left, Circle right)
|
||||||
{
|
{
|
||||||
float distanceSquared = left.Center.FromTo(right.Center).LengthSquared();
|
float distanceSquared = left.Center.FromTo(right.Center).LengthSquared();
|
||||||
|
@ -47,7 +27,7 @@ public static partial class Physics2D
|
||||||
normal = distanceVector.Normalized;
|
normal = distanceVector.Normalized;
|
||||||
|
|
||||||
if (isOverlapping)
|
if (isOverlapping)
|
||||||
depth = Math.Sqrt(radiusSumSquared - distanceSquared);
|
depth = MathF.Sqrt(radiusSumSquared - distanceSquared);
|
||||||
|
|
||||||
return isOverlapping;
|
return isOverlapping;
|
||||||
}
|
}
|
||||||
|
@ -64,7 +44,7 @@ public static partial class Physics2D
|
||||||
normal = distanceVector.Normalized;
|
normal = distanceVector.Normalized;
|
||||||
|
|
||||||
if (isOverlapping)
|
if (isOverlapping)
|
||||||
depth = Math.Sqrt(radiusSquared - distanceSquared);
|
depth = MathF.Sqrt(radiusSquared - distanceSquared);
|
||||||
|
|
||||||
return isOverlapping;
|
return isOverlapping;
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,17 +80,17 @@ public class PhysicsEngine2D : IPhysicsEngine2D
|
||||||
{
|
{
|
||||||
if (colliderX.IsTrigger)
|
if (colliderX.IsTrigger)
|
||||||
{
|
{
|
||||||
colliderX.Trigger(colliderY);
|
colliderX.OnTriggered?.Invoke(colliderX, colliderY);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (colliderY.IsTrigger)
|
else if (colliderY.IsTrigger)
|
||||||
{
|
{
|
||||||
colliderY.Trigger(colliderY);
|
colliderY.OnTriggered?.Invoke(colliderY, colliderY);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
colliderX.Detect(information);
|
colliderX.OnCollisionDetected?.Invoke(colliderX, information);
|
||||||
colliderY.Detect(information);
|
colliderY.OnCollisionDetected?.Invoke(colliderY, information);
|
||||||
|
|
||||||
collisionResolver?.Resolve(information);
|
collisionResolver?.Resolve(information);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,15 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
using Syntriax.Engine.Core;
|
using Syntriax.Engine.Core;
|
||||||
using Syntriax.Engine.Core.Abstract;
|
using Syntriax.Engine.Core.Abstract;
|
||||||
using Syntriax.Engine.Physics2D.Abstract;
|
using Syntriax.Engine.Physics2D.Abstract;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Physics2D;
|
namespace Syntriax.Engine.Physics2D;
|
||||||
|
|
||||||
public class PhysicsEngine2DCollector : IPhysicsEngine2D, IAssignableGameManager
|
public class PhysicsEngine2DCacher : IPhysicsEngine2D, IAssignableGameManager
|
||||||
{
|
{
|
||||||
public event IAssignable.OnUnassignedDelegate? OnUnassigned = null;
|
public Action<IAssignable>? OnUnassigned { get; set; } = null;
|
||||||
public event IAssignableGameManager.OnGameManagerAssignedDelegate? OnGameManagerAssigned = null;
|
public Action<IAssignableGameManager>? OnGameManagerAssigned { get; set; } = null;
|
||||||
|
|
||||||
|
|
||||||
private int _iterationPerStep = 1;
|
private int _iterationPerStep = 1;
|
||||||
|
@ -15,8 +17,8 @@ public class PhysicsEngine2DCollector : IPhysicsEngine2D, IAssignableGameManager
|
||||||
protected readonly ICollisionDetector2D collisionDetector = null!;
|
protected readonly ICollisionDetector2D collisionDetector = null!;
|
||||||
protected readonly ICollisionResolver2D collisionResolver = null!;
|
protected readonly ICollisionResolver2D collisionResolver = null!;
|
||||||
|
|
||||||
protected BehaviourCollector<IRigidBody2D> rigidBodyCollector = new();
|
protected BehaviourCacher<IRigidBody2D> rigidBodyCacher = new();
|
||||||
protected BehaviourCollector<ICollider2D> colliderCollector = new();
|
protected BehaviourCacher<ICollider2D> colliderCacher = new();
|
||||||
|
|
||||||
|
|
||||||
public int IterationPerStep { get => _iterationPerStep; set => _iterationPerStep = value < 1 ? 1 : value; }
|
public int IterationPerStep { get => _iterationPerStep; set => _iterationPerStep = value < 1 ? 1 : value; }
|
||||||
|
@ -29,23 +31,23 @@ public class PhysicsEngine2DCollector : IPhysicsEngine2D, IAssignableGameManager
|
||||||
for (int iterationIndex = 0; iterationIndex < IterationPerStep; iterationIndex++)
|
for (int iterationIndex = 0; iterationIndex < IterationPerStep; iterationIndex++)
|
||||||
{
|
{
|
||||||
// Can Parallel
|
// Can Parallel
|
||||||
foreach (var rigidBody in rigidBodyCollector)
|
foreach (var rigidBody in rigidBodyCacher)
|
||||||
StepRigidBody(rigidBody, intervalDeltaTime);
|
StepRigidBody(rigidBody, intervalDeltaTime);
|
||||||
|
|
||||||
// Can Parallel
|
// Can Parallel
|
||||||
foreach (var collider in colliderCollector)
|
foreach (var collider in colliderCacher)
|
||||||
collider.Recalculate();
|
collider.Recalculate();
|
||||||
|
|
||||||
// Can Parallel
|
// Can Parallel
|
||||||
for (int x = 0; x < colliderCollector.Behaviours.Count; x++)
|
for (int x = 0; x < colliderCacher.Behaviours.Count; x++)
|
||||||
{
|
{
|
||||||
ICollider2D? colliderX = colliderCollector.Behaviours[x];
|
ICollider2D? colliderX = colliderCacher.Behaviours[x];
|
||||||
if (!colliderX.IsActive)
|
if (!colliderX.IsActive)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (int y = x + 1; y < colliderCollector.Behaviours.Count; y++)
|
for (int y = x + 1; y < colliderCacher.Behaviours.Count; y++)
|
||||||
{
|
{
|
||||||
ICollider2D? colliderY = colliderCollector.Behaviours[y];
|
ICollider2D? colliderY = colliderCacher.Behaviours[y];
|
||||||
|
|
||||||
if (!colliderY.IsActive)
|
if (!colliderY.IsActive)
|
||||||
return;
|
return;
|
||||||
|
@ -65,17 +67,17 @@ public class PhysicsEngine2DCollector : IPhysicsEngine2D, IAssignableGameManager
|
||||||
{
|
{
|
||||||
if (colliderX.IsTrigger)
|
if (colliderX.IsTrigger)
|
||||||
{
|
{
|
||||||
colliderX.Trigger(colliderY);
|
colliderX.OnTriggered?.Invoke(colliderX, colliderY);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (colliderY.IsTrigger)
|
else if (colliderY.IsTrigger)
|
||||||
{
|
{
|
||||||
colliderY.Trigger(colliderY);
|
colliderY.OnTriggered?.Invoke(colliderY, colliderY);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
colliderX.Detect(information);
|
colliderX.OnCollisionDetected?.Invoke(colliderX, information);
|
||||||
colliderY.Detect(information);
|
colliderY.OnCollisionDetected?.Invoke(colliderY, information);
|
||||||
|
|
||||||
collisionResolver?.Resolve(information);
|
collisionResolver?.Resolve(information);
|
||||||
}
|
}
|
||||||
|
@ -98,8 +100,8 @@ public class PhysicsEngine2DCollector : IPhysicsEngine2D, IAssignableGameManager
|
||||||
if (GameManager is not null)
|
if (GameManager is not null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
colliderCollector.Assign(gameManager);
|
colliderCacher.Assign(gameManager);
|
||||||
rigidBodyCollector.Assign(gameManager);
|
rigidBodyCacher.Assign(gameManager);
|
||||||
|
|
||||||
GameManager = gameManager;
|
GameManager = gameManager;
|
||||||
OnGameManagerAssigned?.Invoke(this);
|
OnGameManagerAssigned?.Invoke(this);
|
||||||
|
@ -112,35 +114,35 @@ public class PhysicsEngine2DCollector : IPhysicsEngine2D, IAssignableGameManager
|
||||||
if (GameManager is null)
|
if (GameManager is null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
colliderCollector.Unassign();
|
colliderCacher.Unassign();
|
||||||
rigidBodyCollector.Unassign();
|
rigidBodyCacher.Unassign();
|
||||||
|
|
||||||
GameManager = null!;
|
GameManager = null!;
|
||||||
OnUnassigned?.Invoke(this);
|
OnUnassigned?.Invoke(this);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PhysicsEngine2DCollector()
|
public PhysicsEngine2DCacher()
|
||||||
{
|
{
|
||||||
collisionDetector = new CollisionDetector2D();
|
collisionDetector = new CollisionDetector2D();
|
||||||
collisionResolver = new CollisionResolver2D();
|
collisionResolver = new CollisionResolver2D();
|
||||||
}
|
}
|
||||||
|
|
||||||
public PhysicsEngine2DCollector(IGameManager gameManager)
|
public PhysicsEngine2DCacher(IGameManager gameManager)
|
||||||
{
|
{
|
||||||
Assign(gameManager);
|
Assign(gameManager);
|
||||||
collisionDetector = new CollisionDetector2D();
|
collisionDetector = new CollisionDetector2D();
|
||||||
collisionResolver = new CollisionResolver2D();
|
collisionResolver = new CollisionResolver2D();
|
||||||
}
|
}
|
||||||
|
|
||||||
public PhysicsEngine2DCollector(IGameManager gameManager, ICollisionDetector2D collisionDetector, ICollisionResolver2D collisionResolver)
|
public PhysicsEngine2DCacher(IGameManager gameManager, ICollisionDetector2D collisionDetector, ICollisionResolver2D collisionResolver)
|
||||||
{
|
{
|
||||||
Assign(gameManager);
|
Assign(gameManager);
|
||||||
this.collisionDetector = collisionDetector;
|
this.collisionDetector = collisionDetector;
|
||||||
this.collisionResolver = collisionResolver;
|
this.collisionResolver = collisionResolver;
|
||||||
}
|
}
|
||||||
|
|
||||||
public PhysicsEngine2DCollector(ICollisionDetector2D collisionDetector, ICollisionResolver2D collisionResolver)
|
public PhysicsEngine2DCacher(ICollisionDetector2D collisionDetector, ICollisionResolver2D collisionResolver)
|
||||||
{
|
{
|
||||||
this.collisionDetector = collisionDetector;
|
this.collisionDetector = collisionDetector;
|
||||||
this.collisionResolver = collisionResolver;
|
this.collisionResolver = collisionResolver;
|
|
@ -1,3 +1,5 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
using Syntriax.Engine.Core;
|
using Syntriax.Engine.Core;
|
||||||
using Syntriax.Engine.Core.Abstract;
|
using Syntriax.Engine.Core.Abstract;
|
||||||
using Syntriax.Engine.Physics2D.Abstract;
|
using Syntriax.Engine.Physics2D.Abstract;
|
||||||
|
@ -6,7 +8,7 @@ namespace Syntriax.Engine.Physics2D;
|
||||||
|
|
||||||
public class RigidBody2D : BehaviourOverride, IRigidBody2D
|
public class RigidBody2D : BehaviourOverride, IRigidBody2D
|
||||||
{
|
{
|
||||||
event IAssignableTransform.OnTransformAssignedDelegate? IAssignableTransform.OnTransformAssigned { add => GameObject.OnTransformAssigned += value; remove => GameObject.OnTransformAssigned -= value; }
|
public Action<IAssignableTransform>? OnTransformAssigned { get => GameObject.OnTransformAssigned; set => GameObject.OnTransformAssigned = value; }
|
||||||
|
|
||||||
private const float LOWEST_ALLOWED_MASS = 0.00001f;
|
private const float LOWEST_ALLOWED_MASS = 0.00001f;
|
||||||
private float _mass = 1f;
|
private float _mass = 1f;
|
||||||
|
|
Loading…
Reference in New Issue