
Build System:
    ☐ Modify build script to output fail or success messages based on build result
        ✔ Complete for batch script @done(22-05-09 18:57)
        ☐ Complete for shell script
    ✔ Add a build option to do a build without the editor @done (9/17/2021, 7:25:08 PM)
    ✔ Modify .sh scripts to recognize the noeditor flag @done (1/25/2022, 3:59:23 PM)

Core:
    ☐ Create log rotation system so that log files do not grow to GB in size... @critical
        - If file is X MBs, check for file with .old ext and erase if exists, .old to current file and create new log file
    ☐ Figure out how to represent Unique Entities and entity instances - and how this will work with UUIDs @critical
        ☐ Design Entity Template system
    ✔ Implement generic serialization system @done(22-06-29 18:44)
        ✔ JSON serializable base class @done(22-06-29 17:41)
            ✔ JSON implementions should be stubbed out in non-editor builds @done(22-06-29 17:41)
        ✔ Binary serializable base class @done(22-06-29 18:44)
    ✔ Wrap NFD in an API in the platform module @low @done(22-05-31 15:44)
        Wrapper added to utils - not platform
    ✔ Add custom (64 bit?) UUID generator (based on Chreno's UUIDs) @done(22-06-27 13:34)
    ✔ Allow Entities to have children @medium @done(22-07-06 17:54)
    ✔ Add Terminal subsystem to allow for printing colored text in a cross-platform way @done(22-05-16 18:05)
        ✔ Create a LogListener that uses the colored text (replace the current stdout listener) @done(22-05-16 18:23)
    ✔ Replace XML with JSON (https://github.com/nlohmann/json) @high @done(22-05-19 15:35)
    ✔ Move internal libs back into the core and refactor @high @done(22-05-17 14:27)
        ✔ Utils @done(22-05-13 17:29)
        ✔ assets @done(22-05-17 14:27)
        ✔ gui @done(22-05-17 14:27)
    ✔ Replace the File Browser (imgui) class with the NFD library (https://github.com/btzy/nativefiledialog-extended) @high @done(22-05-23 16:00)
    ☐ Add log settings to the state file
    ✔ Refactor log system to use separate log level methods instead of passing log level @done(22-05-12 16:46)
    ✔ Add log level options to config script @done(22-05-12 16:46)
    ✔ Add run modes (Editor, Game, Test) to state file @done (9/15/2021, 7:27:03 PM)
    ✔ Add run mode interface class @done (9/15/2021, 8:22:35 PM)
    ✔ Read the window size and position on shutdown and write these to the state file @done (2/8/2022, 4:39:37 PM)
    
Graphics:
    ☐ Implement parent transform for all draw methods
        ☐ Ellipse
        ☐ Lines
        ☐ Text

    Re-write the renderer:
        ✔ Implement BeginScene and EndScene - these are called from the World OnRender @done(22-09-07 14:47)
        ✔ Organize Buffers @done(22-09-07 14:47)
        ✔ Better FrameBuffer system @done(22-09-07 14:47)
        ✔ Texture class - Does NOT load from files - takes raw data to construct @done(22-09-07 14:47)
        ✔ Add view matrix to the shader @critical @done(22-09-07 14:47)
        ✔ Remove projection matrix from the renderer internals @critical @done(22-09-07 14:47)
        ✔ Move the openGL reference out of the Image class (OpenGL ID) and make the ID more generic @done(22-09-07 14:47)
            ✔ Add layer to interface API for setting the Images ID in a generic way @done(22-09-07 14:47)
        ✔ Implement batch rendering @high @done(22-09-07 14:45)
            ✔ Allow vertices to be submitted before rendering @done(22-09-07 14:45)
            ✔ Add texture sampler id to the vertex layout @done(22-09-07 14:45)
    ✔ Decide on a font/text rendering system @done (9/7/2021, 1:39:53 PM)
    ✔ Add FreeType to the project @done (9/7/2021, 2:23:13 PM)
    ✔ Add a new class for font loading/management and text rendering @done (9/7/2021, 3:57:08 PM)
    ✔ Make the text renderer smarter about breaking up words on multiple lines @low @done (9/8/2021, 2:23:03 PM)
    ✔ Implement the Image creation methods @done (9/9/2021, 2:50:20 PM)
    ✔ Implement Render to Texture @done (9/15/2021, 7:00:33 PM)
    ✔ Adjust the font loading code to use the binary file buffer instead of ifstream @done (9/17/2021, 6:11:06 PM)
    ✔ Find a way to add rotation to shapes and images @done (10/29/2021, 7:35:14 PM)
    ✔ Add a DrawPolygon method that takes vertices and draws arbirary shapes @done (10/29/2021, 6:24:14 PM)
    ✘ Allow DrawPolygon to add a texture to the polygon @low @cancelled(22-09-07 14:48)
    ✔ Refactor the drawing code to allow for rotation with cleaner code @high @done (10/29/2021, 8:36:24 PM)
    ✔ Test rotation of images @done (11/1/2021, 2:11:13 PM)
    ✔ Fix line rotation @low @done (2/8/2022, 4:39:25 PM)
    ✔ Add Roboto-Regular.ttf as an internal font @high @done (11/3/2021, 8:35:51 PM)
    ✔ Allow an image size to be passed in for rendering to an image @high @done (2/3/2022, 4:07:33 PM)

GUI:
    ✔ Improve the GUI API! @done(22-09-07 14:48)
        ✔ Implement a better way to handle popup windows and context menus @done(22-09-07 14:48)
    ✔ Dear ImGui class with basic initialization @done (9/10/2021, 1:42:19 PM)
    ✔ Debug log window @done (9/10/2021, 4:44:48 PM)
    ✔ Add key to show debug log window @done (9/13/2021, 6:47:44 PM)
    ☐ Add checkboxes to disable log categories and levels
    ✔ Add LUA Console window @done (10/26/2021, 4:43:41 PM)
    ✔ Improve the interfaces for the Lua Editor and Console (partial transparancy for one thing) @high @done(22-06-23 15:54)
    FileBrowser:
        ✔ Allow opening of listed directories @done (11/8/2021, 3:16:26 PM)
        ✔ Add indication that an item is directory @done (11/8/2021, 6:19:20 PM)
        ✔ Sort items by type (Directories should come first) @done (11/8/2021, 6:26:01 PM)
        ✔ Allow the user to type in a filename @done (11/9/2021, 3:26:16 PM)
        ✔ Add a "New Directory" button @done (11/8/2021, 7:15:51 PM)
        ✔ Selected files should show up in the text box @done(22-04-18 13:33)

Scripting:
    ✔ Switch to Wren instead of LUA (https://github.com/wren-lang/wren) @high @done(22-11-02 18:56)
        ✔ Remove SOL @done(22-11-02 18:56)

    ✔ Script Asset @done(22-11-14 18:19)
        
    Script Managment class:
        ✘ Manage LUA states @cancelled(22-05-13 17:31)
        ☐ Initialize new scripts
        ☐ Run given script with given state
        ☐ Add any generated errors to the Script object
    
    Interface Class (Core API):
        ☐ Provide Methods that give access to the C++ code

ECS:
    ✔ Figure out how to serialize Entities @done(22-06-28 14:16)
        - Looks like we just need to if check for each component an entity could have...
    ✔ Research EnTT for the ECS (https://github.com/skypjack/entt/) @done(22-06-01 14:01)
    ✔ Research using ECS with a quadtree (regions may essentially be a quadtree) @done(22-06-01 14:01)
        ☐ Use 1 Entt registry with a component that stores the region ID (Index?)

    Enitity:
        ✔ Single UUID @done(22-06-01 14:01)
        ✔ Functionality for adding/working with components (through EnTT) @done(22-06-01 14:01)
        ☐ Serialize
            ☐ JSON
            ☐ Binary

    Components:
        ✔ Tag @done(22-06-23 15:49)
        ✔ Transform @done(22-09-07 14:49)
        ✔ Velocity @done(22-09-07 14:49)
        ✔ Camera @done(22-09-07 14:49)
        ✔ BlockOut @done(22-09-08 15:41)
        ☐ SpriteRenderer
        ☐ Animation Controller
        ✔ Script @done(22-11-14 18:19)
        ☐ Audio Listener
        Physics:
            ☐ Rigid Body (Box2D)
            ☐ Box Collider (Box2D)  
    
World (Lunariums version of a "Scene"):
    ☐ Add Render layer property to all renderable components
    ✔ Implement memento pattern to save the initial state of the world @done(22-11-14 18:19)
    ✔ Implement running the world and resetting to initial state @done(22-11-14 18:19)
    ✔ Implement the world without Regions first @done(22-11-14 18:20)
    ✔ Serialize world @done(22-07-06 18:33)
        ✔ JSON @done(22-07-06 18:33)
        ☐ Binary

    Implement Regions:
        ☐ Track/manage active regions
        ☐ Render active Regions

    Region:
        ☐ List of renderable images for each layer
        ☐ List of entities (by entt id) in this Region
        ☐ Implement image grid within regions
            [Regions could potentially be split into multiple images (an internal grid). 
            To support larger region sizes without needing single images that are like 1048576x1048576 or some nonsense.]

Input:
    ✔ Port over the Element2D input system and adjust it to use glfw @done (9/8/2021, 8:20:07 PM)
    ✔ Add the InputManager to the core @done (9/9/2021, 2:57:06 PM)

Physics:
    ✔ Research Box2D as a possible physics library @done (10/27/2021, 7:40:44 PM)
    ✔ Add Box2D to the project as an external library @done (10/27/2021, 7:40:46 PM)
    ✔ Add a scene to the tester to test Box2D usage @done (10/28/2021, 2:42:45 PM)
    ☐ Come up with a way to wrap Box2D into an API

Audio:
    ☐ Research the usage of OpenAL
    ☐ Add OpenAL to the project
    ☐ Design Audio API


Utils:
    ✔ Make Logger fully static (no need to ever GetInstance) @done (10/26/2021, 4:43:55 PM)
        ✔ Need to add a static initialize method @done (10/26/2021, 4:43:57 PM)
    ☐ Add a templated return value to the OK variant of OpRes @low
        

Assets:
    ✔ Internal Asset Manager @high @done (1/25/2022, 3:58:20 PM)
        ☐ Document Index.Dat and the AssetIndex class
    ✔ Move the GenerateFont method from internal_font.h into data_manager.h @done(22-06-29 17:42)

    Types:
        - Classes that represent each resource Types
        ✔ Image class @done (9/16/2021, 2:46:34 PM)
            ✔ Decouple Image class from OGLRenderer @high @done (10/27/2021, 7:41:50 PM)
        ☐ Font class
        ☐ Sound class
        ✔ Script class @done (1/25/2022, 3:58:28 PM)

    Loaders:
        - Need class (or classes?) to load resources from the packed format that the pipeline generates
        Come up with binary file formats for each type:
            ☐ .json (This will probably be multiple different formats depending on what the .json file is describing)
            ☐ Image
            ☐ Script
            ☐ Audio

    Asset Pipeline:
        ☐ Read through the contents folder and generate asset files in a custom format (useable by the engine)

Testbed:
    - A special class that is used to unit-test features of the engine
    ✔ Implement Run Mode interface class @done (10/25/2021, 7:37:00 PM)
    ✘ Needs a timer to keep track of how long a test has run @cancelled (10/26/2021, 4:36:45 PM)
    ✘ Main Tick method should use the timer to determine when to switch to the next test @cancelled (10/26/2021, 4:36:16 PM)
    ✔ Add function for testing render to Texture @done (10/26/2021, 4:35:52 PM)
    ✔ Add function for testing input @done (10/26/2021, 4:36:05 PM)
    ✔ Add function for testing text rendering @done (10/26/2021, 4:35:54 PM)
    ✔ Add function for testing shape drawing @done (10/26/2021, 4:35:58 PM)
    ✔ Add function for testing image drawing @done (10/26/2021, 4:36:00 PM)
    