mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
[ts] Port of earlier clipping cleanup commit 485de74: SkeletonClipping.ClipTriangles clean up.
This commit is contained in:
parent
0e9a004388
commit
b4d61790f7
@ -640,7 +640,7 @@ export class Skeleton {
|
|||||||
}
|
}
|
||||||
if (vertices && triangles) {
|
if (vertices && triangles) {
|
||||||
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;
|
vertices = clipper.clippedVertices;
|
||||||
verticesLength = clipper.clippedVertices.length;
|
verticesLength = clipper.clippedVertices.length;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -80,29 +80,27 @@ export class SkeletonClipping {
|
|||||||
return this.clipAttachment != null;
|
return this.clipAttachment != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
clipTriangles (vertices: NumberArrayLike, verticesLength: number, triangles: NumberArrayLike, trianglesLength: number): void;
|
clipTriangles (vertices: NumberArrayLike, triangles: NumberArrayLike, trianglesLength: number): void;
|
||||||
clipTriangles (vertices: NumberArrayLike, verticesLength: number, triangles: NumberArrayLike, trianglesLength: number, uvs: NumberArrayLike,
|
clipTriangles (vertices: NumberArrayLike, triangles: NumberArrayLike, trianglesLength: number, uvs: NumberArrayLike,
|
||||||
light: Color, dark: Color, twoColor: boolean): void;
|
light: Color, dark: Color, twoColor: boolean): void;
|
||||||
clipTriangles (vertices: NumberArrayLike, verticesLength: number, triangles: NumberArrayLike, trianglesLength: number, uvs?: NumberArrayLike,
|
clipTriangles (vertices: NumberArrayLike, triangles: NumberArrayLike, trianglesLength: number, uvs?: NumberArrayLike,
|
||||||
light?: Color, dark?: Color, twoColor?: boolean): void {
|
light?: Color, dark?: Color, twoColor?: boolean): void {
|
||||||
|
|
||||||
if (uvs && light && dark && typeof twoColor === 'boolean')
|
if (uvs && light && dark && typeof twoColor === 'boolean')
|
||||||
this.clipTrianglesRender(vertices, verticesLength, triangles, trianglesLength, uvs, light, dark, twoColor);
|
this.clipTrianglesRender(vertices, triangles, trianglesLength, uvs, light, dark, twoColor);
|
||||||
else
|
else
|
||||||
this.clipTrianglesNoRender(vertices, verticesLength, triangles, trianglesLength);
|
this.clipTrianglesNoRender(vertices, triangles, trianglesLength);
|
||||||
}
|
}
|
||||||
private clipTrianglesNoRender (vertices: NumberArrayLike, verticesLength: number, triangles: NumberArrayLike, trianglesLength: number) {
|
private clipTrianglesNoRender (vertices: NumberArrayLike, triangles: NumberArrayLike, trianglesLength: number) {
|
||||||
|
|
||||||
let clipOutput = this.clipOutput, clippedVertices = this.clippedVertices;
|
let clipOutput = this.clipOutput, clippedVertices = this.clippedVertices;
|
||||||
let clippedTriangles = this.clippedTriangles;
|
let clippedTriangles = this.clippedTriangles;
|
||||||
let polygons = this.clippingPolygons!;
|
let polygons = this.clippingPolygons!;
|
||||||
let polygonsCount = polygons.length;
|
let polygonsCount = polygons.length;
|
||||||
let vertexSize = 2;
|
|
||||||
|
|
||||||
let index = 0;
|
let index = 0;
|
||||||
clippedVertices.length = 0;
|
clippedVertices.length = 0;
|
||||||
clippedTriangles.length = 0;
|
clippedTriangles.length = 0;
|
||||||
outer:
|
|
||||||
for (let i = 0; i < trianglesLength; i += 3) {
|
for (let i = 0; i < trianglesLength; i += 3) {
|
||||||
let vertexOffset = triangles[i] << 1;
|
let vertexOffset = triangles[i] << 1;
|
||||||
let x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1];
|
let x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1];
|
||||||
@ -121,27 +119,25 @@ export class SkeletonClipping {
|
|||||||
|
|
||||||
let clipOutputCount = clipOutputLength >> 1;
|
let clipOutputCount = clipOutputLength >> 1;
|
||||||
let clipOutputItems = this.clipOutput;
|
let clipOutputItems = this.clipOutput;
|
||||||
let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize);
|
let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + clipOutputCount * 2);
|
||||||
for (let ii = 0; ii < clipOutputLength; ii += 2) {
|
for (let ii = 0; ii < clipOutputLength; ii += 2, s += 2) {
|
||||||
let x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
|
let 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.length;
|
s = clippedTriangles.length;
|
||||||
let clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
|
let clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
|
||||||
clipOutputCount--;
|
clipOutputCount--;
|
||||||
for (let ii = 1; ii < clipOutputCount; ii++) {
|
for (let 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 {
|
||||||
let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + 3 * vertexSize);
|
let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + 3 * 2);
|
||||||
clippedVerticesItems[s] = x1;
|
clippedVerticesItems[s] = x1;
|
||||||
clippedVerticesItems[s + 1] = y1;
|
clippedVerticesItems[s + 1] = y1;
|
||||||
|
|
||||||
@ -157,13 +153,13 @@ export class SkeletonClipping {
|
|||||||
clippedTrianglesItems[s + 1] = (index + 1);
|
clippedTrianglesItems[s + 1] = (index + 1);
|
||||||
clippedTrianglesItems[s + 2] = (index + 2);
|
clippedTrianglesItems[s + 2] = (index + 2);
|
||||||
index += 3;
|
index += 3;
|
||||||
continue outer;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private clipTrianglesRender (vertices: NumberArrayLike, verticesLength: number, triangles: NumberArrayLike, trianglesLength: number, uvs: NumberArrayLike,
|
private clipTrianglesRender (vertices: NumberArrayLike, triangles: NumberArrayLike, trianglesLength: number, uvs: NumberArrayLike,
|
||||||
light: Color, dark: Color, twoColor: boolean) {
|
light: Color, dark: Color, twoColor: boolean) {
|
||||||
|
|
||||||
let clipOutput = this.clipOutput, clippedVertices = this.clippedVertices;
|
let clipOutput = this.clipOutput, clippedVertices = this.clippedVertices;
|
||||||
@ -175,7 +171,6 @@ export class SkeletonClipping {
|
|||||||
let index = 0;
|
let index = 0;
|
||||||
clippedVertices.length = 0;
|
clippedVertices.length = 0;
|
||||||
clippedTriangles.length = 0;
|
clippedTriangles.length = 0;
|
||||||
outer:
|
|
||||||
for (let i = 0; i < trianglesLength; i += 3) {
|
for (let i = 0; i < trianglesLength; i += 3) {
|
||||||
let vertexOffset = triangles[i] << 1;
|
let vertexOffset = triangles[i] << 1;
|
||||||
let x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1];
|
let x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1];
|
||||||
@ -200,7 +195,7 @@ export class SkeletonClipping {
|
|||||||
let clipOutputCount = clipOutputLength >> 1;
|
let clipOutputCount = clipOutputLength >> 1;
|
||||||
let clipOutputItems = this.clipOutput;
|
let clipOutputItems = this.clipOutput;
|
||||||
let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize);
|
let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize);
|
||||||
for (let ii = 0; ii < clipOutputLength; ii += 2) {
|
for (let ii = 0; ii < clipOutputLength; ii += 2, s += vertexSize) {
|
||||||
let x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
|
let x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
|
||||||
clippedVerticesItems[s] = x;
|
clippedVerticesItems[s] = x;
|
||||||
clippedVerticesItems[s + 1] = y;
|
clippedVerticesItems[s + 1] = y;
|
||||||
@ -220,17 +215,15 @@ export class SkeletonClipping {
|
|||||||
clippedVerticesItems[s + 10] = dark.b;
|
clippedVerticesItems[s + 10] = dark.b;
|
||||||
clippedVerticesItems[s + 11] = dark.a;
|
clippedVerticesItems[s + 11] = dark.a;
|
||||||
}
|
}
|
||||||
s += vertexSize;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
s = clippedTriangles.length;
|
s = clippedTriangles.length;
|
||||||
let clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
|
let clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
|
||||||
clipOutputCount--;
|
clipOutputCount--;
|
||||||
for (let ii = 1; ii < clipOutputCount; ii++) {
|
for (let 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;
|
||||||
|
|
||||||
@ -304,7 +297,7 @@ export class SkeletonClipping {
|
|||||||
clippedTrianglesItems[s + 1] = (index + 1);
|
clippedTrianglesItems[s + 1] = (index + 1);
|
||||||
clippedTrianglesItems[s + 2] = (index + 2);
|
clippedTrianglesItems[s + 2] = (index + 2);
|
||||||
index += 3;
|
index += 3;
|
||||||
continue outer;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -363,6 +356,7 @@ export class SkeletonClipping {
|
|||||||
} else {
|
} else {
|
||||||
output.push(inputX2);
|
output.push(inputX2);
|
||||||
output.push(inputY2);
|
output.push(inputY2);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
} else if (s2) { // v1 outside, v2 inside
|
} else if (s2) { // v1 outside, v2 inside
|
||||||
let ix = inputX2 - inputX, iy = inputY2 - inputY, t = s1 / (ix * ey - iy * ex);
|
let ix = inputX2 - inputX, iy = inputY2 - inputY, t = s1 / (ix * ey - iy * ex);
|
||||||
|
|||||||
@ -381,7 +381,7 @@ export class Spine extends Container {
|
|||||||
let finalIndicesLength: number;
|
let finalIndicesLength: number;
|
||||||
|
|
||||||
if (Spine.clipper.isClipping()) {
|
if (Spine.clipper.isClipping()) {
|
||||||
Spine.clipper.clipTriangles(this.verticesCache, numFloats, triangles, triangles.length, uvs, this.lightColor, this.darkColor, useDarkColor);
|
Spine.clipper.clipTriangles(this.verticesCache, triangles, triangles.length, uvs, this.lightColor, this.darkColor, useDarkColor);
|
||||||
|
|
||||||
finalVertices = Spine.clipper.clippedVertices;
|
finalVertices = Spine.clipper.clippedVertices;
|
||||||
finalVerticesLength = finalVertices.length;
|
finalVerticesLength = finalVertices.length;
|
||||||
|
|||||||
@ -255,7 +255,6 @@ export class SkeletonMesh extends THREE.Object3D {
|
|||||||
if (clipper.isClipping()) {
|
if (clipper.isClipping()) {
|
||||||
clipper.clipTriangles(
|
clipper.clipTriangles(
|
||||||
vertices,
|
vertices,
|
||||||
numFloats,
|
|
||||||
triangles,
|
triangles,
|
||||||
triangles.length,
|
triangles.length,
|
||||||
uvs,
|
uvs,
|
||||||
|
|||||||
@ -165,7 +165,7 @@ export class SkeletonRenderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (clipper.isClipping()) {
|
if (clipper.isClipping()) {
|
||||||
clipper.clipTriangles(renderable.vertices, renderable.numFloats, triangles, triangles.length, uvs, finalColor, darkColor, twoColorTint);
|
clipper.clipTriangles(renderable.vertices, triangles, triangles.length, uvs, finalColor, darkColor, twoColorTint);
|
||||||
let clippedVertices = new Float32Array(clipper.clippedVertices);
|
let clippedVertices = new Float32Array(clipper.clippedVertices);
|
||||||
let clippedTriangles = clipper.clippedTriangles;
|
let clippedTriangles = clipper.clippedTriangles;
|
||||||
if (transformer) transformer(clippedVertices, clippedVertices.length, vertexSize);
|
if (transformer) transformer(clippedVertices, clippedVertices.length, vertexSize);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user