Decisions D-01/D-02 : correctifs anterieurs non suivis retires.
Content/{BPs,UI,Structs,Scenes,Render,Characters} = 4.27 (385 fichiers,
MD5 verifies). Correctifs isoles : Docs/Migration/05_Correctifs_Isoles.md,
patchs de code 4.27->5.5 dans Docs/Migration/correctifs/.
Releve de base 5.5 : CompileAllBlueprints 6 erreurs (StatMenu, CharGen),
0 echec de chargement ; LPCheckMeshAssignment 5 broches AssetRegistry
orphelines dans GI (GetAssetsByClass). Tools/RunCommandlet.ps1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
355 lines
16 KiB
Diff
355 lines
16 KiB
Diff
diff --git a/D:/Game/LifePlay-master 4.27/Source/LifePlay/LPAssetRegistryHelpers.cpp b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPAssetRegistryHelpers.cpp
|
|
index 9553b8f..b8ab09f 100644
|
|
--- a/D:/Game/LifePlay-master 4.27/Source/LifePlay/LPAssetRegistryHelpers.cpp
|
|
+++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPAssetRegistryHelpers.cpp
|
|
@@ -1,4 +1,4 @@
|
|
-// Portage UE 4.27 (2026.9 beta) - voir LPAssetRegistryHelpers.h
|
|
+// Portage UE 5.5 (2026.9 beta) - voir LPAssetRegistryHelpers.h
|
|
|
|
#include "LPAssetRegistryHelpers.h"
|
|
|
|
@@ -11,5 +11,48 @@ FAssetData ULPAssetRegistryHelpers::GetAssetByObjectPath(const FName ObjectPath,
|
|
const FAssetRegistryModule& AssetRegistryModule =
|
|
FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry"));
|
|
|
|
- return AssetRegistryModule.Get().GetAssetByObjectPath(ObjectPath, bIncludeOnlyOnDiskAssets);
|
|
+ // 5.1+ : la surcharge prenant un FName est depreciee. La broche Blueprint reste un
|
|
+ // FName (les noeuds rebranches par la commandlet en dependent), seule la conversion
|
|
+ // vers FSoftObjectPath est faite ici.
|
|
+ const FSoftObjectPath Path(ObjectPath.ToString());
|
|
+ const FAssetData Result = AssetRegistryModule.Get().GetAssetByObjectPath(Path, bIncludeOnlyOnDiskAssets);
|
|
+
|
|
+ // Diagnostic du 2026-09-08 : cette fonction a ete instrumentee pour verifier qu'elle
|
|
+ // n'etait pas en cause dans l'absence de maillage des personnages. Elle ne l'etait pas
|
|
+ // (2720 resolutions reussies sur 2776). Le defaut venait de GetAssetsByClass, ci-dessous.
|
|
+ return Result;
|
|
+}
|
|
+
|
|
+bool ULPAssetRegistryHelpers::GetAssetsByClassName(FName ClassName, TArray<FAssetData>& OutAssetData, bool bSearchSubClasses)
|
|
+{
|
|
+ OutAssetData.Reset();
|
|
+
|
|
+ if (ClassName.IsNone())
|
|
+ {
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ // TryFindTypeSlow resout un nom court ("SkeletalMesh") vers la classe reelle, quel que
|
|
+ // soit son module : /Script/Engine.SkeletalMesh comme /Script/StreetMapRuntime.StreetMap.
|
|
+ const UClass* ResolvedClass = UClass::TryFindTypeSlow<UClass>(ClassName.ToString());
|
|
+ if (!ResolvedClass)
|
|
+ {
|
|
+ UE_LOG(LogTemp, Warning, TEXT("LPAssetRegistryHelpers : classe '%s' introuvable."), *ClassName.ToString());
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ const FAssetRegistryModule& AssetRegistryModule =
|
|
+ FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry"));
|
|
+
|
|
+ return AssetRegistryModule.Get().GetAssetsByClass(
|
|
+ FTopLevelAssetPath(ResolvedClass), OutAssetData, bSearchSubClasses);
|
|
+}
|
|
+
|
|
+FName ULPAssetRegistryHelpers::GetAssetObjectPath(const FAssetData& AssetData)
|
|
+{
|
|
+ if (!AssetData.IsValid())
|
|
+ {
|
|
+ return NAME_None;
|
|
+ }
|
|
+ return FName(*AssetData.GetSoftObjectPath().ToString());
|
|
}
|
|
diff --git a/D:/Game/LifePlay-master 4.27/Source/LifePlay/LPAssetRegistryHelpers.h b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPAssetRegistryHelpers.h
|
|
index d59109a..85fe6fa 100644
|
|
--- a/D:/Game/LifePlay-master 4.27/Source/LifePlay/LPAssetRegistryHelpers.h
|
|
+++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPAssetRegistryHelpers.h
|
|
@@ -1,8 +1,8 @@
|
|
-// Portage UE 4.27 (2026.9 beta)
|
|
+// Portage UE 5.5 (2026.9 beta) - rustine introduite lors du portage 4.27, toujours necessaire.
|
|
//
|
|
// Epic a rendu IAssetRegistry::GetAssetByObjectPath impur (BlueprintPure=false) apres la
|
|
// version d'Unreal utilisee pour ecrire les Blueprints du jeu. Les graphes existants
|
|
-// l'employaient comme noeud PUR : au chargement en 4.27 le noeud gagne une broche Exec non
|
|
+// l'employaient comme noeud PUR : au chargement le noeud gagne une broche Exec non
|
|
// connectee, il est donc elague, et le noeud "Get Asset" qui consommait sa sortie se retrouve
|
|
// sans entree -> "'In Asset Data' ... must have an input wired into it".
|
|
//
|
|
@@ -31,4 +31,30 @@ public:
|
|
*/
|
|
UFUNCTION(BlueprintPure, Category = "AssetRegistry")
|
|
static FAssetData GetAssetByObjectPath(const FName ObjectPath, bool bIncludeOnlyOnDiskAssets = false);
|
|
+
|
|
+ /**
|
|
+ * Version FName de IAssetRegistry::GetAssetsByClass.
|
|
+ *
|
|
+ * 5.1 a remplace le parametre FName ClassName par un FTopLevelAssetPath ClassPathName.
|
|
+ * La montee de version a supprime l'ancienne broche des noeuds existants SANS reporter
|
|
+ * sa valeur sur la nouvelle : les trois appels de GI (SkeletalMesh, StaticMesh,
|
|
+ * StreetMap) interrogeaient donc l'AssetRegistry avec un chemin de classe VIDE et ne
|
|
+ * renvoyaient plus rien. Le jeu ne pouvait plus enumerer ni corps, ni vetements, ni
|
|
+ * coiffures : generatePerson() sans argument n'avait plus rien a tirer au sort.
|
|
+ *
|
|
+ * Rien dans le graphe ne le signalait : la compilation restait a zero erreur.
|
|
+ *
|
|
+ * Les noms de broches reproduisent ceux du noeud d'origine pour que le reaiguillage se
|
|
+ * limite a un changement de reference de fonction.
|
|
+ */
|
|
+ UFUNCTION(BlueprintCallable, Category = "AssetRegistry")
|
|
+ static bool GetAssetsByClassName(FName ClassName, TArray<FAssetData>& OutAssetData, bool bSearchSubClasses = false);
|
|
+
|
|
+ /**
|
|
+ * Equivalent de l'ancien FAssetData::ObjectPath (supprime en 5.1 au profit de
|
|
+ * FSoftObjectPath). Rend le chemin sous la forme "/Game/Dossier/Asset.Asset" attendue
|
|
+ * par les consommateurs existants.
|
|
+ */
|
|
+ UFUNCTION(BlueprintPure, Category = "AssetRegistry")
|
|
+ static FName GetAssetObjectPath(const FAssetData& AssetData);
|
|
};
|
|
diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPNavigationHelpers.cpp b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPNavigationHelpers.cpp
|
|
new file mode 100644
|
|
index 0000000..33bba33
|
|
--- /dev/null
|
|
+++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPNavigationHelpers.cpp
|
|
@@ -0,0 +1,18 @@
|
|
+// Portage UE 5.5 - voir LPNavigationHelpers.h
|
|
+
|
|
+#include "LPNavigationHelpers.h"
|
|
+
|
|
+#include "NavigationSystem.h"
|
|
+
|
|
+bool ULPNavigationHelpers::GetRandomLocationInNavigableRadius(
|
|
+ UObject* WorldContextObject,
|
|
+ const FVector& Origin,
|
|
+ FVector& RandomLocation,
|
|
+ float Radius,
|
|
+ ANavigationData* NavData,
|
|
+ TSubclassOf<UNavigationQueryFilter> FilterClass)
|
|
+{
|
|
+ // Simple reacheminement : toute la logique reste cote moteur.
|
|
+ return UNavigationSystemV1::K2_GetRandomLocationInNavigableRadius(
|
|
+ WorldContextObject, Origin, RandomLocation, Radius, NavData, FilterClass);
|
|
+}
|
|
diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPNavigationHelpers.h b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPNavigationHelpers.h
|
|
new file mode 100644
|
|
index 0000000..81e9922
|
|
--- /dev/null
|
|
+++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPNavigationHelpers.h
|
|
@@ -0,0 +1,48 @@
|
|
+// Portage UE 5.5 (2026.9 beta) - remediation R-04.
|
|
+//
|
|
+// UNavigationSystemV1::K2_GetRandomPointInNavigableRadius est deprecie depuis 5.1 au profit
|
|
+// de K2_GetRandomLocationInNavigableRadius. Les deux ont EXACTEMENT la meme liste de
|
|
+// parametres et le meme retour, mais l'ancien est BlueprintPure et le nouveau est
|
|
+// BlueprintCallable : echanger la reference de fonction sur les noeuds existants leur
|
|
+// ajouterait des broches Exec non connectees, ils seraient elagues a la compilation.
|
|
+// C'est le meme piege que celui traite par ULPAssetRegistryHelpers lors du portage 4.27.
|
|
+//
|
|
+// Cette classe re-expose donc la version NON depreciee en BlueprintPure, avec des noms de
|
|
+// broches identiques a ceux du noeud d'origine, pour que la commandlet
|
|
+// LPFixDeprecatedNodes puisse se contenter de reaiguiller la reference de fonction.
|
|
+
|
|
+#pragma once
|
|
+
|
|
+#include "CoreMinimal.h"
|
|
+#include "Kismet/BlueprintFunctionLibrary.h"
|
|
+#include "Templates/SubclassOf.h"
|
|
+#include "LPNavigationHelpers.generated.h"
|
|
+
|
|
+class ANavigationData;
|
|
+class UNavigationQueryFilter;
|
|
+
|
|
+UCLASS()
|
|
+class LIFEPLAY_API ULPNavigationHelpers : public UBlueprintFunctionLibrary
|
|
+{
|
|
+ GENERATED_BODY()
|
|
+
|
|
+public:
|
|
+
|
|
+ /**
|
|
+ * Version PURE de UNavigationSystemV1::K2_GetRandomLocationInNavigableRadius.
|
|
+ *
|
|
+ * Les noms de parametres reproduisent ceux de K2_GetRandomPointInNavigableRadius : ce sont
|
|
+ * eux qui portent les liaisons dans les Blueprints existants (Room, Person, AI).
|
|
+ */
|
|
+ UFUNCTION(BlueprintPure, Category = "AI|Navigation",
|
|
+ meta = (WorldContext = "WorldContextObject",
|
|
+ DisplayName = "Get Random Location in Navigable Radius (Pure)",
|
|
+ Keywords = "random point navigable radius"))
|
|
+ static bool GetRandomLocationInNavigableRadius(
|
|
+ UObject* WorldContextObject,
|
|
+ const FVector& Origin,
|
|
+ FVector& RandomLocation,
|
|
+ float Radius,
|
|
+ ANavigationData* NavData = nullptr,
|
|
+ TSubclassOf<UNavigationQueryFilter> FilterClass = nullptr);
|
|
+};
|
|
diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPVictoryCompat.cpp b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPVictoryCompat.cpp
|
|
new file mode 100644
|
|
index 0000000..ee3092b
|
|
--- /dev/null
|
|
+++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPVictoryCompat.cpp
|
|
@@ -0,0 +1,80 @@
|
|
+// Portage UE 5.5 - voir LPVictoryCompat.h
|
|
+
|
|
+#include "LPVictoryCompat.h"
|
|
+
|
|
+#include "Engine/Texture2D.h"
|
|
+#include "HAL/PlatformApplicationMisc.h"
|
|
+#include "IImageWrapper.h"
|
|
+#include "IImageWrapperModule.h"
|
|
+#include "Misc/FileHelper.h"
|
|
+#include "Modules/ModuleManager.h"
|
|
+
|
|
+namespace
|
|
+{
|
|
+ EImageFormat GetJoyImageFormat(EJoyImageFormats JoyFormat)
|
|
+ {
|
|
+ switch (JoyFormat)
|
|
+ {
|
|
+ case EJoyImageFormats::JPG: return EImageFormat::JPEG;
|
|
+ case EJoyImageFormats::PNG: return EImageFormat::PNG;
|
|
+ case EJoyImageFormats::BMP: return EImageFormat::BMP;
|
|
+ case EJoyImageFormats::ICO: return EImageFormat::ICO;
|
|
+ case EJoyImageFormats::EXR: return EImageFormat::EXR;
|
|
+ case EJoyImageFormats::ICNS: return EImageFormat::ICNS;
|
|
+ }
|
|
+ return EImageFormat::JPEG;
|
|
+ }
|
|
+}
|
|
+
|
|
+UTexture2D* ULPVictoryCompat::Victory_LoadTexture2D_FromFile(const FString& FullFilePath, EJoyImageFormats ImageFormat, bool& IsValid, int32& Width, int32& Height)
|
|
+{
|
|
+ IsValid = false;
|
|
+ UTexture2D* LoadedT2D = nullptr;
|
|
+
|
|
+ IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper"));
|
|
+ TSharedPtr<IImageWrapper> ImageWrapper = ImageWrapperModule.CreateImageWrapper(GetJoyImageFormat(ImageFormat));
|
|
+
|
|
+ // Load From File
|
|
+ TArray<uint8> RawFileData;
|
|
+ if (!FFileHelper::LoadFileToArray(RawFileData, *FullFilePath)) return nullptr;
|
|
+
|
|
+ // Create T2D!
|
|
+ if (ImageWrapper.IsValid() && ImageWrapper->SetCompressed(RawFileData.GetData(), RawFileData.Num()))
|
|
+ {
|
|
+ TArray<uint8> UncompressedBGRA;
|
|
+ if (ImageWrapper->GetRaw(ERGBFormat::BGRA, 8, UncompressedBGRA))
|
|
+ {
|
|
+ LoadedT2D = UTexture2D::CreateTransient(ImageWrapper->GetWidth(), ImageWrapper->GetHeight(), PF_B8G8R8A8);
|
|
+
|
|
+ // Valid?
|
|
+ if (!LoadedT2D) return nullptr;
|
|
+
|
|
+ // Out!
|
|
+ Width = ImageWrapper->GetWidth();
|
|
+ Height = ImageWrapper->GetHeight();
|
|
+
|
|
+ // Copy!
|
|
+ // 5.1+ : UTexture2D::PlatformData est prive, on passe par GetPlatformData()
|
|
+ void* TextureData = LoadedT2D->GetPlatformData()->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
|
|
+ FMemory::Memcpy(TextureData, UncompressedBGRA.GetData(), UncompressedBGRA.Num());
|
|
+ LoadedT2D->GetPlatformData()->Mips[0].BulkData.Unlock();
|
|
+
|
|
+ // Update!
|
|
+ LoadedT2D->UpdateResource();
|
|
+ }
|
|
+ }
|
|
+
|
|
+ // Success!
|
|
+ // NOTE : comportement repris tel quel du plugin d'origine. IsValid ne distingue que
|
|
+ // le fichier introuvable (false, sortie anticipee ci-dessus) du reste (true), y compris
|
|
+ // quand l'image est illisible et que le retour est nul. Volontairement non corrige :
|
|
+ // les Blueprints existants branchent sur ce flag, changer sa semantique changerait
|
|
+ // leur comportement. Voir Docs/Architecture/VictoryPlugin_Architecture.md (R-14).
|
|
+ IsValid = true;
|
|
+ return LoadedT2D;
|
|
+}
|
|
+
|
|
+void ULPVictoryCompat::Victory_SaveStringToOSClipboard(const FString& ToClipboard)
|
|
+{
|
|
+ FPlatformApplicationMisc::ClipboardCopy(*ToClipboard);
|
|
+}
|
|
diff --git a/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPVictoryCompat.h b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPVictoryCompat.h
|
|
new file mode 100644
|
|
index 0000000..0a71bf5
|
|
--- /dev/null
|
|
+++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LPVictoryCompat.h
|
|
@@ -0,0 +1,51 @@
|
|
+// Portage UE 5.5 - remplacement des 2 seuls noeuds du Victory Plugin utilises par LifePlay.
|
|
+//
|
|
+// Le plugin d'origine (VictoryBPLibrary, 9327 lignes sur 17 fichiers) dependait de PhysX,
|
|
+// APEX et ApexDestruction, supprimes d'UE5. Un releve exhaustif sur les 8562 .uasset du
|
|
+// projet n'a trouve que deux fonctions appelees, depuis 5 assets seulement, plus
|
|
+// l'enumeration EJoyImageFormats.
|
|
+//
|
|
+// Detail complet : Docs/Architecture/VictoryPlugin_Architecture.md
|
|
+//
|
|
+// Les noms et signatures sont reproduits a l'identique pour que les noeuds Blueprint
|
|
+// existants se rebranchent seuls ; le raccordement se fait par les CoreRedirects
|
|
+// declares dans Config/DefaultEngine.ini.
|
|
+
|
|
+#pragma once
|
|
+
|
|
+#include "CoreMinimal.h"
|
|
+#include "Kismet/BlueprintFunctionLibrary.h"
|
|
+#include "LPVictoryCompat.generated.h"
|
|
+
|
|
+class UTexture2D;
|
|
+
|
|
+/**
|
|
+ * Formats d'image acceptes par Victory_LoadTexture2D_FromFile.
|
|
+ * L'ordre des membres est celui du plugin d'origine : il est serialise en octet dans les
|
|
+ * valeurs par defaut des broches Blueprint, toute permutation les corromprait.
|
|
+ */
|
|
+UENUM(BlueprintType)
|
|
+enum class EJoyImageFormats : uint8
|
|
+{
|
|
+ JPG UMETA(DisplayName="JPG "),
|
|
+ PNG UMETA(DisplayName="PNG "),
|
|
+ BMP UMETA(DisplayName="BMP "),
|
|
+ ICO UMETA(DisplayName="ICO "),
|
|
+ EXR UMETA(DisplayName="EXR "),
|
|
+ ICNS UMETA(DisplayName="ICNS ")
|
|
+};
|
|
+
|
|
+UCLASS()
|
|
+class LIFEPLAY_API ULPVictoryCompat : public UBlueprintFunctionLibrary
|
|
+{
|
|
+ GENERATED_BODY()
|
|
+
|
|
+public:
|
|
+
|
|
+ /** Load a Texture2D from a JPG,PNG,BMP,ICO,EXR,ICNS file! IsValid tells you if file path was valid or not. Enjoy! -Rama */
|
|
+ UFUNCTION(BlueprintPure, Category = "Victory BP Library|Load Texture From File", meta=(Keywords="image png jpg jpeg bmp bitmap ico icon exr icns"))
|
|
+ static UTexture2D* Victory_LoadTexture2D_FromFile(const FString& FullFilePath, EJoyImageFormats ImageFormat, bool& IsValid, int32& Width, int32& Height);
|
|
+
|
|
+ UFUNCTION(BlueprintCallable, Category = "Victory BP Library|String")
|
|
+ static void Victory_SaveStringToOSClipboard(const FString& ToClipboard);
|
|
+};
|
|
diff --git a/D:/Game/LifePlay-master 4.27/Source/LifePlay/LifePlay.Build.cs b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LifePlay.Build.cs
|
|
index bcdaa8f..4252313 100644
|
|
--- a/D:/Game/LifePlay-master 4.27/Source/LifePlay/LifePlay.Build.cs
|
|
+++ b/D:/Game/LifePlay-master 5.5/Source/LifePlay/LifePlay.Build.cs
|
|
@@ -7,9 +7,23 @@ public class LifePlay : ModuleRules
|
|
public LifePlay(ReadOnlyTargetRules Target) : base(Target)
|
|
{
|
|
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
|
|
+
|
|
+ // Portage 5.5 : le module a une structure plate (pas de sous-dossier Public/).
|
|
+ // BuildSettingsVersion.V5 desactive les chemins d'include legacy, il faut donc
|
|
+ // exposer explicitement le dossier du module aux modules qui en dependent
|
|
+ // (LifePlayEditorTools inclut LPAssetRegistryHelpers.h).
|
|
+ PublicIncludePaths.Add(ModuleDirectory);
|
|
|
|
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "AssetRegistry" });
|
|
|
|
+ // Portage 5.5 : necessaires a LPVictoryCompat (remplacement du Victory Plugin)
|
|
+ PrivateDependencyModuleNames.AddRange(new string[] { "ImageWrapper", "ApplicationCore" });
|
|
+
|
|
+ // Portage 5.5 (R-04) : ULPNavigationHelpers re-expose K2_GetRandomLocationInNavigableRadius
|
|
+ // en BlueprintPure. Dependance PUBLIQUE : le .h expose ANavigationData et
|
|
+ // UNavigationQueryFilter dans sa signature, et LifePlayEditorTools l'inclut.
|
|
+ PublicDependencyModuleNames.Add("NavigationSystem");
|
|
+
|
|
PrivateDependencyModuleNames.AddRange(new string[] { });
|
|
|
|
// Uncomment if you are using Slate UI
|