Пример #1
0
            public void UpdatePositions(IUsesSnapping usesSnapping)
            {
                if (suspended)
                {
                    return;
                }

                Undo.RecordObjects(grabbedObjects, "Move");

                for (int i = 0; i < grabbedObjects.Length; i++)
                {
                    var grabbedObject  = grabbedObjects[i];
                    var position       = grabbedObject.position;
                    var rotation       = grabbedObject.rotation;
                    var targetPosition = rayOrigin.position + rayOrigin.rotation * m_PositionOffsets[i];
                    var targetRotation = rayOrigin.rotation * m_RotationOffsets[i];

                    if (usesSnapping.DirectSnap(rayOrigin, grabbedObject, ref position, ref rotation, targetPosition, targetRotation))
                    {
                        var deltaTime = Time.deltaTime;
                        grabbedObject.position = Vector3.Lerp(grabbedObject.position, position, k_DirectLazyFollowTranslate * deltaTime);
                        grabbedObject.rotation = Quaternion.Lerp(grabbedObject.rotation, rotation, k_DirectLazyFollowRotate * deltaTime);
                    }
                    else
                    {
                        grabbedObject.position = targetPosition;
                        grabbedObject.rotation = targetRotation;
                    }
                }
            }
Пример #2
0
        /// <summary>
        /// Perform direct snapping: Transform a position/rotation directly while also respecting snapping
        /// </summary>
        /// <param name="user">The functionality user</param>
        /// <param name="rayOrigin">The ray doing the transforming</param>
        /// <param name="transform">The object being transformed (used to determine bounds; Transforms do not get modified)</param>
        /// <param name="position">The position being transformed. This will be set to a snapped position if possible</param>
        /// <param name="rotation">The rotation being transformed. This will only be modified if rotation snapping is enabled</param>
        /// <param name="targetPosition">The input position provided by direct transformation</param>
        /// <param name="targetRotation">The input rotation provided by direct transformation</param>
        /// <returns></returns>
        public static bool DirectSnap(this IUsesSnapping user, Transform rayOrigin, Transform transform, ref Vector3 position,
            ref Quaternion rotation, Vector3 targetPosition, Quaternion targetRotation)
        {
#if FI_AUTOFILL
            return default(bool);
#else
            return user.provider.DirectSnap(rayOrigin, transform, ref position, ref rotation, targetPosition, targetRotation);
#endif
        }
Пример #3
0
        /// <summary>
        /// Perform manipulator snapping: Translate a position vector using deltas while also respecting snapping
        /// </summary>
        /// <param name="user">The functionality user</param>
        /// <param name="rayOrigin">The ray doing the translating</param>
        /// <param name="transforms">The transforms being translated (used to determine bounds; Transforms do not get modified)</param>
        /// <param name="position">The position being modified by delta. This will be set with a snapped position if possible</param>
        /// <param name="rotation">The rotation to be modified if rotation snapping is enabled</param>
        /// <param name="delta">The position delta to apply</param>
        /// <param name="constraints">The axis constraints</param>
        /// <param name="pivotMode">The current pivot mode</param>
        /// <returns>Whether the position was set to a snapped position</returns>
        public static bool ManipulatorSnap(this IUsesSnapping user, Transform rayOrigin, Transform[] transforms,
            ref Vector3 position, ref Quaternion rotation, Vector3 delta, AxisFlags constraints, PivotMode pivotMode)
        {
#if FI_AUTOFILL
            return default(bool);
#else
            return user.provider.ManipulatorSnap(rayOrigin, transforms, ref position, ref rotation, delta, constraints, pivotMode);
#endif
        }
Пример #4
0
            public GrabData(Transform rayOrigin, DirectSelectInput input, Transform[] grabbedObjects, IUsesSnapping usesSnapping)
            {
                this.rayOrigin      = rayOrigin;
                this.input          = input;
                this.grabbedObjects = grabbedObjects;
                m_UsesSnapping      = usesSnapping;

                m_Objects = new GameObject[grabbedObjects.Length];
                for (int i = 0; i < grabbedObjects.Length; i++)
                {
                    var go = grabbedObjects[i].gameObject;
                    m_Objects[i] = go;
                }

                Reset();
            }
