From 3b47739e8224e5b26a70f5fde4f6167dbebca8e4 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Sat, 27 Feb 2016 12:10:57 -0500 Subject: TODO: Move completed tasks into archive section. --- TODO.org | 320 +++++++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 221 insertions(+), 99 deletions(-) (limited to 'TODO.org') diff --git a/TODO.org b/TODO.org index 4e1e4f7..7c88c7b 100644 --- a/TODO.org +++ b/TODO.org @@ -97,12 +97,156 @@ ** TODO [#C] Instanced rendering A nice optimization when rendering the same mesh a bunch of times. +* Improvements + +** TODO [#A] Implement , , , and as packed f64 bytevectors + Currently, it's expensive to use these types when performing OpenGL + operations such as writing to vertex buffer objects because Guile + does scm->f64 conversions before writing to a bytevector. To take + advantage of Guile 2.2's float unboxing, we can implement these + types as a record type with one field: a bytevector. The + bytevector will store all of the fields packed together. To take + advantage of unboxing, the procedures that get/set these "fields" + should be inlined. + +** TODO [#B] Clean up imperative rendering API + The functional, monadic rendering API is nice and clean, but the + low-level imperative API is very messy. Perhaps it could use some + syntactic sugar for all of the "call-with-foo" forms. Also, a + naming convention needs to clearly differentiate procedures/macros + in the imperative API from those in the high-level API. + Originally, I didn't expect users to really ever have to use the + imperative API, but the introduction of sprite batches has made me + realize that writing custom low-level rendering routines will be + common enough to merit a nice API. + +** TODO [#B] Treat shaders like procedures + One can view a draw call as the application of a shader program. + The arguments to the shader program are uniforms and vertices. + +** TODO [#B] Use uniform buffer objects + Uniform buffer objects allow setting many uniform values at once, + rather than performing a GPU call for each, which results in better + performance. + +** TODO [#C] inotify-based live reloading + Better than periodically making 'stat' calls in a loop. + +* Documentation + +** TODO Document rendering API + I can't settle on a rendering API, so I haven't bothered making + good docs for it. Once the above rendering tasks are complete, + it's probably safe to write docs. + +** TODO Write a tutorial + Walk a beginner through the basic features of Sly and establish a + simple development workflow. + + - Start the game loop + - Render a sprite + - Move the sprite + - Live hack + +* Bugs + +* Releases + +** DONE 0.1 Release + A 0.1 release was made under the project's old name, guile-2d. Now + that things have changed so drastically and the name has been + changed, a new 0.1 release will be made. + + - [X] New REPL server + Use the (system repl coop-server) module in Guile 2.0.11. + - [ ] Screencast + - [-] Relatively complete documentation (it's a start) + - [X] Clean up font module + - [X] Add GLSL shaders + - [X] Finish FRP module + - [X] Make basic webpage with HTML docs + - [X] Basic rendering (must support sprites and text) + +* Archived Tasks + ** DONE [#A] Game loop + :PROPERTIES: + :ARCHIVE_TIME: 2016-02-27 Sat 12:07 + :ARCHIVE_FILE: ~/Code/sly/TODO.org + :ARCHIVE_OLPATH: Features + :ARCHIVE_CATEGORY: TODO + :ARCHIVE_TODO: DONE + :END: Provide a game loop structure that responds to input events, updates the game state, renders the scene. Use a fixed update timestep and cap the maximum FPS. +** DONE [#A] Allow modules to declare state via signals, including OpenGL resources + :PROPERTIES: + :ARCHIVE_TIME: 2016-02-27 Sat 12:07 + :ARCHIVE_FILE: ~/Code/sly/TODO.org + :ARCHIVE_OLPATH: Improvements + :ARCHIVE_CATEGORY: TODO + :ARCHIVE_TODO: DONE + :END: + This is a tricky one. The major headache with my Lisp Game Jam + attempt was that the signal framework had to be abandoned + *everywhere* except the top-level environment of the script that + starts the game loop. The reason for this was that the game state + typically required that the SDL window was opened and the OpenGL + context was available in order to work. Thus, at the top-level, we + first had to open a window and only then could we define signals. + The goal here would be to eliminate this major restriction so that + a game can be factored into many Guile modules and still declare + time varying state with signals. One important consequence here is + that all OpenGL resources *must* be declared as signals that wait + for the game loop to start before loading. + +** DONE [#A] Implement sprite batch in terms of a mesh + :PROPERTIES: + :ARCHIVE_TIME: 2016-02-27 Sat 12:07 + :ARCHIVE_FILE: ~/Code/sly/TODO.org + :ARCHIVE_OLPATH: Improvements + :ARCHIVE_CATEGORY: TODO + :ARCHIVE_TODO: DONE + :END: + Fix code that assumes meshes to be static, allowing for the dynamic + sprite batch use-case. + +** DONE [#A] Pure Scheme 4x4 matrix multiplication implementation + :PROPERTIES: + :ARCHIVE_TIME: 2016-02-27 Sat 12:07 + :ARCHIVE_FILE: ~/Code/sly/TODO.org + :ARCHIVE_OLPATH: Improvements + :ARCHIVE_CATEGORY: TODO + :ARCHIVE_TODO: DONE + :END: + Guile 2.1.2's float unboxing optimizations should enable this to be + both fast and not allocate so much. The GSL dependency can be + removed (yay!) once this is complete. Be sure to use Guile's ,x + metacommand to view the disassembly to ensure that the necessary + optimizations are indeed being used. + +** DONE [#B] Use a single OpenGL resource guardian structure + :PROPERTIES: + :ARCHIVE_TIME: 2016-02-27 Sat 12:07 + :ARCHIVE_FILE: ~/Code/sly/TODO.org + :ARCHIVE_OLPATH: Improvements + :ARCHIVE_CATEGORY: TODO + :ARCHIVE_TODO: DONE + :END: + This will deduplicate code amongst all Scheme data types that wrap + OpenGL resources, because right now each one uses its own separate + guardian. + ** DONE [#A] Input + :PROPERTIES: + :ARCHIVE_TIME: 2016-02-27 Sat 12:07 + :ARCHIVE_FILE: ~/Code/sly/TODO.org + :ARCHIVE_OLPATH: Features + :ARCHIVE_CATEGORY: TODO + :ARCHIVE_TODO: DONE + :END: Provide hooks to respond to keyboard, mouse, and joystick events. Wrap SDL keycode, mouse button, etc. constants in our own enumeration. @@ -113,6 +257,13 @@ - [X] Joystick ** DONE [#A] Sprites + :PROPERTIES: + :ARCHIVE_TIME: 2016-02-27 Sat 12:07 + :ARCHIVE_FILE: ~/Code/sly/TODO.org + :ARCHIVE_OLPATH: Features + :ARCHIVE_CATEGORY: TODO + :ARCHIVE_TODO: DONE + :END: Encapsulates an image and all of its transformations: position, rotation, scale, color, etc. @@ -122,6 +273,13 @@ - [X] Use a sprite batch when drawing if one is currently bound ** DONE [#A] Sprite batches + :PROPERTIES: + :ARCHIVE_TIME: 2016-02-27 Sat 12:07 + :ARCHIVE_FILE: ~/Code/sly/TODO.org + :ARCHIVE_OLPATH: Features + :ARCHIVE_CATEGORY: TODO + :ARCHIVE_TODO: DONE + :END: Efficiently render a large number of sprites. Only change OpenGL context when necessary. For example, don't change texture when rendering several sprites in a row that use the same one. @@ -132,12 +290,26 @@ - See: https://bitbucket.org/rude/love/src/d95dfb67079a60f8de64304dac9002544695f1bb/src/modules/graphics/opengl/SpriteBatch.cpp?at=default ** DONE [#A] Tilesets + :PROPERTIES: + :ARCHIVE_TIME: 2016-02-27 Sat 12:07 + :ARCHIVE_FILE: ~/Code/sly/TODO.org + :ARCHIVE_OLPATH: Features + :ARCHIVE_CATEGORY: TODO + :ARCHIVE_TODO: DONE + :END: Break an image up into many small pieces. Useful for creating maps. - [X] Algorithm to split texture into tiles - [X] type ** DONE [#A] Coroutines + :PROPERTIES: + :ARCHIVE_TIME: 2016-02-27 Sat 12:07 + :ARCHIVE_FILE: ~/Code/sly/TODO.org + :ARCHIVE_OLPATH: Features + :ARCHIVE_CATEGORY: TODO + :ARCHIVE_TODO: DONE + :END: Provide a way for users to easily script asynchronous behaviors using coroutines and a scheduler. @@ -145,6 +317,13 @@ - [X] Agenda ** DONE [#A] Vectors and matrices + :PROPERTIES: + :ARCHIVE_TIME: 2016-02-27 Sat 12:07 + :ARCHIVE_FILE: ~/Code/sly/TODO.org + :ARCHIVE_OLPATH: Features + :ARCHIVE_CATEGORY: TODO + :ARCHIVE_TODO: DONE + :END: Vectors and matrices are needed constantly for games. Provide an easy-to-use module that provides procedures for common vector/matrix math operations @@ -153,13 +332,34 @@ - [X] Matrices ** DONE [#A] Fonts + :PROPERTIES: + :ARCHIVE_TIME: 2016-02-27 Sat 12:07 + :ARCHIVE_FILE: ~/Code/sly/TODO.org + :ARCHIVE_OLPATH: Features + :ARCHIVE_CATEGORY: TODO + :ARCHIVE_TODO: DONE + :END: - [X] Write wrappers for needed FTGL functions - [X] Write font rendering procedures ** DONE [#A] Sound + :PROPERTIES: + :ARCHIVE_TIME: 2016-02-27 Sat 12:07 + :ARCHIVE_FILE: ~/Code/sly/TODO.org + :ARCHIVE_OLPATH: Features + :ARCHIVE_CATEGORY: TODO + :ARCHIVE_TODO: DONE + :END: Provide helpful wrappers around SDL sound procedures? ** DONE [#A] REPL + :PROPERTIES: + :ARCHIVE_TIME: 2016-02-27 Sat 12:07 + :ARCHIVE_FILE: ~/Code/sly/TODO.org + :ARCHIVE_OLPATH: Features + :ARCHIVE_CATEGORY: TODO + :ARCHIVE_TODO: DONE + :END: Provide a REPL that plays nice with the game loop. Easier said than done. @@ -172,111 +372,33 @@ - Will be available in Guile 2.0.10! ** DONE [#A] Upgrade to SDL2 + :PROPERTIES: + :ARCHIVE_TIME: 2016-02-27 Sat 12:07 + :ARCHIVE_FILE: ~/Code/sly/TODO.org + :ARCHIVE_OLPATH: Features + :ARCHIVE_CATEGORY: TODO + :ARCHIVE_TODO: DONE + :END: - Write necessary bindings and release [[https://git.dthompson.us/guile-sdl2.git][guile-sdl2]]. - Replace freeimage with sdl_image 2.0 ** DONE [#B] Animations + :PROPERTIES: + :ARCHIVE_TIME: 2016-02-27 Sat 12:07 + :ARCHIVE_FILE: ~/Code/sly/TODO.org + :ARCHIVE_OLPATH: Features + :ARCHIVE_CATEGORY: TODO + :ARCHIVE_TODO: DONE + :END: Create a data type to represent an animated sequence of textures and/or texture regions. ** DONE [#B] Asset Management + :PROPERTIES: + :ARCHIVE_TIME: 2016-02-27 Sat 12:07 + :ARCHIVE_FILE: ~/Code/sly/TODO.org + :ARCHIVE_OLPATH: Features + :ARCHIVE_CATEGORY: TODO + :ARCHIVE_TODO: DONE + :END: - [X] Live asset reloading - -* Improvements - -** TODO [#A] Implement , , , and as packed f64 bytevectors - Currently, it's expensive to use these types when performing OpenGL - operations such as writing to vertex buffer objects because Guile - does scm->f64 conversions before writing to a bytevector. To take - advantage of Guile 2.2's float unboxing, we can implement these - types as a record type with one field: a bytevector. The - bytevector will store all of the fields packed together. To take - advantage of unboxing, the procedures that get/set these "fields" - should be inlined. - -** TODO [#B] Clean up imperative rendering API - The functional, monadic rendering API is nice and clean, but the - low-level imperative API is very messy. Perhaps it could use some - syntactic sugar for all of the "call-with-foo" forms. Also, a - naming convention needs to clearly differentiate procedures/macros - in the imperative API from those in the high-level API. - Originally, I didn't expect users to really ever have to use the - imperative API, but the introduction of sprite batches has made me - realize that writing custom low-level rendering routines will be - common enough to merit a nice API. - -** TODO [#B] Treat shaders like procedures - One can view a draw call as the application of a shader program. - The arguments to the shader program are uniforms and vertices. - -** TODO [#B] Use uniform buffer objects - Uniform buffer objects allow setting many uniform values at once, - rather than performing a GPU call for each, which results in better - performance. - -** TODO [#C] inotify-based live reloading - Better than periodically making 'stat' calls in a loop. - -** DONE [#A] Allow modules to declare state via signals, including OpenGL resources - This is a tricky one. The major headache with my Lisp Game Jam - attempt was that the signal framework had to be abandoned - *everywhere* except the top-level environment of the script that - starts the game loop. The reason for this was that the game state - typically required that the SDL window was opened and the OpenGL - context was available in order to work. Thus, at the top-level, we - first had to open a window and only then could we define signals. - The goal here would be to eliminate this major restriction so that - a game can be factored into many Guile modules and still declare - time varying state with signals. One important consequence here is - that all OpenGL resources *must* be declared as signals that wait - for the game loop to start before loading. - -** DONE [#A] Implement sprite batch in terms of a mesh - Fix code that assumes meshes to be static, allowing for the dynamic - sprite batch use-case. - -** DONE [#A] Pure Scheme 4x4 matrix multiplication implementation - Guile 2.1.2's float unboxing optimizations should enable this to be - both fast and not allocate so much. The GSL dependency can be - removed (yay!) once this is complete. Be sure to use Guile's ,x - metacommand to view the disassembly to ensure that the necessary - optimizations are indeed being used. -** DONE [#B] Use a single OpenGL resource guardian structure - This will deduplicate code amongst all Scheme data types that wrap - OpenGL resources, because right now each one uses its own separate - guardian. - -* Documentation - -** TODO Document rendering API - I can't settle on a rendering API, so I haven't bothered making - good docs for it. Once the above rendering tasks are complete, - it's probably safe to write docs. - -** TODO Write a tutorial - Walk a beginner through the basic features of Sly and establish a - simple development workflow. - - - Start the game loop - - Render a sprite - - Move the sprite - - Live hack - -* Bugs - -* Releases - -** DONE 0.1 Release - A 0.1 release was made under the project's old name, guile-2d. Now - that things have changed so drastically and the name has been - changed, a new 0.1 release will be made. - - - [X] New REPL server - Use the (system repl coop-server) module in Guile 2.0.11. - - [ ] Screencast - - [-] Relatively complete documentation (it's a start) - - [X] Clean up font module - - [X] Add GLSL shaders - - [X] Finish FRP module - - [X] Make basic webpage with HTML docs - - [X] Basic rendering (must support sprites and text) -- cgit v1.2.3