#+AUTHOR:Shariq Shah
#+EMAIL:bluerriq@gmail.com
#+TITLE:Project Symmetry
* Project Symmetry

** What?
A topdown 2D shooter exploring symmetry.

** License
All the code in this repository is under GPLv3, see LICENSE for more information

** File format specifications
*** Entity
# Comment, Sample entity definition in file, paremeters left out are set to defaults
# Empty line at the end specifies end of entity definition
entity:   "Something"
position: 0 0 0
scale:    1 1 1
rotation: 0 0 0 1
model:    "suzanne.pamesh"
material: "blinn_phong"
diffuse_color: 1 0 0 1
diffuse_texture: "checkered.tga"
specular: 0.55

*** Configuration Variables a.k.a cfg-vars
# Comment
render_width: 1024
render_height: 1024
debug_draw_enabled: true
fog_color: 0.5 0.2 0.2 1
# There can be comments or empty newlines in between unlike entity definitions

ambient_light: 0.1 0.1 0.1 1
msaa: true
msaa_levels: 8

*** Keybindings
# All keys are parsed by comparing the output of SDL_GetKeyname
# Each line represents a keybinding
Move_Forward: W

# Multiple keys to a single binding are specified with commas
Move_Backward: S,Down

# Combinations are specified with a hyphen/dash
# When specifing combinations, modifiers(shift, alt, ctrl) always come before
# the hyphen and the actual key comes afterwards. At the moment modifier keys are
# forced to be on the left side i.e. Left Control, Left Shift and Left Alt.
Quit: Left Ctrl-Q

# Single modifier keys are allowed but multiple modifier keys without corresponding
# non-modifier key are not allowed
Sprint: Left Shift

*** Level/Scene
*** Materials
*** Mesh/Geometry
** Notes on entity Systems
- Fat entites with all related properties, i.e. position, mesh etc in them. Easy to serialize, memory friendly, simple to implement
  but would require significant changes to the current codebase. e.g.
  struct Entity
  {
      int   type;
      char* name;
      struct Transform {....};
      struct Camera {....};
      
      // Separate properties unique to entity types by using unions
      struct Renderable
      {
          struct Model {....};
          union
          {
              struct Player
              {
                  int score;
                  int bullets;
              };
  
              struct Enemy
              {
                  int target;
              };
          }
      }
  };
- Change component implementation by using anonymous unions to simulate interfaces. e.g
  struct Component
  {
      int type;
      union
      {
          struct Transform {....};
          struct Model {....};
          struct Camera {....};
      }
  }
- Use handles for assets
- Use something similar to Variant to use as entity, not sure what or how
- Don't forget to think of the actual use-case and usage when coming up with a solution, don't build castles in the air!

* Things TODO
** DONE Input
   - State "DONE"       from "TODO"       [2015-07-02 Thu 01:24]
- Input maps (addition/removal)
- Adding removing keys to input maps
- Changing map na
** DONE Shaders
   - State "DONE"       from "TODO"       [2015-07-11 Sat 17:57]
- set asset folder
- load/compile shader
** DONE Geometry
   - State "DONE"       from "TODO"       [2015-07-11 Sat 17:57]
** DONE change struct usage 
   - State "DONE"       from "TODO"       [2015-07-21 Tue 15:13]
** DONE change Array implementation
   - State "DONE"       from "TODO"       [2015-07-25 Sat 20:27]
** DONE resolve vec-types sizes
   - State "DONE"       from "TODO"       [2015-07-25 Sat 20:27]
** DONE Transform
   - State "DONE"       from "TODO"       [2015-07-26 Sun 18:01]
** DONE Deltatime
   - State "DONE"       from "TODO"       [2015-07-27 Mon 11:54]
** DONE Investigate about Exit() and at_exit() functions and whether to use them or not.
   - State "DONE"       from "TODO"       [2015-08-02 Sun 19:09]
