From 92045aa03df13da700f0fa2284584d25b3d13a0c Mon Sep 17 00:00:00 2001 From: mikolalysenko Date: Sun, 1 May 2016 09:25:40 -0700 Subject: [PATCH] add simple game-of-life demo --- example/life.js | 76 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 example/life.js diff --git a/example/life.js b/example/life.js new file mode 100644 index 00000000..a732dc32 --- /dev/null +++ b/example/life.js @@ -0,0 +1,76 @@ +const regl = require('../regl')() + +const RADIUS = 512 +const INITIAL_CONDITIONS = (Array(RADIUS * RADIUS * 4)).fill(0).map( + () => Math.random() > 0.9 ? 255 : 0) + +const state = (Array(2)).fill().map(() => + regl.framebuffer({ + colorBuffer: regl.texture({ + radius: RADIUS, + data: INITIAL_CONDITIONS, + wrap: 'repeat' + }), + depth: false + })) + +const updateLife = regl({ + frag: ` + precision mediump float; + uniform sampler2D prevState; + varying vec2 uv; + void main() { + float n = 0.0; + for(int dx=-1; dx<=1; ++dx) + for(int dy=-1; dy<=1; ++dy) { + n += texture2D(prevState, uv+vec2(dx,dy)/float(${RADIUS})).r; + } + float s = texture2D(prevState, uv).r; + if(n > 3.0+s || n < 3.0) { + gl_FragColor = vec4(0,0,0,1); + } else { + gl_FragColor = vec4(1,1,1,1); + } + }`, + + framebuffer: (args, id, params) => state[(params.count + 1) % 2] +}) + +const setupQuad = regl({ + frag: ` + precision mediump float; + uniform sampler2D prevState; + varying vec2 uv; + void main() { + float state = texture2D(prevState, uv).r; + gl_FragColor = vec4(vec3(state), 1); + }`, + + vert: ` + precision mediump float; + attribute vec2 position; + varying vec2 uv; + void main() { + uv = 0.5 * (position + 1.0); + gl_Position = vec4(position, 0, 1); + }`, + + attributes: { + position: regl.buffer([ -4, -4, 4, -4, 0, 4 ]) + }, + + uniforms: { + prevState: (args, id, params) => state[params.count % 2].color[0] + }, + + depth: { enable: false }, + + count: 3 +}) + +regl.frame(() => { + setupQuad(() => { + regl.draw() + updateLife() + }) +})