[csharp] Port of earlier clipping cleanup commit 485de74: SkeletonClipping.ClipTriangles clean up.

This commit is contained in:
Harald Csaszar 2024-06-10 18:44:59 +02:00
parent 534d174f32
commit 7d57e7d343
3 changed files with 12 additions and 17 deletions

View File

@ -737,7 +737,7 @@ namespace Spine {
if (vertices != null) { if (vertices != null) {
if (clipper != null && clipper.IsClipping) { if (clipper != null && clipper.IsClipping) {
clipper.ClipTriangles(vertices, verticesLength, triangles, triangles.Length); clipper.ClipTriangles(vertices, triangles, triangles.Length);
vertices = clipper.ClippedVertices.Items; vertices = clipper.ClippedVertices.Items;
verticesLength = clipper.ClippedVertices.Count; verticesLength = clipper.ClippedVertices.Count;
} }

View File

@ -78,7 +78,7 @@ namespace Spine {
clippingPolygon.Clear(); clippingPolygon.Clear();
} }
public void ClipTriangles (float[] vertices, int verticesLength, int[] triangles, int trianglesLength) { public void ClipTriangles (float[] vertices, int[] triangles, int trianglesLength) {
ExposedList<float> clipOutput = this.clipOutput, clippedVertices = this.clippedVertices; ExposedList<float> clipOutput = this.clipOutput, clippedVertices = this.clippedVertices;
ExposedList<int> clippedTriangles = this.clippedTriangles; ExposedList<int> clippedTriangles = this.clippedTriangles;
ExposedList<float>[] polygons = clippingPolygons.Items; ExposedList<float>[] polygons = clippingPolygons.Items;
@ -87,7 +87,6 @@ namespace Spine {
int index = 0; int index = 0;
clippedVertices.Clear(); clippedVertices.Clear();
clippedTriangles.Clear(); clippedTriangles.Clear();
//outer:
for (int i = 0; i < trianglesLength; i += 3) { for (int i = 0; i < trianglesLength; i += 3) {
int vertexOffset = triangles[i] << 1; int vertexOffset = triangles[i] << 1;
float x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1]; float x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1];
@ -107,21 +106,19 @@ namespace Spine {
int clipOutputCount = clipOutputLength >> 1; int clipOutputCount = clipOutputLength >> 1;
float[] clipOutputItems = clipOutput.Items; float[] clipOutputItems = clipOutput.Items;
float[] clippedVerticesItems = clippedVertices.Resize(s + clipOutputCount * 2).Items; float[] clippedVerticesItems = clippedVertices.Resize(s + clipOutputCount * 2).Items;
for (int ii = 0; ii < clipOutputLength; ii += 2) { for (int ii = 0; ii < clipOutputLength; ii += 2, s += 2) {
float x = clipOutputItems[ii], y = clipOutputItems[ii + 1]; float x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
clippedVerticesItems[s] = x; clippedVerticesItems[s] = x;
clippedVerticesItems[s + 1] = y; clippedVerticesItems[s + 1] = y;;
s += 2;
} }
s = clippedTriangles.Count; s = clippedTriangles.Count;
int[] clippedTrianglesItems = clippedTriangles.Resize(s + 3 * (clipOutputCount - 2)).Items; int[] clippedTrianglesItems = clippedTriangles.Resize(s + 3 * (clipOutputCount - 2)).Items;
clipOutputCount--; clipOutputCount--;
for (int ii = 1; ii < clipOutputCount; ii++) { for (int ii = 1; ii < clipOutputCount; ii++, s += 3) {
clippedTrianglesItems[s] = index; clippedTrianglesItems[s] = index;
clippedTrianglesItems[s + 1] = index + ii; clippedTrianglesItems[s + 1] = index + ii;
clippedTrianglesItems[s + 2] = index + ii + 1; clippedTrianglesItems[s + 2] = index + ii + 1;
s += 3;
} }
index += clipOutputCount + 1; index += clipOutputCount + 1;
} else { } else {
@ -139,13 +136,13 @@ namespace Spine {
clippedTrianglesItems[s + 1] = index + 1; clippedTrianglesItems[s + 1] = index + 1;
clippedTrianglesItems[s + 2] = index + 2; clippedTrianglesItems[s + 2] = index + 2;
index += 3; index += 3;
break; //continue outer; break;
} }
} }
} }
} }
public void ClipTriangles (float[] vertices, int verticesLength, int[] triangles, int trianglesLength, float[] uvs) { public void ClipTriangles (float[] vertices, int[] triangles, int trianglesLength, float[] uvs) {
ExposedList<float> clipOutput = this.clipOutput, clippedVertices = this.clippedVertices; ExposedList<float> clipOutput = this.clipOutput, clippedVertices = this.clippedVertices;
ExposedList<int> clippedTriangles = this.clippedTriangles; ExposedList<int> clippedTriangles = this.clippedTriangles;
ExposedList<float>[] polygons = clippingPolygons.Items; ExposedList<float>[] polygons = clippingPolygons.Items;
@ -155,7 +152,7 @@ namespace Spine {
clippedVertices.Clear(); clippedVertices.Clear();
clippedUVs.Clear(); clippedUVs.Clear();
clippedTriangles.Clear(); clippedTriangles.Clear();
//outer:
for (int i = 0; i < trianglesLength; i += 3) { for (int i = 0; i < trianglesLength; i += 3) {
int vertexOffset = triangles[i] << 1; int vertexOffset = triangles[i] << 1;
float x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1]; float x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1];
@ -181,7 +178,7 @@ namespace Spine {
float[] clipOutputItems = clipOutput.Items; float[] clipOutputItems = clipOutput.Items;
float[] clippedVerticesItems = clippedVertices.Resize(s + clipOutputCount * 2).Items; float[] clippedVerticesItems = clippedVertices.Resize(s + clipOutputCount * 2).Items;
float[] clippedUVsItems = clippedUVs.Resize(s + clipOutputCount * 2).Items; float[] clippedUVsItems = clippedUVs.Resize(s + clipOutputCount * 2).Items;
for (int ii = 0; ii < clipOutputLength; ii += 2) { for (int ii = 0; ii < clipOutputLength; ii += 2, s += 2) {
float x = clipOutputItems[ii], y = clipOutputItems[ii + 1]; float x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
clippedVerticesItems[s] = x; clippedVerticesItems[s] = x;
clippedVerticesItems[s + 1] = y; clippedVerticesItems[s + 1] = y;
@ -191,17 +188,15 @@ namespace Spine {
float c = 1 - a - b; float c = 1 - a - b;
clippedUVsItems[s] = u1 * a + u2 * b + u3 * c; clippedUVsItems[s] = u1 * a + u2 * b + u3 * c;
clippedUVsItems[s + 1] = v1 * a + v2 * b + v3 * c; clippedUVsItems[s + 1] = v1 * a + v2 * b + v3 * c;
s += 2;
} }
s = clippedTriangles.Count; s = clippedTriangles.Count;
int[] clippedTrianglesItems = clippedTriangles.Resize(s + 3 * (clipOutputCount - 2)).Items; int[] clippedTrianglesItems = clippedTriangles.Resize(s + 3 * (clipOutputCount - 2)).Items;
clipOutputCount--; clipOutputCount--;
for (int ii = 1; ii < clipOutputCount; ii++) { for (int ii = 1; ii < clipOutputCount; ii++, s += 3) {
clippedTrianglesItems[s] = index; clippedTrianglesItems[s] = index;
clippedTrianglesItems[s + 1] = index + ii; clippedTrianglesItems[s + 1] = index + ii;
clippedTrianglesItems[s + 2] = index + ii + 1; clippedTrianglesItems[s + 2] = index + ii + 1;
s += 3;
} }
index += clipOutputCount + 1; index += clipOutputCount + 1;
} else { } else {
@ -227,7 +222,7 @@ namespace Spine {
clippedTrianglesItems[s + 1] = index + 1; clippedTrianglesItems[s + 1] = index + 1;
clippedTrianglesItems[s + 2] = index + 2; clippedTrianglesItems[s + 2] = index + 2;
index += 3; index += 3;
break; //continue outer; break;
} }
} }
} }

View File

@ -640,7 +640,7 @@ namespace Spine.Unity {
} }
if (useClipping && clipper.IsClipping) { if (useClipping && clipper.IsClipping) {
clipper.ClipTriangles(workingVerts, attachmentVertexCount << 1, attachmentTriangleIndices, attachmentIndexCount, uvs); clipper.ClipTriangles(workingVerts, attachmentTriangleIndices, attachmentIndexCount, uvs);
workingVerts = clipper.ClippedVertices.Items; workingVerts = clipper.ClippedVertices.Items;
attachmentVertexCount = clipper.ClippedVertices.Count >> 1; attachmentVertexCount = clipper.ClippedVertices.Count >> 1;
attachmentTriangleIndices = clipper.ClippedTriangles.Items; attachmentTriangleIndices = clipper.ClippedTriangles.Items;