//void OnGUI(){ /* * string str = ""; * for(int i=0;i < particlesPointers.Length;i++){ * if(particles[particlesPointers[i]].dead){ * str += ", ("+particlesPointers[i]+")"; * }else{ * str += ", "+particlesPointers[i]; * } * } * * GUI.Label(new Rect(5,400,800,50),str); */ /* * Vector3 pos,screenPos; * Rect r = new Rect(0,0,50,20); * Camera cam = Camera.main.camera; * float age; * for(int i=0;i<liveParticleCount;i++){ * * age = particles[particlesPointers[i]].lifetime; * * if(age < 0.1f){ * pos = particles[particlesPointers[i]].position; * * screenPos = cam.WorldToScreenPoint(pos); * r.y = (Screen.height - screenPos.y); * r.x = screenPos.x; * * GUI.Label(r,age.ToString("f3")); * } * } */ //} void UpdateParticlesTask(int groupIndex, int start, int end) { if (end > start && end > 0) { Puffy_ParticleData p = null; int total = deadGroups[groupIndex].pointers.Count; int index = 0; for (int pointer = start; pointer < end; pointer++) { p = particles[particlesPointers[pointer]]; // call particle update p.Update(_deltaTime); if (p.dead) { if (index >= total) { deadGroups[groupIndex].pointers.Add(pointer); total++; } else { deadGroups[groupIndex].pointers[index] = pointer; } index++; } } deadGroups[groupIndex].count = index; } }
public void Clear(bool reset = false) { int i; if (reset) { Resize(chunkSize * 2); } for (i = 0; i < _particleCount; i++) { particlesPointers[i] = i; if (particles[i] == null) { particles[i] = new Puffy_ParticleData(); } particles[i].startLifetime = 0f; particles[i].lifetime = 0f; particles[i].dead = true; } liveParticleCount = 0; particleLive = 0; }
// resize particles array public bool Resize(int newParticleCount) { if (_particleCount != newParticleCount) { double tmp = Time.realtimeSinceStartup; _particleCount = newParticleCount; Puffy_ParticleData[] tmp_particles = new Puffy_ParticleData[_particleCount]; int[] tmp_particlesPointers = new int[_particleCount]; int i = 0; int j = 0; for (i = 0; i < liveParticleCount; i++) { j = particlesPointers[i]; tmp_particles[i] = particles[j]; tmp_particlesPointers[i] = i; } for (i = liveParticleCount; i < _particleCount; i++) { tmp_particlesPointers[i] = i; } particles = tmp_particles; particlesPointers = tmp_particlesPointers; particleTotal = _particleCount; particleLive = liveParticleCount; tmp = Time.realtimeSinceStartup - tmp; return(true); } return(false); }
// create one particle public int SpawnParticle(Vector3 start_position, Vector3 start_direction, float start_speed, float start_lifetime, float start_size, float end_size, Color start_color, Color end_color, float age = 0) { if (autoResize && liveParticleCount >= _particleCount) { if (!Resize(_particleCount + chunkSize)) { return(-1); } } if (liveParticleCount < _particleCount && particlesPointers != null) { int index = particlesPointers[liveParticleCount]; liveParticleCount++; particleLive = liveParticleCount; if (particles[index] == null) { particles[index] = new Puffy_ParticleData(); } if (lifeTimeVariation != 0) { start_lifetime += Random.Range(-lifeTimeVariation, lifeTimeVariation); } if (startSizeVariation != 0) { start_size += Random.Range(-startSizeVariation, startSizeVariation); } if (endSizeVariation != 0) { end_size += Random.Range(-endSizeVariation, endSizeVariation); } if (startColorVariation != Color.black) { start_color.r += Random.Range(-startColorVariation.r, startColorVariation.r); start_color.g += Random.Range(-startColorVariation.g, startColorVariation.g); start_color.b += Random.Range(-startColorVariation.b, startColorVariation.b); start_color.r = Mathf.Clamp01(start_color.r); start_color.g = Mathf.Clamp01(start_color.g); start_color.b = Mathf.Clamp01(start_color.b); } if (endColorVariation != Color.black) { end_color.r += Random.Range(-endColorVariation.r, endColorVariation.r); end_color.g += Random.Range(-endColorVariation.g, endColorVariation.g); end_color.b += Random.Range(-endColorVariation.b, endColorVariation.b); end_color.r = Mathf.Clamp01(end_color.r); end_color.g = Mathf.Clamp01(end_color.g); end_color.b = Mathf.Clamp01(end_color.b); } if (startSpeedVariation != 0) { start_speed += Random.Range(-startSpeedVariation, startSpeedVariation); } if (startDirectionVariation != Vector3.zero) { start_direction.x += Random.Range(-startDirectionVariation.x, startDirectionVariation.x); start_direction.y += Random.Range(-startDirectionVariation.y, startDirectionVariation.y); start_direction.z += Random.Range(-startDirectionVariation.z, startDirectionVariation.z); } if (positionVariation != Vector3.zero) { start_position.x += Random.Range(-positionVariation.x, positionVariation.x); start_position.y += Random.Range(-positionVariation.y, positionVariation.y); start_position.z += Random.Range(-positionVariation.z, positionVariation.z); } if (colorMode == colorModes.Gradient) { particles[index].Spawn(start_position, start_direction, start_speed, start_lifetime, start_size, end_size, age); } else { particles[index].Spawn(start_position, start_direction, start_speed, start_lifetime, start_size, end_size, start_color, end_color, age); } return(index); } return(-1); }