#version 430 compatibility #extension GL_ARB_compute_shader : enable #extension GL_ARB_shader_storage_buffer_object : enable #define HORZ_NODES 6 #define VERT_NODES 22 #define INDEX gl_GlobalInvocationID.x #define TARGET_DIST 0.05f layout(local_size_x = HORZ_NODES, local_size_y = 1, local_size_z = 1) in; struct Node { vec3 position; float numInfluences; vec2 influences[8]; }; layout(std430, binding=0) buffer nodes_buffer { Node nodes[HORZ_NODES*VERT_NODES]; }; void resolve(vec2 influence, float strength) { vec3 dist = nodes[INDEX+int(influence.x)].position - nodes[INDEX].position; float l = length(dist); float factor = strength*(l - influence.y)/(2f*l); if(INDEX >= HORZ_NODES) nodes[INDEX].position = nodes[INDEX].position + dist * factor; } void main() { float kPrime = 1.0 - pow(1-0.9f, 1.0/30f); //K = 0.9f kPrime = 0.5f; int influences = int(nodes[INDEX].numInfluences); for(int i=0; i<influences; i++) resolve(nodes[INDEX].influences[i], kPrime); }