package flare.physics
{
    /**
     * Represents a Spring in a physics simulation. A spring connects two
     * particles and is defined by the springs rest length, spring tension,
     * and damping (friction) co-efficient.
     */
    public class Spring
    {
        /** The first particle attached to the spring. */
        public var p1:Particle;
        /** The second particle attached to the spring. */
        public var p2:Particle;
        /** The rest length of the spring. */
        public var restLength:Number;
        /** The tension of the spring. */
        public var tension:Number;
        /** The damping (friction) co-efficient of the spring. */
        public var damping:Number;
        /** Flag indicating that the spring is scheduled for removal. */
        public var die:Boolean;
        /** Tag property for storing an arbitrary value. */
        public var tag:uint;
        
        /**
         * Creates a new Spring with given parameters.
         * @param p1 the first particle attached to the spring
         * @param p2 the second particle attached to the spring
         * @param restLength the rest length of the spring
         * @param tension the tension of the spring
         * @param damping the damping (friction) co-efficient of the spring
         */
        public function Spring(p1:Particle, p2:Particle, restLength:Number=10,
                               tension:Number=0.1, damping:Number=0.1)
        {
            init(p1, p2, restLength, tension, damping);
        }
        
        /**
         * Initializes an existing spring instance.
         * @param p1 the first particle attached to the spring
         * @param p2 the second particle attached to the spring
         * @param restLength the rest length of the spring
         * @param tension the tension of the spring
         * @param damping the damping (friction) co-efficient of the spring
         */
        public function init(p1:Particle, p2:Particle, restLength:Number=10,
                             tension:Number=0.1, damping:Number=0.1):void
        {
            this.p1 = p1;
            this.p2 = p2;
            this.restLength = restLength;
            this.tension = tension;
            this.damping = damping;
            this.die = false;
            this.tag = 0;
        }
        
        /**
         * "Kills" this spring, scheduling it for removal in the next
         * simulation cycle.
         */
        public function kill():void {
            this.die = true;
        }
        
    } // end of class Spring
}