Last week I worked on a number of small but important fixes. Here's a rundown of the noteworthy ones:
- Stability improvements. I added checks to ensure that OpenGL is not being accessed from threads where it's not supposed to be accessed. Ultimately this should remove a number of obscure random crashes. Also, the engine's internal memory zone can be safely accessed from threads other than the main thread as it now has the appropriate protections in place. This should further improve stability as it protects the memory state from getting corrupted at seemingly random times.
- Input fixes. Toggle events (such as releasing a key or a mouse button) were being ignored during busy mode. This meant that the engine didn't notice that a key/button was released while loading a map, leading the game into thinking that the key was still down when the map started.
- Automap fixes. The default zoom level was not calculated in the right way. Also, player markers are now always drawn with thin (1.0 wide) lines for clarity.
- Timer fixes. Whenever the engine did something that took a long time, like loading a map or a savegame, the amount of time spent on the task was not ignored by the core timer. Now the timer correctly starts over after such long pauses.
- Fixes for the dedicated server. Fonts were being mistakenly loaded in dedicated (non-graphical) mode, leading to fatal errors. The dedicated servers are now again running normally (there were down for some time during the week).
As the to-do list is slowly getting shorter, we are finally approaching the end of the Candidate phase. Just a little while longer to go...
...and here is a rundown of my noteworthy fixes this past week:
- File system fixes. The NO_DESCEND flag dictates whether a file system search should descend into a subdirectory when collating paths. This behavior was respected by LumpDirectory (which handles virtual files loaded from containers such as WAD) but not by FileDirectory (used for local file system searches). Consequently if the user tried to load an IWAD from e.g., the root of their Home directory; Doomsday would traverse the entire disk when populating the Packages resource namespace during startup (naturally resulting in significant slowdown). It was also possible to trick the engine into attempting to load an unplayable game using file resources named appropriately.
- Model Renderer fixes. Upon testing various user made models I discovered that Doomsday was using a static fixed-length vertex buffer during rendering. Consequently any model with more than 4096 vertices resulted in Doomsday corrupting it's own memory state each time it tried to render it. I replaced the static vertex buffer with one that dynamically resizes as required by the currently loaded resources. However, I have imposed an absolute limit of 16192 unique vertices (size chosen according to the total memory footprint of a model frame's vertex data plus draw commands) to prevent model authors from going completely over board (note that Doomsday currently does all model animation on the CPU, so we have to be conservative). I also fixed an issue which potentially resulted in the uploading of unnecessary copies of some model skins to the GPU.
- Input changes. I added support for enter and divide keys on the keyboard numpad. All math operator keys on the keyboard numpad now work correctly and enter is now interpreted similarly to return in UIs like the console and the control panel. Also, left control was being misinterpreted as the right square bracket on Windows.
- Game UI fixes. Missing enemies during the end of game cast call. Game menu widgets did not reflect the current values of cvars they were mapped to. Resolved all alignment issues with the multiplayer scoreboard.
- Homepage issue which directed users who clicked on the symbolic "latest Ubuntu" downloads to the binary package for the FMOD Plugin instead.
My plan for the coming week is unchanged - continue resolving issues on the 1.9.7 to-do list