aboutsummaryrefslogtreecommitdiff
path: root/src/shader/code/extra.glsl
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader/code/extra.glsl')
-rw-r--r--src/shader/code/extra.glsl53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/shader/code/extra.glsl b/src/shader/code/extra.glsl
new file mode 100644
index 0000000..5ba6207
--- /dev/null
+++ b/src/shader/code/extra.glsl
@@ -0,0 +1,53 @@
+static const std::string EXTRA_SHADER_CODE = R"(
+#version 430
+
+layout (local_size_x = 1, local_size_y = 1) in;
+
+layout (std430, binding=3) buffer bufferFluid { float fluidCells[]; };
+layout (std430, binding=4) buffer bufferExtra { float extraCells[]; };
+
+uniform uint nX;
+uniform uint nY;
+
+const float convLength = 1.0 / float(max(nX,nY));
+
+/// Array indexing
+
+uint indexOfDirection(int i, int j) {
+ return 3*(i+1) + (j+1);
+}
+
+uint indexOfFluidVertex(uint x, uint y) {
+ return 3*nX*y + 3*x;
+}
+
+/// Data access
+
+vec2 getFluidVelocity(uint x, uint y) {
+ const uint idx = indexOfFluidVertex(x, y);
+ return vec2(
+ fluidCells[idx + 0],
+ fluidCells[idx + 1]
+ );
+}
+
+void setFluidExtra(uint x, uint y, float curl) {
+ const uint idx = indexOfFluidVertex(x, y);
+ extraCells[idx + 0] = curl;
+}
+
+void main() {
+ const uint x = gl_GlobalInvocationID.x;
+ const uint y = gl_GlobalInvocationID.y;
+
+ if ( !(x < nX && y < nY) ) {
+ return;
+ }
+
+ // simple central difference discretization of the 2d curl operator
+ const float dxvy = (getFluidVelocity(x+1,y).y - getFluidVelocity(x-1,y).y) / (2*convLength);
+ const float dyvx = (getFluidVelocity(x,y+1).x - getFluidVelocity(x,y-1).x) / (2*convLength);
+
+ setFluidExtra(x, y, dxvy - dyvx);
+}
+)";