Version 2026.4.3.3957 and 2026.4.4.3969

🎛️ Patch Notes

Version 2026.4.3.3957

  • Improved the grass lighting and how it was coloured by the underlying terrain.
  • Added new ground clutter rotation type 'SurfaceNormalSmooth'. This should only be used with non-collideable ground clutter objects because it relies on the normals of the planet mesh LOD currently being rendered. This rotation mode aligns objects to the smooth terrain normal rather than the face normal as well as using the smooth normal for terrain colour sampling - ideal only for foliage. If the ground clutter mesh LOD is not LOD0, face normals are used instead.
  • Compressed ground clutter quaternion representation from vec4 to vec3, freeing up a float or uint for future object data. The quaternion W component is always dropped and reconstructed later.
  • Moved quaternion functions out of the ground clutter compute shaders and into GroundClutterCommon.glsl.
  • Updated access mask flags for the terrain normals buffer now that it can be used in ground clutter generation.
  • Name all Vulkan images. This was done to help searching for images in the VulkanProfiler image preview tool, but it also helps when debugging Vulkan errors as image names are now provided.
  • Reenabled kittens rendering into prepass.
  • Changed the best DV checks on the transfer planner to exclude any inter-transitory encounters.
  • The game window is now hidden until the first frame renders, this should hopefully prevent the blinding flash for a couple of frames
  • Suppress GLFW window positioning error in Wayland. It's not really an error, just not supported by Wayland windows (and potentionally other DEs)
  • Removed double allocation of rented array.
  • Update to latest Brutal.Vulkan packages
  • Fix clouds shadow volume causing stretched cloud shadows on purely vertical camera movements
  • Fix artifacts in atmosphere shader when very close to the planet radius or water surface
  • Limit artifacting on clouds when camera is zoomed all the way inside jupiter
  • Major refactor of the backing LookupCollection and its implementation on CelestialSystem particularly. The two Vehicles and All collections are now merged into a single collect, and a lookupindex maintained. This enabled the use of structs and stackalloc for handling temporary collections made off this. There was limited benefit to maintaining the two collections, currently, and if required a collection of indices would be better. Span returns replace List usage.
  • Refactor of transfer planner to use stackalloc and eliminate garbage collection, will only impact large solar system collections of the future realistically.
  • Replaced illegal hardcoded references to "Sol" along with their companion illegal string literal equals checks. Now this check is passed by type to Universe, who uses type to check result. This would have broken custom solar system mods, but now are fixed and the pattern matches the rest of the project and studio coding standards.
  • Fixed what appears to be a bug in denoise dispatch. The shader uses local size 16, dispatch was called using individual pixels instead of the 16x16 grouping. From what I could tell this would cause x256 more GPU threads than intended. This change appears to have given me a 33% increase in FPS in raytraced mode. I think this increase would scale with resolution (1920 would be >500M threads v the needed 2M). Requires validation from graphics team.
  • Added early out for empty pixels in raygen shader. From what I could tell, there is the opportunity to exit early from the translucent pass fetch.
  • Replaced denoise sampling kernel having a radius of imageSize.x/16 that sampled nearly every pixel with a parity filter. Instead replaced with stepped sampling to a max of 32 samples at most. This should, I believe, have the same effective blur radius and cuts texture fetches by 2 to 4x per denoise pass.
  • Added first pass of thread profiling tool.

Version 2026.4.4.3969

  • Add an initial offset to ring chunks, prevents meshes from aligning when the sim is first started
  • Optimized Navball shader. Especially fixed for AMD as could not handle dynamic indexing of large struct array. Dynamic indexing causes it into VGPR overflows and sppills, causing server performance degradation. Now preextracted into the two fields needed to draw the digits, and they are constants.
  • Fixed recent regression in the seek next/previous functions with the collection changes. Now the seek keys work correctly to alternate vessels.
  • Added new collection for itterating on vehicle slice, available per frame. This is a collection of only the vehicles that is relevant for this frame. This is better than itterating over the total objects in the universe, which will be thousands of objects.
  • Added SolSystemDense. This contains over 3000 objects, and is used for testing. Machine processing of some known objects, along with a machine generated list of asteroid belt objects, centars, and like. This is intended to be used for testing large number of celestial objects.
  • Refactored rendering and handling of asteroids, comets. Introduced PeriodicComet and InterstellarComet classes, only for rendering.
  • Moved cursor nearest orbit point and thing detection to a new concurrent worker. This can cost a few millisecond during the frame, but is easily handled concurrently. This reduces main thread loading.
  • Fixed FlightPlan calculation was very expensive especially for large solar systems. Most noticable during making of burns. Previously we iterated over entire system (for new system, +3000 objects) then filtered by primarybody hash. This iterated thousands of irrelevant objects that are not siblings and that would be removed later. The parent hash would be the only reason we are looking at them, anyway.
  • Added reachable radius filter for escape trajectories. When escaping parent body the new parent might have thousands of children. Previously we run Cheby polynomial on all. Now before the loop we compute max radius the hyperbolic traj actually reaches during window, and we can skip any body whose peri is beyond that radius. This narrows down our CheckUpdateEncounter to options that can actually happen. (need jamie + stefan to confirm). For bound orbits, the filter does nothing.
  • Fixed CheckUpdateEncounter did not handle NaNs, so this mean the entire and very expensive method would run but to no effect for bodies with no meaningul SOI.
  • Fixed CalculatePatch would not skip bodies with a NaN or zero SOI. Also iterate primarybody children instead of entire system, to avoid scanning the full list. Most of these objects will not be siblings. (need jamie + stefan to check).
  • Optimized ConjuctionAssessment and PatchedConics so that Encounters now use stackalloc buffer rather than Rented array. This is ~50x faster, and also is zero allocating.
  • Fixed a regression I introduced into TransferPlanner, as my stackalloc span was rolled into a foreach loop without being sliced. Now slices on actual values, not the entire buffer.
  • Added more worker options to porkchop generation for transfers. Now users can configure how many threads will be dedicated. By default, 25% of available cores will be dedicated to transfer calculation.
  • Added the workers will show their individual progress for the generation of transfer planning.
  • Heavily optimized drawing of closet approaches, which occurs every frame. Now instead of a rented array a span using stackalloc is used. This provides a significant boost to the performance of drawing approahces.
  • Fixed regressions with my change to a stackalloc buffer, when values were changed but not updated in the buffer.
  • Optimized MergeEncounters to use a stackalloc buffer rather than a rendered array, approx x50 faster than using the rented array and zero allocation.

Posted Apr 7, 2026, 11:33 AM UTC

444
Loading comments…