Пример #5
0
            public void UpdatePositions(IUsesSnapping usesSnapping, bool interpolate = true)
            {
                if (suspended)
                {
                    return;
                }

#if UNITY_EDITOR
                Undo.RecordObjects(grabbedTransforms, "Move");
#endif

                var rayOriginRotation = rayOrigin.rotation;
                var pivot             = pivotPoint;
                for (var i = 0; i < grabbedTransforms.Length; i++)
                {
                    var grabbedObject  = grabbedTransforms[i];
                    var position       = grabbedObject.position;
                    var rotation       = grabbedObject.rotation;
                    var targetPosition = pivot + rayOriginRotation * m_PositionOffsets[i];
                    var targetRotation = rayOriginRotation * m_RotationOffsets[i];

                    if (usesSnapping.DirectSnap(rayOrigin, grabbedObject, ref position, ref rotation, targetPosition, targetRotation))
                    {
                        if (interpolate)
                        {
                            var deltaTime = Time.deltaTime;
                            grabbedObject.position = Vector3.Lerp(grabbedObject.position, position, k_DirectLazyFollowTranslate * deltaTime);
                            grabbedObject.rotation = Quaternion.Lerp(grabbedObject.rotation, rotation, k_DirectLazyFollowRotate * deltaTime);
                        }
                        else
                        {
                            grabbedObject.position = position;
                            grabbedObject.rotation = rotation;
                        }
                    }
                    else
                    {
                        grabbedObject.position = targetPosition;
                        grabbedObject.rotation = targetRotation;
                    }
                }
            }
Пример #6
0
 /// <summary>
 /// Clear state information for a given ray
 /// </summary>
 /// <param name="rayOrigin">The ray whose state to clear</param>
 public static void ClearSnappingState(this IUsesSnapping usesSnaping, Transform rayOrigin)
 {
     clearSnappingState(rayOrigin);
 }
Пример #7
0
 /// <summary>
 /// Perform direct snapping: Transform a position/rotation directly while also respecting snapping
 /// </summary>
 /// <param name="rayOrigin">The ray doing the transforming</param>
 /// <param name="transform">The object being transformed (used to determine bounds; Transforms do not get modified)</param>
 /// <param name="position">The position being transformed. This will be set to a snapped position if possible</param>
 /// <param name="rotation">The rotation being transformed. This will only be modified if rotation snapping is enabled</param>
 /// <param name="targetPosition">The input position provided by direct transformation</param>
 /// <param name="targetRotation">The input rotation provided by direct transformation</param>
 /// <returns></returns>
 public static bool DirectSnap(this IUsesSnapping usesSnaping, Transform rayOrigin, Transform transform, ref Vector3 position, ref Quaternion rotation, Vector3 targetPosition, Quaternion targetRotation)
 {
     return(directSnap(rayOrigin, transform, ref position, ref rotation, targetPosition, targetRotation));
 }
Пример #8
0
 /// <summary>
 /// Perform manipulator snapping: Translate a position vector using deltas while also respecting snapping
 /// </summary>
 /// <param name="rayOrigin">The ray doing the translating</param>
 /// <param name="transforms">The transforms being translated (used to determine bounds; Transforms do not get modified)</param>
 /// <param name="position">The position being modified by delta. This will be set with a snapped position if possible</param>
 /// <param name="rotation">The rotation to be modified if rotation snapping is enabled</param>
 /// <param name="delta">The position delta to apply</param>
 /// <param name="constraints">The axis constraints</param>
 /// <param name="pivotMode">The current pivot mode</param>
 /// <returns>Whether the position was set to a snapped position</returns>
 public static bool ManipulatorSnap(this IUsesSnapping usesSnaping, Transform rayOrigin, Transform[] transforms, ref Vector3 position, ref Quaternion rotation, Vector3 delta, AxisFlags constraints, PivotMode pivotMode)
 {
     return(manipulatorSnap(rayOrigin, transforms, ref position, ref rotation, delta, constraints, pivotMode));
 }
Пример #9
0
        /// <summary>
        /// Clear state information for a given ray
        /// </summary>
        /// <param name="user">The functionality user</param>
        /// <param name="rayOrigin">The ray whose state to clear</param>
        public static void ClearSnappingState(this IUsesSnapping user, Transform rayOrigin)
        {
#if !FI_AUTOFILL
            user.provider.ClearSnappingState(rayOrigin);
#endif
        }
Пример #10
0
 /// <summary>
 /// Perform manipulator snapping: Translate a position vector using deltas while also respecting snapping
 /// </summary>
 /// <param name="rayOrigin">The ray doing the translating</param>
 /// <param name="transforms">The transforms being translated (used to determine bounds; Transforms do not get modified)</param>
 /// <param name="position">The position being modified by delta. This will be set with a snapped position if possible</param>
 /// <param name="rotation">The rotation to be modified if rotation snapping is enabled</param>
 /// <param name="delta">The position delta to apply</param>
 /// <returns>Whether the position was set to a snapped position</returns>
 public static bool ManipulatorSnap(this IUsesSnapping usesSnaping, Transform rayOrigin, Transform[] transforms, ref Vector3 position, ref Quaternion rotation, Vector3 delta)
 {
     return(manipulatorSnap(rayOrigin, transforms, ref position, ref rotation, delta));
 }