// VRM4U Copyright (c) 2021-2024 Haruyoshi Yamamoto. This software is released under the MIT License. #pragma once #include "CoreMinimal.h" #include "UObject/ObjectMacros.h" #include "UObject/Object.h" #include "Factories/ImportSettings.h" #include "VrmConvert.h" #include "Vrm1LicenseObject.h" #include "VrmImportUI.generated.h" DECLARE_DELEGATE(FOnResolveFbxReImport); UCLASS(config=EditorPerProjectUserSettings, AutoExpandCategories=(FTransform), HideCategories=Object, MinimalAPI) class UVrmImportUI : public UObject, public IImportSettingsParser { GENERATED_UCLASS_BODY() public: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "Thumbnail")) UTexture2D *Thumbnail; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "VRM Title / Author")) FString TitleAuthor; /** for Mobile. Import root bone only */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "**UE5** UEFN mode")) bool bUEFN = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "**UE4** RetargetPose A-pose(Off to T-pose)")) bool bAPoseRetarget = true; /** for Mobile. Import root bone only */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "**mobile** Reduce bonemap<=75")) bool bMobileBone = false; /** Materal Type */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Mesh) EVRMImportMaterialType MaterialType; #if UE_VERSION_OLDER_THAN(5,2,0) static const bool VRM4U_UseUE5Mat = false; #else static const bool VRM4U_UseUE5Mat = true; #endif UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "Use UE5 Material")) bool bUseUE5Material = VRM4U_UseUE5Mat; /** Outline Material*/ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "GenerateOutlineMaterial")) bool bGenerateOutlineMaterial = true; /** Force Override */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "Force Override (as New Asset)")) bool bForceOverride = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "Model scale")) float ModelScale = 1.0f; UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "Animation Translate scale")) float AnimationTranslateScale = 1.0f; UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "Animation Play Rate Scale")) float PlayRateScale = 1.0f; /** Remove RootBone Rotation */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "Remove RootBone Rotation")) bool bRemoveRootBoneRotation = true; /** Remove RootBone Position */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "Remove RootBone Position")) bool bRemoveRootBonePosition = false; UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "VRM10 Convert to Restpose from Bindpose")) bool bVrm10UseBindToRestPose = true; /** Remove Local Rotation for VRM10 */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "VRM10 Remove Local Rotation")) bool bVrm10RemoveLocalRotation = false; /** Use Bindpose for VRM10 */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "VRM10 Bindpose")) bool bVrm10Bindpose = false; /** Force Original Bone Name */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "Force original bone name")) bool bForceOriginalBoneName = false; /** Duplicate mesh and renamed humanoid bone */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName= "Generate renamed humanoid mesh")) bool bGenerateHumanoidRenamedMesh = false; /** Add IK Bone */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "Generate IK Bone")) bool bGenerateIKBone = false; /** Add RigIK asset*/ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "Generate RigIK Asset")) bool bGenerateRigIK = true; /** Remove Physics asset */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "No physics asset")) bool bSkipPhysics = false; /** Remove Retargeter asset */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "No Retargeter asset")) bool bSkipRetargeter = false; /** Remove MorphTarget */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "No MorphTarget")) bool bSkipMorphTarget = false; /** Use MorphTarget Normal */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "Eable MorphTarget Normal(TangentZDelta)")) bool bEnableMorphTargetNormal = false; #if UE_VERSION_OLDER_THAN(4,26,0) static const bool VRM4U_UseBC7 = false; #else static const bool VRM4U_UseBC7 = true; #endif /** Force Original MorphTarget Name Mode */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "Force original morphtarget name")) bool bForceOriginalMorphTargetName = false; /** Use Strict MorphTarget Name Mode */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "Remove BlendShapeGroup prefix for old VRM file")) bool bRemoveBlendShapeGroupPrefix = false; /** Use Opaque insted of translucent */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "Force Opaque")) bool bForceOpaque = false; /** Use TwoSided */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "Force TwoSided")) bool bForceTwoSided = false; /** Save as single uasset file */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "Single uasset file")) bool bSingleUAssetFile = false; /** Use GridTexture by Default */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "[Texture] Use DummyGrid by DefaultBaseTexture")) bool bDefaultGridTextureMode = false; /** Use BC7 */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "[Texture] Use BC7 for BaseTexture")) bool bBC7Mode = VRM4U_UseBC7; /** Generate mipmap (be careful of MatCap texture)*/ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "[Texture] Generate Mipmap")) bool bMipmapGenerateMode = false; /** Merge material using same parameter */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "[Optimize] Merge material")) bool bMergeMaterial = true; /** Merge primitives using same material */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "[Optimize] Merge primitive")) bool bMergePrimitive = false; /** Use optimized MaterialInstance */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "[Optimize] use opt material")) bool bOptimizeMaterial = true; /** Remove unused vertex */ //UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "[Optimize] remove unused vertex")) bool bOptimizeVertex = false; /** Remove degenerate triangles */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "[Optimize] remove degenerate triangles")) bool bRemoveDegenerateTriangles = false; /** BoneWeight influence */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "[Optimize] Bone Weight Influence Num")) int BoneWeightInfluenceNum = 8; /** Remove bone has no mesh */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "[Optimize] Remove bone used DCC tool")) bool bSimpleRoot = true; /** Remove bone has no mesh */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "[Optimize] Use ActiveBone List")) bool bActiveBone = true; //UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName="Delete bone without mesh")) bool bSkipNoMeshBone = false; /** for DEBUG. Ignore Validation */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "[Debug] Ignore VRM Validataion")) bool bIgnoreVRMValidation = false; /** for DEBUG. Import root bone only */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "[Debug] One bone only")) bool bDebugOneBone = false; /** for DEBUG. No mesh. Bone only */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "[Debug] No Mesh")) bool bDebugNoMesh = false; /** for DEBUG. No mesh. Bone only */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category = Mesh, meta = (ImportType = "StaticMesh|SkeletalMesh", DisplayName = "[Debug] No Material")) bool bDebugNoMaterial = false; /** Skeleton to use for imported asset. When importing a mesh, leaving this as "None" will create a new skeleton. When importing an animation this MUST be specified to import the asset. */ UPROPERTY(EditAnywhere, BlueprintReadWrite, AdvancedDisplay, Category=Mesh, meta=(ImportType="SkeletalMesh")) class USkeleton* Skeleton; // UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "VRM1_License") TArray LicenseBool; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "VRM1_License") TArray LicenseString; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "VRM1_License") TArray LicenseStringArray; // UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "License_Personation/CharacterizationPermission") FString allowedUserName; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "License_Personation/CharacterizationPermission") FString violentUsageName; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "License_Personation/CharacterizationPermission") FString sexualUsageName; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "License_Personation/CharacterizationPermission") FString commercialUsageName; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "License_Personation/CharacterizationPermission") FString otherPermissionUrl; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "License_Redistribution/ModificationsLicense") FString licenseName; UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "License_Redistribution/ModificationsLicense") FString otherLicenseUrl; private: UPROPERTY() FImportOptionData data; public: const FImportOptionData *GenerateOptionData(); UFUNCTION(BlueprintCallable, Category = Miscellaneous) void ResetToDefault(); //virtual bool CanEditChange(const FProperty* InProperty) const override; /** IImportSettings Interface */ virtual void ParseFromJson(TSharedRef ImportSettingsJson) override; /* Whether this UI is construct for a reimport */ bool bIsReimport; };