Skip to content

Commit 8a98c1c

Browse files
committed
Fixed reference issues where exported paths have quotes around them
1 parent 5eefeb4 commit 8a98c1c

File tree

7 files changed

+67
-30
lines changed

7 files changed

+67
-30
lines changed

Source/PrefabricatorRuntime/Private/Asset/PrefabricatorAsset.cpp

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,18 @@ FVector FPrefabricatorAssetUtils::FindPivot(const TArray<AActor*>& InActors)
3232
Bounds += ActorBounds;
3333
}
3434

35-
switch (GetDefault< UPrefabricatorSettings>()->PivotPosition)
36-
{
37-
case EPrefabricatorPivotPosition::ExtremeLeft:
38-
Pivot = Bounds.GetCenter() - Bounds.GetExtent();
39-
break;
40-
case EPrefabricatorPivotPosition::ExtremeRight:
41-
Pivot = Bounds.GetCenter() + Bounds.GetExtent();
42-
break;
43-
case EPrefabricatorPivotPosition::Center:
44-
Pivot = Bounds.GetCenter();
45-
break;
46-
default:;
35+
switch (GetDefault< UPrefabricatorSettings>()->PivotPosition)
36+
{
37+
case EPrefabricatorPivotPosition::ExtremeLeft:
38+
Pivot = Bounds.GetCenter() - Bounds.GetExtent();
39+
break;
40+
case EPrefabricatorPivotPosition::ExtremeRight:
41+
Pivot = Bounds.GetCenter() + Bounds.GetExtent();
42+
break;
43+
case EPrefabricatorPivotPosition::Center:
44+
Pivot = Bounds.GetCenter();
45+
break;
46+
default:;
4747
}
4848
Pivot.Z = Bounds.Min.Z;
4949
}
@@ -95,7 +95,7 @@ UPrefabricatorAsset* UPrefabricatorAssetCollection::GetPrefabAsset(const FPrefab
9595

9696
FRandomStream Random;
9797
Random.Initialize(InConfig.Seed);
98-
98+
9999
TSoftObjectPtr<UPrefabricatorAsset> PrefabAssetPtr;
100100

101101
if (TotalWeight == 0) {
@@ -132,24 +132,44 @@ void UPrefabricatorProperty::SaveReferencedAssetValues()
132132
{
133133
AssetSoftReferenceMappings.Reset();
134134

135-
const FRegexPattern Pattern(*FPrefabricatorConstants::SoftReferenceSearchPattern);
135+
const FString SoftReferenceSearchPattern = "([A-Za-z0-9_]+)'(.*?)'";
136+
137+
const FRegexPattern Pattern(*SoftReferenceSearchPattern);
136138
FRegexMatcher Matcher(Pattern, *ExportedValue);
137139

138140
while (Matcher.FindNext()) {
141+
FString FullPath = Matcher.GetCaptureGroup(0);
142+
FString ClassName = Matcher.GetCaptureGroup(1);
143+
FString ObjectPath = Matcher.GetCaptureGroup(2);
144+
if (ClassName == "PrefabricatorAssetUserData") {
145+
continue;
146+
}
147+
bool bUseQuotes = false;
148+
if (ObjectPath.Len() >= 2 && ObjectPath.StartsWith("\"") && ObjectPath.EndsWith("\"")) {
149+
ObjectPath = ObjectPath.Mid(1, ObjectPath.Len() - 2);
150+
bUseQuotes = true;
151+
}
152+
153+
/*
139154
int32 StartIdx = Matcher.GetMatchBeginning();
140155
int32 EndIdx = Matcher.GetMatchEnding();
141156
FString AssetPath = ExportedValue.Mid(StartIdx, EndIdx - StartIdx + 1);
142157
if (AssetPath.StartsWith("PrefabricatorAssetUserData")) { // TODO: Get this name from the static class
143158
continue;
144159
}
145-
FSoftObjectPath SoftPath(AssetPath);
160+
*/
161+
162+
FSoftObjectPath SoftPath(ObjectPath);
146163

147164
FPrefabricatorPropertyAssetMapping Mapping;
148165
Mapping.AssetReference = SoftPath;
149-
if (Mapping.AssetReference.IsValid()) {
150-
FString ObjectPathString;
151-
FPackageName::ParseExportTextPath(AssetPath, &Mapping.AssetClassName, &ObjectPathString);
152-
Mapping.AssetObjectPath = *ObjectPathString;
166+
//if (Mapping.AssetReference.IsValid())
167+
{
168+
//FString ObjectPathString;
169+
//FPackageName::ParseExportTextPath(AssetPath, &Mapping.AssetClassName, &ObjectPathString);
170+
Mapping.AssetClassName = ClassName;
171+
Mapping.AssetObjectPath = *ObjectPath;
172+
Mapping.bUseQuotes = bUseQuotes;
153173
AssetSoftReferenceMappings.Add(Mapping);
154174
UE_LOG(LogPrefabricatorAsset, Log, TEXT("######>>> Found Asset: [%s][%s] | %s"), *Mapping.AssetClassName, *Mapping.AssetObjectPath.ToString(), *Mapping.AssetReference.GetAssetPathName().ToString());
155175
}
@@ -176,8 +196,16 @@ void UPrefabricatorProperty::LoadReferencedAssetValues()
176196
}
177197

178198
// The object path has changed. Update it and mark as modified
179-
FString ReplaceFrom = FString::Printf(TEXT("%s\'%s\'"), *Mapping.AssetClassName, *Mapping.AssetObjectPath.ToString());
180-
FString ReplaceTo = FString::Printf(TEXT("%s\'%s\'"), *Mapping.AssetClassName, *ReferencedPath.ToString());
199+
FString ReplaceFrom, ReplaceTo;
200+
if (Mapping.bUseQuotes) {
201+
ReplaceFrom = FString::Printf(TEXT("%s\'\"%s\"\'"), *Mapping.AssetClassName, *Mapping.AssetObjectPath.ToString());
202+
ReplaceTo = FString::Printf(TEXT("%s\'\"%s\"\'"), *Mapping.AssetClassName, *ReferencedPath.ToString());
203+
}
204+
else {
205+
ReplaceFrom = FString::Printf(TEXT("%s\'%s\'"), *Mapping.AssetClassName, *Mapping.AssetObjectPath.ToString());
206+
ReplaceTo = FString::Printf(TEXT("%s\'%s\'"), *Mapping.AssetClassName, *ReferencedPath.ToString());
207+
}
208+
181209
ExportedValue = ExportedValue.Replace(*ReplaceFrom, *ReplaceTo);
182210
Mapping.AssetObjectPath = ReferencedPath;
183211

Source/PrefabricatorRuntime/Private/Utils/PrefabricatorConstants.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,3 @@
33
#include "Utils/PrefabricatorConstants.h"
44

55

6-
const FString FPrefabricatorConstants::SoftReferenceSearchPattern = "[A-Za-z0-9_]+'.*?'";

Source/PrefabricatorRuntime/Private/Utils/PrefabricatorFunctionLibrary.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,22 @@ APrefabActor* UPrefabricatorBlueprintLibrary::SpawnPrefab(const UObject* WorldCo
2727
PrefabActor->PrefabComponent->PrefabAssetInterface = Prefab;
2828

2929
FRandomStream Random(Seed);
30-
PrefabActor->RandomizeSeed(Random);
31-
32-
FPrefabLoadSettings LoadSettings;
33-
LoadSettings.bRandomizeNestedSeed = true;
34-
LoadSettings.Random = &Random;
35-
FPrefabTools::LoadStateFromPrefabAsset(PrefabActor, LoadSettings);
30+
RandomizePrefab(PrefabActor, Random);
3631
}
3732
}
3833
return PrefabActor;
3934
}
4035

36+
void UPrefabricatorBlueprintLibrary::RandomizePrefab(APrefabActor* PrefabActor, const FRandomStream& InRandom)
37+
{
38+
PrefabActor->RandomizeSeed(InRandom);
39+
40+
FPrefabLoadSettings LoadSettings;
41+
LoadSettings.bRandomizeNestedSeed = true;
42+
LoadSettings.Random = &InRandom;
43+
FPrefabTools::LoadStateFromPrefabAsset(PrefabActor, LoadSettings);
44+
}
45+
4146
void UPrefabricatorBlueprintLibrary::GetAllAttachedActors(AActor* Prefab, TArray<AActor*>& AttachedActors)
4247
{
4348
if (!Prefab) return;

Source/PrefabricatorRuntime/Public/Asset/PrefabricatorAsset.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ struct PREFABRICATORRUNTIME_API FPrefabricatorPropertyAssetMapping {
1717

1818
UPROPERTY()
1919
FName AssetObjectPath;
20+
21+
UPROPERTY()
22+
bool bUseQuotes = false;
2023
};
2124

2225
UCLASS()

Source/PrefabricatorRuntime/Public/Prefab/PrefabTools.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ struct PREFABRICATORRUNTIME_API FPrefabLoadSettings {
1212
bool bUnregisterComponentsBeforeLoading = true;
1313
bool bRandomizeNestedSeed = false;
1414
bool bSynchronousBuild = true;
15-
FRandomStream* Random = nullptr;
15+
const FRandomStream* Random = nullptr;
1616
};
1717

1818
class PREFABRICATORRUNTIME_API FPrefabTools {

Source/PrefabricatorRuntime/Public/Utils/PrefabricatorConstants.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,5 @@
55

66
class PREFABRICATORRUNTIME_API FPrefabricatorConstants {
77
public:
8-
static const FString SoftReferenceSearchPattern;
98
};
109

Source/PrefabricatorRuntime/Public/Utils/PrefabricatorFunctionLibrary.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ class PREFABRICATORRUNTIME_API UPrefabricatorBlueprintLibrary : public UBlueprin
1717
UFUNCTION(BlueprintCallable, Category = "Prefabricator")
1818
static APrefabActor* SpawnPrefab(const UObject* WorldContextObject, UPrefabricatorAssetInterface* Prefab, const FTransform& Transform, int32 Seed);
1919

20+
UFUNCTION(BlueprintCallable, Category = "Prefabricator")
21+
static void RandomizePrefab(APrefabActor* PrefabActor, const FRandomStream& InRandom);
22+
2023
UFUNCTION(BlueprintCallable, Category = "Prefabricator")
2124
static void GetAllAttachedActors(AActor* Prefab, TArray<AActor*>& AttachedActors);
2225

0 commit comments

Comments
 (0)