# Voile MVP

## Bugfixes

- ActionJustPressed and KeyboardKeyJustPressed don't detect inputs consistently.
  - **Solution**: This is a problem related to custom frame pacing for fixed timestep. Raylib polls input in BeginFrame, which means certain functions related to JustPressed* may work incorrectly when polled in a separate timestep. This can be fixed if the entire input system will be moved to SDL or with a custom render + input backend altogether.
- ~~Fix any remaining bugs with anchor positioning system.~~
  - ~~Containers don't position their chilren correctly when using anchors and adding/removing them.~~

## Core

- ~~Add and implement interfaces for systems (ISystem, IUpdatableSystem, etc.)~~
- ~~Minimize amount of possible null references.~~
- ~~TextDataResource providing a convenient wrapper around TOML data files.~~
- ~~Add documentation for common classes.~~
- ~~Hot reloading of resources.~~
- Separate render and update thread.

## I/O

- ~~Use GUIDs and string ID maps for fetching resources instead of string IDs alone.~~
- ~~Reimplement unloading.~~
- Finalize ResourceManager and ResourceLoader APIs for 1.0.
- Add async API for ResourceManager.
- ~~Virtual file system.~~
- Custom PAK format using the VFS implementation.
- (stretch goal) Streamed resource loading.

## Serialization

- Serialize attribute.
- Add automatic serialization of resources through source generation and System.Text.Json.
  - Make sure this serialization system works well with CLR and NativeAOT.
- ~~Provide means for fetching key/value configuration (INI? TOML?)~~
  - Expose some sort of ConfigFile class for safe key/value configuration fetching.

## Rendering

- ~~API for drawing textured quads~~
- ~~Camera API~~
- Arbitrary mesh rendering API.
- Create WebGPU renderer (StandardRenderSystem)

## Audio

- Use SoLoud as a default sound engine.
- Integrate FMOD.

## Misc

- ~~Asset manager~~
- ~~Separate engine and game into separate projects~~
- ~~Particle system 2.0~~
  - ~~Reduce the size of Particle struct by infering most parameters through lifetime.~~
  - ~~Reduce cache misses by utilizing SoA.~~
  - ~~SIMD acceleration.~~
  - ~~Creating and removing emitters.~~

## SceneGraph module

- Full overhaul using Entity Component architecture (not to be mistaken with ECS).
- Layers (sorting mechanism)
- Save/load scenes from file

## Input

- ~~Action system~~
- Nicer input mapping API using code.
- Make action system use an InputMap resource instead.
- Gamepad support

## Diagnostics

- Implement Profiler class.
- Generate a Speedscope report.
- Collect reports for systems
  - Game
  - Render
  - Audio
  - ResourceManager
  - UI
  - Particles

## UI

- ~~Layout~~
  - ~~Containers~~
    - ~~VerticalContainer~~
    - ~~HorizontalContainer~~
    - ~~GridContainer~~
    - ~~FlexContainer~~
  - ~~Positioning (anchors)~~
- ~~Move layouting to Render instead of Update, use Update for input.~~
- Input propagation
  - ~~Pass input to widgets.~~
  - Add element focus logic, make them focusable with action inputs.
- Basic input elements (~~button~~, text field, toggle).
- Styling
  - ~~Style sheet~~
  - ~~Add style settings for UI panels (for buttons, labels, etc.).~~
  - ~~Parse StyleSheet from TOML file.~~
  - Animated styles
  - (stretch goal) Style variables
  - Find a way to reference external assets in the style (fonts, textures).
  - Create a default style for widgets.
