namespace ElementalGame { #region Using Statements using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; #endregion public class GpuObject { public List variables = new List(); public List masses = new List(); public int numObjects = 0; public bool converted = false; public GpuObject(){} /// /// Add a GpuVariable to this object. /// /// A Gpu Variable, or property public void AddVariable(GpuVariable variable) { variables.Add(variable); } public void AddMass(Mass mass) { converted = false; masses.Add(mass); } /// /// Convert a list of GameObjects into a Gpu Object /// /// public void ConvertToVariables(List gpuGameObjects ) { converted = true; numObjects = gpuGameObjects.Count; // Radius for (int i = 0; i < gpuGameObjects.Count; i++) { variables[0].AddProperty(gpuGameObjects[i].mass.totalForce); variables[1].AddProperty(gpuGameObjects[i].mass.acceleration); variables[2].AddProperty(gpuGameObjects[i].mass.velocity); variables[3].AddProperty(gpuGameObjects[i].mass.currentRotation); variables[4].AddProperty(gpuGameObjects[i].mass.lastPosition); variables[5].AddProperty(gpuGameObjects[i].mass.currentPosition); variables[6].AddProperty(Vector3.Zero); variables[7].AddProperty(gpuGameObjects[i].boundingSphere.Radius); variables[8].AddProperty(gpuGameObjects[i].mass.scale); variables[9].AddProperty(gpuGameObjects[i].mass.mass); } } // === ESTABLISH BETTER SCALING SYSTEM ==== public void SetTextData() { // totalForce variables[0].SetTexData(-Terrain.collisionMapSize, Terrain.collisionMapSize); // acceleration variables[1].SetTexData(-Terrain.collisionMapSize, Terrain.collisionMapSize); // velocity variables[2].SetTexData(-Terrain.collisionMapSize, Terrain.collisionMapSize); // rotation variables[3].SetTexData(-100, 100); // lastPosition variables[4].SetTexData(-Terrain.collisionMapSize, Terrain.collisionMapSize); // currentPosition variables[5].SetTexData(-Terrain.collisionMapSize, Terrain.collisionMapSize); // dummy variables[6].SetTexData(-Terrain.collisionMapSize, Terrain.collisionMapSize); // radius variables[7].SetTexData(0, 100); // scale variables[8] .SetTexData(0, 100); // mass variables[9].SetTexData(0, 100); } public void RetrieveCurrentPositions(ref List gameObjectList) { // Get data from texture Vector4[] currentPositionArray = new Vector4[GpuProcessor.INDEXED_TARGET_SIZE * GpuProcessor.INDEXED_TARGET_SIZE]; variables[5].write.GetData(currentPositionArray); // Get current position for each object for (int i = 0; i < numObjects; i++) { gameObjectList[i].mass.currentPosition = variables[5].UnScale(currentPositionArray[i]); } } } }