summaryrefslogtreecommitdiff
path: root/TODO.org
blob: d761eb2bc7bd130073a21e32db4b69c771cfb4db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
* Features

** DONE Game loop
   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 Input
   Provide hooks to respond to keyboard, mouse, and joystick events.
   Wrap SDL keycode, mouse button, etc. constants in our own
   enumeration.

   - [X] Keyboard
   - [X] Mouse
   - [X] Window (active, resize, quit)
   - [X] Joystick

** DONE Sprites
   Encapsulates an image and all of its transformations: position,
   rotation, scale, color, etc.

   - [X] Use SDL2_image
   - [X] Add support for texture regions
   - [X] Add support for animations
   - [X] Use a sprite batch when drawing if one is currently bound

** DONE Sprite batches
   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.

   - Use streaming vertex buffers
   - See: https://www.opengl.org/wiki/Buffer_Object#Mapping
   - See: https://www.opengl.org/wiki/Buffer_Object_Streaming
   - See: https://bitbucket.org/rude/love/src/d95dfb67079a60f8de64304dac9002544695f1bb/src/modules/graphics/opengl/SpriteBatch.cpp?at=default

** DONE Tilesets
   Break an image up into many small pieces. Useful for creating maps.

   - [X] Algorithm to split texture into tiles
   - [X] <tileset> type

** DONE Animations
   Create a data type to represent an animated sequence of textures
   and/or texture regions.

** TODO Tile maps
   - [ ] Create a generic tilemap module
   - [ ] Create a loader for Tiled .tmx map files.

** DONE Scene graph
   A tree structure that is traversed when rendering a game scene.
   The graph is composed of groups and nodes. Transformations are
   accumulated as the tree is walked.

** DONE Scripting
   Provide a way for users to easily script 2D games using coroutines
   and a scheduler.

   - [X] Coroutines
   - [X] Agenda

** DONE Vectors and matrices
   Vectors and matrices are needed constantly for games. Provide an
   easy-to-use module that provides procedures for common
   vector/matrix math operations

   - [X] Vectors
   - [X] Matrices

** DONE Fonts
   - [X] Write wrappers for needed FTGL functions
   - [X] Write font rendering procedures

** DONE Sound
   Provide helpful wrappers around SDL sound procedures?

** TODO A* pathfinding
   A* is a commonly used pathfinding algorithm for games. Pathfinding
   is such a common task that it would be nice to provide users with
   a generic implementation.

** TODO Bounding box collision detection
   Most games need simple bounding box collision detection. Provide an
   efficient implementation that uses quad trees.

   - [X] Rect module
   - [ ] Quadtree module (needs more thought, a purely functional data
     structure would be preferable)

** TODO Particle systems
   Provide a highly configurible particle simulation system.

   - [ ] Investigate ways to make it fast.  Use guile-compost for
     performance reasons.

** DONE Asset Management
   - [X] Live asset reloading

** TODO Keymaps
   Provide an Emacs-like way of defining key combinations so that
   multi-button input is easy for users.

   - [ ] Abstract away input methods
     Controls can be bound to keys, mouse, whatever
   - [ ] Basic sequences
     Press A then B
   - [ ] Simultaneous key presses
     Press A and B at the same time
   - [ ] Composing sequences
     Press A then B + C
   - [ ] Timeouts
     Press A then B then C within 15 frames time
   - [ ] Sequences with actions along the way
     Press A to kick, then forward + B to uppercut, within 30 frames
     time.

** TODO GUI widgets
   Provide a set of common graphical widgets such as buttons, scroll
   bars, and sliders.

** DONE REPL
   Provide a REPL that plays nice with the game loop. Easier said than
   done.

   - [X] Modify Guile's REPL to work with the game loop
     - Short-term solution that *mostly* works
   - [X] Write a new REPL that runs in the current thread
     - Use coroutines
     - Read user input from a separate thread so as to not block the
       main thread
     - Will be available in Guile 2.0.10!

** TODO Shaders
   - [X] Shader data type
   - [ ] Scheme -> GLSL compiler
     Port http://wiki.call-cc.org/eggref/4/glls to guile?

** DONE Upgrade to SDL2
   - Write necessary bindings and release [[https://git.dthompson.us/guile-sdl2.git][guile-sdl2]].
   - Replace freeimage with sdl_image 2.0

** TODO "Nine patches"
    Images that have a resizable central area but fixed width/height
    edges.  See [[https://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch][this Android document]] for details.

** TODO Job control for agenda
   Allow for pausing and cancelling jobs.

** TODO Async/threaded signals?
   Not sure how to do this as some things, such as SDL and OpenGL
   calls, *must* be done in the main thread.  Maybe signals should
   just stay synchronous.

** TODO Smooth animation helper
   Remove the temporal aliasing in animation by interpolating between
   current and previous state of animated objects.

** TODO Bitmap font rendering from tileset
   Some fonts aren't available in TTF format, only as a tileset image.
   It would very useful for 2D games to be able to render these.  Even
   better if the font rendering procedures are made polymorphic to
   handle this new type of font.

** TODO Geometry combinators
   A functional interface for composing complex geometry from the
   simple building block of triangles.  A square is 2 triangles, a
   cube is 6 squares, etc.  A triangle has 3 vertices with a
   particular winding.

** TODO 3D model file loader
   Use guile-assimp to support loading many 3D model file formats.

** TODO Lighting
   Ambient, point, directional, etc.

** TODO Multi-pass rendering pipelines
   It's possible to do multi-pass rendering now by binding
   framebuffers, shaders, etc. and running the same rendering code
   again, but there's probably some nicer abstraction that could clean
   this up.

** TODO Instanced rendering
   A nice optimization when rendering the same mesh a bunch of times.

* Improvements

** TODO 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.

** DONE 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 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.

** TODO Separate vertex arrays from meshes
   Currently, a mesh is a vertex array.  This is bad because vertex
   arrays are useful in situations where the static mesh abstraction
   isn't a good fit, such as with sprite batches.  Therefore, a vertex
   array should have its own dedicated data type that both meshes and
   sprite batches use in their respective implementations.

** TODO inotify-based live reloading
   Better than periodically making 'stat' calls in a loop.

** DONE 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.

* 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)