Level of Detail (LOD)
The LOD system swaps mesh detail levels based on player distance, reducing draw calls and memory usage.
Mesh Naming Convention
Assets in ReplicatedStorage.Assets.Folliage follow this pattern:
Meshes/Conifer_04_Conifer_04_LOD0 ← Full detail
Meshes/Conifer_04_Conifer_04_LOD1 ← Medium
Meshes/Conifer_04_Conifer_04_LOD2 ← Low
Meshes/Conifer_04_Conifer_04_LOD3 ← Lowest
The LOD map is built on first access by scanning all assets and grouping by base name.
Distance Thresholds
Default thresholds (configurable):
| LOD Level | Distance | Detail |
|---|---|---|
| LOD0 | 0–50 studs | Full |
| LOD1 | 50–100 studs | Medium |
| LOD2 | 100–150 studs | Low |
| LOD3 | 150+ studs | Lowest |
Client Update Loop
LodController runs every 0.5 seconds:
- Evaluates all chunks, closest first
- For each MeshPart, calculates appropriate LOD level
- Swaps up to 60 MeshParts per cycle (20 reserved for forest trees)
- Replaces mesh by destroying old part, cloning template into same parent
Manual Override
Debug UI provides a slider to force all meshes to a specific LOD level, bypassing distance checks.
Server-Side LOD
serverSpawnLOD can pre-downgrade decore before clients receive chunk data, reducing initial network payload.
Key Files
| File | Purpose |
|---|---|
lod-map.ts | Builds lookup table from asset names |
lod-swap.ts | Part replacement logic |
lod-state.ts | State atoms (override, thresholds) |
lod-controller.ts | Client update loop |