Esempio n. 1
0
    private void GPUCalculation(List <Rigidbody> chunk)
    {
        for (int i = 0; i < chunk.Count; i++)
        {
            positions[i] = chunk[i].position;
            masses[i]    = chunk[i].mass;
            data[i]      = new GravityData {
                x = 0, y = 0, z = 0
            };
        }

        positionBuffer.SetData(positions);
        massBuffer.SetData(masses);
        dataBuffer.SetData(data);

        Shader.SetBuffer(kernel, "Positions", positionBuffer);
        Shader.SetBuffer(kernel, "Masses", massBuffer);
        Shader.SetBuffer(kernel, "Data", dataBuffer);

        Shader.Dispatch(kernel, chunk.Count, chunk.Count, 1);

        dataBuffer.GetData(data);

        for (int i = 0; i < chunk.Count; i++)
        {
            force.x = data[i].x / this.fromInt;
            force.y = data[i].y / this.fromInt;
            force.z = data[i].z / this.fromInt;
            chunk[i].AddForce(force);
        }
    }
Esempio n. 2
0
        private void StartGravity()
        {
            Vector3D position = MyEntity.GetPosition();

            foreach (MyPlanet planet in Globals.AllPlanets())
            {
                if (planet.IsPositionInGravityWell(position))
                {
                    Vector3D targetPosition = CurrentTarget.GetPosition();
                    if (!planet.IsPositionInGravityWell(targetPosition))
                    {
                        Log.DebugLog("Target is not in gravity well, target position: " + targetPosition + ", planet: " + planet.getBestName(), Logger.severity.WARNING);
                        return;
                    }
                    Vector3 gravAtTarget = planet.GetWorldGravityNormalized(ref targetPosition);
                    m_gravData = new GravityData(planet, gravAtTarget);
                    break;
                }
            }

            if (m_gravData != null)
            {
                UpdateGravity();
            }
        }
Esempio n. 3
0
    private void UpdateGravity(ref GravityData data, ref Translation translation)
    {
        Debug.Log("PLAYER GRAVITY UPDATE");

        if (data.Falling)
        {
            var velocity = translation.Value;

            velocity.y -= data.Gravity * Time.deltaTime;

            translation.Value = velocity;
        }

        if (Input.GetKeyUp(KeyCode.Space))
        {
            data.Falling = false;
        }
    }
Esempio n. 4
0
    public static void ApplyGravity(ref float yVelocity, GravityData gravityData)
    {
        if (!gravityData.useGravity)
        {
            return;
        }

        float gravity;

        if (gravityData.terminalVelocity != 0)
        {
            gravity = Mathf.Max(yVelocity - (gravityData.acceleration * Time.fixedDeltaTime), -gravityData.terminalVelocity);
        }
        else
        {
            gravity = yVelocity - (gravityData.acceleration * Time.fixedDeltaTime);
        }

        yVelocity = gravity;
    }
Esempio n. 5
0
    public static void ApplyGravity(Rigidbody2D rb2D, GravityData gravityData)
    {
        if (!gravityData.useGravity)
        {
            return;
        }

        float gravity;

        if (gravityData.terminalVelocity != 0)
        {
            gravity = Mathf.Max(rb2D.velocity.y - (gravityData.acceleration * Time.fixedDeltaTime), -gravityData.terminalVelocity);
        }
        else
        {
            gravity = rb2D.velocity.y - (gravityData.acceleration * Time.fixedDeltaTime);
        }

        rb2D.velocity = new Vector2(rb2D.velocity.x, gravity);
    }
Esempio n. 6
0
        /// <summary>
        /// Updates m_stage if guidance starts or stops.
        /// </summary>
        private void CheckGuidance()
        {
            switch (m_stage)
            {
            case Stage.Rail:
                double minDist = (MyEntity.WorldAABB.Max - MyEntity.WorldAABB.Min).AbsMax();
                minDist *= 2;

                if (CubeBlock.WorldAABB.DistanceSquared(MyEntity.GetPosition()) >= minDist * minDist)
                {
                    myGuidanceEnds = Globals.ElapsedTime.Add(TimeSpan.FromSeconds(myDescr.GuidanceSeconds));
                    m_rail         = null;
                    if (myDescr.SemiActiveLaser)
                    {
                        Log.DebugLog("past arming range, semi-active.", Logger.severity.INFO);
                        m_stage = Stage.SemiActive;
                        return;
                    }

                    if (CurrentTarget is GolisTarget)
                    {
                        Log.DebugLog("past arming range, golis active", Logger.severity.INFO);
                        m_stage = Stage.Golis;
                        return;
                    }

                    if (myAmmo.Description.BoostDistance > 1f)
                    {
                        Log.DebugLog("past arming range, starting boost stage", Logger.severity.INFO);
                        StartGravity();
                        m_stage = Stage.Boost;
                        if (m_gravData == null)
                        {
                            Log.DebugLog("no gravity, terminating", Logger.severity.WARNING);
                            m_stage = Stage.Terminated;
                        }
                    }
                    else
                    {
                        Log.DebugLog("past arming range, starting guidance.", Logger.severity.INFO);
                        m_stage = Stage.Guided;
                    }
                }
                return;

            case Stage.Boost:
                if (Vector3D.DistanceSquared(CubeBlock.GetPosition(), MyEntity.GetPosition()) >= myAmmo.Description.BoostDistance * myAmmo.Description.BoostDistance)
                {
                    Log.DebugLog("completed boost stage, starting mid course stage", Logger.severity.INFO);
                    m_stage = Stage.MidCourse;
                }
                return;

            case Stage.MidCourse:
                Target t = CurrentTarget;
                if (t.Entity == null)
                {
                    return;
                }

                double toTarget = Vector3D.Distance(MyEntity.GetPosition(), t.GetPosition());
                double toLaunch = Vector3D.Distance(MyEntity.GetPosition(), CubeBlock.GetPosition());

                if (toTarget < toLaunch)
                {
                    Log.DebugLog("closer to target(" + toTarget + ") than to launch(" + toLaunch + "), starting guidance", Logger.severity.INFO);
                    m_stage        = Stage.Guided;
                    myGuidanceEnds = Globals.ElapsedTime.Add(TimeSpan.FromSeconds(myDescr.GuidanceSeconds));
                    m_gravData     = null;
                }
                return;

            case Stage.SemiActive:
            case Stage.Golis:
            case Stage.Guided:
                if (Globals.ElapsedTime >= myGuidanceEnds)
                {
                    Log.DebugLog("finished guidance", Logger.severity.INFO);
                    m_stage = Stage.Ballistic;
                }
                return;
            }
        }
