You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
I have reviewed each change carefully, but it is a large change and I could have missed something! Here is a summary of the types of changes in this CL: * Made nullptr checks consistent (the plurality of the changes are of this type) * Completed switch statements (IE, switch did not explicitly handle default case, but had unhandled enum entries - this is the second most popular type of fix) * Removed unused variables * Removed redundant initializations * WidgetNavigationCustomization.cpp was fixed by the owner * integers converted to floats where result was stored in a float * Removed redundent null checks (e.g. before delete statements) * Renamed variables to prevent non-obvious shadowing * Fixed use of bitwise & when checking for equality to an enum entry (which is often 0) * Fixes for some copy paste errors (e.g. FoliageEdMode.cpp) [CL 2498053 by Dan Oconnor in Main branch]
300 lines
7.9 KiB
C++
300 lines
7.9 KiB
C++
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "TextureAlignModePrivatePCH.h"
|
|
#include "EditorSupportDelegates.h"
|
|
#include "Engine/Polys.h"
|
|
|
|
IMPLEMENT_MODULE( FTextureAlignModeModule, TextureAlignMode );
|
|
|
|
DEFINE_LOG_CATEGORY_STATIC(LogTextureAlignMode, Log, All);
|
|
|
|
|
|
void FTextureAlignModeModule::StartupModule()
|
|
{
|
|
FEditorModeRegistry::Get().RegisterMode<FEdModeTexture>(
|
|
FBuiltinEditorModes::EM_Texture,
|
|
NSLOCTEXT("EditorModes", "TextureAlignmentMode", "Texture Alignment")
|
|
);
|
|
}
|
|
|
|
void FTextureAlignModeModule::ShutdownModule()
|
|
{
|
|
FEditorModeRegistry::Get().UnregisterMode(FBuiltinEditorModes::EM_Texture);
|
|
}
|
|
|
|
/*------------------------------------------------------------------------------
|
|
Texture
|
|
------------------------------------------------------------------------------*/
|
|
|
|
FEdModeTexture::FEdModeTexture()
|
|
: ScopedTransaction( NULL )
|
|
, TrackingWorld( NULL )
|
|
{
|
|
Tools.Add( new FModeTool_Texture() );
|
|
SetCurrentTool( MT_Texture );
|
|
}
|
|
|
|
FEdModeTexture::~FEdModeTexture()
|
|
{
|
|
// Ensure no transaction is outstanding.
|
|
check( !ScopedTransaction );
|
|
}
|
|
|
|
void FEdModeTexture::Enter()
|
|
{
|
|
FEdMode::Enter();
|
|
|
|
const bool bGetRawValue = true;
|
|
SaveCoordSystem = GLevelEditorModeTools().GetCoordSystem(bGetRawValue);
|
|
GLevelEditorModeTools().SetCoordSystem(COORD_Local);
|
|
}
|
|
|
|
void FEdModeTexture::Exit()
|
|
{
|
|
if( ScopedTransaction != NULL )
|
|
{
|
|
delete ScopedTransaction;
|
|
ScopedTransaction = NULL;
|
|
}
|
|
|
|
FEdMode::Exit();
|
|
|
|
GLevelEditorModeTools().SetCoordSystem(SaveCoordSystem);
|
|
FEditorSupportDelegates::RedrawAllViewports.Broadcast();
|
|
}
|
|
|
|
FVector FEdModeTexture::GetWidgetLocation() const
|
|
{
|
|
for ( TSelectedSurfaceIterator<> It(GetWorld()) ; It ; ++It )
|
|
{
|
|
FBspSurf* Surf = *It;
|
|
ABrush* BrushActor = ( ABrush* )Surf->Actor;
|
|
if( BrushActor )
|
|
{
|
|
FPoly* poly = &BrushActor->Brush->Polys->Element[ Surf->iBrushPoly ];
|
|
return BrushActor->ActorToWorld().TransformPosition( poly->GetMidPoint() );
|
|
}
|
|
}
|
|
|
|
return FEdMode::GetWidgetLocation();
|
|
}
|
|
|
|
bool FEdModeTexture::ShouldDrawWidget() const
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool FEdModeTexture::GetCustomDrawingCoordinateSystem( FMatrix& InMatrix, void* InData )
|
|
{
|
|
// Texture mode is ALWAYS in local space
|
|
GLevelEditorModeTools().SetCoordSystem(COORD_Local);
|
|
|
|
FPoly* poly = NULL;
|
|
|
|
for ( TSelectedSurfaceIterator<> It(GetWorld()) ; It ; ++It )
|
|
{
|
|
FBspSurf* Surf = *It;
|
|
ABrush* BrushActor = ( ABrush* )Surf->Actor;
|
|
if( BrushActor )
|
|
{
|
|
poly = &BrushActor->Brush->Polys->Element[ Surf->iBrushPoly ];
|
|
break;
|
|
}
|
|
}
|
|
|
|
if( !poly )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
InMatrix = FMatrix::Identity;
|
|
|
|
InMatrix.SetAxis( 2, poly->Normal );
|
|
InMatrix.SetAxis( 0, poly->TextureU );
|
|
InMatrix.SetAxis( 1, poly->TextureV );
|
|
|
|
InMatrix.RemoveScaling();
|
|
|
|
return true;
|
|
}
|
|
|
|
bool FEdModeTexture::GetCustomInputCoordinateSystem( FMatrix& InMatrix, void* InData )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
EAxisList::Type FEdModeTexture::GetWidgetAxisToDraw( FWidget::EWidgetMode InWidgetMode ) const
|
|
{
|
|
switch( InWidgetMode ) //-V719
|
|
{
|
|
case FWidget::WM_Translate:
|
|
case FWidget::WM_Scale:
|
|
return EAxisList::XY;
|
|
break;
|
|
|
|
case FWidget::WM_Rotate:
|
|
return EAxisList::Z;
|
|
break;
|
|
}
|
|
|
|
return EAxisList::XYZ;
|
|
}
|
|
|
|
bool FEdModeTexture::StartTracking(FEditorViewportClient* InViewportClient, FViewport* InViewport)
|
|
{
|
|
// call base version because it calls the StartModify() virtual method needed to track drag events
|
|
bool BaseRtn = FEdMode::StartTracking(InViewportClient, InViewport);
|
|
|
|
// Complete the previous transaction if one exists
|
|
if( ScopedTransaction )
|
|
{
|
|
EndTracking(InViewportClient, InViewport);
|
|
}
|
|
// Start a new transaction
|
|
ScopedTransaction = new FScopedTransaction( NSLOCTEXT("UnrealEd", "TextureManipulation", "Texture Manipulation") );
|
|
|
|
for( FConstLevelIterator Iterator = GetWorld()->GetLevelIterator(); Iterator; ++Iterator )
|
|
{
|
|
UModel* Model = (*Iterator)->Model;
|
|
Model->ModifySelectedSurfs( true );
|
|
}
|
|
|
|
return BaseRtn;
|
|
}
|
|
|
|
bool FEdModeTexture::EndTracking(FEditorViewportClient* InViewportClient, FViewport* InViewport)
|
|
{
|
|
// Clean up the scoped transaction if one is still pending
|
|
if( ScopedTransaction != NULL )
|
|
{
|
|
delete ScopedTransaction;
|
|
ScopedTransaction = NULL;
|
|
}
|
|
|
|
if( TrackingWorld )
|
|
{
|
|
TrackingWorld->MarkPackageDirty();
|
|
ULevel::LevelDirtiedEvent.Broadcast();
|
|
TrackingWorld = NULL;
|
|
}
|
|
|
|
// call base version because it calls the EndModify() virtual method needed to track drag events
|
|
return FEdMode::EndTracking(InViewportClient, InViewport);
|
|
}
|
|
|
|
bool FEdModeTexture::IsCompatibleWith(FEditorModeID OtherModeID) const
|
|
{
|
|
return OtherModeID == FBuiltinEditorModes::EM_Bsp;
|
|
}
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
FModeTool_TextureAlign.
|
|
-----------------------------------------------------------------------------*/
|
|
|
|
FModeTool_Texture::FModeTool_Texture()
|
|
{
|
|
ID = MT_Texture;
|
|
bUseWidget = 1;
|
|
PreviousInputDrag = FVector::ZeroVector;
|
|
}
|
|
|
|
/**
|
|
* @return true if the delta was handled by this editor mode tool.
|
|
*/
|
|
bool FModeTool_Texture::InputDelta(FEditorViewportClient* InViewportClient,FViewport* InViewport,FVector& InDrag,FRotator& InRot,FVector& InScale)
|
|
{
|
|
if( InViewportClient->GetCurrentWidgetAxis() == EAxisList::None )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// calculate delta drag for this tick for the call to GEditor->polyTexPan below which is using relative (delta) mode
|
|
FVector deltaDrag = InDrag;
|
|
if (true == InViewportClient->IsPerspective())
|
|
{
|
|
// perspective viewports pass the absolute drag so subtract the last tick's drag value to get the delta
|
|
deltaDrag -= PreviousInputDrag;
|
|
}
|
|
PreviousInputDrag = InDrag;
|
|
|
|
if( !deltaDrag.IsZero() )
|
|
{
|
|
// Ensure each polygon has a unique base point index.
|
|
for( FConstLevelIterator Iterator = InViewportClient->GetWorld()->GetLevelIterator(); Iterator; ++Iterator )
|
|
{
|
|
UModel* Model = (*Iterator)->Model;
|
|
for(int32 SurfaceIndex = 0;SurfaceIndex < Model->Surfs.Num();SurfaceIndex++)
|
|
{
|
|
FBspSurf& Surf = Model->Surfs[SurfaceIndex];
|
|
|
|
if(Surf.PolyFlags & PF_Selected)
|
|
{
|
|
const FVector Base = Model->Points[Surf.pBase];
|
|
Surf.pBase = Model->Points.Add(Base);
|
|
}
|
|
}
|
|
FMatrix Mat = GLevelEditorModeTools().GetCustomDrawingCoordinateSystem();
|
|
FVector UVW = Mat.InverseTransformVector( deltaDrag ); // InverseTransformNormal because Mat is the transform from the surface/widget's coords to world coords
|
|
GEditor->polyTexPan( Model, UVW.X, UVW.Y, 0 ); // 0 is relative mode because UVW is made from deltaDrag - the user input since the last tick
|
|
}
|
|
}
|
|
|
|
if( !InRot.IsZero() )
|
|
{
|
|
const FRotationMatrix RotationMatrix( InRot );
|
|
|
|
// Ensure each polygon has unique texture vector indices.
|
|
for ( TSelectedSurfaceIterator<> It(InViewportClient->GetWorld()) ; It ; ++It )
|
|
{
|
|
FBspSurf* Surf = *It;
|
|
UModel* Model = It.GetModel();
|
|
|
|
FVector TextureU = Model->Vectors[Surf->vTextureU];
|
|
FVector TextureV = Model->Vectors[Surf->vTextureV];
|
|
|
|
TextureU = RotationMatrix.TransformPosition( TextureU );
|
|
TextureV = RotationMatrix.TransformPosition( TextureV );
|
|
|
|
Surf->vTextureU = Model->Vectors.Add(TextureU);
|
|
Surf->vTextureV = Model->Vectors.Add(TextureV);
|
|
|
|
GEditor->polyUpdateMaster( Model, It.GetSurfaceIndex(), 1 );
|
|
}
|
|
}
|
|
|
|
if( !InScale.IsZero() )
|
|
{
|
|
float ScaleU = InScale.X / GEditor->GetGridSize();
|
|
float ScaleV = InScale.Y / GEditor->GetGridSize();
|
|
|
|
ScaleU = 1.f - (ScaleU / 100.f);
|
|
ScaleV = 1.f - (ScaleV / 100.f);
|
|
|
|
// Ensure each polygon has unique texture vector indices.
|
|
for( FConstLevelIterator Iterator = InViewportClient->GetWorld()->GetLevelIterator(); Iterator; ++Iterator )
|
|
{
|
|
UModel* Model = (*Iterator)->Model;
|
|
for(int32 SurfaceIndex = 0;SurfaceIndex < Model->Surfs.Num();SurfaceIndex++)
|
|
{
|
|
FBspSurf& Surf = Model->Surfs[SurfaceIndex];
|
|
if(Surf.PolyFlags & PF_Selected)
|
|
{
|
|
const FVector TextureU = Model->Vectors[Surf.vTextureU];
|
|
const FVector TextureV = Model->Vectors[Surf.vTextureV];
|
|
|
|
Surf.vTextureU = Model->Vectors.Add(TextureU);
|
|
Surf.vTextureV = Model->Vectors.Add(TextureV);
|
|
}
|
|
}
|
|
GEditor->polyTexScale( Model, ScaleU, 0.f, 0.f, ScaleV, false );
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|