Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
David-Vodhanel committed Nov 13, 2024
2 parents 2e5f9fb + 8962c9d commit 4a356d7
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -443,6 +443,8 @@ UObject* FDazToUnrealModule::ImportFromDaz(TSharedPtr<FJsonObject> JsonObject, c
{
FScopedSlowTask Progress(10.0f, LOCTEXT("CreatingAutoJCMControlRig", "Importing from Daz"));
Progress.MakeDialog();
const UDazToUnrealSettings* CachedSettings = GetDefault<UDazToUnrealSettings>();

TMap<FString, TArray<FDUFTextureProperty>> MaterialProperties;

FString FBXPath = JsonObject->GetStringField(TEXT("FBX File"));
Expand Down Expand Up @@ -470,6 +472,24 @@ UObject* FDazToUnrealModule::ImportFromDaz(TSharedPtr<FJsonObject> JsonObject, c
UseExperimentalAnimationTransfer = JsonObject->GetBoolField(TEXT("Use Experimental Animation Transfer"));
}

DazMaterialCombineType MaterialCombineMethod = CachedSettings->CombineIdenticalMaterials ? DazMaterialCombineType::CombineIdentical : DazMaterialCombineType::NoCombine;
if (JsonObject->HasField(TEXT("MaterialCombineMethod")))
{
FString MaterialCombineName = JsonObject->GetStringField(TEXT("MaterialCombineMethod"));
if (MaterialCombineName.Compare(TEXT("No Combine"), ESearchCase::IgnoreCase) == 0)
{
MaterialCombineMethod = DazMaterialCombineType::NoCombine;
}
if (MaterialCombineName.Compare(TEXT("Combine Identical"), ESearchCase::IgnoreCase) == 0)
{
MaterialCombineMethod = DazMaterialCombineType::CombineIdentical;
}
if (MaterialCombineName.Compare(TEXT("Combine All"), ESearchCase::IgnoreCase) == 0)
{
MaterialCombineMethod = DazMaterialCombineType::CombineAll;
}
}

// Build AssetIDLookup
FString AssetID = JsonObject->GetStringField(TEXT("Asset ID"));
if (!AssetIDLookup.Contains(AssetID))
Expand All @@ -491,8 +511,6 @@ UObject* FDazToUnrealModule::ImportFromDaz(TSharedPtr<FJsonObject> JsonObject, c
FString BaseFBXFile = BaseFBXPath;
FString HDFBXFile = HDFBXPath;

const UDazToUnrealSettings* CachedSettings = GetDefault<UDazToUnrealSettings>();

FString DAZImportFolder = CachedSettings->ImportDirectory.Path;
FString DAZAnimationImportFolder = CachedSettings->AnimationImportDirectory.Path;
FString DazMLDeformerImportFolder = CachedSettings->DeformerImportDirectory.Path;
Expand Down Expand Up @@ -550,6 +568,11 @@ UObject* FDazToUnrealModule::ImportFromDaz(TSharedPtr<FJsonObject> JsonObject, c
ImportData.AssetType = AssetType;
ImportData.CharacterTypeName = AssetID;
JsonObject->TryGetBoolField(TEXT("CreateUniqueSkeleton"), ImportData.bCreateUniqueSkeleton);
JsonObject->TryGetBoolField(TEXT("ConvertToEpicSkeleton"), ImportData.bConvertToEpicSkeleton);
if (ImportData.bConvertToEpicSkeleton)
{
ImportData.bCreateUniqueSkeleton = true;
}
JsonObject->TryGetBoolField(TEXT("FixTwistBones"), ImportData.bFixTwistBones);
if (!JsonObject->TryGetBoolField(TEXT("FaceCharacterRight"), ImportData.bFaceCharacterRight))
{
Expand Down Expand Up @@ -686,12 +709,17 @@ UObject* FDazToUnrealModule::ImportFromDaz(TSharedPtr<FJsonObject> JsonObject, c
// Find duplicate materials
TMap<TSharedPtr<FJsonValue>, TSharedPtr<FJsonValue>> DuplicateMaterials;
TArray<TSharedPtr<FJsonValue>> matList = JsonObject->GetArrayField(TEXT("Materials"));
if (CachedSettings->CombineIdenticalMaterials)
if (MaterialCombineMethod == DazMaterialCombineType::CombineIdentical)
{

DuplicateMaterials = FDazToUnrealMaterials::FindDuplicateMaterials(matList);
}

// Combine All Materials
if (MaterialCombineMethod == DazMaterialCombineType::CombineAll)
{
DuplicateMaterials = FDazToUnrealMaterials::CombineToOneMaterial(matList);
}

// Load material values
for (int32 i = 0; i < matList.Num(); i++)
{
Expand Down Expand Up @@ -1281,7 +1309,7 @@ UObject* FDazToUnrealModule::ImportFromDaz(TSharedPtr<FJsonObject> JsonObject, c
Scene->FillMaterialArray(MaterialArray);

// Create a mapping of the names of duplicate (identical) materials
if (CachedSettings->CombineIdenticalMaterials)
if (MaterialCombineMethod != DazMaterialCombineType::NoCombine)
{
TMap<FString, FString> DuplicateToOriginalName;
for (auto DuplicateMaterialPair : DuplicateMaterials)
Expand Down Expand Up @@ -1619,7 +1647,7 @@ UObject* FDazToUnrealModule::ImportFromDaz(TSharedPtr<FJsonObject> JsonObject, c
Progress.EnterProgressFrame(1, LOCTEXT("CreatingFullBodyIKControlRig", "Creating Full Body IK Control Rig"));
#if ENGINE_MAJOR_VERSION > 4
// Create a control rig for the character
if (AssetType == DazAssetType::SkeletalMesh && CachedSettings->CreateFullBodyIKControlRig && NewObject)
if (AssetType == DazAssetType::SkeletalMesh && CachedSettings->CreateFullBodyIKControlRig && !ImportData.bConvertToEpicSkeleton && NewObject)
{
FString SkeletalMeshPackagePath = NewObject->GetOutermost()->GetPathName() + TEXT(".") + NewObject->GetName();
FString CreateControlRigCommand = FString::Format(TEXT("py CreateControlRig.py --skeletalMesh={0} --dtuFile=\"{1}\""), { SkeletalMeshPackagePath, FileName });
Expand All @@ -1641,6 +1669,14 @@ UObject* FDazToUnrealModule::ImportFromDaz(TSharedPtr<FJsonObject> JsonObject, c
//SkeletalMesh->SetMaterials((SkeletalMesh->GetMaterials().Sort([](const FSkeletalMaterial& A, const FSkeletalMaterial& B) { return A.MaterialSlotName.ToString() < B.MaterialSlotName.ToString(); }));
}

if (USkeletalMesh* SkeletalMesh = Cast<USkeletalMesh>(NewObject))
{
if (ImportData.bConvertToEpicSkeleton)
{
UDazToUnrealBlueprintUtils::ConvertToEpicSkeleton(SkeletalMesh, nullptr);
}
}

if (USkeletalMesh* SkeletalMesh = Cast<USkeletalMesh>(NewObject))
{
FContentBrowserModule& ContentBrowserModule = FModuleManager::Get().LoadModuleChecked<FContentBrowserModule>("ContentBrowser");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include "ReferenceSkeleton.h"
#include "Animation/Skeleton.h"
#include "AssetNotifications.h"
#include "AssetRegistry/AssetRegistryModule.h"

#if ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION == 2
#include "IKRigDefinition.h"
Expand Down Expand Up @@ -97,18 +98,37 @@ FName UDazToUnrealBlueprintUtils::GetJointBone(const class USkeleton* Skeleton,
void UDazToUnrealBlueprintUtils::ConvertToEpicSkeleton(USkeletalMesh* SkeletalMesh, USkeletalMesh* TargetEpicSkeleton)
{
#if ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION > 3
if (!TargetEpicSkeleton)
{
// Find all SkeletalMeshes
TArray<FAssetData> Assets;
IAssetRegistry& AssetRegistry = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry")).Get();
AssetRegistry.GetAssetsByClass(USkeletalMesh::StaticClass()->GetClassPathName(), Assets);

// Add a menu entry for each SkeletalMesh
for (FAssetData Asset : Assets)
{
if (Asset.AssetName == "SKM_Quinn")
{
TargetEpicSkeleton = Cast<USkeletalMesh>(Asset.GetAsset());
}
}
}

USkeletonModifier* Modifier = NewObject<USkeletonModifier>();
Modifier->SetSkeletalMesh(SkeletalMesh);

// Reparent Pelvis area
Modifier->ParentBone("l_thigh", "hip");
Modifier->ParentBone("r_thigh", "hip");
Modifier->ParentBone("spine1", "pelvis");
Modifier->ParentBone("pelvis", "root");
Modifier->ParentBone("hip", "pelvis");
//Modifier->ParentBone("l_thigh", "hip");
//Modifier->ParentBone("r_thigh", "hip");
//Modifier->ParentBone("spine1", "pelvis");
//Modifier->RemoveBone("daz_pelvis", true);

// Rename Spine
Modifier->RenameBone("pelvis", "spine_01");
Modifier->RenameBone("hip", "pelvis");
//Modifier->RenameBone("pelvis", "spine_01");
Modifier->RenameBone("hip", "spine_01");
Modifier->RenameBone("spine1", "spine_02");
Modifier->RenameBone("spine2", "spine_03");
Modifier->RenameBone("spine3", "spine_04");
Expand Down Expand Up @@ -214,10 +234,33 @@ void UDazToUnrealBlueprintUtils::ConvertToEpicSkeleton(USkeletalMesh* SkeletalMe
// Set Root Rotation
Modifier->SetBoneTransform("root", FTransform::Identity, false);

// spine_01 height
//FTransform PelvisTransform = Modifier->GetBoneTransform("pelvis", true);
//FTransform Spine01Transform = Modifier->GetBoneTransform("spine_01", true);
//Spine01Transform.AddToTranslation(FVector(0.0f, 0.0f, 2.0f));
//Modifier->SetBoneTransform("spine_01", Spine01Transform, false);

//Rotation Order is Y, Z, X
FQuat SpineRefRotation = FQuat(FRotator(90.0f, -90.0f, -90.0f));
SetBoneOrientation(Modifier, "pelvis", SpineRefRotation);

// Move pelvis down
FTransform PelvisTransform = Modifier->GetBoneTransform("pelvis", true);
FTransform LeftThighTransform = Modifier->GetBoneTransform("thigh_l", true);
float PelvisHeightAdjustment = (PelvisTransform.GetTranslation().Z - LeftThighTransform.GetTranslation().Z) * 0.7f;

FTransform PelvisRelativeTransform = Modifier->GetBoneTransform("pelvis", false);
PelvisRelativeTransform.AddToTranslation(FVector(0.0f, 0.0f, -1.0f * PelvisHeightAdjustment));
Modifier->SetBoneTransform("pelvis", PelvisRelativeTransform, false);

// spine_01 height
PelvisTransform = Modifier->GetBoneTransform("pelvis", true);
FTransform Spine02Transform = Modifier->GetBoneTransform("spine_02", true);
FVector RelativeLocation = FTransform::SubtractTranslations(Spine02Transform, PelvisTransform) * 0.5f;
FTransform Spine01Transform = Modifier->GetBoneTransform("spine_01");
Spine01Transform.SetTranslation(FVector(RelativeLocation.Z, RelativeLocation.Y, 0.0f));
Modifier->SetBoneTransform("spine_01", Spine01Transform, false);

SetBoneOrientation(Modifier, "spine_01", FQuat(FRotator(0.0f, 0.0f, 0.0f)));
SetBoneOrientation(Modifier, "spine_02", FQuat(FRotator(0.0f, 0.0f, 0.0f)));
SetBoneOrientation(Modifier, "spine_03", FQuat(FRotator(0.0f, 0.0f, 0.0f)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -913,6 +913,17 @@ TMap<TSharedPtr<FJsonValue>, TSharedPtr<FJsonValue>> FDazToUnrealMaterials::Find
return Duplicates;
}

// Returns a duplicate mapping of all materials to one material so there will only be one material slot.
TMap<TSharedPtr<FJsonValue>, TSharedPtr<FJsonValue>> FDazToUnrealMaterials::CombineToOneMaterial(TArray<TSharedPtr<FJsonValue>> MaterialList)
{
TMap<TSharedPtr<FJsonValue>, TSharedPtr<FJsonValue>> Duplicates;
for (int32 i = 1; i < MaterialList.Num(); i++)
{
Duplicates.Add(MaterialList[i], MaterialList[0]);
}
return Duplicates;
}

FString FDazToUnrealMaterials::GetFriendlyObjectName(FString FbxObjectName, TMap<FString, TArray<FDUFTextureProperty>> MaterialProperties)
{
// Find the torso material.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@ enum DazAssetType
MLDeformer
};

enum DazMaterialCombineType
{
NoCombine,
CombineIdentical,
CombineAll
};

struct DazToUnrealImportData
{
FString SourcePath;
Expand All @@ -29,6 +36,7 @@ struct DazToUnrealImportData
FString CharacterTypeName;
bool bSetPostProcessAnimation = true;
bool bCreateUniqueSkeleton = false;
bool bConvertToEpicSkeleton = false;
bool bFixTwistBones = false;
bool bFaceCharacterRight = false;
TMap<FName, FName> MaterialSlotNameToMaterialName;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ class FDazToUnrealMaterials
// Returns a map of material to the material it's a duplicate of.
static TMap<TSharedPtr<FJsonValue>, TSharedPtr<FJsonValue>> FindDuplicateMaterials(TArray<TSharedPtr<FJsonValue>> MaterialList);

// Returns a duplicate mapping of all materials to one material so there will only be one material slot.
static TMap<TSharedPtr<FJsonValue>, TSharedPtr<FJsonValue>> CombineToOneMaterial(TArray<TSharedPtr<FJsonValue>> MaterialList);

// Get the friendly material object name from the fbx name
static FString GetFriendlyObjectName(FString FbxObjectName, TMap<FString, TArray<FDUFTextureProperty>> MaterialProperties);
};

0 comments on commit 4a356d7

Please sign in to comment.