Esempio n. 7
0
        private void StartGravity()
        {
            Vector3D position = MyEntity.GetPosition();
            List<IMyVoxelBase> allPlanets = ResourcePool<List<IMyVoxelBase>>.Pool.Get();
            MyAPIGateway.Session.VoxelMaps.GetInstances_Safe(allPlanets, voxel => voxel is MyPlanet);

            foreach (MyPlanet planet in allPlanets)
                if (planet.IsPositionInGravityWell(position))
                {
                    Vector3D targetPosition = CurrentTarget.GetPosition();
                    if (!planet.IsPositionInGravityWell(targetPosition))
                    {
                        myLogger.debugLog("Target is not in gravity well, target position: " + targetPosition + ", planet: " + planet.getBestName(), Logger.severity.WARNING);
                        return;
                    }
                    Vector3 gravAtTarget = planet.GetWorldGravityNormalized(ref targetPosition);
                    m_gravData = new GravityData(planet, gravAtTarget);
                    break;
                }

            allPlanets.Clear();
            ResourcePool<List<IMyVoxelBase>>.Pool.Return(allPlanets);

            if (m_gravData != null)
                UpdateGravity();
        }
Esempio n. 8
0
        /// <summary>
        /// Updates m_stage if guidance starts or stops.
        /// </summary>
        private void CheckGuidance()
        {
            switch (m_stage)
            {
                case Stage.Rail:
                    double minDist = (MyEntity.WorldAABB.Max - MyEntity.WorldAABB.Min).AbsMax();
                    minDist *= 2;

                    if (CubeBlock.WorldAABB.DistanceSquared(MyEntity.GetPosition()) >= minDist * minDist)
                    {
                        m_rail = null;
                        if (myDescr.SemiActiveLaser)
                        {
                            myGuidanceEnds = Globals.ElapsedTime.Add(TimeSpan.FromSeconds(myDescr.GuidanceSeconds));
                            myLogger.debugLog("past arming range, semi-active.", Logger.severity.INFO);
                            m_stage = Stage.SemiActive;
                            return;
                        }

                        if (myAmmo.Description.BoostDistance > 1f)
                        {
                            myLogger.debugLog("past arming range, starting boost stage", Logger.severity.INFO);
                            StartGravity();
                            m_stage = Stage.Boost;
                            if (m_gravData == null)
                            {
                                myLogger.debugLog("no gravity, terminating", Logger.severity.WARNING);
                                m_stage = Stage.Terminated;
                            }
                        }
                        else
                        {
                            myGuidanceEnds = Globals.ElapsedTime.Add(TimeSpan.FromSeconds(myDescr.GuidanceSeconds));
                            myLogger.debugLog("past arming range, starting guidance.", Logger.severity.INFO);
                            m_stage = Stage.Guided;
                        }
                    }
                    return;
                case Stage.Boost:
                    if (Vector3D.DistanceSquared(CubeBlock.GetPosition(), MyEntity.GetPosition()) >= myAmmo.Description.BoostDistance * myAmmo.Description.BoostDistance)
                    {
                        myLogger.debugLog("completed boost stage, starting mid course stage", Logger.severity.INFO);
                        m_stage = Stage.MidCourse;
                    }
                    return;
                case Stage.MidCourse:
                    Target t = CurrentTarget;
                    if (t.Entity == null)
                        return;

                    double toTarget = Vector3D.Distance(MyEntity.GetPosition(), t.GetPosition());
                    double toLaunch = Vector3D.Distance(MyEntity.GetPosition(), CubeBlock.GetPosition());

                    if (toTarget < toLaunch)
                    {
                        myLogger.debugLog("closer to target(" + toTarget + ") than to launch(" + toLaunch + "), starting guidance", Logger.severity.INFO);
                        m_stage = Stage.Guided;
                        myGuidanceEnds = Globals.ElapsedTime.Add(TimeSpan.FromSeconds(myDescr.GuidanceSeconds));
                        m_gravData = null;
                    }
                    return;
                case Stage.SemiActive:
                case Stage.Guided:
                    if (Globals.ElapsedTime >= myGuidanceEnds)
                    {
                        myLogger.debugLog("finished guidance", Logger.severity.INFO);
                        m_stage = Stage.Ballistic;
                    }
                    return;
            }
        }