using System.Collections.Generic;
namespace Syntriax.Engine.Core;
///
/// Represents a universe responsible for managing s.
///
public interface IUniverse : IEntity, IEnumerable
{
///
/// Event triggered when is about to be called called on the .
///
Event OnPreUpdate { get; }
///
/// Event triggered when is called on the .
///
Event OnUpdate { get; }
///
/// Event triggered after is called on the .
///
Event OnPostUpdate { get; }
///
/// Event triggered when is about to be called called on the .
///
Event OnPreDraw { get; }
///
/// Event triggered when is called on the .
///
Event OnDraw { get; }
///
/// Event triggered after is called on the .
///
Event OnPostDraw { get; }
///
/// Event triggered when a is registered to the .
///
Event OnUniverseObjectRegistered { get; }
///
/// Event triggered when a is unregistered from the .
///
Event OnUniverseObjectUnRegistered { get; }
///
/// Event triggered when is changed on the .
///
Event OnTimeScaleChanged { get; }
///
/// Current time scale the operates on.
///
float TimeScale { get; set; }
///
/// Contains time data related to this .
///
UniverseTime Time { get; }
///
/// Contains unscaled time data related to this .
///
UniverseTime UnscaledTime { get; }
///
/// Gets a read-only list of s managed by the .
///
IReadOnlyList UniverseObjects { get; }
///
/// Registers an to the .
///
/// The to register.
void Register(IUniverseObject universeObject);
///
/// Instantiates a of type T with the given arguments and registers it to the .
///
/// The type of to instantiate.
/// Constructor parameters for the given type of .
/// The instantiated .
T InstantiateUniverseObject(params object?[]? args) where T : class, IUniverseObject;
///
/// Removes an from the .
///
/// The to remove.
void Remove(IUniverseObject universeObject);
///
/// Updates the with the given delta time.
///
/// Delta time.
void Update(UniverseTime universeTime);
///
/// Performs operations that should be done to the draw.
///
void Draw();
readonly record struct TimeScaleChangedArguments(float PreviousTimeScale);
readonly record struct UpdateArguments(UniverseTime EngineTime);
readonly record struct UniverseObjectRegisteredArguments(IUniverseObject UniverseObjectRegistered);
readonly record struct UniverseObjectUnRegisteredArguments(IUniverseObject UniverseObjectUnregistered);
}