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