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 })