From 83b6a46579d62c2eb8906fd15cb6326756515815 Mon Sep 17 00:00:00 2001 From: Asval Date: Mon, 24 Aug 2026 20:58:34 +0200 Subject: [PATCH] snap to ground and focus on load --- CUE4Parse | 2 +- FModel/Framework/SnooperHost.cs | 4 ++-- FModel/ViewModels/CUE4ParseViewModel.cs | 1 + FModel/ViewModels/SnooperViewModel.cs | 18 ++++++++++++++---- Snooper | 2 +- 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/CUE4Parse b/CUE4Parse index 746a6d77..abed739a 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit 746a6d779a9607df1aa32ee2858f3ce0fc8557ae +Subproject commit abed739a7deb8ebf3cbb057afca707452edc0e59 diff --git a/FModel/Framework/SnooperHost.cs b/FModel/Framework/SnooperHost.cs index b96c475d..250768d9 100644 --- a/FModel/Framework/SnooperHost.cs +++ b/FModel/Framework/SnooperHost.cs @@ -50,13 +50,13 @@ public sealed class SnooperHost(Func build) : IDisposable // this thread must never die until fmodel closes // if it dies first, opening any menu hangs the ui thread inside UiaReturnRawElementProvider, which is // wpf building the popup, and exiting hangs too (dead thread leaves com state behind???) - var thread = new Thread(RenderLoop) { IsBackground = true, Name = "Snooper" }; + var thread = new Thread(WindowLoop) { IsBackground = true, Name = "Snooper" }; thread.Start(); return thread; } - private void RenderLoop() + private void WindowLoop() { using var _ = LogContext.PushProperty("SourceContext", "Snooper"); GLFWProvider.CheckForMainThread = false; diff --git a/FModel/ViewModels/CUE4ParseViewModel.cs b/FModel/ViewModels/CUE4ParseViewModel.cs index eeddae64..0d5ded00 100644 --- a/FModel/ViewModels/CUE4ParseViewModel.cs +++ b/FModel/ViewModels/CUE4ParseViewModel.cs @@ -1524,6 +1524,7 @@ public class CUE4ParseViewModel : ViewModel // }: case UPaperSprite when isNone && UserSettings.Default.PreviewMaterials: case UStaticMesh when isNone && UserSettings.Default.PreviewStaticMeshes: + case UGeometryCollection when isNone && UserSettings.Default.PreviewStaticMeshes: case USkeletalMesh when isNone && UserSettings.Default.PreviewSkeletalMeshes: case USkeleton when isNone && UserSettings.Default.SaveSkeletonAsMesh: case UMaterialInstance when isNone && UserSettings.Default.PreviewMaterials && !ModelIsOverwritingMaterial && diff --git a/FModel/ViewModels/SnooperViewModel.cs b/FModel/ViewModels/SnooperViewModel.cs index 51869cd5..8677add6 100644 --- a/FModel/ViewModels/SnooperViewModel.cs +++ b/FModel/ViewModels/SnooperViewModel.cs @@ -4,6 +4,7 @@ using System.Runtime.InteropServices; using System.Windows; using System.Windows.Forms; using CUE4Parse.UE4.Assets.Exports; +using CUE4Parse.UE4.Assets.Exports.GeometryCollection; using CUE4Parse.UE4.Assets.Exports.SkeletalMesh; using CUE4Parse.UE4.Assets.Exports.StaticMesh; using CUE4Parse.UE4.Objects.Engine; @@ -13,6 +14,7 @@ using FModel.Services; using Snooper.Rendering.Actors; using Snooper.Rendering.Components; using Snooper.Rendering.Components.Light; +using Snooper.Rendering.Components.Mesh; using Snooper.Rendering.Components.Primitive; using Snooper.Rendering.Components.Transforms; @@ -40,6 +42,7 @@ public class SnooperViewModel : ViewModel, IDisposable { UStaticMesh sm => new MeshActor(sm), USkeletalMesh sk => new MeshActor(sk), + UGeometryCollection gc => new MeshActor(gc), UWorld w => new WorldActor(w), _ => null }; @@ -48,12 +51,19 @@ public class SnooperViewModel : ViewModel, IDisposable editor.Invoke(() => { if (editor.Manager.RootActor == null) - editor.Manager.LoadScene(CreateScene(obj is UWorld)); + editor.Manager.LoadScene(CreateScene(actor is WorldActor)); if (actor != null) editor.Manager.LoadScene(actor); editor.Show(); + + if (actor?.RootComponent is MeshComponent mesh) + { + mesh.SnapToGround(); + mesh.UpdateWorldMatrix(); // just so teleport works properly + mesh.TeleportTo(); + } }); } @@ -67,12 +77,12 @@ public class SnooperViewModel : ViewModel, IDisposable scene.Children.Add(grid); var camera = new CameraActor("Camera"); - camera.CameraComponent.LocalTransform.Position = new Vector3(1, 2, -0.5f); - camera.CameraComponent.LocalTransform.Rotation = new Quaternion(0, -1, 0, 1); + camera.CameraComponent.SetLocalTransform(new Transform(new Vector3(0, 1.14f, 3.5f), new Vector3(180, 18, 0))); scene.Children.Add(camera); + const float distance = 500; var sun = new Actor("Sun Light"); - sun.Components.Add(new DirectionalLightComponent(MathF.PI, new Vector3(1.0f, 0.87f, 0.72f), new Transform(new Vector3(16.5f, 0, 0), new Quaternion(new Vector3(0.5f, -0.5f, 0.0f), 1.0f)), "Directional Light")); + sun.Components.Add(new DirectionalLightComponent(MathF.PI, new Vector3(1.00f, 0.96f, 0.90f), new Transform(new Vector3(-distance, distance, distance), new Vector3(140, 37, 0)), "Directional Light")); scene.Children.Add(sun); return scene; diff --git a/Snooper b/Snooper index 5c3e4fcc..89613470 160000 --- a/Snooper +++ b/Snooper @@ -1 +1 @@ -Subproject commit 5c3e4fcc89f0ab3f2e68790a84b29625cd214f0b +Subproject commit 896134700b71ea5cf5373764d7ec23c5e5eeee86