From 1795fcdf26733fc283bba759e7e0f40e2e80c966 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Sun, 5 Nov 2023 01:08:08 +0900 Subject: [PATCH 1/8] feat(meshinfo2): basic support for non-triangle meshes --- Editor/Processors/SkinnedMeshes/MeshInfo2.cs | 86 +++++++++++--------- 1 file changed, 49 insertions(+), 37 deletions(-) diff --git a/Editor/Processors/SkinnedMeshes/MeshInfo2.cs b/Editor/Processors/SkinnedMeshes/MeshInfo2.cs index 55051b66d..ea78f4f63 100644 --- a/Editor/Processors/SkinnedMeshes/MeshInfo2.cs +++ b/Editor/Processors/SkinnedMeshes/MeshInfo2.cs @@ -124,7 +124,7 @@ private void SetMaterials(Renderer renderer) public void AssertInvariantContract(string context) { var vertices = new HashSet(Vertices); - Debug.Assert(SubMeshes.SelectMany(x => x.Triangles).All(vertices.Contains), + Debug.Assert(SubMeshes.SelectMany(x => x.Vertices).All(vertices.Contains), $"{context}: some SubMesh has invalid triangles"); var bones = new HashSet(Bones); Debug.Assert(Vertices.SelectMany(x => x.BoneWeights).Select(x => x.bone).All(bones.Contains), @@ -336,11 +336,15 @@ public void ReadStaticMesh([NotNull] Mesh mesh) // ReSharper restore AccessToModifiedClosure } - var triangles = mesh.triangles; SubMeshes.Clear(); SubMeshes.Capacity = Math.Max(SubMeshes.Capacity, mesh.subMeshCount); + + var triangles = new List(); for (var i = 0; i < mesh.subMeshCount; i++) + { + mesh.GetIndices(triangles, i); SubMeshes.Add(new SubMesh(Vertices, triangles, mesh.GetSubMesh(i))); + } Profiler.EndSample(); } @@ -412,7 +416,7 @@ public void FlattenMultiPassRendering(string reasonComponent) SubMeshes.Clear(); foreach (var subMesh in subMeshes) foreach (var material in subMesh.SharedMaterials) - SubMeshes.Add(new SubMesh(subMesh.Triangles, material)); + SubMeshes.Add(new SubMesh(subMesh, material)); } public void WriteToMesh(Mesh destMesh) @@ -512,59 +516,50 @@ public void WriteToMesh(Mesh destMesh) for (var i = 0; i < Vertices.Count; i++) vertexIndices.Add(Vertices[i], i); - var totalTriangles = 0; + var maxIndices = 0; var totalSubMeshes = 0; for (var i = 0; i < SubMeshes.Count - 1; i++) { + maxIndices = Mathf.Max(maxIndices, SubMeshes[i].Vertices.Count); // for non-last submesh, we have to duplicate submesh for multi pass rendering for (var j = 0; j < SubMeshes[i].SharedMaterials.Length; j++) - { - totalTriangles += SubMeshes[i].Triangles.Count; totalSubMeshes++; - } } { + maxIndices = Mathf.Max(maxIndices, SubMeshes[SubMeshes.Count - 1].Vertices.Count); // for last submesh, we can use single submesh for multi pass reendering - totalTriangles += SubMeshes[SubMeshes.Count - 1].Triangles.Count; totalSubMeshes++; } - var triangles = new int[totalTriangles]; - var subMeshDescriptors = new SubMeshDescriptor[totalSubMeshes]; - var trianglesIndex = 0; + var indices = new int[maxIndices]; var submeshIndex = 0; + destMesh.indexFormat = Vertices.Count <= ushort.MaxValue ? IndexFormat.UInt16 : IndexFormat.UInt32; + destMesh.subMeshCount = totalSubMeshes; + for (var i = 0; i < SubMeshes.Count - 1; i++) { var subMesh = SubMeshes[i]; - var descriptor = new SubMeshDescriptor(trianglesIndex, subMesh.Triangles.Count); - foreach (var triangle in subMesh.Triangles) - triangles[trianglesIndex++] = vertexIndices[triangle]; + + for (var index = 0; index < subMesh.Vertices.Count; index++) + indices[index] = vertexIndices[subMesh.Vertices[index]]; // general case: for non-last submesh, we have to duplicate submesh for multi pass rendering for (var j = 0; j < subMesh.SharedMaterials.Length; j++) - subMeshDescriptors[submeshIndex++] = descriptor; + destMesh.SetIndices(indices, 0, subMesh.Vertices.Count, subMesh.Topology, submeshIndex++); } { var subMesh = SubMeshes[SubMeshes.Count - 1]; - var descriptor = new SubMeshDescriptor(trianglesIndex, subMesh.Triangles.Count); - foreach (var triangle in subMesh.Triangles) - triangles[trianglesIndex++] = vertexIndices[triangle]; + for (var index = 0; index < subMesh.Vertices.Count; index++) + indices[index] = vertexIndices[subMesh.Vertices[index]]; // for last submesh, we can use single submesh for multi pass reendering - subMeshDescriptors[submeshIndex++] = descriptor; + destMesh.SetIndices(indices, 0, subMesh.Vertices.Count, subMesh.Topology, submeshIndex++); } - Debug.Assert(subMeshDescriptors.Length == submeshIndex); - Debug.Assert(triangles.Length == trianglesIndex); - - destMesh.indexFormat = Vertices.Count <= ushort.MaxValue ? IndexFormat.UInt16 : IndexFormat.UInt32; - destMesh.triangles = triangles; - destMesh.subMeshCount = submeshIndex; - for (var i = 0; i < subMeshDescriptors.Length; i++) - destMesh.SetSubMesh(i, subMeshDescriptors[i]); + Debug.Assert(totalSubMeshes == submeshIndex); } Profiler.EndSample(); @@ -674,8 +669,19 @@ public void WriteToMeshRenderer(MeshRenderer targetRenderer) internal class SubMesh { + public readonly MeshTopology Topology = MeshTopology.Triangles; + // size of this must be 3 * n - public readonly List Triangles = new List(); + public List Triangles + { + get + { + Assert.AreEqual(MeshTopology.Triangles, Topology); + return Vertices; + } + } + + public List Vertices { get; } = new List(); public Material SharedMaterial { @@ -689,18 +695,24 @@ public SubMesh() { } - public SubMesh(List vertices) => Triangles = vertices; + public SubMesh(List vertices) => Vertices = vertices; public SubMesh(List vertices, Material sharedMaterial) => - (Triangles, SharedMaterial) = (vertices, sharedMaterial); - public SubMesh(Material sharedMaterial) => - SharedMaterial = sharedMaterial; + (Vertices, SharedMaterial) = (vertices, sharedMaterial); + public SubMesh(Material sharedMaterial) => SharedMaterial = sharedMaterial; + + public SubMesh(SubMesh subMesh, Material triangles) + { + Topology = subMesh.Topology; + Vertices = new List(subMesh.Vertices); + SharedMaterial = triangles; + } - public SubMesh(List vertices, ReadOnlySpan triangles, SubMeshDescriptor descriptor) + public SubMesh(List vertices, List triangles, SubMeshDescriptor descriptor) { - Assert.AreEqual(MeshTopology.Triangles, descriptor.topology); - Triangles.Capacity = descriptor.indexCount; - foreach (var i in triangles.Slice(descriptor.indexStart, descriptor.indexCount)) - Triangles.Add(vertices[i]); + Topology = descriptor.topology; + Vertices.Capacity = descriptor.indexCount; + foreach (var i in triangles) + Vertices.Add(vertices[i]); } } From 26112cdad69baa39f4c8cff4c7c44ca52fdbb9d6 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Sun, 5 Nov 2023 02:25:24 +0900 Subject: [PATCH 2/8] feat: non-triangle support for RemoveMesh* components --- Editor/Processors/SkinnedMeshes/MeshInfo2.cs | 47 +++++++++++++++++++ .../RemoveMeshByBlendShapeProcessor.cs | 23 ++------- .../SkinnedMeshes/RemoveMeshInBoxProcessor.cs | 26 ++-------- Localization/en.po | 3 ++ Localization/ja.po | 3 ++ 5 files changed, 61 insertions(+), 41 deletions(-) diff --git a/Editor/Processors/SkinnedMeshes/MeshInfo2.cs b/Editor/Processors/SkinnedMeshes/MeshInfo2.cs index ea78f4f63..fe0dec4a6 100644 --- a/Editor/Processors/SkinnedMeshes/MeshInfo2.cs +++ b/Editor/Processors/SkinnedMeshes/MeshInfo2.cs @@ -714,6 +714,53 @@ public SubMesh(List vertices, List triangles, SubMeshDescriptor des foreach (var i in triangles) Vertices.Add(vertices[i]); } + + public bool TryGetPrimitiveSize(string component, out int primitiveSize) + { + switch (Topology) + { + case MeshTopology.Triangles: + primitiveSize = 3; + return true; + case MeshTopology.Quads: + primitiveSize = 4; + return true; + case MeshTopology.Lines: + primitiveSize = 2; + return true; + case MeshTopology.Points: + primitiveSize = 1; + return true; + case MeshTopology.LineStrip: + BuildReport.LogWarning("MeshInfo2:warning:lineStrip", component); + primitiveSize = default; + return false; + default: + throw new ArgumentOutOfRangeException(); + } + } + + public void RemovePrimitives(string component, Func condition) + { + if (!TryGetPrimitiveSize(component, out var primitiveSize)) + return; + var primitiveBuffer = new Vertex[primitiveSize]; + int srcI = 0, dstI = 0; + for (; srcI < Vertices.Count; srcI += primitiveSize) + { + for (var i = 0; i < primitiveSize; i++) + primitiveBuffer[i] = Vertices[srcI + i]; + + if (condition(primitiveBuffer)) + continue; + + // no vertex is in box: + for (var i = 0; i < primitiveSize; i++) + Vertices[dstI + i] = primitiveBuffer[i]; + dstI += primitiveSize; + } + Vertices.RemoveRange(dstI, Vertices.Count - dstI); + } } internal class Vertex diff --git a/Editor/Processors/SkinnedMeshes/RemoveMeshByBlendShapeProcessor.cs b/Editor/Processors/SkinnedMeshes/RemoveMeshByBlendShapeProcessor.cs index 95ae1d4e0..96a571f45 100644 --- a/Editor/Processors/SkinnedMeshes/RemoveMeshByBlendShapeProcessor.cs +++ b/Editor/Processors/SkinnedMeshes/RemoveMeshByBlendShapeProcessor.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using nadena.dev.ndmf; @@ -26,27 +27,9 @@ public override void Process(BuildContext context, MeshInfo2 target) byBlendShapeVertices.Add(vertex); } + Func condition = primitive => primitive.Any(byBlendShapeVertices.Contains); foreach (var subMesh in target.SubMeshes) - { - int srcI = 0, dstI = 0; - for (; srcI < subMesh.Triangles.Count; srcI += 3) - { - // process 3 vertex in sub mesh at once to process one polygon - var v0 = subMesh.Triangles[srcI + 0]; - var v1 = subMesh.Triangles[srcI + 1]; - var v2 = subMesh.Triangles[srcI + 2]; - - if (byBlendShapeVertices.Contains(v0) || byBlendShapeVertices.Contains(v1) || byBlendShapeVertices.Contains(v2)) - continue; - - // no vertex is affected by the blend shape: - subMesh.Triangles[dstI + 0] = v0; - subMesh.Triangles[dstI + 1] = v1; - subMesh.Triangles[dstI + 2] = v2; - dstI += 3; - } - subMesh.Triangles.RemoveRange(dstI, subMesh.Triangles.Count - dstI); - } + subMesh.RemovePrimitives("RemoveMeshByBlendShape", condition); // remove unused vertices target.Vertices.RemoveAll(x => byBlendShapeVertices.Contains(x)); diff --git a/Editor/Processors/SkinnedMeshes/RemoveMeshInBoxProcessor.cs b/Editor/Processors/SkinnedMeshes/RemoveMeshInBoxProcessor.cs index fef449231..9125830d0 100644 --- a/Editor/Processors/SkinnedMeshes/RemoveMeshInBoxProcessor.cs +++ b/Editor/Processors/SkinnedMeshes/RemoveMeshInBoxProcessor.cs @@ -1,5 +1,7 @@ +using System; using System.Collections.Generic; using System.Linq; +using Anatawa12.AvatarOptimizer.ErrorReporting; using nadena.dev.ndmf; using UnityEngine; @@ -24,27 +26,9 @@ public override void Process(BuildContext context, MeshInfo2 target) inBoxVertices.Add(vertex); } + Func condition = primitive => primitive.All(inBoxVertices.Contains); foreach (var subMesh in target.SubMeshes) - { - int srcI = 0, dstI = 0; - for (; srcI < subMesh.Triangles.Count; srcI += 3) - { - // process 3 vertex in sub mesh at once to process one polygon - var v0 = subMesh.Triangles[srcI + 0]; - var v1 = subMesh.Triangles[srcI + 1]; - var v2 = subMesh.Triangles[srcI + 2]; - - if (inBoxVertices.Contains(v0) && inBoxVertices.Contains(v1) && inBoxVertices.Contains(v2)) - continue; - - // some vertex is not in box: - subMesh.Triangles[dstI + 0] = v0; - subMesh.Triangles[dstI + 1] = v1; - subMesh.Triangles[dstI + 2] = v2; - dstI += 3; - } - subMesh.Triangles.RemoveRange(dstI, subMesh.Triangles.Count - dstI); - } + subMesh.RemovePrimitives("RemoveMeshInBox", condition); // We don't need to reset AdditionalTemporal because if out of box, it always be used. // Vertex.AdditionalTemporal: 0 if unused, 1 if used @@ -52,7 +36,7 @@ public override void Process(BuildContext context, MeshInfo2 target) inBoxVertices.Clear(); var usingVertices = inBoxVertices; foreach (var subMesh in target.SubMeshes) - foreach (var vertex in subMesh.Triangles) + foreach (var vertex in subMesh.Vertices) usingVertices.Add(vertex); // remove unused vertices diff --git a/Localization/en.po b/Localization/en.po index 23a0b4339..26e4712d4 100644 --- a/Localization/en.po +++ b/Localization/en.po @@ -451,6 +451,9 @@ msgstr "" "There's no big difference in actual performance, but the number of polygons in the performance rank will increase.\n" "Using multi pass rendering often not be intended. Please check if you intended to use multi pass rendering." +msgid "MeshInfo2:warning:lineStrip" +msgstr "SubMesh with LineStrip will be skipped with {0} Component." + #endregion # region ErrorReporter diff --git a/Localization/ja.po b/Localization/ja.po index a8bb2af39..b93963d65 100644 --- a/Localization/ja.po +++ b/Localization/ja.po @@ -387,6 +387,9 @@ msgstr "" "実際の負荷に大きな差はありませんが、パフォーマンスランクにおけるポリゴン数が増えるなどの影響があります。\n" "マルチパスレンダリングの使用が意図したものであるかを確認してください。" +msgid "MeshInfo2:warning:lineStrip" +msgstr "LineStripを使用しているSubMeshは{0}コンポーネントによってスキップされます。" + #endregion # region ErrorReporter From 51d0fa13aa4841abae9a19fba798b42d15005f12 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Sun, 5 Nov 2023 02:37:07 +0900 Subject: [PATCH 3/8] feat: support non-triangle topology in MergeSkinnedMesh --- .../MergeSkinnedMeshProcessor.cs | 20 ++++++++++++------- Editor/Processors/SkinnedMeshes/MeshInfo2.cs | 2 ++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Editor/Processors/SkinnedMeshes/MergeSkinnedMeshProcessor.cs b/Editor/Processors/SkinnedMeshes/MergeSkinnedMeshProcessor.cs index f7e3f222d..9819977c3 100644 --- a/Editor/Processors/SkinnedMeshes/MergeSkinnedMeshProcessor.cs +++ b/Editor/Processors/SkinnedMeshes/MergeSkinnedMeshProcessor.cs @@ -52,7 +52,7 @@ public override void Process(BuildContext context, MeshInfo2 target) foreach (var meshInfo2 in meshInfos) meshInfo2.FlattenMultiPassRendering("Merge Skinned Mesh"); - var sourceMaterials = meshInfos.Select(x => x.SubMeshes.Select(y => y.SharedMaterial).ToArray()).ToArray(); + var sourceMaterials = meshInfos.Select(x => x.SubMeshes.Select(y => (y.Topology, y.SharedMaterial)).ToArray()).ToArray(); Profiler.EndSample(); Profiler.BeginSample("Material Normal Configuration Check"); @@ -97,7 +97,7 @@ public override void Process(BuildContext context, MeshInfo2 target) target.Clear(); target.SubMeshes.Capacity = Math.Max(target.SubMeshes.Capacity, materials.Count); foreach (var material in materials) - target.SubMeshes.Add(new SubMesh(material)); + target.SubMeshes.Add(new SubMesh(material.material, material.topology)); TexCoordStatus TexCoordStatusMax(TexCoordStatus x, TexCoordStatus y) => (TexCoordStatus)Math.Max((int)x, (int)y); @@ -124,7 +124,10 @@ TexCoordStatus TexCoordStatusMax(TexCoordStatus x, TexCoordStatus y) => for (var j = 0; j < meshInfo.SubMeshes.Count; j++) { var targetSubMeshIndex = subMeshIndexMap[i][j]; - target.SubMeshes[targetSubMeshIndex].Triangles.AddRange(meshInfo.SubMeshes[j].Triangles); + var targetSubMesh = target.SubMeshes[targetSubMeshIndex]; + var sourceSubMesh = meshInfo.SubMeshes[j]; + System.Diagnostics.Debug.Assert(targetSubMesh.Topology == sourceSubMesh.Topology); + targetSubMesh.Vertices.AddRange(sourceSubMesh.Vertices); mappings.Add(($"m_Materials.Array.data[{j}]", $"m_Materials.Array.data[{targetSubMeshIndex}]")); } @@ -252,11 +255,12 @@ TexCoordStatus TexCoordStatusMax(TexCoordStatus x, TexCoordStatus y) => #endif } - private (int[][] mapping, List materials) CreateMergedMaterialsAndSubMeshIndexMapping( - Material[][] sourceMaterials) + private (int[][] mapping, List<(MeshTopology topology, Material material)> materials) + CreateMergedMaterialsAndSubMeshIndexMapping( + (MeshTopology topology, Material material)[][] sourceMaterials) { var doNotMerges = Component.doNotMergeMaterials.GetAsSet(); - var resultMaterials = new List(); + var resultMaterials = new List<(MeshTopology, Material)>(); var resultIndices = new int[sourceMaterials.Length][]; for (var i = 0; i < sourceMaterials.Length; i++) @@ -268,7 +272,7 @@ TexCoordStatus TexCoordStatusMax(TexCoordStatus x, TexCoordStatus y) => { var material = materials[j]; var foundIndex = resultMaterials.IndexOf(material); - if (doNotMerges.Contains(material) || foundIndex == -1) + if (doNotMerges.Contains(material.material) || foundIndex == -1) { indices[j] = resultMaterials.Count; resultMaterials.Add(material); @@ -329,10 +333,12 @@ public Material[] Materials(bool fast = true) { var sourceMaterials = _processor.SkinnedMeshRenderers.Select(EditSkinnedMeshComponentUtil.GetMaterials) .Concat(_processor.StaticMeshRenderers.Select(x => x.sharedMaterials)) + .Select(a => a.Select(b => (MeshTopology.Triangles, b)).ToArray()) .ToArray(); return _processor.CreateMergedMaterialsAndSubMeshIndexMapping(sourceMaterials) .materials + .Select(x => x.material) .ToArray(); } diff --git a/Editor/Processors/SkinnedMeshes/MeshInfo2.cs b/Editor/Processors/SkinnedMeshes/MeshInfo2.cs index fe0dec4a6..2d72136ac 100644 --- a/Editor/Processors/SkinnedMeshes/MeshInfo2.cs +++ b/Editor/Processors/SkinnedMeshes/MeshInfo2.cs @@ -699,6 +699,8 @@ public SubMesh() public SubMesh(List vertices, Material sharedMaterial) => (Vertices, SharedMaterial) = (vertices, sharedMaterial); public SubMesh(Material sharedMaterial) => SharedMaterial = sharedMaterial; + public SubMesh(Material sharedMaterial, MeshTopology topology) => + (SharedMaterial, Topology) = (sharedMaterial, topology); public SubMesh(SubMesh subMesh, Material triangles) { From 657c997b456e4afae4af5b933db654bb4967f20b Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Sun, 5 Nov 2023 02:39:39 +0900 Subject: [PATCH 4/8] feat(merge-toonlit): add support for non-triangle topology --- .../MergeToonLitMaterialProcessor.cs | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Editor/Processors/SkinnedMeshes/MergeToonLitMaterialProcessor.cs b/Editor/Processors/SkinnedMeshes/MergeToonLitMaterialProcessor.cs index 4fc5296a6..2175a0d50 100644 --- a/Editor/Processors/SkinnedMeshes/MergeToonLitMaterialProcessor.cs +++ b/Editor/Processors/SkinnedMeshes/MergeToonLitMaterialProcessor.cs @@ -36,7 +36,7 @@ public override void Process(BuildContext context, MeshInfo2 target) foreach (var v in target.Vertices) users[v] = 0; foreach (var targetSubMesh in target.SubMeshes) - foreach (var v in targetSubMesh.Triangles.Distinct()) + foreach (var v in targetSubMesh.Vertices.Distinct()) users[v]++; // compute per-material data @@ -55,30 +55,30 @@ public override void Process(BuildContext context, MeshInfo2 target) var subMesh = target.SubMeshes[subMeshI]; var targetRect = targetRectForMaterial[subMeshI]; var vertexCache = new Dictionary(); - for (var i = 0; i < subMesh.Triangles.Count; i++) + for (var i = 0; i < subMesh.Vertices.Count; i++) { - if (vertexCache.TryGetValue(subMesh.Triangles[i], out var cached)) + if (vertexCache.TryGetValue(subMesh.Vertices[i], out var cached)) { - subMesh.Triangles[i] = cached; + subMesh.Vertices[i] = cached; continue; } - if (users[subMesh.Triangles[i]] != 1) + if (users[subMesh.Vertices[i]] != 1) { // if there are multiple users for the vertex: duplicate it - var cloned = subMesh.Triangles[i].Clone(); + var cloned = subMesh.Vertices[i].Clone(); target.Vertices.Add(cloned); - users[subMesh.Triangles[i]]--; + users[subMesh.Vertices[i]]--; - vertexCache[subMesh.Triangles[i]] = cloned; - subMesh.Triangles[i] = cloned; + vertexCache[subMesh.Vertices[i]] = cloned; + subMesh.Vertices[i] = cloned; } else { - vertexCache[subMesh.Triangles[i]] = subMesh.Triangles[i]; + vertexCache[subMesh.Vertices[i]] = subMesh.Vertices[i]; } - subMesh.Triangles[i].TexCoord0 = MapUV(subMesh.Triangles[i].TexCoord0, targetRect); + subMesh.Vertices[i].TexCoord0 = MapUV(subMesh.Vertices[i].TexCoord0, targetRect); } } } From a512a6bea9709dd15519f99631aa05496789f49d Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Sun, 5 Nov 2023 02:39:57 +0900 Subject: [PATCH 5/8] chore: use Debug.Assert --- Editor/Processors/SkinnedMeshes/MeshInfo2.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Editor/Processors/SkinnedMeshes/MeshInfo2.cs b/Editor/Processors/SkinnedMeshes/MeshInfo2.cs index 2d72136ac..b86c0a52b 100644 --- a/Editor/Processors/SkinnedMeshes/MeshInfo2.cs +++ b/Editor/Processors/SkinnedMeshes/MeshInfo2.cs @@ -676,7 +676,7 @@ public List Triangles { get { - Assert.AreEqual(MeshTopology.Triangles, Topology); + Debug.Assert(Topology == MeshTopology.Triangles); return Vertices; } } From b091458819d214227ebbd60676bd9ececa26f223 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Sun, 5 Nov 2023 02:43:51 +0900 Subject: [PATCH 6/8] docs(changelog): Support for Mesh Topologies other than Triangles --- CHANGELOG-PRERELEASE.md | 1 + CHANGELOG.md | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG-PRERELEASE.md b/CHANGELOG-PRERELEASE.md index 1ecc230df..e9ddbbc74 100644 --- a/CHANGELOG-PRERELEASE.md +++ b/CHANGELOG-PRERELEASE.md @@ -8,6 +8,7 @@ The format is based on [Keep a Changelog]. ## [Unreleased] ### Added +- Support for Mesh Topologies other than Triangles `#692` ### Changed diff --git a/CHANGELOG.md b/CHANGELOG.md index f30c5edfe..c08d9bd8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ The format is based on [Keep a Changelog]. - If you toggles your clothes with simple toggle, PhysBones on the your avatar will also be toggled automatically! - Small performance improve `#641` - Ability to prevent changing enablement of component `#668` +- Support for Mesh Topologies other than Triangles `#692` ### Changed - All logs passed to ErrorReport is now shown on the console log `#643` From 5e73d48ca4c6c9f56a56b6de3ad41e24b2a7c746 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Sun, 5 Nov 2023 21:42:26 +0900 Subject: [PATCH 7/8] chore(localization): Apply suggestions from code review Co-authored-by: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> --- Localization/ja.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Localization/ja.po b/Localization/ja.po index b93963d65..207ebddee 100644 --- a/Localization/ja.po +++ b/Localization/ja.po @@ -388,7 +388,7 @@ msgstr "" "マルチパスレンダリングの使用が意図したものであるかを確認してください。" msgid "MeshInfo2:warning:lineStrip" -msgstr "LineStripを使用しているSubMeshは{0}コンポーネントによってスキップされます。" +msgstr "{0}コンポーネントはLineStripが使用されているSubMeshをスキップします。" #endregion From 57cd9b3fcff142efcb67cdbba22a14ad87efc8f9 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Mon, 6 Nov 2023 00:40:00 +0900 Subject: [PATCH 8/8] chore(localization): Apply suggestions from code review Co-authored-by: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com> --- Localization/en.po | 2 +- Localization/ja.po | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Localization/en.po b/Localization/en.po index 26e4712d4..d7e7c8d82 100644 --- a/Localization/en.po +++ b/Localization/en.po @@ -452,7 +452,7 @@ msgstr "" "Using multi pass rendering often not be intended. Please check if you intended to use multi pass rendering." msgid "MeshInfo2:warning:lineStrip" -msgstr "SubMesh with LineStrip will be skipped with {0} Component." +msgstr "{0} Component does not process SubMeshes with LineStrip." #endregion diff --git a/Localization/ja.po b/Localization/ja.po index 207ebddee..5d0797cc2 100644 --- a/Localization/ja.po +++ b/Localization/ja.po @@ -388,7 +388,7 @@ msgstr "" "マルチパスレンダリングの使用が意図したものであるかを確認してください。" msgid "MeshInfo2:warning:lineStrip" -msgstr "{0}コンポーネントはLineStripが使用されているSubMeshをスキップします。" +msgstr "{0}コンポーネントはLineStripが使用されているSubMeshを処理しません。" #endregion