Add and implement interfaces for systems (ISystem, IUpdatableSystem, etc.), move Color to Utils, rename Handlers/Renderers/Backends to System, move input related classes to an Input subfolder.

This commit is contained in:
2024-10-14 17:29:52 +02:00
parent 5227c390a1
commit f68f8f4b02
34 changed files with 189 additions and 143 deletions

View File

@@ -5,7 +5,7 @@ namespace Voile;
public class Circle2d : Drawable2d public class Circle2d : Drawable2d
{ {
public override void OnDraw(Renderer renderer) public override void OnDraw(RenderSystem renderer)
{ {
renderer.DrawCircle(32f, Color.AliceBlue); renderer.DrawCircle(32f, Color.AliceBlue);
} }

View File

@@ -12,8 +12,8 @@ public class TestGame : Game
{ {
InitializeDefault(); InitializeDefault();
_audioBackend = new FmodAudioBackend(); _audioSystem = new FmodAudioSystem();
_audioBackend.Initialize(); _audioSystem.Start();
} }
protected override void LoadResources() protected override void LoadResources()
@@ -39,7 +39,7 @@ public class TestGame : Game
_scene = new Scene(new SceneSettings() _scene = new Scene(new SceneSettings()
{ {
Renderer = Renderer, Renderer = Renderer,
AudioBackend = _audioBackend!, AudioBackend = _audioSystem!,
InputHandler = Input, InputHandler = Input,
ResourceManager = ResourceManager ResourceManager = ResourceManager
}); });
@@ -47,7 +47,7 @@ public class TestGame : Game
_uiLayer = new UiLayer(); _uiLayer = new UiLayer();
_worldLayer = new EntityLayer(); _worldLayer = new EntityLayer();
_testSoundInstance = _audioBackend!.CreateInstance(_testSound!); _testSoundInstance = _audioSystem!.CreateInstance(_testSound!);
Input.AddInputMapping("play", new InputAction[] { new KeyInputAction(KeyboardKey.Spacebar) }); Input.AddInputMapping("play", new InputAction[] { new KeyInputAction(KeyboardKey.Spacebar) });
Input.AddInputMapping("sprint", new InputAction[] { new KeyInputAction(KeyboardKey.LeftShift) }); Input.AddInputMapping("sprint", new InputAction[] { new KeyInputAction(KeyboardKey.LeftShift) });
@@ -82,13 +82,13 @@ public class TestGame : Game
public override void Shutdown() public override void Shutdown()
{ {
ShutdownDefault(); ShutdownDefault();
_audioBackend!.Dispose(); _audioSystem!.Dispose();
} }
private Sound? _testSound; private Sound? _testSound;
private SoundInstance? _testSoundInstance; private SoundInstance? _testSoundInstance;
private Font? _font; private Font? _font;
private FmodAudioBackend? _audioBackend; private FmodAudioSystem? _audioSystem;
private Scene? _scene; private Scene? _scene;
private UiLayer? _uiLayer; private UiLayer? _uiLayer;

View File

@@ -22,17 +22,17 @@ public class UiLayer : Layer
_screenContainer.UpdateRect(Vector2.Zero, Scene.Renderer.WindowSize); _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); _screenContainer.Render(renderer);
} }
protected override void OnEndDraw(Renderer renderer) protected override void OnEndDraw(RenderSystem renderer)
{ {
} }

View File

