public bool UpdateSuspensionContacts(float dt, float updatePeriod) { this.numContacts = 0; this.averageSurfaceVelocity = Vector3.zero; this.averageVelocity = Vector3.zero; bool flag = true; for (int i = 0; i < this.rays.Length; i++) { SuspensionRay ray = this.rays[i]; ray.Update(dt, updatePeriod); flag &= ray.hasCollision; if (ray.hasCollision) { this.numContacts++; this.averageSurfaceVelocity += ray.surfaceVelocity; this.averageVelocity += ray.velocity; } } if (!flag && (updatePeriod > 0f)) { for (int j = 0; j < this.rays.Length; j++) { this.rays[j].ResetContinuousRaycast(); } } if (this.numContacts > 1) { this.averageSurfaceVelocity /= (float)this.numContacts; this.averageVelocity /= (float)this.numContacts; } return(flag); }
private void ApplyTrackRayNormal(ref Vector3 currentNrm, SuspensionRay ray) { if (ray.hasCollision) { currentNrm += ray.rayHit.normal; } }
private void AddSurfaceVelocitiesFromRay(ChassisNode node, SuspensionRay ray, Vector3 contactsMidpoint, ref Vector3 surfaceVelocity, ref Vector3 angularSurfaceVelocity) { if (ray.hasCollision) { surfaceVelocity += ray.surfaceVelocity; Vector3 lhs = ray.rayHit.point - contactsMidpoint; float sqrMagnitude = lhs.sqrMagnitude; if (sqrMagnitude > 0.0001f) { angularSurfaceVelocity += Vector3.Cross(lhs, ray.surfaceVelocity) / sqrMagnitude; } } }
private void ApplyForceFromRay(SuspensionRay ray, Rigidbody rigidbody, Vector3 bodyForwardAxis, float forcePerRay) { if (ray.hasCollision) { float num = Mathf.Abs(Mathf.Acos(ray.rayHit.normal.normalized.y)); if (num < 1.047198f) { float num2 = forcePerRay; if (num > 1.047198f) { num2 *= (1.047198f - num) / 0.2617994f; } Vector3 force = bodyForwardAxis * num2; rigidbody.AddForceAtPositionSafe(force, ray.GetGlobalOrigin()); } } }
private Vector3 GetContactsMidpoint(ChassisConfigComponent chassisConfig, TrackComponent tracks) { Vector3 vector = new Vector3(); for (int i = 0; i < chassisConfig.NumRaysPerTrack; i++) { SuspensionRay ray = tracks.LeftTrack.rays[i]; if (ray.hasCollision) { vector += ray.rayHit.point; } ray = tracks.RightTrack.rays[i]; if (ray.hasCollision) { vector += ray.rayHit.point; } } int num2 = tracks.LeftTrack.numContacts + tracks.RightTrack.numContacts; return((num2 != 0) ? (vector / ((float)num2)) : Vector3.zero); }
private Vector3 GetFallingNrm(bool fallingByTrack, TrackComponent track, ChassisConfigComponent chassisConfig, TankCollisionComponent tankCollision, out bool isFallingOnTank) { Vector3 zero = Vector3.zero; isFallingOnTank = false; if (!fallingByTrack) { Collision collision = tankCollision.Collision; if (!this.CheckTankCollisionNotNull(tankCollision)) { return(zero.normalized); } ContactPoint[] contacts = collision.contacts; if (contacts == null) { return(zero.normalized); } int length = contacts.Length; for (int i = 0; i < length; i++) { ContactPoint point = contacts[i]; zero += point.normal; if (!isFallingOnTank) { Collider otherCollider = point.otherCollider; if (this.ValidateCollider(otherCollider)) { int layer = otherCollider.gameObject.layer; isFallingOnTank |= this.CheckTankLayer(layer); } } } } else { int numRaysPerTrack = chassisConfig.NumRaysPerTrack; SuspensionRay[] rays = track.LeftTrack.rays; SuspensionRay[] rayArray2 = track.RightTrack.rays; for (int i = 0; i < numRaysPerTrack; i++) { SuspensionRay ray = rays[i]; SuspensionRay ray2 = rayArray2[i]; this.ApplyTrackRayNormal(ref zero, ray); this.ApplyTrackRayNormal(ref zero, ray2); if (!isFallingOnTank) { if (ray.hasCollision) { if ((ray.rayHit.collider == null) || (ray.rayHit.collider.gameObject == null)) { return(zero.normalized); } if (this.ValidateCollider(ray.rayHit.collider)) { int layer = ray.rayHit.collider.gameObject.layer; isFallingOnTank |= this.CheckTankLayer(layer); } } if (ray2.hasCollision) { if ((ray2.rayHit.collider == null) || (ray2.rayHit.collider.gameObject == null)) { return(zero.normalized); } if (this.ValidateCollider(ray2.rayHit.collider)) { int layer = ray2.rayHit.collider.gameObject.layer; isFallingOnTank |= this.CheckTankLayer(layer); } } } } } return(zero.normalized); }