Advertisement
JontePonte

2D particle life main

Oct 10th, 2024
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.37 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Security.Cryptography;
  4. using Unity.VisualScripting;
  5. using UnityEngine;
  6.  
  7. //Red = 0
  8. //Blue = 1
  9. //Yellow = 2
  10. //Green = 3
  11.  
  12. public struct Particle
  13. {
  14.     public float posX;
  15.     public float posY;
  16.     public float velX;
  17.     public float velY;
  18.     public int type;
  19. }
  20.  
  21. public enum matrixPreset
  22. {
  23.     random,
  24.     symmetry,
  25.     chains,
  26.     chains2,
  27.     chains3,
  28.     snakes,
  29.     zero
  30. }
  31.  
  32. public enum mode
  33. {
  34.     _3D,
  35.     _2D,
  36. }
  37.  
  38. public class Main : MonoBehaviour
  39. {
  40.     public matrixPreset preset;
  41.     public mode mode;
  42.     public RenderTexture renderTexture;
  43.     public ComputeShader computeShader;
  44.  
  45.     public int resolution;
  46.     public int particleCount;
  47.     public float forceFactor;
  48.     public float maxDist;
  49.     public float friction;
  50.  
  51.     [Header("3D")]
  52.     public Material particleMaterial;
  53.     public float particleSize;
  54.  
  55.     float[,] attractionMatrix;
  56.     float[] attractionMatrix1D;
  57.  
  58.     Particle[] particles;
  59.  
  60.     bool is3D;
  61.  
  62.     void Start()
  63.     {
  64.         switch (preset)
  65.         {
  66.             case matrixPreset.random:
  67.                 attractionMatrix = new float[,]
  68.                 {
  69.                     {Rand(), Rand(), Rand(), Rand(), Rand(), Rand()},
  70.                     {Rand(), Rand(), Rand(), Rand(), Rand(), Rand()},
  71.                     {Rand(), Rand(), Rand(), Rand(), Rand(), Rand()},
  72.                     {Rand(), Rand(), Rand(), Rand(), Rand(), Rand()},
  73.                     {Rand(), Rand(), Rand(), Rand(), Rand(), Rand()},
  74.                     {Rand(), Rand(), Rand(), Rand(), Rand(), Rand()},
  75.                 };
  76.                 break;
  77.  
  78.             case matrixPreset.symmetry:
  79.  
  80.                 float[] rand = new float[22];
  81.                 for (int i = 0; i < rand.Length; i++)
  82.                 {
  83.                     rand[i] = Rand();
  84.                 }
  85.  
  86.                 attractionMatrix = new float[,]
  87.                 {
  88.                     {rand[0], rand[1], rand[2], rand[3], rand[4], rand[5]},
  89.                     {rand[1], rand[7], rand[8], rand[9], rand[10], rand[11]},
  90.                     {rand[2], rand[8], rand[12], rand[13], rand[14], rand[15]},
  91.                     {rand[3], rand[9], rand[13], rand[16], rand[17], rand[18]},
  92.                     {rand[4], rand[1], rand[14], rand[17], rand[19], rand[20]},
  93.                     {rand[5], rand[1], rand[15], rand[18], rand[20], rand[21]},
  94.                 };
  95.                 break;
  96.  
  97.             case matrixPreset.chains:
  98.                 attractionMatrix = new float[,]
  99.                 {
  100.                     {1, 1, -1, -1, -1, 1},
  101.                     {1, 1, 1, -1, -1, -1},
  102.                     {-1, 1, 1, 1, -1, -1},
  103.                     {-1, -1, 1, 1, 1, -1},
  104.                     {-1, -1, -1, 1, 1, 1},
  105.                     {1, -1, -1, -1, 1, 1},
  106.                 };
  107.                 break;
  108.  
  109.             case matrixPreset.chains2:
  110.                 attractionMatrix = new float[,]
  111.                 {
  112.                     {1, .2f, -1, -1, -1, .2f},
  113.                     {.2f, 1, .2f, -1, -1, -1},
  114.                     {-1, .2f, 1, .2f, -1, -1},
  115.                     {-1, -1, .2f, 1, .2f, -1},
  116.                     {-1, -1, -1, .2f, 1, .2f},
  117.                     {.2f, -1, -1, -1, .2f, 1},
  118.                 };
  119.                 break;
  120.  
  121.             case matrixPreset.chains3:
  122.                 attractionMatrix = new float[,]
  123.                 {
  124.                     {1, .2f, 0, 0, 0, 0},
  125.                     {.2f, 1, .2f, 0, 0, 0},
  126.                     {0, .2f, 1, .2f, 0, 0},
  127.                     {0, 0, .2f, 1, .2f, 0},
  128.                     {0, 0, 0, .2f, 1, .2f},
  129.                     {.2f, 0, 0, 0, .2f, 1},
  130.                 };
  131.                 break;
  132.  
  133.             case matrixPreset.snakes:
  134.                 attractionMatrix = new float[,]
  135.                 {
  136.                     {1, .2f, 0, 0, 0, 0},
  137.                     {0, 1, .2f, 0, 0, 0},
  138.                     {0, 0, 1, .2f, 0, 0},
  139.                     {0, 0, 0, 1, .2f, 0},
  140.                     {0, 0, 0, 0, 1, .2f},
  141.                     {.2f, 0, 0, 0, 0, 1},
  142.                 };
  143.                 break;
  144.  
  145.             case matrixPreset.zero:
  146.                 attractionMatrix = new float[,]
  147.                 {
  148.                     {0, 0, 0, 0, 0, 0},
  149.                     {0, 0, 0, 0, 0, 0},
  150.                     {0, 0, 0, 0, 0, 0},
  151.                     {0, 0, 0, 0, 0, 0},
  152.                     {0, 0, 0, 0, 0, 0},
  153.                     {0, 0, 0, 0, 0, 0},
  154.                 };
  155.                 break;
  156.         }
  157.  
  158.         attractionMatrix1D = new float[36];
  159.  
  160.         for (int y = 0; y < 6; y++)
  161.         {
  162.             for (int x = 0; x < 6; x++)
  163.             {
  164.                 attractionMatrix1D[x + (y * 6)] = attractionMatrix[x, y];
  165.             }
  166.         }
  167.  
  168.         particles = new Particle[particleCount];
  169.  
  170.         for (int i = 0; i < particleCount; i++)
  171.         {
  172.             Vector2 position = new Vector2(Random.Range(0f, resolution - 1f), Random.Range(0f, resolution - 1f));
  173.  
  174.             particles[i] = new Particle
  175.             {
  176.                 type = Random.Range(0, 6),
  177.                 posX = position.x,
  178.                 posY = position.y,
  179.                 velX = 0,
  180.                 velY = 0
  181.             };
  182.         }
  183.  
  184.  
  185.  
  186.         renderTexture = new RenderTexture(resolution, resolution, 24);
  187.         renderTexture.enableRandomWrite = true;
  188.         //renderTexture.format = RenderTextureFormat.RGB111110Float;
  189.         renderTexture.graphicsFormat = UnityEngine.Experimental.Rendering.GraphicsFormat.R16G16B16A16_SFloat;
  190.         renderTexture.Create();
  191.     }
  192.  
  193.     private void OnRenderImage(RenderTexture source, RenderTexture destination)
  194.     {
  195.         ClearRenderTexture(renderTexture);
  196.  
  197.         // Create the ComputeBuffer and set it up
  198.         ComputeBuffer particlesBuffer = new ComputeBuffer(particleCount, sizeof(float) * 4 + sizeof(int));
  199.         particlesBuffer.SetData(particles);
  200.  
  201.         ComputeBuffer matrixBuffer = new ComputeBuffer(36, sizeof(float));
  202.         matrixBuffer.SetData(attractionMatrix1D);
  203.  
  204.         computeShader.SetTexture(0, "Result", renderTexture);
  205.         computeShader.SetBuffer(0, "particles", particlesBuffer);
  206.         computeShader.SetBuffer(0, "attractionMatrix", matrixBuffer);
  207.         computeShader.SetFloat("deltaTime", Time.deltaTime);
  208.         computeShader.SetInt("resolution", resolution);
  209.         computeShader.SetInt("particleCount", particleCount);
  210.         computeShader.SetFloat("forceFactor", forceFactor);
  211.         computeShader.SetFloat("frictionFactor", friction);
  212.         computeShader.SetFloat("maxDist", maxDist);
  213.  
  214.         computeShader.Dispatch(0, Mathf.CeilToInt(particleCount / 64f), 1, 1);
  215.  
  216.         particlesBuffer.GetData(particles);
  217.  
  218.         particlesBuffer.Release();
  219.         matrixBuffer.Release();
  220.  
  221.         Graphics.Blit(renderTexture, destination);
  222.     }
  223.  
  224.     void ClearRenderTexture(RenderTexture renderTexture)
  225.     {
  226.         // Save the currently active RenderTexture
  227.         RenderTexture currentActiveRT = RenderTexture.active;
  228.  
  229.         // Set the target RenderTexture as active
  230.         RenderTexture.active = renderTexture;
  231.  
  232.         // Clear it with black color
  233.         GL.Clear(true, true, Color.black);
  234.  
  235.         // Restore the original active RenderTexture
  236.         RenderTexture.active = currentActiveRT;
  237.     }
  238.  
  239.     float Rand()
  240.     {
  241.         return Random.Range(-1f, 1f);
  242.     }
  243. }
  244.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement