diff --git a/src/builtin/shaders/water_150.frag.glsl b/src/builtin/shaders/water_150.frag.glsl index e5eb233..bb1bf09 100644 --- a/src/builtin/shaders/water_150.frag.glsl +++ b/src/builtin/shaders/water_150.frag.glsl @@ -11,16 +11,18 @@ layout (std140) uniform Globals { layout (std140) uniform WaterShaderParams { vec2 u_Resolution; + vec2 u_FramePos; float u_Tick; }; void main() { vec2 wave = v_Uv; - wave.x += sin(v_Uv.x * 40.0 + u_Tick / 20.0) * (sin(u_Tick / 10.0) * 0.01); - wave.y -= cos(v_Uv.y * 20.0 + u_Tick / 5.0) * (sin(u_Tick / 20.0) * 0.01); + wave.x += sin((-u_FramePos.y / u_Resolution.y + v_Uv.x * 16.0) + u_Tick / 20.0) * 2.0 / u_Resolution.x; + wave.y -= cos((-u_FramePos.x / u_Resolution.x + v_Uv.y * 16.0) + u_Tick / 5.0) * 2.0 / u_Resolution.y; float off = 0.4 / u_Resolution.y; vec4 color = texture(t_Texture, wave); color.r = texture(t_Texture, wave + off).r; color.b = texture(t_Texture, wave - off).b; - Target0 = vec4(0.7, 0.8, 1.2, 1.0) * color * v_Color; + + Target0 = (vec4(0.4, 0.6, 0.8, 1.0) * 0.3) + (color * v_Color * 0.7); } diff --git a/src/scene/game_scene.rs b/src/scene/game_scene.rs index 84ecfc6..2d38371 100644 --- a/src/scene/game_scene.rs +++ b/src/scene/game_scene.rs @@ -649,8 +649,11 @@ impl GameScene { } fn draw_water(&self, state: &mut SharedGameState, ctx: &mut Context) -> GameResult { + let (frame_x, frame_y) = self.frame.xy_interpolated(state.frame_time, state.scale); + { state.shaders.water_shader_params.resolution = [state.canvas_size.0, state.canvas_size.1]; + state.shaders.water_shader_params.frame_pos = [frame_x, frame_y]; state.shaders.water_shader_params.t = self.tick as f32; let _lock = graphics::use_shader(ctx, &state.shaders.water_shader); state.shaders.water_shader.send(ctx, state.shaders.water_shader_params)?; @@ -666,8 +669,6 @@ impl GameScene { // cheap, clones a reference underneath let mut tmp_batch = SpriteBatch::new(state.tmp_canvas.image().clone()); - let (frame_x, frame_y) = self.frame.xy_interpolated(state.frame_time, state.scale); - let tile_start_x = clamp(self.frame.x / 0x200 / 16, 0, self.stage.map.width as isize) as usize; let tile_start_y = clamp(self.frame.y / 0x200 / 16, 0, self.stage.map.height as isize) as usize; let tile_end_x = clamp((self.frame.x / 0x200 + 8 + state.canvas_size.0 as isize) / 16 + 1, 0, self.stage.map.width as isize) as usize; diff --git a/src/shaders.rs b/src/shaders.rs index 291571f..9256fca 100644 --- a/src/shaders.rs +++ b/src/shaders.rs @@ -5,6 +5,7 @@ use ggez::{Context, GameResult}; gfx_defines! { constant WaterShaderParams { resolution: [f32; 2] = "u_Resolution", + frame_pos: [f32; 2] = "u_FramePos", t: f32 = "u_Tick", } } @@ -19,6 +20,7 @@ impl Shaders { let water_shader_params = WaterShaderParams { t: 0.0, resolution: [0.0, 0.0], + frame_pos: [0.0, 0.0], }; Ok(Shaders {