#pragma kernel CSMain //FOR STYLUS // Thread group size #define thread_group_size_x 32 #define thread_group_size_y 1 #define thread_group_size_z 1 struct Particle { float3 position; float3 velocity; float speed; float3 dV_nTangent; float dV_nTangent_Mag; float3 width_nAxis; }; int nStylus_1_On; int nStylus_2_On; int num_ATT_Stylus; float targetStrength; float deltaTime; float damping; float outer_rad_mult; float zero_mirror_radius; float3 styl_1_0; float3 styl_1_1; float3 styl_1_2; float3 styl_1_3; float3 styl_1_4; float3 styl_1_5; float3 styl_1_6; float3 styl_1_7; float3 styl_1_8; float3 styl_1_9; float3 styl_1_10; float3 styl_1_11; //-------------------------------- float3 styl_2_0; float3 styl_2_1; float3 styl_2_2; float3 styl_2_3; float3 styl_2_4; float3 styl_2_5; float3 styl_2_6; float3 styl_2_7; float3 styl_2_8; float3 styl_2_9; float3 styl_2_10; float3 styl_2_11; //----------------------------------- float rad_1_0; float rad_1_1; float rad_1_2; float rad_1_3; float rad_1_4; float rad_1_5; float rad_1_6; float rad_1_7; float rad_1_8; float rad_1_9; float rad_1_10; float rad_1_11; //----------------------------------- float rad_2_0; float rad_2_1; float rad_2_2; float rad_2_3; float rad_2_4; float rad_2_5; float rad_2_6; float rad_2_7; float rad_2_8; float rad_2_9; float rad_2_10; float rad_2_11; //----------------------------------- RWStructuredBuffer <Particle> particles; [numthreads(thread_group_size_x, thread_group_size_y, thread_group_size_z )] void CSMain ( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex ) { int index = DTid.x; //int index = DTid.x + DTid.y * thread_group_size_x * 32; bool bEdited = false; float3 velDeref; velDeref = particles[index].velocity; if(nStylus_1_On == 1) //FOR STYLUS 1 { float3 nDir; float fDist; float Or; float linEase; nDir = normalize(styl_1_0 - particles[index].position); fDist = distance(styl_1_0, particles[index].position); Or = (1+outer_rad_mult)*rad_1_0; if(fDist < Or) { linEase = (fDist - Or)/(rad_1_0 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; } nDir = normalize(styl_1_1 - particles[index].position); fDist = distance(styl_1_1, particles[index].position); Or = (1+outer_rad_mult)*rad_1_1; if(fDist < Or) { linEase = (fDist - Or)/(rad_1_1 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_1_2 - particles[index].position); fDist = distance(styl_1_2, particles[index].position); Or = (1+outer_rad_mult)*rad_1_2; if(fDist < Or) { linEase = (fDist - Or)/(rad_1_2 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_1_3 - particles[index].position); fDist = distance(styl_1_3, particles[index].position); Or = (1+outer_rad_mult)*rad_1_3; if(fDist < Or) { linEase = (fDist - Or)/(rad_1_3 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_1_4 - particles[index].position); fDist = distance(styl_1_4, particles[index].position); Or = (1+outer_rad_mult)*rad_1_4; if(fDist < Or) { linEase = (fDist - Or)/(rad_1_4 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_1_5 - particles[index].position); fDist = distance(styl_1_5, particles[index].position); Or = (1+outer_rad_mult)*rad_1_5; if(fDist < Or) { linEase = (fDist - Or)/(rad_1_5 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_1_6 - particles[index].position); fDist = distance(styl_1_6, particles[index].position); Or = (1+outer_rad_mult)*rad_1_6; if(fDist < Or) { linEase = (fDist - Or)/(rad_1_6 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_1_7 - particles[index].position); fDist = distance(styl_1_7, particles[index].position); Or = (1+outer_rad_mult)*rad_1_7; if(fDist < Or) { linEase = (fDist - Or)/(rad_1_7 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_1_8 - particles[index].position); fDist = distance(styl_1_8, particles[index].position); Or = (1+outer_rad_mult)*rad_1_8; if(fDist < Or) { linEase = (fDist - Or)/(rad_1_8 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_1_9 - particles[index].position); fDist = distance(styl_1_9, particles[index].position); Or = (1+outer_rad_mult)*rad_1_9; if(fDist < Or) { linEase = (fDist - Or)/(rad_1_9 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_1_10 - particles[index].position); fDist = distance(styl_1_10, particles[index].position); Or = (1+outer_rad_mult)*rad_1_10; if(fDist < Or) { linEase = (fDist - Or)/(rad_1_10 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_1_11 - particles[index].position); fDist = distance(styl_1_11, particles[index].position); Or = (1+outer_rad_mult)*rad_1_11; if(fDist < Or) { linEase = (fDist - Or)/(rad_1_11 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } } if(nStylus_2_On == 1) //FOR STYLUS 2 { float3 nDir; float fDist; float Or; float linEase; nDir = normalize(styl_2_0 - particles[index].position); fDist = distance(styl_2_0, particles[index].position); Or = (1+outer_rad_mult)*rad_2_0; if(fDist < Or) { linEase = (fDist - Or)/(rad_2_0 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_2_1 - particles[index].position); fDist = distance(styl_2_1, particles[index].position); Or = (1+outer_rad_mult)*rad_2_1; if(fDist < Or) { linEase = (fDist - Or)/(rad_2_1 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_2_2 - particles[index].position); fDist = distance(styl_2_2, particles[index].position); Or = (1+outer_rad_mult)*rad_2_2; if(fDist < Or) { linEase = (fDist - Or)/(rad_2_2 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_2_3 - particles[index].position); fDist = distance(styl_2_3, particles[index].position); Or = (1+outer_rad_mult)*rad_2_3; if(fDist < Or) { linEase = (fDist - Or)/(rad_2_3 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_2_4 - particles[index].position); fDist = distance(styl_2_4, particles[index].position); Or = (1+outer_rad_mult)*rad_2_4; if(fDist < Or) { linEase = (fDist - Or)/(rad_2_4 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_2_5 - particles[index].position); fDist = distance(styl_2_5, particles[index].position); Or = (1+outer_rad_mult)*rad_2_5; if(fDist < Or) { linEase = (fDist - Or)/(rad_2_5 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_2_6 - particles[index].position); fDist = distance(styl_2_6, particles[index].position); Or = (1+outer_rad_mult)*rad_2_6; if(fDist < Or) { linEase = (fDist - Or)/(rad_2_6 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_2_7 - particles[index].position); fDist = distance(styl_2_7, particles[index].position); Or = (1+outer_rad_mult)*rad_2_7; if(fDist < Or) { linEase = (fDist - Or)/(rad_2_7 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_2_8 - particles[index].position); fDist = distance(styl_2_8, particles[index].position); Or = (1+outer_rad_mult)*rad_2_8; if(fDist < Or) { linEase = (fDist - Or)/(rad_2_8 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_2_9 - particles[index].position); fDist = distance(styl_2_9, particles[index].position); Or = (1+outer_rad_mult)*rad_2_9; if(fDist < Or) { linEase = (fDist - Or)/(rad_2_9 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_2_10 - particles[index].position); fDist = distance(styl_2_10, particles[index].position); Or = (1+outer_rad_mult)*rad_2_10; if(fDist < Or) { linEase = (fDist - Or)/(rad_2_10 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } nDir = normalize(styl_2_11 - particles[index].position); fDist = distance(styl_2_11, particles[index].position); Or = (1+outer_rad_mult)*rad_2_11; if(fDist < Or) { linEase = (fDist - Or)/(rad_2_11 - Or); velDeref += targetStrength * nDir * deltaTime * linEase; bEdited = true; } } float3 vUp; float3 vRight; float3 vFwd; vUp.x = 0; vUp.y = 1; vUp.z = 0; vRight.x = 1; vRight.y = 0; vRight.z = 0; vFwd.x = 0; vFwd.y = 0; vFwd.z = 1; //float3 dV = velDeref - particles[index].velocity; float3 newVelNorm = vUp; //float3 dvAxial = dot(dV,newVelNorm)*newVelNorm; //float3 dV_Tangent = dV-dvAxial; particles[index].dV_nTangent = vRight; particles[index].dV_nTangent_Mag = 1; particles[index].width_nAxis = vFwd; particles[index].velocity = velDeref * damping + 0.000001*vUp; particles[index].position += particles[index].velocity * deltaTime; if(bEdited) { particles[index].speed = length(particles[index].velocity) + 0.000001; } }