private void ApplyConstraintsForType(ref MixedRealityTransform transform, bool isOneHanded, bool isNear, TransformFlags transformType)
        {
            ManipulationHandFlags      handMode      = isOneHanded ? ManipulationHandFlags.OneHanded : ManipulationHandFlags.TwoHanded;
            ManipulationProximityFlags proximityMode = isNear ? ManipulationProximityFlags.Near : ManipulationProximityFlags.Far;

            foreach (var constraint in constraints)
            {
                if (constraint.ConstraintType == transformType &&
                    constraint.HandType.HasFlag(handMode) &&
                    constraint.ProximityType.HasFlag(proximityMode))
                {
                    constraint.ApplyConstraint(ref transform);
                }
            }
        }
        private void MigrateOneHandRotationModes(ref ObjectManipulator objManip, ManipulationHandler.RotateInOneHandType oldMode, ManipulationProximityFlags proximity)
        {
            ObjectManipulator.RotateInOneHandType newMode = ObjectManipulator.RotateInOneHandType.RotateAboutGrabPoint;

            switch (oldMode)
            {
            case ManipulationHandler.RotateInOneHandType.MaintainRotationToUser:
            {
                newMode = ObjectManipulator.RotateInOneHandType.RotateAboutGrabPoint;

                var constraint = objManip.EnsureComponent <FixedRotationToUserConstraint>();
                constraint.TargetTransform = objManip.HostTransform;
                constraint.HandType        = ManipulationHandFlags.OneHanded;
                constraint.ProximityType   = proximity;
                break;
            }

            case ManipulationHandler.RotateInOneHandType.GravityAlignedMaintainRotationToUser:
            {
                newMode = ObjectManipulator.RotateInOneHandType.RotateAboutGrabPoint;

                var rotConstraint = objManip.EnsureComponent <FixedRotationToUserConstraint>();
                rotConstraint.TargetTransform = objManip.HostTransform;
                rotConstraint.HandType        = ManipulationHandFlags.OneHanded;
                rotConstraint.ProximityType   = proximity;

                var axisConstraint = objManip.EnsureComponent <RotationAxisConstraint>();
                axisConstraint.TargetTransform      = objManip.HostTransform;
                axisConstraint.HandType             = ManipulationHandFlags.OneHanded;
                axisConstraint.ProximityType        = proximity;
                axisConstraint.ConstraintOnRotation = AxisFlags.XAxis | AxisFlags.ZAxis;
                break;
            }

            case ManipulationHandler.RotateInOneHandType.FaceUser:
            {
                newMode = ObjectManipulator.RotateInOneHandType.RotateAboutGrabPoint;

                var rotConstraint = objManip.EnsureComponent <FaceUserConstraint>();
                rotConstraint.TargetTransform = objManip.HostTransform;
                rotConstraint.HandType        = ManipulationHandFlags.OneHanded;
                rotConstraint.ProximityType   = proximity;
                rotConstraint.FaceAway        = false;
                break;
            }

            case ManipulationHandler.RotateInOneHandType.FaceAwayFromUser:
            {
                newMode = ObjectManipulator.RotateInOneHandType.RotateAboutGrabPoint;

                var rotConstraint = objManip.EnsureComponent <FaceUserConstraint>();
                rotConstraint.TargetTransform = objManip.HostTransform;
                rotConstraint.HandType        = ManipulationHandFlags.OneHanded;
                rotConstraint.ProximityType   = proximity;
                rotConstraint.FaceAway        = true;
                break;
            }

            case ManipulationHandler.RotateInOneHandType.MaintainOriginalRotation:
            {
                newMode = ObjectManipulator.RotateInOneHandType.RotateAboutGrabPoint;

                var rotConstraint = objManip.EnsureComponent <FixedRotationToWorldConstraint>();
                rotConstraint.TargetTransform = objManip.HostTransform;
                rotConstraint.HandType        = ManipulationHandFlags.OneHanded;
                rotConstraint.ProximityType   = proximity;
                break;
            }

            case ManipulationHandler.RotateInOneHandType.RotateAboutObjectCenter:
                newMode = ObjectManipulator.RotateInOneHandType.RotateAboutObjectCenter;
                break;

            case ManipulationHandler.RotateInOneHandType.RotateAboutGrabPoint:
                newMode = ObjectManipulator.RotateInOneHandType.RotateAboutGrabPoint;
                break;
            }

            if (proximity.HasFlag(ManipulationProximityFlags.Near))
            {
                objManip.OneHandRotationModeNear = newMode;
            }
            if (proximity.HasFlag(ManipulationProximityFlags.Far))
            {
                objManip.OneHandRotationModeFar = newMode;
            }
        }
Beispiel #3
0
 /// <summary>
 /// Checks to determine if all bits in a provided mask are set.
 /// </summary>
 /// <param name="a"><see cref="ManipulationProximityFlags"/> value.</param>
 /// <param name="b"><see cref="ManipulationProximityFlags"/> mask.</param>
 /// <returns>
 /// True if all of the bits in the specified mask are set in the current value.
 /// </returns>
 public static bool IsMaskSet(this ManipulationProximityFlags a, ManipulationProximityFlags b)
 {
     return((a & b) == b);
 }