From 89eae79eca12c19679eaf614d2a94074a3b10435 Mon Sep 17 00:00:00 2001 From: ajuvercr Date: Thu, 19 Sep 2019 18:27:56 +0200 Subject: [PATCH] smooth transition --- frontend/src/lib.rs | 18 ++++++++++++++---- frontend/www/index.ts | 12 ++++++++---- frontend/www/static/shaders/frag/simple.glsl | 7 ++++++- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/frontend/src/lib.rs b/frontend/src/lib.rs index 740b7bf..cfefae7 100644 --- a/frontend/src/lib.rs +++ b/frontend/src/lib.rs @@ -78,10 +78,20 @@ impl Game { } fn update_planet_colours(&mut self) { - self.current_planet_colours = self.states[self.turn].planets - .iter() - .map(|p| utils::COLORS[p.owner.unwrap_or(0) as usize % utils::COLORS.len()].into()) - .collect(); + let mut new_vec = Vec::new(); + let planets_now = self.states[self.turn].planets.iter(); + let planets_later = self.states[(self.turn + 1).min(self.states.len() - 1)].planets.iter(); + + for (p1, p2) in planets_now.zip(planets_later) { + new_vec.push( + utils::COLORS[p1.owner.unwrap_or(0) as usize % utils::COLORS.len()].into() + ); + new_vec.push( + utils::COLORS[p2.owner.unwrap_or(0) as usize % utils::COLORS.len()].into() + ); + } + + self.current_planet_colours = new_vec; } fn update_ship_locations(&mut self) { diff --git a/frontend/www/index.ts b/frontend/www/index.ts index d628fb1..58ef527 100644 --- a/frontend/www/index.ts +++ b/frontend/www/index.ts @@ -104,22 +104,26 @@ class GameInstance { } render(time: number) { - if (time > this.last_time + 100) { + if (time > this.last_time + 1000) { this.last_time = time; this.frame ++; this.game.update_turn(this.frame); - const colours = f32v(this.game.get_planet_colors(), this.planet_count * 3); + const colours = f32v(this.game.get_planet_colors(), this.planet_count * 6); for(let i=0; i < this.planet_count; i++){ - const u = new Uniform3f(colours[i*3], colours[i*3 + 1], colours[i*3 + 2]); + const u = new Uniform3f(colours[i*6], colours[i*6 + 1], colours[i*6 + 2]); this.renderer.updateUniform(i, (us) => us["u_color"] = u); + const u2 = new Uniform3f(colours[i*6 + 3], colours[i*6 + 4], colours[i*6 + 5]); + this.renderer.updateUniform(i, (us) => us["u_color_next"] = u2); } + } GL.bindFramebuffer(GL.FRAMEBUFFER, null); GL.viewport(0, 0, GL.canvas.width, GL.canvas.height); GL.clear(GL.COLOR_BUFFER_BIT | GL.DEPTH_BUFFER_BIT); - this.shader.uniform(GL, "u_time", new Uniform1f(time * 0.001)); + this.shader.uniform(GL, "u_step_interval", new Uniform1f(1000)); + this.shader.uniform(GL, "u_time", new Uniform1f(time)); this.shader.uniform(GL, "u_mouse", new Uniform2f(this.resizer.get_mouse_pos())); this.shader.uniform(GL, "u_viewbox", new Uniform4f(this.resizer.get_viewbox())); this.shader.uniform(GL, "u_resolution", new Uniform2f(RESOLUTION)); diff --git a/frontend/www/static/shaders/frag/simple.glsl b/frontend/www/static/shaders/frag/simple.glsl index cb8bc50..2f266c7 100644 --- a/frontend/www/static/shaders/frag/simple.glsl +++ b/frontend/www/static/shaders/frag/simple.glsl @@ -2,8 +2,13 @@ precision mediump float; #endif +uniform float u_step_interval; +uniform float u_time; uniform vec3 u_color; +uniform vec3 u_color_next; void main() { - gl_FragColor = vec4(u_color, 1.0); + float part = fract(u_time / u_step_interval); + vec3 color = mix(u_color, u_color_next, part); + gl_FragColor = vec4(color, 1.0); }