From 92abc327c6fe24d8970bb8a94f0cfbd78649f3d2 Mon Sep 17 00:00:00 2001 From: Jason Ma <1312119064@qq.com> Date: Sun, 19 May 2024 13:55:49 +0800 Subject: [PATCH 01/13] Add MooaToon support --- .gitignore | 2 + Content/ImportDataSet/DS_MooaToon.uasset | Bin 0 -> 2191 bytes Content/VrmAssetListObjectBP.uasset | Bin 10613 -> 12201 bytes Content/VrmAssetListObjectBPUE5.uasset | Bin 11604 -> 11634 bytes Source/VRM4U/Private/VrmAssetListObject.cpp | 3 +- Source/VRM4U/Public/VrmAssetListObject.h | 5 +++ Source/VRM4U/Public/VrmUtil.h | 2 +- .../VRM4ULoader/Private/VrmConvertTexture.cpp | 40 ++++++++++++------ 8 files changed, 36 insertions(+), 16 deletions(-) create mode 100644 Content/ImportDataSet/DS_MooaToon.uasset diff --git a/.gitignore b/.gitignore index 4f58714b..2d3ce5e9 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,5 @@ *.exe *.out *.app +Intermediate +Binaries diff --git a/Content/ImportDataSet/DS_MooaToon.uasset b/Content/ImportDataSet/DS_MooaToon.uasset new file mode 100644 index 0000000000000000000000000000000000000000..eb18cffa5c966d28403eed3372065f59c96582c9 GIT binary patch literal 2191 zcma)8Ye-Z<6rR#vnmtTQqcBl0#rC?oW+9pDZrXzH7eT~!T_@Ypz1!WZW98p&YhWazB7+AXU^(!ggnWY?>fgteZg5UxQAv>Yu;7EXt!HS{Tm})iU=BDRZt)>)9Mw$tFCTmJ+PI^jO zZiX@4M~20aFKfV1HSSw0tH=P|m#4PgL0u9_x__uC!e8baRD3&9vI}&ab}C!}FHzCS z*Lt`Dn_WJqsri_Lc(DKB*xC6yuD+;BSvlXXE{0fI6Kdj@vs1i5+MFZ^c~fuEcrN&>^0@_DJNZecyU+C*P%!Ag>hblxwSP z1+Ff+`5bFJcBFK3r+~ef7L);Gt{uKo=smDixUr-Zr((R(c-hBXpD=dfpG< z;fD0k^Jam!T~C6(wvQc*4sWU+fp|;;@X-VDFe3B_#0$}rpdW~*$ymB3WA_op64W-h z!OM!H)DC7yv)aZCrvbAkmO#*tg`5T5_!xu;Twe<|0AtMfie&N2&KGF>MW%lX?fx0q z7!2$^ehSyTLtO+K>h*CT({hWPL<|A%i)LB~DY}6wX(NjRL3%zJFB-ZA*LDeD41Qiexb1~a%||D$yn5PuIH}XiV+Jl+ z{mc07`akV`PwlQ|Hrc?5ngaAshn{j&VUJL8wW!}sBX(kvxpQ#e3U1jY1b^96zs7S%g zOgM(Vn$K2^x zsJPC>k}kLWp(z#%ahzSAmbmDRi*a@6y&j%(m|32zm{QXS-biw+HlDQ_IE&W-qnzig z;K)QJr6G#QNhGW?aG+<+>SHmC)NYkA76s4mH?yz3JzwF7S}&^jThe zC~Hy=(B(58-oM!%(xqRU1IRDnI0pR-t4Lp#A1&y3(cw^cxni_1&;_UyW(>9Nwmk8{vt1Lhk24~y|VepZd}zA59ZLx2Nxe46r7`~?>oLR z8AG3+yQW&Dja{YG?aOf;1#xjekWQiyDiJrL3r00Cj!q{z(Fc?}283*fe zF&36|>MriQha+SuBniV6=*_?$i88f5(g9OuY(a9$@* z%6k2NFM7DyQpGwL()#w2T66_7S0U{H!aA7$;?Wn;@y%v4xP67q&Y}}dHIA7olm#_B z{;_L^PlU3(+iUSTaTKtPsL`6o(5R$+Bmc_kZbP3@R~5V)?9HEB2tG6t*+Yonas) zY4(_&s0g;()yHf;gb^s!Y;oIMe5x-#VI#?zqjL&(;^h|fF=K*nAa3P#DWF2qZOWLwp3Iim}?+ z_q0CTB)|ZOBX#71g8d1;+G&U?;cfQRf--PLv(4eMv&68z>++DiJS2+twxqwg`p!`H zd^{mIxrF#YmcP(<;mA-$a0?L|BNP_K7;_gGIWa>Z@vBz9b@vSvSHwq>>S>!X`g&~$ z9hMsLRBDQ4{0$jUHe=?F`Fpai#|i{|-$0xzT~~2kZBUk`k)Nc^d9wZ3>u-ay8%Op{ zKBK=W6LM?X9R6uU=5?Bqc3V>OaoH9w5p`X`M^t6X>Cdycr7 z^R*8@jrog#tzf)%z6_UtzzZ5l+Z2N@QQlLh4#k~C<`GD#=z7KW*_ zEtn<)FK}bHaMqHJ8y1DcNVK8Bc^P+M(E7rC?#}Lga32?yLS+A~HD(rWkD^Kr;>Na# zMYugG)MC7j-`#Bz4xR{LXii=}>Y9(Lh{6+B-*QRnha7OPt!{q;GpZb`kZ_Y|Zp(Br z#}}T(e5dT*46<#(sw%Z1w1j{qHfs^J1Tb2nWLWNlO^WUuPhbC17g?EuTjprBR+f@Kdxuh!R z4_K2Bf}%8avc;8*?x--O3|7R_^qe=qjuMw0ef!k&@1gsd` z$xt2?FXS|QW0@u0qhnABeZMCyk@ zq($Um`ic_Co>8PlK5{E zu7P(Pcoq%3W5Ba&;C%@^Rs-)S@G3O$z5rgO2Hp|iRcYXT4m?{B-c`^`YT=?xV=qOC z2%ZU2L6xMYD)|{q`Po9k70}@!FeNugH~9WX*L6!WMT1{yeZlPitgwwdyJVsxTxnfn z?hI}>P#ettFADp}ua^q7fh*15-c{JgHqiD;RQVFj{$+)IEQh%=Ua|f7nuL-*OuR<= z9n3zqQz;Kg59x3n)mD5McN6xNwy*ad+lC)9d|!d2H?4qAIdIk#l&qEYZpQsuoV3LUsc`B?X+gP6Jh_p7~RU zNT2tDy$z=XQpUrMp}*lW>G3li;_WI7khtAk`4BQ0payq#Um0qzbei zDA7eKH5r~9(``8Kqd+E7X?QmfP&Iu1A6UuwAs#=r@+MZsUth@xi@V+2gxd+Ct9LCW`as+NQ%s@GLgiz}_Gn zDVz%**EbKr(RQj9-Pml$N_KLf1w6DLy`ox}Zx^&EibTTcSoub#vt&{2X;CCj!ivDN ze0?o}Cl`zgdRa9vs7EKk7-1_aNHSSmJx5CsOn-#<+w z)5$QnOP8Jy$q?=bkl}DeEK_}~knmB!P+Ez3W!!(fU#X!sC_DaWrFbUTB+0?z8SvqD4+xoP3HDe|VUb}973 zpBbV2e|7_GSg5${x7mi+=kc4vbFHmEV$Ov-F3tI9D%%fqDAD4D5KMw;LWf%siVWiZ zGh9&lEMW$SLM;hZV6uRD3JR_AfcOZ`DhUFVM3t)~ERK=_ujrmAv;b{eil`3$nkSLn_w5p}4>F+)Jh)#2;)ko@k=r*u&p5iCIoi z0F_Bd1?dkz5&te$StTA~p{RynHw?iYBBlo41F%mha65o$p}=*@FIY8iKt5c0ARdmRbBEt zfC-_%?*PO(Mp2pl4}b$iObwm`5Pb f#tq(*iEj~UYE^6*frm=-hR0EBaepr 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 diff --git a/Content/VrmAssetListObjectBPUE5.uasset b/Content/VrmAssetListObjectBPUE5.uasset index 50842648f3324075d00f437ea92f6bc9976336da..6a2b97ae2ec71348910bd320b9f3dcf94bdaec69 100644 GIT binary patch literal 11634 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 TepdHY+Vtp;w!|r4(!u{9!!4QY delta 3439 zcma);ZBSHI7{||D(Qph$++|}VJIAAU}?xv3dAIgte~QxtTdYH1I>E*{O@`BJ?DS! z%X99W*^WaUFKjNjg)z2s{Hfl-Xv^_ats8a+-hJ=Go`K#Pj|OnM=dEMY4KJQwb~y4% zbl;8T0gR0dd=OmzBpNdcE-2^n`Hbd|8BNBP(9l(k)$53{N*@u-LrppX%`SZ{^6&Wj z4SO#R?a_LdO`KUX*m#p|YTcl3>;9pG{t0p>A6jNHvoVF$A9zk#iC!qw)>swV)V-~{ ztFODPs=PwyjJ>(x!qaI2FiS6Qzwzu=YP1(Jwz|w16W0XFh@Y`?43xx&m1`UGa^cIdmzF{%K^~EkA3(NC$ppyVQZf#5 zkCYq&xmQZQ2kDlQ??CR8k};6`rQ}6MaiKpv2iuR$J^l7k=*Ny!Mv!>J_J zY4*MX*(QitQzbIDIAx6X0~J~3rpAf67IEC=%&WEF`Z^K)nr1!T<+NvXsI+w0n}tJ_ zrGw(id=Jr9Jjg}5Ovv62v=`fas!+J}HqE&WHnrr4Ps+xoY?V7|RCM8EeZcQac;@%E}vqxeDF2x&1ylq3#2XeJBJPdfV&cl{A`02+oq zhCYElgT8=1hdzbQL+79w=nV8XbQ+q4&O)c4lZk{U@fRA?&=hn5`UkoQ;Q>^>(U-%g ze8JpN9MRmk1KwQf<`sp$6-O|z562@abjy4=Uyb({uFdt-qqpC%NTA6|=z`+rkfmjU&wi;o5BJgFmeP`t*B zaC1#FW>(Le^}5!mT+L5v;g;071!A6A=a@C4m+njl>1&h<$X^aRmWtz~n@2*9SiWFp zophy77fuK1n+DTC`q-g#kg{O;Wk|`xSaMOy4>J?-ew#yTOuYVN2&InavccT>lvAtH zK}t4bJtJi(E@?|ys4kqzr$a08jW31NEer01k`>9Omj#fr7>9Q`M0zJy3&^*J9i>I0 zXV%I4q7C2`knawwH4B!ay)i#qlk;iQP}Wg#bEVATD>gd%uAyc!lsYb6SyuNyT&pg7 diff --git a/Source/VRM4U/Private/VrmAssetListObject.cpp b/Source/VRM4U/Private/VrmAssetListObject.cpp index e3d3fd80..4465979a 100644 --- a/Source/VRM4U/Private/VrmAssetListObject.cpp +++ b/Source/VRM4U/Private/VrmAssetListObject.cpp @@ -19,7 +19,8 @@ UVrmAssetListObject::UVrmAssetListObject(const FObjectInitializer& ObjectInitial void UVrmAssetListObject::CopyMember(UVrmAssetListObject *dst) const { dst->bAssetSave = bAssetSave; dst->bSkipMorphTarget = bSkipMorphTarget; - + + dst->MooaToonSet = MooaToonSet; // Mooa VRM dst->MtoonLitSet = MtoonLitSet; dst->MtoonUnlitSet = MtoonUnlitSet; dst->SSSSet = SSSSet; diff --git a/Source/VRM4U/Public/VrmAssetListObject.h b/Source/VRM4U/Public/VrmAssetListObject.h index 5f6df236..fd13694d 100644 --- a/Source/VRM4U/Public/VrmAssetListObject.h +++ b/Source/VRM4U/Public/VrmAssetListObject.h @@ -38,6 +38,11 @@ class VRM4U_API UVrmAssetListObject : public UObject UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "InOption") bool bSkipMorphTarget=false; + // Mooa VRM + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "InMaterial") + UVrmImportMaterialSet* MooaToonSet; + // Mooa End + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "InMaterial") UVrmImportMaterialSet* MtoonLitSet; diff --git a/Source/VRM4U/Public/VrmUtil.h b/Source/VRM4U/Public/VrmUtil.h index 54a1d90d..8a18afe5 100644 --- a/Source/VRM4U/Public/VrmUtil.h +++ b/Source/VRM4U/Public/VrmUtil.h @@ -293,7 +293,7 @@ FORCEINLINE USkeletalMesh *VRMGetSkinnedAsset(const USkinnedMeshComponent* t) { UENUM(BlueprintType) enum class EVRMImportMaterialType : uint8 { - VRMIMT_Auto UMETA(DisplayName = "Auto(MToon Unlit)"), + VRMIMT_Auto UMETA(DisplayName = "Mooa Toon"), // Mooa VRM VRMIMT_MToon UMETA(DisplayName = "MToon Lit"), VRMIMT_MToonUnlit UMETA(DisplayName = "MToon Unlit"), VRMIMT_SSS UMETA(DisplayName = "Subsurface"), diff --git a/Source/VRM4ULoader/Private/VrmConvertTexture.cpp b/Source/VRM4ULoader/Private/VrmConvertTexture.cpp index 8be93934..a1b2121d 100644 --- a/Source/VRM4ULoader/Private/VrmConvertTexture.cpp +++ b/Source/VRM4ULoader/Private/VrmConvertTexture.cpp @@ -464,6 +464,10 @@ namespace { LocalTextureSet(dm, TEXT("mtoon_tex_MainTex"), vrmAssetList->Textures[n]); LocalTextureSet(dm, TEXT("gltf_tex_diffuse"), vrmAssetList->Textures[n]); LocalTextureSet(dm, TEXT("mtoon_tex_Shade"), vrmAssetList->Textures[n]); + // Mooa VRM + LocalTextureSet(dm, TEXT("Base Color Map"), vrmAssetList->Textures[n]); + LocalTextureSet(dm, TEXT("Shadow Color Map"), vrmAssetList->Textures[n]); + // Mooa End } } @@ -845,7 +849,7 @@ bool VRMConverter::ConvertTextureAndMaterial(UVrmAssetListObject *vrmAssetList) LocalSetOriginalVrmMaterial(true); } - if (Options::Get().GetMaterialType() == EVRMImportMaterialType::VRMIMT_Auto) { + if (Options::Get().GetMaterialType() == EVRMImportMaterialType::VRMIMT_Auto && false) { // Mooa VRM // default unlit MaterialType = EVRMImportMaterialType::VRMIMT_Unlit; @@ -903,6 +907,11 @@ bool VRMConverter::ConvertTextureAndMaterial(UVrmAssetListObject *vrmAssetList) bMToon = false; break; case EVRMImportMaterialType::VRMIMT_Auto: + // Mooa VRM + mset = vrmAssetList->MooaToonSet; + bMToon = false; + break; + // Mooa End default: break; } @@ -1208,27 +1217,30 @@ bool VRMConverter::ConvertTextureAndMaterial(UVrmAssetListObject *vrmAssetList) } } else { // gltf texture - TArray materialParamName; - materialParamName.SetNum(AI_TEXTURE_TYPE_MAX); - materialParamName[aiTextureType::aiTextureType_DIFFUSE] = TEXT("gltf_tex_diffuse"); - materialParamName[aiTextureType::aiTextureType_NORMALS] = TEXT("gltf_tex_normal"); - materialParamName[aiTextureType::aiTextureType_EMISSIVE] = TEXT("gltf_tex_Emission"); - - materialParamName[aiTextureType::aiTextureType_BASE_COLOR] = TEXT("gltf_tex_diffuse"); - materialParamName[aiTextureType::aiTextureType_EMISSION_COLOR] = TEXT("gltf_tex_Emission"); - materialParamName[aiTextureType::aiTextureType_METALNESS] = TEXT("gltf_tex_metalness"); - materialParamName[aiTextureType::aiTextureType_DIFFUSE_ROUGHNESS] = TEXT("gltf_tex_roughness"); + // Mooa VRM + TArray> materialParamNames; + materialParamNames.SetNum(AI_TEXTURE_TYPE_MAX); + materialParamNames[aiTextureType::aiTextureType_DIFFUSE] = { TEXT("gltf_tex_diffuse"), TEXT("Base Color Map"), TEXT("Shadow Color Map"), TEXT("Opacity Map") }; + materialParamNames[aiTextureType::aiTextureType_NORMALS] = { TEXT("gltf_tex_normal"), TEXT("Normal Map") }; + materialParamNames[aiTextureType::aiTextureType_EMISSIVE] = { TEXT("gltf_tex_Emission"), TEXT("Emissive Map") }; + + materialParamNames[aiTextureType::aiTextureType_BASE_COLOR] = { TEXT("gltf_tex_diffuse"), TEXT("Base Color Map"), TEXT("Shadow Color Map"), TEXT("Opacity Map") }; + materialParamNames[aiTextureType::aiTextureType_EMISSION_COLOR] = { TEXT("gltf_tex_Emission"), TEXT("Emissive Map") }; + materialParamNames[aiTextureType::aiTextureType_METALNESS] = { TEXT("gltf_tex_metalness"), TEXT("Specular Mask Map") }; + materialParamNames[aiTextureType::aiTextureType_DIFFUSE_ROUGHNESS] = { TEXT("gltf_tex_roughness"), TEXT("Specular Mask Map") }; for (uint32_t t = 0; t < AI_TEXTURE_TYPE_MAX; ++t) { - if (materialParamName[t] == "") continue; - int index = TextureTypeToIndex[t]; if (index < 0) continue; if (vrmAssetList->Textures.IsValidIndex(index) == false) continue; if (IsValid(vrmAssetList->Textures[index]) == false) continue; - LocalTextureSet(dm, *(materialParamName[t]), vrmAssetList->Textures[index]); + for (auto MaterialParamName : materialParamNames[t]) + { + LocalTextureSet(dm, *(MaterialParamName), vrmAssetList->Textures[index]); + } } + // Mooa End } LocalMaterialFinishParam(dm); From faae8508a348eeb09b5d908a985fca36bbfe796e Mon Sep 17 00:00:00 2001 From: Jason Ma <1312119064@qq.com> Date: Thu, 15 Aug 2024 00:17:27 +0800 Subject: [PATCH 02/13] Fix VRM Material Importer --- Content/ImportDataSet/DS_MooaToon.uasset | Bin 2191 -> 2257 bytes Source/VRM4U/Public/VrmUtil.h | 2 +- .../VRM4ULoader/Private/VrmConvertTexture.cpp | 14 ++++++++++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Content/ImportDataSet/DS_MooaToon.uasset b/Content/ImportDataSet/DS_MooaToon.uasset index eb18cffa5c966d28403eed3372065f59c96582c9..eee0f4f0a7b08dd8c5c3e3dee625b2a6a6b5c2bd 100644 GIT binary patch delta 508 zcmeAdyeKGmuvu%~kN^MwConTGa4|73e3>XH&vGcf!+7JQ%Q{u<|HIa(6#3zan{p7T&N1&Yt*fT)F$K%4&G0*V6> z!@|ktjH?(GCg(B9bA|=^GITjjou>ohi2`}?Aw`LK#W|(Psd*&~ohr7~CLkGEG@1C2 z^8Db;lvIY7%K~p|fK&*8RX{~=mR3qnp2>8q9^`ai&-jr1{JeOORrQ~=8zfN0P%O;2 z^-D(qw>;ch$vH1iiJ+^4T3+GR6$SErKw|RdbIevuoK8Rv2;7=1$Ywo>k%N(QvMZZ1 zS0hA}L55@EN2$p@Y#NNUlNYkdPd>t?%lZQtyyqr=W7{%$CA*OrI3_@<8KGK06wBlf b>=LXH7B7c{5|{-d{s4m-8dGQ*+&Me|({YIZ delta 429 zcmca8*e@t}uvu%~kN^MwConTGa4|73e4HpK&p2zMp#>w)#4H^P9u@`$peVx|Rt5$h zAPwTLVFNONU<;52;UhrYv^B^%RdI^nqPszRpWJispLotg@hea~nggO1Mgnd6KZ~7# z0f-plCz~^_Vw9O|$0Wzb@ad<#r3R2GFBnpkm{*)rnw*+f!qC@qD9HdMIysR^gw?r8 zJzWLF;|VFx56(6kgl8eh-&ko^2ShO;ME`-mX;@yG`1Z#GnxLC8%` zU=o$NZMG&&03j9+GhDuLe%R*c%#KW)jzC!um^Imu&3bYTn+#V2n9sm)n|> materialParamNames; materialParamNames.SetNum(AI_TEXTURE_TYPE_MAX); - materialParamNames[aiTextureType::aiTextureType_DIFFUSE] = { TEXT("gltf_tex_diffuse"), TEXT("Base Color Map"), TEXT("Shadow Color Map"), TEXT("Opacity Map") }; + materialParamNames[aiTextureType::aiTextureType_DIFFUSE] = { TEXT("gltf_tex_diffuse"), TEXT("Base Color Map"), TEXT("Shadow Color Map") }; materialParamNames[aiTextureType::aiTextureType_NORMALS] = { TEXT("gltf_tex_normal"), TEXT("Normal Map") }; + materialParamNames[aiTextureType::aiTextureType_AMBIENT_OCCLUSION] = { TEXT("AO Map") }; materialParamNames[aiTextureType::aiTextureType_EMISSIVE] = { TEXT("gltf_tex_Emission"), TEXT("Emissive Map") }; - materialParamNames[aiTextureType::aiTextureType_BASE_COLOR] = { TEXT("gltf_tex_diffuse"), TEXT("Base Color Map"), TEXT("Shadow Color Map"), TEXT("Opacity Map") }; + materialParamNames[aiTextureType::aiTextureType_BASE_COLOR] = { TEXT("gltf_tex_diffuse"), TEXT("Base Color Map"), TEXT("Shadow Color Map") }; materialParamNames[aiTextureType::aiTextureType_EMISSION_COLOR] = { TEXT("gltf_tex_Emission"), TEXT("Emissive Map") }; - materialParamNames[aiTextureType::aiTextureType_METALNESS] = { TEXT("gltf_tex_metalness"), TEXT("Specular Mask Map") }; - materialParamNames[aiTextureType::aiTextureType_DIFFUSE_ROUGHNESS] = { TEXT("gltf_tex_roughness"), TEXT("Specular Mask Map") }; + materialParamNames[aiTextureType::aiTextureType_METALNESS] = { TEXT("gltf_tex_metalness") }; + materialParamNames[aiTextureType::aiTextureType_DIFFUSE_ROUGHNESS] = { TEXT("gltf_tex_roughness") }; for (uint32_t t = 0; t < AI_TEXTURE_TYPE_MAX; ++t) { int index = TextureTypeToIndex[t]; @@ -1239,6 +1240,11 @@ bool VRMConverter::ConvertTextureAndMaterial(UVrmAssetListObject *vrmAssetList) for (auto MaterialParamName : materialParamNames[t]) { + if (false) {} + else if (t == aiTextureType::aiTextureType_EMISSIVE || t == aiTextureType::aiTextureType_EMISSION_COLOR) + { + LocalScalarParameterSet(dm, TEXT("Emissive Intensity"), 1.f); + } LocalTextureSet(dm, *(MaterialParamName), vrmAssetList->Textures[index]); } } From d90cd42f557047fa785db1422367bc7c524797fa Mon Sep 17 00:00:00 2001 From: Jason Ma <1312119064@qq.com> Date: Sun, 1 Dec 2024 11:21:53 +0800 Subject: [PATCH 03/13] Fix compile errors --- Source/VRM4U/Private/RigUnit_VrmDynamicHierarchy.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Source/VRM4U/Private/RigUnit_VrmDynamicHierarchy.cpp b/Source/VRM4U/Private/RigUnit_VrmDynamicHierarchy.cpp index 9160f616..a33603bb 100644 --- a/Source/VRM4U/Private/RigUnit_VrmDynamicHierarchy.cpp +++ b/Source/VRM4U/Private/RigUnit_VrmDynamicHierarchy.cpp @@ -49,7 +49,9 @@ FRigUnit_VRMInitControllerTransform_Execute() { auto* elem = nullList.FindByPredicate( [&table](FRigNullElement* e) { - if (e->GetNameString().Compare(table.BoneUE4 + "_s") == 0) { + // Mooa VRM + if (e->GetName().Compare(table.BoneUE4 + "_s") == 0) { + // Mooa End return true; } return false; @@ -133,7 +135,9 @@ FRigUnit_VRMGenerateBoneToControlTable_Execute() auto *elem = controllerList.FindByPredicate( [&table](FRigControlElement *e) { - if (e->GetNameString().Compare(table.BoneUE4 + "_c") == 0) { + // Mooa VRM + if (e->GetName().Compare(table.BoneUE4 + "_c") == 0) { + // Mooa End return true; } return false; From c2643f23b28a5ba24b1008fc4115140611fd01c9 Mon Sep 17 00:00:00 2001 From: Jason Ma <1312119064@qq.com> Date: Tue, 3 Dec 2024 20:50:58 +0800 Subject: [PATCH 04/13] Fix UE 5.5 Installed Build errors --- .../VRM4U/Private/AnimNode_VrmConstraint.cpp | 1 + .../VRM4U/Private/AnimNode_VrmSpringBone.cpp | 1 + .../Private/VRM4U_VMCSubsystem.cpp | 1 + .../Private/VRM4UImporterFactory.cpp | 1342 ++++++++--------- 4 files changed, 674 insertions(+), 671 deletions(-) diff --git a/Source/VRM4U/Private/AnimNode_VrmConstraint.cpp b/Source/VRM4U/Private/AnimNode_VrmConstraint.cpp index 1f825c35..d1d1b46e 100644 --- a/Source/VRM4U/Private/AnimNode_VrmConstraint.cpp +++ b/Source/VRM4U/Private/AnimNode_VrmConstraint.cpp @@ -6,6 +6,7 @@ #include "Animation/AnimInstanceProxy.h" #include "Kismet/KismetSystemLibrary.h" #include "DrawDebugHelpers.h" +#include "SceneManagement.h" #include "VrmMetaObject.h" #include "VrmAssetListObject.h" diff --git a/Source/VRM4U/Private/AnimNode_VrmSpringBone.cpp b/Source/VRM4U/Private/AnimNode_VrmSpringBone.cpp index 97b695de..f98c0c04 100644 --- a/Source/VRM4U/Private/AnimNode_VrmSpringBone.cpp +++ b/Source/VRM4U/Private/AnimNode_VrmSpringBone.cpp @@ -35,6 +35,7 @@ SOFTWARE. #include "Kismet/KismetSystemLibrary.h" #include "SceneInterface.h" #include "DrawDebugHelpers.h" +#include "SceneManagement.h" #include "VrmMetaObject.h" #include "VrmAssetListObject.h" diff --git a/Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp b/Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp index 49a20051..0291d31d 100644 --- a/Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp +++ b/Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp @@ -4,6 +4,7 @@ #include "VRM4U_VMCSubsystem.h" #include "VrmVMCObject.h" +#include "Editor.h" #include "Engine/Engine.h" #include "UObject/StrongObjectPtr.h" #include "Misc/ScopeLock.h" diff --git a/Source/VRM4UImporter/Private/VRM4UImporterFactory.cpp b/Source/VRM4UImporter/Private/VRM4UImporterFactory.cpp index 0ce230f7..a6bbcb20 100644 --- a/Source/VRM4UImporter/Private/VRM4UImporterFactory.cpp +++ b/Source/VRM4UImporter/Private/VRM4UImporterFactory.cpp @@ -1,672 +1,672 @@ -// VRM4U Copyright (c) 2021-2024 Haruyoshi Yamamoto. This software is released under the MIT License. - -#include "VRM4UImporterFactory.h" -#include "VRM4UImporterLog.h" - -#include "Misc/EngineVersionComparison.h" - -#include "AssetToolsModule.h" -#if UE_VERSION_OLDER_THAN(4,26,0) -#include "AssetRegistryModule.h" -#else -#include "AssetRegistry/AssetRegistryModule.h" -#endif -#include "PackageTools.h" -#include "Misc/Paths.h" -#include "Engine/SkeletalMesh.h" -#include "EditorFramework/AssetImportData.h" -#include "Components/SkeletalMeshComponent.h" -//#include "Runtime/CoreUObject/Public/UObject/ConstructorHelpers.h" -#include "UObject/ConstructorHelpers.h" -#include "LoaderBPFunctionLibrary.h" -#include "VrmAssetListObject.h" -#include "VrmRuntimeSettings.h" -#include "VrmOptionWindow.h" -#include "Engine/Blueprint.h" -#include "Templates/SharedPointer.h" -#include "Misc/FeedbackContext.h" -#include "FileHelpers.h" -#include "TickableEditorObject.h" - -#include "Interfaces/IMainFrameModule.h" -#include "Widgets/SWindow.h" -#include "Framework/Application/SlateApplication.h" -#include "HAL/PlatformApplicationMisc.h" -#include "VrmOptionWindow.h" -#include "VrmImportUI.h" -#include "VrmConvert.h" -#include "VrmLicenseObject.h" -#include "Vrm1LicenseObject.h" - -#define LOCTEXT_NAMESPACE "VRMImporter" - -// for tick Editor Object -class SWindow2 : public SWindow{ -public: - // bCanTick = false; - SWindow2() : SWindow() { -#if UE_VERSION_OLDER_THAN(4,21,0) - bCanTick = true; -#else - SetCanTick(true); -#endif - } - -public: - virtual void Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) { - SWindow::Tick(AllottedGeometry, InCurrentTime, InDeltaTime); - FTickableEditorObject::TickObjects(InDeltaTime); - //FAssetRegistryModule::TickAssetRegistry(-1.0f); - } - bool OnIsActiveChanged(const FWindowActivateEvent& ActivateEvent) { - bool r = SWindow::OnIsActiveChanged(ActivateEvent); -#if UE_VERSION_OLDER_THAN(4,21,0) - bCanTick = true; -#else - SetCanTick(true); -#endif - return r; - } -}; - -/* -UCLASS(config=EditorPerProjectUserSettings, AutoExpandCategories=(FTransform), HideCategories=Object, MinimalAPI) -class UFbxImportUI : public UObject, public IImportSettingsParser -{ -} - -*/ - - -namespace { - void RenameAsset(UObject* Asset, const FString& NewName, FText& ErrorMessage) - { - FAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked("AssetTools"); - TArray AssetsAndNames; - const FString PackagePath = FPackageName::GetLongPackagePath(Asset->GetOutermost()->GetName()); - new(AssetsAndNames) FAssetRenameData(Asset, PackagePath, NewName); - AssetToolsModule.Get().RenameAssetsWithDialog(AssetsAndNames); - } -} - -UVRM4UImporterFactory::UVRM4UImporterFactory(const FObjectInitializer& ObjectInitializer) - : Super(ObjectInitializer) -{ - - TArray table = { - TEXT("vrm"), - TEXT("vrma"), - TEXT("glb"), - TEXT("bvh"), - }; - - const UVrmRuntimeSettings* Settings = GetDefault(); - for (auto& a : Settings->extList) { - table.AddUnique(a); - } - - if (Settings->bAllowAllAssimpFormat) { - TArray tmp = { - TEXT("pmx"), - TEXT("obj"), - TEXT("fbx"), - TEXT("dae"), - TEXT("gltf"), - }; - for (auto& a : tmp) { - table.AddUnique(a); - } - } - - for (auto &a : table) { - Formats.Add(a + TEXT(";Model VRM4U")); - } - - bCreateNew = false; - bEditorImport = true; - - ImportPriority = FMath::Max(1, Settings->ImportPriority); -} - - -bool UVRM4UImporterFactory::FactoryCanImport(const FString& Filename) -{ - fullFileName.Empty(); - - const FString Extension = FPaths::GetExtension(Filename); - bool allowAll = false; - - const UVrmRuntimeSettings* Settings = GetDefault(); - if (Settings) { - if (Settings->bAllowAllAssimpFormat) { - allowAll = true; - } - - for (auto& a : Settings->extList) { - if (Extension == a) { - allowAll = true; - } - } - } - - - //if( Extension == TEXT("vrm") || Extension == TEXT("gltf") || Extension == TEXT("glb")) - if(allowAll - || Extension == TEXT("vrm") - || Extension == TEXT("vrma") - || Extension == TEXT("glb") - || Extension == TEXT("bvh")) - { - fullFileName = Filename; - return true; - } - - return false; -} - -UClass* UVRM4UImporterFactory::ResolveSupportedClass() -{ - UClass* ImportClass = USkeletalMesh::StaticClass(); - - return ImportClass; -} - -/* -UObject* UVRMImporterFactory::FactoryCreateFile -( - UClass* Class, - UObject* InParent, - FName Name, - EObjectFlags Flags, - const FString& InFilename, - const TCHAR* Parms, - FFeedbackContext* Warn, - bool& bOutOperationCanceled -) -{ - return nullptr; -} -*/ - -UObject* UVRM4UImporterFactory::FactoryCreateBinary(UClass* InClass, UObject* InParent, FName InName, EObjectFlags Flags, UObject* Context, const TCHAR* Type, const uint8*& Buffer, const uint8* BufferEnd, FFeedbackContext* Warn, bool& bOutOperationCanceled) -{ - if (fullFileName.IsEmpty()) { - return nullptr; - } - - static UVrmImportUI* ImportUI = nullptr; -#if UE_VERSION_OLDER_THAN(5,0,0) - TAssetPtr refPointerToLic; -#else - TSoftObjectPtr refPointerToLic; -#endif - { - if (ImportUI == nullptr) { - ImportUI = NewObject(this, NAME_None, RF_NoFlags); - ImportUI->AddToRoot(); - } - - // to default - { - ImportUI->bVrm10RemoveLocalRotation = false; - - ImportUI->ModelScale = 1.0f; - ImportUI->bMergeMaterial = true; - ImportUI->bMergePrimitive = false; - ImportUI->TitleAuthor.Empty(); - ImportUI->Thumbnail = nullptr; - - ImportUI->TitleAuthor.Empty(); - ImportUI->Thumbnail = nullptr; - ImportUI->allowedUserName.Empty(); - ImportUI->violentUsageName.Empty(); - ImportUI->sexualUsageName.Empty(); - ImportUI->commercialUsageName.Empty(); - ImportUI->otherPermissionUrl.Empty(); - ImportUI->licenseName.Empty(); - ImportUI->otherLicenseUrl.Empty(); - - ImportUI->LicenseString.Empty(); - ImportUI->LicenseBool.Empty(); - ImportUI->LicenseStringArray.Empty(); - } - - if (1) { - UVrmLicenseObject* a = nullptr; - UVrm1LicenseObject* b = nullptr; - ULoaderBPFunctionLibrary::GetVRMMeta(fullFileName, a, b); - if (a) { - ImportUI->TitleAuthor = TEXT("\"") + a->title + TEXT("\"") + TEXT(" / ") + TEXT("\"") + a->author + TEXT("\""); - ImportUI->Thumbnail = a->thumbnail; - ImportUI->allowedUserName = a->allowedUserName; - ImportUI->violentUsageName = a->violentUsageName; - ImportUI->sexualUsageName = a->sexualUsageName; - ImportUI->commercialUsageName = a->commercialUsageName; - ImportUI->otherPermissionUrl = a->otherPermissionUrl; - ImportUI->licenseName = a->licenseName; - ImportUI->otherLicenseUrl = a->otherLicenseUrl; - - refPointerToLic = a; - } - if (b) { - { - auto *p = b->LicenseString.FindByPredicate([](const FLicenseStringDataPair &pair) { - if (pair.key == TEXT("name")) return true; - return false; - }); - if (p) { - ImportUI->TitleAuthor = p->value; - } - } - ImportUI->Thumbnail = b->thumbnail; - ImportUI->LicenseString = b->LicenseString; - ImportUI->LicenseBool = b->LicenseBool; - ImportUI->LicenseStringArray = b->LicenseStringArray; - refPointerToLic = b; - } - { - const FString Extension = FPaths::GetExtension(fullFileName); - if (Extension.ToLower() == TEXT("pmx")) { - ImportUI->ModelScale = 0.1f; - ImportUI->bMergeMaterial = false; - ImportUI->bMergePrimitive = false; - ImportUI->bForceTwoSided = true; - } - if (Extension.ToLower() == TEXT("bvh")) { - ImportUI->ModelScale = 0.01f; - } - } -#if UE_VERSION_OLDER_THAN(5,2,0) - { - ImportUI->bSingleUAssetFile = true; - } -#else - // 5.2でも動くが、デフォルトをOFFにする -#endif - - -#if UE_VERSION_OLDER_THAN(5,0,0) -#else - // for thumbnail update - { - auto* s = GEditor->GetEditorSubsystem(); - if (s && ImportUI->Thumbnail) { - s->OpenEditorForAsset(ImportUI->Thumbnail); - s->CloseAllEditorsForAsset(ImportUI->Thumbnail); - } - } -#endif - } - - - TSharedPtr ParentWindow; - - if (FModuleManager::Get().IsModuleLoaded("MainFrame")) - { - IMainFrameModule& MainFrame = FModuleManager::LoadModuleChecked("MainFrame"); - ParentWindow = MainFrame.GetParentWindow(); - } - - // Compute centered window position based on max window size, which include when all categories are expanded - const float FbxImportWindowWidth = 410.0f * 2.f; - const float FbxImportWindowHeight = 750.0f; - FVector2D FbxImportWindowSize = FVector2D(FbxImportWindowWidth, FbxImportWindowHeight); // Max window size it can get based on current slate - - - FSlateRect WorkAreaRect = FSlateApplicationBase::Get().GetPreferredWorkArea(); - FVector2D DisplayTopLeft(WorkAreaRect.Left, WorkAreaRect.Top); - FVector2D DisplaySize(WorkAreaRect.Right - WorkAreaRect.Left, WorkAreaRect.Bottom - WorkAreaRect.Top); - - float ScaleFactor = FPlatformApplicationMisc::GetDPIScaleFactorAtPoint(DisplayTopLeft.X, DisplayTopLeft.Y); - FbxImportWindowSize *= ScaleFactor; - - FVector2D WindowPosition = (DisplayTopLeft + (DisplaySize - FbxImportWindowSize) / 2.0f) / ScaleFactor; - - - TSharedRef Window = SNew(SWindow2) - .Title(NSLOCTEXT("UnrealEd", "VRMImportOpionsTitle", "VRM Import Options")) - .SizingRule(ESizingRule::Autosized) - .AutoCenter(EAutoCenter::None) - .ClientSize(FbxImportWindowSize) - .ScreenPosition(WindowPosition); - - TSharedPtr VrmOptionWindow; - Window->SetContent - ( - SAssignNew(VrmOptionWindow, SVrmOptionWindow) - .ImportUI(ImportUI) - .WidgetWindow(Window) - .FullPath(FText::FromString(fullFileName)) - //.ForcedImportType( bForceImportType ? TOptional( ImportType ) : TOptional() ) - //.IsObjFormat( bIsObjFormat ) - .MaxWindowHeight(FbxImportWindowHeight) - .MaxWindowWidth(FbxImportWindowWidth) - ); - - // @todo: we can make this slow as showing progress bar later - FSlateApplication::Get().AddModalWindow(Window, ParentWindow); - - if (VrmOptionWindow->ShouldImport() == false) { - bOutOperationCanceled = true; - - return nullptr; - } - - } - - //static ConstructorHelpers::FObjectFinder MatClass(TEXT("/Game/test/NewMaterial.NewMaterial")); - //static ConstructorHelpers::FObjectFinder MatClass(TEXT("Blueprint'/VRM4U/VrmObjectListBP.VrmObjectListBP_C'")); - //static ConstructorHelpers::FObjectFinder MatClass(TEXT("Blueprint'/VRM4U/VrmObjectListBP'")); - //static ConstructorHelpers::FObjectFinder MatClass(TEXT("/VRM4U/VrmObjectListBP.VrmObjectListBP")); - //UVrmAssetListObject *m = Cast(MatClass.Object); - - //UObject* objFinder = StaticLoadObject(UVrmAssetListObject::StaticClass(), nullptr, TEXT("/VRM4U/VrmObjectListBP.VrmObjectListBP_C")); - //UObject* objFinder = NewObject(InParent, NAME_None, RF_Transactional); - - auto& importOption = VRMConverter::Options::Get(); - importOption.SetVrmOption(ImportUI->GenerateOptionData()); - - -#if UE_VERSION_OLDER_THAN(5,0,0) - TAssetPtr vrmAssetList; - TArray< TAssetPtr > tt; -#else - TSoftObjectPtr vrmAssetList; - TArray< TSoftObjectPtr > tt; -#endif - tt.Add(InParent); - - //TRefCountPtr m; - //UVrmAssetListObject *m = nullptr; -#if UE_VERSION_OLDER_THAN(5,0,0) - TAssetPtr c; -#else - TSoftObjectPtr c; -#endif - { - const UVrmRuntimeSettings* Settings = GetDefault(); - - { - FSoftObjectPath r = Settings->AssetListObject; //(TEXT("/VRM4U/VrmObjectListBP.VrmObjectListBP")); - UObject *u = r.TryLoad(); - if (u) { - if (Cast(u)) { - c = (UClass*)(Cast(u)->GeneratedClass); - } - } - } - if (c == nullptr || VRMConverter::Options::Get().IsUE5Material()) { - FSoftObjectPath r(TEXT("/VRM4U/VrmAssetListObjectBPUE5.VrmAssetListObjectBPUE5")); - UObject *u = r.TryLoad(); - if (u) { - c = (UClass*)(Cast(u)->GeneratedClass); - } - } - if (c == nullptr){ - FSoftObjectPath r(TEXT("/VRM4U/VrmAssetListObjectBP.VrmAssetListObjectBP")); - UObject* u = r.TryLoad(); - if (u) { - c = (UClass*)(Cast(u)->GeneratedClass); - } - } - - if (c == nullptr) { - c = UVrmAssetListObject::StaticClass(); - } - - { - if (ReimportBase) { - vrmAssetList = ReimportBase; - } - if (vrmAssetList) { - vrmAssetList->MarkPackageDirty(); - }else{ - vrmAssetList = NewObject((UObject*)GetTransientPackage(), c.Get()); - } - } - - } - - //UVrmAssetListObject *m = Cast(u); - //FSoftClassPath r(TEXT("/VRM4U/VrmObjectListBP.VrmObjectListBP")); - //UObject *u = r.TryLoad(); - //auto aaa = NewObject(c); - - UVrmAssetListObject* mret = nullptr; - if (vrmAssetList) { - //auto a = NewObject(MatClass.Object, NAME_None, RF_Transactional); - //MatClass.Object; - //ULoaderBPFunctionLibrary::LoadVRMFile(nullptr, fullFileName); - - GWarn->BeginSlowTask( NSLOCTEXT("UnrealEd", "ImportVRM", "Importing VRM"), true ); - - int ret = true; - - ULoaderBPFunctionLibrary::SetImportMode(true, Cast(InParent)); - { - ret = ULoaderBPFunctionLibrary::LoadVRMFileLocal(vrmAssetList.Get(), mret, fullFileName); - } - - /* - { - const bool bCheckDirty = false; - const bool bPromptToSave = false; - TArray p; - p.Add(Cast(InParent)); - - p[0]->Modify(); - p[0]->PostEditChange(); - p[0]->FullyLoad(); - p[0]->AddToRoot(); - FEditorFileUtils::PromptForCheckoutAndSave(p, bCheckDirty, bPromptToSave); - - p[0]->SetDirtyFlag(false); - //p[0]->AddToRoot(); - - //p[0]->Rename(*(p[0]->GetName() + TEXT("aatest")), nullptr); - - //ContentBrowserUtils::RenameAsset(p[0], NewName, ErrorMessage); - FText ErrorMessage; - //RenameAsset(p[0], *(p[0]->GetName() + TEXT("aatest")), ErrorMessage); - RenameAsset(p[0], (TEXT("vrm_dummy_to_delete")), ErrorMessage); - - p[0]->Rename(nullptr, GetTransientPackage(), 0); - p[0]->RemoveFromRoot(); - - //FEditorFileUtils::PromptForCheckoutAndSave(p, bCheckDirty, bPromptToSave); - } - */ - - ULoaderBPFunctionLibrary::SetImportMode(false, nullptr); - importOption.SetVrmOption(nullptr); - -#if UE_VERSION_OLDER_THAN(4,22,0) -#else - if (GEditor) { - GEditor->GetEditorSubsystem()->BroadcastAssetPostImport(this, mret); - } -#endif - - - GWarn->EndSlowTask(); - - //bool bDeleteSucceeded = ObjectTools::DeleteSingleObject( ExistingObject ); - CollectGarbage( GARBAGE_COLLECTION_KEEPFLAGS ); - - if (ret == false) { - return nullptr; - } - } - //return InParent; - return mret;// ->GetOuter(); -} -UObject* UVRM4UImporterFactory::FactoryCreateText(UClass* InClass, UObject* InParent, FName InName, EObjectFlags Flags, UObject* Context, const TCHAR* Type, const TCHAR*& Buffer, const TCHAR* BufferEnd, FFeedbackContext* Warn) -{ - return nullptr; -} - -bool UVRM4UImporterFactory::CanReimport(UObject* Obj, TArray& OutFilenames) { - - UVrmAssetListObject* assetList= Cast(Obj); - TArray FactoryExtensions; - GetSupportedFileExtensions(FactoryExtensions); - - if (assetList) - { - if (UAssetImportData* AssetImportData = assetList->GetAssetImportData()) - { - AssetImportData->ExtractFilenames(OutFilenames); - return true; - } - else - { - OutFilenames.Add(TEXT("")); - } - return true; - } - return false; -} -void UVRM4UImporterFactory::SetReimportPaths(UObject* Obj, const TArray& NewReimportPaths) { - UVrmAssetListObject* assetList = Cast(Obj); - if (assetList && ensure(NewReimportPaths.Num() == 1)) - { - assetList->AssetImportData->UpdateFilenameOnly(NewReimportPaths[0]); - } -} -EReimportResult::Type UVRM4UImporterFactory::Reimport(UObject* Obj) { - - UVrmAssetListObject* asset = Cast(Obj); - if (asset == nullptr) - { - return EReimportResult::Failed; - } - if (asset->AssetImportData == nullptr) { - return EReimportResult::Failed; - } -#if UE_VERSION_OLDER_THAN(4,22,0) -#else - if (asset->AssetImportData->GetSourceFileCount() <= 0) { - return EReimportResult::Failed; - } -#endif - -#if UE_VERSION_OLDER_THAN(4,26,0) -#else - ReimportBase = asset; - asset->Package = asset->GetPackage(); - asset->ReimportBase = asset; -#endif - - { - FString str = asset->AssetImportData->GetSourceData().SourceFiles[0].RelativeFilename; - fullFileName = UAssetImportData::ResolveImportFilename(str, asset->Package); - } - - const uint8_t *buf_dummy = nullptr; - bool b_dummy = false; - - UObject* n = FactoryCreateBinary(nullptr, asset->Package, "name", (EObjectFlags)0, nullptr, nullptr, buf_dummy, buf_dummy, nullptr, b_dummy); - - ReimportBase = nullptr; - fullFileName = ""; - - if (n == nullptr) { - return EReimportResult::Failed; - } - return EReimportResult::Succeeded; -} -int32 UVRM4UImporterFactory::GetPriority() const { - return ImportPriority; -} - - -////////////////////////////////////////////////////////////////////////// - - - - - - -//// - -UVrmImportUI::UVrmImportUI(const FObjectInitializer& ObjectInitializer) - : Super(ObjectInitializer) -{ - bIsReimport = false; - //bAutomatedImportShouldDetectType = true; - //Make sure we are transactional to allow undo redo - this->SetFlags(RF_Transactional); - - /* - StaticMeshImportData = CreateDefaultSubobject(TEXT("StaticMeshImportData")); - StaticMeshImportData->SetFlags(RF_Transactional); - StaticMeshImportData->LoadOptions(); - - SkeletalMeshImportData = CreateDefaultSubobject(TEXT("SkeletalMeshImportData")); - SkeletalMeshImportData->SetFlags(RF_Transactional); - SkeletalMeshImportData->LoadOptions(); - - AnimSequenceImportData = CreateDefaultSubobject(TEXT("AnimSequenceImportData")); - AnimSequenceImportData->SetFlags(RF_Transactional); - AnimSequenceImportData->LoadOptions(); - - TextureImportData = CreateDefaultSubobject(TEXT("TextureImportData")); - TextureImportData->SetFlags(RF_Transactional); - TextureImportData->LoadOptions(); - */ -} - -void UVrmImportUI::ParseFromJson(TSharedRef ImportSettingsJson) -{ - /* - // Skip instanced object references. - int64 SkipFlags = CPF_InstancedReference; - FJsonObjectConverter::JsonObjectToUStruct(ImportSettingsJson, GetClass(), this, 0, SkipFlags); - - bAutomatedImportShouldDetectType = true; - if(ImportSettingsJson->TryGetField("MeshTypeToImport").IsValid()) - { - // Import type was specified by the user if MeshTypeToImport exists - bAutomatedImportShouldDetectType = false; - } - - const TSharedPtr* StaticMeshImportJson = nullptr; - ImportSettingsJson->TryGetObjectField(TEXT("StaticMeshImportData"), StaticMeshImportJson); - if(StaticMeshImportJson) - { - FJsonObjectConverter::JsonObjectToUStruct(StaticMeshImportJson->ToSharedRef(), StaticMeshImportData->GetClass(), StaticMeshImportData, 0, 0); - } - - const TSharedPtr* SkeletalMeshImportJson = nullptr; - ImportSettingsJson->TryGetObjectField(TEXT("SkeletalMeshImportData"), SkeletalMeshImportJson); - if (SkeletalMeshImportJson) - { - FJsonObjectConverter::JsonObjectToUStruct(SkeletalMeshImportJson->ToSharedRef(), SkeletalMeshImportData->GetClass(), SkeletalMeshImportData, 0, 0); - } - - const TSharedPtr* AnimImportJson = nullptr; - ImportSettingsJson->TryGetObjectField(TEXT("AnimSequenceImportData"), AnimImportJson); - if (AnimImportJson) - { - FJsonObjectConverter::JsonObjectToUStruct(AnimImportJson->ToSharedRef(), AnimSequenceImportData->GetClass(), AnimSequenceImportData, 0, 0); - } - - const TSharedPtr* TextureImportJson = nullptr; - ImportSettingsJson->TryGetObjectField(TEXT("TextureImportData"), TextureImportJson); - if (TextureImportJson) - { - FJsonObjectConverter::JsonObjectToUStruct(TextureImportJson->ToSharedRef(), TextureImportData->GetClass(), TextureImportData, 0, 0); - } - */ -} - -void UVrmImportUI::ResetToDefault() -{ - ReloadConfig(); -} - - - - - +// VRM4U Copyright (c) 2021-2024 Haruyoshi Yamamoto. This software is released under the MIT License. + +#include "VRM4UImporterFactory.h" +#include "VRM4UImporterLog.h" + +#include "Misc/EngineVersionComparison.h" + +#include "AssetToolsModule.h" +#if UE_VERSION_OLDER_THAN(4,26,0) +#include "AssetRegistryModule.h" +#else +#include "AssetRegistry/AssetRegistryModule.h" +#endif +#include "PackageTools.h" +#include "Misc/Paths.h" +#include "Engine/SkeletalMesh.h" +#include "EditorFramework/AssetImportData.h" +#include "Components/SkeletalMeshComponent.h" +//#include "Runtime/CoreUObject/Public/UObject/ConstructorHelpers.h" +#include "UObject/ConstructorHelpers.h" +#include "LoaderBPFunctionLibrary.h" +#include "VrmAssetListObject.h" +#include "VrmRuntimeSettings.h" +#include "VrmOptionWindow.h" +#include "Engine/Blueprint.h" +#include "Templates/SharedPointer.h" +#include "Misc/FeedbackContext.h" +#include "FileHelpers.h" +#include "TickableEditorObject.h" + +#include "Interfaces/IMainFrameModule.h" +#include "Widgets/SWindow.h" +#include "Framework/Application/SlateApplication.h" +#include "HAL/PlatformApplicationMisc.h" +#include "VrmOptionWindow.h" +#include "VrmImportUI.h" +#include "VrmConvert.h" +#include "VrmLicenseObject.h" +#include "Vrm1LicenseObject.h" + +#define LOCTEXT_NAMESPACE "VRMImporter" + +// for tick Editor Object +class SWindow2 : public SWindow{ +public: + // bCanTick = false; + SWindow2() : SWindow() { +#if UE_VERSION_OLDER_THAN(4,21,0) + bCanTick = true; +#else + SetCanTick(true); +#endif + } + +public: + virtual void Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) { + SWindow::Tick(AllottedGeometry, InCurrentTime, InDeltaTime); + FTickableEditorObject::TickObjects(InDeltaTime); + //FAssetRegistryModule::TickAssetRegistry(-1.0f); + } + bool OnIsActiveChanged(const FWindowActivateEvent& ActivateEvent) { + bool r = SWindow::OnIsActiveChanged(ActivateEvent); +#if UE_VERSION_OLDER_THAN(4,21,0) + bCanTick = true; +#else + SetCanTick(true); +#endif + return r; + } +}; + +/* +UCLASS(config=EditorPerProjectUserSettings, AutoExpandCategories=(FTransform), HideCategories=Object, MinimalAPI) +class UFbxImportUI : public UObject, public IImportSettingsParser +{ +} + +*/ + + +namespace { + void RenameAsset(UObject* Asset, const FString& NewName, FText& ErrorMessage) + { + FAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked("AssetTools"); + TArray AssetsAndNames; + const FString PackagePath = FPackageName::GetLongPackagePath(Asset->GetOutermost()->GetName()); + new(AssetsAndNames) FAssetRenameData(Asset, PackagePath, NewName); + AssetToolsModule.Get().RenameAssetsWithDialog(AssetsAndNames); + } +} + +UVRM4UImporterFactory::UVRM4UImporterFactory(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ + + TArray table = { + TEXT("vrm"), + TEXT("vrma"), + TEXT("glb"), + TEXT("bvh"), + }; + + const UVrmRuntimeSettings* Settings = GetDefault(); + for (auto& a : Settings->extList) { + table.AddUnique(a); + } + + if (Settings->bAllowAllAssimpFormat) { + TArray tmp = { + TEXT("pmx"), + TEXT("obj"), + TEXT("fbx"), + TEXT("dae"), + TEXT("gltf"), + }; + for (auto& a : tmp) { + table.AddUnique(a); + } + } + + for (auto &a : table) { + Formats.Add(a + TEXT(";Model VRM4U")); + } + + bCreateNew = false; + bEditorImport = true; + + ImportPriority = FMath::Max(1, Settings->ImportPriority); +} + + +bool UVRM4UImporterFactory::FactoryCanImport(const FString& Filename) +{ + fullFileName.Empty(); + + const FString Extension = FPaths::GetExtension(Filename); + bool allowAll = false; + + const UVrmRuntimeSettings* Settings = GetDefault(); + if (Settings) { + if (Settings->bAllowAllAssimpFormat) { + allowAll = true; + } + + for (auto& a : Settings->extList) { + if (Extension == a) { + allowAll = true; + } + } + } + + + //if( Extension == TEXT("vrm") || Extension == TEXT("gltf") || Extension == TEXT("glb")) + if(allowAll + || Extension == TEXT("vrm") + || Extension == TEXT("vrma") + || Extension == TEXT("glb") + || Extension == TEXT("bvh")) + { + fullFileName = Filename; + return true; + } + + return false; +} + +UClass* UVRM4UImporterFactory::ResolveSupportedClass() +{ + UClass* ImportClass = USkeletalMesh::StaticClass(); + + return ImportClass; +} + +/* +UObject* UVRMImporterFactory::FactoryCreateFile +( + UClass* Class, + UObject* InParent, + FName Name, + EObjectFlags Flags, + const FString& InFilename, + const TCHAR* Parms, + FFeedbackContext* Warn, + bool& bOutOperationCanceled +) +{ + return nullptr; +} +*/ + +UObject* UVRM4UImporterFactory::FactoryCreateBinary(UClass* InClass, UObject* InParent, FName InName, EObjectFlags Flags, UObject* Context, const TCHAR* Type, const uint8*& Buffer, const uint8* BufferEnd, FFeedbackContext* Warn, bool& bOutOperationCanceled) +{ + if (fullFileName.IsEmpty()) { + return nullptr; + } + + static UVrmImportUI* ImportUI = nullptr; +#if UE_VERSION_OLDER_THAN(5,0,0) + TAssetPtr refPointerToLic; +#else + TSoftObjectPtr refPointerToLic; +#endif + { + if (ImportUI == nullptr) { + ImportUI = NewObject(this, NAME_None, RF_NoFlags); + ImportUI->AddToRoot(); + } + + // to default + { + ImportUI->bVrm10RemoveLocalRotation = false; + + ImportUI->ModelScale = 1.0f; + ImportUI->bMergeMaterial = true; + ImportUI->bMergePrimitive = false; + ImportUI->TitleAuthor.Empty(); + ImportUI->Thumbnail = nullptr; + + ImportUI->TitleAuthor.Empty(); + ImportUI->Thumbnail = nullptr; + ImportUI->allowedUserName.Empty(); + ImportUI->violentUsageName.Empty(); + ImportUI->sexualUsageName.Empty(); + ImportUI->commercialUsageName.Empty(); + ImportUI->otherPermissionUrl.Empty(); + ImportUI->licenseName.Empty(); + ImportUI->otherLicenseUrl.Empty(); + + ImportUI->LicenseString.Empty(); + ImportUI->LicenseBool.Empty(); + ImportUI->LicenseStringArray.Empty(); + } + + if (1) { + UVrmLicenseObject* a = nullptr; + UVrm1LicenseObject* b = nullptr; + ULoaderBPFunctionLibrary::GetVRMMeta(fullFileName, a, b); + if (a) { + ImportUI->TitleAuthor = TEXT("\"") + a->title + TEXT("\"") + TEXT(" / ") + TEXT("\"") + a->author + TEXT("\""); + ImportUI->Thumbnail = a->thumbnail; + ImportUI->allowedUserName = a->allowedUserName; + ImportUI->violentUsageName = a->violentUsageName; + ImportUI->sexualUsageName = a->sexualUsageName; + ImportUI->commercialUsageName = a->commercialUsageName; + ImportUI->otherPermissionUrl = a->otherPermissionUrl; + ImportUI->licenseName = a->licenseName; + ImportUI->otherLicenseUrl = a->otherLicenseUrl; + + refPointerToLic = a; + } + if (b) { + { + auto *p = b->LicenseString.FindByPredicate([](const FLicenseStringDataPair &pair) { + if (pair.key == TEXT("name")) return true; + return false; + }); + if (p) { + ImportUI->TitleAuthor = p->value; + } + } + ImportUI->Thumbnail = b->thumbnail; + ImportUI->LicenseString = b->LicenseString; + ImportUI->LicenseBool = b->LicenseBool; + ImportUI->LicenseStringArray = b->LicenseStringArray; + refPointerToLic = b; + } + { + const FString Extension = FPaths::GetExtension(fullFileName); + if (Extension.ToLower() == TEXT("pmx")) { + ImportUI->ModelScale = 0.1f; + ImportUI->bMergeMaterial = false; + ImportUI->bMergePrimitive = false; + ImportUI->bForceTwoSided = true; + } + if (Extension.ToLower() == TEXT("bvh")) { + ImportUI->ModelScale = 0.01f; + } + } +#if UE_VERSION_OLDER_THAN(5,2,0) + { + ImportUI->bSingleUAssetFile = true; + } +#else + // 5.2縺ァ繧ょ虚縺上′縲√ョ繝輔か繝ォ繝医rOFF縺ォ縺吶k +#endif + + +#if UE_VERSION_OLDER_THAN(5,0,0) +#else + // for thumbnail update + { + auto* s = GEditor->GetEditorSubsystem(); + if (s && ImportUI->Thumbnail) { + s->OpenEditorForAsset((UObject*)ImportUI->Thumbnail); + s->CloseAllEditorsForAsset((UObject*)ImportUI->Thumbnail); + } + } +#endif + } + + + TSharedPtr ParentWindow; + + if (FModuleManager::Get().IsModuleLoaded("MainFrame")) + { + IMainFrameModule& MainFrame = FModuleManager::LoadModuleChecked("MainFrame"); + ParentWindow = MainFrame.GetParentWindow(); + } + + // Compute centered window position based on max window size, which include when all categories are expanded + const float FbxImportWindowWidth = 410.0f * 2.f; + const float FbxImportWindowHeight = 750.0f; + FVector2D FbxImportWindowSize = FVector2D(FbxImportWindowWidth, FbxImportWindowHeight); // Max window size it can get based on current slate + + + FSlateRect WorkAreaRect = FSlateApplicationBase::Get().GetPreferredWorkArea(); + FVector2D DisplayTopLeft(WorkAreaRect.Left, WorkAreaRect.Top); + FVector2D DisplaySize(WorkAreaRect.Right - WorkAreaRect.Left, WorkAreaRect.Bottom - WorkAreaRect.Top); + + float ScaleFactor = FPlatformApplicationMisc::GetDPIScaleFactorAtPoint(DisplayTopLeft.X, DisplayTopLeft.Y); + FbxImportWindowSize *= ScaleFactor; + + FVector2D WindowPosition = (DisplayTopLeft + (DisplaySize - FbxImportWindowSize) / 2.0f) / ScaleFactor; + + + TSharedRef Window = SNew(SWindow2) + .Title(NSLOCTEXT("UnrealEd", "VRMImportOpionsTitle", "VRM Import Options")) + .SizingRule(ESizingRule::Autosized) + .AutoCenter(EAutoCenter::None) + .ClientSize(FbxImportWindowSize) + .ScreenPosition(WindowPosition); + + TSharedPtr VrmOptionWindow; + Window->SetContent + ( + SAssignNew(VrmOptionWindow, SVrmOptionWindow) + .ImportUI(ImportUI) + .WidgetWindow(Window) + .FullPath(FText::FromString(fullFileName)) + //.ForcedImportType( bForceImportType ? TOptional( ImportType ) : TOptional() ) + //.IsObjFormat( bIsObjFormat ) + .MaxWindowHeight(FbxImportWindowHeight) + .MaxWindowWidth(FbxImportWindowWidth) + ); + + // @todo: we can make this slow as showing progress bar later + FSlateApplication::Get().AddModalWindow(Window, ParentWindow); + + if (VrmOptionWindow->ShouldImport() == false) { + bOutOperationCanceled = true; + + return nullptr; + } + + } + + //static ConstructorHelpers::FObjectFinder MatClass(TEXT("/Game/test/NewMaterial.NewMaterial")); + //static ConstructorHelpers::FObjectFinder MatClass(TEXT("Blueprint'/VRM4U/VrmObjectListBP.VrmObjectListBP_C'")); + //static ConstructorHelpers::FObjectFinder MatClass(TEXT("Blueprint'/VRM4U/VrmObjectListBP'")); + //static ConstructorHelpers::FObjectFinder MatClass(TEXT("/VRM4U/VrmObjectListBP.VrmObjectListBP")); + //UVrmAssetListObject *m = Cast(MatClass.Object); + + //UObject* objFinder = StaticLoadObject(UVrmAssetListObject::StaticClass(), nullptr, TEXT("/VRM4U/VrmObjectListBP.VrmObjectListBP_C")); + //UObject* objFinder = NewObject(InParent, NAME_None, RF_Transactional); + + auto& importOption = VRMConverter::Options::Get(); + importOption.SetVrmOption(ImportUI->GenerateOptionData()); + + +#if UE_VERSION_OLDER_THAN(5,0,0) + TAssetPtr vrmAssetList; + TArray< TAssetPtr > tt; +#else + TSoftObjectPtr vrmAssetList; + TArray< TSoftObjectPtr > tt; +#endif + tt.Add(InParent); + + //TRefCountPtr m; + //UVrmAssetListObject *m = nullptr; +#if UE_VERSION_OLDER_THAN(5,0,0) + TAssetPtr c; +#else + TSoftObjectPtr c; +#endif + { + const UVrmRuntimeSettings* Settings = GetDefault(); + + { + FSoftObjectPath r = Settings->AssetListObject; //(TEXT("/VRM4U/VrmObjectListBP.VrmObjectListBP")); + UObject *u = r.TryLoad(); + if (u) { + if (Cast(u)) { + c = (UClass*)(Cast(u)->GeneratedClass); + } + } + } + if (c == nullptr || VRMConverter::Options::Get().IsUE5Material()) { + FSoftObjectPath r(TEXT("/VRM4U/VrmAssetListObjectBPUE5.VrmAssetListObjectBPUE5")); + UObject *u = r.TryLoad(); + if (u) { + c = (UClass*)(Cast(u)->GeneratedClass); + } + } + if (c == nullptr){ + FSoftObjectPath r(TEXT("/VRM4U/VrmAssetListObjectBP.VrmAssetListObjectBP")); + UObject* u = r.TryLoad(); + if (u) { + c = (UClass*)(Cast(u)->GeneratedClass); + } + } + + if (c == nullptr) { + c = UVrmAssetListObject::StaticClass(); + } + + { + if (ReimportBase) { + vrmAssetList = ReimportBase; + } + if (vrmAssetList) { + vrmAssetList->MarkPackageDirty(); + }else{ + vrmAssetList = NewObject((UObject*)GetTransientPackage(), c.Get()); + } + } + + } + + //UVrmAssetListObject *m = Cast(u); + //FSoftClassPath r(TEXT("/VRM4U/VrmObjectListBP.VrmObjectListBP")); + //UObject *u = r.TryLoad(); + //auto aaa = NewObject(c); + + UVrmAssetListObject* mret = nullptr; + if (vrmAssetList) { + //auto a = NewObject(MatClass.Object, NAME_None, RF_Transactional); + //MatClass.Object; + //ULoaderBPFunctionLibrary::LoadVRMFile(nullptr, fullFileName); + + GWarn->BeginSlowTask( NSLOCTEXT("UnrealEd", "ImportVRM", "Importing VRM"), true ); + + int ret = true; + + ULoaderBPFunctionLibrary::SetImportMode(true, Cast(InParent)); + { + ret = ULoaderBPFunctionLibrary::LoadVRMFileLocal(vrmAssetList.Get(), mret, fullFileName); + } + + /* + { + const bool bCheckDirty = false; + const bool bPromptToSave = false; + TArray p; + p.Add(Cast(InParent)); + + p[0]->Modify(); + p[0]->PostEditChange(); + p[0]->FullyLoad(); + p[0]->AddToRoot(); + FEditorFileUtils::PromptForCheckoutAndSave(p, bCheckDirty, bPromptToSave); + + p[0]->SetDirtyFlag(false); + //p[0]->AddToRoot(); + + //p[0]->Rename(*(p[0]->GetName() + TEXT("aatest")), nullptr); + + //ContentBrowserUtils::RenameAsset(p[0], NewName, ErrorMessage); + FText ErrorMessage; + //RenameAsset(p[0], *(p[0]->GetName() + TEXT("aatest")), ErrorMessage); + RenameAsset(p[0], (TEXT("vrm_dummy_to_delete")), ErrorMessage); + + p[0]->Rename(nullptr, GetTransientPackage(), 0); + p[0]->RemoveFromRoot(); + + //FEditorFileUtils::PromptForCheckoutAndSave(p, bCheckDirty, bPromptToSave); + } + */ + + ULoaderBPFunctionLibrary::SetImportMode(false, nullptr); + importOption.SetVrmOption(nullptr); + +#if UE_VERSION_OLDER_THAN(4,22,0) +#else + if (GEditor) { + GEditor->GetEditorSubsystem()->BroadcastAssetPostImport(this, mret); + } +#endif + + + GWarn->EndSlowTask(); + + //bool bDeleteSucceeded = ObjectTools::DeleteSingleObject( ExistingObject ); + CollectGarbage( GARBAGE_COLLECTION_KEEPFLAGS ); + + if (ret == false) { + return nullptr; + } + } + //return InParent; + return mret;// ->GetOuter(); +} +UObject* UVRM4UImporterFactory::FactoryCreateText(UClass* InClass, UObject* InParent, FName InName, EObjectFlags Flags, UObject* Context, const TCHAR* Type, const TCHAR*& Buffer, const TCHAR* BufferEnd, FFeedbackContext* Warn) +{ + return nullptr; +} + +bool UVRM4UImporterFactory::CanReimport(UObject* Obj, TArray& OutFilenames) { + + UVrmAssetListObject* assetList= Cast(Obj); + TArray FactoryExtensions; + GetSupportedFileExtensions(FactoryExtensions); + + if (assetList) + { + if (UAssetImportData* AssetImportData = assetList->GetAssetImportData()) + { + AssetImportData->ExtractFilenames(OutFilenames); + return true; + } + else + { + OutFilenames.Add(TEXT("")); + } + return true; + } + return false; +} +void UVRM4UImporterFactory::SetReimportPaths(UObject* Obj, const TArray& NewReimportPaths) { + UVrmAssetListObject* assetList = Cast(Obj); + if (assetList && ensure(NewReimportPaths.Num() == 1)) + { + assetList->AssetImportData->UpdateFilenameOnly(NewReimportPaths[0]); + } +} +EReimportResult::Type UVRM4UImporterFactory::Reimport(UObject* Obj) { + + UVrmAssetListObject* asset = Cast(Obj); + if (asset == nullptr) + { + return EReimportResult::Failed; + } + if (asset->AssetImportData == nullptr) { + return EReimportResult::Failed; + } +#if UE_VERSION_OLDER_THAN(4,22,0) +#else + if (asset->AssetImportData->GetSourceFileCount() <= 0) { + return EReimportResult::Failed; + } +#endif + +#if UE_VERSION_OLDER_THAN(4,26,0) +#else + ReimportBase = asset; + asset->Package = asset->GetPackage(); + asset->ReimportBase = asset; +#endif + + { + FString str = asset->AssetImportData->GetSourceData().SourceFiles[0].RelativeFilename; + fullFileName = UAssetImportData::ResolveImportFilename(str, asset->Package); + } + + const uint8_t *buf_dummy = nullptr; + bool b_dummy = false; + + UObject* n = FactoryCreateBinary(nullptr, asset->Package, "name", (EObjectFlags)0, nullptr, nullptr, buf_dummy, buf_dummy, nullptr, b_dummy); + + ReimportBase = nullptr; + fullFileName = ""; + + if (n == nullptr) { + return EReimportResult::Failed; + } + return EReimportResult::Succeeded; +} +int32 UVRM4UImporterFactory::GetPriority() const { + return ImportPriority; +} + + +////////////////////////////////////////////////////////////////////////// + + + + + + +//// + +UVrmImportUI::UVrmImportUI(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ + bIsReimport = false; + //bAutomatedImportShouldDetectType = true; + //Make sure we are transactional to allow undo redo + this->SetFlags(RF_Transactional); + + /* + StaticMeshImportData = CreateDefaultSubobject(TEXT("StaticMeshImportData")); + StaticMeshImportData->SetFlags(RF_Transactional); + StaticMeshImportData->LoadOptions(); + + SkeletalMeshImportData = CreateDefaultSubobject(TEXT("SkeletalMeshImportData")); + SkeletalMeshImportData->SetFlags(RF_Transactional); + SkeletalMeshImportData->LoadOptions(); + + AnimSequenceImportData = CreateDefaultSubobject(TEXT("AnimSequenceImportData")); + AnimSequenceImportData->SetFlags(RF_Transactional); + AnimSequenceImportData->LoadOptions(); + + TextureImportData = CreateDefaultSubobject(TEXT("TextureImportData")); + TextureImportData->SetFlags(RF_Transactional); + TextureImportData->LoadOptions(); + */ +} + +void UVrmImportUI::ParseFromJson(TSharedRef ImportSettingsJson) +{ + /* + // Skip instanced object references. + int64 SkipFlags = CPF_InstancedReference; + FJsonObjectConverter::JsonObjectToUStruct(ImportSettingsJson, GetClass(), this, 0, SkipFlags); + + bAutomatedImportShouldDetectType = true; + if(ImportSettingsJson->TryGetField("MeshTypeToImport").IsValid()) + { + // Import type was specified by the user if MeshTypeToImport exists + bAutomatedImportShouldDetectType = false; + } + + const TSharedPtr* StaticMeshImportJson = nullptr; + ImportSettingsJson->TryGetObjectField(TEXT("StaticMeshImportData"), StaticMeshImportJson); + if(StaticMeshImportJson) + { + FJsonObjectConverter::JsonObjectToUStruct(StaticMeshImportJson->ToSharedRef(), StaticMeshImportData->GetClass(), StaticMeshImportData, 0, 0); + } + + const TSharedPtr* SkeletalMeshImportJson = nullptr; + ImportSettingsJson->TryGetObjectField(TEXT("SkeletalMeshImportData"), SkeletalMeshImportJson); + if (SkeletalMeshImportJson) + { + FJsonObjectConverter::JsonObjectToUStruct(SkeletalMeshImportJson->ToSharedRef(), SkeletalMeshImportData->GetClass(), SkeletalMeshImportData, 0, 0); + } + + const TSharedPtr* AnimImportJson = nullptr; + ImportSettingsJson->TryGetObjectField(TEXT("AnimSequenceImportData"), AnimImportJson); + if (AnimImportJson) + { + FJsonObjectConverter::JsonObjectToUStruct(AnimImportJson->ToSharedRef(), AnimSequenceImportData->GetClass(), AnimSequenceImportData, 0, 0); + } + + const TSharedPtr* TextureImportJson = nullptr; + ImportSettingsJson->TryGetObjectField(TEXT("TextureImportData"), TextureImportJson); + if (TextureImportJson) + { + FJsonObjectConverter::JsonObjectToUStruct(TextureImportJson->ToSharedRef(), TextureImportData->GetClass(), TextureImportData, 0, 0); + } + */ +} + +void UVrmImportUI::ResetToDefault() +{ + ReloadConfig(); +} + + + + + #undef LOCTEXT_NAMESPACE \ No newline at end of file From dae1b736941bbaa4af537a8c2a1eb2336bf934c7 Mon Sep 17 00:00:00 2001 From: Jason Ma <1312119064@qq.com> Date: Wed, 11 Dec 2024 00:31:26 +0800 Subject: [PATCH 05/13] Fix compile error --- Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp b/Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp index 0291d31d..49a20051 100644 --- a/Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp +++ b/Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp @@ -4,7 +4,6 @@ #include "VRM4U_VMCSubsystem.h" #include "VrmVMCObject.h" -#include "Editor.h" #include "Engine/Engine.h" #include "UObject/StrongObjectPtr.h" #include "Misc/ScopeLock.h" From 1eba766c8947efc1f309761180d02a04eda71b5b Mon Sep 17 00:00:00 2001 From: Jason Ma Date: Wed, 18 Dec 2024 23:43:50 +0800 Subject: [PATCH 06/13] Fix installed build error --- Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp b/Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp index 49a20051..62efd206 100644 --- a/Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp +++ b/Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp @@ -10,6 +10,10 @@ #include "OSCManager.h" #include "OSCServer.h" +#if WITH_EDITOR + #include "Editor.h" +#endif + bool UVRM4U_VMCSubsystem::CopyVMCData(FVMCData &data, FString ServerAddress, int port) { for (int i = 0; i < VMCObjectList.Num(); ++i) { auto a = VMCObjectList[i].Get(); From d1ce2312b267cd08b8edc0adf4f5067047c5a838 Mon Sep 17 00:00:00 2001 From: Jason Ma Date: Thu, 19 Dec 2024 00:01:46 +0800 Subject: [PATCH 07/13] Fix installed build error --- Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp b/Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp index 49a20051..62efd206 100644 --- a/Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp +++ b/Source/VRM4UCapture/Private/VRM4U_VMCSubsystem.cpp @@ -10,6 +10,10 @@ #include "OSCManager.h" #include "OSCServer.h" +#if WITH_EDITOR + #include "Editor.h" +#endif + bool UVRM4U_VMCSubsystem::CopyVMCData(FVMCData &data, FString ServerAddress, int port) { for (int i = 0; i < VMCObjectList.Num(); ++i) { auto a = VMCObjectList[i].Get(); From 60450960a33b3011922e6ce2638b30e959637b29 Mon Sep 17 00:00:00 2001 From: Jason Ma Date: Sat, 7 Jun 2025 01:07:40 +0800 Subject: [PATCH 08/13] Fix 5.6 Installed Build Errors --- Source/VRM4U/Private/VrmBPFunctionLibrary.cpp | 4 ++++ Source/VRM4ULoader/Private/VrmConvertTexture.cpp | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Source/VRM4U/Private/VrmBPFunctionLibrary.cpp b/Source/VRM4U/Private/VrmBPFunctionLibrary.cpp index 479c4257..fdab2b43 100644 --- a/Source/VRM4U/Private/VrmBPFunctionLibrary.cpp +++ b/Source/VRM4U/Private/VrmBPFunctionLibrary.cpp @@ -37,6 +37,10 @@ #include "Kismet/KismetRenderingLibrary.h" #endif +#if UE_VERSION_NEWER_THAN_OR_EQUAL(5,6,0) +#include "MaterialShared.h" +#endif + #if UE_VERSION_OLDER_THAN(5,1,0) #else #if WITH_EDITOR diff --git a/Source/VRM4ULoader/Private/VrmConvertTexture.cpp b/Source/VRM4ULoader/Private/VrmConvertTexture.cpp index 15412ffa..c1d2ea05 100644 --- a/Source/VRM4ULoader/Private/VrmConvertTexture.cpp +++ b/Source/VRM4ULoader/Private/VrmConvertTexture.cpp @@ -22,6 +22,10 @@ #include "Misc/FileHelper.h" #include "Misc/Paths.h" +#if UE_VERSION_NEWER_THAN_OR_EQUAL(5,6,0) +#include "MaterialShared.h" +#endif + #if WITH_EDITOR #include "Factories.h" #include "Factories/TextureFactory.h" @@ -767,7 +771,7 @@ bool VRMConverter::ConvertTextureAndMaterial(UVrmAssetListObject *vrmAssetList) #endif if (NormalBoolTable[i]) { - // UE5.5でクラッシュするので update後に再度更新 + // UE5.5ソスナクソスソスソスbソスVソスソスソスソスソスソスフゑソス updateソスソスノ再度ソスXソスV NewTexture2D->CompressionSettings = TC_Normalmap; NewTexture2D->UpdateResource(); #if WITH_EDITOR From 3a954c496699cd21c763628a4413f58905546d96 Mon Sep 17 00:00:00 2001 From: Jason Ma Date: Sat, 7 Jun 2025 01:07:40 +0800 Subject: [PATCH 09/13] Fix 5.6 Installed Build Errors --- Source/VRM4U/Private/VrmBPFunctionLibrary.cpp | 4 ++++ Source/VRM4ULoader/Private/VrmConvertTexture.cpp | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Source/VRM4U/Private/VrmBPFunctionLibrary.cpp b/Source/VRM4U/Private/VrmBPFunctionLibrary.cpp index 479c4257..fdab2b43 100644 --- a/Source/VRM4U/Private/VrmBPFunctionLibrary.cpp +++ b/Source/VRM4U/Private/VrmBPFunctionLibrary.cpp @@ -37,6 +37,10 @@ #include "Kismet/KismetRenderingLibrary.h" #endif +#if UE_VERSION_NEWER_THAN_OR_EQUAL(5,6,0) +#include "MaterialShared.h" +#endif + #if UE_VERSION_OLDER_THAN(5,1,0) #else #if WITH_EDITOR diff --git a/Source/VRM4ULoader/Private/VrmConvertTexture.cpp b/Source/VRM4ULoader/Private/VrmConvertTexture.cpp index 1a165157..7ff2daaa 100644 --- a/Source/VRM4ULoader/Private/VrmConvertTexture.cpp +++ b/Source/VRM4ULoader/Private/VrmConvertTexture.cpp @@ -22,6 +22,10 @@ #include "Misc/FileHelper.h" #include "Misc/Paths.h" +#if UE_VERSION_NEWER_THAN_OR_EQUAL(5,6,0) +#include "MaterialShared.h" +#endif + #if WITH_EDITOR #include "Factories.h" #include "Factories/TextureFactory.h" @@ -763,7 +767,7 @@ bool VRMConverter::ConvertTextureAndMaterial(UVrmAssetListObject *vrmAssetList) #endif if (NormalBoolTable[i]) { - // UE5.5でクラッシュするので update後に再度更新 + // UE5.5ソスナクソスソスソスbソスVソスソスソスソスソスソスフゑソス updateソスソスノ再度ソスXソスV NewTexture2D->CompressionSettings = TC_Normalmap; NewTexture2D->UpdateResource(); #if WITH_EDITOR From 997561b5a3f42bd885925abbb67755d217bcc8c2 Mon Sep 17 00:00:00 2001 From: Jason Ma Date: Sat, 7 Jun 2025 01:16:59 +0800 Subject: [PATCH 10/13] Fix Text Encoding --- Source/VRM4ULoader/Private/VrmConvertTexture.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/VRM4ULoader/Private/VrmConvertTexture.cpp b/Source/VRM4ULoader/Private/VrmConvertTexture.cpp index c1d2ea05..f31c086d 100644 --- a/Source/VRM4ULoader/Private/VrmConvertTexture.cpp +++ b/Source/VRM4ULoader/Private/VrmConvertTexture.cpp @@ -771,7 +771,7 @@ bool VRMConverter::ConvertTextureAndMaterial(UVrmAssetListObject *vrmAssetList) #endif if (NormalBoolTable[i]) { - // UE5.5ソスナクソスソスソスbソスVソスソスソスソスソスソスフゑソス updateソスソスノ再度ソスXソスV + // UE5.5縺ァ繧ッ繝ゥ繝繧キ繝・縺吶k縺ョ縺ァ update蠕後↓蜀榊コヲ譖エ譁ー NewTexture2D->CompressionSettings = TC_Normalmap; NewTexture2D->UpdateResource(); #if WITH_EDITOR From 5ecd378fc4e1403bca7b607cf32fa4c5af06a2f1 Mon Sep 17 00:00:00 2001 From: Jason Ma Date: Sat, 7 Jun 2025 01:16:59 +0800 Subject: [PATCH 11/13] Fix Text Encoding --- Source/VRM4ULoader/Private/VrmConvertTexture.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/VRM4ULoader/Private/VrmConvertTexture.cpp b/Source/VRM4ULoader/Private/VrmConvertTexture.cpp index 7ff2daaa..aafcfbab 100644 --- a/Source/VRM4ULoader/Private/VrmConvertTexture.cpp +++ b/Source/VRM4ULoader/Private/VrmConvertTexture.cpp @@ -767,7 +767,7 @@ bool VRMConverter::ConvertTextureAndMaterial(UVrmAssetListObject *vrmAssetList) #endif if (NormalBoolTable[i]) { - // UE5.5ソスナクソスソスソスbソスVソスソスソスソスソスソスフゑソス updateソスソスノ再度ソスXソスV + // UE5.5縺ァ繧ッ繝ゥ繝繧キ繝・縺吶k縺ョ縺ァ update蠕後↓蜀榊コヲ譖エ譁ー NewTexture2D->CompressionSettings = TC_Normalmap; NewTexture2D->UpdateResource(); #if WITH_EDITOR From 07d642c7e5605878f4f282dbad418fe3ef43270d Mon Sep 17 00:00:00 2001 From: Jason Ma Date: Tue, 15 Jul 2025 00:35:19 +0800 Subject: [PATCH 12/13] Fix UE 5.4 Installed Build Errors --- Source/VRM4U/Private/VrmBPFunctionLibrary.cpp | 2 +- Source/VRM4ULoader/Private/VrmConvertTexture.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/VRM4U/Private/VrmBPFunctionLibrary.cpp b/Source/VRM4U/Private/VrmBPFunctionLibrary.cpp index 327f390a..ac9e6b03 100644 --- a/Source/VRM4U/Private/VrmBPFunctionLibrary.cpp +++ b/Source/VRM4U/Private/VrmBPFunctionLibrary.cpp @@ -37,7 +37,7 @@ #include "Kismet/KismetRenderingLibrary.h" #endif -#if UE_VERSION_NEWER_THAN_OR_EQUAL(5,6,0) +#if UE_VERSION_NEWER_THAN(5,6,-1) #include "MaterialShared.h" #endif diff --git a/Source/VRM4ULoader/Private/VrmConvertTexture.cpp b/Source/VRM4ULoader/Private/VrmConvertTexture.cpp index f31c086d..25db38c0 100644 --- a/Source/VRM4ULoader/Private/VrmConvertTexture.cpp +++ b/Source/VRM4ULoader/Private/VrmConvertTexture.cpp @@ -22,7 +22,7 @@ #include "Misc/FileHelper.h" #include "Misc/Paths.h" -#if UE_VERSION_NEWER_THAN_OR_EQUAL(5,6,0) +#if UE_VERSION_NEWER_THAN(5,6,-1) #include "MaterialShared.h" #endif From 38b695c20c2a4d812eb341785624f372101ab557 Mon Sep 17 00:00:00 2001 From: Jason Ma Date: Tue, 15 Jul 2025 00:35:19 +0800 Subject: [PATCH 13/13] Fix UE 5.4 Installed Build Errors --- Source/VRM4U/Private/VrmBPFunctionLibrary.cpp | 2 +- Source/VRM4ULoader/Private/VrmConvertTexture.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/VRM4U/Private/VrmBPFunctionLibrary.cpp b/Source/VRM4U/Private/VrmBPFunctionLibrary.cpp index 327f390a..ac9e6b03 100644 --- a/Source/VRM4U/Private/VrmBPFunctionLibrary.cpp +++ b/Source/VRM4U/Private/VrmBPFunctionLibrary.cpp @@ -37,7 +37,7 @@ #include "Kismet/KismetRenderingLibrary.h" #endif -#if UE_VERSION_NEWER_THAN_OR_EQUAL(5,6,0) +#if UE_VERSION_NEWER_THAN(5,6,-1) #include "MaterialShared.h" #endif diff --git a/Source/VRM4ULoader/Private/VrmConvertTexture.cpp b/Source/VRM4ULoader/Private/VrmConvertTexture.cpp index aafcfbab..fe744120 100644 --- a/Source/VRM4ULoader/Private/VrmConvertTexture.cpp +++ b/Source/VRM4ULoader/Private/VrmConvertTexture.cpp @@ -22,7 +22,7 @@ #include "Misc/FileHelper.h" #include "Misc/Paths.h" -#if UE_VERSION_NEWER_THAN_OR_EQUAL(5,6,0) +#if UE_VERSION_NEWER_THAN(5,6,-1) #include "MaterialShared.h" #endif