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; } } }
/// <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 }
/// <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 }
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(); }
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; } } }
/// <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); }
/// <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)); }
/// <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)); }
/// <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 }
/// <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)); }