aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buffer/vertex/fluid_cell_buffer.cc11
-rw-r--r--src/buffer/vertex/fluid_cell_buffer.h4
-rw-r--r--src/buffer/vertex/material_buffer.cc39
-rw-r--r--src/buffer/vertex/material_buffer.h20
-rw-r--r--src/main.cc12
-rw-r--r--src/shader/code/collide.glsl36
-rw-r--r--src/shader/code/stream.glsl21
-rw-r--r--src/shader/code/vertex.glsl16
8 files changed, 53 insertions, 106 deletions
diff --git a/src/buffer/vertex/fluid_cell_buffer.cc b/src/buffer/vertex/fluid_cell_buffer.cc
index a0bfcc3..4930d63 100644
--- a/src/buffer/vertex/fluid_cell_buffer.cc
+++ b/src/buffer/vertex/fluid_cell_buffer.cc
@@ -2,7 +2,7 @@
#include <vector>
-FluidCellBuffer::FluidCellBuffer(GLuint nX, GLuint nY):
+FluidCellBuffer::FluidCellBuffer(GLuint nX, GLuint nY, std::function<int(int,int)>&& geometry):
_nX(nX), _nY(nY) {
glGenVertexArrays(1, &_array);
glGenBuffers(1, &_buffer);
@@ -10,7 +10,14 @@ FluidCellBuffer::FluidCellBuffer(GLuint nX, GLuint nY):
glBindVertexArray(_array);
glBindBuffer(GL_ARRAY_BUFFER, _buffer);
- const std::vector<GLfloat> data(3*nX*nY, GLfloat{});
+ std::vector<GLfloat> data(3*nX*nY, GLfloat{});
+
+ for ( int x = 0; x < nX; ++x ) {
+ for ( int y = 0; y < nY; ++y ) {
+ data[3*nX*y + 3*x + 2] = geometry(x,y);
+ }
+ }
+
glBufferData(
GL_ARRAY_BUFFER,
data.size() * sizeof(GLfloat),
diff --git a/src/buffer/vertex/fluid_cell_buffer.h b/src/buffer/vertex/fluid_cell_buffer.h
index 9e535cb..8afb342 100644
--- a/src/buffer/vertex/fluid_cell_buffer.h
+++ b/src/buffer/vertex/fluid_cell_buffer.h
@@ -2,6 +2,8 @@
#include <GL/glew.h>
+#include <functional>
+
class FluidCellBuffer {
private:
const GLuint _nX;
@@ -11,7 +13,7 @@ private:
GLuint _buffer;
public:
- FluidCellBuffer(GLuint nX, GLuint nY);
+ FluidCellBuffer(GLuint nX, GLuint nY, std::function<int(int,int)>&& geometry);
~FluidCellBuffer();
GLuint getBuffer() const;
diff --git a/src/buffer/vertex/material_buffer.cc b/src/buffer/vertex/material_buffer.cc
deleted file mode 100644
index d193318..0000000
--- a/src/buffer/vertex/material_buffer.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-#include "material_buffer.h"
-
-#include <vector>
-
-MaterialBuffer::MaterialBuffer(GLuint nX, GLuint nY, std::function<int(int,int)>&& geometry):
- _nX(nX), _nY(nY) {
- glGenVertexArrays(1, &_array);
- glGenBuffers(1, &_buffer);
-
- glBindVertexArray(_array);
- glBindBuffer(GL_ARRAY_BUFFER, _buffer);
-
- std::vector<GLint> data(nX*nY, GLint{1});
-
- for ( int x = 0; x < nX; ++x ) {
- for ( int y = 0; y < nY; ++y ) {
- data[y*nX + x] = geometry(x,y);
- }
- }
-
- glBufferData(
- GL_ARRAY_BUFFER,
- data.size() * sizeof(GLint),
- data.data(),
- GL_STATIC_DRAW
- );
-
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 1, GL_INT, GL_FALSE, 0, nullptr);
-}
-
-MaterialBuffer::~MaterialBuffer() {
- glDeleteBuffers(1, &_buffer);
- glDeleteVertexArrays(1, &_array);
-}
-
-GLuint MaterialBuffer::getBuffer() const {
- return _buffer;
-}
diff --git a/src/buffer/vertex/material_buffer.h b/src/buffer/vertex/material_buffer.h
deleted file mode 100644
index 4c61c55..0000000
--- a/src/buffer/vertex/material_buffer.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#pragma once
-
-#include <GL/glew.h>
-
-#include <functional>
-
-class MaterialBuffer {
-private:
- const GLuint _nX;
- const GLuint _nY;
-
- GLuint _array;
- GLuint _buffer;
-
-public:
- MaterialBuffer(GLuint nX, GLuint nY, std::function<int(int,int)>&& geometry);
- ~MaterialBuffer();
-
- GLuint getBuffer() const;
-};
diff --git a/src/main.cc b/src/main.cc
index f685c8f..c9fb347 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -10,7 +10,6 @@
#include "buffer/vertex/fluid_cell_buffer.h"
#include "buffer/vertex/lattice_cell_buffer.h"
-#include "buffer/vertex/material_buffer.h"
#include "shader/wrap/graphic_shader.h"
#include "shader/wrap/compute_shader.h"
@@ -67,7 +66,6 @@ int renderWindow() {
std::unique_ptr<LatticeCellBuffer> lattice_a;
std::unique_ptr<LatticeCellBuffer> lattice_b;
std::unique_ptr<FluidCellBuffer> fluid;
- std::unique_ptr<MaterialBuffer> geometry;
std::unique_ptr<ComputeShader> collide_shader;
std::unique_ptr<ComputeShader> stream_shader;
@@ -78,12 +76,12 @@ int renderWindow() {
lattice_a = std::make_unique<LatticeCellBuffer>(nX, nY);
lattice_b = std::make_unique<LatticeCellBuffer>(nX, nY);
- fluid = std::make_unique< FluidCellBuffer>(nX, nY);
- geometry = std::make_unique< MaterialBuffer>(nX, nY, [](int x, int y) -> int {
+ fluid = std::make_unique< FluidCellBuffer>(nX, nY, [](int x, int y) -> int {
if ( x == 0 || y == 0 || x == nX-1 || y == nY-1 ) {
return 0; // disable end of world
}
- if ( (x == 1 || x == nX-2) && (y == 1 || y == nY-2) ) {
+ if ( ((x == 1 || x == nX-2) && (y > 0 && y < nY-1))
+ || ((y == 1 || y == nY-2) && (x > 0 && x < nX-1)) ) {
return 2; // bounce back outer walls
}
return 1; // everything shall be fluid
@@ -105,8 +103,8 @@ int renderWindow() {
auto pause_key = window.getKeyWatcher(GLFW_KEY_SPACE);
- auto tick_buffers = { lattice_a->getBuffer(), lattice_b->getBuffer(), fluid->getBuffer(), geometry->getBuffer() };
- auto tock_buffers = { lattice_b->getBuffer(), lattice_a->getBuffer(), fluid->getBuffer(), geometry->getBuffer() };
+ auto tick_buffers = { lattice_a->getBuffer(), lattice_b->getBuffer(), fluid->getBuffer() };
+ auto tock_buffers = { lattice_b->getBuffer(), lattice_a->getBuffer(), fluid->getBuffer() };
window.render([&](bool window_size_changed) {
if ( pause_key.wasClicked() ) {
diff --git a/src/shader/code/collide.glsl b/src/shader/code/collide.glsl
index 182f5bd..3f4e2c5 100644
--- a/src/shader/code/collide.glsl
+++ b/src/shader/code/collide.glsl
@@ -6,7 +6,6 @@ layout (local_size_x = 1, local_size_y = 1) in;
layout (std430, binding=1) buffer bufferCollide { float collideCells[]; };
layout (std430, binding=2) buffer bufferStream { float streamCells[]; };
layout (std430, binding=3) buffer bufferFluid { float fluidCells[]; };
-layout (std430, binding=4) buffer bufferGeometry { int materialCells[]; };
/// external influence
@@ -70,29 +69,22 @@ void set(uint x, uint y, int i, int j, float v) {
collideCells[indexOfLatticeCell(x,y) + indexOfDirection(i,j)] = v;
}
-void setFluid(uint x, uint y, vec2 v, float d) {
+void setFluid(uint x, uint y, vec2 v) {
const uint idx = indexOfFluidVertex(x, y);
fluidCells[idx + 0] = v.x;
fluidCells[idx + 1] = v.y;
- fluidCells[idx + 2] = d;
}
int getMaterial(uint x, uint y) {
- return materialCells[nX*y + x];
+ const uint idx = indexOfFluidVertex(x, y);
+ return int(fluidCells[idx + 2]);
}
void setMaterial(uint x, uint y, int m) {
- materialCells[nX*y + x] = m;
-}
-
-void disableFluid(uint x, uint y) {
const uint idx = indexOfFluidVertex(x, y);
- fluidCells[idx + 0] = 0.0;
- fluidCells[idx + 1] = 0.0;
- fluidCells[idx + 2] = -2.0;
+ fluidCells[idx + 2] = m;
}
-
/// Moments
float density(uint x, uint y) {
@@ -125,7 +117,7 @@ void disableWallInterior(uint x, uint y) {
for ( int i = -1; i <= 1; ++i ) {
for ( int j = -1; j <= 1; ++j ) {
const int material = getMaterial(x+i,y+j);
- if ( material == 0 || material == 2 ) {
+ if ( material == 0 || material == 2 || material == 3 ) {
++wallNeighbors;
}
}
@@ -139,7 +131,7 @@ void disableWallInterior(uint x, uint y) {
/// Determine external influence
float getExternalPressureInflux(uint x, uint y) {
- if ( mouseState == 1 && norm(vec2(x,y) - mousePos) < 3 ) {
+ if ( mouseState == 1 && norm(vec2(x,y) - mousePos) < 2 ) {
return 1.5;
} else {
return 0.0;
@@ -147,7 +139,7 @@ float getExternalPressureInflux(uint x, uint y) {
}
bool isWallRequestedAt(uint x, uint y) {
- if ( mouseState == 2 && norm(vec2(x,y) - mousePos) < 3 ) {
+ if ( mouseState == 2 && norm(vec2(x,y) - mousePos) < 2 ) {
return true;
} else {
return false;
@@ -164,14 +156,14 @@ void main() {
return;
}
- if ( isWallRequestedAt(x,y) ) {
- setMaterial(x,y,2);
- disableFluid(x,y);
- }
-
const int material = getMaterial(x,y);
- if ( material == 2 ) { // wall
+ if ( isWallRequestedAt(x,y) && material == 1 ) {
+ setMaterial(x,y,3);
+ return;
+ }
+
+ if ( material == 3 ) { // manually added wall
disableWallInterior(x,y);
}
@@ -179,7 +171,7 @@ void main() {
const float d = max(getExternalPressureInflux(x,y), density(x,y));
const vec2 v = velocity(x,y,d);
- setFluid(x,y,v,d);
+ setFluid(x,y,v);
for ( int i = -1; i <= 1; ++i ) {
for ( int j = -1; j <= 1; ++j ) {
diff --git a/src/shader/code/stream.glsl b/src/shader/code/stream.glsl
index a8aec1d..59aed98 100644
--- a/src/shader/code/stream.glsl
+++ b/src/shader/code/stream.glsl
@@ -5,7 +5,7 @@ layout (local_size_x = 1, local_size_y = 1) in;
layout (std430, binding=1) buffer bufferCollide { float collideCells[]; };
layout (std430, binding=2) buffer bufferStream { float streamCells[]; };
-layout (std430, binding=4) buffer bufferGeometry { int materialCells[]; };
+layout (std430, binding=3) buffer bufferFluid { float fluidCells[]; };
/// LBM constants
@@ -24,6 +24,10 @@ uint indexOfLatticeCell(uint x, uint y) {
return q*nX*y + q*x;
}
+uint indexOfFluidVertex(uint x, uint y) {
+ return 3*nX*y + 3*x;
+}
+
/// Data access
float get(uint x, uint y, int i, int j) {
@@ -35,17 +39,8 @@ void set(uint x, uint y, int i, int j, float v) {
}
int getMaterial(uint x, uint y) {
- return materialCells[nX*y + x];
-}
-
-/// Domain description
-
-bool isEndOfWorld(uint x, uint y) {
- return x == 0 || x == nX-1 || y == 0 || y == nY-1;
-}
-
-bool isOuterWall(uint x, uint y) {
- return x == 1 || x == nX-2 || y == 1 || y == nY-2;
+ const uint idx = indexOfFluidVertex(x, y);
+ return int(fluidCells[idx + 2]);
}
/// Boundary conditions
@@ -74,7 +69,7 @@ void main() {
return;
}
- if ( material == 2 ) {
+ if ( material == 2 || material == 3 ) {
bounceBack(x,y);
}
diff --git a/src/shader/code/vertex.glsl b/src/shader/code/vertex.glsl
index 69bbaef..e0ce9a8 100644
--- a/src/shader/code/vertex.glsl
+++ b/src/shader/code/vertex.glsl
@@ -32,6 +32,14 @@ vec2 fluidVertexAtIndex(uint i) {
);
}
+bool isInactive(int material) {
+ return material == 0;
+}
+
+bool isWallFrontier(int material) {
+ return material == 2 || material == 3;
+}
+
void main() {
const vec2 idx = fluidVertexAtIndex(gl_VertexID);
@@ -42,13 +50,17 @@ void main() {
1.
);
- if ( VertexPosition.z < -1.0 ) {
+ const int material = int(round(VertexPosition.z));
+
+ if ( isInactive(material) ) {
+ vs_out.color = vec3(0.5, 0.5, 0.5);
+ } else if ( isWallFrontier(material) ) {
vs_out.color = vec3(0.0, 0.0, 0.0);
} else {
vs_out.color = mix(
vec3(-0.5, 0.0, 1.0),
vec3( 1.0, 0.0, 0.0),
- displayAmplifier * VertexPosition.z * norm(VertexPosition.xy)
+ displayAmplifier * norm(VertexPosition.xy)
);
}
}