diff options
-rw-r--r-- | src/main.cc | 19 | ||||
-rw-r--r-- | src/shader/code/collide.glsl | 9 | ||||
-rw-r--r-- | src/shader/code/vertex.glsl | 2 |
3 files changed, 20 insertions, 10 deletions
diff --git a/src/main.cc b/src/main.cc index fb3bfd0..0b4df95 100644 --- a/src/main.cc +++ b/src/main.cc @@ -23,10 +23,10 @@ #include "timer.h" -constexpr GLuint nX = 256; +constexpr GLuint nX = 512; constexpr GLuint nY = 128; -constexpr int lups = 50; // max lattice updates per second +constexpr int lups = 100; // max lattice updates per second float getWorldHeight(int window_width, int window_height, float world_width) { return world_width / window_width * window_height; @@ -64,10 +64,10 @@ int setupOpenGeometry(int x, int y) { return 0; // disable end of world } if ( (x == 1 || x == nX-2) && (y > 0 && y < nY-1) ) { - if ( x == 1 && y > nY/4 && y < 3*nY/4 ) { + if ( x == 1 && y > 1 && y < nY-2 ) { return 5; // inflow } - if ( x == nX-2 && y > nY/4 && y < 3*nY/4 ) { + if ( x == nX-2 && y > 1 && y < nY-2 ) { return 6; // outflow } return 2; // bounce back outer walls @@ -75,6 +75,9 @@ int setupOpenGeometry(int x, int y) { if ( (y == 1 || y == nY-2) && (x > 0 && x < nX-1) ) { return 2; // bounce back outer walls } + if ( (x-50)*(x-50) + (y-nY/2)*(y-nY/2) < 200 ) { + return 3; // bounce back cylinder + } return 1; // everything else shall be bulk fluid } @@ -86,7 +89,7 @@ int render(bool open_boundaries) { return -1; } - float world_width = 1*nX; + float world_width = 1.1*nX; float world_height = getWorldHeight(window.getWidth(), window.getHeight(), world_width); glm::mat4 MVP = getMVP(world_width, world_height); @@ -124,6 +127,8 @@ int render(bool open_boundaries) { auto pause_key = window.getKeyWatcher(GLFW_KEY_SPACE); + GLuint iT = 0; + int prevMouseState = 0; float prevLatticeMouseX; float prevLatticeMouseY; @@ -186,6 +191,10 @@ int render(bool open_boundaries) { /// Perform collide & stream steps { auto guard = collide_shader->use(); + + collide_shader->setUniform("iT", iT); + iT += 1; + collide_shader->dispatch(nX, nY); } diff --git a/src/shader/code/collide.glsl b/src/shader/code/collide.glsl index 4efd7fb..230f02e 100644 --- a/src/shader/code/collide.glsl +++ b/src/shader/code/collide.glsl @@ -7,10 +7,11 @@ layout (std430, binding=1) buffer bufferCollide { float collideCells[]; }; layout (std430, binding=2) buffer bufferStream { float streamCells[]; }; layout (std430, binding=3) buffer bufferFluid { float fluidCells[]; }; -/// LBM constants - uniform uint nX; uniform uint nY; +uniform uint iT; + +/// LBM constants const uint q = 9; const float weight[q] = float[]( @@ -19,7 +20,7 @@ const float weight[q] = float[]( 1./36 , 1./9., 1./36. ); -const float tau = 0.8; +const float tau = 0.6; const float omega = 1/tau; /// Vector utilities @@ -142,7 +143,7 @@ void main() { if ( isBulkFluidCell(material) ) { if ( isInflowCell(material) ) { - v = vec2(0.1,0.0); + v = vec2(min(float(iT)*0.2/2000.0, 0.2), 0.0); } if ( isOutflowCell(material) ) { d = 1.0; diff --git a/src/shader/code/vertex.glsl b/src/shader/code/vertex.glsl index e0ce9a8..67a5d80 100644 --- a/src/shader/code/vertex.glsl +++ b/src/shader/code/vertex.glsl @@ -10,7 +10,7 @@ out VS_OUT { uniform uint nX; uniform uint nY; -const float displayAmplifier = 10.0; +const float displayAmplifier = 4.0; float unit(float x) { return 1.0/(1.0+exp(-x)); |