From d63880e958820b058dab45627a311ff0ab019898 Mon Sep 17 00:00:00 2001 From: Justin113D Date: Fri, 13 Feb 2026 22:12:35 +0100 Subject: [PATCH] Fixed basic mesh npoly conversion --- .../Mesh/Converters/BasicConverter.cs | 18 +++++++++--------- .../Mesh/Converters/ChunkConverter.cs | 6 +++--- .../Mesh/Converters/FromWeightedConverter.cs | 4 ++-- .../Converters/FromWeldedBasicConverter.cs | 6 +++--- .../Mesh/Converters/GCConverter.cs | 2 +- .../Mesh/Converters/ToWeightedConverter.cs | 4 ++-- src/SA3D.Modeling/Mesh/Gamecube/GCAttach.cs | 3 +-- .../Mesh/Weighted/WeightedMesh.cs | 6 +++--- src/SA3D.Modeling/ObjectData/LandTable.cs | 4 ++-- 9 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/SA3D.Modeling/Mesh/Converters/BasicConverter.cs b/src/SA3D.Modeling/Mesh/Converters/BasicConverter.cs index fa53875..fa89d74 100644 --- a/src/SA3D.Modeling/Mesh/Converters/BasicConverter.cs +++ b/src/SA3D.Modeling/Mesh/Converters/BasicConverter.cs @@ -253,7 +253,7 @@ public static void ConvertWeightedToBasic( weightedMesh.TriangleSets, weightedMesh.Materials, weightedMesh.HasColors, - weightedMesh.Label ?? "BASIC_" + StringExtensions.GenerateIdentifier()); + weightedMesh.Label ?? ("BASIC_" + StringExtensions.GenerateIdentifier())); if(optimize) { @@ -332,6 +332,7 @@ public static void ConvertPolygons(BasicMesh mesh, out BufferCorner[] corners, o { BufferCorner[] strip = new BufferCorner[poly.Indices.Length]; + /* This is how NPolys should work IF sonic team had implemented them correctly if(mesh.PolygonType == BasicPolygonType.NPoly) { strip[0] = new BufferCorner( @@ -368,15 +369,14 @@ public static void ConvertPolygons(BasicMesh mesh, out BufferCorner[] corners, o absoluteIndex += strip.Length; } - else + */ + + for(int i = 0; i < strip.Length; i++, absoluteIndex++) { - for(int i = 0; i < strip.Length; i++, absoluteIndex++) - { - strip[i] = new BufferCorner( - poly.Indices[i], - mesh.Colors?[absoluteIndex] ?? BufferMesh.DefaultColor, - mesh.Texcoords?[absoluteIndex] ?? Vector2.Zero); - } + strip[i] = new BufferCorner( + poly.Indices[i], + mesh.Colors?[absoluteIndex] ?? BufferMesh.DefaultColor, + mesh.Texcoords?[absoluteIndex] ?? Vector2.Zero); } strips[stripNum] = strip; diff --git a/src/SA3D.Modeling/Mesh/Converters/ChunkConverter.cs b/src/SA3D.Modeling/Mesh/Converters/ChunkConverter.cs index 7c223e5..4ed7ca98 100644 --- a/src/SA3D.Modeling/Mesh/Converters/ChunkConverter.cs +++ b/src/SA3D.Modeling/Mesh/Converters/ChunkConverter.cs @@ -220,7 +220,7 @@ private static ChunkResult ConvertWeightedBinaryColored(WeightedMesh wba) attaches.Add(new(new[] { lastVertexChunk }, polyChunks.ToArray())); return new( - wba.Label ?? "CHUNK_" + StringExtensions.GenerateIdentifier(), + wba.Label ?? ("CHUNK_" + StringExtensions.GenerateIdentifier()), sortedVertices.Length, true, nodeAttachIndices.ToArray(), @@ -411,7 +411,7 @@ private static ChunkResult ConvertWeighted(WeightedMesh wba) attaches.Add(new(lastVertexChunk, polyChunks.ToArray())); return new( - wba.Label ?? "CHUNK_" + StringExtensions.GenerateIdentifier(), + wba.Label ?? ("CHUNK_" + StringExtensions.GenerateIdentifier()), wba.Vertices.Length, true, nodeAttachIndices.ToArray(), @@ -535,7 +535,7 @@ protected override ChunkResult ConvertWeightless(WeightedMesh wba, bool optimize } return new( - wba.Label ?? "CHUNK_" + StringExtensions.GenerateIdentifier(), + wba.Label ?? ("CHUNK_" + StringExtensions.GenerateIdentifier()), vertices.Length, false, wba.RootIndices.ToArray(), diff --git a/src/SA3D.Modeling/Mesh/Converters/FromWeightedConverter.cs b/src/SA3D.Modeling/Mesh/Converters/FromWeightedConverter.cs index 8b638ef..167678c 100644 --- a/src/SA3D.Modeling/Mesh/Converters/FromWeightedConverter.cs +++ b/src/SA3D.Modeling/Mesh/Converters/FromWeightedConverter.cs @@ -109,7 +109,7 @@ protected override BufferResult ConvertWeighted(WeightedMesh wba, bool optimize) attaches[lastIndex] = new(meshes.ToArray()); return new( - wba.Label ?? "BUFFER_" + StringExtensions.GenerateIdentifier(), + wba.Label ?? ("BUFFER_" + StringExtensions.GenerateIdentifier()), wba.Vertices.Length, true, nodeIndices, @@ -138,7 +138,7 @@ protected override BufferResult ConvertWeightless(WeightedMesh wba, bool optimiz BufferMesh[] result = BufferMesh.CompressLayout(meshes); return new( - wba.Label ?? "BUFFER_" + StringExtensions.GenerateIdentifier(), + wba.Label ?? ("BUFFER_" + StringExtensions.GenerateIdentifier()), vertices.Length, false, wba.RootIndices.ToArray(), diff --git a/src/SA3D.Modeling/Mesh/Converters/FromWeldedBasicConverter.cs b/src/SA3D.Modeling/Mesh/Converters/FromWeldedBasicConverter.cs index f987d98..69e840b 100644 --- a/src/SA3D.Modeling/Mesh/Converters/FromWeldedBasicConverter.cs +++ b/src/SA3D.Modeling/Mesh/Converters/FromWeldedBasicConverter.cs @@ -308,7 +308,7 @@ private void CollectPolygons() } else { - polygonCorners.Add(new(resultCorners)); + polygonCorners.Add([.. resultCorners]); materials.Add(material); } } @@ -325,7 +325,7 @@ private void RemoveUnusedVertices() .Select(x => x.VertexIndex) .ToHashSet(); - List newVertices = new(_outVertices); + List newVertices = [.. _outVertices]; ushort[] map = new ushort[_outVertices.Length]; ushort realIndex = (ushort)(usedVertices.Count - 1); @@ -391,7 +391,7 @@ public static WeightedMesh[] CreateWeightedFromWeldedBasicModel(Node model, Node foreach(Node[] group in weldingGroups) { - SortedSet dependencyNodes = new(group.Select(x => nodeIndices[x])); + SortedSet dependencyNodes = [.. group.Select(x => nodeIndices[x])]; int rootNodeIndex = ToWeightedConverter.ComputeCommonNodeIndex(nodes, dependencyNodes); WeightedMesh? mesh = new FromWeldedBasicConverter(nodes[rootNodeIndex], group, nodeIndices).Process(); diff --git a/src/SA3D.Modeling/Mesh/Converters/GCConverter.cs b/src/SA3D.Modeling/Mesh/Converters/GCConverter.cs index 8d44ee1..fa82feb 100644 --- a/src/SA3D.Modeling/Mesh/Converters/GCConverter.cs +++ b/src/SA3D.Modeling/Mesh/Converters/GCConverter.cs @@ -300,7 +300,7 @@ GCMesh[] ProcessBufferMeshes(List meshIndices) GCAttach result = new(vertexData, opaqueMeshes, translucentMeshes) { - Label = weightedMesh.Label ?? "GC_" + StringExtensions.GenerateIdentifier() + Label = weightedMesh.Label ?? ("GC_" + StringExtensions.GenerateIdentifier()) }; if(optimize) diff --git a/src/SA3D.Modeling/Mesh/Converters/ToWeightedConverter.cs b/src/SA3D.Modeling/Mesh/Converters/ToWeightedConverter.cs index 6c5b2ba..6e80a7a 100644 --- a/src/SA3D.Modeling/Mesh/Converters/ToWeightedConverter.cs +++ b/src/SA3D.Modeling/Mesh/Converters/ToWeightedConverter.cs @@ -412,9 +412,9 @@ private void EvaluateMesh() } else { - SortedSet absoluteDepends = new(dependingMeshNodeIndices.Select(x => _meshNodeIndexMapping[x])); + SortedSet absoluteDepends = [.. dependingMeshNodeIndices.Select(x => _meshNodeIndexMapping[x])]; rootNodeIndex = ComputeCommonNodeIndex(_nodes, absoluteDepends); - dependingRelativeNodeIndices = new(absoluteDepends.Select(x => x - rootNodeIndex)); + dependingRelativeNodeIndices = [.. absoluteDepends.Select(x => x - rootNodeIndex)]; vertices = EvaluateWeightVertices(dependingMeshNodeIndices, rootNodeIndex, out hasNormals); label = _nodes[absoluteDepends.Max].Attach!.Label; diff --git a/src/SA3D.Modeling/Mesh/Gamecube/GCAttach.cs b/src/SA3D.Modeling/Mesh/Gamecube/GCAttach.cs index 8d17a79..6795727 100644 --- a/src/SA3D.Modeling/Mesh/Gamecube/GCAttach.cs +++ b/src/SA3D.Modeling/Mesh/Gamecube/GCAttach.cs @@ -95,8 +95,7 @@ public override bool CanWrite(ModelFormat format) /// public void OptimizeVertexData() { - List allMeshes = new(OpaqueMeshes); - allMeshes.AddRange(TransparentMeshes); + List allMeshes = [.. OpaqueMeshes, .. TransparentMeshes]; foreach(GCVertexSet item in VertexData.Values) { diff --git a/src/SA3D.Modeling/Mesh/Weighted/WeightedMesh.cs b/src/SA3D.Modeling/Mesh/Weighted/WeightedMesh.cs index 58756be..0bf9a97 100644 --- a/src/SA3D.Modeling/Mesh/Weighted/WeightedMesh.cs +++ b/src/SA3D.Modeling/Mesh/Weighted/WeightedMesh.cs @@ -325,7 +325,7 @@ private static void GetTexcoordPrecisionLevel(Node model, WeightedMesh[] meshes, /// public Attach ToAttach(AttachFormat format, bool optimize, out int[]?[] vertexMapping) { - HashSet backup = new(RootIndices); + HashSet backup = [.. RootIndices]; RootIndices.Clear(); RootIndices.Add(0); @@ -662,8 +662,8 @@ public WeightedMesh Clone() Vertices.ContentClone(), TriangleSets.ContentClone(), Materials.ToArray(), - new(RootIndices), - new(DependingNodeIndices), + [.. RootIndices], + [.. DependingNodeIndices], HasColors, HasNormals); } diff --git a/src/SA3D.Modeling/ObjectData/LandTable.cs b/src/SA3D.Modeling/ObjectData/LandTable.cs index 10999cf..4b50e4e 100644 --- a/src/SA3D.Modeling/ObjectData/LandTable.cs +++ b/src/SA3D.Modeling/ObjectData/LandTable.cs @@ -512,7 +512,7 @@ LabeledArray onReadGeometry(uint geometryAddr) geometry = data.TryReadPointer(geometryLoc, out uint geometryAddr) ? lut.GetAddLabeledValue(geometryAddr, "collist_", onReadGeometry) - : (ILabeledArray)new LabeledArray("collist_" + identifier, 0); + : new LabeledArray("collist_" + identifier, 0); LabeledArray onReadAnims() { @@ -529,7 +529,7 @@ LabeledArray onReadAnims() anim = animAddr != 0 ? lut.GetAddLabeledValue(animAddr, "animlist_", onReadAnims) - : (ILabeledArray)new LabeledArray("animlist_" + identifier, 0); + : new LabeledArray("animlist_" + identifier, 0); if(data.TryReadPointer(texNameLoc, out uint texNameAddr)) {