public MasslessBodyEngine DeepClone() { MasslessBodyEngine mbe = new MasslessBodyEngine(dt); mbe.rockets = new RocketEngine[arraySize]; mbe.bodies = new GameObject[arraySize]; mbe.numBodies = numBodies; mbe.r = new double[arraySize, GravityEngine.NDIM]; mbe.v = new double[arraySize, GravityEngine.NDIM]; mbe.a = new double[arraySize, GravityEngine.NDIM]; mbe.info = new byte[arraySize]; mbe.trajectories = new Trajectory[arraySize]; mbe.dt = dt; for (int i = 0; i < numBodies; i++) { for (int j = 0; j < GravityEngine.NDIM; j++) { mbe.r[i, j] = r[i, j]; mbe.v[i, j] = v[i, j]; mbe.a[i, j] = a[i, j]; } mbe.info[i] = info[i]; mbe.bodies[i] = bodies[i]; mbe.trajectories[i] = trajectories[i]; mbe.rockets[i] = rockets[i]; } return(mbe); }
public void Clear() { numBodies = 0; fixedBodiesInIntegrator = 0; integrator.Clear(); masslessEngine = null; gravityParticles.Clear(); fixedBodies.Clear(); }
public void AddMasslessBody(GameObject gobject, float physToWorldFactor, double engineDt) { if (masslessEngine == null) { masslessEngine = new MasslessBodyEngine(engineDt); // worldState points to this also (simplifies Evolve code) } // massless on rails are not added to MBE onRails = false; masslessEngine.AddBody(gobject, physToWorldFactor); }
/// <summary> /// Clone constructor /// /// Creates a deep copy suitable for independent evolution as a trajectory or for maneuver iterations. /// Maneuvers will be executed but the callback to motify the owner of the maneuver will be skipped (only /// the real evolution will notify). /// </summary> /// <param name="fromState"></param> public GravityState(GravityState fromState) { m = new double[fromState.arraySize]; r = new double[fromState.arraySize, NDIM]; info = new byte[fromState.arraySize]; size2 = new double[fromState.arraySize]; physicalTime = new double[System.Enum.GetNames(typeof(Evolvers)).Length]; arraySize = fromState.arraySize; numBodies = fromState.numBodies; fixedBodiesInIntegrator = fromState.fixedBodiesInIntegrator; onRails = fromState.onRails; // omitting hasTrajectories integrator = fromState.integrator.DeepClone(); // don't copy particles, but need to init list gravityParticles = new List <GravityParticles>(); // DO copy the maneuvers maneuverMgr = new ManeuverMgr(fromState.maneuverMgr); fixedBodies = new List <GravityEngine.FixedBody>(fromState.fixedBodies); for (int i = 0; i < physicalTime.Length; i++) { physicalTime[i] = fromState.physicalTime[i]; } time = fromState.time; forceDelegate = fromState.forceDelegate; selectiveForce = fromState.selectiveForce; keplerDepthChanged = new List <GravityEngine.FixedBody>(fromState.keplerDepthChanged); if (fromState.masslessEngine != null) { masslessEngine = fromState.masslessEngine.DeepClone(); masslessEngine.ResetTrajectories((float)fromState.time); } for (int i = 0; i < arraySize; i++) { m[i] = fromState.m[i]; info[i] = fromState.info[i]; size2[i] = fromState.size2[i]; r[i, 0] = fromState.r[i, 0]; r[i, 1] = fromState.r[i, 1]; r[i, 2] = fromState.r[i, 2]; } // copies do not notify maneuver owners of maneuver completion. They are assumed to be "what if" // evolutions isCopy = true; #pragma warning disable 162 // disable unreachable code warning if (GravityEngine.DEBUG) { Debug.Log("Created new (copy) gravityState"); } #pragma warning restore 162 }