1,647 Commits over 4,414 Days - 0.02cph!
sail guide combined into one mesh and one renderer.
Renderers 25 -> 1,
guide draws 26 -> 3,
sail body optimised from LOD0 in blender so 22.8k tris -> 10.4k
arrows rebuilt as a single mesh replacing the 24 unity cubes
the back of the sail fabric now shows in the guide where before only the front rendered
https://files.facepunch.com/pilgrim/2026/September/02_14-38-MeatyBoilweevil.mp4
cannon guide combined into one mesh and one renderer.
Renderers 11 -> 1,
guide draws 11-> 2,
built from the LOD1 parts so 24k tris -> 15k
cannon_base LOD chain fix
also fixed deployable telephone to properly reference LOD2 instead of doubling up on LOD1 from 15m -> 50m culling distance.
merge from hab_armor_LOD_fix
removed door that was baked into lod3 of the hab armor causing the door to change position
fixed the fuel tank and fridge junk LOD chains as they were broken
fuel_tank_a_600 and a_900 had their LOD3 at 300m, the same distance as the cull, so it never showed - moved to 150m and gave a_900 the cull state it was missing whcih meant it was never culling
fuel_tank_b_300/600/900/900_alt moved their last LOD switch from 50m to 150m to match, and the last LOD on all six tanks no longer casts shadows
fuel tanks LOD distances are unified now
fridge_junk door had the same dead state at 80m - LOD2 now switches at 50m
ran s2p
workbench upgrade visuals now share the workbench LOD distances 1/50/150 cull 250, this also matches the workbench upgrade empty states
added the missing cull states on recyclebin, salvage and efficiency and fixed engineer culling at 25m
now a lot more consistent and unified
added the missing cull state to 5 props that drew their last LOD forever - pork and wolf oven meat, small battery, satellite control console, kayak paddle
fixed raw and spoiled pork ran LOD0, 1, 2, 3, then LOD0 again at 35 m, so past 35 m they draw eight times more than at 15 m never culling.
fixed Human meat and wolf meat (oven and raw) had a similar issue but repeated their cheapest mesh instead of culling.
set rig to none and disabled animation import on 31 workbench upgrade fbxs including their gibs, none of them contain a rig or animation and generic rig was adding a dead animator to every model root
fixed efficiency upgrade coming in way too big.
last lod was okay - must have been in local mode on lod 2 when applying the transforms in blender (they have to be all visible)
fixed wooden loot crate not having enough force in the gibs
updated spike trap to fix low resolution texture on the bottom of the world model - world model is a bit bigger in size as a result.
changed the guide mesh to use LOD2 instead of 3 so the spikes are present in the guide mesh
https://files.facepunch.com/pilgrim/2026/September/02_00-13-LazyBlackandtancoonhound.mp4
scaled down digital clock worldmodel by .5 for a more realistic size (looked noticeably bigger than it ought to)
electrical fuse now has a world model - significantly cheaper than burlap sack LOD0
arrows were supposed to gib when on the off-chance they break but they weren't being referenced properly making them just vanish
but now they break.
added gibbable to the arrow worldmodel
world model fixes:
- kick hazmat fixed missing back faces, now uses single lod texture set isntead of 4to 5
- fixed missing faces on the water pump world model
- fixed divingsuit having offset texture on the world model
fix for missing colliders on the frame of the attack heli, allowing unnecessary damage
fixed missing back faces of hide poncho world model and optimised lods so last lod is sub 100 triangles
fix to recycle and efficiency worldmodel upgrades for missing faces
merge from advanced_wooden_crate_gib_fix
fixed loot crate gibs spawning with way too small colliders - although its a temporary fix until other issues can be ironed out.
Planters: improved placement guide meshes
- new low-poly guide meshes for large, small and triangle planters - all three were using their full LOD0 mesh as the deploy guide that was missing the soil
now looks and feels way less jarring and much more satisfying
https://files.facepunch.com/pilgrim/2026/August/31_23-29-IvoryMussaurus.mp4
LOD pass on computer station + mixing table decor
- computerstation.FBX re-exported with proper LOD meshes; computerstation.static LODGroup -> RendererLOD, deployed + apartmentcomplex variants updated for the new model
- MixingTable.Decor: glassware/water existed twice - embedded invisible in the table LOD meshes and again as 9 separate LOD0-only renderers on top; re-exported as one clean 3-LOD mesh with the glass material live, 12 renderers -> 1, LODGroup -> MeshLOD
LODGroup/RendererLOD -> MeshLOD conversion pass on vending machines, covered ch47/bradley props and tin can alarm: 129 -> 75 renderers, 23 -> 6 LODGroups, brings them into the LOD grid + occlusion culling
- vendingmachine family x5: RendererLODs collapsed to MeshLODs (55 -> 33 renderers) now can occlusion cull
- covered bradley/ch47 x6: LODGroups converted, wraps stay RendererLOD where materials demand it (66 -> 39 renderers); ch47_covered, ch47_covered_wrap + bradley_covered_wrap FBXs re-exported so LOD material order matches
- tincan.alarm: split into frame + cans MeshLODs so the rattle anim survives (8 -> 2 renderers); worldmodel onto MeshLOD too
9 alpha-less BC7 albedo/em maps -> DXT1, 3 also halved (retro cupboard ems, m16a2_02, loot barrel): saved ~28 MB VRAM, no alpha lost
no visual quality difference
Regenerated MaterialIndex.json - was dated Aug 2021, so Tools/Optimize/Find Material Optimzations had been reporting 5-year-old state. Fresh scan covers 9,055 materials and flags 164 with compression savings (84 unique textures, ~68 MB VRAM potential) for example m16a2 ao on high quality compression = 1.3mb, normal compression with no visual cost = 0.7mb
First pass on the free wins: 15 alpha-less DXT5/BC7 textures -> DXT1, ~13 MB VRAM, no quality cost
- m2bradley mainbody/armor: removed DXT5 standalone override (5.3 MB)
- m16a2 AOs x3, flamethrower AO: HQ -> Normal compression (5.3 MB)
- workbench upgrade AOs x2, apartment door mats AO, crate_2/gib/webbing AOs: HQ -> Normal compression (2.2 MB)
fixed blowpipe world model material order so it can be converted to meshLOD
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
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
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.
some additonal settings to carry over
chinook locked crate optimisation
crates + cage combined into one mesh with a single MeshLOD (1/5/15/25, cull 150) chainlink merged into one mesh
renderers 16 > 9
LOD components 11 > 4
objects 48 > 40
draw calls 10 > 4 up close, 3 past 20m
fence tris 1,000 > 10
tris at 25m 4,064 > 1,032
ocean wreck buoys - combined the seaweed and mussels on all three
renderers 128 > 23 across the three
LOD components 115 > 8
gameobjects 153 > 48
prefabs 482kb > 124kb
folding wicker beds B C D E - combined into one mesh each
frame, fabric and pillow all share Folding_Wicker_Bed_A, so each bed combines into one mesh per LOD band with a single MeshLOD - every bed is one object now
renderers 10 > 4 across the four
LOD components 10 > 4
gameobjects 10 > 4
prefabs 44kb > 26kb
tris at 18m 23,336 > 6,200
last lod under the vert cap on all four so they batch
gun display racks - merged weapons and hooks on all three.
each rack was 10-12 renderers with a separate MeshLOD chain each. weapons combined into one mesh per LOD band, hooks into one, one MeshLOD each
LOD components 32 -> 10
gameobjects 44 -> 19
draw calls 35 -> 20
colliders 32 -> 3
last LOD tris 15,282 -> 6,486
cherry picking from wooden box storage optimsation
cherry pick from bed optimisations
cherry pick from large wooden box
cherry pick from mixtable prt2