public static void CreateFireworkHead(Vector3 position) { GameObject gameObject = new GameObject("Firework " + Time.time); gameObject.transform.position = position; // PARTICLESYSTEM. GPUParticleSystem system = gameObject.AddComponent <GPUParticleSystem>(); GPUParticleDescriptor descriptor = new GPUParticleDescriptor(); descriptor.EmittFrequency = 500.0f; descriptor.Lifetime = 1.0f; descriptor.InheritVelocity = false; GPUParticleDescriptor.LifetimePoints colorPoints = new GPUParticleDescriptor.LifetimePoints(); colorPoints.Add(new Vector4(0, 1, 0, 0)); colorPoints.Add(new Vector4(1, 1, 0, 0.1f)); colorPoints.Add(new Vector4(0, 1, 0, 0.2f)); colorPoints.Add(new Vector4(1, 0, 0, 0.3f)); colorPoints.Add(new Vector4(0, 1, 0, 0.4f)); colorPoints.Add(new Vector4(0, 0, 1, 0.5f)); colorPoints.Add(new Vector4(1, 0, 1, 0.6f)); colorPoints.Add(new Vector4(0, 1, 1, 0.7f)); colorPoints.Add(new Vector4(0, 1, 0, 0.8f)); colorPoints.Add(new Vector4(1, 1, 1, 0.9f)); colorPoints.Add(new Vector4(1, 1, 0, 1)); descriptor.ColorOverLifetime = colorPoints; GPUParticleDescriptor.LifetimePoints haloPoints = new GPUParticleDescriptor.LifetimePoints(); haloPoints.Add(new Vector4(1, 0, 0, 0)); haloPoints.Add(new Vector4(0, 1, 0, 0.333f)); haloPoints.Add(new Vector4(0, 0, 1, 0.666f)); haloPoints.Add(new Vector4(0.5f, 0, 0.5f, 1)); descriptor.HaloOverLifetime = haloPoints; GPUParticleDescriptor.LifetimePoints scalePoints = new GPUParticleDescriptor.LifetimePoints(); scalePoints.Add(new Vector4(0.01f, 0.01f, 0, 0)); scalePoints.Add(new Vector4(0.01f, 0.01f, 0, 1)); descriptor.ScaleOverLifetime = scalePoints; GPUParticleDescriptor.LifetimePoints opacityPoints = new GPUParticleDescriptor.LifetimePoints(); opacityPoints.Add(new Vector4(1.0f, 0, 0, 0)); opacityPoints.Add(new Vector4(1.0f, 0, 0, 0.8f)); opacityPoints.Add(new Vector4(0.0f, 0, 0, 1.0f)); descriptor.OpacityOverLifetime = opacityPoints; descriptor.EmittMesh = CreateMesh(PrimitiveType.Sphere); system.ParticleDescriptor = descriptor; // ATTRACTOR. gameObject.AddComponent <GPUParticleAttractor>().Power = -10.0f; // LIFETIME. gameObject.AddComponent <LifeTimer>().LifeTime = 5; }
// FETCH COLLISION RESULTS. private static void FetchCollisionResults() { List <GPUParticleSphereCollider> sphereColliderList = GPUParticleSphereCollider.GetGPUParticleSphereColliderList(); // Return early if null or zero GPUParticleSphereCollider. if (sphereColliderList == null) { return; } if (sphereColliderList.Count == 0) { return; } Debug.Assert(sphereColliderList.Count < sMaxSphereColliderCount); // Reset data. // TODO: Might not need to reset all this data!! int[] data = new int[sMaxGPUColliderCount]; for (int i = 0; i < data.GetLength(0); ++i) { data[i] = 0; } sGPUColliderResultSwapBuffer.GetInputBuffer().SetData(data); sGPUColliderResultSwapBuffer.GetOutputBuffer().SetData(data); int count = 0; bool initZero = true; foreach (KeyValuePair <GPUParticleSystem, GPUParticleSystem> it in sGPUParticleSystemDictionary) { GPUParticleSystem system = it.Value; if (!system.gameObject.activeInHierarchy) { continue; } sGPUColliderResultSwapBuffer.Swap(); sComputeShader.SetBuffer(sKernelResult, "gGPUColliderResultBufferIN", sGPUColliderResultSwapBuffer.GetInputBuffer()); sComputeShader.SetBuffer(sKernelResult, "gGPUColliderResultBufferOUT", sGPUColliderResultSwapBuffer.GetOutputBuffer()); sComputeShader.SetInt("gGPUColliderCount", sphereColliderList.Count); sComputeShader.SetBuffer(sKernelResult, "gSphereColliderResultBufferREAD", system.GetSphereColliderResultBuffer()); sComputeShader.SetBool("gInitZero", initZero); initZero = false; // DISPATCH. sComputeShader.Dispatch(sKernelResult, (int)Mathf.Ceil(sMaxSphereColliderCount / 64.0f), 1, 1); count++; } // GET DATA FROM GPU TO CPU. int[] collisionData = new int[sphereColliderList.Count]; sGPUColliderResultSwapBuffer.GetOutputBuffer().GetData(collisionData); // UPDATE COLLIDERS. for (int i = 0; i < sphereColliderList.Count; ++i) { GPUParticleSphereCollider collider = sphereColliderList[i]; if (GPUParticleSphereCollider.SKIPFRAME) { GPUParticleSphereCollider.SKIPFRAME = false; collider.SetCollisionsThisFrame(0); } else { collider.SetCollisionsThisFrame(collisionData[i]); } } }
// MERGE. private static void Merge() { if (sMergedParticleCount < sTotalParticleCount) { sMergedParticleCount = Mathf.NextPowerOfTwo(sTotalParticleCount); // Resize buffers. sMergedPositionBuffer.Resize(sMergedParticleCount); sMergedVelocityBuffer.Resize(sMergedParticleCount); sMergedLifetimeBuffer.Resize(sMergedParticleCount); sMergedColorBuffer.Resize(sMergedParticleCount); sMergedHaloBuffer.Resize(sMergedParticleCount); sMergedScaleBuffer.Resize(sMergedParticleCount); sMergedTransperancyBuffer.Resize(sMergedParticleCount); sSortElementSwapBuffer.Resize(sMergedParticleCount); } // CLEAR OLD VALUES. // TODO: Might not need to reset all this data!! float[] mergedData = new float[sMergedParticleCount * 4]; for (int i = 0; i < mergedData.GetLength(0); ++i) { mergedData[i] = -100.0f; } sMergedLifetimeBuffer.GetInputBuffer().SetData(mergedData); sMergedLifetimeBuffer.GetOutputBuffer().SetData(mergedData); for (int i = 0; i < mergedData.GetLength(0); ++i) { mergedData[i] = float.MaxValue; } sMergedPositionBuffer.GetInputBuffer().SetData(mergedData); sMergedPositionBuffer.GetOutputBuffer().SetData(mergedData); // SET BUFFERS. sComputeShader.SetBuffer(sKernelMergeInitSort, "mergePositionOUT", sMergedPositionBuffer.GetOutputBuffer()); sComputeShader.SetBuffer(sKernelMergeInitSort, "mergeVelocityOUT", sMergedVelocityBuffer.GetOutputBuffer()); sComputeShader.SetBuffer(sKernelMergeInitSort, "mergeLifetimeOUT", sMergedLifetimeBuffer.GetOutputBuffer()); sComputeShader.SetBuffer(sKernelMergeInitSort, "mergeColorOUT", sMergedColorBuffer.GetOutputBuffer()); sComputeShader.SetBuffer(sKernelMergeInitSort, "mergeHaloOUT", sMergedHaloBuffer.GetOutputBuffer()); sComputeShader.SetBuffer(sKernelMergeInitSort, "mergeScaleOUT", sMergedScaleBuffer.GetOutputBuffer()); sComputeShader.SetBuffer(sKernelMergeInitSort, "mergeTransperancyOUT", sMergedTransperancyBuffer.GetOutputBuffer()); sComputeShader.SetBuffer(sKernelMergeInitSort, "gSortElementBufferOUT", sSortElementSwapBuffer.GetOutputBuffer()); Vector3 cForward = Camera.main.transform.forward; sComputeShader.SetFloats("gCameraForward", new float[] { cForward.x, cForward.y, cForward.z }); int offset = 0; foreach (KeyValuePair <GPUParticleSystem, GPUParticleSystem> it in sGPUParticleSystemDictionary) { GPUParticleSystem system = it.Value; if (!system.gameObject.activeInHierarchy) { continue; } sComputeShader.SetInt("gLocalParticleCount", system.mMaxParticleCount); sComputeShader.SetInt("gOffsetIndex", offset); sComputeShader.SetBuffer(sKernelMergeInitSort, "gLocalSystemPositionIN", system.mPositionBuffer.GetOutputBuffer()); sComputeShader.SetBuffer(sKernelMergeInitSort, "gLocalSystemVelocityIN", system.mVelocityBuffer.GetOutputBuffer()); sComputeShader.SetBuffer(sKernelMergeInitSort, "gLocalSystemLifetimeIN", system.mLifetimeBuffer.GetOutputBuffer()); sComputeShader.SetBuffer(sKernelMergeInitSort, "gLocalSystemColorIN", system.mColorBuffer); sComputeShader.SetBuffer(sKernelMergeInitSort, "gLocalSystemHaloIN", system.mHaloBuffer); sComputeShader.SetBuffer(sKernelMergeInitSort, "gLocalSystemScaleIN", system.mScaleBuffer); sComputeShader.SetBuffer(sKernelMergeInitSort, "gLocalSystemTransperancyIN", system.mTransperancyBuffer); sComputeShader.Dispatch(sKernelMergeInitSort, (int)Mathf.Ceil(system.mMaxParticleCount / 64.0f), 1, 1); offset += system.mMaxParticleCount; } }
/// <summary> /// Kills all living particles. /// </summary> public static void KillAllParticles() { Debug.Log("KILLALLPARTILCES1"); if (sGPUParticleSystemDictionary == null) { return; } foreach (KeyValuePair <GPUParticleSystem, GPUParticleSystem> it in sGPUParticleSystemDictionary) { Debug.Log("KILLALLPARTILCES2"); GPUParticleSystem system = it.Value; float[] systemData = new float[system.mMaxParticleCount * 4]; for (int i = 0; i < systemData.GetLength(0); ++i) { systemData[i] = -100.0f; } system.mLifetimeBuffer.GetInputBuffer().SetData(systemData); system.mLifetimeBuffer.GetOutputBuffer().SetData(systemData); for (int i = 0; i < systemData.GetLength(0); ++i) { systemData[i] = float.MaxValue; } system.mPositionBuffer.GetInputBuffer().SetData(systemData); system.mPositionBuffer.GetOutputBuffer().SetData(systemData); int[] r = new int[sMaxGPUColliderCount]; for (int i = 0; i < r.GetLength(0); ++i) { r[i] = 0; } system.mSphereColliderResultBuffer.SetData(r); } // TODO: Might not need to reset all this data!! float[] mergedData = new float[sMergedParticleCount * 4]; for (int i = 0; i < mergedData.GetLength(0); ++i) { mergedData[i] = -100.0f; } sMergedLifetimeBuffer.GetInputBuffer().SetData(mergedData); sMergedLifetimeBuffer.GetOutputBuffer().SetData(mergedData); for (int i = 0; i < mergedData.GetLength(0); ++i) { mergedData[i] = float.MaxValue; } sMergedPositionBuffer.GetInputBuffer().SetData(mergedData); sMergedPositionBuffer.GetOutputBuffer().SetData(mergedData); int[] data = new int[sMaxGPUColliderCount]; for (int i = 0; i < data.GetLength(0); ++i) { data[i] = 0; } sGPUColliderResultSwapBuffer.GetInputBuffer().SetData(data); sGPUColliderResultSwapBuffer.GetOutputBuffer().SetData(data); }
void Awake() { _particleSystem = GetComponent<GPUParticleSystem>(); _particleSystem.Init(); }
void Awake() { _particleSystem = GetComponent <GPUParticleSystem>(); _particleSystem.Init(); }
public static GameObject CreateVatsugWand(float powerEndAttractor, float powerNormalAttractors, float pendulumSpeed, float reboundDistance, bool rightHand) { //The wand is the parent object to all the parts. GameObject WandGO = new GameObject("VatsugWand" + count++); //The rod //We set its transform. GameObject RodGO = new GameObject("Rod" + count++); RodGO.transform.parent = WandGO.transform; RodGO.transform.localScale += Vector3.up * 8; RodGO.transform.localScale *= 0.2f; RodGO.transform.position += Vector3.forward * 0.2f; TempVisuals(RodGO, PrimitiveType.Cylinder, Color.black); //The tip //We set its transform GameObject TipGO = new GameObject("Tip" + count++); TipGO.transform.parent = WandGO.transform; TipGO.transform.position += Vector3.up * 2; TipGO.transform.localScale *= 0.5f; TipGO.transform.position += Vector3.forward * 0.2f; TempVisuals(TipGO, PrimitiveType.Sphere, Color.red); WandGO.transform.localScale *= 0.1f; //++++++++++ WAND ++++++++++ GameObject endAttractor; GameObject emitter = new GameObject("VatsugEmitter" + count++); //We add the emitter to the tip. GPUParticleSystem particleEmitter = emitter.AddComponent <GPUParticleSystem>(); emitter.AddComponent <GPUParticleAttractor>().Power = 0.0f; TempVisuals(emitter, PrimitiveType.Sphere, Color.blue); emitter.GetComponent <Renderer>().enabled = false; emitter.transform.parent = TipGO.transform; emitter.transform.localScale = Vector3.one * 0.7f; emitter.transform.localPosition = new Vector3(1, 0, 0) * reboundDistance; GPUParticleDescriptor descriptor = new GPUParticleDescriptor(); descriptor.EmittFrequency = 500.0f; descriptor.Lifetime = 5.0f; descriptor.InheritVelocity = false; GPUParticleDescriptor.LifetimePoints colorPoints = new GPUParticleDescriptor.LifetimePoints(); colorPoints.Add(new Vector4(1, 0, 0, 0)); colorPoints.Add(new Vector4(1, 1, 0, 0.3f)); colorPoints.Add(new Vector4(0, 1, 0, 1.0f)); descriptor.ColorOverLifetime = colorPoints; GPUParticleDescriptor.LifetimePoints haloPoints = new GPUParticleDescriptor.LifetimePoints(); haloPoints.Add(new Vector4(0, 0, 1, 0)); haloPoints.Add(new Vector4(1, 0, 1, 1.0f)); descriptor.HaloOverLifetime = haloPoints; GPUParticleDescriptor.LifetimePoints scalePoints = new GPUParticleDescriptor.LifetimePoints(); scalePoints.Add(new Vector4(0.01f, 0.01f, 0, 0)); scalePoints.Add(new Vector4(0.01f, 0.01f, 0, 1)); descriptor.ScaleOverLifetime = scalePoints; GPUParticleDescriptor.LifetimePoints opacityPoints = new GPUParticleDescriptor.LifetimePoints(); opacityPoints.Add(new Vector4(1.0f, 0, 0, 0)); opacityPoints.Add(new Vector4(1.0f, 0, 0, 0.8f)); opacityPoints.Add(new Vector4(0.0f, 0, 0, 1.0f)); descriptor.OpacityOverLifetime = opacityPoints; descriptor.EmittMesh = TipGO.GetComponent <MeshFilter>().mesh; particleEmitter.ParticleDescriptor = descriptor; particleEmitter.Active = false; endAttractor = new GameObject(); endAttractor.AddComponent <GPUParticleAttractor>().Power = 0.0f; endAttractor.transform.parent = TipGO.transform; endAttractor.transform.localPosition = Vector3.up * 17.0f; WandGO.transform.Rotate(90, 0, 0); WandGO.transform.position += Vector3.forward * 0.2f; VatsugWand wand = TipGO.AddComponent <VatsugWand>(); wand.mEndAttractor = endAttractor; wand.mPowerEndAttractor = powerEndAttractor; wand.mPowerAttractors = powerNormalAttractors; wand.mReboundDistance = reboundDistance; wand.mParticleEmitter = emitter;// particleEmitter; wand.rightHand = rightHand; wand.pendulumSpeed = pendulumSpeed; GameObject hand = new GameObject(rightHand ? "Right" : "Left" + "hand"); WandGO.transform.parent = hand.transform; hand.AddComponent <MirrorHandMovement>(); return(WandGO); }
public static GameObject CreateAttractorWand(float power, bool rightHand) { //The wand is the parent object to all the parts. GameObject WandGO = new GameObject("AttractorWand" + count++); //The rod //We set its transform. GameObject RodGO = new GameObject("Rod" + count++); RodGO.transform.parent = WandGO.transform; RodGO.transform.localScale += Vector3.up * 8; RodGO.transform.localScale *= 0.2f; RodGO.transform.position += Vector3.forward * 0.2f; TempVisuals(RodGO, PrimitiveType.Cylinder, Color.black); //The tip //We set its transform GameObject TipGO = new GameObject("Tip" + count++); TipGO.transform.parent = WandGO.transform; TipGO.transform.position += Vector3.up * 2; TipGO.transform.localScale *= 0.5f; TipGO.transform.position += Vector3.forward * 0.2f; TempVisuals(TipGO, PrimitiveType.Sphere, Color.red); WandGO.transform.localScale *= 0.1f; //We add the emitter to the tip. GPUParticleSystem system = TipGO.AddComponent <GPUParticleSystem>(); Health.HEALTH_FACTOR = 1.0f; GPUParticleDescriptor descriptor = new GPUParticleDescriptor(); descriptor.EmittFrequency = 500.0f; descriptor.Lifetime = 5.0f; descriptor.InheritVelocity = false; GPUParticleDescriptor.LifetimePoints colorPoints = new GPUParticleDescriptor.LifetimePoints(); colorPoints.Add(new Vector4(0, 1, 0, 0)); colorPoints.Add(new Vector4(1, 1, 0, 0.1f)); colorPoints.Add(new Vector4(0, 1, 0, 0.2f)); colorPoints.Add(new Vector4(1, 0, 0, 0.3f)); colorPoints.Add(new Vector4(0, 1, 0, 0.4f)); colorPoints.Add(new Vector4(0, 0, 1, 0.5f)); colorPoints.Add(new Vector4(1, 0, 1, 0.6f)); colorPoints.Add(new Vector4(0, 1, 1, 0.7f)); colorPoints.Add(new Vector4(0, 1, 0, 0.8f)); colorPoints.Add(new Vector4(1, 1, 1, 0.9f)); colorPoints.Add(new Vector4(1, 1, 0, 1)); descriptor.ColorOverLifetime = colorPoints; GPUParticleDescriptor.LifetimePoints haloPoints = new GPUParticleDescriptor.LifetimePoints(); haloPoints.Add(new Vector4(1, 0, 0, 0)); haloPoints.Add(new Vector4(0, 1, 0, 0.333f)); haloPoints.Add(new Vector4(0, 0, 1, 0.666f)); haloPoints.Add(new Vector4(0.5f, 0, 0.5f, 1)); descriptor.HaloOverLifetime = haloPoints; GPUParticleDescriptor.LifetimePoints scalePoints = new GPUParticleDescriptor.LifetimePoints(); scalePoints.Add(new Vector4(0.005f, 0.005f, 0, 0)); scalePoints.Add(new Vector4(0.005f, 0.005f, 0, 1)); descriptor.ScaleOverLifetime = scalePoints; GPUParticleDescriptor.LifetimePoints opacityPoints = new GPUParticleDescriptor.LifetimePoints(); opacityPoints.Add(new Vector4(0.0f, 0, 0, 0)); opacityPoints.Add(new Vector4(1.0f, 0, 0, 0.1f)); opacityPoints.Add(new Vector4(1.0f, 0, 0, 0.8f)); opacityPoints.Add(new Vector4(0.0f, 0, 0, 1.0f)); descriptor.OpacityOverLifetime = opacityPoints; descriptor.EmittMesh = TipGO.GetComponent <MeshFilter>().mesh; system.ParticleDescriptor = descriptor; //We add an attractor to the tip. GPUParticleAttractor attractor = TipGO.AddComponent <GPUParticleAttractor>(); attractor.Power = 1; //We add vector field to the tip. GPUParticleVectorField vectorField = TipGO.AddComponent <GPUParticleVectorField>(); vectorField.Max = 0.3f; WandGO.transform.Rotate(90, 0, 0); AttractorWand wand = WandGO.AddComponent <AttractorWand>(); wand.power = power; wand.rightHand = rightHand; wand.system = system; wand.attractor = attractor; wand.vectorField = vectorField; GameObject hand = new GameObject(rightHand ? "Right" : "Left" + "hand"); WandGO.transform.parent = hand.transform; hand.AddComponent <MirrorHandMovement>().rightHand = rightHand; return(hand); }