From e9512fb88a128522b553172dc0d9ddc500535a4d Mon Sep 17 00:00:00 2001 From: Gulum Date: Sat, 31 Jan 2026 22:47:20 +0100 Subject: [PATCH] Add ocean shader settings and control sliders for wave properties --- index.html | 310 ++++++++++++++++++++++++++++++++++++++++------- src/constants.ts | 2 +- src/main.ts | 33 +++++ 3 files changed, 299 insertions(+), 46 deletions(-) diff --git a/index.html b/index.html index f2bcd52..fe44ef3 100644 --- a/index.html +++ b/index.html @@ -95,6 +95,56 @@ font-size: 14px; backdrop-filter: blur(10px); } + + .slider-group { + margin: 8px 0; + } + + .slider-group label { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 4px; + font-size: 13px; + } + + .slider-group input[type="range"] { + width: 100%; + height: 6px; + border-radius: 3px; + background: rgba(255, 255, 255, 0.2); + outline: none; + -webkit-appearance: none; + appearance: none; + } + + .slider-group input[type="range"]::-webkit-slider-thumb { + -webkit-appearance: none; + appearance: none; + width: 14px; + height: 14px; + border-radius: 50%; + background: #4a9eff; + cursor: pointer; + } + + .slider-group input[type="range"]::-moz-range-thumb { + width: 14px; + height: 14px; + border-radius: 50%; + background: #4a9eff; + cursor: pointer; + border: none; + } + + .slider-value { + background: rgba(255, 255, 255, 0.15); + padding: 2px 6px; + border-radius: 3px; + font-size: 11px; + min-width: 35px; + text-align: center; + } + } diff --git a/src/constants.ts b/src/constants.ts index 089ccd9..6c54303 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,5 +1,5 @@ // Configuration Constants -export const GRID_SIZE = 128; +export const GRID_SIZE = 256; export const NOISE_TEXTURE_WIDTH = 1024; export const NOISE_TEXTURE_HEIGHT = 1024; export const CANVAS_WIDTH = 800; diff --git a/src/main.ts b/src/main.ts index ab276e8..2e29cf0 100644 --- a/src/main.ts +++ b/src/main.ts @@ -145,6 +145,11 @@ var oceanLOD: OceanLOD; var curRotX = Config.CAMERA_DEFAULT_ROT_X; var curRotY = Config.CAMERA_DEFAULT_ROT_Y; var wireframeMode = false; +/** Ocean shader settings */ +var waveHeight = 1.0; +var waveSpeed = 1.0; +var foamIntensity = 1.0; +var glitterIntensity = 1.0; function drawScene() { fps++; let now = new Date(); @@ -203,6 +208,17 @@ function drawScene() { gl.uniform3fv(eye_loc, camera.pos); let uTime_loc = gl.getUniformLocation(defaultProgram, "uTime"); gl.uniform1f(uTime_loc, timeSpent); + + // Ocean shader settings + let uWaveHeight_loc = gl.getUniformLocation(defaultProgram, "uWaveHeight"); + gl.uniform1f(uWaveHeight_loc, waveHeight); + let uWaveSpeed_loc = gl.getUniformLocation(defaultProgram, "uWaveSpeed"); + gl.uniform1f(uWaveSpeed_loc, waveSpeed); + let uFoamIntensity_loc = gl.getUniformLocation(defaultProgram, "uFoamIntensity"); + gl.uniform1f(uFoamIntensity_loc, foamIntensity); + let uGlitterIntensity_loc = gl.getUniformLocation(defaultProgram, "uGlitterIntensity"); + gl.uniform1f(uGlitterIntensity_loc, glitterIntensity); + oceanLOD.draw(gl, wireframeMode); } requestAnimationFrame(drawScene); @@ -305,6 +321,23 @@ function main() { } console.log(`Wireframe mode: ${wireframeMode ? 'ON' : 'OFF'}`); }); + + // Ocean settings sliders + window.addEventListener('waveHeightChange', ((evt: CustomEvent) => { + waveHeight = evt.detail; + }) as EventListener); + + window.addEventListener('waveSpeedChange', ((evt: CustomEvent) => { + waveSpeed = evt.detail; + }) as EventListener); + + window.addEventListener('foamIntensityChange', ((evt: CustomEvent) => { + foamIntensity = evt.detail; + }) as EventListener); + + window.addEventListener('glitterIntensityChange', ((evt: CustomEvent) => { + glitterIntensity = evt.detail; + }) as EventListener); initShaders(); initGeometry();