protected void _SetupForce(Force force, ref ForceInstance fi)
        {
            Assert.Fatal(SceneObject != null, "Cannot set up force before adding to scene");

            SceneObject.RegisterInterface(this, fi._strength);
            fi._strength.Value = force.InitialStrength;

            if (force.LinkName != null && force.LinkName != String.Empty)
            {
                fi._linkPosition = SceneObject.Components.GetInterface<ValueInterface<Vector2>>("vector2", force.LinkName);
                fi._linkRotation = SceneObject.Components.GetInterface<ValueInterface<float>>("float", force.LinkName);
            }
        }
 /// <summary>
 /// Add a new force to this object.  Force will continue to be applied until RemoveForce
 /// is called for the force.
 /// </summary>
 /// <param name="force">Force to applye.</param>
 public void AddForce(Force force)
 {
     _forces.Add(force);
     ForceInstance fi = new ForceInstance();
     fi._strength = new ValueInPlaceInterface<float>();
     if (SceneObject != null)
         _SetupForce(force, ref fi);
     _forceInstances.Add(fi);
 }
        protected void _GetForceData(Force force, ForceInstance fi, out Vector2 offset, out Vector2 direction)
        {
            offset = SceneObject.GetWorldLinkPosition(fi._linkPosition, fi._linkRotation, force.Offset) - SceneObject.Position;

            float dirRot;
            if (force.UseLinkDirection)
            {
                dirRot = SceneObject.GetWorldLinkRotation(fi._linkRotation, force.RotationOffset);
            }
            else
            {
                dirRot = force.ConstantDirection;
                if (!force.ConstantDirectionIsWorldSpace)
                    dirRot += SceneObject.Rotation;
                dirRot = (dirRot + force.RotationOffset) % 360.0f;
            }

            direction = T2DVectorUtil.VectorFromAngle(dirRot);
        }