141,814 Commits over 4,505 Days - 1.31cph!
Setup oxygen RRP postfx volume and overlay
Merge from hands_preview_workflow (includes changes from main)
Cleaned up some edge cases
Added a toggle to the animation inspector itself and added a text readout of what meshes were detected and loaded
Proof of concept of an automated editor utility that inserts the viewmodel hands mesh into the animation inspector preview window if no hands mesh is present
Allows us to still use the animation preview window once the hand mesh has been removed from the rig file
Uses some naming semantics to try and resolve what the actual mesh that should be displayed should be, this is probably where we'll feel some pain for this system
If the animation file ends in _anim it will check for a file ending in _rig, then fall back to looking for a file without the _anim suffix
So v_bow_anims.fbx will look for v_bow_rig.fbx, failing that it will look for v_bow.fbx
The preview window will then load that fbx and the hands model if needed, combine them and feed it into the preview window
Added new ViewmodelClothingRandomiser component
Allows us to mirror the randomisation applied to a Wearable to it's viewmodel in case that randomisation affects the arms
Component has a groups array like the Random section of the Wearable, when used the group count needs to match (as we'll just copy over which "group" was activated)
Merge from heavy_helmet_audio
In game player voices are now also muffled by heavy plate helmet
Increased volume reduction (was 2400, now 1800)
Add new HideLods and ShowLods animation events, same as Show/Hide but will iterate over lods 0-4 of the object provided
eg. Called with w_ar_glass_mag_full_LOD0, this will also show/hide LOD0,1,2,3 if they exist
All showing/hiding events now uses a lazily loaded cached renderer list so we pay slightly more the first time an animation event is fired but subsequent calls are faster and allocation free (was allocating 40b each animation event)
Updated glass ak reload to use new events
Merge from deepsea_terrain_everywhere
Swap the ocean colour as well
Animal AO caps: croc/stag/bears/panther/shark/wolf/chicken -> 1024/512, a further 17.5MB VRAM saved
Clothing AO pass: capped 57 maps 2048 -> 512/1024, ~120MB VRAM saved with no visual difference
also hooked up Cocoknight legs/torso AO which was never bound to its materials
merge from automated_testing
Reduce network range of glass ak
Delete unused anim event
Switch drop mag particle to use LOD1 (already has RW enabled)
Enable custom local folder on the animation events so the build doesnt change the path, mag drop works
Testlist, all tests pass
Split MinidumpUploader into multiple .cs files as it got a little unwieldy
Made the pipe hole mesh smaller and tweaked anchor setup to prevent terrain gaps
Medieval AK gem material tweak: fixed refraction scale 75cm -> 2cm, corundum IOR, proper transmittance - reads as gemstone instead of grey glass
https://files.facepunch.com/pilgrim/2026/August/30_10-00-InsubstantialManta.mp4
Medieval AK worldmodel: baked 6 materials / 3 texture sets down to one 1024 atlas material
6 draws -> 1 per LOD; re-UV'd mesh, rebuilt LOD chain, gems baked opaque
arguably looks better than before for the gems especially as i can't justify 6 materials just for a world model of this scale.
https://files.facepunch.com/pilgrim/2026/August/30_09-27-CoralBighornedsheep.mp4
flamethrower world model optimisation
combined the two parts into one mesh per LOD in engine, converted to a MeshLOD
renderers 6 -> 1, highlight draws 2 -> 1, culls at 35m, triangles unchanged
assault rifle world model optimisation
- combined the 4 part FBXs into one model and converted the LOD group to a MeshLOD
- renderers 12 -> 1, highlight draws 4 -> 1, triangles unchanged, culls at 35m
- combined the ak47u's 4 part FBXs and the medieval's rifle+mag into single models
- converted the ak47u, medieval and jungle world models from LOD groups to MeshLODs
- removed the medieval's 23.6k tri LOD0 - its chain is now 13k/5.3k/2.1k
- renderers: ak47u 12 -> 1, medieval 8 -> 1, jungle 3 -> 1; highlight draws all down to 1
boat building station optimisation
its 7 buoys were embedded pre-merge copies of the ocean wreck buoy optimisation i did on changeset
162514 - replaced their 280 seaweed/mussel renderers with the buoy merge's existing combined meshes
combined the remaining seaweed clumps in the station and platform prefabs (6 -> 1 and 5 -> 1) with wind origins baked into UV2
none of the seaweed was ever batching at runtime
renderers 340 -> 65, prefab 1.4mb -> 296kb, seaweed is now 9 draw calls instead of 263!
satellite crash remains optimisation
combined the 32 loose debris pieces into a single mesh with a MeshLOD - shadows now turn off past 25m for these, and it culls at 100m (previously it drew at every distance)
converted the dish from a LODGroup to a RendererLOD with the same switch distances, and zeroed the LOD child offsets so it collapses to a single renderer at runtime
both the dish and debris now register as occludees, so terrain and buildings can occlusion cull them - the LODGroup never could
renderers 44 -> 13, debris draw calls 32 -> 1
Improve navmesh doors perf, doors now remember which polys are theirs instead of searching the
navmesh on every open/close
Reduce network overhead of powered igniter, tesla coil and strobe lights
Every Hurt broadcasts a full entity update, self damage is now applied every so often to reduce overhead (time to die unchanged)
merge from improved_event_saveloading
Fix all non-puzzle crate and barrels spawns being set to never respawn on both oil rigs (happened because "Process" context menu messes them up)
S2P
Standardize navmesh door benchmark to follow same conventions as agent path following benchmark
merge from monument_blocker_explosive_ammo_fix
Fix explosive ammo not dealing any damage to monument blockers
merge from skin_pooling_fix
Fix pooling bug causing random skins to appear on deployables
Fix siege towers doors, better behaviour for NPCs when door is slammed on them
fix annoying high freq metal clink in one heavy plate footstep
tweak gib phys materials on some monument blockers so they play better destruction sounds
add thin metal destruction sound for trolley and vent cage gib stages
flashlight refresh sounds
heavy plate armor movement sounds
loot crate refresh gib sounds
slightly improved the quality of the vending machine texture & improved the cable faceting.
Re-implemented the internal shadow box to fake the interior depth but this time merged it to the vending machine geometry, reducing a draw, and also allows me to change the culling mode on the vending machine material from 'off' to 'Back'. This means that the Vending machine no longer renders every triangle twice. This would have also affected the gibs too that inherit the same material.
Rewrite some navmesh door bug repro test that passed even without its fix