// Find all related sprites (not including self) void FSpriteEditorViewportClient::UpdateRelatedSpritesList() { UPaperSprite* Sprite = GetSpriteBeingEdited(); UTexture2D* Texture = Sprite->GetSourceTexture(); if (Texture != nullptr) { FARFilter Filter; Filter.ClassNames.Add(UPaperSprite::StaticClass()->GetFName()); const FString TextureString = FAssetData(Texture).GetExportTextName(); const FName SourceTexturePropName(TEXT("SourceTexture")); Filter.TagsAndValues.Add(SourceTexturePropName, TextureString); FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry"); TArray<FAssetData> SpriteAssetData; AssetRegistryModule.Get().GetAssets(Filter, SpriteAssetData); FAssetData CurrentAssetData(Sprite); RelatedSprites.Empty(); for (int32 i = 0; i < SpriteAssetData.Num(); ++i) { FAssetData& SpriteAsset = SpriteAssetData[i]; if (SpriteAsset == Sprite) { continue; } const FString* SourceUVString = SpriteAsset.TagsAndValues.Find("SourceUV"); const FString* SourceDimensionString = SpriteAsset.TagsAndValues.Find("SourceDimension"); FVector2D SourceUV, SourceDimension; if (SourceUVString != nullptr && SourceDimensionString != nullptr) { if (SourceUV.InitFromString(*SourceUVString) && SourceDimension.InitFromString(*SourceDimensionString)) { FRelatedSprite RelatedSprite; RelatedSprite.AssetData = SpriteAsset; RelatedSprite.SourceUV = SourceUV; RelatedSprite.SourceDimension = SourceDimension; RelatedSprites.Add(RelatedSprite); } } } } }
void FSpriteEditorViewportClient::UpdateSourceTextureSpriteFromSprite(UPaperSprite* SourceSprite) { UPaperSprite* TargetSprite = SourceTextureViewComponent->GetSprite(); check(TargetSprite); if (SourceSprite != nullptr) { if ((SourceSprite->GetSourceTexture() != TargetSprite->GetSourceTexture()) || (TargetSprite->PixelsPerUnrealUnit != SourceSprite->PixelsPerUnrealUnit)) { FComponentReregisterContext ReregisterSprite(SourceTextureViewComponent); FSpriteAssetInitParameters SpriteReinitParams; SpriteReinitParams.SetTextureAndFill(SourceSprite->SourceTexture); SpriteReinitParams.DefaultMaterialOverride = SourceSprite->DefaultMaterial; SpriteReinitParams.AlternateMaterialOverride = SourceSprite->AlternateMaterial; SpriteReinitParams.SetPixelsPerUnrealUnit(SourceSprite->PixelsPerUnrealUnit); TargetSprite->InitializeSprite(SpriteReinitParams); RequestFocusOnSelection(/*bInstant=*/ true); } // Position the sprite for the mode its meant to be in FVector2D CurrentPivotPosition; ESpritePivotMode::Type CurrentPivotMode = TargetSprite->GetPivotMode(/*out*/CurrentPivotPosition); FVector Translation(1.0f * PaperAxisZ); if (IsInSourceRegionEditMode()) { if (CurrentPivotMode != ESpritePivotMode::Bottom_Left) { TargetSprite->SetPivotMode(ESpritePivotMode::Bottom_Left, FVector2D::ZeroVector); TargetSprite->PostEditChange(); } SourceTextureViewComponent->SetSpriteColor(FLinearColor::White); SourceTextureViewComponent->SetWorldTransform(FTransform(Translation)); } else { const FVector2D PivotPosition = SourceSprite->GetPivotPosition(); if (CurrentPivotMode != ESpritePivotMode::Custom || CurrentPivotPosition != PivotPosition) { TargetSprite->SetPivotMode(ESpritePivotMode::Custom, PivotPosition); TargetSprite->PostEditChange(); } // Tint the source texture darker to help distinguish the two SourceTextureViewComponent->SetSpriteColor(SpriteEditingConstants::SourceTextureDarkTintColor); const bool bRotated = SourceSprite->IsRotatedInSourceImage(); if (bRotated) { FQuat Rotation(PaperAxisZ, FMath::DegreesToRadians(90.0f)); SourceTextureViewComponent->SetWorldTransform(FTransform(Rotation, Translation)); } else { SourceTextureViewComponent->SetWorldTransform(FTransform(Translation)); } } } else { // No source sprite, so don't draw the target either TargetSprite->SourceTexture = nullptr; } }
bool FSpriteEditorViewportClient::ConvertMarqueeToSourceTextureSpace(/*out*/ FIntPoint& OutStartPos, /*out*/ FIntPoint& OutDimension) { FSpriteGeometryEditMode* GeometryEditMode = ModeTools->GetActiveModeTyped<FSpriteGeometryEditMode>(FSpriteGeometryEditMode::EM_SpriteGeometry); check(GeometryEditMode); const FVector2D MarqueeStartPos = GeometryEditMode->GetMarqueeStartPos(); const FVector2D MarqueeEndPos = GeometryEditMode->GetMarqueeEndPos(); bool bSuccessful = false; UPaperSprite* Sprite = SourceTextureViewComponent->GetSprite(); UTexture2D* SpriteSourceTexture = Sprite->GetSourceTexture(); if (SpriteSourceTexture != nullptr) { // Calculate world space positions FSceneViewFamilyContext ViewFamily(FSceneViewFamily::ConstructionValues(Viewport, GetScene(), EngineShowFlags)); FSceneView* View = CalcSceneView(&ViewFamily); const FVector StartPos = View->PixelToWorld(MarqueeStartPos.X, MarqueeStartPos.Y, 0); const FVector EndPos = View->PixelToWorld(MarqueeEndPos.X, MarqueeEndPos.Y, 0); // Convert to source texture space to work out the pixels dragged FVector2D TextureSpaceStartPos = Sprite->ConvertWorldSpaceToTextureSpace(StartPos); FVector2D TextureSpaceEndPos = Sprite->ConvertWorldSpaceToTextureSpace(EndPos); if (TextureSpaceStartPos.X > TextureSpaceEndPos.X) { Swap(TextureSpaceStartPos.X, TextureSpaceEndPos.X); } if (TextureSpaceStartPos.Y > TextureSpaceEndPos.Y) { Swap(TextureSpaceStartPos.Y, TextureSpaceEndPos.Y); } const FIntPoint SourceTextureSize(SpriteSourceTexture->GetImportedSize()); const int32 SourceTextureWidth = SourceTextureSize.X; const int32 SourceTextureHeight = SourceTextureSize.Y; FIntPoint TSStartPos; TSStartPos.X = FMath::Clamp<int32>((int32)TextureSpaceStartPos.X, 0, SourceTextureWidth - 1); TSStartPos.Y = FMath::Clamp<int32>((int32)TextureSpaceStartPos.Y, 0, SourceTextureHeight - 1); FIntPoint TSEndPos; TSEndPos.X = FMath::Clamp<int32>((int32)TextureSpaceEndPos.X, 0, SourceTextureWidth - 1); TSEndPos.Y = FMath::Clamp<int32>((int32)TextureSpaceEndPos.Y, 0, SourceTextureHeight - 1); const FIntPoint TextureSpaceDimensions = TSEndPos - TSStartPos; if ((TextureSpaceDimensions.X > 0) || (TextureSpaceDimensions.Y > 0)) { OutStartPos = TSStartPos; OutDimension = TextureSpaceDimensions; bSuccessful = true; } } return bSuccessful; }