** DONE Fix readme markdown
- State "DONE"       from "TODO"       [2015-12-10 Thu 16:36]
** DONE Framebuffer and resolution independent rendering
- State "DONE"       from "TODO"       [2016-05-27 Fri 18:02]
** DONE A simpler build system without dependencies
- State "DONE"       from "TODO"       [2016-05-27 Fri 14:50]
** DONE Remove dependencies
- State "DONE"       from "TODO"       [2017-02-26 Sun 01:46]
- glfw3
- glew
** DONE Remove Kazmath dependency
- State "DONE"       from "TODO"       [2015-12-10 Thu 16:36]
** DONE Entity
- State "DONE"       from "TODO"       [2015-09-15 Tue 12:17]
** TODO Positive and negative values for input_maps and returning corresponding values when they are true
** DONE Find a permanent solution for build system
- State "DONE"       from "TODO"       [2017-03-15 Wed 00:59]
** TODO Text rendering using freetype or stb lib
** DONE Textures
- State "DONE"       from "TODO"       [2015-10-09 Fri 18:47]
** DONE Camera
- State "DONE"       from "TODO"       [2015-08-19 Wed 13:30]
** DONE Test render
- State "DONE"       from "TODO"       [2015-08-19 Wed 13:30]
** TODO Bounding Boxes
- Recalculated bounding boxes for rotated meshes?
** DONE Fix input lag and other framerate related issues
- State "DONE"       from "TODO"       [2017-05-07 Sun 18:40]
** TODO File extension checking for asset loading
** DONE Materials
- State "DONE"       from "TODO"       [2015-10-13 Tue 19:38]
** DONE Mesh/Model
- State "DONE"       from "TODO"       [2015-10-13 Tue 19:38]
** DONE Add modifiers to input maps to enable combinations for example, c-x, m-k etc
- State "DONE"       from "TODO"       [2017-05-20 Sat 21:54]
** TODO Only allocate hashmap bucket when required
** TODO Mapping actions to keybindings, for example map action "Jump" to Space key etc
** DONE Heirarchical Transforms
** DONE Materials with textures
- State "DONE"       from "TODO"       [2015-10-15 Thu 21:21]
** DONE Lights!
- State "DONE"       from "TODO"       [2017-03-14 Tue 00:31]
** DONE Fix problems with texture units
- State "DONE"       from "TODO"       [2016-05-30 Mon 00:57]
** CANCELED Draw light volumes
- State "CANCELED"   from "TODO"       [2017-02-26 Sun 15:39] \\
  Deferred rendering on hold for now.
** DONE Fix problems with frustrum culling 
- State "DONE"       from "TODO"       [2017-03-26 Sun 01:33]
** TODO 2d drawing routines
- Sprite batching
** DONE Gui
- State "DONE"       from "TODO"       [2017-03-15 Wed 23:41]
** CANCELED Image based lighting?
- State "CANCELED"   from "TODO"       [2017-03-14 Tue 00:31] \\
  Not a requirement for current project
** CANCELED Deferred rendering?
- State "CANCELED"   from "TODO"       [2017-02-26 Sun 01:49] \\
  Sticking with forward rendering for now and focusing on tools etc.
