diff --git a/backend/templates/visualizer.html.tera b/backend/templates/visualizer.html.tera index 7ed2e83..e393e6e 100644 --- a/backend/templates/visualizer.html.tera +++ b/backend/templates/visualizer.html.tera @@ -31,18 +31,11 @@

{{game.name}}

Turns: {{game.turns}}

- {# {% else %} -
- No options available -
#} {% endfor %} - {% endblock %} diff --git a/frontend/www/index.ts b/frontend/www/index.ts index 67e2866..a34d535 100644 --- a/frontend/www/index.ts +++ b/frontend/www/index.ts @@ -1,7 +1,7 @@ import { Game } from "planetwars"; import { memory } from "planetwars/planetwars_bg"; import { Resizer, resizeCanvasToDisplaySize, FPSCounter, url_to_mesh, Mesh } from "./webgl/util"; -import { Shader, Uniform4f, Uniform2fv, Uniform3fv, Uniform1i, Uniform1f, Uniform2f, ShaderFactory, Uniform3f, UniformMatrix3fv } from './webgl/shader'; +import { Shader, Uniform4f, Uniform2fv, Uniform3fv, Uniform1i, Uniform1f, Uniform2f, ShaderFactory, Uniform3f, UniformMatrix3fv, UniformBool } from './webgl/shader'; import { Renderer } from "./webgl/renderer"; import { VertexBuffer, IndexBuffer } from "./webgl/buffer"; import { VertexBufferLayout, VertexArray } from "./webgl/vertexBufferLayout"; @@ -79,6 +79,8 @@ class GameInstance { renderer: Renderer; planet_count: number; + vor_counter = 3; + use_vor = true; playing = true; // 0 is paused, 1 is playing but not rerendered, 2 is playing and rerendered time_stopped_delta = 0; last_time = 0; @@ -223,6 +225,16 @@ class GameInstance { render(time: number) { COUNTER.frame(time); + if (COUNTER.delta(time) < 30) { + this.vor_counter = Math.min(3, this.vor_counter + 1); + } else { + this.vor_counter = Math.max(-3, this.vor_counter - 1); + } + + if (this.vor_counter < -2) { + this.use_vor = false; + } + if (!this.playing) { this.last_time = time; @@ -244,11 +256,13 @@ class GameInstance { this.vor_shader.uniform(GL, "u_viewbox", new Uniform4f(this.resizer.get_viewbox())); this.vor_shader.uniform(GL, "u_resolution", new Uniform2f(RESOLUTION)); + this.vor_shader.uniform(GL, "u_vor", new UniformBool(this.use_vor)); this.shader.uniform(GL, "u_time", new Uniform1f((time - this.last_time) / ms_per_frame)); 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)); + this.shader.uniform(GL, "u_vor", new UniformBool(true)); this.renderer.render(GL); } diff --git a/frontend/www/static/shaders/frag/vor.glsl b/frontend/www/static/shaders/frag/vor.glsl index bfb4968..62e33f5 100644 --- a/frontend/www/static/shaders/frag/vor.glsl +++ b/frontend/www/static/shaders/frag/vor.glsl @@ -7,18 +7,22 @@ uniform vec3 u_planet_colours[$PLANETS * 2]; uniform float u_step_interval; uniform float u_time; +uniform bool u_vor; varying vec2 v_pos; void main() { vec3 color = vec3(0.2); - float dis = 1000000.0; - for(int i = 0; i < $PLANETS; i++) { - float d = distance(v_pos, u_planets[i].xy); - if (d < dis) { - dis = d; - color = u_planet_colours[2 * i]; + if (u_vor) { + float dis = 1000000.0; + + for(int i = 0; i < $PLANETS; i++) { + float d = distance(v_pos, u_planets[i].xy); + if (d < dis) { + dis = d; + color = u_planet_colours[2 * i]; + } } } diff --git a/frontend/www/webgl/shader.ts b/frontend/www/webgl/shader.ts index 31c2bf7..ffe1ee0 100644 --- a/frontend/www/webgl/shader.ts +++ b/frontend/www/webgl/shader.ts @@ -312,3 +312,14 @@ export class UniformMatrix3fv implements Uniform { gl.uniformMatrix3fv(location, false, this.data); } } + +export class UniformBool implements Uniform { + data: boolean; + constructor(data: boolean) { + this.data = data; + } + + setUniform(gl: WebGLRenderingContext, location: WebGLUniformLocation) { + gl.uniform1i(location, this.data ? 1 : 0); + } +} diff --git a/frontend/www/webgl/util.ts b/frontend/www/webgl/util.ts index e36ef15..3130405 100644 --- a/frontend/www/webgl/util.ts +++ b/frontend/www/webgl/util.ts @@ -35,19 +35,30 @@ export function resizeCanvasToDisplaySize( export class FPSCounter { last: number; count: number; + _delta: number; + _prev: number constructor() { this.last = 0; this.count = 0; + this._delta = 0; + this._prev = 0; } frame(now: number) { this.count += 1; + this._delta = now - this._prev; + this._prev = now; + if (now - this.last > 1000) { this.last = now; console.log(this.count + " fps"); this.count = 0; } } + + delta(now: number): number { + return this._delta; + } } export class Resizer {