Пример #1
0
    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);
    }
Пример #2
0
 public void Clear()
 {
     numBodies = 0;
     fixedBodiesInIntegrator = 0;
     integrator.Clear();
     masslessEngine = null;
     gravityParticles.Clear();
     fixedBodies.Clear();
 }
Пример #3
0
 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);
 }
Пример #4
0
    /// <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
    }