void ComponentParticleSystem::OnSave(Config& config) const 
{
	config.AddUInt("Max particles", init.max_particles);
	config.AddBool("Loop", init.loop);

    config.AddFloat("Duration", init.duration);
    init.life.Save("Life", config);
    init.speed.Save("Speed", config);
    init.size.Save("Size", config);
    init.rotation.Save("Rotation", config);
    init.gravity.Save("Gravity", config);
    config.AddFloat4("Color", init.color);
	config.AddFloat("Whole speed", init.whole_speed);

    config.AddUInt("Particles per second", emitter.particles_per_second);
    config.AddUInt("Particles per distance", emitter.particles_per_distance);
    config.AddUInt("Shape type", (uint)shape.type);
    if(shape.type == Circle)
    {
        config.AddFloat("Circle radius", shape.radius);
    }
    else if(shape.type == Cone)
    {
        config.AddFloat("Cone radius", shape.radius);
        config.AddFloat("Cone angle", shape.angle);
    }

    config.AddFloat3("Speed init", speed_over_time.init);
    config.AddFloat3("Speed end", speed_over_time.end);
    config.AddFloat4("Speed bezier", speed_over_time.bezier);

    config.AddFloat("Size init", size_over_time.init);
    config.AddFloat("Size end", size_over_time.end);
    config.AddFloat4("Size bezier", size_over_time.bezier);

    config.AddArray("Color over time");

    const std::list<ImGradientMark*>& marks = color_over_time.gradient.getMarks();

    for(std::list<ImGradientMark*>::const_iterator it = marks.begin(), end = marks.end(); it != end; ++it)
    {
        Config mark;
        mark.AddBool("alpha", (*it)->alpha);
        if((*it)->alpha)
        {
            mark.AddFloat("color", (*it)->color[0]);
        }
        else
        {
            mark.AddFloat4("color", float4(((*it)->color)));
        }

        mark.AddFloat("position", (*it)->position);
        config.AddArrayEntry(mark);
    }

	config.AddUID("Texture", texture_info.texture);
    config.AddInt("Sheet x", texture_info.x_tiles);
    config.AddInt("Sheet y", texture_info.y_tiles);
    config.AddBool("Sheet random", texture_info.random);
    config.AddFloat("Sheet init", texture_info.frame_over_time.init);
    config.AddFloat("Sheet end", texture_info.frame_over_time.end);
    config.AddFloat4("Sheet bezier", texture_info.frame_over_time.bezier);

    config.AddInt("Blend mode", (int)blend_mode);
    config.AddFloat("Layer", layer);
}