* Tasks ** TODO [#A] Bug: Vertical line rendering not working Vertical lines are invisible. Not great! ** TODO [#A] Improve window resizing support For example, there's no user hook to handle a resize event. ** TODO [#A] Scheme -> GLSL compiler Like CL's varjo but for Guile. Start with a simple sexp -> GLSL serializer. Goals: - Scheme-like syntax - Embeddable within Scheme source files - Compiles to GLSL during regular Guile compilation - Clean interface for passing data from Scheme to shaders - Implicit returns in tail position (no 'return' keyword) - Everything is an expression - Type inference - Understands built-in shader stage variables - See: https://www.khronos.org/opengl/wiki/Built-in_Variable_(GLSL) - Macros - Nested functions if they are hoistable (no free variables aka not closures) - Shader libraries for reusing and composing code #+BEGIN_SRC scheme ;; Input vertices are positional arguments, uniforms are keyword ;; arguments. (define (sprite-vertex (vec2 position) (vec2 tex) #:key (mat4 mvp)) ;; First argument returned is the vertex position, all others get ;; mapped to fragment shader inputs. (values (* mvp (vec4 (-> position x) (-> position y) 0.0 1.0)) tex)) (define (sprite-fragment (vec2 ))) #+END_SRC ** TODO [#A] Switch from OpenAL to custom Scheme mixer I've decided that OpenAL is too high level to be a library that Chickadee should rely upon, since part of the goal of Chickadee is to implement as much as possible in Scheme and only resort to C if absolutely necessary. Instead, we can use SDL2's cross-platform audio API and implement all the audio mixing directly in Scheme. ** TODO [#A] Ditch the readline dependency Figure out how to get back to using Guile's built-in REPL for =chickadee play= so the custom can go away. Readline is hard to make work in an async manner. ** TODO [#B] Dedicated audio thread Allow use of (ice-9 futures) for parallelism? ** TODO [#B] Texture fills for vector paths ** TODO [#B] Even-odd rule fills for vector paths Right now only the non-zero rule is supported. ** TODO [#B] Add shear transformations to vector paths ** TODO [#B] Dashed lines for stroked vector paths ** TODO [#B] Mitered corners for stroked vector paths ** TODO [#B] Text rendering for vector paths ** TODO [#B] Add screenshots to manual ** TODO [#B] Improve particle system Allow more settings to be modified. Add angular velocity. Auto-expand to hold all particles rather than setting a hard cap upfront. ** TODO [#B] Support loading fonts from system font cache ** TODO [#C] Binary bundles for MacOS ** TODO [#C] GPU pipeline data structure Like this: https://reader.tymoon.eu/article/363 ** TODO [#C] 2D physics simulation Add bindings for the chipmunk library or implement a rigid body simulator in Scheme. ** TODO [#C] Multiplayer networking Take a look at Xelf's UDP networking code and https://gafferongames.com/categories/building-a-game-network-protocol/ ** TODO [#C] Render command queue processing To replace existing immediate mode rendering ** TODO [#C] Uniform buffers Need some way to support these while falling back to the current, slow way that is compatible with OpenGL 2.1. ** TODO [#C] Signed distance field font rendering ** TODO [#C] Physically-based ambient lighting The PBR shader currently does image based ambient lighting in a very naive way that does not use physically-based equations. ** TODO [#C] Right-to-left text rendering ** TODO [#C] Top-to-bottom text rendering ** TODO [#C] Octree spatial partitioning ** DONE [#A] Fix 9-patch rendering not working with texture regions ** DONE [#A] Add #:clear-color argument to run-game ** DONE [#A] Tests for (chickadee math rect) ** DONE [#A] Add matrix{3,4}-copy! procedures ** DONE [#A] Load palleted PNGs ** DONE [#A] Remove SDL2-image dependency Directly link against libpng and libjpeg-turbo, for starters. Support for other formats can be added later. This will give us more flexibility since we won't be tied to SDL surfaces and thus a single thread for image loading. ** DONE [#A] Fix keyboard layout bug For example, someone with a QWERTZ keyboard layout, when they press their Z key, will invoke the key-press handler with the Z key, but (key-pressed? 'z) will be false and (key-pressed? 'y) will be true. ** DONE [#B] Quadtree spatial partitioning ** DONE [#B] Add arc-to procedure for vector paths ** DONE [#A] Tests for (chickadee data array-list) ** DONE [#A] Tests for (chickadee data heap) ** DONE [#A] Tests for (chickadee data queue) ** DONE [#A] Update rendering engine docs ** DONE [#A] Update live coding section of manual ** DONE [#A] Document polygon, cull face, depth test, stencil modes ** DONE [#A] Document cube map texture procedures ** DONE [#A] Document materials, lights, and meshes ** DONE [#A] Add intensity field to lights ** DONE [#A] Test suite ** DONE [#A] Binary bundles for Linux For easy distribution of builds so players don't have to build anything from source. ** DONE [#A] Mipmapping ** DONE [#A] Skyboxes ** DONE [#A] Basic 3D shape primitives Plane, tesselated plane, sphere, cube ** DONE [#A] Image based lighting for 3D models Cube maps and such. See: https://learnopengl.com/PBR/IBL/Diffuse-irradiance ** DONE [#A] Reimplement 9-patches ** DONE [#A] Chunk-based tile map rendering ** DONE [#A] Render rotated tiles in Tiled maps correctly See STIB library for love2d for implementation details. ** DONE [#A] Render animations in Tiled maps ** DONE [#A] Support modifications to Tiled maps ** DONE [#A] Handle window resizing gracefully ** DONE [#A] Display clear error when using OpenGL before game loop has been started ** DONE [#A] Macro for looping over number ranges Get rid of all the dang named lets for looping over x and y values in a grid. ** DONE [#A] High-level vertex buffer packing API Filling vertex buffers by hand sucks and leads to lots of redundant, brittle code all over the place. Especially so for anything that does vertex buffer streaming like sprite batches and vector paths. Maybe copy something like guile-opengl's packed structs. ** DONE [#A] Front/back face culling support ** DONE [#A] Vector graphics rendering Like NanoVG. ** DONE [#A] Feature request: Support color keyed tilesets in Tiled maps ** DONE [#A] Bug fix: Clear screen even when nothing is being drawn ** DONE [#A] Allow user to manipulate the current window ** DONE [#A] OBJ model loader and renderer ** DONE [#A] Fix bugs/missing features in particle renderer ** DONE [#A] Document how to hook up cooperative REPL server ** DONE [#A] Document (chickadee graphics tiled) module ** DONE [#A] Add pixel x,y to tile x,y procedure for Tiled maps ** DONE [#A] TrueType font rendering Like love2d or NanoVG ** DONE [#A] Chickadee executable Like love2d's =love= executable. For getting new users up and running quickly. ** DONE [#B] Linear/radial gradient fills for vector paths ** DONE [#B] Improved blending API Rather than using symbols to represent some predefined blending modes, create an api that supports the full range of options that OpenGL provides for defining the blending function. ** DONE [#B] Tile map scrolling ** DONE [#B] OpenAL sound Better than SDL_mixer. For love2d parity. ** DONE [#B] glTF 2.0 asset loading Partially implemented but most example models don't render correctly. ** DONE [#C] Rewrite GPU state and render context code Adding a new piece of state requires too much work, much of which feels redundant. ** DONE [#C] Improve technique-specific state handling Right now everything (shaders, buffers, etc.) is wrapped in 'delay' forms and then 'force'd when rendering. It would be better if we could somehow register this stuff with the gpu object. A plugin system, maybe. The plugins would be initialized when the gpu object is created and all the state would live there instead of at the top-level of various modules. ** DONE [#C] Physically based rendering Needed for full glTF rendering support but just good in general for 3D.