diff --git a/TestGame/Circle2d.cs b/TestGame/Circle2d.cs index 067b8ab..9a06e7d 100644 --- a/TestGame/Circle2d.cs +++ b/TestGame/Circle2d.cs @@ -5,7 +5,7 @@ namespace Voile; public class Circle2d : Drawable2d { - public override void OnDraw(Renderer renderer) + public override void OnDraw(RenderSystem renderer) { renderer.DrawCircle(32f, Color.AliceBlue); } diff --git a/TestGame/TestGame.cs b/TestGame/TestGame.cs index 3f613b8..a21eeca 100644 --- a/TestGame/TestGame.cs +++ b/TestGame/TestGame.cs @@ -12,8 +12,8 @@ public class TestGame : Game { InitializeDefault(); - _audioBackend = new FmodAudioBackend(); - _audioBackend.Initialize(); + _audioSystem = new FmodAudioSystem(); + _audioSystem.Start(); } protected override void LoadResources() @@ -39,7 +39,7 @@ public class TestGame : Game _scene = new Scene(new SceneSettings() { Renderer = Renderer, - AudioBackend = _audioBackend!, + AudioBackend = _audioSystem!, InputHandler = Input, ResourceManager = ResourceManager }); @@ -47,7 +47,7 @@ public class TestGame : Game _uiLayer = new UiLayer(); _worldLayer = new EntityLayer(); - _testSoundInstance = _audioBackend!.CreateInstance(_testSound!); + _testSoundInstance = _audioSystem!.CreateInstance(_testSound!); Input.AddInputMapping("play", new InputAction[] { new KeyInputAction(KeyboardKey.Spacebar) }); Input.AddInputMapping("sprint", new InputAction[] { new KeyInputAction(KeyboardKey.LeftShift) }); @@ -82,13 +82,13 @@ public class TestGame : Game public override void Shutdown() { ShutdownDefault(); - _audioBackend!.Dispose(); + _audioSystem!.Dispose(); } private Sound? _testSound; private SoundInstance? _testSoundInstance; private Font? _font; - private FmodAudioBackend? _audioBackend; + private FmodAudioSystem? _audioSystem; private Scene? _scene; private UiLayer? _uiLayer; diff --git a/TestGame/UiLayer.cs b/TestGame/UiLayer.cs index 6f1c4aa..6a6d69e 100644 --- a/TestGame/UiLayer.cs +++ b/TestGame/UiLayer.cs @@ -22,17 +22,17 @@ public class UiLayer : Layer _screenContainer.UpdateRect(Vector2.Zero, Scene.Renderer.WindowSize); } - protected override void OnBeginDraw(Renderer renderer) + protected override void OnBeginDraw(RenderSystem renderer) { } - protected override void OnDraw(Renderer renderer) + protected override void OnDraw(RenderSystem renderer) { _screenContainer.Render(renderer); } - protected override void OnEndDraw(Renderer renderer) + protected override void OnEndDraw(RenderSystem renderer) { } diff --git a/TestGame/World.cs b/TestGame/World.cs index a682345..1074be4 100644 --- a/TestGame/World.cs +++ b/TestGame/World.cs @@ -15,7 +15,7 @@ public class World : Drawable2d _randomPositions[i] = MathUtils.RandomVector2(Position, Vector2.One * 2048f); } } - public override void OnDraw(Renderer renderer) + public override void OnDraw(RenderSystem renderer) { for (int i = 0; i < _rectangleAmount; i++) { diff --git a/Voile/Source/Audio/DummyAudioBackend.cs b/Voile/Source/Audio/DummyAudioSystem.cs similarity index 79% rename from Voile/Source/Audio/DummyAudioBackend.cs rename to Voile/Source/Audio/DummyAudioSystem.cs index 6c8b918..f7b1d21 100644 --- a/Voile/Source/Audio/DummyAudioBackend.cs +++ b/Voile/Source/Audio/DummyAudioSystem.cs @@ -1,6 +1,9 @@ namespace Voile.Audio { - public class DummyAudioBackend : AudioBackend + /// + /// Dummy audio system. + /// + public class DummyAudioSystem : AudioSystem { public override void AddBusEffect(T effect, string bus = "Master") { @@ -17,7 +20,7 @@ namespace Voile.Audio return 0.0f; } - public override void Initialize() + protected override void Initialize() { return; } @@ -32,7 +35,7 @@ namespace Voile.Audio return; } - public override void Update() + protected override void Update() { return; } diff --git a/Voile/Source/Audio/FmodAudioBackend.cs b/Voile/Source/Audio/FmodAudioSystem.cs similarity index 95% rename from Voile/Source/Audio/FmodAudioBackend.cs rename to Voile/Source/Audio/FmodAudioSystem.cs index 2e8cd0a..2694d94 100644 --- a/Voile/Source/Audio/FmodAudioBackend.cs +++ b/Voile/Source/Audio/FmodAudioSystem.cs @@ -4,9 +4,9 @@ using Voile.Utils; namespace Voile.Audio { - public class FmodAudioBackend : AudioBackend + public class FmodAudioSystem : AudioSystem { - public override void Initialize() + protected override void Initialize() { CreateSystem(); _loadedSounds = new Dictionary(); @@ -14,7 +14,7 @@ namespace Voile.Audio CreateBus("Master"); } - public override void Update() => _system.update(); + protected override void Update() => _system.update(); public override void PlaySound(Sound sound, float pitch, float volume, string bus = "Master") { @@ -134,7 +134,7 @@ namespace Voile.Audio return _channelGroups[busName]; } - private Logger _logger = new(nameof(FmodAudioBackend)); + private Logger _logger = new(nameof(FmodAudioSystem)); private FMOD.System _system; // TODO: use a different key for the dictionary, paths are not good :( (waste of memory lol) diff --git a/Voile/Source/Audio/SoundInstance.cs b/Voile/Source/Audio/SoundInstance.cs index 006e377..3fa1c6a 100644 --- a/Voile/Source/Audio/SoundInstance.cs +++ b/Voile/Source/Audio/SoundInstance.cs @@ -3,7 +3,7 @@ namespace Voile.Audio public class SoundInstance { protected virtual Sound Sound => _sound; - public SoundInstance(AudioBackend backend, Sound sound) + public SoundInstance(AudioSystem backend, Sound sound) { _backend = backend; _sound = sound; @@ -34,7 +34,7 @@ namespace Voile.Audio _backend.PlaySound(Sound, _pitch, _volume, _bus); } - private readonly AudioBackend _backend; + private readonly AudioSystem _backend; private readonly Sound _sound; private string _bus = "Master"; private float _pitch, _volume = 1.0f; diff --git a/Voile/Source/Game.cs b/Voile/Source/Game.cs index 432d361..931084a 100644 --- a/Voile/Source/Game.cs +++ b/Voile/Source/Game.cs @@ -10,14 +10,14 @@ namespace Voile /// protected ResourceManager ResourceManager { get; private set; } /// - /// The InputHandler associated with this game. Uses by default. + /// The InputHandler associated with this game. Uses by default. /// - protected InputHandler Input { get; private set; } + protected InputSystem Input { get; private set; } /// - /// The Renderer associated with this game. Uses by default. + /// The Renderer associated with this game. Uses by default. /// - protected Renderer Renderer { get; private set; } + protected RenderSystem Renderer { get; private set; } /// /// Resource root path for this game. @@ -37,8 +37,8 @@ namespace Voile public Game() { ResourceManager = new ResourceManager(); - Input = new RaylibInputHandler(); - Renderer = new RaylibRenderer(); + Input = new RaylibInputSystem(); + Renderer = new RaylibRenderSystem(); } /// @@ -61,8 +61,10 @@ namespace Voile { ResourceManager.ResourceRoot = ResourceRoot; - Input = new RaylibInputHandler(); - Renderer = new RaylibRenderer(); + Input = new RaylibInputSystem(); + Renderer = new RaylibRenderSystem(); + + Input.Start(); InitializeRenderer(); } @@ -103,7 +105,7 @@ namespace Voile if (!string.IsNullOrWhiteSpace(Name)) windowSettings.Title = Name; - Renderer.CreateAndInitialize(windowSettings, RendererSettings.Default); + Renderer.Start(RendererSettings.Default); } } } \ No newline at end of file diff --git a/Voile/Source/InputAction.cs b/Voile/Source/Input/InputAction.cs similarity index 60% rename from Voile/Source/InputAction.cs rename to Voile/Source/Input/InputAction.cs index 375c42f..e8c5b88 100644 --- a/Voile/Source/InputAction.cs +++ b/Voile/Source/Input/InputAction.cs @@ -2,9 +2,9 @@ namespace Voile { public abstract class InputAction { - public abstract bool IsDown(InputHandler inputHandler); - public abstract bool IsPressed(InputHandler inputHandler); - public abstract bool IsReleased(InputHandler inputHandler); + public abstract bool IsDown(InputSystem inputHandler); + public abstract bool IsPressed(InputSystem inputHandler); + public abstract bool IsReleased(InputSystem inputHandler); } public class KeyInputAction : InputAction @@ -15,17 +15,17 @@ namespace Voile { _keyboardKey = keyboardKey; } - public override bool IsDown(InputHandler inputHandler) + public override bool IsDown(InputSystem inputHandler) { return inputHandler.IsKeyboardKeyDown(_keyboardKey); } - public override bool IsPressed(InputHandler inputHandler) + public override bool IsPressed(InputSystem inputHandler) { return inputHandler.KeyboardKeyJustPressed(_keyboardKey); } - public override bool IsReleased(InputHandler inputHandler) + public override bool IsReleased(InputSystem inputHandler) { return inputHandler.KeyboardKeyJustReleased(_keyboardKey); } diff --git a/Voile/Source/RaylibInputHandler.cs b/Voile/Source/Input/RaylibInputSystem.cs similarity index 95% rename from Voile/Source/RaylibInputHandler.cs rename to Voile/Source/Input/RaylibInputSystem.cs index beabd0a..3d7b344 100644 --- a/Voile/Source/RaylibInputHandler.cs +++ b/Voile/Source/Input/RaylibInputSystem.cs @@ -3,7 +3,10 @@ using Raylib_cs; namespace Voile { - public class RaylibInputHandler : InputHandler + /// + /// An input system implemented using Raylib's API. Used by default together with . + /// + public class RaylibInputSystem : InputSystem { public override int GetCharPressed() { diff --git a/Voile/Source/Rendering/RaylibRenderer.cs b/Voile/Source/Rendering/RaylibRenderSystem.cs similarity index 96% rename from Voile/Source/Rendering/RaylibRenderer.cs rename to Voile/Source/Rendering/RaylibRenderSystem.cs index 0eda918..2b3e747 100644 --- a/Voile/Source/Rendering/RaylibRenderer.cs +++ b/Voile/Source/Rendering/RaylibRenderSystem.cs @@ -1,11 +1,10 @@ using System.Numerics; -using System.Runtime.InteropServices; using System.Text; using Raylib_cs; namespace Voile.Rendering { - public class RaylibRenderer : Renderer + public class RaylibRenderSystem : RenderSystem { public override bool ShouldRun => !WindowShouldClose(); public override Vector2 WindowSize @@ -33,6 +32,31 @@ namespace Voile.Rendering public override bool VSync { get => _vsync; set => SetWindowVSync(value); } public override bool Fullscreen { get => _fullscreen; set => SetFullscreen(value); } + public override void Initialize(RendererSettings settings) + { + _targetFps = settings.TargetFps; + + ConfigFlags flags = 0; + + // MSAA + flags |= settings.Msaa == Msaa.Msaa4x ? ConfigFlags.FLAG_MSAA_4X_HINT : 0; + + // VSync + flags |= settings.UseVSync ? ConfigFlags.FLAG_VSYNC_HINT : 0; + + _fullscreen = settings.Fullscreen; + + _defaultFlags = flags; + + Raylib.SetConfigFlags(flags); + } + + public override void CreateAndInitializeWithWindow(RendererSettings settings) + { + Initialize(settings); + CreateWindow(settings.WindowSettings); + } + public override void CreateWindow(WindowSettings windowSettings) { Raylib.SetTraceLogLevel(TraceLogLevel.LOG_NONE); @@ -154,25 +178,6 @@ namespace Voile.Rendering throw new NotImplementedException(); } - public override void Initialize(RendererSettings settings) - { - _targetFps = settings.TargetFps; - - ConfigFlags flags = 0; - - // MSAA - flags |= settings.Msaa == Msaa.Msaa4x ? ConfigFlags.FLAG_MSAA_4X_HINT : 0; - - // VSync - flags |= settings.UseVSync ? ConfigFlags.FLAG_VSYNC_HINT : 0; - - _fullscreen = settings.Fullscreen; - - _defaultFlags = flags; - - Raylib.SetConfigFlags(flags); - } - private void SetFullscreen(bool fullscreen) { // var flags = _defaultFlags; @@ -193,12 +198,6 @@ namespace Voile.Rendering // TODO public override void SetTransform(Matrix4x4 transform) { } - public override void CreateAndInitialize(WindowSettings windowSettings, RendererSettings renderSettings) - { - Initialize(renderSettings); - CreateWindow(windowSettings); - } - private Raylib_cs.Color VoileColorToRaylibColor(Color color) { return new Raylib_cs.Color { r = (byte)Math.Round(color.R * 255f), g = (byte)Math.Round(color.G * 255f), b = (byte)Math.Round(color.B * 255f), a = (byte)Math.Round(color.A * 255f) }; @@ -284,7 +283,6 @@ namespace Voile.Rendering texture.Handle = _texturePool.Count - 1; } - private List _texturePool = new(); private List _fontPool = new(); private Vector2 _windowSize; diff --git a/Voile/Source/Rendering/StandardRenderer.cs b/Voile/Source/Rendering/StandardRenderSystem.cs similarity index 97% rename from Voile/Source/Rendering/StandardRenderer.cs rename to Voile/Source/Rendering/StandardRenderSystem.cs index 3bdd14f..eace441 100644 --- a/Voile/Source/Rendering/StandardRenderer.cs +++ b/Voile/Source/Rendering/StandardRenderSystem.cs @@ -12,7 +12,7 @@ namespace Voile.Rendering /// /// A standard, WebGPU-based renderer. /// - public class StandardRenderer : Renderer + public class StandardRenderSystem : RenderSystem { /// public override Vector2 WindowSize { get; set; } @@ -43,10 +43,10 @@ namespace Voile.Rendering } /// - public override void CreateAndInitialize(WindowSettings windowSettings, RendererSettings renderSettings) + public override void CreateAndInitializeWithWindow(RendererSettings settings) { - CreateWindow(windowSettings); - Initialize(renderSettings); + CreateWindow(settings.WindowSettings); + Initialize(settings); } public override void CreateWindow(WindowSettings windowSettings) @@ -369,6 +369,6 @@ namespace Voile.Rendering private unsafe CommandEncoder* _commandEncoder; private unsafe RenderPassEncoder* _renderPassEncoder; - private Logger _logger = new(nameof(StandardRenderer)); + private Logger _logger = new(nameof(StandardRenderSystem)); } } \ No newline at end of file diff --git a/Voile/Source/SceneGraph/Entities/CircleShape2d.cs b/Voile/Source/SceneGraph/Entities/CircleShape2d.cs index 74fadb9..dee3731 100644 --- a/Voile/Source/SceneGraph/Entities/CircleShape2d.cs +++ b/Voile/Source/SceneGraph/Entities/CircleShape2d.cs @@ -7,7 +7,7 @@ namespace Voile.SceneGraph public float Radius { get => _radius; set => _radius = value; } public Color Color { get => _color; set => _color = value; } - public override void OnDraw(Renderer renderer) + public override void OnDraw(RenderSystem renderer) { renderer.DrawCircle(_radius, _color); } diff --git a/Voile/Source/SceneGraph/Entities/Drawable2d.cs b/Voile/Source/SceneGraph/Entities/Drawable2d.cs index ec6fec1..b1bb6ff 100644 --- a/Voile/Source/SceneGraph/Entities/Drawable2d.cs +++ b/Voile/Source/SceneGraph/Entities/Drawable2d.cs @@ -6,12 +6,12 @@ namespace Voile.SceneGraph public abstract class Drawable2d : Entity2d, IDrawable { public Vector2 PivotOffset { get; set; } - public void Draw(Renderer renderer) + public void Draw(RenderSystem renderer) { renderer.SetTransform(Position, PivotOffset, Rotation); OnDraw(renderer); } - public abstract void OnDraw(Renderer renderer); + public abstract void OnDraw(RenderSystem renderer); } } \ No newline at end of file diff --git a/Voile/Source/SceneGraph/Entities/Entity.cs b/Voile/Source/SceneGraph/Entities/Entity.cs index a704632..0074fe9 100644 --- a/Voile/Source/SceneGraph/Entities/Entity.cs +++ b/Voile/Source/SceneGraph/Entities/Entity.cs @@ -7,19 +7,19 @@ namespace Voile.SceneGraph public class Entity { [JsonIgnore] public EntityLayer? Layer { get; set; } - [JsonIgnore] public InputHandler Input => Layer!.Scene.Input; - [JsonIgnore] public AudioBackend Audio => Layer!.Scene.Audio; - [JsonIgnore] public Renderer Renderer => Layer!.Scene.Renderer; + [JsonIgnore] public InputSystem Input => Layer!.Scene.Input; + [JsonIgnore] public AudioSystem Audio => Layer!.Scene.Audio; + [JsonIgnore] public RenderSystem Renderer => Layer!.Scene.Renderer; public int Id { get; set; } public void Start() => OnStart(); public void Update(double dt) => OnUpdate(dt); - public void ReceiveInput(InputHandler input) => OnInput(input); + public void ReceiveInput(InputSystem input) => OnInput(input); protected virtual void OnStart() { } protected virtual void OnDestroy() { } protected virtual void OnUpdate(double dt) { } - protected virtual void OnInput(InputHandler input) { } + protected virtual void OnInput(InputSystem input) { } public void Destroy() { diff --git a/Voile/Source/SceneGraph/Entities/IDrawable.cs b/Voile/Source/SceneGraph/Entities/IDrawable.cs index 4d5df17..2c92de0 100644 --- a/Voile/Source/SceneGraph/Entities/IDrawable.cs +++ b/Voile/Source/SceneGraph/Entities/IDrawable.cs @@ -4,6 +4,6 @@ namespace Voile.SceneGraph { public interface IDrawable { - public void Draw(Renderer renderer); + public void Draw(RenderSystem renderer); } } \ No newline at end of file diff --git a/Voile/Source/SceneGraph/Entities/Particles2d.cs b/Voile/Source/SceneGraph/Entities/Particles2d.cs index e4671dc..09931a5 100644 --- a/Voile/Source/SceneGraph/Entities/Particles2d.cs +++ b/Voile/Source/SceneGraph/Entities/Particles2d.cs @@ -30,7 +30,7 @@ namespace Voile.SceneGraph } } - public override void OnDraw(Renderer renderer) + public override void OnDraw(RenderSystem renderer) { foreach (var particle in _particles) { diff --git a/Voile/Source/SceneGraph/Entities/RectangleShape2d.cs b/Voile/Source/SceneGraph/Entities/RectangleShape2d.cs index 39f6993..249d243 100644 --- a/Voile/Source/SceneGraph/Entities/RectangleShape2d.cs +++ b/Voile/Source/SceneGraph/Entities/RectangleShape2d.cs @@ -7,7 +7,7 @@ public class RectangleShape2d : Drawable2d { public Vector2 Size { get; set; } = Vector2.One * 32; public Color Color { get; set; } = Color.White; - public override void OnDraw(Renderer renderer) + public override void OnDraw(RenderSystem renderer) { PivotOffset = Size / 2; renderer.DrawRectangle(Size, Color); diff --git a/Voile/Source/SceneGraph/Entities/Sprite2d.cs b/Voile/Source/SceneGraph/Entities/Sprite2d.cs index e3ec670..6c73c57 100644 --- a/Voile/Source/SceneGraph/Entities/Sprite2d.cs +++ b/Voile/Source/SceneGraph/Entities/Sprite2d.cs @@ -13,7 +13,7 @@ namespace Voile.SceneGraph var renderer = Layer.Scene.Renderer; } - public override void OnDraw(Renderer renderer) + public override void OnDraw(RenderSystem renderer) { renderer.DrawTexture(_texture!, Color.White); } diff --git a/Voile/Source/SceneGraph/Entities/Text2d.cs b/Voile/Source/SceneGraph/Entities/Text2d.cs index d33cd4d..aaa8fab 100644 --- a/Voile/Source/SceneGraph/Entities/Text2d.cs +++ b/Voile/Source/SceneGraph/Entities/Text2d.cs @@ -21,7 +21,7 @@ namespace Voile.SceneGraph _font = font; } - public override void OnDraw(Renderer renderer) + public override void OnDraw(RenderSystem renderer) { if (_font == null) { diff --git a/Voile/Source/SceneGraph/EntityLayer.cs b/Voile/Source/SceneGraph/EntityLayer.cs index 46dd120..2563149 100644 --- a/Voile/Source/SceneGraph/EntityLayer.cs +++ b/Voile/Source/SceneGraph/EntityLayer.cs @@ -75,7 +75,7 @@ namespace Voile.SceneGraph } } - protected override void OnBeginDraw(Renderer renderer) + protected override void OnBeginDraw(RenderSystem renderer) { if (CurrentCamera is not null) { @@ -83,7 +83,7 @@ namespace Voile.SceneGraph } } - protected override void OnEndDraw(Renderer renderer) + protected override void OnEndDraw(RenderSystem renderer) { if (CurrentCamera is not null) { @@ -92,7 +92,7 @@ namespace Voile.SceneGraph } - protected override void OnDraw(Renderer renderer) + protected override void OnDraw(RenderSystem renderer) { // TODO: can be done more efficiently, needs rendering redesign. foreach (var entity in Entities) diff --git a/Voile/Source/SceneGraph/Layer.cs b/Voile/Source/SceneGraph/Layer.cs index ef1218c..35cbff0 100644 --- a/Voile/Source/SceneGraph/Layer.cs +++ b/Voile/Source/SceneGraph/Layer.cs @@ -7,22 +7,22 @@ namespace Voile.SceneGraph public abstract class Layer : IDrawable { [JsonIgnore] public Scene? Scene { get; set; } - [JsonIgnore] public InputHandler? Input { get; set; } + [JsonIgnore] public InputSystem? Input { get; set; } [JsonIgnore] public ResourceManager ResourceManager => Scene!.ResourceManager; - public void BeginDraw(Renderer renderer) => OnBeginDraw(renderer); - public void Draw(Renderer renderer) => OnDraw(renderer); - public void EndDraw(Renderer renderer) => OnEndDraw(renderer); + public void BeginDraw(RenderSystem renderer) => OnBeginDraw(renderer); + public void Draw(RenderSystem renderer) => OnDraw(renderer); + public void EndDraw(RenderSystem renderer) => OnEndDraw(renderer); public void Start() => OnStart(); public void Update(double dt) => OnUpdate(dt); - public void ReceiveInput(InputHandler input) => OnInput(input); + public void ReceiveInput(InputSystem input) => OnInput(input); protected virtual void OnStart() { } protected virtual void OnUpdate(double dt) { } - protected virtual void OnInput(InputHandler input) { } - protected abstract void OnBeginDraw(Renderer renderer); - protected abstract void OnDraw(Renderer renderer); - protected abstract void OnEndDraw(Renderer renderer); + protected virtual void OnInput(InputSystem input) { } + protected abstract void OnBeginDraw(RenderSystem renderer); + protected abstract void OnDraw(RenderSystem renderer); + protected abstract void OnEndDraw(RenderSystem renderer); } } \ No newline at end of file diff --git a/Voile/Source/SceneGraph/Scene.cs b/Voile/Source/SceneGraph/Scene.cs index 6769660..7047df5 100644 --- a/Voile/Source/SceneGraph/Scene.cs +++ b/Voile/Source/SceneGraph/Scene.cs @@ -8,9 +8,9 @@ namespace Voile.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 RenderSystem Renderer { get => _renderer; set => _renderer = value; } + public InputSystem? Input { get => _input; set => _input = value; } + public AudioSystem? Audio => _audioBackend; public ResourceManager ResourceManager => _resourceManager; public double DeltaTime => _renderer.FrameTime; @@ -75,7 +75,7 @@ namespace Voile.SceneGraph layer.Value.Update(DeltaTime); } - Audio?.Update(); + Audio?.Update(DeltaTime); } public void AddLayer(string name, Layer layer) @@ -114,17 +114,17 @@ namespace Voile.SceneGraph } private Dictionary _layers = new(); - private Renderer _renderer; - private AudioBackend? _audioBackend; - private InputHandler? _input; + private RenderSystem _renderer; + private AudioSystem? _audioBackend; + private InputSystem? _input; private ResourceManager _resourceManager; } public struct SceneSettings { - public Renderer Renderer { get; set; } - public AudioBackend AudioBackend { get; set; } - public InputHandler InputHandler { get; set; } + public RenderSystem Renderer { get; set; } + public AudioSystem AudioBackend { get; set; } + public InputSystem InputHandler { get; set; } public ResourceManager ResourceManager { get; set; } } } \ No newline at end of file diff --git a/Voile/Source/Audio/AudioBackend.cs b/Voile/Source/Systems/AudioSystem.cs similarity index 77% rename from Voile/Source/Audio/AudioBackend.cs rename to Voile/Source/Systems/AudioSystem.cs index 15771a8..63f8747 100644 --- a/Voile/Source/Audio/AudioBackend.cs +++ b/Voile/Source/Systems/AudioSystem.cs @@ -1,9 +1,19 @@ namespace Voile.Audio { - public abstract class AudioBackend : IDisposable + public abstract class AudioSystem : IStartableSystem, IUpdatableSystem, IDisposable { - public abstract void Initialize(); - public abstract void Update(); + public void Start() => Initialize(); + + public void Update(double deltaTime) => Update(); + + public void Dispose() + { + Shutdown(); + GC.SuppressFinalize(this); + } + + protected abstract void Initialize(); + protected abstract void Update(); protected abstract void Shutdown(); // BUS public abstract void CreateBus(string busName); @@ -23,11 +33,6 @@ namespace Voile.Audio // EFFECTS public abstract void AddBusEffect(T effect, string bus = "Master") where T : AudioEffect; - public void Dispose() - { - Shutdown(); - GC.SuppressFinalize(this); - } private LehmerRandom _random = new LehmerRandom(); } diff --git a/Voile/Source/Systems/ISystem.cs b/Voile/Source/Systems/ISystem.cs new file mode 100644 index 0000000..5658766 --- /dev/null +++ b/Voile/Source/Systems/ISystem.cs @@ -0,0 +1,18 @@ +public interface IStartableSystem +{ + void Start(); +} + +/// +/// A system that accepts additional data for starting. +/// +/// +public interface IStartableSystem +{ + void Start(T configuration); +} + +public interface IUpdatableSystem +{ + void Update(double deltaTime); +} \ No newline at end of file diff --git a/Voile/Source/InputHandler.cs b/Voile/Source/Systems/InputSystem.cs similarity index 91% rename from Voile/Source/InputHandler.cs rename to Voile/Source/Systems/InputSystem.cs index 17ff325..c60bfe4 100644 --- a/Voile/Source/InputHandler.cs +++ b/Voile/Source/Systems/InputSystem.cs @@ -4,16 +4,24 @@ using Voile.Utils; namespace Voile { - public abstract class InputHandler : IDisposable + /// + /// A system providing means for collecting user input, as well as defining custom list. + /// + public abstract class InputSystem : IStartableSystem, IDisposable { + /// + /// The list of all available input mappings, custom and built-in. + /// public static IReadOnlyDictionary> InputMappings => inputMappings; - public InputHandler() + public void Start() { inputMappings = new Dictionary>(); CreateDefaultMappings(); } + public void Shutdown() => Dispose(); + public void Dispose() => GC.SuppressFinalize(this); public bool Handled { get => _handled; set => _handled = value; } @@ -79,10 +87,9 @@ namespace Voile return true; } - protected static Dictionary> inputMappings = new(); private bool _handled; - private Logger _logger = new(nameof(InputHandler)); + private Logger _logger = new(nameof(InputSystem)); } public enum KeyboardKey @@ -198,6 +205,8 @@ namespace Voile RightSuper = 347, KBMenu = 348 } + + [Flags] public enum MouseButton { Left = 0, diff --git a/Voile/Source/Rendering/Renderer.cs b/Voile/Source/Systems/RenderSystem.cs similarity index 92% rename from Voile/Source/Rendering/Renderer.cs rename to Voile/Source/Systems/RenderSystem.cs index 02ef916..67cf054 100644 --- a/Voile/Source/Rendering/Renderer.cs +++ b/Voile/Source/Systems/RenderSystem.cs @@ -5,15 +5,26 @@ namespace Voile.Rendering /// /// An abstract class representing the graphics renderer. /// - public abstract class Renderer : IDisposable + public abstract class RenderSystem : IStartableSystem, IDisposable { + public void Start(RendererSettings settings) + { + CreateAndInitializeWithWindow(settings); + } + + /// + public void Dispose() + { + Shutdown(); + GC.SuppressFinalize(this); + } + // INIT /// - /// Creates the renderer window and initializes internal resources. + /// Creates the renderer with an OS window and initializes internal resources. /// - /// Settings for the rendering window. /// Rendering settings. - public abstract void CreateAndInitialize(WindowSettings windowSettings, RendererSettings renderSettings); + public abstract void CreateAndInitializeWithWindow(RendererSettings renderSettings); /// /// Initializes internal resources. Should be called before other methods. /// @@ -46,13 +57,6 @@ namespace Voile.Rendering /// public abstract Vector2 MonitorSize { get; } - /// - public void Dispose() - { - Shutdown(); - GC.SuppressFinalize(this); - } - /// /// Creates a window. /// @@ -148,6 +152,7 @@ namespace Voile.Rendering /// Texture tint. public abstract void DrawTexture(Texture2d texture, Color tint); + protected Vector2 transformPosition, transformOffset; protected float transformRotation; } @@ -166,12 +171,15 @@ namespace Voile.Rendering public bool Fullscreen; public int TargetFps = 60; + public WindowSettings WindowSettings; + public RendererSettings() { } public static RendererSettings Default => new RendererSettings() { UseVSync = true, - TargetFps = 60 + TargetFps = 60, + WindowSettings = WindowSettings.Default }; } diff --git a/Voile/Source/UI/Container.cs b/Voile/Source/UI/Container.cs index b9418bc..49128d5 100644 --- a/Voile/Source/UI/Container.cs +++ b/Voile/Source/UI/Container.cs @@ -37,7 +37,7 @@ public class Container : UIElement protected virtual void RearrangeChild(int idx, UIElement child) { } - protected override void OnRender(Renderer renderer) + protected override void OnRender(RenderSystem renderer) { } diff --git a/Voile/Source/UI/Panel.cs b/Voile/Source/UI/Panel.cs index 3cab364..1987700 100644 --- a/Voile/Source/UI/Panel.cs +++ b/Voile/Source/UI/Panel.cs @@ -12,7 +12,7 @@ public class Panel : Container Style = style; } - protected override void OnRender(Renderer renderer) + protected override void OnRender(RenderSystem renderer) { base.OnRender(renderer); renderer.DrawRectangle(Rect.Size, Style.BackgroundColor); diff --git a/Voile/Source/UI/TextLabel.cs b/Voile/Source/UI/TextLabel.cs index fb021d9..3fd84cd 100644 --- a/Voile/Source/UI/TextLabel.cs +++ b/Voile/Source/UI/TextLabel.cs @@ -14,7 +14,7 @@ public class TextLabel : UIElement } public int FontSize { get; set; } = 16; public Color FontColor { get; set; } = Color.White; - protected override void OnRender(Renderer renderer) + protected override void OnRender(RenderSystem renderer) { if (_font == null) diff --git a/Voile/Source/UI/UIElement.cs b/Voile/Source/UI/UIElement.cs index 6ee750e..c6d4cf5 100644 --- a/Voile/Source/UI/UIElement.cs +++ b/Voile/Source/UI/UIElement.cs @@ -23,7 +23,7 @@ public abstract class UIElement child.parent = this; } - public void Render(Renderer renderer) + public void Render(RenderSystem renderer) { Vector2 parentPos = parent != null ? parent.Rect.Position : Vector2.Zero; renderer.SetTransform(Rect.Position + parentPos, Vector2.Zero, 0); @@ -36,7 +36,7 @@ public abstract class UIElement } } - protected abstract void OnRender(Renderer renderer); + protected abstract void OnRender(RenderSystem renderer); protected List children; protected UIElement? parent; diff --git a/Voile/Source/Color.cs b/Voile/Source/Utils/Color.cs similarity index 100% rename from Voile/Source/Color.cs rename to Voile/Source/Utils/Color.cs diff --git a/Voile/Source/Utils/ImGuiRenderLayer.cs b/Voile/Source/Utils/ImGuiRenderLayer.cs index f906f73..6bca284 100644 --- a/Voile/Source/Utils/ImGuiRenderLayer.cs +++ b/Voile/Source/Utils/ImGuiRenderLayer.cs @@ -8,7 +8,7 @@ namespace Voile.SceneGraph { public class ImGuiRenderLayer : Layer { - protected override void OnDraw(Renderer renderer) + protected override void OnDraw(RenderSystem renderer) { Layout(); _controller.Draw(renderer); @@ -27,12 +27,12 @@ namespace Voile.SceneGraph _controller.Update(dt, Input); } - protected override void OnBeginDraw(Renderer renderer) + protected override void OnBeginDraw(RenderSystem renderer) { throw new NotImplementedException(); } - protected override void OnEndDraw(Renderer renderer) + protected override void OnEndDraw(RenderSystem renderer) { throw new NotImplementedException(); } @@ -124,7 +124,7 @@ namespace Voile.SceneGraph io.DisplaySize = size / _scaleFactor; } - public void Update(double dt, InputHandler input) + public void Update(double dt, InputSystem input) { ImGuiIOPtr io = ImGui.GetIO(); @@ -137,7 +137,7 @@ namespace Voile.SceneGraph ImGui.NewFrame(); } - private void UpdateKeyboard(InputHandler input) + private void UpdateKeyboard(InputSystem input) { ImGuiIOPtr io = ImGui.GetIO(); @@ -161,7 +161,7 @@ namespace Voile.SceneGraph } } - private void UpdateMouse(InputHandler input) + private void UpdateMouse(InputSystem input) { ImGuiIOPtr io = ImGui.GetIO(); @@ -317,7 +317,7 @@ namespace Voile.SceneGraph Rlgl.rlEnd(); } - public void Draw(Renderer renderer) + public void Draw(RenderSystem renderer) { ImGui.Render(); RenderCommandLists(ImGui.GetDrawData()); diff --git a/Voile/TODO.md b/Voile/TODO.md index 1df6c85..3d5d1f3 100644 --- a/Voile/TODO.md +++ b/Voile/TODO.md @@ -2,11 +2,11 @@ ## Core -- Add and implement interfaces for subsystems (ISubSystem, IUpdatableSubSystem, etc.) +- ~~Add and implement interfaces for systems (ISystem, IUpdatableSystem, etc.)~~ - Minimize amount of possible null references. -- Serialization of Resources through code generation. +- Serialization and deserialization of Resources from and to TOML files. - Add documentation for common classes. -- Hot reloading +- Hot reloading of resources. ## I/O