Skip to content

Commit bfb4636

Browse files
Pavel DobryakovPavel Dobryakov
Pavel Dobryakov
authored and
Pavel Dobryakov
committed
blit refactoring
1 parent 93cad8a commit bfb4636

File tree

1 file changed

+51
-47
lines changed

1 file changed

+51
-47
lines changed

script.js

+51-47
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ SOFTWARE.
2424

2525
'use strict';
2626

27-
// Promo code
27+
// Mobile promo section
2828

2929
const promoPopup = document.getElementsByClassName('promo')[0];
3030
const promoPopupClose = document.getElementsByClassName('promo-close')[0];
@@ -51,7 +51,7 @@ googleLink.addEventListener('click', e => {
5151
window.open('https://play.google.com/store/apps/details?id=games.paveldogreat.fluidsimfree');
5252
});
5353

54-
// Simulation code
54+
// Simulation section
5555

5656
const canvas = document.getElementsByTagName('canvas')[0];
5757
resizeCanvas();
@@ -918,8 +918,22 @@ const blit = (() => {
918918
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
919919
gl.enableVertexAttribArray(0);
920920

921-
return (destination) => {
922-
gl.bindFramebuffer(gl.FRAMEBUFFER, destination);
921+
return (target, clear = false) => {
922+
if (target == null)
923+
{
924+
gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
925+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
926+
}
927+
else
928+
{
929+
gl.viewport(0, 0, target.width, target.height);
930+
gl.bindFramebuffer(gl.FRAMEBUFFER, target.fbo);
931+
}
932+
if (clear)
933+
{
934+
gl.clearColor(0.0, 0.0, 0.0, 1.0);
935+
gl.clear(gl.COLOR_BUFFER_BIT);
936+
}
923937
gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);
924938
}
925939
})();
@@ -966,6 +980,8 @@ function initFramebuffers () {
966980
const r = ext.formatR;
967981
const filtering = ext.supportLinearFiltering ? gl.LINEAR : gl.NEAREST;
968982

983+
gl.disable(gl.BLEND);
984+
969985
if (dye == null)
970986
dye = createDoubleFBO(dyeRes.width, dyeRes.height, rgba.internalFormat, rgba.format, texType, filtering);
971987
else
@@ -1084,7 +1100,7 @@ function resizeFBO (target, w, h, internalFormat, format, type, param) {
10841100
let newFBO = createFBO(w, h, internalFormat, format, type, param);
10851101
copyProgram.bind();
10861102
gl.uniform1i(copyProgram.uniforms.uTexture, target.attach(0));
1087-
blit(newFBO.fbo);
1103+
blit(newFBO);
10881104
return newFBO;
10891105
}
10901106

@@ -1205,47 +1221,46 @@ function applyInputs () {
12051221

12061222
function step (dt) {
12071223
gl.disable(gl.BLEND);
1208-
gl.viewport(0, 0, velocity.width, velocity.height);
12091224

12101225
curlProgram.bind();
12111226
gl.uniform2f(curlProgram.uniforms.texelSize, velocity.texelSizeX, velocity.texelSizeY);
12121227
gl.uniform1i(curlProgram.uniforms.uVelocity, velocity.read.attach(0));
1213-
blit(curl.fbo);
1228+
blit(curl);
12141229

12151230
vorticityProgram.bind();
12161231
gl.uniform2f(vorticityProgram.uniforms.texelSize, velocity.texelSizeX, velocity.texelSizeY);
12171232
gl.uniform1i(vorticityProgram.uniforms.uVelocity, velocity.read.attach(0));
12181233
gl.uniform1i(vorticityProgram.uniforms.uCurl, curl.attach(1));
12191234
gl.uniform1f(vorticityProgram.uniforms.curl, config.CURL);
12201235
gl.uniform1f(vorticityProgram.uniforms.dt, dt);
1221-
blit(velocity.write.fbo);
1236+
blit(velocity.write);
12221237
velocity.swap();
12231238

12241239
divergenceProgram.bind();
12251240
gl.uniform2f(divergenceProgram.uniforms.texelSize, velocity.texelSizeX, velocity.texelSizeY);
12261241
gl.uniform1i(divergenceProgram.uniforms.uVelocity, velocity.read.attach(0));
1227-
blit(divergence.fbo);
1242+
blit(divergence);
12281243

12291244
clearProgram.bind();
12301245
gl.uniform1i(clearProgram.uniforms.uTexture, pressure.read.attach(0));
12311246
gl.uniform1f(clearProgram.uniforms.value, config.PRESSURE);
1232-
blit(pressure.write.fbo);
1247+
blit(pressure.write);
12331248
pressure.swap();
12341249

12351250
pressureProgram.bind();
12361251
gl.uniform2f(pressureProgram.uniforms.texelSize, velocity.texelSizeX, velocity.texelSizeY);
12371252
gl.uniform1i(pressureProgram.uniforms.uDivergence, divergence.attach(0));
12381253
for (let i = 0; i < config.PRESSURE_ITERATIONS; i++) {
12391254
gl.uniform1i(pressureProgram.uniforms.uPressure, pressure.read.attach(1));
1240-
blit(pressure.write.fbo);
1255+
blit(pressure.write);
12411256
pressure.swap();
12421257
}
12431258

12441259
gradienSubtractProgram.bind();
12451260
gl.uniform2f(gradienSubtractProgram.uniforms.texelSize, velocity.texelSizeX, velocity.texelSizeY);
12461261
gl.uniform1i(gradienSubtractProgram.uniforms.uPressure, pressure.read.attach(0));
12471262
gl.uniform1i(gradienSubtractProgram.uniforms.uVelocity, velocity.read.attach(1));
1248-
blit(velocity.write.fbo);
1263+
blit(velocity.write);
12491264
velocity.swap();
12501265

12511266
advectionProgram.bind();
@@ -1257,17 +1272,15 @@ function step (dt) {
12571272
gl.uniform1i(advectionProgram.uniforms.uSource, velocityId);
12581273
gl.uniform1f(advectionProgram.uniforms.dt, dt);
12591274
gl.uniform1f(advectionProgram.uniforms.dissipation, config.VELOCITY_DISSIPATION);
1260-
blit(velocity.write.fbo);
1275+
blit(velocity.write);
12611276
velocity.swap();
12621277

1263-
gl.viewport(0, 0, dye.width, dye.height);
1264-
12651278
if (!ext.supportLinearFiltering)
12661279
gl.uniform2f(advectionProgram.uniforms.dyeTexelSize, dye.texelSizeX, dye.texelSizeY);
12671280
gl.uniform1i(advectionProgram.uniforms.uVelocity, velocity.read.attach(0));
12681281
gl.uniform1i(advectionProgram.uniforms.uSource, dye.read.attach(1));
12691282
gl.uniform1f(advectionProgram.uniforms.dissipation, config.DENSITY_DISSIPATION);
1270-
blit(dye.write.fbo);
1283+
blit(dye.write);
12711284
dye.swap();
12721285
}
12731286

@@ -1287,31 +1300,29 @@ function render (target) {
12871300
gl.disable(gl.BLEND);
12881301
}
12891302

1290-
let width = target == null ? gl.drawingBufferWidth : target.width;
1291-
let height = target == null ? gl.drawingBufferHeight : target.height;
1292-
gl.viewport(0, 0, width, height);
1293-
1294-
let fbo = target == null ? null : target.fbo;
12951303
if (!config.TRANSPARENT)
1296-
drawColor(fbo, normalizeColor(config.BACK_COLOR));
1304+
drawColor(target, normalizeColor(config.BACK_COLOR));
12971305
if (target == null && config.TRANSPARENT)
1298-
drawCheckerboard(fbo);
1299-
drawDisplay(fbo, width, height);
1306+
drawCheckerboard(target);
1307+
drawDisplay(target);
13001308
}
13011309

1302-
function drawColor (fbo, color) {
1310+
function drawColor (target, color) {
13031311
colorProgram.bind();
13041312
gl.uniform4f(colorProgram.uniforms.color, color.r, color.g, color.b, 1);
1305-
blit(fbo);
1313+
blit(target);
13061314
}
13071315

1308-
function drawCheckerboard (fbo) {
1316+
function drawCheckerboard (target) {
13091317
checkerboardProgram.bind();
13101318
gl.uniform1f(checkerboardProgram.uniforms.aspectRatio, canvas.width / canvas.height);
1311-
blit(fbo);
1319+
blit(target);
13121320
}
13131321

1314-
function drawDisplay (fbo, width, height) {
1322+
function drawDisplay (target) {
1323+
let width = target == null ? gl.drawingBufferWidth : target.width;
1324+
let height = target == null ? gl.drawingBufferHeight : target.height;
1325+
13151326
displayMaterial.bind();
13161327
if (config.SHADING)
13171328
gl.uniform2f(displayMaterial.uniforms.texelSize, 1.0 / width, 1.0 / height);
@@ -1324,7 +1335,7 @@ function drawDisplay (fbo, width, height) {
13241335
}
13251336
if (config.SUNRAYS)
13261337
gl.uniform1i(displayMaterial.uniforms.uSunrays, sunrays.attach(3));
1327-
blit(fbo);
1338+
blit(target);
13281339
}
13291340

13301341
function applyBloom (source, destination) {
@@ -1342,16 +1353,14 @@ function applyBloom (source, destination) {
13421353
gl.uniform3f(bloomPrefilterProgram.uniforms.curve, curve0, curve1, curve2);
13431354
gl.uniform1f(bloomPrefilterProgram.uniforms.threshold, config.BLOOM_THRESHOLD);
13441355
gl.uniform1i(bloomPrefilterProgram.uniforms.uTexture, source.attach(0));
1345-
gl.viewport(0, 0, last.width, last.height);
1346-
blit(last.fbo);
1356+
blit(last);
13471357

13481358
bloomBlurProgram.bind();
13491359
for (let i = 0; i < bloomFramebuffers.length; i++) {
13501360
let dest = bloomFramebuffers[i];
13511361
gl.uniform2f(bloomBlurProgram.uniforms.texelSize, last.texelSizeX, last.texelSizeY);
13521362
gl.uniform1i(bloomBlurProgram.uniforms.uTexture, last.attach(0));
1353-
gl.viewport(0, 0, dest.width, dest.height);
1354-
blit(dest.fbo);
1363+
blit(dest);
13551364
last = dest;
13561365
}
13571366

@@ -1363,7 +1372,7 @@ function applyBloom (source, destination) {
13631372
gl.uniform2f(bloomBlurProgram.uniforms.texelSize, last.texelSizeX, last.texelSizeY);
13641373
gl.uniform1i(bloomBlurProgram.uniforms.uTexture, last.attach(0));
13651374
gl.viewport(0, 0, baseTex.width, baseTex.height);
1366-
blit(baseTex.fbo);
1375+
blit(baseTex);
13671376
last = baseTex;
13681377
}
13691378

@@ -1372,34 +1381,31 @@ function applyBloom (source, destination) {
13721381
gl.uniform2f(bloomFinalProgram.uniforms.texelSize, last.texelSizeX, last.texelSizeY);
13731382
gl.uniform1i(bloomFinalProgram.uniforms.uTexture, last.attach(0));
13741383
gl.uniform1f(bloomFinalProgram.uniforms.intensity, config.BLOOM_INTENSITY);
1375-
gl.viewport(0, 0, destination.width, destination.height);
1376-
blit(destination.fbo);
1384+
blit(destination);
13771385
}
13781386

13791387
function applySunrays (source, mask, destination) {
13801388
gl.disable(gl.BLEND);
13811389
sunraysMaskProgram.bind();
13821390
gl.uniform1i(sunraysMaskProgram.uniforms.uTexture, source.attach(0));
1383-
gl.viewport(0, 0, mask.width, mask.height);
1384-
blit(mask.fbo);
1391+
blit(mask);
13851392

13861393
sunraysProgram.bind();
13871394
gl.uniform1f(sunraysProgram.uniforms.weight, config.SUNRAYS_WEIGHT);
13881395
gl.uniform1i(sunraysProgram.uniforms.uTexture, mask.attach(0));
1389-
gl.viewport(0, 0, destination.width, destination.height);
1390-
blit(destination.fbo);
1396+
blit(destination);
13911397
}
13921398

13931399
function blur (target, temp, iterations) {
13941400
blurProgram.bind();
13951401
for (let i = 0; i < iterations; i++) {
13961402
gl.uniform2f(blurProgram.uniforms.texelSize, target.texelSizeX, 0.0);
13971403
gl.uniform1i(blurProgram.uniforms.uTexture, target.attach(0));
1398-
blit(temp.fbo);
1404+
blit(temp);
13991405

14001406
gl.uniform2f(blurProgram.uniforms.texelSize, 0.0, target.texelSizeY);
14011407
gl.uniform1i(blurProgram.uniforms.uTexture, temp.attach(0));
1402-
blit(target.fbo);
1408+
blit(target);
14031409
}
14041410
}
14051411

@@ -1424,20 +1430,18 @@ function multipleSplats (amount) {
14241430
}
14251431

14261432
function splat (x, y, dx, dy, color) {
1427-
gl.viewport(0, 0, velocity.width, velocity.height);
14281433
splatProgram.bind();
14291434
gl.uniform1i(splatProgram.uniforms.uTarget, velocity.read.attach(0));
14301435
gl.uniform1f(splatProgram.uniforms.aspectRatio, canvas.width / canvas.height);
14311436
gl.uniform2f(splatProgram.uniforms.point, x, y);
14321437
gl.uniform3f(splatProgram.uniforms.color, dx, dy, 0.0);
14331438
gl.uniform1f(splatProgram.uniforms.radius, correctRadius(config.SPLAT_RADIUS / 100.0));
1434-
blit(velocity.write.fbo);
1439+
blit(velocity.write);
14351440
velocity.swap();
14361441

1437-
gl.viewport(0, 0, dye.width, dye.height);
14381442
gl.uniform1i(splatProgram.uniforms.uTarget, dye.read.attach(0));
14391443
gl.uniform3f(splatProgram.uniforms.color, color.r, color.g, color.b);
1440-
blit(dye.write.fbo);
1444+
blit(dye.write);
14411445
dye.swap();
14421446
}
14431447

0 commit comments

Comments
 (0)