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); } }
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(); } }
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; } }
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; }
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); }
/// <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; } }
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(); }
/// <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; } }