From 15f33fd09cffe05e82f5a1008cbfc2b2b12c8187 Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Wed, 24 Apr 2019 22:37:49 +0200 Subject: Add support for erasing walls --- src/shader/code/interact.glsl | 46 +++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 17 deletions(-) (limited to 'src/shader/code/interact.glsl') diff --git a/src/shader/code/interact.glsl b/src/shader/code/interact.glsl index cb69333..613c4cd 100644 --- a/src/shader/code/interact.glsl +++ b/src/shader/code/interact.glsl @@ -10,11 +10,11 @@ uniform uint nY; /// External influence -uniform bool influxRequested; -uniform bool wallRequested; +uniform bool wall_requested; +uniform bool fluid_requested; -uniform vec2 startOfLine; -uniform vec2 endOfLine; +uniform vec2 start; +uniform vec2 end; /// Vector utilities @@ -39,10 +39,10 @@ float distanceToLineSegment(vec2 a, vec2 b, vec2 p) { } bool isNearLine(uint x, uint y, float eps) { - if ( startOfLine == endOfLine ) { - return norm(vec2(x,y) - endOfLine) < eps; + if ( start == end ) { + return norm(vec2(x,y) - end) < eps; } else { - return distanceToLineSegment(startOfLine, endOfLine, vec2(x,y)) < eps; + return distanceToLineSegment(start, end, vec2(x,y)) < eps; } } @@ -83,6 +83,16 @@ void disableWallInterior(uint x, uint y) { } } +void fixWallExterior(uint x, uint y) { + for ( int i = -1; i <= 1; ++i ) { + for ( int j = -1; j <= 1; ++j ) { + if ( getMaterial(x+i,y+j)== 0 ) { + setMaterial(x+i,y+j,3); + } + } + } +} + /// Actual interaction kernel void main() { @@ -97,24 +107,26 @@ void main() { if ( material == 1 ) { if ( isNearLine(x, y, 3) ) { - if ( influxRequested ) { - setMaterial(x,y,4); - return; - } - if ( wallRequested ) { + if ( wall_requested ) { setMaterial(x,y,3); return; } } } - if ( material == 3 ) { - disableWallInterior(x,y); + if ( material == 0 || material == 3 ) { + if ( fluid_requested ) { + if ( isNearLine(x, y, 3) ) { + setMaterial(x,y,1); + fixWallExterior(x,y); + return; + } + } } - if ( material == 4 ) { - // reset influx material after execution - setMaterial(x,y,1); + + if ( material == 3 ) { + disableWallInterior(x,y); } } )"; -- cgit v1.2.3