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