diff --git a/CUE4Parse b/CUE4Parse index 27580a04..b6dfd4cd 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit 27580a04fd5a32572300c2a8f1d4d821a6634843 +Subproject commit b6dfd4cd53a99b48850e0b2f9f00321816643f99 diff --git a/FModel/FModel.csproj b/FModel/FModel.csproj index e8971df2..3bf68654 100644 --- a/FModel/FModel.csproj +++ b/FModel/FModel.csproj @@ -140,22 +140,22 @@ - + - - + + - + - + - - + + diff --git a/FModel/Framework/ImGuiController.cs b/FModel/Framework/ImGuiController.cs index 3c099c7b..9077553b 100644 --- a/FModel/Framework/ImGuiController.cs +++ b/FModel/Framework/ImGuiController.cs @@ -440,7 +440,7 @@ private void RenderImDrawData(ImDrawDataPtr draw_data) GL.BindBuffer(BufferTarget.ArrayBuffer, _vertexBuffer); for (int i = 0; i < draw_data.CmdListsCount; i++) { - ImDrawListPtr cmd_list = draw_data.CmdListsRange[i]; + ImDrawListPtr cmd_list = draw_data.CmdLists[i]; int vertexSize = cmd_list.VtxBuffer.Size * Unsafe.SizeOf(); if (vertexSize > _vertexBufferSize) @@ -490,7 +490,7 @@ private void RenderImDrawData(ImDrawDataPtr draw_data) // Render command lists for (int n = 0; n < draw_data.CmdListsCount; n++) { - ImDrawListPtr cmd_list = draw_data.CmdListsRange[n]; + ImDrawListPtr cmd_list = draw_data.CmdLists[n]; GL.BufferSubData(BufferTarget.ArrayBuffer, IntPtr.Zero, cmd_list.VtxBuffer.Size * Unsafe.SizeOf(), cmd_list.VtxBuffer.Data); CheckGLError($"Data Vert {n}"); diff --git a/FModel/Views/Snooper/Renderer.cs b/FModel/Views/Snooper/Renderer.cs index 5f2b8e22..568cf9f2 100644 --- a/FModel/Views/Snooper/Renderer.cs +++ b/FModel/Views/Snooper/Renderer.cs @@ -454,34 +454,57 @@ private void WorldLight(UObject actor) private void WorldMesh(UObject actor, Transform transform) { - if (!actor.TryGetValue(out FPackageIndex staticMeshComponent, "StaticMeshComponent", "StaticMesh", "Mesh", "LightMesh") || - !staticMeshComponent.TryLoad(out UStaticMeshComponent staticMeshComp) || - !staticMeshComp.GetStaticMesh().TryLoad(out UStaticMesh m) || m.Materials.Length < 1) - return; + if (actor.TryGetValue(out FPackageIndex[] instanceComponents, "InstanceComponents")) + { + foreach (var component in instanceComponents) + { + if (!component.TryLoad(out UInstancedStaticMeshComponent staticMeshComp) || + !staticMeshComp.GetStaticMesh().TryLoad(out UStaticMesh m) || m.Materials.Length < 1) + continue; - var guid = m.LightingGuid; - var t = new Transform + if (staticMeshComp.PerInstanceSMData is { Length: > 0 }) + { + + var relation = CalculateTransform(staticMeshComp, transform); + foreach (var perInstanceData in staticMeshComp.PerInstanceSMData) + { + ProcessMesh(actor, staticMeshComp, m, new Transform + { + Relation = relation.Matrix, + Position = perInstanceData.TransformData.Translation * Constants.SCALE_DOWN_RATIO, + Rotation = perInstanceData.TransformData.Rotation, + Scale = perInstanceData.TransformData.Scale3D + }); + } + } + else ProcessMesh(actor, staticMeshComp, m, CalculateTransform(staticMeshComp, transform)); + } + } + else if (actor.TryGetValue(out FPackageIndex staticMeshComponent, "StaticMeshComponent", "StaticMesh", "Mesh", "LightMesh") && + staticMeshComponent.TryLoad(out UStaticMeshComponent staticMeshComp) && + staticMeshComp.GetStaticMesh().TryLoad(out UStaticMesh m) && m.Materials.Length > 0) { - Relation = transform.Matrix, - Position = staticMeshComp.GetOrDefault("RelativeLocation", FVector.ZeroVector) * Constants.SCALE_DOWN_RATIO, - Rotation = staticMeshComp.GetOrDefault("RelativeRotation", FRotator.ZeroRotator).Quaternion(), - Scale = staticMeshComp.GetOrDefault("RelativeScale3D", FVector.OneVector) - }; + ProcessMesh(actor, staticMeshComp, m, CalculateTransform(staticMeshComp, transform)); + } + } + + private void ProcessMesh(UObject actor, UStaticMeshComponent staticMeshComp, UStaticMesh m, Transform transform) + { + var guid = m.LightingGuid; OverrideVertexColors(staticMeshComp, m); if (Options.TryGetModel(guid, out var model)) { - model.AddInstance(t); + model.AddInstance(transform); } else if (m.TryConvert(out var mesh)) { - model = new StaticModel(m, mesh, t); + model = new StaticModel(m, mesh, transform); model.IsTwoSided = actor.GetOrDefault("bMirrored", staticMeshComp.GetOrDefault("bDisallowMeshPaintPerInstance", model.IsTwoSided)); - if (actor.TryGetValue(out FPackageIndex baseMaterial, "BaseMaterial") && - actor.TryGetAllValues(out FPackageIndex[] textureData, "TextureData")) + if (actor.TryGetAllValues(out FPackageIndex[] textureData, "TextureData")) { - var material = model.Materials.FirstOrDefault(x => x.Name == baseMaterial.Name); + var material = model.Materials.FirstOrDefault(); if (material is { IsUsed: true }) { for (int j = 0; j < textureData.Length; j++) @@ -520,7 +543,9 @@ private void WorldMesh(UObject actor, Transform transform) for (var j = 0; j < overrideMaterials.Length && j < model.Sections.Length; j++) { var matIndex = model.Sections[j].MaterialIndex; - if (!(model.Materials[matIndex].IsUsed && overrideMaterials[matIndex].Load() is UMaterialInterface unrealMaterial)) continue; + if (matIndex < 0 || matIndex >= model.Materials.Length || matIndex >= overrideMaterials.Length || + overrideMaterials[matIndex].Load() is not UMaterialInterface unrealMaterial) continue; + model.Materials[matIndex].SwapMaterial(unrealMaterial); } } @@ -531,15 +556,26 @@ private void WorldMesh(UObject actor, Transform transform) if (actor.TryGetValue(out FPackageIndex treasureLight, "PointLight", "TreasureLight") && treasureLight.TryLoad(out var pl1) && pl1.Template.TryLoad(out var pl2)) { - Options.Lights.Add(new PointLight(guid, Options.Icons["pointlight"], pl1, pl2, t)); + Options.Lights.Add(new PointLight(guid, Options.Icons["pointlight"], pl1, pl2, transform)); } if (actor.TryGetValue(out FPackageIndex spotLight, "SpotLight") && spotLight.TryLoad(out var sl1) && sl1.Template.TryLoad(out var sl2)) { - Options.Lights.Add(new SpotLight(guid, Options.Icons["spotlight"], sl1, sl2, t)); + Options.Lights.Add(new SpotLight(guid, Options.Icons["spotlight"], sl1, sl2, transform)); } } + private Transform CalculateTransform(UStaticMeshComponent staticMeshComp, Transform relation) + { + return new Transform + { + Relation = relation.Matrix, + Position = staticMeshComp.GetOrDefault("RelativeLocation", FVector.ZeroVector) * Constants.SCALE_DOWN_RATIO, + Rotation = staticMeshComp.GetOrDefault("RelativeRotation", FRotator.ZeroRotator).Quaternion(), + Scale = staticMeshComp.GetOrDefault("RelativeScale3D", FVector.OneVector) + }; + } + private void OverrideVertexColors(UStaticMeshComponent staticMeshComp, UStaticMesh staticMesh) { if (staticMeshComp.LODData is not { Length: > 0 } || staticMesh.RenderData is not { LODs.Length: > 0 })