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); }