using System.Numerics; using DaggerFramework.Audio; using DaggerFramework.Rendering; using DaggerFramework.Resources; namespace DaggerFramework.SceneGraph { public class Scene : IMainLoop { public Renderer Renderer { get => _renderer; set => _renderer = value; } public InputHandler? Input { get => _input; set => _input = value; } public AudioBackend? Audio => _audioBackend; public ResourceManager ResourceManager => _resourceManager; public double DeltaTime => _renderer.FrameTime; public bool ShouldRun => Renderer.ShouldRun; public Scene(Renderer renderer, InputHandler input, AudioBackend audioBackend, ResourceManager resourceManager) { _renderer = renderer; _input = input; _audioBackend = audioBackend; _resourceManager = resourceManager; _layers = new Dictionary(); } public Scene(Renderer renderer, ResourceManager resourceManager) { _renderer = renderer; _resourceManager = resourceManager; } public void Init() => SetupRenderer(); public void Start() { foreach (var layer in _layers.Values) { if (_input is not null) { layer.Input = _input; } layer.Start(); } } public void Update() { foreach (var layer in _layers) { layer.Value.Update(DeltaTime); } Audio?.Update(); } public void AddLayer(string name, Layer layer) { layer.Scene = this; _layers.Add(name, layer); } public void BeginDraw() { Renderer.BeginFrame(); Renderer.ClearBackground(Color.Black); foreach (var layer in _layers.Values) { layer.BeginDraw(_renderer); layer.Draw(_renderer); } } public void EndDraw() { foreach (var layer in _layers.Values) { layer.EndDraw(_renderer); } Renderer.EndFrame(); } private void SetupRenderer() { Renderer.Initialize(new RendererSettings { Msaa = Msaa.Msaa4x, UseVSync = true }); } private Dictionary _layers = new(); private Renderer _renderer; private AudioBackend? _audioBackend; private InputHandler? _input; private ResourceManager _resourceManager; } }