121 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System.Collections.Generic;
 | 
						|
 | 
						|
namespace Engine.Core;
 | 
						|
 | 
						|
/// <summary>
 | 
						|
/// Represents a universe responsible for managing <see cref="IUniverseObject"/>s.
 | 
						|
/// </summary>
 | 
						|
public interface IUniverse : IEntity, IEnumerable<IUniverseObject>
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// Event triggered when <see cref="Update(UniverseTime)"/> is about to be called called on the <see cref="IUniverse"/>.
 | 
						|
    /// </summary>
 | 
						|
    Event<IUniverse, UpdateArguments> OnPreUpdate { get; }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Event triggered when <see cref="Update(UniverseTime)"/> is called on the <see cref="IUniverse"/>.
 | 
						|
    /// </summary>
 | 
						|
    Event<IUniverse, UpdateArguments> OnUpdate { get; }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Event triggered after <see cref="Update(UniverseTime)"/> is called on the <see cref="IUniverse"/>.
 | 
						|
    /// </summary>
 | 
						|
    Event<IUniverse, UpdateArguments> OnPostUpdate { get; }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Event triggered when <see cref="Draw"/> is about to be called called on the <see cref="IUniverse"/>.
 | 
						|
    /// </summary>
 | 
						|
    Event<IUniverse> OnPreDraw { get; }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Event triggered when <see cref="Draw"/> is called on the <see cref="IUniverse"/>.
 | 
						|
    /// </summary>
 | 
						|
    Event<IUniverse> OnDraw { get; }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Event triggered after <see cref="Draw"/> is called on the <see cref="IUniverse"/>.
 | 
						|
    /// </summary>
 | 
						|
    Event<IUniverse> OnPostDraw { get; }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Event triggered when a <see cref="IUniverseObject"/> is about to be registered to the <see cref="IUniverse"/>.
 | 
						|
    /// </summary>
 | 
						|
    Event<IUniverse, UniverseObjectRegisteredArguments> OnPreUniverseObjectRegistered { get; }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Event triggered when a <see cref="IUniverseObject"/> is registered to the <see cref="IUniverse"/>.
 | 
						|
    /// </summary>
 | 
						|
    Event<IUniverse, UniverseObjectRegisteredArguments> OnUniverseObjectRegistered { get; }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Event triggered when a <see cref="IUniverseObject"/> is about to be unregistered from the <see cref="IUniverse"/>.
 | 
						|
    /// </summary>
 | 
						|
    Event<IUniverse, UniverseObjectUnRegisteredArguments> OnPreUniverseObjectUnRegistered { get; }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Event triggered when a <see cref="IUniverseObject"/> is unregistered from the <see cref="IUniverse"/>.
 | 
						|
    /// </summary>
 | 
						|
    Event<IUniverse, UniverseObjectUnRegisteredArguments> OnUniverseObjectUnRegistered { get; }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Event triggered when <see cref="TimeScale"/> is changed on the <see cref="IUniverse"/>.
 | 
						|
    /// </summary>
 | 
						|
    Event<IUniverse, TimeScaleChangedArguments> OnTimeScaleChanged { get; }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Current time scale the <see cref="IUniverse"/> operates on.
 | 
						|
    /// </summary>
 | 
						|
    float TimeScale { get; set; }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Contains time data related to this <see cref="IUniverse"/>.
 | 
						|
    /// </summary>
 | 
						|
    UniverseTime Time { get; }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Contains unscaled time data related to this <see cref="IUniverse"/>.
 | 
						|
    /// </summary>
 | 
						|
    UniverseTime UnscaledTime { get; }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Gets the root <see cref="IUniverseObject"/> of the <see cref="IUniverse"/>.
 | 
						|
    /// </summary>
 | 
						|
    IUniverseObject Root { get; }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Registers an <see cref="IUniverseObject"/> to the <see cref="IUniverse"/>.
 | 
						|
    /// </summary>
 | 
						|
    /// <param name="universeObject">The <see cref="IUniverseObject"/> to register.</param>
 | 
						|
    void Register(IUniverseObject universeObject);
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Instantiates a <see cref="IUniverseObject"/> of type T with the given arguments and registers it to the <see cref="IUniverse"/>.
 | 
						|
    /// </summary>
 | 
						|
    /// <typeparam name="T">The type of <see cref="IUniverseObject"/> to instantiate.</typeparam>
 | 
						|
    /// <param name="args">Constructor parameters for the given type of <see cref="IUniverseObject"/>.</param>
 | 
						|
    /// <returns>The instantiated <see cref="IUniverseObject"/>.</returns>
 | 
						|
    T InstantiateUniverseObject<T>(params object?[]? args) where T : class, IUniverseObject;
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Removes an <see cref="IUniverseObject"/> from the <see cref="IUniverse"/>.
 | 
						|
    /// </summary>
 | 
						|
    /// <param name="universeObject">The <see cref="IUniverseObject"/> to remove.</param>
 | 
						|
    void Remove(IUniverseObject universeObject);
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Updates the <see cref="IUniverse"/> with the given delta time.
 | 
						|
    /// </summary>
 | 
						|
    /// <param name="universeTime">Delta time.</param>
 | 
						|
    void Update(UniverseTime universeTime);
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Performs operations that should be done to the draw.
 | 
						|
    /// </summary>
 | 
						|
    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);
 | 
						|
}
 |