} // end of PredictAllRemoteBodiesWithOwnedBodies private Vector3 ClosestPointOnBounds(Godot.RigidBody from, Godot.RigidBody to) { var toCollisionShape = to.GetChild <CollisionShape>(1); var aabb = toCollisionShape.Shape.GetDebugMesh().GetAabb(); var aabbPosition = aabb.Position; var aabbEnd = aabb.End; Vector3[] collisionPoint = new Vector3[8]; collisionPoint[0] = aabbPosition; collisionPoint[1] = new Vector3(aabbPosition.x, aabbPosition.y, aabbEnd.z); collisionPoint[2] = new Vector3(aabbEnd.x, aabbPosition.y, aabbEnd.z); collisionPoint[3] = new Vector3(aabbEnd.x, aabbPosition.y, aabbPosition.z); collisionPoint[4] = new Vector3(aabbPosition.x, aabbEnd.y, aabbPosition.z); collisionPoint[5] = new Vector3(aabbPosition.x, aabbEnd.y, aabbEnd.z); collisionPoint[6] = new Vector3(aabbEnd.x, aabbEnd.y, aabbPosition.z); collisionPoint[7] = aabbEnd; var shortest = to.GlobalTransform.origin.DistanceSquaredTo(from.GlobalTransform.origin); Vector3 ret = Vector3.Zero; foreach (var point in collisionPoint.Select(x => x + to.GlobalTransform.origin)) { var distance = point.DistanceSquaredTo(from.GlobalTransform.origin); if (shortest > distance) { shortest = distance; ret = point; } } return(ret); }
internal void Update(GodotRigidBody rigidbody) { Velocity.FromGodotVector3(_sceneRoot.ToLocal(rigidbody.LinearVelocity)); AngularVelocity.FromGodotVector3(_sceneRoot.ToLocal(rigidbody.AngularVelocity)); // No need to read Position or Rotation. They're write-only from the patch to the component. Mass = rigidbody.Mass; DetectCollisions = !rigidbody.GetChild <CollisionShape>()?.Disabled ?? false; CollisionDetectionMode = rigidbody.ContinuousCd switch { true => MRECollisionDetectionMode.Continuous, false => MRECollisionDetectionMode.Discrete }; UseGravity = !Mathf.IsZeroApprox(rigidbody.GravityScale); ConstraintFlags = rigidbody.GetMRERigidBodyConstraints(); }