From 3816d9924bbc148bd8e27e0e1d45a1a7dd936377 Mon Sep 17 00:00:00 2001 From: Orkuncakilkaya Date: Mon, 28 Sep 2026 23:47:25 +0300 Subject: [PATCH] render3d/water: the saved camera's two views made once, not with each reflection target water_reflection_pass made view(water_saved, 16, 16) and view(water_saved, 32, 16) inside the block that makes the reflection target, so every time the target was made again (a resize, a render scale, a settings change) two more 16-byte views were made and the last two dropped: the windowed walk's fence caught one such frame, +32 B. water_saved is the state's for good, so its views are made once. Co-Authored-By: Claude Opus 5.5 --- packages/ludic.render3d/water.ludic | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/ludic.render3d/water.ludic b/packages/ludic.render3d/water.ludic index 8aa2a41b..a078ab2b 100644 --- a/packages/ludic.render3d/water.ludic +++ b/packages/ludic.render3d/water.ludic @@ -25,6 +25,10 @@ function water_reflection_pass(render3d_st: mut Render3dState) -> void { # this reflection is composited into is smaller than the drawable, and a reflection # rendered at the window's size would be paying for pixels the water never samples render3d_st.water_refl = target_new(render3d_st, render3d_st.post_w / render3d_st.water_refl_div, render3d_st.post_h / render3d_st.water_refl_div, GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT, true, GL_LINEAR) + } + # views of the saved matrices, made once: water_saved is the state's for good, and a target + # made again (a resize, a render scale) made two more a time + if render3d_st.water_saved_vp == null { render3d_st.water_saved_vp = view(render3d_st.water_saved, 16, 16) render3d_st.water_saved_ivp = view(render3d_st.water_saved, 32, 16) }