@@ -186,6 +186,12 @@ async function init(): Promise<void> {
186186 usage : GPUBufferUsage . UNIFORM | GPUBufferUsage . COPY_DST ,
187187 } ) ;
188188
189+ // Water rendering uniforms (density, causticIntensity, ior, fresnelMin)
190+ const waterUniformBuffer = device . createBuffer ( {
191+ size : 16 ,
192+ usage : GPUBufferUsage . UNIFORM | GPUBufferUsage . COPY_DST ,
193+ } ) ;
194+
189195 // --- Lighting ---
190196
191197 /** Current light direction (normalized) */
@@ -228,6 +234,7 @@ async function init(): Promise<void> {
228234 lightUniformBuffer ,
229235 sphereUniformBuffer ,
230236 shadowUniformBuffer ,
237+ waterUniformBuffer ,
231238 tileTexture ,
232239 tileSampler ,
233240 skyTexture ,
@@ -244,8 +251,6 @@ async function init(): Promise<void> {
244251 const radius = 0.25 ;
245252 /** Current sphere velocity */
246253 let velocity = new Vector ( ) ;
247- /** Gravity acceleration vector */
248- const gravity = new Vector ( 0 , - 15 , 0 ) ;
249254 /** Whether physics (gravity/buoyancy) is enabled */
250255 let useSpherePhysics = false ;
251256 /** Whether simulation is paused */
@@ -255,6 +260,7 @@ async function init(): Promise<void> {
255260 const gui = new GUI ( { title : 'Settings' } ) ;
256261 gui . close ( ) ; // Collapse by default
257262
263+ const waterFolder = gui . addFolder ( 'Water' ) ;
258264 const objectFolder = gui . addFolder ( 'Object' ) ;
259265 const sceneFolder = gui . addFolder ( 'Scene' ) ;
260266
@@ -264,6 +270,9 @@ async function init(): Promise<void> {
264270 object : 'Sphere' ,
265271 useDensity : false ,
266272 density : 0.9 ,
273+ causticsIntensity : 0.2 ,
274+ ior : 1.333 ,
275+ fresnelMin : 0.25 ,
267276 } ;
268277
269278 objectFolder
@@ -287,7 +296,7 @@ async function init(): Promise<void> {
287296 ( document . activeElement as HTMLElement ) ?. blur ( ) ;
288297 } ) ;
289298
290- const densityCheckbox = objectFolder
299+ objectFolder
291300 . add ( settings , 'useDensity' )
292301 . name ( 'Enable Density' )
293302 . onChange ( ( ) => {
@@ -319,6 +328,27 @@ async function init(): Promise<void> {
319328 ( document . activeElement as HTMLElement ) ?. blur ( ) ;
320329 } ) ;
321330
331+ waterFolder
332+ . add ( settings , 'causticsIntensity' , 0.0 , 1.0 , 0.01 )
333+ . name ( 'Caustics' )
334+ . onChange ( ( ) => {
335+ ( document . activeElement as HTMLElement ) ?. blur ( ) ;
336+ } ) ;
337+
338+ waterFolder
339+ . add ( settings , 'ior' , 1.0 , 1.5 , 0.001 )
340+ . name ( 'Refraction' )
341+ . onChange ( ( ) => {
342+ ( document . activeElement as HTMLElement ) ?. blur ( ) ;
343+ } ) ;
344+
345+ waterFolder
346+ . add ( settings , 'fresnelMin' , 0.0 , 1.0 , 0.01 )
347+ . name ( 'Reflection' )
348+ . onChange ( ( ) => {
349+ ( document . activeElement as HTMLElement ) ?. blur ( ) ;
350+ } ) ;
351+
322352 // Initialize sphere position
323353 sphere . update ( center . toArray ( ) , radius ) ;
324354
@@ -661,6 +691,15 @@ async function init(): Promise<void> {
661691 updateLight ( ) ;
662692 }
663693
694+ // Update water rendering uniforms (density, caustics, IOR, fresnel)
695+ // Do this before simulation steps so caustics update uses correct values
696+ water . updateWaterParameters (
697+ settings . useDensity ? settings . density : 0.0 ,
698+ settings . causticsIntensity ,
699+ settings . ior ,
700+ settings . fresnelMin
701+ ) ;
702+
664703 if ( ! paused ) {
665704 // --- Physics Update ---
666705
@@ -724,10 +763,6 @@ async function init(): Promise<void> {
724763 water . updateCaustics ( ) ;
725764 }
726765
727- // Update water rendering uniforms (density)
728- // If density is disabled, we use 0 to disable absorption effect in shader
729- water . updateDensity ( settings . useDensity ? settings . density : 0.0 ) ;
730-
731766 // Update camera uniforms
732767 updateUniforms ( ) ;
733768
0 commit comments