mirror of
https://github.com/PavelDoGreat/WebGL-Fluid-Simulation.git
synced 2025-10-03 17:31:53 +02:00
little changes
This commit is contained in:
64
script.js
64
script.js
@@ -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);
|
||||||
|
Reference in New Issue
Block a user