From 05b7e6975e12587164e94cc4d8792571f8acb31a Mon Sep 17 00:00:00 2001
From: Adrian Kummerlaender
Date: Thu, 24 May 2018 22:20:48 +0200
Subject: Improve compute shader structure

---
 src/shader/compute.glsl | 48 +++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 37 insertions(+), 11 deletions(-)

diff --git a/src/shader/compute.glsl b/src/shader/compute.glsl
index e322a08..d8714b6 100644
--- a/src/shader/compute.glsl
+++ b/src/shader/compute.glsl
@@ -6,8 +6,33 @@ layout (std430, binding=1) buffer bufferA{ float data[]; };
 
 uniform vec2 world;
 
-float rand(vec2 co){
-	return fract(sin(dot(co.xy, vec2(12.9898,78.233))) * 43758.5453);
+// vector field definition
+
+vec2 f(vec2 v) {
+	return vec2(
+		cos(v.x*sin(v.y)),
+		sin(v.x-v.y)
+	);
+}
+
+// ODE solver
+
+vec2 explicitEuler(float h, vec2 v) {
+	return v + h * f(v);
+}
+
+// pseudo random numbers for particle placement
+
+float rand(vec2 v){
+	return fract(sin(dot(v, vec2(12.9898,78.233))) * 43758.5453);
+}
+
+float mapUnitToWorldX(float s) {
+	return -(world.x/2.) + s * world.x;
+}
+
+float mapUnitToWorldY(float s) {
+	return -(world.y/2.) + s * world.y;
 }
 
 bool insideWorld(vec2 v) {
@@ -18,17 +43,18 @@ bool insideWorld(vec2 v) {
 }
 
 void main() {
-	uint idx = 3*gl_GlobalInvocationID.x;
-	vec2 v = vec2(data[idx+0], data[idx+1]);
+	const uint i = 3*gl_GlobalInvocationID.x;
+	const vec2 v = vec2(data[i+0], data[i+1]);
+	const vec2 w = explicitEuler(0.01, v);
 
-	if ( data[idx+2] < 5. && insideWorld(v) ) {
-		data[idx+0] += 0.01 * cos(v.x*sin(v.y));
-		data[idx+1] += 0.01 * sin(v.x-v.y);
-		data[idx+2] += 0.01;
+	if ( data[i+2] < 5. && insideWorld(v) ) {
+		data[i+0]  = w.x;
+		data[i+1]  = w.y;
+		data[i+2] += 0.01;
 	} else {
-		data[idx+0] = -(world.x/2.) + rand(vec2(data[idx+1], data[idx+0])) * world.x;
-		data[idx+1] = -(world.y/2.) + rand(vec2(data[idx+0], data[idx+1])) * world.y;
-		data[idx+2] = uint(rand(v) * 5.);
+		data[i+0] = mapUnitToWorldX(rand(v));
+		data[i+1] = mapUnitToWorldY(rand(w));
+		data[i+2] = rand(v+w) * 5.;
 	}
 }
 )";
-- 
cgit v1.2.3