little changes

This commit is contained in:
Pavel Dobryakov
2017-08-20 20:22:29 +03:00
parent 7eb6a67c0c
commit c1487d90d1

View File

@@ -9,14 +9,14 @@ const support_linear_float = gl.getExtension('OES_texture_half_float_linear');
resizeCanvas(); resizeCanvas();
const TEXTURE_DOWNSAMPLE = 2; const TEXTURE_DOWNSAMPLE = 1;
const TEXTURE_WIDTH = gl.drawingBufferWidth >> TEXTURE_DOWNSAMPLE; const TEXTURE_WIDTH = gl.drawingBufferWidth >> TEXTURE_DOWNSAMPLE;
const TEXTURE_HEIGHT = gl.drawingBufferHeight >> TEXTURE_DOWNSAMPLE; const TEXTURE_HEIGHT = gl.drawingBufferHeight >> TEXTURE_DOWNSAMPLE;
const DENSITY_DISSIPATION = 0.98; const DENSITY_DISSIPATION = 0.98;
const VELOCITY_DISSIPATION = 0.99; const VELOCITY_DISSIPATION = 0.99;
const SPLAT_RADIUS = 0.005; const SPLAT_RADIUS = 0.01;
const CURL = 30; const CURL = 30;
const PRESSURE_ITERATIONS = 20; const PRESSURE_ITERATIONS = 30;
class GLProgram { class GLProgram {
constructor (vertexShader, fragmentShader) { constructor (vertexShader, fragmentShader) {
@@ -221,7 +221,7 @@ const curlShader = compileShader(gl.FRAGMENT_SHADER, `
float R = texture2D(uVelocity, vR).y; float R = texture2D(uVelocity, vR).y;
float T = texture2D(uVelocity, vT).x; float T = texture2D(uVelocity, vT).x;
float B = texture2D(uVelocity, vB).x; float B = texture2D(uVelocity, vB).x;
float vorticity = 0.5 * (R - L - T + B); float vorticity = R - L - T + B;
gl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0); gl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0);
} }
`); `);
@@ -245,12 +245,8 @@ const vorticityShader = compileShader(gl.FRAGMENT_SHADER, `
float T = texture2D(uCurl, vT).x; float T = texture2D(uCurl, vT).x;
float B = texture2D(uCurl, vB).x; float B = texture2D(uCurl, vB).x;
float C = texture2D(uCurl, vUv).x; float C = texture2D(uCurl, vUv).x;
vec2 force = vec2(abs(T) - abs(B), abs(R) - abs(L));
vec2 force = 0.5 * vec2(abs(T) - abs(B), abs(R) - abs(L)); force *= 1.0 / length(force + 0.00001) * curl * C;
float lengthSquared = max(0.0001, dot(force, force));
force *= inversesqrt(lengthSquared) * curl * C;
force.y *= -1.0;
vec2 vel = texture2D(uVelocity, vUv).xy; vec2 vel = texture2D(uVelocity, vUv).xy;
gl_FragColor = vec4(vel + force * dt, 0.0, 1.0); gl_FragColor = vec4(vel + force * dt, 0.0, 1.0);
} }
@@ -390,19 +386,16 @@ const pressureProgram = new GLProgram(baseVertexShader, pressureShader);
const gradienSubtractProgram = new GLProgram(baseVertexShader, gradientSubtractShader); const gradienSubtractProgram = new GLProgram(baseVertexShader, gradientSubtractShader);
let pointer = { let pointer = {
x: 0, x: canvas.width * 0.5,
y: 0, y: canvas.height * 0.7,
deltax: 0, deltax: 0,
deltay: 0, deltay: -500,
down: false, down: false,
moved: false, moved: false,
color: [0.4, 0, 1] color: [30, 0, 300]
} }
initDensityProgram.bind(); splat();
blit(density.first[1]);
initVelocityProgram.bind();
blit(velocity.first[1]);
Update(); Update();
@@ -426,21 +419,8 @@ function Update () {
blit(density.second[1]); blit(density.second[1]);
density.swap(); density.swap();
if (pointer.moved) if (pointer.moved) {
{ splat();
splatProgram.bind();
gl.uniform1i(splatProgram.uniforms.uTarget, velocity.first[2]);
gl.uniform1f(splatProgram.uniforms.aspectRatio, TEXTURE_WIDTH / TEXTURE_HEIGHT);
gl.uniform2f(splatProgram.uniforms.point, pointer.x / canvas.width, 1.0 - pointer.y / canvas.height);
gl.uniform3f(splatProgram.uniforms.color, pointer.deltax, -pointer.deltay, 1.0);
gl.uniform1f(splatProgram.uniforms.radius, SPLAT_RADIUS);
blit(velocity.second[1]);
velocity.swap();
gl.uniform1i(splatProgram.uniforms.uTarget, density.first[2]);
gl.uniform3f(splatProgram.uniforms.color, pointer.color[0] * 0.3, pointer.color[1] * 0.3, pointer.color[2] * 0.3);
blit(density.second[1]);
density.swap();
} }
curlProgram.bind(); curlProgram.bind();
@@ -489,6 +469,22 @@ function Update () {
requestAnimationFrame(Update); requestAnimationFrame(Update);
} }
function splat () {
splatProgram.bind();
gl.uniform1i(splatProgram.uniforms.uTarget, velocity.first[2]);
gl.uniform1f(splatProgram.uniforms.aspectRatio, TEXTURE_WIDTH / TEXTURE_HEIGHT);
gl.uniform2f(splatProgram.uniforms.point, pointer.x / canvas.width, 1.0 - pointer.y / canvas.height);
gl.uniform3f(splatProgram.uniforms.color, pointer.deltax, -pointer.deltay, 1.0);
gl.uniform1f(splatProgram.uniforms.radius, SPLAT_RADIUS);
blit(velocity.second[1]);
velocity.swap();
gl.uniform1i(splatProgram.uniforms.uTarget, density.first[2]);
gl.uniform3f(splatProgram.uniforms.color, pointer.color[0] * 0.3, pointer.color[1] * 0.3, pointer.color[2] * 0.3);
blit(density.second[1]);
density.swap();
}
function resizeCanvas () { function resizeCanvas () {
if (canvas.width != canvas.clientWidth || canvas.height != canvas.clientHeight) { if (canvas.width != canvas.clientWidth || canvas.height != canvas.clientHeight) {
const displayHeight = canvas.clientHeight; const displayHeight = canvas.clientHeight;
@@ -516,7 +512,7 @@ canvas.addEventListener('touchmove', (e) => {
}); });
function clampDelta (delta) { function clampDelta (delta) {
return delta * 10;//Math.min(Math.max(delta, -CELL_SIZE), CELL_SIZE); return delta * 10; // not a clamp really lololo
} }
canvas.addEventListener('mousedown', onPointerDown); canvas.addEventListener('mousedown', onPointerDown);