render3d: a fog wall nearer than a layer's cards lets its impostor atlases go, and a fog that opens bakes them again
Inside the wall every instance is a mesh whose LOD2 casts its shadow, so a card is neither drawn nor cast there: fog_impostors.ludic frees a layer's atlases while wall + margin < its near (trees 420-480 m, rocks 320 m) and paints them again from the model when it opens past it (impostor_paint, split out of the bake). Impostor atlases get memory of their own, so a release goes back to the driver instead of leaving a hole in a shared block. R3D_FOG_AT=<frame> with R3D_FOG_TO=<m> changes the wall mid-run. At the overlook: 2102 MB off, 1824 MB at 30 m (249 -> 67 MB of atlases; the rest is the ground cover's card atlases, drawn inside the wall); opening re-bakes 16 layers in 42-46 ms, back to 2102 MB. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
6289564382
commit
7024f42789
6 changed files with 88 additions and 7 deletions
|
|
@ -59,6 +59,7 @@ export function r3d_fog_wall(render3d_st: mut Render3dState, dist: float) -> voi
|
|||
# every layer and stream re-gathers for the new reach
|
||||
render3d_st.sc_view_gen += 1
|
||||
cam_update(render3d_st)
|
||||
fog_impostors(render3d_st)
|
||||
}
|
||||
# how far anything is drawn: the fog wall and a margin, or `far` (0: no limit of its own) without one
|
||||
function r3d_reach(render3d_st: Render3dState, far: float) -> float {
|
||||
|
|
@ -221,6 +222,7 @@ function r3d_frame__t(render3d_st: mut Render3dState, time: float) -> void {
|
|||
# a stale attachment or a texture freed twice shows up.
|
||||
render3d_st.r3d_test_frame += 1
|
||||
vkmem_tick(render3d_st)
|
||||
fog_at_tick(render3d_st)
|
||||
if render3d_st.r3d_test_resize == 0 and r3d_env_has(render3d_st, "R3D_RESIZE_AT") { render3d_st.r3d_test_resize = Text.to_int(r3d_env(render3d_st, "R3D_RESIZE_AT")) }
|
||||
# R3D_RESIZE_AT=<n>: from frame n on, rebuild every screen-sized buffer every few
|
||||
# frames at a different size, as dragging a window edge or entering fullscreen does.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue