devNotes 12-28-2016 return Delta V

 

Add Delta V and Adjust Geometry in Geometry Shader

Shader “Argos_Compute/Octahedron_Lerp_Banned_Emitter”

D:\0._ArgosVU_Christmas_Work\Assets\Argos_Compute_Shader\ARGOS_DynamicDUALS.compute

#pragma kernel CSMain

// 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;
};

int app_mode;

float  time;
float  pi;

float deltaTime;
float damping;									
float3 base;										// HANDLE.
float3 orbit;										// BOB
float targetStrength;								// POWER MAG
float orbit_weighting;                              // POWER RATIO BETWEEN HANDLE AND BOB
float radius_of_action;                             // RADIUS OF TROUGH / MOTE :) around ATTRACTOR
float zero_mirror_radius;

int attractor_Count;
float3 att_0;										
float3 att_1;
float3 att_2;										
float3 att_3;

float3 att_4;										
float3 att_5;
float3 att_6;										
float3 att_7;

float3 att_8;										
float3 att_9;
float3 att_10;										
float3 att_11;

float3 att_12;										
float3 att_13;
float3 att_14;										
float3 att_15;

float3 att_16;										
float3 att_17;
float3 att_18;										
float3 att_19;
	
float constVel;                                     

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;

    float3 velDeref;

    float3 vUp;
    vUp.y = 1;
    vUp.x = 0;
    vUp.z = 0;

    float3 att_Dir;
    float3 att_Perp;
    float3 att_A;
    float3 att_B; 
    float3 att_A_Dir;
    float3 att_B_Dir; 
    float  att_Dist;  
    
    float3 constVelz;
    constVelz.z = constVel;
    constVelz.x = 0;
    constVelz.y = 0;

    if(app_mode == 0) //Platonics Mode  MONAD
    {
        velDeref = particles[index].velocity;
           
        att_Dir  = normalize((att_0 - particles[index].position));

        att_Perp = normalize(cross(att_Dir, vUp));
        att_A = att_0 + 1.5*att_Perp;//add adjuster
        att_B = att_0 - 1.5*att_Perp;

        att_A_Dir = normalize(att_A - particles[index].position);
        att_B_Dir = normalize(att_B - particles[index].position);
        att_Dist  = distance(att_A, particles[index].position);

        velDeref += 0.5*targetStrength * att_A_Dir * deltaTime / att_Dist; 
        velDeref += 0.5*targetStrength * att_B_Dir * deltaTime / att_Dist;
              
        if(attractor_Count != 1) //DIAD
        {
            att_Dir  = normalize((att_1 - particles[index].position));

            att_Perp = normalize(cross(att_Dir, vUp));
            att_A = att_1 + 1.5*att_Perp;
            att_B = att_1 - 1.5*att_Perp;

            att_A_Dir = normalize(att_A - particles[index].position);
            att_B_Dir = normalize(att_B - particles[index].position);
            att_Dist  = distance(att_A, particles[index].position);

            velDeref += 0.5*targetStrength * att_A_Dir * deltaTime / att_Dist; 
            velDeref += 0.5*targetStrength * att_B_Dir * deltaTime / att_Dist;

            if(attractor_Count != 2) //TRIAD
            {
                att_Dir  = normalize((att_2 - particles[index].position));

                att_Perp = normalize(cross(att_Dir, vUp));
                att_A = att_2 + 1.5*att_Perp;
                att_B = att_2 - 1.5*att_Perp;

                att_A_Dir = normalize(att_A - particles[index].position);
                att_B_Dir = normalize(att_B - particles[index].position);
                att_Dist  = distance(att_A, particles[index].position);

                velDeref += 0.5*targetStrength * att_A_Dir * deltaTime / att_Dist; 
                velDeref += 0.5*targetStrength * att_B_Dir * deltaTime / att_Dist;
                
                if(attractor_Count != 3)  //TETRA
                {
                    att_Dir  = normalize((att_3 - particles[index].position));

                    att_Perp = normalize(cross(att_Dir, vUp));
                    att_A = att_3 + 1.5*att_Perp;
                    att_B = att_3 - 1.5*att_Perp;

                    att_A_Dir = normalize(att_A - particles[index].position);
                    att_B_Dir = normalize(att_B - particles[index].position);
                    att_Dist  = distance(att_A, particles[index].position);

                    velDeref += 0.5*targetStrength * att_A_Dir * deltaTime / att_Dist; 
                    velDeref += 0.5*targetStrength * att_B_Dir * deltaTime / att_Dist;

                    if(attractor_Count != 4)  //OCTAHEDRON
                    {

////////////////////////////////////////////////
D:\0._ArgosVU_Christmas_Work\Assets\Argos_Compute_Shader\Argos_Particle_Spawner.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine.UI;
using System.IO;
using System;

public class Argos_Particle_Spawner : MonoBehaviour
{
    public enum SPAWNER_Mode
    {
        HOLD,
        DYNAMIC,
        STYLUS,
        VACUUM,
        STEP,//FUTURE
    }
    public SPAWNER_Mode mode;
    public const int maxNumParticles = 120000;
    public Text Stylus_DBG_Text;
    private float[] stylii_radii_1;
    private float[] stylii_radii_2;
    private float[] stylii_radii_1_floats = new float[12];
    private float[] stylii_radii_2_floats = new float[12];

    private Vector3[] stylii_posi_1;
    private Vector3[] stylii_posi_2;

    class dVec
    {
        public float[] vec = new float[3];
    }

    private dVec[] stylii_posi_1_floats = new dVec[12];//Vector holder to compute shader
    private dVec[] stylii_posi_2_floats = new dVec[12];
    private int nStylus_1_On;
    private int nStylus_2_On;

    public struct Particle
    {
        public Vector3 position;
        public Vector3 velocity;
        public float   speed;
    }

    Particle[] pInitBuffer;
    Particle[] pOutputBuffer;

    public MD_Scale_Cube md_Scale_Cube;
    Vector3 vMax_Last;
    Vector3 vMin_Last;
    float   activeScale_Last;
    Vector3 vSpawn_Last_Pos;
    Quaternion qSpawn_Last_Rota;
    Vector3 vScaleOffset_Last;

    public float redraw_timer = 0f;
    public float redraw_wait_time = 0.3f;

    float scaleX;
    float scaleY;
    float scaleZ;
    Vector3 vScaleOffset;

    public bool bCompute_Running = false;

    public GameObject centerSphere;//HANDLE MOVER-ROTATOR
    public UI_Ladder ui_Ladder;

    public int Attractor_Mode; //0 - Pendulum : 1 - Frisbee

    private int attractor_Count;

    private GameObject[] go_Atts = new GameObject[20];
    private float[] att_0 = new float[3];
    private float[] att_1 = new float[3];
    private float[] att_2 = new float[3];
    private float[] att_3 = new float[3];

    private float[] att_4 = new float[3];
    private float[] att_5 = new float[3];
    private float[] att_6 = new float[3];
    private float[] att_7 = new float[3];

    private float[] att_8 = new float[3];
    private float[] att_9 = new float[3];
    private float[] att_10 = new float[3];
    private float[] att_11 = new float[3];

    private float[] att_12 = new float[3];
    private float[] att_13 = new float[3];
    private float[] att_14 = new float[3];
    private float[] att_15 = new float[3];

    private float[] att_16 = new float[3];
    private float[] att_17 = new float[3];
    private float[] att_18 = new float[3];
    private float[] att_19 = new float[3];

    public Velocity_Color_Slider velocity_color_slider;

    public bool bPrimary;
    public UI_Control ui_control;
    public HMD_Ctrl_Tracking hmd_Ctrl;
    public Text BlendMode_Txt;

    public Slider speedSwitch_Slider;
    float speedSwitch_Value;
    public Text speedSwitch_Text;

    public Slider constVel_Slider;
    float constVel_Value;
    public Text constVel_Text;

    public ComputeShader dynamicCompute;
    public ComputeShader stylusCompute;
    public ComputeShader vacuumCompute;
    private ComputeShader activeCompute;
    private int hardDamp = 0; //braking for particlles on Shader Switch for snap
    public Material material;
    public int maxParticles = 32;
    private int editor_Max_Particles;
    private bool bDraw_Reduced = false;

    public GameObject pendulum_Handle; //Handle
    public GameObject orbitingSphere;

    public GameObject Frisbee;
    public GameObject Frisbee_Attractor_Right;
    public GameObject Frisbee_Attractor_Left;

    public Color_Swatches color_Swatches;

    public float targetStrength = 1000;//POWER MAG
    public float particle_size = 1f;
    public float timeMod = 1f;
    public float damping = 0f;
    public float orbit_weighting = 0.5f;
    public float zero_mirror_radius = 1f;

    public float radius_of_action = 1.0f;
    public float roa_amplitude = 0;
    public float roa_frequency = 0;
    public float constVel = 0;

    public float cubeSize = 100;

    public float maxAge = 3.0f;
    public float particleSize = 0.5f;

    private ComputeBuffer particles;
    private int particleSizeOf;

    int kernel;

    public bool bAsync_Done = false; //switch to load Compute buffer

    public static List<Argos_Particle_Spawner> aps_list;// Static list, just to call Render() from the camera.

    StreamWriter sBufferOut;

    int nLoaded_Capture = 0;

    void Start()
    {
        if (aps_list == null)
            aps_list = new List<Argos_Particle_Spawner>();
        aps_list.Add(this);

        sBufferOut = new StreamWriter("BUFFER_Point_Cloud.txt");

        for (int i = 0; i < 12; i++)
        {
            stylii_posi_1_floats[i] = new dVec();
            stylii_posi_2_floats[i] = new dVec();
        }
        mode = SPAWNER_Mode.DYNAMIC;
        activeCompute = dynamicCompute;
        pInitBuffer = new Particle[maxParticles];
        pOutputBuffer = new Particle[maxParticles];
        editor_Max_Particles = maxParticles;

        StartCoroutine(Defer_LoadAttractors());
        attractor_Count = 0;

        scaleX = 1f;
        scaleY = 1f;
        scaleZ = 1f;
        vScaleOffset = Vector3.zero;

        hmd_Ctrl.Use_Mode_Change += new HMD_Ctrl_Tracking.USE_MODE_Event_Handler(onUse_Mode_Change);
    }

    private IEnumerator Switch_Compute_Shader_To(SPAWNER_Mode spawnMode)
    {
        yield return new WaitForEndOfFrame();

        if (particles != null)
        {
            particles.GetData(pOutputBuffer);
            particles.Dispose();

            if (spawnMode == SPAWNER_Mode.DYNAMIC)
            {
                activeCompute = dynamicCompute;
                kernel = activeCompute.FindKernel("CSMain");
                mode = SPAWNER_Mode.DYNAMIC;
            }
            else if (spawnMode == SPAWNER_Mode.STYLUS)
            {
                activeCompute = stylusCompute;
                kernel = activeCompute.FindKernel("CSMain");
                mode = SPAWNER_Mode.STYLUS;
                hardDamp = 12;
            }
            else if (spawnMode == SPAWNER_Mode.VACUUM)
            {
                activeCompute = vacuumCompute;
                kernel = activeCompute.FindKernel("CSMain");
                mode = SPAWNER_Mode.VACUUM;
                hardDamp = 12;
            }
            particles = new ComputeBuffer(maxParticles, particleSizeOf, ComputeBufferType.Default);
            particles.SetData(pOutputBuffer);
            vSpawn_Last_Pos = centerSphere.transform.position;
            qSpawn_Last_Rota = centerSphere.transform.rotation;
            vMax_Last = md_Scale_Cube.vIn_Max;
            vMin_Last = md_Scale_Cube.vIn_Min;
            vScaleOffset_Last = (vMax_Last + vMin_Last) / 2f;
            activeCompute.SetBuffer(kernel, "particles", particles);
        }
    }

    public void onUse_Mode_Change(HMD_Ctrl_Tracking.USE_MODE useMode)
    {
        if (useMode == HMD_Ctrl_Tracking.USE_MODE.DYNAMIC)
        {
            StartCoroutine(Switch_Compute_Shader_To(SPAWNER_Mode.DYNAMIC));
        }
        else if (useMode == HMD_Ctrl_Tracking.USE_MODE.STYLUS)
        {
            centerSphere.GetComponent<CenterSphere_Interactions>().Reset_Position_and_Rotation_Tracking();
            StartCoroutine(Switch_Compute_Shader_To(SPAWNER_Mode.STYLUS));
        }
        else if (useMode == HMD_Ctrl_Tracking.USE_MODE.VACUUM)
        {
            centerSphere.GetComponent<CenterSphere_Interactions>().Reset_Position_and_Rotation_Tracking();
            StartCoroutine(Switch_Compute_Shader_To(SPAWNER_Mode.VACUUM));
        }
    }

D:\0._ArgosVU_Christmas_Work\Assets\Argos_Compute_Shader\Octahedron_Lerp_Banned_Emitter.shader
Shader "Argos_Compute/Octahedron_Lerp_Banned_Emitter"
{
       Properties
        {
            _ParticleTexture("Diffuse Tex", 2D) = "white" {}
            _LowColor("Low Color", Color) = (0, 1, 1,0.3)
            _MidColor("Mid Color", Color) = (1, 0, 0, 0.3)
            _HighColor("High Color", Color) = (0,0,1,0.3)
            _LowMidThresh("LowMidThresh", Range(0,1)) = 0.3
            _MidHighThresh("MidHighThresh", Range(0,1)) = 0.6
            _colorSwitch("Switch", Range(0, 700)) = 60
            _nPerc("nPerc", Range(0, 1)) = 0.05

            _ARG_SrcMode("SrcMode", Float) = 0
            _ARG_DstMode("DstMode", Float) = 0
        }

            SubShader
            {
                Pass
            {
            //Blend SrcAlpha OneMinusSrcAlpha // Traditional transparency
            //Blend One OneMinusSrcAlpha // Premultiplied transparency
            //Blend One One // Additive
            //Blend OneMinusDstColor One // Soft Additive
            //Blend DstColor Zero // Multiplicative
            //Blend DstColor SrcColor // 2x Multiplicative       
            
            
            Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
            //Blend SrcAlpha One
            Blend[_ARG_SrcMode][_ARG_DstMode]

            Cull Off
            Lighting Off
            ZWrite Off
            Fog{ Color(0,0,0,0) }


            CGPROGRAM
#pragma target 5.0
#pragma vertex VSMAIN
#pragma fragment PSMAIN
#pragma geometry GSMAIN
#include "UnityCG.cginc" 

        struct Particle
        {
            //int    index;
            float3 position;
            float3 velocity;
            float  speed;
            //float  age;
            //float  normAge;
            //int    type;

        };

        StructuredBuffer<Particle>  particles;

        // Variables from the properties.
        float4 _LowColor;
        float4 _MidColor;
        float4 _HighColor;
        float _colorSwitch;
        float _LowMidThresh;
        float _MidHighThresh;
        float _nPerc; //nPercent of _colorSwitch velocity

        Texture2D                   _ParticleTexture;
        SamplerState                sampler_ParticleTexture;

        Texture2D                   _Ramp1Texture;
        SamplerState                sampler_Ramp1Texture;

        float3                      _worldPos;
        float                       _particleSize;

        float maxAge;
        float maxRad;

        struct VS_INPUT
        {
            uint vertexid           : SV_VertexID;
        };
        //--------------------------------------------------------------------------------
        struct GS_INPUT
        {
            float4 position         : SV_POSITION;
            float4 color            : COLOR;
            //float size : TEXCOORD0;
            //float age : TEXCOORD1;
            //float type : TEXCOORD2;
        };
        //--------------------------------------------------------------------------------
        struct PS_INPUT
        {
            float4 position         : SV_POSITION;
            float2 texcoords        : TEXCOORD0;
            float4 color            : COLOR;
            //float size : TEXCOORD1;
            //float age : TEXCOORD2;
            //float type : TEXCOORD3;
        };
        //--------------------------------------------------------------------------------
        GS_INPUT VSMAIN(in VS_INPUT input)
        {
            GS_INPUT output;
            float4 color_mid;
            output.position.xyz = particles[input.vertexid].position;
            output.position.w = 1.0;
            float speed = particles[input.vertexid].speed;

            float lerpValue1 = clamp((speed - _colorSwitch*(_LowMidThresh - _nPerc / 2)) / (_colorSwitch*_nPerc), 0, 1);

            color_mid = lerp(_LowColor, _MidColor, lerpValue1);
            float lerpValue2 = clamp((speed - _colorSwitch*(_MidHighThresh - _nPerc / 2)) / (_colorSwitch*_nPerc), 0, 1);
            output.color = lerp(color_mid, _HighColor, lerpValue2);

            return output;
        }


        //    Dimensions
        //    Length of tetrahedron edge : a.
        //    The height of an regular tetrahedron :
        //      h = sqrt(2 / 3) * a;

        //    The radius of circumsphere :
        //          R = sqrt(3 / 8) * a;

        //    The height of the incenter O or
        //    the radius of the insphere :
        //          r = 1 / 3 * R or   r = 1 / sqrt(24) * a;

        //    The radius of midsphere(tangent to edges) :
        //    rm = 1 / sqrt(8) * a;

        //    The angle between two faces : ~70, 53 (yellow)
        //    Angle(C, MAB, D) = degrees(atan(2 * sqrt(2)));

        //    The angle between an edge and a face : ~54, 74 (green)
        //    Angle(0, A, D) = degrees(atan(sqrt(2)));

        //    The angle vertex - center - vertex: ~109.471 (violet)
        //    Angle(A, 0, D) = degrees(acos(-1 / 3));

        //void make_face(float3 a, float3 b, float3 c)
        //{
        //    float3 face_normal = normalize(cross(c - a, c - b));
        //    EmitVertex();

        //    gl_Position = mvpMatrix * vec4(b, 1.0);
        //    color = face_color;
        //    EmitVertex();

        //    gl_Position = mvpMatrix * vec4(c, 1.0);
        //    color = face_color;
        //    EmitVertex();

        //    EndPrimitive();
        //}
        //--------------------------------------------------------------------------------
        [maxvertexcount(24)]
        void GSMAIN(point GS_INPUT p[1], inout TriangleStream<PS_INPUT> triStream)
        {
            PS_INPUT pIn;            
            float4 pos = p[0].position*2;//TODO FIND OUT WHY *2
            pos.w = 1;
            float4 col = p[0].color;
            //float4 pos = mul(UNITY_MATRIX_MVP, p[0].position);
            float scl = 20;
            
            float4 v[6];

            float3 A, B, C, D, E, F;
            float4 a, b, c, d, e, f;

            A = _particleSize*float3( 0.0,  0.5,  0.0);
            B = _particleSize*float3( 0.5,  0.0,  0.0);
            C = _particleSize*float3( 0.0,  0.0,  0.5);
            D = _particleSize*float3(-0.5,  0.0,  0.0);
            E = _particleSize*float3( 0.0,  0.0, -0.5);
            F = _particleSize*float3( 0.0, -0.5,  0.0);

            v[0] = pos + float4(A.x, A.y, A.z, 1);
            v[1] = pos + float4(B.x, B.y, B.z, 1);
            v[2] = pos + float4(C.x, C.y, C.z, 1);
            v[3] = pos + float4(D.x, D.y, D.z, 1);
            v[4] = pos + float4(E.x, E.y, E.z, 1);
            v[5] = pos + float4(F.x, F.y, F.z, 1);

            a = mul(UNITY_MATRIX_MVP, v[0]);
            b = mul(UNITY_MATRIX_MVP, v[1]);
            c = mul(UNITY_MATRIX_MVP, v[2]);
            d = mul(UNITY_MATRIX_MVP, v[3]);
            e = mul(UNITY_MATRIX_MVP, v[4]);
            f = mul(UNITY_MATRIX_MVP, v[5]);

            pIn.position = a;
            pIn.texcoords = float2(0.0f, 1.0f);
            pIn.color = col;
            triStream.Append(pIn);

            pIn.position = c;
            pIn.texcoords = float2(1.0f, 1.0f);
            pIn.color = col;
            triStream.Append(pIn);

            pIn.position = b;
            pIn.texcoords = float2(0.0f, 0.0f);
            pIn.color = col;
            triStream.Append(pIn);

            triStream.RestartStrip();

            pIn.position = a;
            pIn.texcoords = float2(0.0f, 1.0f);
            pIn.color = col;
            triStream.Append(pIn);

            pIn.position = d;
            pIn.texcoords = float2(1.0f, 1.0f);
            pIn.color = col;
            triStream.Append(pIn);

            pIn.position = c;
            pIn.texcoords = float2(0.0f, 0.0f);
            pIn.color = col;
            triStream.Append(pIn);

            triStream.RestartStrip();

            pIn.position = a;
            pIn.texcoords = float2(0.0f, 1.0f);
            pIn.color = col;
            triStream.Append(pIn);

            pIn.position = e;
            pIn.texcoords = float2(1.0f, 1.0f);
            pIn.color = col;
            triStream.Append(pIn);

            pIn.position = d;
            pIn.texcoords = float2(0.0f, 0.0f);
            pIn.color = col;
            triStream.Append(pIn);

            triStream.RestartStrip();

            pIn.position = a;
            pIn.texcoords = float2(0.0f, 1.0f);
            pIn.color = col;
            triStream.Append(pIn);

            pIn.position = b;
            pIn.texcoords = float2(1.0f, 1.0f);
            pIn.color = col;
            triStream.Append(pIn);

            pIn.position = e;
            pIn.texcoords = float2(0.0f, 0.0f);
            pIn.color = col;
            triStream.Append(pIn);

            triStream.RestartStrip();

/////////

            pIn.position = f;
            pIn.texcoords = float2(0.0f, 1.0f);
            pIn.color = col;
            triStream.Append(pIn);

            pIn.position = c;
            pIn.texcoords = float2(1.0f, 1.0f);
            pIn.color = col;
            triStream.Append(pIn);

            pIn.position = b;
            pIn.texcoords = float2(0.0f, 0.0f);
            pIn.color = col;
            triStream.Append(pIn);

            triStream.RestartStrip();

            pIn.position = f;
            pIn.texcoords = float2(0.0f, 1.0f);
            pIn.color = col;
            triStream.Append(pIn);

            pIn.position = c;
            pIn.texcoords = float2(1.0f, 1.0f);
            pIn.color = col;
            triStream.Append(pIn);

            pIn.position = d;
            pIn.texcoords = float2(0.0f, 0.0f);
            pIn.color = col;
            triStream.Append(pIn);

            triStream.RestartStrip();

            pIn.position = f;
            pIn.texcoords = float2(0.0f, 1.0f);
            pIn.color = col;
            triStream.Append(pIn);

            pIn.position = d;
            pIn.texcoords = float2(1.0f, 1.0f);
            pIn.color = col;
            triStream.Append(pIn);

            pIn.position = e;
            pIn.texcoords = float2(0.0f, 0.0f);
            pIn.color = col;
            triStream.Append(pIn);

            triStream.RestartStrip();

            pIn.position = f;
            pIn.texcoords = float2(0.0f, 1.0f);
            pIn.color = col;
            triStream.Append(pIn);

            pIn.position = e;
            pIn.texcoords = float2(1.0f, 1.0f);
            pIn.color = col;
            triStream.Append(pIn);

            pIn.position = b;
            pIn.texcoords = float2(0.0f, 0.0f);
            pIn.color = col;
            triStream.Append(pIn);

            triStream.RestartStrip();
          
            //ref
            //pIn.size = p[0].size;
            //pIn.age = p[0].age;
            //pIn.type = p[0].type;
        }
        //--------------------------------------------------------------------------------
        float4 PSMAIN(in PS_INPUT input) : COLOR
        {
            float4 col = input.color;
            float4 color = _ParticleTexture.Sample(sampler_ParticleTexture, input.texcoords);
            color *= col;
            return color;
        }
            //--------------------------------------------------------------------------------
            ENDCG
        }
    }
}
D:\0._ArgosVU_Christmas_Work\Assets\ArgosVu_Scripts\Serialize.cs
    public void Populate_float_buffer()
    {
        Argos_Particle_Spawner.Particle[] particle_buff = argos_Particle_Spawner.getCompute_Particle_Buffer();
        num_active_Particles = particle_buff.Length;

        bool done = false;
        int part_buff_idx = 0;
        int ride_idx = 0;

        while(!done)
        {
            pb_floats[ride_idx++] = particle_buff[part_buff_idx].position.x;
            pb_floats[ride_idx++] = particle_buff[part_buff_idx].position.y;
            pb_floats[ride_idx++] = particle_buff[part_buff_idx].position.z;
            pb_floats[ride_idx++] = particle_buff[part_buff_idx].velocity.x;
            pb_floats[ride_idx++] = particle_buff[part_buff_idx].velocity.y;
            pb_floats[ride_idx++] = particle_buff[part_buff_idx].velocity.z;
            pb_floats[ride_idx++] = particle_buff[part_buff_idx].speed;
            if (++part_buff_idx > num_active_Particles - 1) done = true; 
        }  
    }
   public void Populate_Compute_Buffer(ref Argos_Particle_Spawner.Particle[] read_particles, ref int numParticles)
    {
        int pbIDX = 0;

        numParticles = num_active_Particles;//FROM read_UNO_File

        for (int i = 0; i < numParticles; i++)
        {
            read_particles[i].position.x = pb_floats[pbIDX++];
            read_particles[i].position.y = pb_floats[pbIDX++];
            read_particles[i].position.z = pb_floats[pbIDX++];

            read_particles[i].velocity.x = pb_floats[pbIDX++];
            read_particles[i].velocity.y = pb_floats[pbIDX++];
            read_particles[i].velocity.z = pb_floats[pbIDX++];

            read_particles[i].speed      = pb_floats[pbIDX++];
        }

        DBG_Text.text += " Populate Done";
    }

#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;
};

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;

//-----------------------------------

D:\0._ArgosVU_Christmas_Work\Assets\Argos_Compute_Shader\ARGOS_StylusCompute.compute

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;

    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);
            particles[index].velocity += 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);
            particles[index].velocity += 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);
            particles[index].velocity += targetStrength * nDir * deltaTime * linEase;
            bEdited = true;
        }
D:\0._ArgosVU_Christmas_Work\Assets\Argos_Compute_Shader\ARGOS_VacuumCompute.compute
#pragma kernel CSMain
//FOR Vacuum
// 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;
};

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;
    
    float3 vZero;
    vZero.x = 0;
    vZero.y = 0;
    vZero.z = 0;   

    if(nStylus_1_On == 1) //FOR STYLUS 1
    {
        float3 nDir;
	    float  fDist;

        nDir = normalize(styl_1_0 - particles[index].position);
	    fDist  = distance(styl_1_0, particles[index].position);

        if(fDist < (1+outer_rad_mult)*rad_1_0)
        {
            particles[index].velocity += targetStrength * nDir * deltaTime;
            particles[index].position = vZero;
        }
        
        nDir = normalize(styl_1_1 - particles[index].position);
	    fDist  = distance(styl_1_1, particles[index].position);

        if(fDist < (1+outer_rad_mult)*rad_1_1)
        {
            particles[index].velocity += targetStrength * nDir * deltaTime;
            particles[index].position = vZero;
        }

        nDir = normalize(styl_1_2 - particles[index].position);
	    fDist  = distance(styl_1_2, particles[index].position);

        if(fDist < (1+outer_rad_mult)*rad_1_2)
        {
            particles[index].velocity += targetStrength * nDir * deltaTime;
            particles[index].position = vZero;
        }

        nDir = normalize(styl_1_3 - particles[index].position);
	    fDist  = distance(styl_1_3, particles[index].position);

 

 

c0fxet2uoaekotr