// VRM4U Copyright (c) 2021-2024 Haruyoshi Yamamoto. This software is released under the MIT License. #include "VrmAssetListThumbnailRenderer.h" #include "Engine/EngineTypes.h" #include "CanvasItem.h" #include "Engine/Texture2D.h" #include "Engine/SkeletalMesh.h" #include "CanvasTypes.h" #include "Widgets/Text/STextBlock.h" #include "Widgets/Layout/SBox.h" #include "Widgets/Layout/SBorder.h" #include "Brushes/SlateColorBrush.h" #include "EditorFramework/AssetImportData.h" #include "ThumbnailRendering/SkeletalMeshThumbnailRenderer.h" #include "VrmAssetListObject.h" #include "VrmLicenseObject.h" #include "Vrm1LicenseObject.h" #include "VrmMetaObject.h" ////////////////////////////////////////////////////////////////////////// // UPaperSpriteThumbnailRenderer UClass* FAssetTypeActions_VrmAssetList::GetSupportedClass() const { return UVrmAssetListObject::StaticClass(); } FText FAssetTypeActions_VrmAssetList::GetName() const { return NSLOCTEXT("AssetTypeActions", "FAssetTypeActions_VrmAssetList", "Vrm Asset List"); } UClass* FAssetTypeActions_VrmLicense::GetSupportedClass() const { return UVrmLicenseObject::StaticClass(); } FText FAssetTypeActions_VrmLicense::GetName() const { return NSLOCTEXT("AssetTypeActions", "FAssetTypeActions_VrmLicense", "Vrm License"); } UClass* FAssetTypeActions_Vrm1License::GetSupportedClass() const { return UVrm1LicenseObject::StaticClass(); } FText FAssetTypeActions_Vrm1License::GetName() const { return NSLOCTEXT("AssetTypeActions", "FAssetTypeActions_Vrm1License", "Vrm1 License"); } UClass* FAssetTypeActions_VrmMeta::GetSupportedClass() const { return UVrmMetaObject::StaticClass(); } FText FAssetTypeActions_VrmMeta::GetName() const { return NSLOCTEXT("AssetTypeActions", "FAssetTypeActions_VrmMeta", "Vrm Meta"); } TSharedPtr FAssetTypeActions_VrmBase::GetThumbnailOverlay(const FAssetData& AssetData) const { return nullptr; // サムネイルで描画するためスキップ /* FString str; FColor col(0, 0, 0, 0); if (str.Len() == 0) { TWeakObjectPtr a = Cast(AssetData.GetAsset()); if (a.Get()) { str = TEXT(" AssetList "); } } if (str.Len() == 0){ TWeakObjectPtr a = Cast(AssetData.GetAsset()); if (a.Get()) { str = TEXT(" License "); //col.A = 128; } } if (str.Len() == 0) { TWeakObjectPtr a = Cast(AssetData.GetAsset()); if (a.Get()) { str = TEXT(" License "); //col.A = 128; } } if (str.Len() == 0) { TWeakObjectPtr a = Cast(AssetData.GetAsset()); if (a.Get()) { str = TEXT(" Meta "); //col.A = 128; } } FText txt = FText::FromString(str); return SNew(SBorder) .HAlign(HAlign_Left) .VAlign(VAlign_Top) //.Padding(FMargin(4)) //.Padding(FMargin(4)) //.BorderImage(new FSlateColorBrush(FColor::White)) .BorderImage(new FSlateColorBrush(col)) //.AutoWidth() [ SNew(STextBlock) .Text(txt) .HighlightText(txt) .HighlightColor(FColor(64,64,64)) //.ShadowOffset(FVector2D(1.0f, 1.0f)) ]; //return FAssetTypeActions_Base::GetThumbnailOverlay(AssetData); */ } UVrmAssetListThumbnailRenderer::UVrmAssetListThumbnailRenderer(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { } void UVrmAssetListThumbnailRenderer::GetThumbnailSize(UObject* Object, float Zoom, uint32& OutWidth, uint32& OutHeight) const { UVrmAssetListObject* a = Cast(Object); if (a) { if (a->VrmLicenseObject) { auto tex = a->SmallThumbnailTexture; if (tex == nullptr) { tex = a->VrmLicenseObject->thumbnail; } if (tex) { //return Super::GetThumbnailSize(tex, Zoom, OutWidth, OutHeight); } } if (a->Vrm1LicenseObject) { auto tex = a->SmallThumbnailTexture; if (tex == nullptr) { tex = a->Vrm1LicenseObject->thumbnail; } if (tex) { //return Super::GetThumbnailSize(tex, Zoom, OutWidth, OutHeight); } } } Super::GetThumbnailSize(Object, Zoom, OutWidth, OutHeight); } #if UE_VERSION_OLDER_THAN(4,25,0) void UVrmAssetListThumbnailRenderer::Draw(UObject* Object, int32 X, int32 Y, uint32 Width, uint32 Height, FRenderTarget* RenderTarget, FCanvas* Canvas) #else void UVrmAssetListThumbnailRenderer::Draw(UObject* Object, int32 X, int32 Y, uint32 Width, uint32 Height, FRenderTarget* RenderTarget, FCanvas* Canvas, bool bAdditionalViewFamily) #endif { UTexture2D *tex = nullptr; USkeletalMesh *sk = nullptr; if (tex == nullptr){ UVrmAssetListObject* a = Cast(Object); if (a) { tex = a->SmallThumbnailTexture; if (tex == nullptr) { if (a->VrmLicenseObject) { tex = a->VrmLicenseObject->thumbnail; } if (a->Vrm1LicenseObject) { tex = a->Vrm1LicenseObject->thumbnail; } } if (a->SkeletalMesh) { sk = a->SkeletalMesh; } } } if (tex == nullptr) { TArray ret; { UVrmMetaObject* a = Cast(Object); if (a) { sk = a->SkeletalMesh; if (a->VrmAssetListObject) { tex = a->VrmAssetListObject->SmallThumbnailTexture; } } } { UVrmLicenseObject* a = Cast(Object); if (a) { UPackage *pk = a->GetOutermost(); GetObjectsWithOuter(pk, ret); // no sk tex = a->thumbnail; } } { UVrm1LicenseObject* a = Cast(Object); if (a) { UPackage* pk = a->GetOutermost(); GetObjectsWithOuter(pk, ret); // no sk tex = a->thumbnail; } } for (auto *obj : ret) { UVrmAssetListObject* t = Cast(obj); if (t == nullptr) { continue; } sk = t->SkeletalMesh; if (t->SmallThumbnailTexture) tex = t->SmallThumbnailTexture; break; } } FString str = "none"; bool bDark = false; if (Object->IsA(UVrmAssetListObject::StaticClass())) { str = TEXT(" AssetList "); } else if (Object->IsA(UVrmMetaObject::StaticClass())) { str = TEXT(" Meta "); bDark = true; } else if (Object->IsA(UVrmLicenseObject::StaticClass())) { str = TEXT(" License "); bDark = true; } else if (Object->IsA(UVrm1LicenseObject::StaticClass())) { str = TEXT(" License "); bDark = true; } auto DrawText = [&str, &Width, &Height, &Canvas, &bDark](){ FText ChannelText = FText::FromString(str); FVector2D Position(Width / 24, Height / 24); //FCanvasTextItem TextItem(Position, ChannelText, GEngine->GetLargeFont(), FLinearColor::Black); FCanvasTextItem TextItem(Position, ChannelText, FSlateFontInfo(UEngine::GetMediumFont(), 28), FLinearColor::Black); TextItem.DisableShadow(); //TextItem.Scale = FVector2D(Width / 64.0f, Height / 64.0f); TextItem.Draw(Canvas); // サイズ取得のため一度描画する if (bDark){ FCanvasTileItem BackgroundItem(FVector2D(0,0), FVector2D(Width, Height), FLinearColor(0, 0, 0, 0.5)); BackgroundItem.BlendMode = SE_BLEND_AlphaBlend; Canvas->DrawItem(BackgroundItem); } { float DPIScale = Canvas->GetDPIScale(); FVector2D TextSize = TextItem.DrawnSize; FVector2D Padding(4.0f, 2.0f); FVector2D BackgroundSize = TextSize + Padding * 2.0f; FVector2D BackgroundPosition = Position - Padding; FCanvasTileItem BackgroundItem(BackgroundPosition, BackgroundSize, FLinearColor(0.258, 0.539, 0.068, 0.9)); //BackgroundItem.BlendMode = SE_BLEND_Opaque; BackgroundItem.BlendMode = SE_BLEND_AlphaBlend; Canvas->DrawItem(BackgroundItem); } TextItem.Draw(Canvas); }; // skeleton thumbnail if (tex == nullptr) { if (IsValid(meshThumbnail) == false) { meshThumbnail = NewObject(this); } if (sk) { if (VRMGetSkeleton(sk)) { #if UE_VERSION_OLDER_THAN(4,25,0) meshThumbnail->Draw((UObject*)(sk), X, Y, Width, Height, RenderTarget, Canvas); #else meshThumbnail->Draw((UObject*)(sk), X, Y, Width, Height, RenderTarget, Canvas, bAdditionalViewFamily); #endif DrawText(); return; } } } auto obj = Object; if (tex) { obj = tex; } #if UE_VERSION_OLDER_THAN(4,25,0) Super::Draw(obj, X, Y, Width, Height, RenderTarget, Canvas); #else Super::Draw(obj, X, Y, Width, Height, RenderTarget, Canvas, bAdditionalViewFamily); #endif DrawText(); } #if UE_VERSION_OLDER_THAN(5,5,0) #else bool UVrmAssetListThumbnailRenderer::CanVisualizeAsset(UObject* Object) { if (UVrmLicenseObject* a = Cast(Object)) { if (a->thumbnail == nullptr) { // return false; } } if (UVrm1LicenseObject* a = Cast(Object)) { if (a->thumbnail == nullptr) { // return false; } } return true; //return UTextureThumbnailRenderer::CanVisualizeAsset(Object); } #endif