@@ -15,7 +15,7 @@ public class World : Drawable2d
_randomPositions[i] = MathUtils.RandomVector2(Position, Vector2.One * 2048f); _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++) for (int i = 0; i < _rectangleAmount; i++)
{ {

View File

@@ -1,6 +1,9 @@
namespace Voile.Audio namespace Voile.Audio
{ {
public class DummyAudioBackend : AudioBackend /// <summary>
/// Dummy audio system.
/// </summary>
public class DummyAudioSystem : AudioSystem
{ {
public override void AddBusEffect<T>(T effect, string bus = "Master") public override void AddBusEffect<T>(T effect, string bus = "Master")
{ {
@@ -17,7 +20,7 @@ namespace Voile.Audio
return 0.0f; return 0.0f;
} }
public override void Initialize() protected override void Initialize()
{ {
return; return;
} }
@@ -32,7 +35,7 @@ namespace Voile.Audio
return; return;
} }
public override void Update() protected override void Update()
{ {
return; return;
} }

View File

@@ -4,9 +4,9 @@ using Voile.Utils;
namespace Voile.Audio namespace Voile.Audio
{ {
public class FmodAudioBackend : AudioBackend public class FmodAudioSystem : AudioSystem
{ {
public override void Initialize() protected override void Initialize()
{ {
CreateSystem(); CreateSystem();
_loadedSounds = new Dictionary<string, FMOD.Sound>(); _loadedSounds = new Dictionary<string, FMOD.Sound>();
@@ -14,7 +14,7 @@ namespace Voile.Audio
CreateBus("Master"); 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") public override void PlaySound(Sound sound, float pitch, float volume, string bus = "Master")
{ {
@@ -134,7 +134,7 @@ namespace Voile.Audio
return _channelGroups[busName]; return _channelGroups[busName];
} }
private Logger _logger = new(nameof(FmodAudioBackend)); private Logger _logger = new(nameof(FmodAudioSystem));
private FMOD.System _system; private FMOD.System _system;
// TODO: use a different key for the dictionary, paths are not good :( (waste of memory lol) // TODO: use a different key for the dictionary, paths are not good :( (waste of memory lol)

View File

@@ -3,7 +3,7 @@ namespace Voile.Audio
public class SoundInstance public class SoundInstance
{ {
protected virtual Sound Sound => _sound; protected virtual Sound Sound => _sound;
public SoundInstance(AudioBackend backend, Sound sound) public SoundInstance(AudioSystem backend, Sound sound)
{ {
_backend = backend; _backend = backend;
_sound = sound; _sound = sound;
@@ -34,7 +34,7 @@ namespace Voile.Audio
_backend.PlaySound(Sound, _pitch, _volume, _bus); _backend.PlaySound(Sound, _pitch, _volume, _bus);
} }
private readonly AudioBackend _backend; private readonly AudioSystem _backend;
private readonly Sound _sound; private readonly Sound _sound;
private string _bus = "Master"; private string _bus = "Master";
private float _pitch, _volume = 1.0f; private float _pitch, _volume = 1.0f;

View File

@@ -10,14 +10,14 @@ namespace Voile
/// </summary> /// </summary>
protected ResourceManager ResourceManager { get; private set; } protected ResourceManager ResourceManager { get; private set; }
/// <summary> /// <summary>
/// The InputHandler associated with this game. Uses <see cref="RaylibInputHandler"/> by default. /// The InputHandler associated with this game. Uses <see cref="RaylibInputSystem"/> by default.
/// </summary> /// </summary>
protected InputHandler Input { get; private set; } protected InputSystem Input { get; private set; }
/// <summary> /// <summary>
/// The Renderer associated with this game. Uses <see cref="RaylibRenderer"/> by default. /// The Renderer associated with this game. Uses <see cref="RaylibRenderSystem"/> by default.
/// </summary> /// </summary>
protected Renderer Renderer { get; private set; } protected RenderSystem Renderer { get; private set; }
/// <summary> /// <summary>
/// Resource root path for this game. /// Resource root path for this game.
@@ -37,8 +37,8 @@ namespace Voile
public Game() public Game()
{ {
ResourceManager = new ResourceManager(); ResourceManager = new ResourceManager();
Input = new RaylibInputHandler(); Input = new RaylibInputSystem();
Renderer = new RaylibRenderer(); Renderer = new RaylibRenderSystem();
} }
/// <summary> /// <summary>
@@ -61,8 +61,10 @@ namespace Voile
{ {
ResourceManager.ResourceRoot = ResourceRoot; ResourceManager.ResourceRoot = ResourceRoot;
Input = new RaylibInputHandler(); Input = new RaylibInputSystem();
Renderer = new RaylibRenderer(); Renderer = new RaylibRenderSystem();
Input.Start();
InitializeRenderer(); InitializeRenderer();
} }
@@ -103,7 +105,7 @@ namespace Voile
if (!string.IsNullOrWhiteSpace(Name)) if (!string.IsNullOrWhiteSpace(Name))
windowSettings.Title = Name; windowSettings.Title = Name;
Renderer.CreateAndInitialize(windowSettings, RendererSettings.Default); Renderer.Start(RendererSettings.Default);
} }
} }
} }

View File

@@ -2,9 +2,9 @@ namespace Voile
{ {
public abstract class InputAction public abstract class InputAction
{ {
public abstract bool IsDown(InputHandler inputHandler); public abstract bool IsDown(InputSystem inputHandler);
public abstract bool IsPressed(InputHandler inputHandler); public abstract bool IsPressed(InputSystem inputHandler);
public abstract bool IsReleased(InputHandler inputHandler); public abstract bool IsReleased(InputSystem inputHandler);
} }
public class KeyInputAction : InputAction public class KeyInputAction : InputAction
@@ -15,17 +15,17 @@ namespace Voile
{ {
_keyboardKey = keyboardKey; _keyboardKey = keyboardKey;
} }
public override bool IsDown(InputHandler inputHandler) public override bool IsDown(InputSystem inputHandler)
{ {
return inputHandler.IsKeyboardKeyDown(_keyboardKey); return inputHandler.IsKeyboardKeyDown(_keyboardKey);
} }
public override bool IsPressed(InputHandler inputHandler) public override bool IsPressed(InputSystem inputHandler)
{ {
return inputHandler.KeyboardKeyJustPressed(_keyboardKey); return inputHandler.KeyboardKeyJustPressed(_keyboardKey);
} }
public override bool IsReleased(InputHandler inputHandler) public override bool IsReleased(InputSystem inputHandler)
{ {
return inputHandler.KeyboardKeyJustReleased(_keyboardKey); return inputHandler.KeyboardKeyJustReleased(_keyboardKey);
} }

View File

@@ -3,7 +3,10 @@ using Raylib_cs;
namespace Voile namespace Voile
{ {
public class RaylibInputHandler : InputHandler /// <summary>
/// An input system implemented using Raylib's API. Used by default together with <see cref="RaylibRenderer"/>.
/// </summary>
public class RaylibInputSystem : InputSystem
{ {
public override int GetCharPressed() public override int GetCharPressed()
{ {

View File

@@ -1,11 +1,10 @@
using System.Numerics; using System.Numerics;
using System.Runtime.InteropServices;
using System.Text; using System.Text;
using Raylib_cs; using Raylib_cs;
namespace Voile.Rendering namespace Voile.Rendering
{ {
public class RaylibRenderer : Renderer public class RaylibRenderSystem : RenderSystem
{ {
public override bool ShouldRun => !WindowShouldClose(); public override bool ShouldRun => !WindowShouldClose();
public override Vector2 WindowSize public override Vector2 WindowSize
@@ -33,6 +32,31 @@ namespace Voile.Rendering
public override bool VSync { get => _vsync; set => SetWindowVSync(value); } public override bool VSync { get => _vsync; set => SetWindowVSync(value); }
public override bool Fullscreen { get => _fullscreen; set => SetFullscreen(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) public override void CreateWindow(WindowSettings windowSettings)
{ {
Raylib.SetTraceLogLevel(TraceLogLevel.LOG_NONE); Raylib.SetTraceLogLevel(TraceLogLevel.LOG_NONE);
@@ -154,25 +178,6 @@ namespace Voile.Rendering
throw new NotImplementedException(); 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) private void SetFullscreen(bool fullscreen)
{ {
// var flags = _defaultFlags; // var flags = _defaultFlags;
@@ -193,12 +198,6 @@ namespace Voile.Rendering
// TODO // TODO
public override void SetTransform(Matrix4x4 transform) { } 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) 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) }; 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; texture.Handle = _texturePool.Count - 1;
} }
private List<Texture2D> _texturePool = new(); private List<Texture2D> _texturePool = new();
private List<Raylib_cs.Font> _fontPool = new(); private List<Raylib_cs.Font> _fontPool = new();
private Vector2 _windowSize; private Vector2 _windowSize;

View File

@@ -12,7 +12,7 @@ namespace Voile.Rendering
/// <summary> /// <summary>
/// A standard, WebGPU-based renderer. /// A standard, WebGPU-based renderer.
/// </summary> /// </summary>
public class StandardRenderer : Renderer public class StandardRenderSystem : RenderSystem
{ {
/// <inheritdoc /> /// <inheritdoc />
public override Vector2 WindowSize { get; set; } public override Vector2 WindowSize { get; set; }
@@ -43,10 +43,10 @@ namespace Voile.Rendering
} }
/// <inheritdoc /> /// <inheritdoc />
public override void CreateAndInitialize(WindowSettings windowSettings, RendererSettings renderSettings) public override void CreateAndInitializeWithWindow(RendererSettings settings)
{ {
CreateWindow(windowSettings); CreateWindow(settings.WindowSettings);
Initialize(renderSettings); Initialize(settings);
} }
public override void CreateWindow(WindowSettings windowSettings) public override void CreateWindow(WindowSettings windowSettings)
@@ -369,6 +369,6 @@ namespace Voile.Rendering
private unsafe CommandEncoder* _commandEncoder; private unsafe CommandEncoder* _commandEncoder;
private unsafe RenderPassEncoder* _renderPassEncoder; private unsafe RenderPassEncoder* _renderPassEncoder;
private Logger _logger = new(nameof(StandardRenderer)); private Logger _logger = new(nameof(StandardRenderSystem));
} }
} }

View File

@@ -7,7 +7,7 @@ namespace Voile.SceneGraph
public float Radius { get => _radius; set => _radius = value; } public float Radius { get => _radius; set => _radius = value; }
public Color Color { get => _color; set => _color = 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); renderer.DrawCircle(_radius, _color);
} }

View File

@@ -6,12 +6,12 @@ namespace Voile.SceneGraph
public abstract class Drawable2d : Entity2d, IDrawable public abstract class Drawable2d : Entity2d, IDrawable
{ {
public Vector2 PivotOffset { get; set; } public Vector2 PivotOffset { get; set; }
public void Draw(Renderer renderer) public void Draw(RenderSystem renderer)
{ {
renderer.SetTransform(Position, PivotOffset, Rotation); renderer.SetTransform(Position, PivotOffset, Rotation);
OnDraw(renderer); OnDraw(renderer);
} }
public abstract void OnDraw(Renderer renderer); public abstract void OnDraw(RenderSystem renderer);
} }
} }

View File

@@ -7,19 +7,19 @@ namespace Voile.SceneGraph
public class Entity public class Entity
{ {
[JsonIgnore] public EntityLayer? Layer { get; set; } [JsonIgnore] public EntityLayer? Layer { get; set; }
[JsonIgnore] public InputHandler Input => Layer!.Scene.Input; [JsonIgnore] public InputSystem Input => Layer!.Scene.Input;
[JsonIgnore] public AudioBackend Audio => Layer!.Scene.Audio; [JsonIgnore] public AudioSystem Audio => Layer!.Scene.Audio;
[JsonIgnore] public Renderer Renderer => Layer!.Scene.Renderer; [JsonIgnore] public RenderSystem Renderer => Layer!.Scene.Renderer;
public int Id { get; set; } public int Id { get; set; }
public void Start() => OnStart(); public void Start() => OnStart();
public void Update(double dt) => OnUpdate(dt); 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 OnStart() { }
protected virtual void OnDestroy() { } protected virtual void OnDestroy() { }
protected virtual void OnUpdate(double dt) { } protected virtual void OnUpdate(double dt) { }
protected virtual void OnInput(InputHandler input) { } protected virtual void OnInput(InputSystem input) { }
public void Destroy() public void Destroy()
{ {

View File

@@ -4,6 +4,6 @@ namespace Voile.SceneGraph
{ {
public interface IDrawable public interface IDrawable
{ {
public void Draw(Renderer renderer); public void Draw(RenderSystem renderer);
} }
} }

View File

@@ -30,7 +30,7 @@ namespace Voile.SceneGraph
} }
} }
public override void OnDraw(Renderer renderer) public override void OnDraw(RenderSystem renderer)
{ {
foreach (var particle in _particles) foreach (var particle in _particles)
{ {

View File

@@ -7,7 +7,7 @@ public class RectangleShape2d : Drawable2d
{ {
public Vector2 Size { get; set; } = Vector2.One * 32; public Vector2 Size { get; set; } = Vector2.One * 32;
public Color Color { get; set; } = Color.White; public Color Color { get; set; } = Color.White;
public override void OnDraw(Renderer renderer) public override void OnDraw(RenderSystem renderer)
{ {
PivotOffset = Size / 2; PivotOffset = Size / 2;
renderer.DrawRectangle(Size, Color); renderer.DrawRectangle(Size, Color);

View File

@@ -13,7 +13,7 @@ namespace Voile.SceneGraph
var renderer = Layer.Scene.Renderer; var renderer = Layer.Scene.Renderer;
} }
public override void OnDraw(Renderer renderer) public override void OnDraw(RenderSystem renderer)
{ {
renderer.DrawTexture(_texture!, Color.White); renderer.DrawTexture(_texture!, Color.White);
} }

View File

@@ -21,7 +21,7 @@ namespace Voile.SceneGraph
_font = font; _font = font;
} }
public override void OnDraw(Renderer renderer) public override void OnDraw(RenderSystem renderer)
{ {
if (_font == null) if (_font == null)
{ {

View File

@@ -75,7 +75,7 @@ namespace Voile.SceneGraph
} }
} }
protected override void OnBeginDraw(Renderer renderer) protected override void OnBeginDraw(RenderSystem renderer)
{ {
if (CurrentCamera is not null) 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) 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. // TODO: can be done more efficiently, needs rendering redesign.
foreach (var entity in Entities) foreach (var entity in Entities)

View File

@@ -7,22 +7,22 @@ namespace Voile.SceneGraph
public abstract class Layer : IDrawable public abstract class Layer : IDrawable
{ {
[JsonIgnore] public Scene? Scene { get; set; } [JsonIgnore] public Scene? Scene { get; set; }
[JsonIgnore] public InputHandler? Input { get; set; } [JsonIgnore] public InputSystem? Input { get; set; }
[JsonIgnore] public ResourceManager ResourceManager => Scene!.ResourceManager; [JsonIgnore] public ResourceManager ResourceManager => Scene!.ResourceManager;
public void BeginDraw(Renderer renderer) => OnBeginDraw(renderer); public void BeginDraw(RenderSystem renderer) => OnBeginDraw(renderer);
public void Draw(Renderer renderer) => OnDraw(renderer); public void Draw(RenderSystem renderer) => OnDraw(renderer);
public void EndDraw(Renderer renderer) => OnEndDraw(renderer); public void EndDraw(RenderSystem renderer) => OnEndDraw(renderer);
public void Start() => OnStart(); public void Start() => OnStart();
public void Update(double dt) => OnUpdate(dt); 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 OnStart() { }
protected virtual void OnUpdate(double dt) { } protected virtual void OnUpdate(double dt) { }
protected virtual void OnInput(InputHandler input) { } protected virtual void OnInput(InputSystem input) { }
protected abstract void OnBeginDraw(Renderer renderer); protected abstract void OnBeginDraw(RenderSystem renderer);
protected abstract void OnDraw(Renderer renderer); protected abstract void OnDraw(RenderSystem renderer);
protected abstract void OnEndDraw(Renderer renderer); protected abstract void OnEndDraw(RenderSystem renderer);
} }
} }

View File

@@ -8,9 +8,9 @@ namespace Voile.SceneGraph
{ {
public class Scene : IMainLoop public class Scene : IMainLoop
{ {
public Renderer Renderer { get => _renderer; set => _renderer = value; } public RenderSystem Renderer { get => _renderer; set => _renderer = value; }
public InputHandler? Input { get => _input; set => _input = value; } public InputSystem? Input { get => _input; set => _input = value; }
public AudioBackend? Audio => _audioBackend; public AudioSystem? Audio => _audioBackend;
public ResourceManager ResourceManager => _resourceManager; public ResourceManager ResourceManager => _resourceManager;
public double DeltaTime => _renderer.FrameTime; public double DeltaTime => _renderer.FrameTime;
@@ -75,7 +75,7 @@ namespace Voile.SceneGraph
layer.Value.Update(DeltaTime); layer.Value.Update(DeltaTime);
} }
Audio?.Update(); Audio?.Update(DeltaTime);
} }
public void AddLayer(string name, Layer layer) public void AddLayer(string name, Layer layer)
@@ -114,17 +114,17 @@ namespace Voile.SceneGraph
} }
private Dictionary<string, Layer> _layers = new(); private Dictionary<string, Layer> _layers = new();
private Renderer _renderer; private RenderSystem _renderer;
private AudioBackend? _audioBackend; private AudioSystem? _audioBackend;
private InputHandler? _input; private InputSystem? _input;
private ResourceManager _resourceManager; private ResourceManager _resourceManager;
} }
public struct SceneSettings public struct SceneSettings
{ {
public Renderer Renderer { get; set; } public RenderSystem Renderer { get; set; }
public AudioBackend AudioBackend { get; set; } public AudioSystem AudioBackend { get; set; }
public InputHandler InputHandler { get; set; } public InputSystem InputHandler { get; set; }
public ResourceManager ResourceManager { get; set; } public ResourceManager ResourceManager { get; set; }
} }
} }

View File

@@ -1,9 +1,19 @@
namespace Voile.Audio namespace Voile.Audio
{ {
public abstract class AudioBackend : IDisposable public abstract class AudioSystem : IStartableSystem, IUpdatableSystem, IDisposable
{ {
public abstract void Initialize(); public void Start() => Initialize();
public abstract void Update();
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(); protected abstract void Shutdown();
// BUS // BUS
public abstract void CreateBus(string busName); public abstract void CreateBus(string busName);
@@ -23,11 +33,6 @@ namespace Voile.Audio
// EFFECTS // EFFECTS
public abstract void AddBusEffect<T>(T effect, string bus = "Master") where T : AudioEffect; public abstract void AddBusEffect<T>(T effect, string bus = "Master") where T : AudioEffect;
public void Dispose()
{
Shutdown();
GC.SuppressFinalize(this);
}
private LehmerRandom _random = new LehmerRandom(); private LehmerRandom _random = new LehmerRandom();
} }

View File

@@ -0,0 +1,18 @@
public interface IStartableSystem
{
void Start();
}
/// <summary>
/// A system that accepts additional data for starting.
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IStartableSystem<T>
{
void Start(T configuration);
}
public interface IUpdatableSystem
{
void Update(double deltaTime);
}

View File

@@ -4,16 +4,24 @@ using Voile.Utils;
namespace Voile namespace Voile
{ {
public abstract class InputHandler : IDisposable /// <summary>
/// A system providing means for collecting user input, as well as defining custom <see cref="InputAction"/> list.
/// </summary>
public abstract class InputSystem : IStartableSystem, IDisposable
{ {
/// <summary>
/// The list of all available input mappings, custom and built-in.
/// </summary>
public static IReadOnlyDictionary<string, List<InputAction>> InputMappings => inputMappings; public static IReadOnlyDictionary<string, List<InputAction>> InputMappings => inputMappings;
public InputHandler() public void Start()
{ {
inputMappings = new Dictionary<string, List<InputAction>>(); inputMappings = new Dictionary<string, List<InputAction>>();
CreateDefaultMappings(); CreateDefaultMappings();
} }
public void Shutdown() => Dispose();
public void Dispose() => GC.SuppressFinalize(this); public void Dispose() => GC.SuppressFinalize(this);
public bool Handled { get => _handled; set => _handled = value; } public bool Handled { get => _handled; set => _handled = value; }
@@ -79,10 +87,9 @@ namespace Voile
return true; return true;
} }
protected static Dictionary<string, List<InputAction>> inputMappings = new(); protected static Dictionary<string, List<InputAction>> inputMappings = new();
private bool _handled; private bool _handled;
private Logger _logger = new(nameof(InputHandler)); private Logger _logger = new(nameof(InputSystem));
} }
public enum KeyboardKey public enum KeyboardKey
@@ -198,6 +205,8 @@ namespace Voile
RightSuper = 347, RightSuper = 347,
KBMenu = 348 KBMenu = 348
} }
[Flags]
public enum MouseButton public enum MouseButton
{ {
Left = 0, Left = 0,

View File

@@ -5,15 +5,26 @@ namespace Voile.Rendering
/// <summary> /// <summary>
/// An abstract class representing the graphics renderer. /// An abstract class representing the graphics renderer.
/// </summary> /// </summary>
public abstract class Renderer : IDisposable public abstract class RenderSystem : IStartableSystem<RendererSettings>, IDisposable
{ {
public void Start(RendererSettings settings)
{
CreateAndInitializeWithWindow(settings);
}
/// <inheritdoc/>
public void Dispose()
{
Shutdown();
GC.SuppressFinalize(this);
}
// INIT // INIT
/// <summary> /// <summary>
/// Creates the renderer window and initializes internal resources. /// Creates the renderer with an OS window and initializes internal resources.
/// </summary> /// </summary>
/// <param name="windowSettings">Settings for the rendering window.</param>
/// <param name="renderSettings">Rendering settings.</param> /// <param name="renderSettings">Rendering settings.</param>
public abstract void CreateAndInitialize(WindowSettings windowSettings, RendererSettings renderSettings); public abstract void CreateAndInitializeWithWindow(RendererSettings renderSettings);
/// <summary> /// <summary>
/// Initializes internal resources. Should be called before other methods. /// Initializes internal resources. Should be called before other methods.
/// </summary> /// </summary>
@@ -46,13 +57,6 @@ namespace Voile.Rendering
/// </summary> /// </summary>
public abstract Vector2 MonitorSize { get; } public abstract Vector2 MonitorSize { get; }
/// <inheritdoc/>
public void Dispose()
{
Shutdown();
GC.SuppressFinalize(this);
}
/// <summary> /// <summary>
/// Creates a window. /// Creates a window.
/// </summary> /// </summary>
@@ -148,6 +152,7 @@ namespace Voile.Rendering
/// <param name="tint">Texture tint.</param> /// <param name="tint">Texture tint.</param>
public abstract void DrawTexture(Texture2d texture, Color tint); public abstract void DrawTexture(Texture2d texture, Color tint);
protected Vector2 transformPosition, transformOffset; protected Vector2 transformPosition, transformOffset;
protected float transformRotation; protected float transformRotation;
} }
@@ -166,12 +171,15 @@ namespace Voile.Rendering
public bool Fullscreen; public bool Fullscreen;
public int TargetFps = 60; public int TargetFps = 60;
public WindowSettings WindowSettings;
public RendererSettings() { } public RendererSettings() { }
public static RendererSettings Default => new RendererSettings() public static RendererSettings Default => new RendererSettings()
{ {
UseVSync = true, UseVSync = true,
TargetFps = 60 TargetFps = 60,
WindowSettings = WindowSettings.Default
}; };
} }

View File

@@ -37,7 +37,7 @@ public class Container : UIElement
protected virtual void RearrangeChild(int idx, UIElement child) { } protected virtual void RearrangeChild(int idx, UIElement child) { }
protected override void OnRender(Renderer renderer) protected override void OnRender(RenderSystem renderer)
{ {
} }

View File

@@ -12,7 +12,7 @@ public class Panel : Container
Style = style; Style = style;
} }
protected override void OnRender(Renderer renderer) protected override void OnRender(RenderSystem renderer)
{ {
base.OnRender(renderer); base.OnRender(renderer);
renderer.DrawRectangle(Rect.Size, Style.BackgroundColor); renderer.DrawRectangle(Rect.Size, Style.BackgroundColor);

View File

@@ -14,7 +14,7 @@ public class TextLabel : UIElement
} }
public int FontSize { get; set; } = 16; public int FontSize { get; set; } = 16;
public Color FontColor { get; set; } = Color.White; public Color FontColor { get; set; } = Color.White;
protected override void OnRender(Renderer renderer) protected override void OnRender(RenderSystem renderer)
{ {
if (_font == null) if (_font == null)

View File

@@ -23,7 +23,7 @@ public abstract class UIElement
child.parent = this; child.parent = this;
} }
public void Render(Renderer renderer) public void Render(RenderSystem renderer)
{ {
Vector2 parentPos = parent != null ? parent.Rect.Position : Vector2.Zero; Vector2 parentPos = parent != null ? parent.Rect.Position : Vector2.Zero;
renderer.SetTransform(Rect.Position + parentPos, Vector2.Zero, 0); 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<UIElement> children; protected List<UIElement> children;
protected UIElement? parent; protected UIElement? parent;

View File

@@ -8,7 +8,7 @@ namespace Voile.SceneGraph
{ {
public class ImGuiRenderLayer : Layer public class ImGuiRenderLayer : Layer
{ {
protected override void OnDraw(Renderer renderer) protected override void OnDraw(RenderSystem renderer)
{ {
Layout(); Layout();
_controller.Draw(renderer); _controller.Draw(renderer);
@@ -27,12 +27,12 @@ namespace Voile.SceneGraph
_controller.Update(dt, Input); _controller.Update(dt, Input);
} }
protected override void OnBeginDraw(Renderer renderer) protected override void OnBeginDraw(RenderSystem renderer)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
protected override void OnEndDraw(Renderer renderer) protected override void OnEndDraw(RenderSystem renderer)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
@@ -124,7 +124,7 @@ namespace Voile.SceneGraph
io.DisplaySize = size / _scaleFactor; io.DisplaySize = size / _scaleFactor;
} }
public void Update(double dt, InputHandler input) public void Update(double dt, InputSystem input)
{ {
ImGuiIOPtr io = ImGui.GetIO(); ImGuiIOPtr io = ImGui.GetIO();
@@ -137,7 +137,7 @@ namespace Voile.SceneGraph
ImGui.NewFrame(); ImGui.NewFrame();
} }
private void UpdateKeyboard(InputHandler input) private void UpdateKeyboard(InputSystem input)
{ {
ImGuiIOPtr io = ImGui.GetIO(); 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(); ImGuiIOPtr io = ImGui.GetIO();
@@ -317,7 +317,7 @@ namespace Voile.SceneGraph
Rlgl.rlEnd(); Rlgl.rlEnd();
} }
public void Draw(Renderer renderer) public void Draw(RenderSystem renderer)
{ {
ImGui.Render(); ImGui.Render();
RenderCommandLists(ImGui.GetDrawData()); RenderCommandLists(ImGui.GetDrawData());

View File

@@ -2,11 +2,11 @@
## Core ## 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. - 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. - Add documentation for common classes.
- Hot reloading - Hot reloading of resources.
## I/O ## I/O