diff --git a/CUE4Parse b/CUE4Parse index c780a45..731af40 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit c780a4574079d1bc34cde2a3a9eee225fbfae4ce +Subproject commit 731af4098e086cf7b907d49577c34b4f19beec92 diff --git a/Snooper/Rendering/Actors/LevelActor.cs b/Snooper/Rendering/Actors/LevelActor.cs index c1ebd13..efaa3e6 100644 --- a/Snooper/Rendering/Actors/LevelActor.cs +++ b/Snooper/Rendering/Actors/LevelActor.cs @@ -17,11 +17,6 @@ public class LevelActor : UnrealActor public LevelActor(UObject actor) : base(actor) { EnqueuePointers(actor.GetOrDefault("RootComponent")); - EnqueuePointers(actor.GetOrDefault("InstanceComponents", [])); - EnqueuePointers(actor.GetOrDefault("BlueprintCreatedComponents", [])); - EnqueuePointers(actor.GetOrDefault("LandscapeComponents", [])); - EnqueuePointers(actor.GetOrDefault("SplineComponent")); - EnqueuePointers(actor.GetOrDefault("CameraComponent")); if (actor is AInstancedFoliageActor { FoliageInfos: { } foliages }) { @@ -46,7 +41,7 @@ public LevelActor(UObject actor) : base(actor) actor.TryGetValue(out _additionalWorlds, "AdditionalWorlds"); } - public void ProcessEnqueuedComponents(Dictionary components, Dictionary actors) + public void ProcessEnqueuedComponents(Dictionary components, Dictionary actors) { foreach (var ptr in _ptrs) { @@ -63,9 +58,9 @@ public void ProcessEnqueuedComponents(Dictionary components, Dictionary actors, FPackageIndex ptr) + private void CreateComponentRecursive(Dictionary components, Dictionary actors, FPackageIndex ptr) { - if (components.ContainsKey(ptr)) return; + if (ptr.ResolvedObject is not { } resolved || components.ContainsKey(resolved)) return; if (ptr.Load()?.Outer is { } outer && actors.TryGetValue(outer, out var owner) && owner != this) { @@ -87,24 +82,24 @@ private void CreateComponentRecursive(Dictionary _ptrs = []; - private void EnqueuePointers(params FPackageIndex?[] ptrs) + internal void EnqueuePointers(params FPackageIndex?[] ptrs) { foreach (var ptr in ptrs) { diff --git a/Snooper/Rendering/Actors/UnrealActor.cs b/Snooper/Rendering/Actors/UnrealActor.cs index 20da07a..9e6d819 100644 --- a/Snooper/Rendering/Actors/UnrealActor.cs +++ b/Snooper/Rendering/Actors/UnrealActor.cs @@ -11,6 +11,7 @@ using CUE4Parse.UE4.Assets.Exports.Component.StaticMesh; using CUE4Parse.UE4.Assets.Exports.Component.TextRender; using CUE4Parse.UE4.Assets.Exports.GeometryCollection; +using CUE4Parse.UE4.Assets.Exports.Landscape; using CUE4Parse.UE4.Assets.Exports.SkeletalMesh; using CUE4Parse.UE4.Assets.Exports.StaticMesh; using CUE4Parse.UE4.Objects.UObject; @@ -52,6 +53,7 @@ protected ComponentPair CreateComponentPair(FPackageIndex ptr) UHierarchicalInstancedStaticMeshComponent hism => new HierarchicalInstancedStaticMeshComponent(mesh, hism), UInstancedStaticMeshComponent ism => new InstancedStaticMeshComponent(mesh, ism), USplineMeshComponent spline => new SplineMeshComponent(mesh, spline), + ULandscapeNaniteComponent landscape => new SpatialComponent(landscape), // we already render landscape via ULandscapeComponent _ => new StaticMeshComponent(mesh, sm) }, UIRMeshComponent ir when ir.Mesh.TryLoad(out var mesh) => new ContainerComponent(mesh, ir), // Custom diff --git a/Snooper/Rendering/Actors/WorldActor.cs b/Snooper/Rendering/Actors/WorldActor.cs index 25c140f..561fa1f 100644 --- a/Snooper/Rendering/Actors/WorldActor.cs +++ b/Snooper/Rendering/Actors/WorldActor.cs @@ -4,6 +4,7 @@ using CUE4Parse.UE4.Assets.Exports; using CUE4Parse.UE4.Assets.Exports.Actor; using CUE4Parse.UE4.Assets.Exports.Engine; +using CUE4Parse.UE4.Assets.Exports.Component; using CUE4Parse.UE4.Assets.Exports.WorldPartition; using CUE4Parse.UE4.Assets.Exports.WorldPartition.DataLayer; using CUE4Parse.UE4.Objects.Engine; @@ -45,8 +46,22 @@ public WorldActor(UWorld world, IProgress? progress = null, Cancellation } length = actors.Count; + if (level.Owner is { } package) + { + // an actor owns every component outered to it + for (var i = 0; i < package.ExportMapLength; i++) + { + var export = new FPackageIndex(package, i + 1); + if (package.ResolvePackageIndex(export) is { Outer: { } outer } resolved && actors.TryGetValue(outer, out var owner) && + resolved.GetObjectType() is { } type && type.IsAssignableTo(typeof(UActorComponent))) + { + owner.EnqueuePointers(export); + } + } + } + var processed = 0; - var components = new Dictionary(); + var components = new Dictionary(); foreach (var actor in actors.Values) { ct.ThrowIfCancellationRequested(); diff --git a/Snooper/Rendering/Cache/MaterialNode.cs b/Snooper/Rendering/Cache/MaterialNode.cs index 679280b..3fa0960 100644 --- a/Snooper/Rendering/Cache/MaterialNode.cs +++ b/Snooper/Rendering/Cache/MaterialNode.cs @@ -188,6 +188,12 @@ void ReadCachedData(UMaterialInterface cooked) _referencedTextures.Clear(); _referencedTextures.AddRange(ordered); } + + if (cooked.FlattenedTexture is { IsNull: false }) _textures.TryAdd("Diffuse", new TextureParameter(cooked.FlattenedTexture, provider)); + if (cooked.MobileBaseTexture is { IsNull: false }) _textures.TryAdd("Diffuse", new TextureParameter(cooked.MobileBaseTexture, provider)); + if (cooked.MobileNormalTexture is { IsNull: false }) _textures.TryAdd("Normal", new TextureParameter(cooked.MobileNormalTexture, provider)); + if (cooked.MobileMaskTexture is { IsNull: false }) _textures.TryAdd("SpecularMasks", new TextureParameter(cooked.MobileMaskTexture, provider)); + if (cooked is { bUseMobileSpecular: true, MobileSpecularMask: EMobileSpecularMask.MSM_Constant }) _scalars.TryAdd("Specular", cooked.MobileSpecularPower); } void ReadShaderMaps(UMaterialInterface cooked)