Ejemplo n.º 1
0
        }         // 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();
        }