// Copyright Epic Games, Inc. All Rights Reserved. /*============================================================================= EditorConstraints.cpp: Editor movement constraints. =============================================================================*/ #include "CoreMinimal.h" #include "LevelEditorViewport.h" #include "Settings/LevelEditorViewportSettings.h" #include "Editor/EditorEngine.h" #include "Editor.h" #include "EditorSupportDelegates.h" #include "LevelEditorActions.h" float UEditorEngine::GetGridSize() const { const TArray& PosGridSizes = GetCurrentPositionGridArray(); const int32 CurrentPosGridSize = GetDefault()->CurrentPosGridSize; float PosVal = 0.0001f; if ( PosGridSizes.IsValidIndex(CurrentPosGridSize) ) { PosVal = PosGridSizes[CurrentPosGridSize]; } return PosVal; } bool UEditorEngine::IsGridSizePowerOfTwo() const { const ULevelEditorViewportSettings* ViewportSettings = GetDefault(); return ViewportSettings->bUsePowerOf2SnapSize; } void UEditorEngine::SetGridSize( int32 InIndex ) { FinishAllSnaps(); ULevelEditorViewportSettings* ViewportSettings = GetMutableDefault(); ViewportSettings->CurrentPosGridSize = FMath::Clamp( InIndex, 0, GetCurrentPositionGridArray().Num() - 1 ); // If user is editing snapping values, we assume they also want snapping turned on if (!FLevelEditorActionCallbacks::LocationGridSnap_IsChecked()) { FLevelEditorActionCallbacks::LocationGridSnap_Clicked(); } ViewportSettings->PostEditChange(); FEditorDelegates::OnGridSnappingChanged.Broadcast(GetDefault()->GridEnabled, GetGridSize()); RedrawLevelEditingViewports(); FEditorSupportDelegates::UpdateUI.Broadcast(); } void UEditorEngine::GridSizeIncrement( ) { const ULevelEditorViewportSettings* ViewportSettings = GetDefault(); SetGridSize(ViewportSettings->CurrentPosGridSize + 1); } void UEditorEngine::GridSizeDecrement( ) { const ULevelEditorViewportSettings* ViewportSettings = GetDefault(); SetGridSize(ViewportSettings->CurrentPosGridSize - 1); } void UEditorEngine::ToggleAllowConstrainedAspectRatioInPreview() { bAllowConstrainedAspectRatioInPreview ^= true; FEditorSupportDelegates::RedrawAllViewports.Broadcast(); } bool UEditorEngine::GetAllowConstrainedAspectRatioInPreview() { return bAllowConstrainedAspectRatioInPreview; } const TArray& UEditorEngine::GetCurrentPositionGridArray() const { const ULevelEditorViewportSettings* ViewportSettings = GetDefault(); return (ViewportSettings->bUsePowerOf2SnapSize) ? ViewportSettings->Pow2GridSizes : ViewportSettings->DecimalGridSizes; } const TArray& UEditorEngine::GetCurrentIntervalGridArray() const { const ULevelEditorViewportSettings* ViewportSettings = GetDefault(); return (ViewportSettings->bUsePowerOf2SnapSize ? ViewportSettings->Pow2GridIntervals : ViewportSettings->DecimalGridIntervals); } FRotator UEditorEngine::GetRotGridSize() { const TArray RotGridSizes = GetCurrentRotationGridArray(); const int32 CurrentRotGridSize = GetDefault()->CurrentRotGridSize; float RotVal = 0.0001f; if ( RotGridSizes.IsValidIndex(CurrentRotGridSize) ) { RotVal = RotGridSizes[CurrentRotGridSize]; } return FRotator(RotVal, RotVal, RotVal); } void UEditorEngine::SetRotGridSize( int32 InIndex, ERotationGridMode InGridMode ) { FinishAllSnaps(); const TArray RotGridSizes = GetCurrentRotationGridArray(); ULevelEditorViewportSettings* ViewportSettings = GetMutableDefault(); ViewportSettings->CurrentRotGridMode = InGridMode; ViewportSettings->CurrentRotGridSize = FMath::Clamp( InIndex, 0, RotGridSizes.Num() - 1 ); // If user is editing snapping values, we assume they also want snapping turned on if (!FLevelEditorActionCallbacks::RotationGridSnap_IsChecked()) { FLevelEditorActionCallbacks::RotationGridSnap_Clicked(); } ViewportSettings->PostEditChange(); RedrawLevelEditingViewports(); FEditorSupportDelegates::UpdateUI.Broadcast(); } void UEditorEngine::RotGridSizeIncrement( ) { const ULevelEditorViewportSettings* ViewportSettings = GetDefault(); SetRotGridSize(ViewportSettings->CurrentRotGridSize + 1, ViewportSettings->CurrentRotGridMode ); } void UEditorEngine::RotGridSizeDecrement( ) { const ULevelEditorViewportSettings* ViewportSettings = GetDefault(); SetRotGridSize(ViewportSettings->CurrentRotGridSize - 1, ViewportSettings->CurrentRotGridMode ); } const TArray& UEditorEngine::GetCurrentRotationGridArray() const { const ULevelEditorViewportSettings* ViewportSettings = GetDefault(); return (ViewportSettings->CurrentRotGridMode == GridMode_Common) ? ViewportSettings->CommonRotGridSizes : ViewportSettings->DivisionsOf360RotGridSizes; } float UEditorEngine::GetScaleGridSize() { const ULevelEditorViewportSettings* ViewportSettings = GetDefault(); float ScaleVal = 0.0001f; if ( ViewportSettings->ScalingGridSizes.IsValidIndex(ViewportSettings->CurrentScalingGridSize) ) { ScaleVal = ViewportSettings->ScalingGridSizes[ViewportSettings->CurrentScalingGridSize]; } return ScaleVal; } void UEditorEngine::SetScaleGridSize( int32 InIndex ) { FinishAllSnaps(); ULevelEditorViewportSettings* ViewportSettings = GetMutableDefault(); ViewportSettings->CurrentScalingGridSize = FMath::Clamp( InIndex, 0, ViewportSettings->ScalingGridSizes.Num() - 1 ); // If user is editing snapping values, we assume they also want snapping turned on if (!FLevelEditorActionCallbacks::ScaleGridSnap_IsChecked()) { FLevelEditorActionCallbacks::ScaleGridSnap_Clicked(); } ViewportSettings->PostEditChange(); RedrawLevelEditingViewports(); FEditorSupportDelegates::UpdateUI.Broadcast(); } float UEditorEngine::GetGridInterval() { const TArray& GridIntervals = GetCurrentIntervalGridArray(); int32 CurrentIndex = GetDefault()->CurrentPosGridSize; if (CurrentIndex >= GridIntervals.Num()) { CurrentIndex = GridIntervals.Num() - 1; } float IntervalValue = 1.0f; if (GridIntervals.IsValidIndex(CurrentIndex)) { IntervalValue = GridIntervals[CurrentIndex]; } return IntervalValue; } FVector UEditorEngine::GetGridLocationOffset(bool bUniformOffset) const { const float Offset = GetDefault()->GridEnabled ? GetGridSize() : 0.0f; FVector LocationOffset(Offset, Offset, Offset); if (!bUniformOffset && GCurrentLevelEditingViewportClient) { switch (GCurrentLevelEditingViewportClient->ViewportType) { case LVT_OrthoXZ: LocationOffset = FVector(Offset, 0.f, Offset); break; case LVT_OrthoYZ: LocationOffset = FVector(0.f, Offset, Offset); break; default: LocationOffset = FVector(Offset, Offset, 0.f); break; } } return LocationOffset; }