-
Notifications
You must be signed in to change notification settings - Fork 13
/
CHANGELOG.txt
331 lines (208 loc) · 12 KB
/
CHANGELOG.txt
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
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
* 1.6.2
- Change color from a 16-bit palette index to 16-bit HSV encoded color
Handling color in the same way MagicaVoxel does (by using a fixed 255 element palette)
turned out to be a bad idea for several reasons. Firstly, if you import
multiple models from different sources, and those sources have more than 255
combined colors, what do you do? I opted to go for a 16-bit palette, but at
that point you might as well just do 16-bit color and be done with it. So,
that's what I did here.
This change ended up being pretty sweeping, affecting world gen, asset/level
loading, particle systems, rendering.
- Implement HSV color picker
- Implement a Modal widget in the UI
* Change "SeedBrushWithSelection" to work with destructive brush previews
* Fix a race condition sometimes causing the main thread to unlock before the render thread had completed
* Fix some edge cases with negatively offset brushes and small selection regions
* Fix v3_u8 normal data being incorrectly encoded on negative edge
* Fix a frame of lag when changing the selection region with a brush active
* 1.6.1
- Change untextured_3d_geometry_buffer to have a `data_type Type`
This is a pretty major internal change. untextured_3d_geometry_buffers can
now switch between 32-bit float and 8-bit int. When loading a model from
disk, the size of the model is taken into account and the appropriate type
is chosen dynamically.
This required a fair rewrite of the low-level vertex buffering routines to
be able to handle the permutations. This is still somewhat of a WIP; I
didn't finish all of them and the ones not done fall-back to the most
general routine, which is the slowest. I expect I'll rewrite/delete this
code again before performance in that code is the biggest problem I have.
- Change world updates to happen in serial on a dedicated thread
Previous to this, multiple world updates could be in-flight at any given
time, which if overlapping would stomp on each other. Serializing updates
onto a single thread ensures that:
a) Updates are correct
b) Updates happen in the order they were issued
c) Chunks affected by multiple updates on a single frame only have their
mesh rebuilt once
(c) is accomplished by completing all queued update jobs and then issuing
the chunk mesh rebuild jobs, one per unique chunk updated.
- Add ability to create new assets from a world selection and serialize `.chunk` assets to disk
The selection region is saved out as a world_chunk
- Add ability to load asset `.chunk`s from disk
- Add abiltiy to render AssetType_WorldChunk
- Fix layered brush previews crashing the program
- Fix crash in AreEqual if null pointers were passed
- Fixed failing tests, added test runs to CI/CD
* 1.6.0
- Renderer now lives on its own thread.
This is a major architectural change that deserves far more of an
explanation than I'm going to provide here.
I've been wanting to split the renderer onto it's own thread for quite some
time, mostly as an academic exercise.
It turned out to create more maintenance burden than I would have liked,
although it does make a few operations easier/cleaner, such as freeing GPU
resources from worker threads.
The API is a message-queue based system for which most of the boilerplate is
generated by poof. There's an `asyncify_render_function` poof routine that
takes a function prototype and spits out an `Async` version of the function
which pushes a render job onto a work queue. At this point it's up to the
programmer to remember to go actually call the function in the renderer
(which is made easier by being reminded of the new, non-enumerated case by the compiler).
- Debug system once again welded directly into the program instead of compiled to a DLL
I got tired of maintaining globals in so many places and decided the cost of
having the debug system split out into a DLL was not worth the flexibility
of being able to load it in other programs. If I want to use the profiler
in other programs, I'll just compile it in.
- Special, compressed vertex data type for world_chunk
I wanted to see how much performance I could squeeze out of compressing
position and normal data for chunks to 8 bit int from 32 bit float. Turns
out not a massive amount (deferred renderer is mostly texture-bound), but
it did shave off a bit.
* 1.5.1
- Fog now driven from C++ (and, by extension, the editor)
- Improved UX when opening brush menu for the first time
- Fixed the preview jank when using a layered brush.
The preview should now appear stable in the viewport
- Tuned some gBuffer texture storage resolution, transparency buffer storage resolution, & turned down default shadow quality
This is in an effort to get mid-end cards running at >60fps on 4k
- Fix some assertions due to new memory sizing requirements on world gen chunks
* 1.5.0
- @Shawnecy Chased down a divide by zero in the lighting shader
- Added Layered brushes
This is a pretty large feature that's not super well documented. Stay tuned
for tutorials on YouTube.
- Added TextBox in ui
Takes a pointer to the char buffer to write the new text into.
- Added two new resize modes to the selection
- Added White noise
- Change noise generation to internally operate on blocks of memory that are multiples of the SIMD register size.
User code should not be affected by this change, other than to now be able
to reliably assume the chunks passed to the world gen functions are
right-sized to just blast through the whole thing in the SIMD path. The
unused portion is discarded.
- Added SkyColor to graphics struct
- Fix spamming SoftError from worker threads if a world chunk buffer was not large enough to fit all geometry.
The new behavior is to print the error once, then go silent.
- A few minor bugfixes and usability improvements
* 1.4.3
- @Shawnecy fixed some UI bugs
Textures no longer stretch when clipped by the application window.
Dynamically/Inferred sized windows no longer size themselves larger than the application window.
- Fixed loading levels which was broken by adding settings.init
- Fixed camera zooming when scrolling MMB & added smoothing to the zoom
- Minor general improvements to project structure
* 1.4.2
- Added settings.init, which drives some graphics settings at the moment
Some settings are now dynamic, loaded at startup from settings.init. I
needed to switch between different graphics settings to get the engine to
load on my laptop with an integrated GPU, so this was finally necessary.
- Added GetLexicographicallySortedListOfFilesInDirectory
The code that loads bitmaps for the UI sprites needed a stable ordering
across operating systems, which is not natively provided. This function
addresses the need there.
- Rename PlatformTraverseDirectoryTree -> PlatformTraverseDirectoryTreeUnordered
More specific name such that we know the ordering differes across platforms
- Remove some #defines that are now driven by settings.init
- Fixed some minor duplication in platform
- Remove voxel_synthesis_rule_baker from release
This example needs models I don't have written permissions to redistribute,
and isn't particularly polished. I'll polish it up and make some models
that I can ship for in the future.
- Removed a bunch of assets I didn't have permission to redistribute
* 1.4.1
- Fix PlatformTraverseDirectoryTree on Linux snapping pointers to invalid memory
- Minor gameplay fixes for turn_based
* 1.4.0
This marks the first stable public release. Downloading pre-built binaries is
expected to work out of the box. If they do not work for you for any reason,
please open an issue.
- Added the ability to have the game code request to switch to another project
- Added project_and_level_switcher
- Tightened up allocations onto specific arenas to support HardResetEngine
The engine can now be hard-reset (which happens on project switch). Most
memory arenas get blown away and reinitialized from scratch.
- Added release packaging to make.sh
- Fixed a pile of crashes, unexpected behavior
- Generally polished UI/UX in some places
* 1.3.10
- Added EntityBrush to WorldEdit panel, which spawns the selected asset as an entity
- Changed key-light position to be dynamic during day/night cycle
- Fixed entity LRUFrameIndex getting erroniously set in main thread on locked assets
- Fixed linux platform crashing on NotImplemented in PlatformTraverseDirectoryTree
- Improved distribution of skele bitties spawning on impact
- Fixed skeletons moving to incorrect position relative to standing spot
* 1.3.9
- Implemented VoronoiNoise3D
- Implemented ComputeNormalsForChunkFromNoiseValues
This adds the ability to vary the terrain surface by the normal of the surface
- Combined VoronoiNoise3D and ComputeNormalsForChunkFromNoiseValues in
terrain_gen to make some craggy cliffs
- Generally improved terrain generation performance by quite a bit. It's still pretty slow
* 1.3.8
- Uploading build artifacts to release page
* 1.3.0
- Major improvement to serialization code
Arbitrary structs can now be marked with the @version tag and poof will
generate versioned serialize/deserilize routines. The savefiles have been
augmented with a list of bonsai_type_info structs saved out with the versions
of each versioned struct in the savefile, which can be used to switch between
the different deserialization routines at runtime.
- Added basic polyline based mapping for noise-value to final values
- Many small Ui improvements
- Many small turn_based and terrain_gen example improvements
* 1.2.0
- Remove dead turn_based2, graveyard and asset_picker examples
- Add HoodooTerrain to terrain_gen
- Add ser/des for counted_string
- Fix entity models not being rotated correctly
This was happening because entity models were not centered about zero, so when
rotations were applied they were rotating about their root point (lower-left corner)
The fix was to center models about zero.
- Change CameraGhost
Game code no longer has to manage allocating and hooking up a CameraGhost
entity on the engine resources. Instead, if wanted, it may allocate and set
the EntityBehaviorFlags_CameraGhost flag on an entity of the games choice.
- Change Entity struct
* Add 'u64 Version'
* Remove model pointer in favor of using an asset_id
This is a breaking change that better positions us to not making breaking
changes in the future. I added a Verson field to entity, which I expect
should be well more than enough versions. The plan here is to add a poof
feature that computes a hash of the types contents and checks that against
the hash of the currently compiled type. We should also be able to lean
on the C type checker once that's done to generate functions that have that
hash in the name such that we actually know at compile time if we break entity
loading.
* 1.1.1
- Update terrain_gen example to have a menu to select the type of terrain
- Add HardResetWorld, which resets the world to a clean state for re-init
- Fix bug when switching from eyedropper with an incomplete selection
* 1.1.0
- Accelerate n^2 entity collision
Entity collision detection has, before now, just done the naieve n-squared thing
of checking every entity against every other entity. This worked fine for
small demos, but as I push further into the relm of 'real games' I needed to
do entity collision on every step of the movement update (after moving every voxel),
which was not going to go well. Thus, it was time to fix the problem.
The solution I went with, which I've been considering for a while, is to store
a list of entities in each chunk. When the entity moves, it first is removed
from all chunks it currently overlaps, moved, and then added to chunks it
finally overlaps. This means we can now collide against entities occuring in
the local chunks we're overlapping, which is more acceptable than all entities
all the time.
- Fix two bugs related to high-speed entities colliding against the world
- Fix some bugs in block_array and add test cases
- Fix Camera ghost updating when UI has focus
- Fix UI not capturing input when painting
- Fix bug in .vox palette loading (indexes are 1-based!!)
- Added some screenshots