//About: // This is basically for particles but also has rotation because it started of as a class // that was only for holding some data that would be shared between almost everything (position + rotation) // it was easier to just convert this into particles than to write another one entirely. using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media; namespace gphysics { public class Particle { protected Vector3 mPosition; protected Vector3 mVelocity; protected Vector3 mAcceleration; protected Vector3 mForceAccum; //Added variable to allow us to not use damping because it makes space physics not work. public static bool mUseDamping = true; protected double mDamping; protected double mInverseMass; protected Vector3 mRotation; public Particle() { //I'm lazy so I want mDamping to have a default value. mDamping = 0.9999999999999999999999999999999999f; } public Vector3 GetPosition() { return mPosition; } public void SetPosition(Vector3 Position) { mPosition = Position; } public void Move(Vector3 Movement) { mPosition += Movement; } public Vector3 GetVelocity() { return mVelocity; } public void SetVelocity(Vector3 Velocity) { mVelocity = Velocity; } public void AddVelocity(Vector3 AddedVel) { mVelocity += AddedVel; } public Vector3 GetAcceleration() { return mAcceleration; } public void SetAcceleration(Vector3 Acceleration) { mAcceleration = Acceleration; } public void AddAcceleration(Vector3 AddedAccel) { mAcceleration += AddedAccel; } public Vector3 GetForceAccum() { return mForceAccum; } public void SetForceAccum(Vector3 ForceAccum) { mForceAccum = ForceAccum; } public void AddForce(Vector3 Force) { mForceAccum += Force; } private void ClearAccumulator() { mForceAccum = Vector3.Zero; } public double GetDamping() { return mDamping; } public void SetDamping(double Damping) { mDamping = Damping; } public bool HasFiniteMass() { if (mInverseMass <= 0.0f) return false; return true; } public double GetInverseMass() { return mInverseMass; } public double GetMass() { return 1.0f / mInverseMass; } public void SetInverseMass(double InverseMass) { mInverseMass = InverseMass; } public void SetMass(double Mass) { mInverseMass = 1.0f / Mass; } public Vector3 GetRotation() { return mRotation; } public void SetRotation(Vector3 Rotation) { mRotation = Rotation; } public void Rotate(Vector3 Rotation) { mRotation += Rotation; } public void Integrate(GameTime elapsedTime) { if (mInverseMass <= 0.0f) return; float elapsedSeconds = (float)elapsedTime.ElapsedGameTime.Milliseconds/1000.0f; elapsedSeconds *= 100.0f; if (elapsedSeconds <= 0.0f) return; Vector3 resultingAcc = mAcceleration; resultingAcc += mForceAccum * (float)mInverseMass; mPosition += mVelocity * elapsedSeconds; if(!mUseDamping) mVelocity = (mVelocity) + resultingAcc * elapsedSeconds; else mVelocity = (mVelocity * (float)mDamping) + resultingAcc * elapsedSeconds; ClearAccumulator(); } } }