/* Sparx
* Copyright August Zinsser 2007
* This program is distributed under the terms of the GNU General Public License
*/
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework;
namespace Pina3D.Particles
{
public class Spin : Force
{
private Emitter mCenter;
private Vector3 mCentralDisplacement;
private bool mClockwise;
public Emitter Center { set { mCenter = value; } get { return mCenter; } }
///
/// Displaces the center of rotation from the central object by this amount
///
public Vector3 CentralDisplacement { set { mCentralDisplacement = value; } get { return mCentralDisplacement; } }
public bool Clockwise { set { mClockwise = value; } get { return mClockwise; } }
public Spin(string name, float lifeSpan, float delay, Emitter center, Vector3 centralDisplacement, float magnitude, bool clockwise)
: base(name, lifeSpan, delay)
{
mCenter = center;
mMagnitude = magnitude;
mCentralDisplacement = centralDisplacement;
mClockwise = clockwise;
}
public override Object Clone()
{
Spin retFo = new Spin(mName + "_clone", mAge, mDelay, mCenter, mCentralDisplacement, mMagnitude, mClockwise);
return retFo;
}
public override void Update(Emission emission)
{
if (mCenter != null && emission.Age > mDelay && emission.Age < mLifeExpectancy + mDelay)
{
RecalculateDisplacementVector(emission, Pina.ElapsedSeconds);
emission.Position3D += Vector3.Multiply(mForceVector, Pina.ElapsedSeconds);
}
}
///
/// Makes a displacement vector that is perpindicular to the center-thispoint vector
///
///
private void RecalculateDisplacementVector(Emission newCenter, float dT)
{
// TODO: This in 3D
//// It's not really a force, but whatever
//mForceVector = mCenter.Position3D + mCentralDisplacement - newCenter.Position3D;
//// For clockwise rotation, cross this vector with a +z vector
//float newMag = mMagnitude * (float)Sparx.GlobalRotation;
//Vector3 zVec = mClockwise ? new Vector3(0, 0, -newMag) : new Vector3(0, 0, +newMag);
//Vector3 fVec = new Vector3(mForceVector.X, mForceVector.Y, 0);
//Vector3 rVec = Vector3.Cross(zVec, fVec);
//mForceVector = new Vector2(rVec.X, rVec.Y);
}
}
}