123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
-
- // =================================
- // Namespaces.
- // =================================
- using UnityEngine;
- // =================================
- // Define namespace.
- // =================================
- namespace MirzaBeig
- {
- namespace Scripting
- {
- namespace Effects
- {
- // =================================
- // Classes.
- // =================================
- [AddComponentMenu("Effects/Particle Force Fields/Turbulence Particle Force Field")]
- public class TurbulenceParticleForceField : ParticleForceField
- {
- // =================================
- // Nested classes and structures.
- // =================================
- // ...
- public enum NoiseType
- {
- PseudoPerlin,
- Perlin,
- Simplex,
- OctavePerlin,
- OctaveSimplex
- }
- // =================================
- // Variables.
- // =================================
- // ...
- [Header("ForceField Controls")]
- [Tooltip("Noise texture mutation speed.")]
- public float scrollSpeed = 1.0f;
- [Range(0.0f, 8.0f)]
- [Tooltip("Noise texture detail amplifier.")]
- public float frequency = 1.0f;
- public NoiseType noiseType = NoiseType.Perlin;
- // ...
- [Header("Octave Variant-Only Controls")]
- [Range(1, 8)]
- [Tooltip("Overlapping noise iterations. 1 = no additional iterations.")]
- public int octaves = 1;
- [Range(0.0f, 4.0f)]
- [Tooltip("Frequency scale per-octave. Can be used to change the overlap every iteration.")]
- public float octaveMultiplier = 0.5f;
- [Range(0.0f, 1.0f)]
- [Tooltip("Amplitude scale per-octave. Can be used to change the overlap every iteration.")]
- public float octaveScale = 2.0f;
- float time;
- // Noise2 start offsets.
- float randomX;
- float randomY;
- float randomZ;
- // Final offset.
- float offsetX;
- float offsetY;
- float offsetZ;
- // =================================
- // Functions.
- // =================================
- // ...
- protected override void Awake()
- {
- base.Awake();
- }
- // ...
- protected override void Start()
- {
- base.Start();
- // ...
- randomX = Random.Range(-32.0f, 32.0f);
- randomY = Random.Range(-32.0f, 32.0f);
- randomZ = Random.Range(-32.0f, 32.0f);
- }
- // ...
- protected override void Update()
- {
- time = Time.time;
- // ...
- base.Update();
- }
- // ...
- protected override void LateUpdate()
- {
- offsetX = (time * scrollSpeed) + randomX;
- offsetY = (time * scrollSpeed) + randomY;
- offsetZ = (time * scrollSpeed) + randomZ;
- // ...
- base.LateUpdate();
- }
- // ...
- protected override Vector3 GetForce()
- {
- // I could also pre-multiply the frequency, but
- // all the octave variants also use frequency
- // within themselves, so it would cause redundant
- // multiplication.
- float xX = parameters.particlePosition.x + offsetX;
- float yX = parameters.particlePosition.y + offsetX;
- float zX = parameters.particlePosition.z + offsetX;
- float xY = parameters.particlePosition.x + offsetY;
- float yY = parameters.particlePosition.y + offsetY;
- float zY = parameters.particlePosition.z + offsetY;
- float xZ = parameters.particlePosition.x + offsetZ;
- float yZ = parameters.particlePosition.y + offsetZ;
- float zZ = parameters.particlePosition.z + offsetZ;
- Vector3 force;
- switch (noiseType)
- {
- case NoiseType.PseudoPerlin:
- {
- // This isn't really right, but... it gives believable-enough results.
- // It's also much faster than real perlin noise.
- // It works well where you don't have to animate a large field where
- // the repeating pattern would otherwise be easily seen.
- // Examples of good uses: smoke trail particle turbulence.
- // Example of bad uses: particle box simulating waves or something...
- float noiseX = Mathf.PerlinNoise(xX * frequency, yY * frequency);
- float noiseY = Mathf.PerlinNoise(xX * frequency, zY * frequency);
- float noiseZ = Mathf.PerlinNoise(xX * frequency, xY * frequency);
- noiseX = Mathf.Lerp(-1.0f, 1.0f, noiseX);
- noiseY = Mathf.Lerp(-1.0f, 1.0f, noiseY);
- noiseZ = Mathf.Lerp(-1.0f, 1.0f, noiseZ);
- Vector3 forceX = (Vector3.right * noiseX);
- Vector3 forceY = (Vector3.up * noiseY);
- Vector3 forceZ = (Vector3.forward * noiseZ);
- force = forceX + forceY + forceZ;
- break;
- }
- // ...
- default:
- case NoiseType.Perlin:
- {
- force.x = Noise2.perlin(xX * frequency, yX * frequency, zX * frequency);
- force.y = Noise2.perlin(xY * frequency, yY * frequency, zY * frequency);
- force.z = Noise2.perlin(xZ * frequency, yZ * frequency, zZ * frequency);
- return force;
- }
- // ...
- case NoiseType.Simplex:
- {
- force.x = Noise2.simplex(xX * frequency, yX * frequency, zX * frequency);
- force.y = Noise2.simplex(xY * frequency, yY * frequency, zY * frequency);
- force.z = Noise2.simplex(xZ * frequency, yZ * frequency, zZ * frequency);
- break;
- }
- // ...
- case NoiseType.OctavePerlin:
- {
- force.x = Noise2.octavePerlin(xX, yX, zX, frequency, octaves, octaveMultiplier, octaveScale);
- force.y = Noise2.octavePerlin(xY, yY, zY, frequency, octaves, octaveMultiplier, octaveScale);
- force.z = Noise2.octavePerlin(xZ, yZ, zZ, frequency, octaves, octaveMultiplier, octaveScale);
- break;
- }
- case NoiseType.OctaveSimplex:
- {
- force.x = Noise2.octaveSimplex(xX, yX, zX, frequency, octaves, octaveMultiplier, octaveScale);
- force.y = Noise2.octaveSimplex(xY, yY, zY, frequency, octaves, octaveMultiplier, octaveScale);
- force.z = Noise2.octaveSimplex(xZ, yZ, zZ, frequency, octaves, octaveMultiplier, octaveScale);
- break;
- }
- }
- return force;
- }
- // ...
- protected override void OnDrawGizmosSelected()
- {
- if (enabled)
- {
- base.OnDrawGizmosSelected();
- }
- }
- // =================================
- // End functions.
- // =================================
- }
- // =================================
- // End namespace.
- // =================================
- }
- }
- }
- // =================================
- // --END-- //
- // =================================
|