** DONE Fix mouse bugs on windows
- State "DONE"       from "TODO"       [2017-03-25 Sat 17:27]
** DONE Configuration/Settings load/save handling
- State "DONE"       from "TODO"       [2017-05-20 Sat 21:54]
** DONE Fix mousewheel bugs and gui not responding to mousewheel input
- State "DONE"       from "TODO"       [2017-03-19 Sun 01:31]
** TODO Ability to mark meshes for debug rendering with possibility of different color for each?
** DONE Setup cross compilation with mingw or stick to msvc?
- State "DONE"       from "TODO"       [2017-05-20 Sat 21:55]
- Done, going with mingw for now.
** TODO Add marking or queuing up custom meshes for debug render with particular transform and color for rendering bounding spheres for example
** DONE Toggleable debug drawing for meshes
- State "DONE"       from "TODO"       [2017-03-18 Sat 16:18]
** TODO Interleaved vbos for meshes and changes to blender exporter accordingly
** TODO Enumerate and save all the uniform and attribute positions in shader when it is added and cache them in shader object?
** TODO Physics/Collision detection in 2d
** TODO Complete gui integration
x Font selection
x Font atlas proper cleanup
- Decoupled event handling of gui and input if possible
- Custom rendering for gui
** TODO Allow passsing base path as commandline argument?
** TODO Remove components and switch to "Fat Entities" i.e. one entity struct contains all combinations
** TODO Use variants for material params
** DONE In second refactor pass, use entities everywhere, no need to pass in transform and model separately for example since they're both part of the same entity anyway
- State "DONE"       from "TODO"       [2017-05-31 Wed 21:44]
** DONE Show SDL dialogbox if we cannot launch at all?
- State "DONE"       from "TODO"       [2017-05-26 Fri 00:41]
** DONE Writing back to config file
- State "DONE"       from "TODO"       [2017-05-08 Mon 00:57]
** DONE Reading from config file
- State "DONE"       from "TODO"       [2017-05-07 Sun 23:52]
** DONE Variant -> String conversion procedure. Use in editor for debug var slots
- State "DONE"       from "TODO"       [2017-05-07 Sun 18:43]
** DONE Add strings and booleans to variant types
- State "DONE"       from "TODO"       [2017-03-29 Wed 00:23]
** DONE Fix Key release not being reported
- State "DONE"       from "TODO"       [2017-03-26 Sun 01:16]
** TODO Better handling incase assets folder is not found?
** DONE OpenAL not working in releasebuilds
- State "DONE"       from "TODO"       [2017-03-25 Sat 02:06]
** DONE 3d sound using OpenAL
- State "DONE"       from "TODO"       [2017-03-23 Thu 01:43]
** TODO Ogg format loading and playback
** TODO Stick with OpenAL or switch to SoLoud + SDL for sound?
** TODO Sound streaming
** TODO Implment missing sound source properties (inner/outer cone, getting sound source data)
** TODO Ingame console and console commands etc
** TODO Allow binding/unbinding input maps to functions at runtime, for example if input map "Recompute" is triggered, it would call some function that can recompute bounding spheres.
** TODO Better handling of wav format checking at load time
** DONE Fix frustum culling bugs
- State "DONE"       from "TODO"       [2017-05-31 Wed 23:38]
** DONE Array-based Hashmaps
- State "DONE"       from "TODO"       [2017-05-07 Sun 18:42]
** TODO Sprite sheet animations
** DONE Fix bugs with heirarchical transformations
- State "DONE"       from "TODO"       [2017-06-01 Thu 00:20]
** TODO Replace orgfile with simple text readme and reduce duplication?
** TODO Ray picking
** TODO Remove reduntant "settings" structures and move all configuration stuff to config variables
** TODO Shadow maps
** DONE Log output to file on every run
- State "DONE"       from "TODO"       [2017-05-26 Fri 00:41]
** TODO Print processor stats and machine capabilites RAM etc on every run to log.
** TODO Milestone: Pong!
- In order to put things into perspective and get a feel for what really needs to be prioritized, a very small but actual game release is necessary.
- Release platforms: Windows and Linux
- Makefile additions. Try to compile game as a dynamically loaded library with ability to reload on recompile
- Separation between game and engine base
? Game .so with init, update and cleanup functions
x Configuration files and "cvars" load/reload
x Keybindings in config
x Log output on every run.
- Implement entity load/save to file
? Prefab load/save to file
** TODO Do input maps really need to be queried by their string names?
** TODO Reloading all the things! (textures/shaders/models/settings/entities etc)
** TODO Separate Debug/Editor camera from the active camera in the scene that can be switched to at any time
** TODO Make logging to file and console toggleable at complie-time or run-time
** DONE Add option to specify where to read/write files from instead of being hard-coded assets dir
- State "DONE"       from "TODO"       [2017-05-24 Wed 17:12]
** TODO Add default keybindings
** TODO Write default config/keybindings etc to file if none are found in preferences dir
** DONE Fix input map bugs
- State "DONE"       from "TODO"       [2017-05-31 Wed 23:19]
** TODO Wrap malloc and free calls in custom functions to track usage
** TODO Flatpak packaging for linux releases
** TODO Use hashmap for debugvar slots in editor
** TODO Use hashmap to store input maps
** DONE Live data views in editor
- State "DONE"       from "TODO"       [2017-03-22 Wed 02:14]
** DONE Camera resize on window reisze
- State "DONE"       from "TODO"       [2017-03-20 Mon 15:22]
** DONE Resizable framebuffers and textures
- State "DONE"       from "TODO"       [2017-03-16 Thu 22:50]
** DONE Support for multiple color attachments in framebuffers?
- State "DONE"       from "TODO"       [2017-03-16 Thu 22:51]
** TODO Multisampled textures and framebuffers
** DONE Better way to store and manage textures attached to framebuffers
- State "DONE"       from "TODO"       [2017-03-16 Thu 22:51]
** TODO Validate necessary assets at game launch
** TODO Gamma correctness
** DONE Variant type
- State "DONE"       from "TODO"       [2017-03-22 Wed 02:14]
** TODO Log and debug/stats output in gui
** TODO Editor
** TODO Event Subsystem
** TODO Keybindings for gui?
** TODO Textual/Binary format for data serialization and persistance 
** TODO Better logging
** TODO Hatching/Ink rendering style
** DONE Fix frustum culling sometimes not working
- State "DONE"       from "TODO"       [2017-03-25 Sat 19:10]
** DONE Compile and test on windows
- State "DONE"       from "TODO"       [2017-03-14 Tue 00:32]
** TODO Array based string type comptible with cstring(char*)
** TODO Separate game, engine and assets into different repositories. Combine as sub-repositories
** DONE Fix mouse bugs
- State "DONE"       from "TODO"       [2017-03-01 Wed 00:45]
** DONE Fix
** DONE issues with opengl context showing 2.1 only
- State "DONE"       from "TODO"       [2017-03-19 Sun 14:03]
- State "DONE"       from "TODO"       [2017-02-26 Sun 15:39]
** TODO Improve this readme
** TODO ???
** TODO Profit!
