recolor the water

This commit is contained in:
Alula 2020-12-06 20:31:36 +01:00
parent 035b2c2848
commit ad4fc4b481
No known key found for this signature in database
GPG Key ID: 3E00485503A1D8BA
3 changed files with 10 additions and 5 deletions

View File

@ -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);
}

View File

@ -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;

View File

@ -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 {