mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-02-09 08:38:43 +08:00
[ts][webgl][widget] Implemented clipping, updated README.md and CHANGELOG
This commit is contained in:
parent
06f32233c0
commit
d4266cf89a
@ -120,12 +120,14 @@
|
||||
* Added `Bone.localToWorldRotation`(rotation given relative to x-axis, counter-clockwise, in degrees).
|
||||
* Added two color tinting support, including `TwoColorTimeline` and additional fields on `Slot` and `SlotData`.
|
||||
* Added `PointAttachment`, additional method `newPointAttachment` in `AttachmentLoader` interface.
|
||||
* Added `ClippingAttachment`, additional method `newClippingAttachment` in `AttachmentLoader` interface.
|
||||
|
||||
### WebGL backend
|
||||
* Fixed renderer to work with 3.6 changes.
|
||||
* Added support for two color tinting.
|
||||
* Improved performance by using `DYNAMIC_DRAW` for vertex buffer objects and fixing bug that copied to much data to the GPU each frame in `PolygonBatcher`/`Mesh`.
|
||||
* Added two color tinting support, enabled by default. You can disable it via the constructors of `SceneRenderer`, `SkeletonRenderer`and `PolygonBatcher`. Note that you will need to use a shader created via `Shader.newTwoColoredTexturedShader` shader with `SkeletonRenderer` and `PolygonBatcher` if two color tinting is enabled.
|
||||
* Added clipping support
|
||||
|
||||
### Canvas backend
|
||||
* Fixed renderer to work for 3.6 changes. Sadly, we can't support two color tinting via the Canvas API.
|
||||
@ -136,5 +138,5 @@
|
||||
* Fixed renderer to work with 3.6 changes. Two color tinting is not supported.
|
||||
|
||||
### Widget backend
|
||||
* Fixed renderer to work for 3.6 changes. Supports two color tinting (see webgl backend changes for details).
|
||||
* Fixed renderer to work for 3.6 changes. Supports two color tinting & clipping (see webgl backend changes for details).
|
||||
* Added fields `atlasContent`, `atlasPagesContent`, and `jsonContent` to `WidgetConfiguration` allowing you to directly pass the contents of the `.atlas`, atlas page `.png` files, and the `.json` file without having to do a request. See `README.md` and the example for details.
|
||||
|
||||
@ -22,9 +22,9 @@ spine-ts works with data exported from Spine 3.6.xx
|
||||
|
||||
spine-ts WebGL & Widget backends supports all Spine features.
|
||||
|
||||
spine-ts Canvas does not support color tinting and mesh attachments. Only the alpha channel from tint colors is applied. Experimental support for mesh attachments can be enabled by setting `spine.canvas.SkeletonRenderer.useTriangleRendering` to true. Note that this method is slow and may lead to artifacts on some browsers.
|
||||
spine-ts Canvas does not support color tinting, mesh attachments and clipping. Only the alpha channel from tint colors is applied. Experimental support for mesh attachments can be enabled by setting `spine.canvas.SkeletonRenderer.useTriangleRendering` to true. Note that this method is slow and may lead to artifacts on some browsers.
|
||||
|
||||
spine-ts THREE.JS does not support color tinting and blend modes. The THREE.JS backend provides `SkeletonMesh.zOffset` to avoid z-fighting. Adjust to your near/far plane settings.
|
||||
spine-ts THREE.JS does not support color tinting, blend modes and clipping. The THREE.JS backend provides `SkeletonMesh.zOffset` to avoid z-fighting. Adjust to your near/far plane settings.
|
||||
|
||||
spine-ts does not yet support loading the binary format.
|
||||
|
||||
|
||||
51
spine-ts/build/spine-all.d.ts
vendored
51
spine-ts/build/spine-all.d.ts
vendored
@ -454,6 +454,7 @@ declare module spine {
|
||||
newBoundingBoxAttachment(skin: Skin, name: string): BoundingBoxAttachment;
|
||||
newPathAttachment(skin: Skin, name: string): PathAttachment;
|
||||
newPointAttachment(skin: Skin, name: string): PointAttachment;
|
||||
newClippingAttachment(skin: Skin, name: string): ClippingAttachment;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
@ -477,6 +478,7 @@ declare module spine {
|
||||
newBoundingBoxAttachment(skin: Skin, name: string): BoundingBoxAttachment;
|
||||
newPathAttachment(skin: Skin, name: string): PathAttachment;
|
||||
newPointAttachment(skin: Skin, name: string): PointAttachment;
|
||||
newClippingAttachment(skin: Skin, name: string): ClippingAttachment;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
@ -495,6 +497,13 @@ declare module spine {
|
||||
constructor(name: string);
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class ClippingAttachment extends VertexAttachment {
|
||||
endSlot: SlotData;
|
||||
color: Color;
|
||||
constructor(name: string);
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class MeshAttachment extends VertexAttachment {
|
||||
region: TextureRegion;
|
||||
@ -678,6 +687,21 @@ declare module spine {
|
||||
getOrder(): number;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class ConvexDecomposer {
|
||||
private convexPolygons;
|
||||
private convexPolygonsIndices;
|
||||
private indicesArray;
|
||||
private isConcaveArray;
|
||||
private triangles;
|
||||
private polygonPool;
|
||||
private polygonIndicesPool;
|
||||
decompose(input: ArrayLike<number>): Array<Array<number>>;
|
||||
private static isConcave(index, vertexCount, vertices, indices);
|
||||
private static positiveArea(p1x, p1y, p2x, p2y, p3x, p3y);
|
||||
private static winding(p1x, p1y, p2x, p2y, p3x, p3y);
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class Event {
|
||||
data: EventData;
|
||||
@ -873,6 +897,25 @@ declare module spine {
|
||||
getHeight(): number;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class SkeletonClipping {
|
||||
private decomposer;
|
||||
private clippingPolygon;
|
||||
private clipOutput;
|
||||
clippedVertices: number[];
|
||||
clippedTriangles: number[];
|
||||
private scratch;
|
||||
private clipAttachment;
|
||||
private clippingPolygons;
|
||||
clipStart(slot: Slot, clip: ClippingAttachment): void;
|
||||
clipEndWithSlot(slot: Slot): void;
|
||||
clipEnd(): void;
|
||||
isClipping(): boolean;
|
||||
clipTriangles(vertices: ArrayLike<number>, verticesLength: number, triangles: ArrayLike<number>, trianglesLength: number, uvs: ArrayLike<number>, light: Color, dark: Color, twoColor: boolean): void;
|
||||
clip(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, clippingArea: Array<number>, output: Array<number>): boolean;
|
||||
static makeClockwise(polygon: ArrayLike<number>): void;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class SkeletonData {
|
||||
name: string;
|
||||
@ -911,7 +954,7 @@ declare module spine {
|
||||
private linkedMeshes;
|
||||
constructor(attachmentLoader: AttachmentLoader);
|
||||
readSkeletonData(json: string | any): SkeletonData;
|
||||
readAttachment(map: any, skin: Skin, slotIndex: number, name: string): Attachment;
|
||||
readAttachment(map: any, skin: Skin, slotIndex: number, name: string, skeletonData: SkeletonData): Attachment;
|
||||
readVertices(map: any, attachment: VertexAttachment, verticesLength: number): void;
|
||||
readAnimation(map: any, name: string, skeletonData: SkeletonData): void;
|
||||
readCurve(map: any, timeline: CurveTimeline, frameIndex: number): void;
|
||||
@ -1089,6 +1132,7 @@ declare module spine {
|
||||
static ensureArrayCapacity<T>(array: Array<T>, size: number, value?: any): Array<T>;
|
||||
static newArray<T>(size: number, defaultValue: T): Array<T>;
|
||||
static newFloatArray(size: number): ArrayLike<number>;
|
||||
static newShortArray(size: number): ArrayLike<number>;
|
||||
static toFloatArray(array: Array<number>): number[] | Float32Array;
|
||||
}
|
||||
class DebugUtils {
|
||||
@ -1524,6 +1568,7 @@ declare module spine.webgl {
|
||||
attachmentLineColor: Color;
|
||||
triangleLineColor: Color;
|
||||
pathColor: Color;
|
||||
clipColor: Color;
|
||||
aabbColor: Color;
|
||||
drawBones: boolean;
|
||||
drawRegionAttachments: boolean;
|
||||
@ -1532,6 +1577,7 @@ declare module spine.webgl {
|
||||
drawMeshTriangles: boolean;
|
||||
drawPaths: boolean;
|
||||
drawSkeletonXY: boolean;
|
||||
drawClipping: boolean;
|
||||
premultipliedAlpha: boolean;
|
||||
scale: number;
|
||||
boneWidth: number;
|
||||
@ -1557,10 +1603,9 @@ declare module spine.webgl {
|
||||
private vertexSize;
|
||||
private twoColorTint;
|
||||
private renderable;
|
||||
private clipper;
|
||||
constructor(gl: WebGLRenderingContext, twoColorTint?: boolean);
|
||||
draw(batcher: PolygonBatcher, skeleton: Skeleton): void;
|
||||
private computeRegionVertices(slot, region, pma, twoColorTint?);
|
||||
private computeMeshVertices(slot, mesh, pma, twoColorTint?);
|
||||
}
|
||||
}
|
||||
declare module spine.webgl {
|
||||
|
||||
@ -2242,6 +2242,9 @@ var spine;
|
||||
AtlasAttachmentLoader.prototype.newPointAttachment = function (skin, name) {
|
||||
return new spine.PointAttachment(name);
|
||||
};
|
||||
AtlasAttachmentLoader.prototype.newClippingAttachment = function (skin, name) {
|
||||
return new spine.ClippingAttachment(name);
|
||||
};
|
||||
return AtlasAttachmentLoader;
|
||||
}());
|
||||
spine.AtlasAttachmentLoader = AtlasAttachmentLoader;
|
||||
@ -2354,6 +2357,18 @@ var spine;
|
||||
spine.BoundingBoxAttachment = BoundingBoxAttachment;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var ClippingAttachment = (function (_super) {
|
||||
__extends(ClippingAttachment, _super);
|
||||
function ClippingAttachment(name) {
|
||||
_super.call(this, name);
|
||||
this.color = new spine.Color(0.2275, 0.2275, 0.8078, 1);
|
||||
}
|
||||
return ClippingAttachment;
|
||||
}(spine.VertexAttachment));
|
||||
spine.ClippingAttachment = ClippingAttachment;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var MeshAttachment = (function (_super) {
|
||||
__extends(MeshAttachment, _super);
|
||||
@ -2897,6 +2912,207 @@ var spine;
|
||||
var TransformMode = spine.TransformMode;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var ConvexDecomposer = (function () {
|
||||
function ConvexDecomposer() {
|
||||
this.convexPolygons = new Array();
|
||||
this.convexPolygonsIndices = new Array();
|
||||
this.indicesArray = new Array();
|
||||
this.isConcaveArray = new Array();
|
||||
this.triangles = new Array();
|
||||
this.polygonPool = new spine.Pool(function () {
|
||||
return new Array();
|
||||
});
|
||||
this.polygonIndicesPool = new spine.Pool(function () {
|
||||
return new Array();
|
||||
});
|
||||
}
|
||||
ConvexDecomposer.prototype.decompose = function (input) {
|
||||
var vertices = input;
|
||||
var vertexCount = input.length >> 1;
|
||||
var indices = this.indicesArray;
|
||||
indices.length = 0;
|
||||
for (var i = 0; i < vertexCount; i++)
|
||||
indices[i] = i;
|
||||
var isConcave = this.isConcaveArray;
|
||||
isConcave.length = 0;
|
||||
for (var i = 0, n = vertexCount; i < n; ++i)
|
||||
isConcave[i] = ConvexDecomposer.isConcave(i, vertexCount, vertices, indices);
|
||||
var triangles = this.triangles;
|
||||
triangles.length = 0;
|
||||
while (vertexCount > 3) {
|
||||
var previous = vertexCount - 1, i = 0, next = 1;
|
||||
while (true) {
|
||||
outer: if (!isConcave[i]) {
|
||||
var p1 = indices[previous] << 1, p2 = indices[i] << 1, p3 = indices[next] << 1;
|
||||
var p1x = vertices[p1], p1y = vertices[p1 + 1];
|
||||
var p2x = vertices[p2], p2y = vertices[p2 + 1];
|
||||
var p3x = vertices[p3], p3y = vertices[p3 + 1];
|
||||
for (var ii = (next + 1) % vertexCount; ii != previous; ii = (ii + 1) % vertexCount) {
|
||||
if (!isConcave[ii])
|
||||
continue;
|
||||
var v = indices[ii] << 1;
|
||||
var vx = vertices[v], vy = vertices[v + 1];
|
||||
if (ConvexDecomposer.positiveArea(p3x, p3y, p1x, p1y, vx, vy)) {
|
||||
if (ConvexDecomposer.positiveArea(p1x, p1y, p2x, p2y, vx, vy)) {
|
||||
if (ConvexDecomposer.positiveArea(p2x, p2y, p3x, p3y, vx, vy))
|
||||
break outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (next == 0) {
|
||||
do {
|
||||
if (!isConcave[i])
|
||||
break;
|
||||
i--;
|
||||
} while (i > 0);
|
||||
break;
|
||||
}
|
||||
previous = i;
|
||||
i = next;
|
||||
next = (next + 1) % vertexCount;
|
||||
}
|
||||
triangles.push(indices[(vertexCount + i - 1) % vertexCount]);
|
||||
triangles.push(indices[i]);
|
||||
triangles.push(indices[(i + 1) % vertexCount]);
|
||||
indices.splice(i, 1);
|
||||
isConcave.splice(i, 1);
|
||||
vertexCount--;
|
||||
var previousIndex = (vertexCount + i - 1) % vertexCount;
|
||||
var nextIndex = i == vertexCount ? 0 : i;
|
||||
isConcave[previousIndex] = ConvexDecomposer.isConcave(previousIndex, vertexCount, vertices, indices);
|
||||
isConcave[nextIndex] = ConvexDecomposer.isConcave(nextIndex, vertexCount, vertices, indices);
|
||||
}
|
||||
if (vertexCount == 3) {
|
||||
triangles.push(indices[2]);
|
||||
triangles.push(indices[0]);
|
||||
triangles.push(indices[1]);
|
||||
}
|
||||
var convexPolygons = this.convexPolygons;
|
||||
this.polygonPool.freeAll(convexPolygons);
|
||||
convexPolygons.length = 0;
|
||||
var convexPolygonsIndices = this.convexPolygonsIndices;
|
||||
this.polygonIndicesPool.freeAll(convexPolygonsIndices);
|
||||
convexPolygonsIndices.length = 0;
|
||||
var polygonIndices = this.polygonIndicesPool.obtain();
|
||||
polygonIndices.length = 0;
|
||||
var polygon = this.polygonPool.obtain();
|
||||
polygon.length = 0;
|
||||
var fanBaseIndex = -1, lastWinding = 0;
|
||||
for (var i = 0, n = triangles.length; i < n; i += 3) {
|
||||
var t1 = triangles[i] << 1, t2 = triangles[i + 1] << 1, t3 = triangles[i + 2] << 1;
|
||||
var x1 = vertices[t1], y1 = vertices[t1 + 1];
|
||||
var x2 = vertices[t2], y2 = vertices[t2 + 1];
|
||||
var x3 = vertices[t3], y3 = vertices[t3 + 1];
|
||||
var merged = false;
|
||||
if (fanBaseIndex == t1) {
|
||||
var o = polygon.length - 4;
|
||||
var winding1 = ConvexDecomposer.winding(polygon[o], polygon[o + 1], polygon[o + 2], polygon[o + 3], x3, y3);
|
||||
var winding2 = ConvexDecomposer.winding(x3, y3, polygon[0], polygon[1], polygon[2], polygon[3]);
|
||||
if (winding1 == lastWinding && winding2 == lastWinding) {
|
||||
polygon.push(x3);
|
||||
polygon.push(y3);
|
||||
polygonIndices.push(t3);
|
||||
merged = true;
|
||||
}
|
||||
}
|
||||
if (!merged) {
|
||||
if (polygon.length > 0) {
|
||||
convexPolygons.push(polygon);
|
||||
convexPolygonsIndices.push(polygonIndices);
|
||||
}
|
||||
polygon = this.polygonPool.obtain();
|
||||
polygon.length = 0;
|
||||
polygon.push(x1);
|
||||
polygon.push(y1);
|
||||
polygon.push(x2);
|
||||
polygon.push(y2);
|
||||
polygon.push(x3);
|
||||
polygon.push(y3);
|
||||
polygonIndices = this.polygonIndicesPool.obtain();
|
||||
polygonIndices.length = 0;
|
||||
polygonIndices.push(t1);
|
||||
polygonIndices.push(t2);
|
||||
polygonIndices.push(t3);
|
||||
lastWinding = ConvexDecomposer.winding(x1, y1, x2, y2, x3, y3);
|
||||
fanBaseIndex = t1;
|
||||
}
|
||||
}
|
||||
if (polygon.length > 0) {
|
||||
convexPolygons.push(polygon);
|
||||
convexPolygonsIndices.push(polygonIndices);
|
||||
}
|
||||
for (var i = 0, n = convexPolygons.length; i < n; i++) {
|
||||
polygonIndices = convexPolygonsIndices[i];
|
||||
if (polygonIndices.length == 0)
|
||||
continue;
|
||||
var firstIndex = polygonIndices[0];
|
||||
var lastIndex = polygonIndices[polygonIndices.length - 1];
|
||||
polygon = convexPolygons[i];
|
||||
var o = polygon.length - 4;
|
||||
var prevPrevX = polygon[o], prevPrevY = polygon[o + 1];
|
||||
var prevX = polygon[o + 2], prevY = polygon[o + 3];
|
||||
var firstX = polygon[0], firstY = polygon[1];
|
||||
var secondX = polygon[2], secondY = polygon[3];
|
||||
var winding = ConvexDecomposer.winding(prevPrevX, prevPrevY, prevX, prevY, firstX, firstY);
|
||||
for (var ii = 0; ii < n; ii++) {
|
||||
if (ii == i)
|
||||
continue;
|
||||
var otherIndices = convexPolygonsIndices[ii];
|
||||
if (otherIndices.length != 3)
|
||||
continue;
|
||||
var otherFirstIndex = otherIndices[0];
|
||||
var otherSecondIndex = otherIndices[1];
|
||||
var otherLastIndex = otherIndices[2];
|
||||
var otherPoly = convexPolygons[ii];
|
||||
var x3 = otherPoly[otherPoly.length - 2], y3 = otherPoly[otherPoly.length - 1];
|
||||
if (otherFirstIndex != firstIndex || otherSecondIndex != lastIndex)
|
||||
continue;
|
||||
var winding1 = ConvexDecomposer.winding(prevPrevX, prevPrevY, prevX, prevY, x3, y3);
|
||||
var winding2 = ConvexDecomposer.winding(x3, y3, firstX, firstY, secondX, secondY);
|
||||
if (winding1 == winding && winding2 == winding) {
|
||||
otherPoly.length = 0;
|
||||
otherIndices.length = 0;
|
||||
polygon.push(x3);
|
||||
polygon.push(y3);
|
||||
polygonIndices.push(otherLastIndex);
|
||||
prevPrevX = prevX;
|
||||
prevPrevY = prevY;
|
||||
prevX = x3;
|
||||
prevY = y3;
|
||||
ii = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (var i = convexPolygons.length - 1; i >= 0; i--) {
|
||||
polygon = convexPolygons[i];
|
||||
if (polygon.length == 0) {
|
||||
convexPolygons.splice(i, 1);
|
||||
this.polygonPool.free(polygon);
|
||||
}
|
||||
}
|
||||
return convexPolygons;
|
||||
};
|
||||
ConvexDecomposer.isConcave = function (index, vertexCount, vertices, indices) {
|
||||
var previous = indices[(vertexCount + index - 1) % vertexCount] << 1;
|
||||
var current = indices[index] << 1;
|
||||
var next = indices[(index + 1) % vertexCount] << 1;
|
||||
return !this.positiveArea(vertices[previous], vertices[previous + 1], vertices[current], vertices[current + 1], vertices[next], vertices[next + 1]);
|
||||
};
|
||||
ConvexDecomposer.positiveArea = function (p1x, p1y, p2x, p2y, p3x, p3y) {
|
||||
return p1x * (p3y - p2y) + p2x * (p1y - p3y) + p3x * (p2y - p1y) >= 0;
|
||||
};
|
||||
ConvexDecomposer.winding = function (p1x, p1y, p2x, p2y, p3x, p3y) {
|
||||
var px = p2x - p1x, py = p2y - p1y;
|
||||
return p3x * py - p3y * px + px * p1y - p1x * py >= 0 ? 1 : -1;
|
||||
};
|
||||
return ConvexDecomposer;
|
||||
}());
|
||||
spine.ConvexDecomposer = ConvexDecomposer;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var Event = (function () {
|
||||
function Event(time, data) {
|
||||
@ -4265,6 +4481,285 @@ var spine;
|
||||
spine.SkeletonBounds = SkeletonBounds;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var SkeletonClipping = (function () {
|
||||
function SkeletonClipping() {
|
||||
this.decomposer = new spine.ConvexDecomposer();
|
||||
this.clippingPolygon = new Array();
|
||||
this.clipOutput = new Array();
|
||||
this.clippedVertices = new Array();
|
||||
this.clippedTriangles = new Array();
|
||||
this.scratch = new Array();
|
||||
}
|
||||
SkeletonClipping.prototype.clipStart = function (slot, clip) {
|
||||
if (this.clipAttachment != null)
|
||||
return;
|
||||
this.clipAttachment = clip;
|
||||
var n = clip.worldVerticesLength;
|
||||
var vertices = spine.Utils.setArraySize(this.clippingPolygon, n);
|
||||
clip.computeWorldVertices(slot, 0, n, vertices, 0, 2);
|
||||
var clippingPolygon = this.clippingPolygon;
|
||||
SkeletonClipping.makeClockwise(clippingPolygon);
|
||||
var clippingPolygons = this.clippingPolygons = this.decomposer.decompose(clippingPolygon);
|
||||
for (var i = 0, n_1 = clippingPolygons.length; i < n_1; i++) {
|
||||
var polygon = clippingPolygons[i];
|
||||
SkeletonClipping.makeClockwise(polygon);
|
||||
polygon.push(polygon[0]);
|
||||
polygon.push(polygon[1]);
|
||||
}
|
||||
};
|
||||
SkeletonClipping.prototype.clipEndWithSlot = function (slot) {
|
||||
if (this.clipAttachment != null && this.clipAttachment.endSlot == slot.data)
|
||||
this.clipEnd();
|
||||
};
|
||||
SkeletonClipping.prototype.clipEnd = function () {
|
||||
if (this.clipAttachment == null)
|
||||
return;
|
||||
this.clipAttachment = null;
|
||||
this.clippingPolygons = null;
|
||||
this.clippedVertices.length = 0;
|
||||
this.clippedTriangles.length = 0;
|
||||
this.clippingPolygon.length = 0;
|
||||
};
|
||||
SkeletonClipping.prototype.isClipping = function () {
|
||||
return this.clipAttachment != null;
|
||||
};
|
||||
SkeletonClipping.prototype.clipTriangles = function (vertices, verticesLength, triangles, trianglesLength, uvs, light, dark, twoColor) {
|
||||
var clipOutput = this.clipOutput, clippedVertices = this.clippedVertices;
|
||||
var clippedTriangles = this.clippedTriangles;
|
||||
var polygons = this.clippingPolygons;
|
||||
var polygonsCount = this.clippingPolygons.length;
|
||||
var vertexSize = twoColor ? 12 : 8;
|
||||
var index = 0;
|
||||
clippedVertices.length = 0;
|
||||
clippedTriangles.length = 0;
|
||||
outer: for (var i = 0; i < trianglesLength; i += 3) {
|
||||
var vertexOffset = triangles[i] << 1;
|
||||
var x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1];
|
||||
var u1 = uvs[vertexOffset], v1 = uvs[vertexOffset + 1];
|
||||
vertexOffset = triangles[i + 1] << 1;
|
||||
var x2 = vertices[vertexOffset], y2 = vertices[vertexOffset + 1];
|
||||
var u2 = uvs[vertexOffset], v2 = uvs[vertexOffset + 1];
|
||||
vertexOffset = triangles[i + 2] << 1;
|
||||
var x3 = vertices[vertexOffset], y3 = vertices[vertexOffset + 1];
|
||||
var u3 = uvs[vertexOffset], v3 = uvs[vertexOffset + 1];
|
||||
for (var p = 0; p < polygonsCount; p++) {
|
||||
var s = clippedVertices.length;
|
||||
if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) {
|
||||
var clipOutputLength = clipOutput.length;
|
||||
if (clipOutputLength == 0)
|
||||
continue;
|
||||
var d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1;
|
||||
var d = 1 / (d0 * d2 + d1 * (y1 - y3));
|
||||
var clipOutputCount = clipOutputLength >> 1;
|
||||
var clipOutputItems = this.clipOutput;
|
||||
var clippedVerticesItems = spine.Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize);
|
||||
for (var ii = 0; ii < clipOutputLength; ii += 2) {
|
||||
var x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
|
||||
clippedVerticesItems[s] = x;
|
||||
clippedVerticesItems[s + 1] = y;
|
||||
clippedVerticesItems[s + 2] = light.r;
|
||||
clippedVerticesItems[s + 3] = light.g;
|
||||
clippedVerticesItems[s + 4] = light.b;
|
||||
clippedVerticesItems[s + 5] = light.a;
|
||||
var c0 = x - x3, c1 = y - y3;
|
||||
var a = (d0 * c0 + d1 * c1) * d;
|
||||
var b = (d4 * c0 + d2 * c1) * d;
|
||||
var c = 1 - a - b;
|
||||
clippedVerticesItems[s + 6] = u1 * a + u2 * b + u3 * c;
|
||||
clippedVerticesItems[s + 7] = v1 * a + v2 * b + v3 * c;
|
||||
if (twoColor) {
|
||||
clippedVerticesItems[s + 8] = dark.r;
|
||||
clippedVerticesItems[s + 8] = dark.g;
|
||||
clippedVerticesItems[s + 10] = dark.b;
|
||||
clippedVerticesItems[s + 11] = dark.a;
|
||||
}
|
||||
s += vertexSize;
|
||||
}
|
||||
s = clippedTriangles.length;
|
||||
var clippedTrianglesItems = spine.Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
|
||||
clipOutputCount--;
|
||||
for (var ii = 1; ii < clipOutputCount; ii++) {
|
||||
clippedTrianglesItems[s] = index;
|
||||
clippedTrianglesItems[s + 1] = (index + ii);
|
||||
clippedTrianglesItems[s + 2] = (index + ii + 1);
|
||||
s += 3;
|
||||
}
|
||||
index += clipOutputCount + 1;
|
||||
}
|
||||
else {
|
||||
var clippedVerticesItems = spine.Utils.setArraySize(clippedVertices, s + 3 * vertexSize);
|
||||
clippedVerticesItems[s] = x1;
|
||||
clippedVerticesItems[s + 1] = y1;
|
||||
clippedVerticesItems[s + 2] = light.r;
|
||||
clippedVerticesItems[s + 3] = light.g;
|
||||
clippedVerticesItems[s + 4] = light.b;
|
||||
clippedVerticesItems[s + 5] = light.a;
|
||||
if (!twoColor) {
|
||||
clippedVerticesItems[s + 6] = u1;
|
||||
clippedVerticesItems[s + 7] = v1;
|
||||
clippedVerticesItems[s + 8] = x2;
|
||||
clippedVerticesItems[s + 9] = y2;
|
||||
clippedVerticesItems[s + 10] = light.r;
|
||||
clippedVerticesItems[s + 11] = light.g;
|
||||
clippedVerticesItems[s + 12] = light.b;
|
||||
clippedVerticesItems[s + 13] = light.a;
|
||||
clippedVerticesItems[s + 14] = u2;
|
||||
clippedVerticesItems[s + 15] = v2;
|
||||
clippedVerticesItems[s + 16] = x3;
|
||||
clippedVerticesItems[s + 17] = y3;
|
||||
clippedVerticesItems[s + 18] = light.r;
|
||||
clippedVerticesItems[s + 19] = light.g;
|
||||
clippedVerticesItems[s + 20] = light.b;
|
||||
clippedVerticesItems[s + 21] = light.a;
|
||||
clippedVerticesItems[s + 22] = u3;
|
||||
clippedVerticesItems[s + 23] = v3;
|
||||
}
|
||||
else {
|
||||
clippedVerticesItems[s + 6] = u1;
|
||||
clippedVerticesItems[s + 7] = v1;
|
||||
clippedVerticesItems[s + 8] = dark.r;
|
||||
clippedVerticesItems[s + 9] = dark.g;
|
||||
clippedVerticesItems[s + 10] = dark.b;
|
||||
clippedVerticesItems[s + 11] = dark.a;
|
||||
clippedVerticesItems[s + 12] = x2;
|
||||
clippedVerticesItems[s + 13] = y2;
|
||||
clippedVerticesItems[s + 14] = light.r;
|
||||
clippedVerticesItems[s + 15] = light.g;
|
||||
clippedVerticesItems[s + 16] = light.b;
|
||||
clippedVerticesItems[s + 17] = light.a;
|
||||
clippedVerticesItems[s + 18] = u2;
|
||||
clippedVerticesItems[s + 19] = v2;
|
||||
clippedVerticesItems[s + 20] = dark.r;
|
||||
clippedVerticesItems[s + 21] = dark.g;
|
||||
clippedVerticesItems[s + 22] = dark.b;
|
||||
clippedVerticesItems[s + 23] = dark.a;
|
||||
clippedVerticesItems[s + 24] = x3;
|
||||
clippedVerticesItems[s + 25] = y3;
|
||||
clippedVerticesItems[s + 26] = light.r;
|
||||
clippedVerticesItems[s + 27] = light.g;
|
||||
clippedVerticesItems[s + 28] = light.b;
|
||||
clippedVerticesItems[s + 29] = light.a;
|
||||
clippedVerticesItems[s + 30] = u3;
|
||||
clippedVerticesItems[s + 31] = v3;
|
||||
clippedVerticesItems[s + 32] = dark.r;
|
||||
clippedVerticesItems[s + 33] = dark.g;
|
||||
clippedVerticesItems[s + 34] = dark.b;
|
||||
clippedVerticesItems[s + 35] = dark.a;
|
||||
}
|
||||
s = clippedTriangles.length;
|
||||
var clippedTrianglesItems = spine.Utils.setArraySize(clippedTriangles, s + 3);
|
||||
clippedTrianglesItems[s] = index;
|
||||
clippedTrianglesItems[s + 1] = (index + 1);
|
||||
clippedTrianglesItems[s + 2] = (index + 2);
|
||||
index += 3;
|
||||
continue outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
SkeletonClipping.prototype.clip = function (x1, y1, x2, y2, x3, y3, clippingArea, output) {
|
||||
var originalOutput = output;
|
||||
var clipped = false;
|
||||
var input = null;
|
||||
if (clippingArea.length % 4 >= 2) {
|
||||
input = output;
|
||||
output = this.scratch;
|
||||
}
|
||||
else
|
||||
input = this.scratch;
|
||||
input.length = 0;
|
||||
input.push(x1);
|
||||
input.push(y1);
|
||||
input.push(x2);
|
||||
input.push(y2);
|
||||
input.push(x3);
|
||||
input.push(y3);
|
||||
input.push(x1);
|
||||
input.push(y1);
|
||||
output.length = 0;
|
||||
var clippingVertices = clippingArea;
|
||||
var clippingVerticesLast = clippingArea.length - 4;
|
||||
for (var i = 0;; i += 2) {
|
||||
var edgeX = clippingVertices[i], edgeY = clippingVertices[i + 1];
|
||||
var edgeX2 = clippingVertices[i + 2], edgeY2 = clippingVertices[i + 3];
|
||||
var deltaX = edgeX - edgeX2, deltaY = edgeY - edgeY2;
|
||||
var inputVertices = input;
|
||||
var inputVerticesLength = input.length - 2, outputStart = output.length;
|
||||
for (var ii = 0; ii < inputVerticesLength; ii += 2) {
|
||||
var inputX = inputVertices[ii], inputY = inputVertices[ii + 1];
|
||||
var inputX2 = inputVertices[ii + 2], inputY2 = inputVertices[ii + 3];
|
||||
var side2 = deltaX * (inputY2 - edgeY2) - deltaY * (inputX2 - edgeX2) > 0;
|
||||
if (deltaX * (inputY - edgeY2) - deltaY * (inputX - edgeX2) > 0) {
|
||||
if (side2) {
|
||||
output.push(inputX2);
|
||||
output.push(inputY2);
|
||||
continue;
|
||||
}
|
||||
var c0 = inputY2 - inputY, c2 = inputX2 - inputX;
|
||||
var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / (c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY));
|
||||
output.push(edgeX + (edgeX2 - edgeX) * ua);
|
||||
output.push(edgeY + (edgeY2 - edgeY) * ua);
|
||||
}
|
||||
else if (side2) {
|
||||
var c0 = inputY2 - inputY, c2 = inputX2 - inputX;
|
||||
var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / (c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY));
|
||||
output.push(edgeX + (edgeX2 - edgeX) * ua);
|
||||
output.push(edgeY + (edgeY2 - edgeY) * ua);
|
||||
output.push(inputX2);
|
||||
output.push(inputY2);
|
||||
}
|
||||
clipped = true;
|
||||
}
|
||||
if (outputStart == output.length) {
|
||||
originalOutput.length = 0;
|
||||
return true;
|
||||
}
|
||||
output.push(output[0]);
|
||||
output.push(output[1]);
|
||||
if (i == clippingVerticesLast)
|
||||
break;
|
||||
var temp = output;
|
||||
output = input;
|
||||
output.length = 0;
|
||||
input = temp;
|
||||
}
|
||||
if (originalOutput != output) {
|
||||
originalOutput.length = 0;
|
||||
for (var i = 0, n = output.length - 2; i < n; i++)
|
||||
originalOutput[i] = output[i];
|
||||
}
|
||||
else
|
||||
originalOutput.length = originalOutput.length - 2;
|
||||
return clipped;
|
||||
};
|
||||
SkeletonClipping.makeClockwise = function (polygon) {
|
||||
var vertices = polygon;
|
||||
var verticeslength = polygon.length;
|
||||
var area = vertices[verticeslength - 2] * vertices[1] - vertices[0] * vertices[verticeslength - 1], p1x = 0, p1y = 0, p2x = 0, p2y = 0;
|
||||
for (var i = 0, n = verticeslength - 3; i < n; i += 2) {
|
||||
p1x = vertices[i];
|
||||
p1y = vertices[i + 1];
|
||||
p2x = vertices[i + 2];
|
||||
p2y = vertices[i + 3];
|
||||
area += p1x * p2y - p2x * p1y;
|
||||
}
|
||||
if (area < 0)
|
||||
return;
|
||||
for (var i = 0, lastX = verticeslength - 2, n = verticeslength >> 1; i < n; i += 2) {
|
||||
var x = vertices[i], y = vertices[i + 1];
|
||||
var other = lastX - i;
|
||||
vertices[i] = vertices[other];
|
||||
vertices[i + 1] = vertices[other + 1];
|
||||
vertices[other] = x;
|
||||
vertices[other + 1] = y;
|
||||
}
|
||||
};
|
||||
return SkeletonClipping;
|
||||
}());
|
||||
spine.SkeletonClipping = SkeletonClipping;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var SkeletonData = (function () {
|
||||
function SkeletonData() {
|
||||
@ -4556,7 +5051,7 @@ var spine;
|
||||
throw new Error("Slot not found: " + slotName);
|
||||
var slotMap = skinMap[slotName];
|
||||
for (var entryName in slotMap) {
|
||||
var attachment = this.readAttachment(slotMap[entryName], skin, slotIndex, entryName);
|
||||
var attachment = this.readAttachment(slotMap[entryName], skin, slotIndex, entryName, skeletonData);
|
||||
if (attachment != null)
|
||||
skin.addAttachment(slotIndex, entryName, attachment);
|
||||
}
|
||||
@ -4596,7 +5091,7 @@ var spine;
|
||||
}
|
||||
return skeletonData;
|
||||
};
|
||||
SkeletonJson.prototype.readAttachment = function (map, skin, slotIndex, name) {
|
||||
SkeletonJson.prototype.readAttachment = function (map, skin, slotIndex, name, skeletonData) {
|
||||
var scale = this.scale;
|
||||
name = this.getValue(map, "name", name);
|
||||
var type = this.getValue(map, "type", "region");
|
||||
@ -4683,6 +5178,24 @@ var spine;
|
||||
point.color.setFromString(color);
|
||||
return point;
|
||||
}
|
||||
case "clipping": {
|
||||
var clip = this.attachmentLoader.newClippingAttachment(skin, name);
|
||||
if (clip == null)
|
||||
return null;
|
||||
var end = this.getValue(map, "end", null);
|
||||
if (end != null) {
|
||||
var slot = skeletonData.findSlot(end);
|
||||
if (slot == null)
|
||||
throw new Error("Clipping end slot not found: " + end);
|
||||
clip.endSlot = slot;
|
||||
}
|
||||
var vertexCount = map.vertexCount;
|
||||
this.readVertices(map, clip, vertexCount << 1);
|
||||
var color = this.getValue(map, "color", null);
|
||||
if (color != null)
|
||||
clip.color.setFromString(color);
|
||||
return clip;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
@ -5797,6 +6310,17 @@ var spine;
|
||||
return array;
|
||||
}
|
||||
};
|
||||
Utils.newShortArray = function (size) {
|
||||
if (Utils.SUPPORTS_TYPED_ARRAYS) {
|
||||
return new Int16Array(size);
|
||||
}
|
||||
else {
|
||||
var array = new Array(size);
|
||||
for (var i = 0; i < array.length; i++)
|
||||
array[i] = 0;
|
||||
return array;
|
||||
}
|
||||
};
|
||||
Utils.toFloatArray = function (array) {
|
||||
return Utils.SUPPORTS_TYPED_ARRAYS ? new Float32Array(array) : array;
|
||||
};
|
||||
@ -8101,6 +8625,7 @@ var spine;
|
||||
this.attachmentLineColor = new spine.Color(0, 0, 1, 0.5);
|
||||
this.triangleLineColor = new spine.Color(1, 0.64, 0, 0.5);
|
||||
this.pathColor = new spine.Color().setFromString("FF7F00");
|
||||
this.clipColor = new spine.Color(0.8, 0, 0, 2);
|
||||
this.aabbColor = new spine.Color(0, 1, 0, 0.5);
|
||||
this.drawBones = true;
|
||||
this.drawRegionAttachments = true;
|
||||
@ -8109,6 +8634,7 @@ var spine;
|
||||
this.drawMeshTriangles = true;
|
||||
this.drawPaths = true;
|
||||
this.drawSkeletonXY = false;
|
||||
this.drawClipping = true;
|
||||
this.premultipliedAlpha = false;
|
||||
this.scale = 1;
|
||||
this.boneWidth = 2;
|
||||
@ -8249,6 +8775,27 @@ var spine;
|
||||
shapes.circle(true, skeletonX + bone.worldX, skeletonY + bone.worldY, 3 * this.scale, SkeletonDebugRenderer.GREEN, 8);
|
||||
}
|
||||
}
|
||||
if (this.drawClipping) {
|
||||
var slots = skeleton.slots;
|
||||
shapes.setColor(this.clipColor);
|
||||
for (var i = 0, n = slots.length; i < n; i++) {
|
||||
var slot = slots[i];
|
||||
var attachment = slot.getAttachment();
|
||||
if (!(attachment instanceof spine.ClippingAttachment))
|
||||
continue;
|
||||
var clip = attachment;
|
||||
var nn = clip.worldVerticesLength;
|
||||
var world = this.temp = spine.Utils.setArraySize(this.temp, nn, 0);
|
||||
clip.computeWorldVertices(slot, 0, nn, world, 0, 2);
|
||||
for (var i_5 = 0, n_2 = world.length; i_5 < n_2; i_5 += 2) {
|
||||
var x = world[i_5];
|
||||
var y = world[i_5 + 1];
|
||||
var x2 = world[(i_5 + 2) % world.length];
|
||||
var y2 = world[(i_5 + 3) % world.length];
|
||||
shapes.line(x, y, x2, y2);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
SkeletonDebugRenderer.prototype.dispose = function () {
|
||||
};
|
||||
@ -8264,8 +8811,9 @@ var spine;
|
||||
var webgl;
|
||||
(function (webgl) {
|
||||
var Renderable = (function () {
|
||||
function Renderable(vertices, numFloats) {
|
||||
function Renderable(vertices, numVertices, numFloats) {
|
||||
this.vertices = vertices;
|
||||
this.numVertices = numVertices;
|
||||
this.numFloats = numFloats;
|
||||
}
|
||||
return Renderable;
|
||||
@ -8279,7 +8827,8 @@ var spine;
|
||||
this.tempColor2 = new spine.Color();
|
||||
this.vertexSize = 2 + 2 + 4;
|
||||
this.twoColorTint = false;
|
||||
this.renderable = new Renderable(null, 0);
|
||||
this.renderable = new Renderable(null, 0, 0);
|
||||
this.clipper = new spine.SkeletonClipping();
|
||||
this.gl = gl;
|
||||
this.twoColorTint = twoColorTint;
|
||||
if (twoColorTint)
|
||||
@ -8287,165 +8836,115 @@ var spine;
|
||||
this.vertices = spine.Utils.newFloatArray(this.vertexSize * 1024);
|
||||
}
|
||||
SkeletonRenderer.prototype.draw = function (batcher, skeleton) {
|
||||
var clipper = this.clipper;
|
||||
var premultipliedAlpha = this.premultipliedAlpha;
|
||||
var twoColorTint = this.twoColorTint;
|
||||
var blendMode = null;
|
||||
var vertices = null;
|
||||
var renderable = this.renderable;
|
||||
var uvs = null;
|
||||
var triangles = null;
|
||||
var drawOrder = skeleton.drawOrder;
|
||||
var attachmentColor = null;
|
||||
var skeletonColor = skeleton.color;
|
||||
var vertexSize = twoColorTint ? 12 : 8;
|
||||
for (var i = 0, n = drawOrder.length; i < n; i++) {
|
||||
var clippedVertexSize = clipper.isClipping() ? 2 : vertexSize;
|
||||
var slot = drawOrder[i];
|
||||
var attachment = slot.getAttachment();
|
||||
var texture = null;
|
||||
if (attachment instanceof spine.RegionAttachment) {
|
||||
var region = attachment;
|
||||
vertices = this.computeRegionVertices(slot, region, premultipliedAlpha, this.twoColorTint);
|
||||
renderable.vertices = this.vertices;
|
||||
renderable.numVertices = 4;
|
||||
renderable.numFloats = clippedVertexSize << 2;
|
||||
region.computeWorldVertices(slot.bone, renderable.vertices, 0, clippedVertexSize);
|
||||
triangles = SkeletonRenderer.QUAD_TRIANGLES;
|
||||
uvs = region.uvs;
|
||||
texture = region.region.renderObject.texture;
|
||||
attachmentColor = region.color;
|
||||
}
|
||||
else if (attachment instanceof spine.MeshAttachment) {
|
||||
var mesh = attachment;
|
||||
vertices = this.computeMeshVertices(slot, mesh, premultipliedAlpha, this.twoColorTint);
|
||||
renderable.vertices = this.vertices;
|
||||
renderable.numVertices = (mesh.worldVerticesLength >> 1);
|
||||
renderable.numFloats = renderable.numVertices * clippedVertexSize;
|
||||
if (renderable.numFloats > renderable.vertices.length) {
|
||||
renderable.vertices = this.vertices = spine.Utils.newFloatArray(renderable.numFloats);
|
||||
}
|
||||
mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, renderable.vertices, 0, clippedVertexSize);
|
||||
triangles = mesh.triangles;
|
||||
texture = mesh.region.renderObject.texture;
|
||||
uvs = mesh.uvs;
|
||||
attachmentColor = mesh.color;
|
||||
}
|
||||
else if (attachment instanceof spine.ClippingAttachment) {
|
||||
var clip = (attachment);
|
||||
clipper.clipStart(slot, clip);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
continue;
|
||||
if (texture != null) {
|
||||
var slotColor = slot.color;
|
||||
var finalColor = this.tempColor;
|
||||
finalColor.r = skeletonColor.r * slotColor.r * attachmentColor.r;
|
||||
finalColor.g = skeletonColor.g * slotColor.g * attachmentColor.g;
|
||||
finalColor.b = skeletonColor.b * slotColor.b * attachmentColor.b;
|
||||
finalColor.a = skeletonColor.a * slotColor.a * attachmentColor.a;
|
||||
if (premultipliedAlpha) {
|
||||
finalColor.r *= finalColor.a;
|
||||
finalColor.g *= finalColor.a;
|
||||
finalColor.b *= finalColor.a;
|
||||
}
|
||||
var darkColor = this.tempColor2;
|
||||
if (slot.darkColor == null)
|
||||
darkColor.set(0, 0, 0, 1);
|
||||
else
|
||||
darkColor.setFromColor(slot.darkColor);
|
||||
var slotBlendMode = slot.data.blendMode;
|
||||
if (slotBlendMode != blendMode) {
|
||||
blendMode = slotBlendMode;
|
||||
batcher.setBlendMode(webgl.getSourceGLBlendMode(this.gl, blendMode, premultipliedAlpha), webgl.getDestGLBlendMode(this.gl, blendMode));
|
||||
}
|
||||
var view = vertices.vertices.subarray(0, vertices.numFloats);
|
||||
batcher.draw(texture, view, triangles);
|
||||
if (clipper.isClipping()) {
|
||||
clipper.clipTriangles(renderable.vertices, renderable.numFloats, triangles, triangles.length, uvs, finalColor, darkColor, twoColorTint);
|
||||
var clippedVertices = new Float32Array(clipper.clippedVertices);
|
||||
var clippedTriangles = clipper.clippedTriangles;
|
||||
batcher.draw(texture, clippedVertices, clippedTriangles);
|
||||
}
|
||||
else {
|
||||
var verts = renderable.vertices;
|
||||
if (!twoColorTint) {
|
||||
for (var v = 2, u = 0, n_3 = renderable.numFloats; v < n_3; v += vertexSize, u += 2) {
|
||||
verts[v] = finalColor.r;
|
||||
verts[v + 1] = finalColor.g;
|
||||
verts[v + 2] = finalColor.b;
|
||||
verts[v + 3] = finalColor.a;
|
||||
verts[v + 4] = uvs[u];
|
||||
verts[v + 5] = uvs[u + 1];
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (var v = 2, u = 0, n_4 = renderable.numFloats; v < n_4; v += vertexSize, u += 2) {
|
||||
verts[v] = finalColor.r;
|
||||
verts[v + 1] = finalColor.g;
|
||||
verts[v + 2] = finalColor.b;
|
||||
verts[v + 3] = finalColor.a;
|
||||
verts[v + 4] = uvs[u];
|
||||
verts[v + 5] = uvs[u + 1];
|
||||
verts[v + 6] = darkColor.r;
|
||||
verts[v + 7] = darkColor.g;
|
||||
verts[v + 8] = darkColor.b;
|
||||
verts[v + 9] = darkColor.a;
|
||||
}
|
||||
}
|
||||
var view = renderable.vertices.subarray(0, renderable.numFloats);
|
||||
batcher.draw(texture, view, triangles);
|
||||
}
|
||||
}
|
||||
clipper.clipEndWithSlot(slot);
|
||||
}
|
||||
};
|
||||
SkeletonRenderer.prototype.computeRegionVertices = function (slot, region, pma, twoColorTint) {
|
||||
if (twoColorTint === void 0) { twoColorTint = false; }
|
||||
var skeleton = slot.bone.skeleton;
|
||||
var skeletonColor = skeleton.color;
|
||||
var slotColor = slot.color;
|
||||
var regionColor = region.color;
|
||||
var alpha = skeletonColor.a * slotColor.a * regionColor.a;
|
||||
var multiplier = pma ? alpha : 1;
|
||||
var color = this.tempColor;
|
||||
color.set(skeletonColor.r * slotColor.r * regionColor.r * multiplier, skeletonColor.g * slotColor.g * regionColor.g * multiplier, skeletonColor.b * slotColor.b * regionColor.b * multiplier, alpha);
|
||||
var dark = this.tempColor2;
|
||||
if (slot.darkColor == null)
|
||||
dark.set(0, 0, 0, 1);
|
||||
else
|
||||
dark.setFromColor(slot.darkColor);
|
||||
region.computeWorldVertices(slot.bone, this.vertices, 0, this.vertexSize);
|
||||
var vertices = this.vertices;
|
||||
var uvs = region.uvs;
|
||||
var i = 2;
|
||||
vertices[i++] = color.r;
|
||||
vertices[i++] = color.g;
|
||||
vertices[i++] = color.b;
|
||||
vertices[i++] = color.a;
|
||||
vertices[i++] = uvs[0];
|
||||
vertices[i++] = uvs[1];
|
||||
if (twoColorTint) {
|
||||
vertices[i++] = dark.r;
|
||||
vertices[i++] = dark.g;
|
||||
vertices[i++] = dark.b;
|
||||
vertices[i++] = 1;
|
||||
}
|
||||
i += 2;
|
||||
vertices[i++] = color.r;
|
||||
vertices[i++] = color.g;
|
||||
vertices[i++] = color.b;
|
||||
vertices[i++] = color.a;
|
||||
vertices[i++] = uvs[2];
|
||||
vertices[i++] = uvs[3];
|
||||
if (twoColorTint) {
|
||||
vertices[i++] = dark.r;
|
||||
vertices[i++] = dark.g;
|
||||
vertices[i++] = dark.b;
|
||||
vertices[i++] = 1;
|
||||
}
|
||||
i += 2;
|
||||
vertices[i++] = color.r;
|
||||
vertices[i++] = color.g;
|
||||
vertices[i++] = color.b;
|
||||
vertices[i++] = color.a;
|
||||
vertices[i++] = uvs[4];
|
||||
vertices[i++] = uvs[5];
|
||||
if (twoColorTint) {
|
||||
vertices[i++] = dark.r;
|
||||
vertices[i++] = dark.g;
|
||||
vertices[i++] = dark.b;
|
||||
vertices[i++] = 1;
|
||||
}
|
||||
i += 2;
|
||||
vertices[i++] = color.r;
|
||||
vertices[i++] = color.g;
|
||||
vertices[i++] = color.b;
|
||||
vertices[i++] = color.a;
|
||||
vertices[i++] = uvs[6];
|
||||
vertices[i++] = uvs[7];
|
||||
if (twoColorTint) {
|
||||
vertices[i++] = dark.r;
|
||||
vertices[i++] = dark.g;
|
||||
vertices[i++] = dark.b;
|
||||
vertices[i++] = 1;
|
||||
}
|
||||
this.renderable.vertices = vertices;
|
||||
this.renderable.numFloats = 4 * (twoColorTint ? 12 : 8);
|
||||
return this.renderable;
|
||||
};
|
||||
SkeletonRenderer.prototype.computeMeshVertices = function (slot, mesh, pma, twoColorTint) {
|
||||
if (twoColorTint === void 0) { twoColorTint = false; }
|
||||
var skeleton = slot.bone.skeleton;
|
||||
var skeletonColor = skeleton.color;
|
||||
var slotColor = slot.color;
|
||||
var regionColor = mesh.color;
|
||||
var alpha = skeletonColor.a * slotColor.a * regionColor.a;
|
||||
var multiplier = pma ? alpha : 1;
|
||||
var color = this.tempColor;
|
||||
color.set(skeletonColor.r * slotColor.r * regionColor.r * multiplier, skeletonColor.g * slotColor.g * regionColor.g * multiplier, skeletonColor.b * slotColor.b * regionColor.b * multiplier, alpha);
|
||||
var dark = this.tempColor2;
|
||||
if (slot.darkColor == null)
|
||||
dark.set(0, 0, 0, 1);
|
||||
else
|
||||
dark.setFromColor(slot.darkColor);
|
||||
var numVertices = mesh.worldVerticesLength / 2;
|
||||
if (this.vertices.length < mesh.worldVerticesLength) {
|
||||
this.vertices = spine.Utils.newFloatArray(mesh.worldVerticesLength);
|
||||
}
|
||||
var vertices = this.vertices;
|
||||
mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, vertices, 0, this.vertexSize);
|
||||
var uvs = mesh.uvs;
|
||||
if (!twoColorTint) {
|
||||
for (var i = 0, n = numVertices, u = 0, v = 2; i < n; i++) {
|
||||
vertices[v++] = color.r;
|
||||
vertices[v++] = color.g;
|
||||
vertices[v++] = color.b;
|
||||
vertices[v++] = color.a;
|
||||
vertices[v++] = uvs[u++];
|
||||
vertices[v++] = uvs[u++];
|
||||
v += 2;
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (var i = 0, n = numVertices, u = 0, v = 2; i < n; i++) {
|
||||
vertices[v++] = color.r;
|
||||
vertices[v++] = color.g;
|
||||
vertices[v++] = color.b;
|
||||
vertices[v++] = color.a;
|
||||
vertices[v++] = uvs[u++];
|
||||
vertices[v++] = uvs[u++];
|
||||
vertices[v++] = dark.r;
|
||||
vertices[v++] = dark.g;
|
||||
vertices[v++] = dark.b;
|
||||
vertices[v++] = 1;
|
||||
v += 2;
|
||||
}
|
||||
}
|
||||
this.renderable.vertices = vertices;
|
||||
this.renderable.numFloats = numVertices * (twoColorTint ? 12 : 8);
|
||||
return this.renderable;
|
||||
clipper.clipEnd();
|
||||
};
|
||||
SkeletonRenderer.QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0];
|
||||
return SkeletonRenderer;
|
||||
|
||||
File diff suppressed because one or more lines are too long
46
spine-ts/build/spine-canvas.d.ts
vendored
46
spine-ts/build/spine-canvas.d.ts
vendored
@ -454,6 +454,7 @@ declare module spine {
|
||||
newBoundingBoxAttachment(skin: Skin, name: string): BoundingBoxAttachment;
|
||||
newPathAttachment(skin: Skin, name: string): PathAttachment;
|
||||
newPointAttachment(skin: Skin, name: string): PointAttachment;
|
||||
newClippingAttachment(skin: Skin, name: string): ClippingAttachment;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
@ -477,6 +478,7 @@ declare module spine {
|
||||
newBoundingBoxAttachment(skin: Skin, name: string): BoundingBoxAttachment;
|
||||
newPathAttachment(skin: Skin, name: string): PathAttachment;
|
||||
newPointAttachment(skin: Skin, name: string): PointAttachment;
|
||||
newClippingAttachment(skin: Skin, name: string): ClippingAttachment;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
@ -495,6 +497,13 @@ declare module spine {
|
||||
constructor(name: string);
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class ClippingAttachment extends VertexAttachment {
|
||||
endSlot: SlotData;
|
||||
color: Color;
|
||||
constructor(name: string);
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class MeshAttachment extends VertexAttachment {
|
||||
region: TextureRegion;
|
||||
@ -678,6 +687,21 @@ declare module spine {
|
||||
getOrder(): number;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class ConvexDecomposer {
|
||||
private convexPolygons;
|
||||
private convexPolygonsIndices;
|
||||
private indicesArray;
|
||||
private isConcaveArray;
|
||||
private triangles;
|
||||
private polygonPool;
|
||||
private polygonIndicesPool;
|
||||
decompose(input: ArrayLike<number>): Array<Array<number>>;
|
||||
private static isConcave(index, vertexCount, vertices, indices);
|
||||
private static positiveArea(p1x, p1y, p2x, p2y, p3x, p3y);
|
||||
private static winding(p1x, p1y, p2x, p2y, p3x, p3y);
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class Event {
|
||||
data: EventData;
|
||||
@ -873,6 +897,25 @@ declare module spine {
|
||||
getHeight(): number;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class SkeletonClipping {
|
||||
private decomposer;
|
||||
private clippingPolygon;
|
||||
private clipOutput;
|
||||
clippedVertices: number[];
|
||||
clippedTriangles: number[];
|
||||
private scratch;
|
||||
private clipAttachment;
|
||||
private clippingPolygons;
|
||||
clipStart(slot: Slot, clip: ClippingAttachment): void;
|
||||
clipEndWithSlot(slot: Slot): void;
|
||||
clipEnd(): void;
|
||||
isClipping(): boolean;
|
||||
clipTriangles(vertices: ArrayLike<number>, verticesLength: number, triangles: ArrayLike<number>, trianglesLength: number, uvs: ArrayLike<number>, light: Color, dark: Color, twoColor: boolean): void;
|
||||
clip(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, clippingArea: Array<number>, output: Array<number>): boolean;
|
||||
static makeClockwise(polygon: ArrayLike<number>): void;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class SkeletonData {
|
||||
name: string;
|
||||
@ -911,7 +954,7 @@ declare module spine {
|
||||
private linkedMeshes;
|
||||
constructor(attachmentLoader: AttachmentLoader);
|
||||
readSkeletonData(json: string | any): SkeletonData;
|
||||
readAttachment(map: any, skin: Skin, slotIndex: number, name: string): Attachment;
|
||||
readAttachment(map: any, skin: Skin, slotIndex: number, name: string, skeletonData: SkeletonData): Attachment;
|
||||
readVertices(map: any, attachment: VertexAttachment, verticesLength: number): void;
|
||||
readAnimation(map: any, name: string, skeletonData: SkeletonData): void;
|
||||
readCurve(map: any, timeline: CurveTimeline, frameIndex: number): void;
|
||||
@ -1089,6 +1132,7 @@ declare module spine {
|
||||
static ensureArrayCapacity<T>(array: Array<T>, size: number, value?: any): Array<T>;
|
||||
static newArray<T>(size: number, defaultValue: T): Array<T>;
|
||||
static newFloatArray(size: number): ArrayLike<number>;
|
||||
static newShortArray(size: number): ArrayLike<number>;
|
||||
static toFloatArray(array: Array<number>): number[] | Float32Array;
|
||||
}
|
||||
class DebugUtils {
|
||||
|
||||
@ -2242,6 +2242,9 @@ var spine;
|
||||
AtlasAttachmentLoader.prototype.newPointAttachment = function (skin, name) {
|
||||
return new spine.PointAttachment(name);
|
||||
};
|
||||
AtlasAttachmentLoader.prototype.newClippingAttachment = function (skin, name) {
|
||||
return new spine.ClippingAttachment(name);
|
||||
};
|
||||
return AtlasAttachmentLoader;
|
||||
}());
|
||||
spine.AtlasAttachmentLoader = AtlasAttachmentLoader;
|
||||
@ -2354,6 +2357,18 @@ var spine;
|
||||
spine.BoundingBoxAttachment = BoundingBoxAttachment;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var ClippingAttachment = (function (_super) {
|
||||
__extends(ClippingAttachment, _super);
|
||||
function ClippingAttachment(name) {
|
||||
_super.call(this, name);
|
||||
this.color = new spine.Color(0.2275, 0.2275, 0.8078, 1);
|
||||
}
|
||||
return ClippingAttachment;
|
||||
}(spine.VertexAttachment));
|
||||
spine.ClippingAttachment = ClippingAttachment;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var MeshAttachment = (function (_super) {
|
||||
__extends(MeshAttachment, _super);
|
||||
@ -2897,6 +2912,207 @@ var spine;
|
||||
var TransformMode = spine.TransformMode;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var ConvexDecomposer = (function () {
|
||||
function ConvexDecomposer() {
|
||||
this.convexPolygons = new Array();
|
||||
this.convexPolygonsIndices = new Array();
|
||||
this.indicesArray = new Array();
|
||||
this.isConcaveArray = new Array();
|
||||
this.triangles = new Array();
|
||||
this.polygonPool = new spine.Pool(function () {
|
||||
return new Array();
|
||||
});
|
||||
this.polygonIndicesPool = new spine.Pool(function () {
|
||||
return new Array();
|
||||
});
|
||||
}
|
||||
ConvexDecomposer.prototype.decompose = function (input) {
|
||||
var vertices = input;
|
||||
var vertexCount = input.length >> 1;
|
||||
var indices = this.indicesArray;
|
||||
indices.length = 0;
|
||||
for (var i = 0; i < vertexCount; i++)
|
||||
indices[i] = i;
|
||||
var isConcave = this.isConcaveArray;
|
||||
isConcave.length = 0;
|
||||
for (var i = 0, n = vertexCount; i < n; ++i)
|
||||
isConcave[i] = ConvexDecomposer.isConcave(i, vertexCount, vertices, indices);
|
||||
var triangles = this.triangles;
|
||||
triangles.length = 0;
|
||||
while (vertexCount > 3) {
|
||||
var previous = vertexCount - 1, i = 0, next = 1;
|
||||
while (true) {
|
||||
outer: if (!isConcave[i]) {
|
||||
var p1 = indices[previous] << 1, p2 = indices[i] << 1, p3 = indices[next] << 1;
|
||||
var p1x = vertices[p1], p1y = vertices[p1 + 1];
|
||||
var p2x = vertices[p2], p2y = vertices[p2 + 1];
|
||||
var p3x = vertices[p3], p3y = vertices[p3 + 1];
|
||||
for (var ii = (next + 1) % vertexCount; ii != previous; ii = (ii + 1) % vertexCount) {
|
||||
if (!isConcave[ii])
|
||||
continue;
|
||||
var v = indices[ii] << 1;
|
||||
var vx = vertices[v], vy = vertices[v + 1];
|
||||
if (ConvexDecomposer.positiveArea(p3x, p3y, p1x, p1y, vx, vy)) {
|
||||
if (ConvexDecomposer.positiveArea(p1x, p1y, p2x, p2y, vx, vy)) {
|
||||
if (ConvexDecomposer.positiveArea(p2x, p2y, p3x, p3y, vx, vy))
|
||||
break outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (next == 0) {
|
||||
do {
|
||||
if (!isConcave[i])
|
||||
break;
|
||||
i--;
|
||||
} while (i > 0);
|
||||
break;
|
||||
}
|
||||
previous = i;
|
||||
i = next;
|
||||
next = (next + 1) % vertexCount;
|
||||
}
|
||||
triangles.push(indices[(vertexCount + i - 1) % vertexCount]);
|
||||
triangles.push(indices[i]);
|
||||
triangles.push(indices[(i + 1) % vertexCount]);
|
||||
indices.splice(i, 1);
|
||||
isConcave.splice(i, 1);
|
||||
vertexCount--;
|
||||
var previousIndex = (vertexCount + i - 1) % vertexCount;
|
||||
var nextIndex = i == vertexCount ? 0 : i;
|
||||
isConcave[previousIndex] = ConvexDecomposer.isConcave(previousIndex, vertexCount, vertices, indices);
|
||||
isConcave[nextIndex] = ConvexDecomposer.isConcave(nextIndex, vertexCount, vertices, indices);
|
||||
}
|
||||
if (vertexCount == 3) {
|
||||
triangles.push(indices[2]);
|
||||
triangles.push(indices[0]);
|
||||
triangles.push(indices[1]);
|
||||
}
|
||||
var convexPolygons = this.convexPolygons;
|
||||
this.polygonPool.freeAll(convexPolygons);
|
||||
convexPolygons.length = 0;
|
||||
var convexPolygonsIndices = this.convexPolygonsIndices;
|
||||
this.polygonIndicesPool.freeAll(convexPolygonsIndices);
|
||||
convexPolygonsIndices.length = 0;
|
||||
var polygonIndices = this.polygonIndicesPool.obtain();
|
||||
polygonIndices.length = 0;
|
||||
var polygon = this.polygonPool.obtain();
|
||||
polygon.length = 0;
|
||||
var fanBaseIndex = -1, lastWinding = 0;
|
||||
for (var i = 0, n = triangles.length; i < n; i += 3) {
|
||||
var t1 = triangles[i] << 1, t2 = triangles[i + 1] << 1, t3 = triangles[i + 2] << 1;
|
||||
var x1 = vertices[t1], y1 = vertices[t1 + 1];
|
||||
var x2 = vertices[t2], y2 = vertices[t2 + 1];
|
||||
var x3 = vertices[t3], y3 = vertices[t3 + 1];
|
||||
var merged = false;
|
||||
if (fanBaseIndex == t1) {
|
||||
var o = polygon.length - 4;
|
||||
var winding1 = ConvexDecomposer.winding(polygon[o], polygon[o + 1], polygon[o + 2], polygon[o + 3], x3, y3);
|
||||
var winding2 = ConvexDecomposer.winding(x3, y3, polygon[0], polygon[1], polygon[2], polygon[3]);
|
||||
if (winding1 == lastWinding && winding2 == lastWinding) {
|
||||
polygon.push(x3);
|
||||
polygon.push(y3);
|
||||
polygonIndices.push(t3);
|
||||
merged = true;
|
||||
}
|
||||
}
|
||||
if (!merged) {
|
||||
if (polygon.length > 0) {
|
||||
convexPolygons.push(polygon);
|
||||
convexPolygonsIndices.push(polygonIndices);
|
||||
}
|
||||
polygon = this.polygonPool.obtain();
|
||||
polygon.length = 0;
|
||||
polygon.push(x1);
|
||||
polygon.push(y1);
|
||||
polygon.push(x2);
|
||||
polygon.push(y2);
|
||||
polygon.push(x3);
|
||||
polygon.push(y3);
|
||||
polygonIndices = this.polygonIndicesPool.obtain();
|
||||
polygonIndices.length = 0;
|
||||
polygonIndices.push(t1);
|
||||
polygonIndices.push(t2);
|
||||
polygonIndices.push(t3);
|
||||
lastWinding = ConvexDecomposer.winding(x1, y1, x2, y2, x3, y3);
|
||||
fanBaseIndex = t1;
|
||||
}
|
||||
}
|
||||
if (polygon.length > 0) {
|
||||
convexPolygons.push(polygon);
|
||||
convexPolygonsIndices.push(polygonIndices);
|
||||
}
|
||||
for (var i = 0, n = convexPolygons.length; i < n; i++) {
|
||||
polygonIndices = convexPolygonsIndices[i];
|
||||
if (polygonIndices.length == 0)
|
||||
continue;
|
||||
var firstIndex = polygonIndices[0];
|
||||
var lastIndex = polygonIndices[polygonIndices.length - 1];
|
||||
polygon = convexPolygons[i];
|
||||
var o = polygon.length - 4;
|
||||
var prevPrevX = polygon[o], prevPrevY = polygon[o + 1];
|
||||
var prevX = polygon[o + 2], prevY = polygon[o + 3];
|
||||
var firstX = polygon[0], firstY = polygon[1];
|
||||
var secondX = polygon[2], secondY = polygon[3];
|
||||
var winding = ConvexDecomposer.winding(prevPrevX, prevPrevY, prevX, prevY, firstX, firstY);
|
||||
for (var ii = 0; ii < n; ii++) {
|
||||
if (ii == i)
|
||||
continue;
|
||||
var otherIndices = convexPolygonsIndices[ii];
|
||||
if (otherIndices.length != 3)
|
||||
continue;
|
||||
var otherFirstIndex = otherIndices[0];
|
||||
var otherSecondIndex = otherIndices[1];
|
||||
var otherLastIndex = otherIndices[2];
|
||||
var otherPoly = convexPolygons[ii];
|
||||
var x3 = otherPoly[otherPoly.length - 2], y3 = otherPoly[otherPoly.length - 1];
|
||||
if (otherFirstIndex != firstIndex || otherSecondIndex != lastIndex)
|
||||
continue;
|
||||
var winding1 = ConvexDecomposer.winding(prevPrevX, prevPrevY, prevX, prevY, x3, y3);
|
||||
var winding2 = ConvexDecomposer.winding(x3, y3, firstX, firstY, secondX, secondY);
|
||||
if (winding1 == winding && winding2 == winding) {
|
||||
otherPoly.length = 0;
|
||||
otherIndices.length = 0;
|
||||
polygon.push(x3);
|
||||
polygon.push(y3);
|
||||
polygonIndices.push(otherLastIndex);
|
||||
prevPrevX = prevX;
|
||||
prevPrevY = prevY;
|
||||
prevX = x3;
|
||||
prevY = y3;
|
||||
ii = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (var i = convexPolygons.length - 1; i >= 0; i--) {
|
||||
polygon = convexPolygons[i];
|
||||
if (polygon.length == 0) {
|
||||
convexPolygons.splice(i, 1);
|
||||
this.polygonPool.free(polygon);
|
||||
}
|
||||
}
|
||||
return convexPolygons;
|
||||
};
|
||||
ConvexDecomposer.isConcave = function (index, vertexCount, vertices, indices) {
|
||||
var previous = indices[(vertexCount + index - 1) % vertexCount] << 1;
|
||||
var current = indices[index] << 1;
|
||||
var next = indices[(index + 1) % vertexCount] << 1;
|
||||
return !this.positiveArea(vertices[previous], vertices[previous + 1], vertices[current], vertices[current + 1], vertices[next], vertices[next + 1]);
|
||||
};
|
||||
ConvexDecomposer.positiveArea = function (p1x, p1y, p2x, p2y, p3x, p3y) {
|
||||
return p1x * (p3y - p2y) + p2x * (p1y - p3y) + p3x * (p2y - p1y) >= 0;
|
||||
};
|
||||
ConvexDecomposer.winding = function (p1x, p1y, p2x, p2y, p3x, p3y) {
|
||||
var px = p2x - p1x, py = p2y - p1y;
|
||||
return p3x * py - p3y * px + px * p1y - p1x * py >= 0 ? 1 : -1;
|
||||
};
|
||||
return ConvexDecomposer;
|
||||
}());
|
||||
spine.ConvexDecomposer = ConvexDecomposer;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var Event = (function () {
|
||||
function Event(time, data) {
|
||||
@ -4265,6 +4481,285 @@ var spine;
|
||||
spine.SkeletonBounds = SkeletonBounds;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var SkeletonClipping = (function () {
|
||||
function SkeletonClipping() {
|
||||
this.decomposer = new spine.ConvexDecomposer();
|
||||
this.clippingPolygon = new Array();
|
||||
this.clipOutput = new Array();
|
||||
this.clippedVertices = new Array();
|
||||
this.clippedTriangles = new Array();
|
||||
this.scratch = new Array();
|
||||
}
|
||||
SkeletonClipping.prototype.clipStart = function (slot, clip) {
|
||||
if (this.clipAttachment != null)
|
||||
return;
|
||||
this.clipAttachment = clip;
|
||||
var n = clip.worldVerticesLength;
|
||||
var vertices = spine.Utils.setArraySize(this.clippingPolygon, n);
|
||||
clip.computeWorldVertices(slot, 0, n, vertices, 0, 2);
|
||||
var clippingPolygon = this.clippingPolygon;
|
||||
SkeletonClipping.makeClockwise(clippingPolygon);
|
||||
var clippingPolygons = this.clippingPolygons = this.decomposer.decompose(clippingPolygon);
|
||||
for (var i = 0, n_1 = clippingPolygons.length; i < n_1; i++) {
|
||||
var polygon = clippingPolygons[i];
|
||||
SkeletonClipping.makeClockwise(polygon);
|
||||
polygon.push(polygon[0]);
|
||||
polygon.push(polygon[1]);
|
||||
}
|
||||
};
|
||||
SkeletonClipping.prototype.clipEndWithSlot = function (slot) {
|
||||
if (this.clipAttachment != null && this.clipAttachment.endSlot == slot.data)
|
||||
this.clipEnd();
|
||||
};
|
||||
SkeletonClipping.prototype.clipEnd = function () {
|
||||
if (this.clipAttachment == null)
|
||||
return;
|
||||
this.clipAttachment = null;
|
||||
this.clippingPolygons = null;
|
||||
this.clippedVertices.length = 0;
|
||||
this.clippedTriangles.length = 0;
|
||||
this.clippingPolygon.length = 0;
|
||||
};
|
||||
SkeletonClipping.prototype.isClipping = function () {
|
||||
return this.clipAttachment != null;
|
||||
};
|
||||
SkeletonClipping.prototype.clipTriangles = function (vertices, verticesLength, triangles, trianglesLength, uvs, light, dark, twoColor) {
|
||||
var clipOutput = this.clipOutput, clippedVertices = this.clippedVertices;
|
||||
var clippedTriangles = this.clippedTriangles;
|
||||
var polygons = this.clippingPolygons;
|
||||
var polygonsCount = this.clippingPolygons.length;
|
||||
var vertexSize = twoColor ? 12 : 8;
|
||||
var index = 0;
|
||||
clippedVertices.length = 0;
|
||||
clippedTriangles.length = 0;
|
||||
outer: for (var i = 0; i < trianglesLength; i += 3) {
|
||||
var vertexOffset = triangles[i] << 1;
|
||||
var x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1];
|
||||
var u1 = uvs[vertexOffset], v1 = uvs[vertexOffset + 1];
|
||||
vertexOffset = triangles[i + 1] << 1;
|
||||
var x2 = vertices[vertexOffset], y2 = vertices[vertexOffset + 1];
|
||||
var u2 = uvs[vertexOffset], v2 = uvs[vertexOffset + 1];
|
||||
vertexOffset = triangles[i + 2] << 1;
|
||||
var x3 = vertices[vertexOffset], y3 = vertices[vertexOffset + 1];
|
||||
var u3 = uvs[vertexOffset], v3 = uvs[vertexOffset + 1];
|
||||
for (var p = 0; p < polygonsCount; p++) {
|
||||
var s = clippedVertices.length;
|
||||
if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) {
|
||||
var clipOutputLength = clipOutput.length;
|
||||
if (clipOutputLength == 0)
|
||||
continue;
|
||||
var d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1;
|
||||
var d = 1 / (d0 * d2 + d1 * (y1 - y3));
|
||||
var clipOutputCount = clipOutputLength >> 1;
|
||||
var clipOutputItems = this.clipOutput;
|
||||
var clippedVerticesItems = spine.Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize);
|
||||
for (var ii = 0; ii < clipOutputLength; ii += 2) {
|
||||
var x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
|
||||
clippedVerticesItems[s] = x;
|
||||
clippedVerticesItems[s + 1] = y;
|
||||
clippedVerticesItems[s + 2] = light.r;
|
||||
clippedVerticesItems[s + 3] = light.g;
|
||||
clippedVerticesItems[s + 4] = light.b;
|
||||
clippedVerticesItems[s + 5] = light.a;
|
||||
var c0 = x - x3, c1 = y - y3;
|
||||
var a = (d0 * c0 + d1 * c1) * d;
|
||||
var b = (d4 * c0 + d2 * c1) * d;
|
||||
var c = 1 - a - b;
|
||||
clippedVerticesItems[s + 6] = u1 * a + u2 * b + u3 * c;
|
||||
clippedVerticesItems[s + 7] = v1 * a + v2 * b + v3 * c;
|
||||
if (twoColor) {
|
||||
clippedVerticesItems[s + 8] = dark.r;
|
||||
clippedVerticesItems[s + 8] = dark.g;
|
||||
clippedVerticesItems[s + 10] = dark.b;
|
||||
clippedVerticesItems[s + 11] = dark.a;
|
||||
}
|
||||
s += vertexSize;
|
||||
}
|
||||
s = clippedTriangles.length;
|
||||
var clippedTrianglesItems = spine.Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
|
||||
clipOutputCount--;
|
||||
for (var ii = 1; ii < clipOutputCount; ii++) {
|
||||
clippedTrianglesItems[s] = index;
|
||||
clippedTrianglesItems[s + 1] = (index + ii);
|
||||
clippedTrianglesItems[s + 2] = (index + ii + 1);
|
||||
s += 3;
|
||||
}
|
||||
index += clipOutputCount + 1;
|
||||
}
|
||||
else {
|
||||
var clippedVerticesItems = spine.Utils.setArraySize(clippedVertices, s + 3 * vertexSize);
|
||||
clippedVerticesItems[s] = x1;
|
||||
clippedVerticesItems[s + 1] = y1;
|
||||
clippedVerticesItems[s + 2] = light.r;
|
||||
clippedVerticesItems[s + 3] = light.g;
|
||||
clippedVerticesItems[s + 4] = light.b;
|
||||
clippedVerticesItems[s + 5] = light.a;
|
||||
if (!twoColor) {
|
||||
clippedVerticesItems[s + 6] = u1;
|
||||
clippedVerticesItems[s + 7] = v1;
|
||||
clippedVerticesItems[s + 8] = x2;
|
||||
clippedVerticesItems[s + 9] = y2;
|
||||
clippedVerticesItems[s + 10] = light.r;
|
||||
clippedVerticesItems[s + 11] = light.g;
|
||||
clippedVerticesItems[s + 12] = light.b;
|
||||
clippedVerticesItems[s + 13] = light.a;
|
||||
clippedVerticesItems[s + 14] = u2;
|
||||
clippedVerticesItems[s + 15] = v2;
|
||||
clippedVerticesItems[s + 16] = x3;
|
||||
clippedVerticesItems[s + 17] = y3;
|
||||
clippedVerticesItems[s + 18] = light.r;
|
||||
clippedVerticesItems[s + 19] = light.g;
|
||||
clippedVerticesItems[s + 20] = light.b;
|
||||
clippedVerticesItems[s + 21] = light.a;
|
||||
clippedVerticesItems[s + 22] = u3;
|
||||
clippedVerticesItems[s + 23] = v3;
|
||||
}
|
||||
else {
|
||||
clippedVerticesItems[s + 6] = u1;
|
||||
clippedVerticesItems[s + 7] = v1;
|
||||
clippedVerticesItems[s + 8] = dark.r;
|
||||
clippedVerticesItems[s + 9] = dark.g;
|
||||
clippedVerticesItems[s + 10] = dark.b;
|
||||
clippedVerticesItems[s + 11] = dark.a;
|
||||
clippedVerticesItems[s + 12] = x2;
|
||||
clippedVerticesItems[s + 13] = y2;
|
||||
clippedVerticesItems[s + 14] = light.r;
|
||||
clippedVerticesItems[s + 15] = light.g;
|
||||
clippedVerticesItems[s + 16] = light.b;
|
||||
clippedVerticesItems[s + 17] = light.a;
|
||||
clippedVerticesItems[s + 18] = u2;
|
||||
clippedVerticesItems[s + 19] = v2;
|
||||
clippedVerticesItems[s + 20] = dark.r;
|
||||
clippedVerticesItems[s + 21] = dark.g;
|
||||
clippedVerticesItems[s + 22] = dark.b;
|
||||
clippedVerticesItems[s + 23] = dark.a;
|
||||
clippedVerticesItems[s + 24] = x3;
|
||||
clippedVerticesItems[s + 25] = y3;
|
||||
clippedVerticesItems[s + 26] = light.r;
|
||||
clippedVerticesItems[s + 27] = light.g;
|
||||
clippedVerticesItems[s + 28] = light.b;
|
||||
clippedVerticesItems[s + 29] = light.a;
|
||||
clippedVerticesItems[s + 30] = u3;
|
||||
clippedVerticesItems[s + 31] = v3;
|
||||
clippedVerticesItems[s + 32] = dark.r;
|
||||
clippedVerticesItems[s + 33] = dark.g;
|
||||
clippedVerticesItems[s + 34] = dark.b;
|
||||
clippedVerticesItems[s + 35] = dark.a;
|
||||
}
|
||||
s = clippedTriangles.length;
|
||||
var clippedTrianglesItems = spine.Utils.setArraySize(clippedTriangles, s + 3);
|
||||
clippedTrianglesItems[s] = index;
|
||||
clippedTrianglesItems[s + 1] = (index + 1);
|
||||
clippedTrianglesItems[s + 2] = (index + 2);
|
||||
index += 3;
|
||||
continue outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
SkeletonClipping.prototype.clip = function (x1, y1, x2, y2, x3, y3, clippingArea, output) {
|
||||
var originalOutput = output;
|
||||
var clipped = false;
|
||||
var input = null;
|
||||
if (clippingArea.length % 4 >= 2) {
|
||||
input = output;
|
||||
output = this.scratch;
|
||||
}
|
||||
else
|
||||
input = this.scratch;
|
||||
input.length = 0;
|
||||
input.push(x1);
|
||||
input.push(y1);
|
||||
input.push(x2);
|
||||
input.push(y2);
|
||||
input.push(x3);
|
||||
input.push(y3);
|
||||
input.push(x1);
|
||||
input.push(y1);
|
||||
output.length = 0;
|
||||
var clippingVertices = clippingArea;
|
||||
var clippingVerticesLast = clippingArea.length - 4;
|
||||
for (var i = 0;; i += 2) {
|
||||
var edgeX = clippingVertices[i], edgeY = clippingVertices[i + 1];
|
||||
var edgeX2 = clippingVertices[i + 2], edgeY2 = clippingVertices[i + 3];
|
||||
var deltaX = edgeX - edgeX2, deltaY = edgeY - edgeY2;
|
||||
var inputVertices = input;
|
||||
var inputVerticesLength = input.length - 2, outputStart = output.length;
|
||||
for (var ii = 0; ii < inputVerticesLength; ii += 2) {
|
||||
var inputX = inputVertices[ii], inputY = inputVertices[ii + 1];
|
||||
var inputX2 = inputVertices[ii + 2], inputY2 = inputVertices[ii + 3];
|
||||
var side2 = deltaX * (inputY2 - edgeY2) - deltaY * (inputX2 - edgeX2) > 0;
|
||||
if (deltaX * (inputY - edgeY2) - deltaY * (inputX - edgeX2) > 0) {
|
||||
if (side2) {
|
||||
output.push(inputX2);
|
||||
output.push(inputY2);
|
||||
continue;
|
||||
}
|
||||
var c0 = inputY2 - inputY, c2 = inputX2 - inputX;
|
||||
var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / (c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY));
|
||||
output.push(edgeX + (edgeX2 - edgeX) * ua);
|
||||
output.push(edgeY + (edgeY2 - edgeY) * ua);
|
||||
}
|
||||
else if (side2) {
|
||||
var c0 = inputY2 - inputY, c2 = inputX2 - inputX;
|
||||
var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / (c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY));
|
||||
output.push(edgeX + (edgeX2 - edgeX) * ua);
|
||||
output.push(edgeY + (edgeY2 - edgeY) * ua);
|
||||
output.push(inputX2);
|
||||
output.push(inputY2);
|
||||
}
|
||||
clipped = true;
|
||||
}
|
||||
if (outputStart == output.length) {
|
||||
originalOutput.length = 0;
|
||||
return true;
|
||||
}
|
||||
output.push(output[0]);
|
||||
output.push(output[1]);
|
||||
if (i == clippingVerticesLast)
|
||||
break;
|
||||
var temp = output;
|
||||
output = input;
|
||||
output.length = 0;
|
||||
input = temp;
|
||||
}
|
||||
if (originalOutput != output) {
|
||||
originalOutput.length = 0;
|
||||
for (var i = 0, n = output.length - 2; i < n; i++)
|
||||
originalOutput[i] = output[i];
|
||||
}
|
||||
else
|
||||
originalOutput.length = originalOutput.length - 2;
|
||||
return clipped;
|
||||
};
|
||||
SkeletonClipping.makeClockwise = function (polygon) {
|
||||
var vertices = polygon;
|
||||
var verticeslength = polygon.length;
|
||||
var area = vertices[verticeslength - 2] * vertices[1] - vertices[0] * vertices[verticeslength - 1], p1x = 0, p1y = 0, p2x = 0, p2y = 0;
|
||||
for (var i = 0, n = verticeslength - 3; i < n; i += 2) {
|
||||
p1x = vertices[i];
|
||||
p1y = vertices[i + 1];
|
||||
p2x = vertices[i + 2];
|
||||
p2y = vertices[i + 3];
|
||||
area += p1x * p2y - p2x * p1y;
|
||||
}
|
||||
if (area < 0)
|
||||
return;
|
||||
for (var i = 0, lastX = verticeslength - 2, n = verticeslength >> 1; i < n; i += 2) {
|
||||
var x = vertices[i], y = vertices[i + 1];
|
||||
var other = lastX - i;
|
||||
vertices[i] = vertices[other];
|
||||
vertices[i + 1] = vertices[other + 1];
|
||||
vertices[other] = x;
|
||||
vertices[other + 1] = y;
|
||||
}
|
||||
};
|
||||
return SkeletonClipping;
|
||||
}());
|
||||
spine.SkeletonClipping = SkeletonClipping;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var SkeletonData = (function () {
|
||||
function SkeletonData() {
|
||||
@ -4556,7 +5051,7 @@ var spine;
|
||||
throw new Error("Slot not found: " + slotName);
|
||||
var slotMap = skinMap[slotName];
|
||||
for (var entryName in slotMap) {
|
||||
var attachment = this.readAttachment(slotMap[entryName], skin, slotIndex, entryName);
|
||||
var attachment = this.readAttachment(slotMap[entryName], skin, slotIndex, entryName, skeletonData);
|
||||
if (attachment != null)
|
||||
skin.addAttachment(slotIndex, entryName, attachment);
|
||||
}
|
||||
@ -4596,7 +5091,7 @@ var spine;
|
||||
}
|
||||
return skeletonData;
|
||||
};
|
||||
SkeletonJson.prototype.readAttachment = function (map, skin, slotIndex, name) {
|
||||
SkeletonJson.prototype.readAttachment = function (map, skin, slotIndex, name, skeletonData) {
|
||||
var scale = this.scale;
|
||||
name = this.getValue(map, "name", name);
|
||||
var type = this.getValue(map, "type", "region");
|
||||
@ -4683,6 +5178,24 @@ var spine;
|
||||
point.color.setFromString(color);
|
||||
return point;
|
||||
}
|
||||
case "clipping": {
|
||||
var clip = this.attachmentLoader.newClippingAttachment(skin, name);
|
||||
if (clip == null)
|
||||
return null;
|
||||
var end = this.getValue(map, "end", null);
|
||||
if (end != null) {
|
||||
var slot = skeletonData.findSlot(end);
|
||||
if (slot == null)
|
||||
throw new Error("Clipping end slot not found: " + end);
|
||||
clip.endSlot = slot;
|
||||
}
|
||||
var vertexCount = map.vertexCount;
|
||||
this.readVertices(map, clip, vertexCount << 1);
|
||||
var color = this.getValue(map, "color", null);
|
||||
if (color != null)
|
||||
clip.color.setFromString(color);
|
||||
return clip;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
@ -5797,6 +6310,17 @@ var spine;
|
||||
return array;
|
||||
}
|
||||
};
|
||||
Utils.newShortArray = function (size) {
|
||||
if (Utils.SUPPORTS_TYPED_ARRAYS) {
|
||||
return new Int16Array(size);
|
||||
}
|
||||
else {
|
||||
var array = new Array(size);
|
||||
for (var i = 0; i < array.length; i++)
|
||||
array[i] = 0;
|
||||
return array;
|
||||
}
|
||||
};
|
||||
Utils.toFloatArray = function (array) {
|
||||
return Utils.SUPPORTS_TYPED_ARRAYS ? new Float32Array(array) : array;
|
||||
};
|
||||
|
||||
File diff suppressed because one or more lines are too long
46
spine-ts/build/spine-core.d.ts
vendored
46
spine-ts/build/spine-core.d.ts
vendored
@ -383,6 +383,7 @@ declare module spine {
|
||||
newBoundingBoxAttachment(skin: Skin, name: string): BoundingBoxAttachment;
|
||||
newPathAttachment(skin: Skin, name: string): PathAttachment;
|
||||
newPointAttachment(skin: Skin, name: string): PointAttachment;
|
||||
newClippingAttachment(skin: Skin, name: string): ClippingAttachment;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
@ -406,6 +407,7 @@ declare module spine {
|
||||
newBoundingBoxAttachment(skin: Skin, name: string): BoundingBoxAttachment;
|
||||
newPathAttachment(skin: Skin, name: string): PathAttachment;
|
||||
newPointAttachment(skin: Skin, name: string): PointAttachment;
|
||||
newClippingAttachment(skin: Skin, name: string): ClippingAttachment;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
@ -424,6 +426,13 @@ declare module spine {
|
||||
constructor(name: string);
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class ClippingAttachment extends VertexAttachment {
|
||||
endSlot: SlotData;
|
||||
color: Color;
|
||||
constructor(name: string);
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class MeshAttachment extends VertexAttachment {
|
||||
region: TextureRegion;
|
||||
@ -607,6 +616,21 @@ declare module spine {
|
||||
getOrder(): number;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class ConvexDecomposer {
|
||||
private convexPolygons;
|
||||
private convexPolygonsIndices;
|
||||
private indicesArray;
|
||||
private isConcaveArray;
|
||||
private triangles;
|
||||
private polygonPool;
|
||||
private polygonIndicesPool;
|
||||
decompose(input: ArrayLike<number>): Array<Array<number>>;
|
||||
private static isConcave(index, vertexCount, vertices, indices);
|
||||
private static positiveArea(p1x, p1y, p2x, p2y, p3x, p3y);
|
||||
private static winding(p1x, p1y, p2x, p2y, p3x, p3y);
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class Event {
|
||||
data: EventData;
|
||||
@ -802,6 +826,25 @@ declare module spine {
|
||||
getHeight(): number;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class SkeletonClipping {
|
||||
private decomposer;
|
||||
private clippingPolygon;
|
||||
private clipOutput;
|
||||
clippedVertices: number[];
|
||||
clippedTriangles: number[];
|
||||
private scratch;
|
||||
private clipAttachment;
|
||||
private clippingPolygons;
|
||||
clipStart(slot: Slot, clip: ClippingAttachment): void;
|
||||
clipEndWithSlot(slot: Slot): void;
|
||||
clipEnd(): void;
|
||||
isClipping(): boolean;
|
||||
clipTriangles(vertices: ArrayLike<number>, verticesLength: number, triangles: ArrayLike<number>, trianglesLength: number, uvs: ArrayLike<number>, light: Color, dark: Color, twoColor: boolean): void;
|
||||
clip(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, clippingArea: Array<number>, output: Array<number>): boolean;
|
||||
static makeClockwise(polygon: ArrayLike<number>): void;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class SkeletonData {
|
||||
name: string;
|
||||
@ -840,7 +883,7 @@ declare module spine {
|
||||
private linkedMeshes;
|
||||
constructor(attachmentLoader: AttachmentLoader);
|
||||
readSkeletonData(json: string | any): SkeletonData;
|
||||
readAttachment(map: any, skin: Skin, slotIndex: number, name: string): Attachment;
|
||||
readAttachment(map: any, skin: Skin, slotIndex: number, name: string, skeletonData: SkeletonData): Attachment;
|
||||
readVertices(map: any, attachment: VertexAttachment, verticesLength: number): void;
|
||||
readAnimation(map: any, name: string, skeletonData: SkeletonData): void;
|
||||
readCurve(map: any, timeline: CurveTimeline, frameIndex: number): void;
|
||||
@ -1058,6 +1101,7 @@ declare module spine {
|
||||
static ensureArrayCapacity<T>(array: Array<T>, size: number, value?: any): Array<T>;
|
||||
static newArray<T>(size: number, defaultValue: T): Array<T>;
|
||||
static newFloatArray(size: number): ArrayLike<number>;
|
||||
static newShortArray(size: number): ArrayLike<number>;
|
||||
static toFloatArray(array: Array<number>): number[] | Float32Array;
|
||||
}
|
||||
class DebugUtils {
|
||||
|
||||
@ -1922,6 +1922,9 @@ var spine;
|
||||
AtlasAttachmentLoader.prototype.newPointAttachment = function (skin, name) {
|
||||
return new spine.PointAttachment(name);
|
||||
};
|
||||
AtlasAttachmentLoader.prototype.newClippingAttachment = function (skin, name) {
|
||||
return new spine.ClippingAttachment(name);
|
||||
};
|
||||
return AtlasAttachmentLoader;
|
||||
}());
|
||||
spine.AtlasAttachmentLoader = AtlasAttachmentLoader;
|
||||
@ -2034,6 +2037,18 @@ var spine;
|
||||
spine.BoundingBoxAttachment = BoundingBoxAttachment;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var ClippingAttachment = (function (_super) {
|
||||
__extends(ClippingAttachment, _super);
|
||||
function ClippingAttachment(name) {
|
||||
_super.call(this, name);
|
||||
this.color = new spine.Color(0.2275, 0.2275, 0.8078, 1);
|
||||
}
|
||||
return ClippingAttachment;
|
||||
}(spine.VertexAttachment));
|
||||
spine.ClippingAttachment = ClippingAttachment;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var MeshAttachment = (function (_super) {
|
||||
__extends(MeshAttachment, _super);
|
||||
@ -2577,6 +2592,207 @@ var spine;
|
||||
var TransformMode = spine.TransformMode;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var ConvexDecomposer = (function () {
|
||||
function ConvexDecomposer() {
|
||||
this.convexPolygons = new Array();
|
||||
this.convexPolygonsIndices = new Array();
|
||||
this.indicesArray = new Array();
|
||||
this.isConcaveArray = new Array();
|
||||
this.triangles = new Array();
|
||||
this.polygonPool = new spine.Pool(function () {
|
||||
return new Array();
|
||||
});
|
||||
this.polygonIndicesPool = new spine.Pool(function () {
|
||||
return new Array();
|
||||
});
|
||||
}
|
||||
ConvexDecomposer.prototype.decompose = function (input) {
|
||||
var vertices = input;
|
||||
var vertexCount = input.length >> 1;
|
||||
var indices = this.indicesArray;
|
||||
indices.length = 0;
|
||||
for (var i = 0; i < vertexCount; i++)
|
||||
indices[i] = i;
|
||||
var isConcave = this.isConcaveArray;
|
||||
isConcave.length = 0;
|
||||
for (var i = 0, n = vertexCount; i < n; ++i)
|
||||
isConcave[i] = ConvexDecomposer.isConcave(i, vertexCount, vertices, indices);
|
||||
var triangles = this.triangles;
|
||||
triangles.length = 0;
|
||||
while (vertexCount > 3) {
|
||||
var previous = vertexCount - 1, i = 0, next = 1;
|
||||
while (true) {
|
||||
outer: if (!isConcave[i]) {
|
||||
var p1 = indices[previous] << 1, p2 = indices[i] << 1, p3 = indices[next] << 1;
|
||||
var p1x = vertices[p1], p1y = vertices[p1 + 1];
|
||||
var p2x = vertices[p2], p2y = vertices[p2 + 1];
|
||||
var p3x = vertices[p3], p3y = vertices[p3 + 1];
|
||||
for (var ii = (next + 1) % vertexCount; ii != previous; ii = (ii + 1) % vertexCount) {
|
||||
if (!isConcave[ii])
|
||||
continue;
|
||||
var v = indices[ii] << 1;
|
||||
var vx = vertices[v], vy = vertices[v + 1];
|
||||
if (ConvexDecomposer.positiveArea(p3x, p3y, p1x, p1y, vx, vy)) {
|
||||
if (ConvexDecomposer.positiveArea(p1x, p1y, p2x, p2y, vx, vy)) {
|
||||
if (ConvexDecomposer.positiveArea(p2x, p2y, p3x, p3y, vx, vy))
|
||||
break outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (next == 0) {
|
||||
do {
|
||||
if (!isConcave[i])
|
||||
break;
|
||||
i--;
|
||||
} while (i > 0);
|
||||
break;
|
||||
}
|
||||
previous = i;
|
||||
i = next;
|
||||
next = (next + 1) % vertexCount;
|
||||
}
|
||||
triangles.push(indices[(vertexCount + i - 1) % vertexCount]);
|
||||
triangles.push(indices[i]);
|
||||
triangles.push(indices[(i + 1) % vertexCount]);
|
||||
indices.splice(i, 1);
|
||||
isConcave.splice(i, 1);
|
||||
vertexCount--;
|
||||
var previousIndex = (vertexCount + i - 1) % vertexCount;
|
||||
var nextIndex = i == vertexCount ? 0 : i;
|
||||
isConcave[previousIndex] = ConvexDecomposer.isConcave(previousIndex, vertexCount, vertices, indices);
|
||||
isConcave[nextIndex] = ConvexDecomposer.isConcave(nextIndex, vertexCount, vertices, indices);
|
||||
}
|
||||
if (vertexCount == 3) {
|
||||
triangles.push(indices[2]);
|
||||
triangles.push(indices[0]);
|
||||
triangles.push(indices[1]);
|
||||
}
|
||||
var convexPolygons = this.convexPolygons;
|
||||
this.polygonPool.freeAll(convexPolygons);
|
||||
convexPolygons.length = 0;
|
||||
var convexPolygonsIndices = this.convexPolygonsIndices;
|
||||
this.polygonIndicesPool.freeAll(convexPolygonsIndices);
|
||||
convexPolygonsIndices.length = 0;
|
||||
var polygonIndices = this.polygonIndicesPool.obtain();
|
||||
polygonIndices.length = 0;
|
||||
var polygon = this.polygonPool.obtain();
|
||||
polygon.length = 0;
|
||||
var fanBaseIndex = -1, lastWinding = 0;
|
||||
for (var i = 0, n = triangles.length; i < n; i += 3) {
|
||||
var t1 = triangles[i] << 1, t2 = triangles[i + 1] << 1, t3 = triangles[i + 2] << 1;
|
||||
var x1 = vertices[t1], y1 = vertices[t1 + 1];
|
||||
var x2 = vertices[t2], y2 = vertices[t2 + 1];
|
||||
var x3 = vertices[t3], y3 = vertices[t3 + 1];
|
||||
var merged = false;
|
||||
if (fanBaseIndex == t1) {
|
||||
var o = polygon.length - 4;
|
||||
var winding1 = ConvexDecomposer.winding(polygon[o], polygon[o + 1], polygon[o + 2], polygon[o + 3], x3, y3);
|
||||
var winding2 = ConvexDecomposer.winding(x3, y3, polygon[0], polygon[1], polygon[2], polygon[3]);
|
||||
if (winding1 == lastWinding && winding2 == lastWinding) {
|
||||
polygon.push(x3);
|
||||
polygon.push(y3);
|
||||
polygonIndices.push(t3);
|
||||
merged = true;
|
||||
}
|
||||
}
|
||||
if (!merged) {
|
||||
if (polygon.length > 0) {
|
||||
convexPolygons.push(polygon);
|
||||
convexPolygonsIndices.push(polygonIndices);
|
||||
}
|
||||
polygon = this.polygonPool.obtain();
|
||||
polygon.length = 0;
|
||||
polygon.push(x1);
|
||||
polygon.push(y1);
|
||||
polygon.push(x2);
|
||||
polygon.push(y2);
|
||||
polygon.push(x3);
|
||||
polygon.push(y3);
|
||||
polygonIndices = this.polygonIndicesPool.obtain();
|
||||
polygonIndices.length = 0;
|
||||
polygonIndices.push(t1);
|
||||
polygonIndices.push(t2);
|
||||
polygonIndices.push(t3);
|
||||
lastWinding = ConvexDecomposer.winding(x1, y1, x2, y2, x3, y3);
|
||||
fanBaseIndex = t1;
|
||||
}
|
||||
}
|
||||
if (polygon.length > 0) {
|
||||
convexPolygons.push(polygon);
|
||||
convexPolygonsIndices.push(polygonIndices);
|
||||
}
|
||||
for (var i = 0, n = convexPolygons.length; i < n; i++) {
|
||||
polygonIndices = convexPolygonsIndices[i];
|
||||
if (polygonIndices.length == 0)
|
||||
continue;
|
||||
var firstIndex = polygonIndices[0];
|
||||
var lastIndex = polygonIndices[polygonIndices.length - 1];
|
||||
polygon = convexPolygons[i];
|
||||
var o = polygon.length - 4;
|
||||
var prevPrevX = polygon[o], prevPrevY = polygon[o + 1];
|
||||
var prevX = polygon[o + 2], prevY = polygon[o + 3];
|
||||
var firstX = polygon[0], firstY = polygon[1];
|
||||
var secondX = polygon[2], secondY = polygon[3];
|
||||
var winding = ConvexDecomposer.winding(prevPrevX, prevPrevY, prevX, prevY, firstX, firstY);
|
||||
for (var ii = 0; ii < n; ii++) {
|
||||
if (ii == i)
|
||||
continue;
|
||||
var otherIndices = convexPolygonsIndices[ii];
|
||||
if (otherIndices.length != 3)
|
||||
continue;
|
||||
var otherFirstIndex = otherIndices[0];
|
||||
var otherSecondIndex = otherIndices[1];
|
||||
var otherLastIndex = otherIndices[2];
|
||||
var otherPoly = convexPolygons[ii];
|
||||
var x3 = otherPoly[otherPoly.length - 2], y3 = otherPoly[otherPoly.length - 1];
|
||||
if (otherFirstIndex != firstIndex || otherSecondIndex != lastIndex)
|
||||
continue;
|
||||
var winding1 = ConvexDecomposer.winding(prevPrevX, prevPrevY, prevX, prevY, x3, y3);
|
||||
var winding2 = ConvexDecomposer.winding(x3, y3, firstX, firstY, secondX, secondY);
|
||||
if (winding1 == winding && winding2 == winding) {
|
||||
otherPoly.length = 0;
|
||||
otherIndices.length = 0;
|
||||
polygon.push(x3);
|
||||
polygon.push(y3);
|
||||
polygonIndices.push(otherLastIndex);
|
||||
prevPrevX = prevX;
|
||||
prevPrevY = prevY;
|
||||
prevX = x3;
|
||||
prevY = y3;
|
||||
ii = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (var i = convexPolygons.length - 1; i >= 0; i--) {
|
||||
polygon = convexPolygons[i];
|
||||
if (polygon.length == 0) {
|
||||
convexPolygons.splice(i, 1);
|
||||
this.polygonPool.free(polygon);
|
||||
}
|
||||
}
|
||||
return convexPolygons;
|
||||
};
|
||||
ConvexDecomposer.isConcave = function (index, vertexCount, vertices, indices) {
|
||||
var previous = indices[(vertexCount + index - 1) % vertexCount] << 1;
|
||||
var current = indices[index] << 1;
|
||||
var next = indices[(index + 1) % vertexCount] << 1;
|
||||
return !this.positiveArea(vertices[previous], vertices[previous + 1], vertices[current], vertices[current + 1], vertices[next], vertices[next + 1]);
|
||||
};
|
||||
ConvexDecomposer.positiveArea = function (p1x, p1y, p2x, p2y, p3x, p3y) {
|
||||
return p1x * (p3y - p2y) + p2x * (p1y - p3y) + p3x * (p2y - p1y) >= 0;
|
||||
};
|
||||
ConvexDecomposer.winding = function (p1x, p1y, p2x, p2y, p3x, p3y) {
|
||||
var px = p2x - p1x, py = p2y - p1y;
|
||||
return p3x * py - p3y * px + px * p1y - p1x * py >= 0 ? 1 : -1;
|
||||
};
|
||||
return ConvexDecomposer;
|
||||
}());
|
||||
spine.ConvexDecomposer = ConvexDecomposer;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var Event = (function () {
|
||||
function Event(time, data) {
|
||||
@ -3945,6 +4161,285 @@ var spine;
|
||||
spine.SkeletonBounds = SkeletonBounds;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var SkeletonClipping = (function () {
|
||||
function SkeletonClipping() {
|
||||
this.decomposer = new spine.ConvexDecomposer();
|
||||
this.clippingPolygon = new Array();
|
||||
this.clipOutput = new Array();
|
||||
this.clippedVertices = new Array();
|
||||
this.clippedTriangles = new Array();
|
||||
this.scratch = new Array();
|
||||
}
|
||||
SkeletonClipping.prototype.clipStart = function (slot, clip) {
|
||||
if (this.clipAttachment != null)
|
||||
return;
|
||||
this.clipAttachment = clip;
|
||||
var n = clip.worldVerticesLength;
|
||||
var vertices = spine.Utils.setArraySize(this.clippingPolygon, n);
|
||||
clip.computeWorldVertices(slot, 0, n, vertices, 0, 2);
|
||||
var clippingPolygon = this.clippingPolygon;
|
||||
SkeletonClipping.makeClockwise(clippingPolygon);
|
||||
var clippingPolygons = this.clippingPolygons = this.decomposer.decompose(clippingPolygon);
|
||||
for (var i = 0, n_1 = clippingPolygons.length; i < n_1; i++) {
|
||||
var polygon = clippingPolygons[i];
|
||||
SkeletonClipping.makeClockwise(polygon);
|
||||
polygon.push(polygon[0]);
|
||||
polygon.push(polygon[1]);
|
||||
}
|
||||
};
|
||||
SkeletonClipping.prototype.clipEndWithSlot = function (slot) {
|
||||
if (this.clipAttachment != null && this.clipAttachment.endSlot == slot.data)
|
||||
this.clipEnd();
|
||||
};
|
||||
SkeletonClipping.prototype.clipEnd = function () {
|
||||
if (this.clipAttachment == null)
|
||||
return;
|
||||
this.clipAttachment = null;
|
||||
this.clippingPolygons = null;
|
||||
this.clippedVertices.length = 0;
|
||||
this.clippedTriangles.length = 0;
|
||||
this.clippingPolygon.length = 0;
|
||||
};
|
||||
SkeletonClipping.prototype.isClipping = function () {
|
||||
return this.clipAttachment != null;
|
||||
};
|
||||
SkeletonClipping.prototype.clipTriangles = function (vertices, verticesLength, triangles, trianglesLength, uvs, light, dark, twoColor) {
|
||||
var clipOutput = this.clipOutput, clippedVertices = this.clippedVertices;
|
||||
var clippedTriangles = this.clippedTriangles;
|
||||
var polygons = this.clippingPolygons;
|
||||
var polygonsCount = this.clippingPolygons.length;
|
||||
var vertexSize = twoColor ? 12 : 8;
|
||||
var index = 0;
|
||||
clippedVertices.length = 0;
|
||||
clippedTriangles.length = 0;
|
||||
outer: for (var i = 0; i < trianglesLength; i += 3) {
|
||||
var vertexOffset = triangles[i] << 1;
|
||||
var x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1];
|
||||
var u1 = uvs[vertexOffset], v1 = uvs[vertexOffset + 1];
|
||||
vertexOffset = triangles[i + 1] << 1;
|
||||
var x2 = vertices[vertexOffset], y2 = vertices[vertexOffset + 1];
|
||||
var u2 = uvs[vertexOffset], v2 = uvs[vertexOffset + 1];
|
||||
vertexOffset = triangles[i + 2] << 1;
|
||||
var x3 = vertices[vertexOffset], y3 = vertices[vertexOffset + 1];
|
||||
var u3 = uvs[vertexOffset], v3 = uvs[vertexOffset + 1];
|
||||
for (var p = 0; p < polygonsCount; p++) {
|
||||
var s = clippedVertices.length;
|
||||
if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) {
|
||||
var clipOutputLength = clipOutput.length;
|
||||
if (clipOutputLength == 0)
|
||||
continue;
|
||||
var d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1;
|
||||
var d = 1 / (d0 * d2 + d1 * (y1 - y3));
|
||||
var clipOutputCount = clipOutputLength >> 1;
|
||||
var clipOutputItems = this.clipOutput;
|
||||
var clippedVerticesItems = spine.Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize);
|
||||
for (var ii = 0; ii < clipOutputLength; ii += 2) {
|
||||
var x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
|
||||
clippedVerticesItems[s] = x;
|
||||
clippedVerticesItems[s + 1] = y;
|
||||
clippedVerticesItems[s + 2] = light.r;
|
||||
clippedVerticesItems[s + 3] = light.g;
|
||||
clippedVerticesItems[s + 4] = light.b;
|
||||
clippedVerticesItems[s + 5] = light.a;
|
||||
var c0 = x - x3, c1 = y - y3;
|
||||
var a = (d0 * c0 + d1 * c1) * d;
|
||||
var b = (d4 * c0 + d2 * c1) * d;
|
||||
var c = 1 - a - b;
|
||||
clippedVerticesItems[s + 6] = u1 * a + u2 * b + u3 * c;
|
||||
clippedVerticesItems[s + 7] = v1 * a + v2 * b + v3 * c;
|
||||
if (twoColor) {
|
||||
clippedVerticesItems[s + 8] = dark.r;
|
||||
clippedVerticesItems[s + 8] = dark.g;
|
||||
clippedVerticesItems[s + 10] = dark.b;
|
||||
clippedVerticesItems[s + 11] = dark.a;
|
||||
}
|
||||
s += vertexSize;
|
||||
}
|
||||
s = clippedTriangles.length;
|
||||
var clippedTrianglesItems = spine.Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
|
||||
clipOutputCount--;
|
||||
for (var ii = 1; ii < clipOutputCount; ii++) {
|
||||
clippedTrianglesItems[s] = index;
|
||||
clippedTrianglesItems[s + 1] = (index + ii);
|
||||
clippedTrianglesItems[s + 2] = (index + ii + 1);
|
||||
s += 3;
|
||||
}
|
||||
index += clipOutputCount + 1;
|
||||
}
|
||||
else {
|
||||
var clippedVerticesItems = spine.Utils.setArraySize(clippedVertices, s + 3 * vertexSize);
|
||||
clippedVerticesItems[s] = x1;
|
||||
clippedVerticesItems[s + 1] = y1;
|
||||
clippedVerticesItems[s + 2] = light.r;
|
||||
clippedVerticesItems[s + 3] = light.g;
|
||||
clippedVerticesItems[s + 4] = light.b;
|
||||
clippedVerticesItems[s + 5] = light.a;
|
||||
if (!twoColor) {
|
||||
clippedVerticesItems[s + 6] = u1;
|
||||
clippedVerticesItems[s + 7] = v1;
|
||||
clippedVerticesItems[s + 8] = x2;
|
||||
clippedVerticesItems[s + 9] = y2;
|
||||
clippedVerticesItems[s + 10] = light.r;
|
||||
clippedVerticesItems[s + 11] = light.g;
|
||||
clippedVerticesItems[s + 12] = light.b;
|
||||
clippedVerticesItems[s + 13] = light.a;
|
||||
clippedVerticesItems[s + 14] = u2;
|
||||
clippedVerticesItems[s + 15] = v2;
|
||||
clippedVerticesItems[s + 16] = x3;
|
||||
clippedVerticesItems[s + 17] = y3;
|
||||
clippedVerticesItems[s + 18] = light.r;
|
||||
clippedVerticesItems[s + 19] = light.g;
|
||||
clippedVerticesItems[s + 20] = light.b;
|
||||
clippedVerticesItems[s + 21] = light.a;
|
||||
clippedVerticesItems[s + 22] = u3;
|
||||
clippedVerticesItems[s + 23] = v3;
|
||||
}
|
||||
else {
|
||||
clippedVerticesItems[s + 6] = u1;
|
||||
clippedVerticesItems[s + 7] = v1;
|
||||
clippedVerticesItems[s + 8] = dark.r;
|
||||
clippedVerticesItems[s + 9] = dark.g;
|
||||
clippedVerticesItems[s + 10] = dark.b;
|
||||
clippedVerticesItems[s + 11] = dark.a;
|
||||
clippedVerticesItems[s + 12] = x2;
|
||||
clippedVerticesItems[s + 13] = y2;
|
||||
clippedVerticesItems[s + 14] = light.r;
|
||||
clippedVerticesItems[s + 15] = light.g;
|
||||
clippedVerticesItems[s + 16] = light.b;
|
||||
clippedVerticesItems[s + 17] = light.a;
|
||||
clippedVerticesItems[s + 18] = u2;
|
||||
clippedVerticesItems[s + 19] = v2;
|
||||
clippedVerticesItems[s + 20] = dark.r;
|
||||
clippedVerticesItems[s + 21] = dark.g;
|
||||
clippedVerticesItems[s + 22] = dark.b;
|
||||
clippedVerticesItems[s + 23] = dark.a;
|
||||
clippedVerticesItems[s + 24] = x3;
|
||||
clippedVerticesItems[s + 25] = y3;
|
||||
clippedVerticesItems[s + 26] = light.r;
|
||||
clippedVerticesItems[s + 27] = light.g;
|
||||
clippedVerticesItems[s + 28] = light.b;
|
||||
clippedVerticesItems[s + 29] = light.a;
|
||||
clippedVerticesItems[s + 30] = u3;
|
||||
clippedVerticesItems[s + 31] = v3;
|
||||
clippedVerticesItems[s + 32] = dark.r;
|
||||
clippedVerticesItems[s + 33] = dark.g;
|
||||
clippedVerticesItems[s + 34] = dark.b;
|
||||
clippedVerticesItems[s + 35] = dark.a;
|
||||
}
|
||||
s = clippedTriangles.length;
|
||||
var clippedTrianglesItems = spine.Utils.setArraySize(clippedTriangles, s + 3);
|
||||
clippedTrianglesItems[s] = index;
|
||||
clippedTrianglesItems[s + 1] = (index + 1);
|
||||
clippedTrianglesItems[s + 2] = (index + 2);
|
||||
index += 3;
|
||||
continue outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
SkeletonClipping.prototype.clip = function (x1, y1, x2, y2, x3, y3, clippingArea, output) {
|
||||
var originalOutput = output;
|
||||
var clipped = false;
|
||||
var input = null;
|
||||
if (clippingArea.length % 4 >= 2) {
|
||||
input = output;
|
||||
output = this.scratch;
|
||||
}
|
||||
else
|
||||
input = this.scratch;
|
||||
input.length = 0;
|
||||
input.push(x1);
|
||||
input.push(y1);
|
||||
input.push(x2);
|
||||
input.push(y2);
|
||||
input.push(x3);
|
||||
input.push(y3);
|
||||
input.push(x1);
|
||||
input.push(y1);
|
||||
output.length = 0;
|
||||
var clippingVertices = clippingArea;
|
||||
var clippingVerticesLast = clippingArea.length - 4;
|
||||
for (var i = 0;; i += 2) {
|
||||
var edgeX = clippingVertices[i], edgeY = clippingVertices[i + 1];
|
||||
var edgeX2 = clippingVertices[i + 2], edgeY2 = clippingVertices[i + 3];
|
||||
var deltaX = edgeX - edgeX2, deltaY = edgeY - edgeY2;
|
||||
var inputVertices = input;
|
||||
var inputVerticesLength = input.length - 2, outputStart = output.length;
|
||||
for (var ii = 0; ii < inputVerticesLength; ii += 2) {
|
||||
var inputX = inputVertices[ii], inputY = inputVertices[ii + 1];
|
||||
var inputX2 = inputVertices[ii + 2], inputY2 = inputVertices[ii + 3];
|
||||
var side2 = deltaX * (inputY2 - edgeY2) - deltaY * (inputX2 - edgeX2) > 0;
|
||||
if (deltaX * (inputY - edgeY2) - deltaY * (inputX - edgeX2) > 0) {
|
||||
if (side2) {
|
||||
output.push(inputX2);
|
||||
output.push(inputY2);
|
||||
continue;
|
||||
}
|
||||
var c0 = inputY2 - inputY, c2 = inputX2 - inputX;
|
||||
var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / (c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY));
|
||||
output.push(edgeX + (edgeX2 - edgeX) * ua);
|
||||
output.push(edgeY + (edgeY2 - edgeY) * ua);
|
||||
}
|
||||
else if (side2) {
|
||||
var c0 = inputY2 - inputY, c2 = inputX2 - inputX;
|
||||
var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / (c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY));
|
||||
output.push(edgeX + (edgeX2 - edgeX) * ua);
|
||||
output.push(edgeY + (edgeY2 - edgeY) * ua);
|
||||
output.push(inputX2);
|
||||
output.push(inputY2);
|
||||
}
|
||||
clipped = true;
|
||||
}
|
||||
if (outputStart == output.length) {
|
||||
originalOutput.length = 0;
|
||||
return true;
|
||||
}
|
||||
output.push(output[0]);
|
||||
output.push(output[1]);
|
||||
if (i == clippingVerticesLast)
|
||||
break;
|
||||
var temp = output;
|
||||
output = input;
|
||||
output.length = 0;
|
||||
input = temp;
|
||||
}
|
||||
if (originalOutput != output) {
|
||||
originalOutput.length = 0;
|
||||
for (var i = 0, n = output.length - 2; i < n; i++)
|
||||
originalOutput[i] = output[i];
|
||||
}
|
||||
else
|
||||
originalOutput.length = originalOutput.length - 2;
|
||||
return clipped;
|
||||
};
|
||||
SkeletonClipping.makeClockwise = function (polygon) {
|
||||
var vertices = polygon;
|
||||
var verticeslength = polygon.length;
|
||||
var area = vertices[verticeslength - 2] * vertices[1] - vertices[0] * vertices[verticeslength - 1], p1x = 0, p1y = 0, p2x = 0, p2y = 0;
|
||||
for (var i = 0, n = verticeslength - 3; i < n; i += 2) {
|
||||
p1x = vertices[i];
|
||||
p1y = vertices[i + 1];
|
||||
p2x = vertices[i + 2];
|
||||
p2y = vertices[i + 3];
|
||||
area += p1x * p2y - p2x * p1y;
|
||||
}
|
||||
if (area < 0)
|
||||
return;
|
||||
for (var i = 0, lastX = verticeslength - 2, n = verticeslength >> 1; i < n; i += 2) {
|
||||
var x = vertices[i], y = vertices[i + 1];
|
||||
var other = lastX - i;
|
||||
vertices[i] = vertices[other];
|
||||
vertices[i + 1] = vertices[other + 1];
|
||||
vertices[other] = x;
|
||||
vertices[other + 1] = y;
|
||||
}
|
||||
};
|
||||
return SkeletonClipping;
|
||||
}());
|
||||
spine.SkeletonClipping = SkeletonClipping;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var SkeletonData = (function () {
|
||||
function SkeletonData() {
|
||||
@ -4236,7 +4731,7 @@ var spine;
|
||||
throw new Error("Slot not found: " + slotName);
|
||||
var slotMap = skinMap[slotName];
|
||||
for (var entryName in slotMap) {
|
||||
var attachment = this.readAttachment(slotMap[entryName], skin, slotIndex, entryName);
|
||||
var attachment = this.readAttachment(slotMap[entryName], skin, slotIndex, entryName, skeletonData);
|
||||
if (attachment != null)
|
||||
skin.addAttachment(slotIndex, entryName, attachment);
|
||||
}
|
||||
@ -4276,7 +4771,7 @@ var spine;
|
||||
}
|
||||
return skeletonData;
|
||||
};
|
||||
SkeletonJson.prototype.readAttachment = function (map, skin, slotIndex, name) {
|
||||
SkeletonJson.prototype.readAttachment = function (map, skin, slotIndex, name, skeletonData) {
|
||||
var scale = this.scale;
|
||||
name = this.getValue(map, "name", name);
|
||||
var type = this.getValue(map, "type", "region");
|
||||
@ -4363,6 +4858,24 @@ var spine;
|
||||
point.color.setFromString(color);
|
||||
return point;
|
||||
}
|
||||
case "clipping": {
|
||||
var clip = this.attachmentLoader.newClippingAttachment(skin, name);
|
||||
if (clip == null)
|
||||
return null;
|
||||
var end = this.getValue(map, "end", null);
|
||||
if (end != null) {
|
||||
var slot = skeletonData.findSlot(end);
|
||||
if (slot == null)
|
||||
throw new Error("Clipping end slot not found: " + end);
|
||||
clip.endSlot = slot;
|
||||
}
|
||||
var vertexCount = map.vertexCount;
|
||||
this.readVertices(map, clip, vertexCount << 1);
|
||||
var color = this.getValue(map, "color", null);
|
||||
if (color != null)
|
||||
clip.color.setFromString(color);
|
||||
return clip;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
@ -5543,6 +6056,17 @@ var spine;
|
||||
return array;
|
||||
}
|
||||
};
|
||||
Utils.newShortArray = function (size) {
|
||||
if (Utils.SUPPORTS_TYPED_ARRAYS) {
|
||||
return new Int16Array(size);
|
||||
}
|
||||
else {
|
||||
var array = new Array(size);
|
||||
for (var i = 0; i < array.length; i++)
|
||||
array[i] = 0;
|
||||
return array;
|
||||
}
|
||||
};
|
||||
Utils.toFloatArray = function (array) {
|
||||
return Utils.SUPPORTS_TYPED_ARRAYS ? new Float32Array(array) : array;
|
||||
};
|
||||
|
||||
File diff suppressed because one or more lines are too long
46
spine-ts/build/spine-threejs.d.ts
vendored
46
spine-ts/build/spine-threejs.d.ts
vendored
@ -383,6 +383,7 @@ declare module spine {
|
||||
newBoundingBoxAttachment(skin: Skin, name: string): BoundingBoxAttachment;
|
||||
newPathAttachment(skin: Skin, name: string): PathAttachment;
|
||||
newPointAttachment(skin: Skin, name: string): PointAttachment;
|
||||
newClippingAttachment(skin: Skin, name: string): ClippingAttachment;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
@ -406,6 +407,7 @@ declare module spine {
|
||||
newBoundingBoxAttachment(skin: Skin, name: string): BoundingBoxAttachment;
|
||||
newPathAttachment(skin: Skin, name: string): PathAttachment;
|
||||
newPointAttachment(skin: Skin, name: string): PointAttachment;
|
||||
newClippingAttachment(skin: Skin, name: string): ClippingAttachment;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
@ -424,6 +426,13 @@ declare module spine {
|
||||
constructor(name: string);
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class ClippingAttachment extends VertexAttachment {
|
||||
endSlot: SlotData;
|
||||
color: Color;
|
||||
constructor(name: string);
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class MeshAttachment extends VertexAttachment {
|
||||
region: TextureRegion;
|
||||
@ -607,6 +616,21 @@ declare module spine {
|
||||
getOrder(): number;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class ConvexDecomposer {
|
||||
private convexPolygons;
|
||||
private convexPolygonsIndices;
|
||||
private indicesArray;
|
||||
private isConcaveArray;
|
||||
private triangles;
|
||||
private polygonPool;
|
||||
private polygonIndicesPool;
|
||||
decompose(input: ArrayLike<number>): Array<Array<number>>;
|
||||
private static isConcave(index, vertexCount, vertices, indices);
|
||||
private static positiveArea(p1x, p1y, p2x, p2y, p3x, p3y);
|
||||
private static winding(p1x, p1y, p2x, p2y, p3x, p3y);
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class Event {
|
||||
data: EventData;
|
||||
@ -802,6 +826,25 @@ declare module spine {
|
||||
getHeight(): number;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class SkeletonClipping {
|
||||
private decomposer;
|
||||
private clippingPolygon;
|
||||
private clipOutput;
|
||||
clippedVertices: number[];
|
||||
clippedTriangles: number[];
|
||||
private scratch;
|
||||
private clipAttachment;
|
||||
private clippingPolygons;
|
||||
clipStart(slot: Slot, clip: ClippingAttachment): void;
|
||||
clipEndWithSlot(slot: Slot): void;
|
||||
clipEnd(): void;
|
||||
isClipping(): boolean;
|
||||
clipTriangles(vertices: ArrayLike<number>, verticesLength: number, triangles: ArrayLike<number>, trianglesLength: number, uvs: ArrayLike<number>, light: Color, dark: Color, twoColor: boolean): void;
|
||||
clip(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, clippingArea: Array<number>, output: Array<number>): boolean;
|
||||
static makeClockwise(polygon: ArrayLike<number>): void;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class SkeletonData {
|
||||
name: string;
|
||||
@ -840,7 +883,7 @@ declare module spine {
|
||||
private linkedMeshes;
|
||||
constructor(attachmentLoader: AttachmentLoader);
|
||||
readSkeletonData(json: string | any): SkeletonData;
|
||||
readAttachment(map: any, skin: Skin, slotIndex: number, name: string): Attachment;
|
||||
readAttachment(map: any, skin: Skin, slotIndex: number, name: string, skeletonData: SkeletonData): Attachment;
|
||||
readVertices(map: any, attachment: VertexAttachment, verticesLength: number): void;
|
||||
readAnimation(map: any, name: string, skeletonData: SkeletonData): void;
|
||||
readCurve(map: any, timeline: CurveTimeline, frameIndex: number): void;
|
||||
@ -1058,6 +1101,7 @@ declare module spine {
|
||||
static ensureArrayCapacity<T>(array: Array<T>, size: number, value?: any): Array<T>;
|
||||
static newArray<T>(size: number, defaultValue: T): Array<T>;
|
||||
static newFloatArray(size: number): ArrayLike<number>;
|
||||
static newShortArray(size: number): ArrayLike<number>;
|
||||
static toFloatArray(array: Array<number>): number[] | Float32Array;
|
||||
}
|
||||
class DebugUtils {
|
||||
|
||||
@ -1922,6 +1922,9 @@ var spine;
|
||||
AtlasAttachmentLoader.prototype.newPointAttachment = function (skin, name) {
|
||||
return new spine.PointAttachment(name);
|
||||
};
|
||||
AtlasAttachmentLoader.prototype.newClippingAttachment = function (skin, name) {
|
||||
return new spine.ClippingAttachment(name);
|
||||
};
|
||||
return AtlasAttachmentLoader;
|
||||
}());
|
||||
spine.AtlasAttachmentLoader = AtlasAttachmentLoader;
|
||||
@ -2034,6 +2037,18 @@ var spine;
|
||||
spine.BoundingBoxAttachment = BoundingBoxAttachment;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var ClippingAttachment = (function (_super) {
|
||||
__extends(ClippingAttachment, _super);
|
||||
function ClippingAttachment(name) {
|
||||
_super.call(this, name);
|
||||
this.color = new spine.Color(0.2275, 0.2275, 0.8078, 1);
|
||||
}
|
||||
return ClippingAttachment;
|
||||
}(spine.VertexAttachment));
|
||||
spine.ClippingAttachment = ClippingAttachment;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var MeshAttachment = (function (_super) {
|
||||
__extends(MeshAttachment, _super);
|
||||
@ -2577,6 +2592,207 @@ var spine;
|
||||
var TransformMode = spine.TransformMode;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var ConvexDecomposer = (function () {
|
||||
function ConvexDecomposer() {
|
||||
this.convexPolygons = new Array();
|
||||
this.convexPolygonsIndices = new Array();
|
||||
this.indicesArray = new Array();
|
||||
this.isConcaveArray = new Array();
|
||||
this.triangles = new Array();
|
||||
this.polygonPool = new spine.Pool(function () {
|
||||
return new Array();
|
||||
});
|
||||
this.polygonIndicesPool = new spine.Pool(function () {
|
||||
return new Array();
|
||||
});
|
||||
}
|
||||
ConvexDecomposer.prototype.decompose = function (input) {
|
||||
var vertices = input;
|
||||
var vertexCount = input.length >> 1;
|
||||
var indices = this.indicesArray;
|
||||
indices.length = 0;
|
||||
for (var i = 0; i < vertexCount; i++)
|
||||
indices[i] = i;
|
||||
var isConcave = this.isConcaveArray;
|
||||
isConcave.length = 0;
|
||||
for (var i = 0, n = vertexCount; i < n; ++i)
|
||||
isConcave[i] = ConvexDecomposer.isConcave(i, vertexCount, vertices, indices);
|
||||
var triangles = this.triangles;
|
||||
triangles.length = 0;
|
||||
while (vertexCount > 3) {
|
||||
var previous = vertexCount - 1, i = 0, next = 1;
|
||||
while (true) {
|
||||
outer: if (!isConcave[i]) {
|
||||
var p1 = indices[previous] << 1, p2 = indices[i] << 1, p3 = indices[next] << 1;
|
||||
var p1x = vertices[p1], p1y = vertices[p1 + 1];
|
||||
var p2x = vertices[p2], p2y = vertices[p2 + 1];
|
||||
var p3x = vertices[p3], p3y = vertices[p3 + 1];
|
||||
for (var ii = (next + 1) % vertexCount; ii != previous; ii = (ii + 1) % vertexCount) {
|
||||
if (!isConcave[ii])
|
||||
continue;
|
||||
var v = indices[ii] << 1;
|
||||
var vx = vertices[v], vy = vertices[v + 1];
|
||||
if (ConvexDecomposer.positiveArea(p3x, p3y, p1x, p1y, vx, vy)) {
|
||||
if (ConvexDecomposer.positiveArea(p1x, p1y, p2x, p2y, vx, vy)) {
|
||||
if (ConvexDecomposer.positiveArea(p2x, p2y, p3x, p3y, vx, vy))
|
||||
break outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (next == 0) {
|
||||
do {
|
||||
if (!isConcave[i])
|
||||
break;
|
||||
i--;
|
||||
} while (i > 0);
|
||||
break;
|
||||
}
|
||||
previous = i;
|
||||
i = next;
|
||||
next = (next + 1) % vertexCount;
|
||||
}
|
||||
triangles.push(indices[(vertexCount + i - 1) % vertexCount]);
|
||||
triangles.push(indices[i]);
|
||||
triangles.push(indices[(i + 1) % vertexCount]);
|
||||
indices.splice(i, 1);
|
||||
isConcave.splice(i, 1);
|
||||
vertexCount--;
|
||||
var previousIndex = (vertexCount + i - 1) % vertexCount;
|
||||
var nextIndex = i == vertexCount ? 0 : i;
|
||||
isConcave[previousIndex] = ConvexDecomposer.isConcave(previousIndex, vertexCount, vertices, indices);
|
||||
isConcave[nextIndex] = ConvexDecomposer.isConcave(nextIndex, vertexCount, vertices, indices);
|
||||
}
|
||||
if (vertexCount == 3) {
|
||||
triangles.push(indices[2]);
|
||||
triangles.push(indices[0]);
|
||||
triangles.push(indices[1]);
|
||||
}
|
||||
var convexPolygons = this.convexPolygons;
|
||||
this.polygonPool.freeAll(convexPolygons);
|
||||
convexPolygons.length = 0;
|
||||
var convexPolygonsIndices = this.convexPolygonsIndices;
|
||||
this.polygonIndicesPool.freeAll(convexPolygonsIndices);
|
||||
convexPolygonsIndices.length = 0;
|
||||
var polygonIndices = this.polygonIndicesPool.obtain();
|
||||
polygonIndices.length = 0;
|
||||
var polygon = this.polygonPool.obtain();
|
||||
polygon.length = 0;
|
||||
var fanBaseIndex = -1, lastWinding = 0;
|
||||
for (var i = 0, n = triangles.length; i < n; i += 3) {
|
||||
var t1 = triangles[i] << 1, t2 = triangles[i + 1] << 1, t3 = triangles[i + 2] << 1;
|
||||
var x1 = vertices[t1], y1 = vertices[t1 + 1];
|
||||
var x2 = vertices[t2], y2 = vertices[t2 + 1];
|
||||
var x3 = vertices[t3], y3 = vertices[t3 + 1];
|
||||
var merged = false;
|
||||
if (fanBaseIndex == t1) {
|
||||
var o = polygon.length - 4;
|
||||
var winding1 = ConvexDecomposer.winding(polygon[o], polygon[o + 1], polygon[o + 2], polygon[o + 3], x3, y3);
|
||||
var winding2 = ConvexDecomposer.winding(x3, y3, polygon[0], polygon[1], polygon[2], polygon[3]);
|
||||
if (winding1 == lastWinding && winding2 == lastWinding) {
|
||||
polygon.push(x3);
|
||||
polygon.push(y3);
|
||||
polygonIndices.push(t3);
|
||||
merged = true;
|
||||
}
|
||||
}
|
||||
if (!merged) {
|
||||
if (polygon.length > 0) {
|
||||
convexPolygons.push(polygon);
|
||||
convexPolygonsIndices.push(polygonIndices);
|
||||
}
|
||||
polygon = this.polygonPool.obtain();
|
||||
polygon.length = 0;
|
||||
polygon.push(x1);
|
||||
polygon.push(y1);
|
||||
polygon.push(x2);
|
||||
polygon.push(y2);
|
||||
polygon.push(x3);
|
||||
polygon.push(y3);
|
||||
polygonIndices = this.polygonIndicesPool.obtain();
|
||||
polygonIndices.length = 0;
|
||||
polygonIndices.push(t1);
|
||||
polygonIndices.push(t2);
|
||||
polygonIndices.push(t3);
|
||||
lastWinding = ConvexDecomposer.winding(x1, y1, x2, y2, x3, y3);
|
||||
fanBaseIndex = t1;
|
||||
}
|
||||
}
|
||||
if (polygon.length > 0) {
|
||||
convexPolygons.push(polygon);
|
||||
convexPolygonsIndices.push(polygonIndices);
|
||||
}
|
||||
for (var i = 0, n = convexPolygons.length; i < n; i++) {
|
||||
polygonIndices = convexPolygonsIndices[i];
|
||||
if (polygonIndices.length == 0)
|
||||
continue;
|
||||
var firstIndex = polygonIndices[0];
|
||||
var lastIndex = polygonIndices[polygonIndices.length - 1];
|
||||
polygon = convexPolygons[i];
|
||||
var o = polygon.length - 4;
|
||||
var prevPrevX = polygon[o], prevPrevY = polygon[o + 1];
|
||||
var prevX = polygon[o + 2], prevY = polygon[o + 3];
|
||||
var firstX = polygon[0], firstY = polygon[1];
|
||||
var secondX = polygon[2], secondY = polygon[3];
|
||||
var winding = ConvexDecomposer.winding(prevPrevX, prevPrevY, prevX, prevY, firstX, firstY);
|
||||
for (var ii = 0; ii < n; ii++) {
|
||||
if (ii == i)
|
||||
continue;
|
||||
var otherIndices = convexPolygonsIndices[ii];
|
||||
if (otherIndices.length != 3)
|
||||
continue;
|
||||
var otherFirstIndex = otherIndices[0];
|
||||
var otherSecondIndex = otherIndices[1];
|
||||
var otherLastIndex = otherIndices[2];
|
||||
var otherPoly = convexPolygons[ii];
|
||||
var x3 = otherPoly[otherPoly.length - 2], y3 = otherPoly[otherPoly.length - 1];
|
||||
if (otherFirstIndex != firstIndex || otherSecondIndex != lastIndex)
|
||||
continue;
|
||||
var winding1 = ConvexDecomposer.winding(prevPrevX, prevPrevY, prevX, prevY, x3, y3);
|
||||
var winding2 = ConvexDecomposer.winding(x3, y3, firstX, firstY, secondX, secondY);
|
||||
if (winding1 == winding && winding2 == winding) {
|
||||
otherPoly.length = 0;
|
||||
otherIndices.length = 0;
|
||||
polygon.push(x3);
|
||||
polygon.push(y3);
|
||||
polygonIndices.push(otherLastIndex);
|
||||
prevPrevX = prevX;
|
||||
prevPrevY = prevY;
|
||||
prevX = x3;
|
||||
prevY = y3;
|
||||
ii = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (var i = convexPolygons.length - 1; i >= 0; i--) {
|
||||
polygon = convexPolygons[i];
|
||||
if (polygon.length == 0) {
|
||||
convexPolygons.splice(i, 1);
|
||||
this.polygonPool.free(polygon);
|
||||
}
|
||||
}
|
||||
return convexPolygons;
|
||||
};
|
||||
ConvexDecomposer.isConcave = function (index, vertexCount, vertices, indices) {
|
||||
var previous = indices[(vertexCount + index - 1) % vertexCount] << 1;
|
||||
var current = indices[index] << 1;
|
||||
var next = indices[(index + 1) % vertexCount] << 1;
|
||||
return !this.positiveArea(vertices[previous], vertices[previous + 1], vertices[current], vertices[current + 1], vertices[next], vertices[next + 1]);
|
||||
};
|
||||
ConvexDecomposer.positiveArea = function (p1x, p1y, p2x, p2y, p3x, p3y) {
|
||||
return p1x * (p3y - p2y) + p2x * (p1y - p3y) + p3x * (p2y - p1y) >= 0;
|
||||
};
|
||||
ConvexDecomposer.winding = function (p1x, p1y, p2x, p2y, p3x, p3y) {
|
||||
var px = p2x - p1x, py = p2y - p1y;
|
||||
return p3x * py - p3y * px + px * p1y - p1x * py >= 0 ? 1 : -1;
|
||||
};
|
||||
return ConvexDecomposer;
|
||||
}());
|
||||
spine.ConvexDecomposer = ConvexDecomposer;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var Event = (function () {
|
||||
function Event(time, data) {
|
||||
@ -3945,6 +4161,285 @@ var spine;
|
||||
spine.SkeletonBounds = SkeletonBounds;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var SkeletonClipping = (function () {
|
||||
function SkeletonClipping() {
|
||||
this.decomposer = new spine.ConvexDecomposer();
|
||||
this.clippingPolygon = new Array();
|
||||
this.clipOutput = new Array();
|
||||
this.clippedVertices = new Array();
|
||||
this.clippedTriangles = new Array();
|
||||
this.scratch = new Array();
|
||||
}
|
||||
SkeletonClipping.prototype.clipStart = function (slot, clip) {
|
||||
if (this.clipAttachment != null)
|
||||
return;
|
||||
this.clipAttachment = clip;
|
||||
var n = clip.worldVerticesLength;
|
||||
var vertices = spine.Utils.setArraySize(this.clippingPolygon, n);
|
||||
clip.computeWorldVertices(slot, 0, n, vertices, 0, 2);
|
||||
var clippingPolygon = this.clippingPolygon;
|
||||
SkeletonClipping.makeClockwise(clippingPolygon);
|
||||
var clippingPolygons = this.clippingPolygons = this.decomposer.decompose(clippingPolygon);
|
||||
for (var i = 0, n_1 = clippingPolygons.length; i < n_1; i++) {
|
||||
var polygon = clippingPolygons[i];
|
||||
SkeletonClipping.makeClockwise(polygon);
|
||||
polygon.push(polygon[0]);
|
||||
polygon.push(polygon[1]);
|
||||
}
|
||||
};
|
||||
SkeletonClipping.prototype.clipEndWithSlot = function (slot) {
|
||||
if (this.clipAttachment != null && this.clipAttachment.endSlot == slot.data)
|
||||
this.clipEnd();
|
||||
};
|
||||
SkeletonClipping.prototype.clipEnd = function () {
|
||||
if (this.clipAttachment == null)
|
||||
return;
|
||||
this.clipAttachment = null;
|
||||
this.clippingPolygons = null;
|
||||
this.clippedVertices.length = 0;
|
||||
this.clippedTriangles.length = 0;
|
||||
this.clippingPolygon.length = 0;
|
||||
};
|
||||
SkeletonClipping.prototype.isClipping = function () {
|
||||
return this.clipAttachment != null;
|
||||
};
|
||||
SkeletonClipping.prototype.clipTriangles = function (vertices, verticesLength, triangles, trianglesLength, uvs, light, dark, twoColor) {
|
||||
var clipOutput = this.clipOutput, clippedVertices = this.clippedVertices;
|
||||
var clippedTriangles = this.clippedTriangles;
|
||||
var polygons = this.clippingPolygons;
|
||||
var polygonsCount = this.clippingPolygons.length;
|
||||
var vertexSize = twoColor ? 12 : 8;
|
||||
var index = 0;
|
||||
clippedVertices.length = 0;
|
||||
clippedTriangles.length = 0;
|
||||
outer: for (var i = 0; i < trianglesLength; i += 3) {
|
||||
var vertexOffset = triangles[i] << 1;
|
||||
var x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1];
|
||||
var u1 = uvs[vertexOffset], v1 = uvs[vertexOffset + 1];
|
||||
vertexOffset = triangles[i + 1] << 1;
|
||||
var x2 = vertices[vertexOffset], y2 = vertices[vertexOffset + 1];
|
||||
var u2 = uvs[vertexOffset], v2 = uvs[vertexOffset + 1];
|
||||
vertexOffset = triangles[i + 2] << 1;
|
||||
var x3 = vertices[vertexOffset], y3 = vertices[vertexOffset + 1];
|
||||
var u3 = uvs[vertexOffset], v3 = uvs[vertexOffset + 1];
|
||||
for (var p = 0; p < polygonsCount; p++) {
|
||||
var s = clippedVertices.length;
|
||||
if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) {
|
||||
var clipOutputLength = clipOutput.length;
|
||||
if (clipOutputLength == 0)
|
||||
continue;
|
||||
var d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1;
|
||||
var d = 1 / (d0 * d2 + d1 * (y1 - y3));
|
||||
var clipOutputCount = clipOutputLength >> 1;
|
||||
var clipOutputItems = this.clipOutput;
|
||||
var clippedVerticesItems = spine.Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize);
|
||||
for (var ii = 0; ii < clipOutputLength; ii += 2) {
|
||||
var x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
|
||||
clippedVerticesItems[s] = x;
|
||||
clippedVerticesItems[s + 1] = y;
|
||||
clippedVerticesItems[s + 2] = light.r;
|
||||
clippedVerticesItems[s + 3] = light.g;
|
||||
clippedVerticesItems[s + 4] = light.b;
|
||||
clippedVerticesItems[s + 5] = light.a;
|
||||
var c0 = x - x3, c1 = y - y3;
|
||||
var a = (d0 * c0 + d1 * c1) * d;
|
||||
var b = (d4 * c0 + d2 * c1) * d;
|
||||
var c = 1 - a - b;
|
||||
clippedVerticesItems[s + 6] = u1 * a + u2 * b + u3 * c;
|
||||
clippedVerticesItems[s + 7] = v1 * a + v2 * b + v3 * c;
|
||||
if (twoColor) {
|
||||
clippedVerticesItems[s + 8] = dark.r;
|
||||
clippedVerticesItems[s + 8] = dark.g;
|
||||
clippedVerticesItems[s + 10] = dark.b;
|
||||
clippedVerticesItems[s + 11] = dark.a;
|
||||
}
|
||||
s += vertexSize;
|
||||
}
|
||||
s = clippedTriangles.length;
|
||||
var clippedTrianglesItems = spine.Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
|
||||
clipOutputCount--;
|
||||
for (var ii = 1; ii < clipOutputCount; ii++) {
|
||||
clippedTrianglesItems[s] = index;
|
||||
clippedTrianglesItems[s + 1] = (index + ii);
|
||||
clippedTrianglesItems[s + 2] = (index + ii + 1);
|
||||
s += 3;
|
||||
}
|
||||
index += clipOutputCount + 1;
|
||||
}
|
||||
else {
|
||||
var clippedVerticesItems = spine.Utils.setArraySize(clippedVertices, s + 3 * vertexSize);
|
||||
clippedVerticesItems[s] = x1;
|
||||
clippedVerticesItems[s + 1] = y1;
|
||||
clippedVerticesItems[s + 2] = light.r;
|
||||
clippedVerticesItems[s + 3] = light.g;
|
||||
clippedVerticesItems[s + 4] = light.b;
|
||||
clippedVerticesItems[s + 5] = light.a;
|
||||
if (!twoColor) {
|
||||
clippedVerticesItems[s + 6] = u1;
|
||||
clippedVerticesItems[s + 7] = v1;
|
||||
clippedVerticesItems[s + 8] = x2;
|
||||
clippedVerticesItems[s + 9] = y2;
|
||||
clippedVerticesItems[s + 10] = light.r;
|
||||
clippedVerticesItems[s + 11] = light.g;
|
||||
clippedVerticesItems[s + 12] = light.b;
|
||||
clippedVerticesItems[s + 13] = light.a;
|
||||
clippedVerticesItems[s + 14] = u2;
|
||||
clippedVerticesItems[s + 15] = v2;
|
||||
clippedVerticesItems[s + 16] = x3;
|
||||
clippedVerticesItems[s + 17] = y3;
|
||||
clippedVerticesItems[s + 18] = light.r;
|
||||
clippedVerticesItems[s + 19] = light.g;
|
||||
clippedVerticesItems[s + 20] = light.b;
|
||||
clippedVerticesItems[s + 21] = light.a;
|
||||
clippedVerticesItems[s + 22] = u3;
|
||||
clippedVerticesItems[s + 23] = v3;
|
||||
}
|
||||
else {
|
||||
clippedVerticesItems[s + 6] = u1;
|
||||
clippedVerticesItems[s + 7] = v1;
|
||||
clippedVerticesItems[s + 8] = dark.r;
|
||||
clippedVerticesItems[s + 9] = dark.g;
|
||||
clippedVerticesItems[s + 10] = dark.b;
|
||||
clippedVerticesItems[s + 11] = dark.a;
|
||||
clippedVerticesItems[s + 12] = x2;
|
||||
clippedVerticesItems[s + 13] = y2;
|
||||
clippedVerticesItems[s + 14] = light.r;
|
||||
clippedVerticesItems[s + 15] = light.g;
|
||||
clippedVerticesItems[s + 16] = light.b;
|
||||
clippedVerticesItems[s + 17] = light.a;
|
||||
clippedVerticesItems[s + 18] = u2;
|
||||
clippedVerticesItems[s + 19] = v2;
|
||||
clippedVerticesItems[s + 20] = dark.r;
|
||||
clippedVerticesItems[s + 21] = dark.g;
|
||||
clippedVerticesItems[s + 22] = dark.b;
|
||||
clippedVerticesItems[s + 23] = dark.a;
|
||||
clippedVerticesItems[s + 24] = x3;
|
||||
clippedVerticesItems[s + 25] = y3;
|
||||
clippedVerticesItems[s + 26] = light.r;
|
||||
clippedVerticesItems[s + 27] = light.g;
|
||||
clippedVerticesItems[s + 28] = light.b;
|
||||
clippedVerticesItems[s + 29] = light.a;
|
||||
clippedVerticesItems[s + 30] = u3;
|
||||
clippedVerticesItems[s + 31] = v3;
|
||||
clippedVerticesItems[s + 32] = dark.r;
|
||||
clippedVerticesItems[s + 33] = dark.g;
|
||||
clippedVerticesItems[s + 34] = dark.b;
|
||||
clippedVerticesItems[s + 35] = dark.a;
|
||||
}
|
||||
s = clippedTriangles.length;
|
||||
var clippedTrianglesItems = spine.Utils.setArraySize(clippedTriangles, s + 3);
|
||||
clippedTrianglesItems[s] = index;
|
||||
clippedTrianglesItems[s + 1] = (index + 1);
|
||||
clippedTrianglesItems[s + 2] = (index + 2);
|
||||
index += 3;
|
||||
continue outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
SkeletonClipping.prototype.clip = function (x1, y1, x2, y2, x3, y3, clippingArea, output) {
|
||||
var originalOutput = output;
|
||||
var clipped = false;
|
||||
var input = null;
|
||||
if (clippingArea.length % 4 >= 2) {
|
||||
input = output;
|
||||
output = this.scratch;
|
||||
}
|
||||
else
|
||||
input = this.scratch;
|
||||
input.length = 0;
|
||||
input.push(x1);
|
||||
input.push(y1);
|
||||
input.push(x2);
|
||||
input.push(y2);
|
||||
input.push(x3);
|
||||
input.push(y3);
|
||||
input.push(x1);
|
||||
input.push(y1);
|
||||
output.length = 0;
|
||||
var clippingVertices = clippingArea;
|
||||
var clippingVerticesLast = clippingArea.length - 4;
|
||||
for (var i = 0;; i += 2) {
|
||||
var edgeX = clippingVertices[i], edgeY = clippingVertices[i + 1];
|
||||
var edgeX2 = clippingVertices[i + 2], edgeY2 = clippingVertices[i + 3];
|
||||
var deltaX = edgeX - edgeX2, deltaY = edgeY - edgeY2;
|
||||
var inputVertices = input;
|
||||
var inputVerticesLength = input.length - 2, outputStart = output.length;
|
||||
for (var ii = 0; ii < inputVerticesLength; ii += 2) {
|
||||
var inputX = inputVertices[ii], inputY = inputVertices[ii + 1];
|
||||
var inputX2 = inputVertices[ii + 2], inputY2 = inputVertices[ii + 3];
|
||||
var side2 = deltaX * (inputY2 - edgeY2) - deltaY * (inputX2 - edgeX2) > 0;
|
||||
if (deltaX * (inputY - edgeY2) - deltaY * (inputX - edgeX2) > 0) {
|
||||
if (side2) {
|
||||
output.push(inputX2);
|
||||
output.push(inputY2);
|
||||
continue;
|
||||
}
|
||||
var c0 = inputY2 - inputY, c2 = inputX2 - inputX;
|
||||
var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / (c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY));
|
||||
output.push(edgeX + (edgeX2 - edgeX) * ua);
|
||||
output.push(edgeY + (edgeY2 - edgeY) * ua);
|
||||
}
|
||||
else if (side2) {
|
||||
var c0 = inputY2 - inputY, c2 = inputX2 - inputX;
|
||||
var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / (c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY));
|
||||
output.push(edgeX + (edgeX2 - edgeX) * ua);
|
||||
output.push(edgeY + (edgeY2 - edgeY) * ua);
|
||||
output.push(inputX2);
|
||||
output.push(inputY2);
|
||||
}
|
||||
clipped = true;
|
||||
}
|
||||
if (outputStart == output.length) {
|
||||
originalOutput.length = 0;
|
||||
return true;
|
||||
}
|
||||
output.push(output[0]);
|
||||
output.push(output[1]);
|
||||
if (i == clippingVerticesLast)
|
||||
break;
|
||||
var temp = output;
|
||||
output = input;
|
||||
output.length = 0;
|
||||
input = temp;
|
||||
}
|
||||
if (originalOutput != output) {
|
||||
originalOutput.length = 0;
|
||||
for (var i = 0, n = output.length - 2; i < n; i++)
|
||||
originalOutput[i] = output[i];
|
||||
}
|
||||
else
|
||||
originalOutput.length = originalOutput.length - 2;
|
||||
return clipped;
|
||||
};
|
||||
SkeletonClipping.makeClockwise = function (polygon) {
|
||||
var vertices = polygon;
|
||||
var verticeslength = polygon.length;
|
||||
var area = vertices[verticeslength - 2] * vertices[1] - vertices[0] * vertices[verticeslength - 1], p1x = 0, p1y = 0, p2x = 0, p2y = 0;
|
||||
for (var i = 0, n = verticeslength - 3; i < n; i += 2) {
|
||||
p1x = vertices[i];
|
||||
p1y = vertices[i + 1];
|
||||
p2x = vertices[i + 2];
|
||||
p2y = vertices[i + 3];
|
||||
area += p1x * p2y - p2x * p1y;
|
||||
}
|
||||
if (area < 0)
|
||||
return;
|
||||
for (var i = 0, lastX = verticeslength - 2, n = verticeslength >> 1; i < n; i += 2) {
|
||||
var x = vertices[i], y = vertices[i + 1];
|
||||
var other = lastX - i;
|
||||
vertices[i] = vertices[other];
|
||||
vertices[i + 1] = vertices[other + 1];
|
||||
vertices[other] = x;
|
||||
vertices[other + 1] = y;
|
||||
}
|
||||
};
|
||||
return SkeletonClipping;
|
||||
}());
|
||||
spine.SkeletonClipping = SkeletonClipping;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var SkeletonData = (function () {
|
||||
function SkeletonData() {
|
||||
@ -4236,7 +4731,7 @@ var spine;
|
||||
throw new Error("Slot not found: " + slotName);
|
||||
var slotMap = skinMap[slotName];
|
||||
for (var entryName in slotMap) {
|
||||
var attachment = this.readAttachment(slotMap[entryName], skin, slotIndex, entryName);
|
||||
var attachment = this.readAttachment(slotMap[entryName], skin, slotIndex, entryName, skeletonData);
|
||||
if (attachment != null)
|
||||
skin.addAttachment(slotIndex, entryName, attachment);
|
||||
}
|
||||
@ -4276,7 +4771,7 @@ var spine;
|
||||
}
|
||||
return skeletonData;
|
||||
};
|
||||
SkeletonJson.prototype.readAttachment = function (map, skin, slotIndex, name) {
|
||||
SkeletonJson.prototype.readAttachment = function (map, skin, slotIndex, name, skeletonData) {
|
||||
var scale = this.scale;
|
||||
name = this.getValue(map, "name", name);
|
||||
var type = this.getValue(map, "type", "region");
|
||||
@ -4363,6 +4858,24 @@ var spine;
|
||||
point.color.setFromString(color);
|
||||
return point;
|
||||
}
|
||||
case "clipping": {
|
||||
var clip = this.attachmentLoader.newClippingAttachment(skin, name);
|
||||
if (clip == null)
|
||||
return null;
|
||||
var end = this.getValue(map, "end", null);
|
||||
if (end != null) {
|
||||
var slot = skeletonData.findSlot(end);
|
||||
if (slot == null)
|
||||
throw new Error("Clipping end slot not found: " + end);
|
||||
clip.endSlot = slot;
|
||||
}
|
||||
var vertexCount = map.vertexCount;
|
||||
this.readVertices(map, clip, vertexCount << 1);
|
||||
var color = this.getValue(map, "color", null);
|
||||
if (color != null)
|
||||
clip.color.setFromString(color);
|
||||
return clip;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
@ -5543,6 +6056,17 @@ var spine;
|
||||
return array;
|
||||
}
|
||||
};
|
||||
Utils.newShortArray = function (size) {
|
||||
if (Utils.SUPPORTS_TYPED_ARRAYS) {
|
||||
return new Int16Array(size);
|
||||
}
|
||||
else {
|
||||
var array = new Array(size);
|
||||
for (var i = 0; i < array.length; i++)
|
||||
array[i] = 0;
|
||||
return array;
|
||||
}
|
||||
};
|
||||
Utils.toFloatArray = function (array) {
|
||||
return Utils.SUPPORTS_TYPED_ARRAYS ? new Float32Array(array) : array;
|
||||
};
|
||||
|
||||
File diff suppressed because one or more lines are too long
2889
spine-ts/build/spine-webgl.d.ts
vendored
2889
spine-ts/build/spine-webgl.d.ts
vendored
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
51
spine-ts/build/spine-widget.d.ts
vendored
51
spine-ts/build/spine-widget.d.ts
vendored
@ -383,6 +383,7 @@ declare module spine {
|
||||
newBoundingBoxAttachment(skin: Skin, name: string): BoundingBoxAttachment;
|
||||
newPathAttachment(skin: Skin, name: string): PathAttachment;
|
||||
newPointAttachment(skin: Skin, name: string): PointAttachment;
|
||||
newClippingAttachment(skin: Skin, name: string): ClippingAttachment;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
@ -406,6 +407,7 @@ declare module spine {
|
||||
newBoundingBoxAttachment(skin: Skin, name: string): BoundingBoxAttachment;
|
||||
newPathAttachment(skin: Skin, name: string): PathAttachment;
|
||||
newPointAttachment(skin: Skin, name: string): PointAttachment;
|
||||
newClippingAttachment(skin: Skin, name: string): ClippingAttachment;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
@ -424,6 +426,13 @@ declare module spine {
|
||||
constructor(name: string);
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class ClippingAttachment extends VertexAttachment {
|
||||
endSlot: SlotData;
|
||||
color: Color;
|
||||
constructor(name: string);
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class MeshAttachment extends VertexAttachment {
|
||||
region: TextureRegion;
|
||||
@ -607,6 +616,21 @@ declare module spine {
|
||||
getOrder(): number;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class ConvexDecomposer {
|
||||
private convexPolygons;
|
||||
private convexPolygonsIndices;
|
||||
private indicesArray;
|
||||
private isConcaveArray;
|
||||
private triangles;
|
||||
private polygonPool;
|
||||
private polygonIndicesPool;
|
||||
decompose(input: ArrayLike<number>): Array<Array<number>>;
|
||||
private static isConcave(index, vertexCount, vertices, indices);
|
||||
private static positiveArea(p1x, p1y, p2x, p2y, p3x, p3y);
|
||||
private static winding(p1x, p1y, p2x, p2y, p3x, p3y);
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class Event {
|
||||
data: EventData;
|
||||
@ -802,6 +826,25 @@ declare module spine {
|
||||
getHeight(): number;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class SkeletonClipping {
|
||||
private decomposer;
|
||||
private clippingPolygon;
|
||||
private clipOutput;
|
||||
clippedVertices: number[];
|
||||
clippedTriangles: number[];
|
||||
private scratch;
|
||||
private clipAttachment;
|
||||
private clippingPolygons;
|
||||
clipStart(slot: Slot, clip: ClippingAttachment): void;
|
||||
clipEndWithSlot(slot: Slot): void;
|
||||
clipEnd(): void;
|
||||
isClipping(): boolean;
|
||||
clipTriangles(vertices: ArrayLike<number>, verticesLength: number, triangles: ArrayLike<number>, trianglesLength: number, uvs: ArrayLike<number>, light: Color, dark: Color, twoColor: boolean): void;
|
||||
clip(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, clippingArea: Array<number>, output: Array<number>): boolean;
|
||||
static makeClockwise(polygon: ArrayLike<number>): void;
|
||||
}
|
||||
}
|
||||
declare module spine {
|
||||
class SkeletonData {
|
||||
name: string;
|
||||
@ -840,7 +883,7 @@ declare module spine {
|
||||
private linkedMeshes;
|
||||
constructor(attachmentLoader: AttachmentLoader);
|
||||
readSkeletonData(json: string | any): SkeletonData;
|
||||
readAttachment(map: any, skin: Skin, slotIndex: number, name: string): Attachment;
|
||||
readAttachment(map: any, skin: Skin, slotIndex: number, name: string, skeletonData: SkeletonData): Attachment;
|
||||
readVertices(map: any, attachment: VertexAttachment, verticesLength: number): void;
|
||||
readAnimation(map: any, name: string, skeletonData: SkeletonData): void;
|
||||
readCurve(map: any, timeline: CurveTimeline, frameIndex: number): void;
|
||||
@ -1058,6 +1101,7 @@ declare module spine {
|
||||
static ensureArrayCapacity<T>(array: Array<T>, size: number, value?: any): Array<T>;
|
||||
static newArray<T>(size: number, defaultValue: T): Array<T>;
|
||||
static newFloatArray(size: number): ArrayLike<number>;
|
||||
static newShortArray(size: number): ArrayLike<number>;
|
||||
static toFloatArray(array: Array<number>): number[] | Float32Array;
|
||||
}
|
||||
class DebugUtils {
|
||||
@ -1445,6 +1489,7 @@ declare module spine.webgl {
|
||||
attachmentLineColor: Color;
|
||||
triangleLineColor: Color;
|
||||
pathColor: Color;
|
||||
clipColor: Color;
|
||||
aabbColor: Color;
|
||||
drawBones: boolean;
|
||||
drawRegionAttachments: boolean;
|
||||
@ -1453,6 +1498,7 @@ declare module spine.webgl {
|
||||
drawMeshTriangles: boolean;
|
||||
drawPaths: boolean;
|
||||
drawSkeletonXY: boolean;
|
||||
drawClipping: boolean;
|
||||
premultipliedAlpha: boolean;
|
||||
scale: number;
|
||||
boneWidth: number;
|
||||
@ -1478,10 +1524,9 @@ declare module spine.webgl {
|
||||
private vertexSize;
|
||||
private twoColorTint;
|
||||
private renderable;
|
||||
private clipper;
|
||||
constructor(gl: WebGLRenderingContext, twoColorTint?: boolean);
|
||||
draw(batcher: PolygonBatcher, skeleton: Skeleton): void;
|
||||
private computeRegionVertices(slot, region, pma, twoColorTint?);
|
||||
private computeMeshVertices(slot, mesh, pma, twoColorTint?);
|
||||
}
|
||||
}
|
||||
declare module spine.webgl {
|
||||
|
||||
@ -1922,6 +1922,9 @@ var spine;
|
||||
AtlasAttachmentLoader.prototype.newPointAttachment = function (skin, name) {
|
||||
return new spine.PointAttachment(name);
|
||||
};
|
||||
AtlasAttachmentLoader.prototype.newClippingAttachment = function (skin, name) {
|
||||
return new spine.ClippingAttachment(name);
|
||||
};
|
||||
return AtlasAttachmentLoader;
|
||||
}());
|
||||
spine.AtlasAttachmentLoader = AtlasAttachmentLoader;
|
||||
@ -2034,6 +2037,18 @@ var spine;
|
||||
spine.BoundingBoxAttachment = BoundingBoxAttachment;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var ClippingAttachment = (function (_super) {
|
||||
__extends(ClippingAttachment, _super);
|
||||
function ClippingAttachment(name) {
|
||||
_super.call(this, name);
|
||||
this.color = new spine.Color(0.2275, 0.2275, 0.8078, 1);
|
||||
}
|
||||
return ClippingAttachment;
|
||||
}(spine.VertexAttachment));
|
||||
spine.ClippingAttachment = ClippingAttachment;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var MeshAttachment = (function (_super) {
|
||||
__extends(MeshAttachment, _super);
|
||||
@ -2577,6 +2592,207 @@ var spine;
|
||||
var TransformMode = spine.TransformMode;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var ConvexDecomposer = (function () {
|
||||
function ConvexDecomposer() {
|
||||
this.convexPolygons = new Array();
|
||||
this.convexPolygonsIndices = new Array();
|
||||
this.indicesArray = new Array();
|
||||
this.isConcaveArray = new Array();
|
||||
this.triangles = new Array();
|
||||
this.polygonPool = new spine.Pool(function () {
|
||||
return new Array();
|
||||
});
|
||||
this.polygonIndicesPool = new spine.Pool(function () {
|
||||
return new Array();
|
||||
});
|
||||
}
|
||||
ConvexDecomposer.prototype.decompose = function (input) {
|
||||
var vertices = input;
|
||||
var vertexCount = input.length >> 1;
|
||||
var indices = this.indicesArray;
|
||||
indices.length = 0;
|
||||
for (var i = 0; i < vertexCount; i++)
|
||||
indices[i] = i;
|
||||
var isConcave = this.isConcaveArray;
|
||||
isConcave.length = 0;
|
||||
for (var i = 0, n = vertexCount; i < n; ++i)
|
||||
isConcave[i] = ConvexDecomposer.isConcave(i, vertexCount, vertices, indices);
|
||||
var triangles = this.triangles;
|
||||
triangles.length = 0;
|
||||
while (vertexCount > 3) {
|
||||
var previous = vertexCount - 1, i = 0, next = 1;
|
||||
while (true) {
|
||||
outer: if (!isConcave[i]) {
|
||||
var p1 = indices[previous] << 1, p2 = indices[i] << 1, p3 = indices[next] << 1;
|
||||
var p1x = vertices[p1], p1y = vertices[p1 + 1];
|
||||
var p2x = vertices[p2], p2y = vertices[p2 + 1];
|
||||
var p3x = vertices[p3], p3y = vertices[p3 + 1];
|
||||
for (var ii = (next + 1) % vertexCount; ii != previous; ii = (ii + 1) % vertexCount) {
|
||||
if (!isConcave[ii])
|
||||
continue;
|
||||
var v = indices[ii] << 1;
|
||||
var vx = vertices[v], vy = vertices[v + 1];
|
||||
if (ConvexDecomposer.positiveArea(p3x, p3y, p1x, p1y, vx, vy)) {
|
||||
if (ConvexDecomposer.positiveArea(p1x, p1y, p2x, p2y, vx, vy)) {
|
||||
if (ConvexDecomposer.positiveArea(p2x, p2y, p3x, p3y, vx, vy))
|
||||
break outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (next == 0) {
|
||||
do {
|
||||
if (!isConcave[i])
|
||||
break;
|
||||
i--;
|
||||
} while (i > 0);
|
||||
break;
|
||||
}
|
||||
previous = i;
|
||||
i = next;
|
||||
next = (next + 1) % vertexCount;
|
||||
}
|
||||
triangles.push(indices[(vertexCount + i - 1) % vertexCount]);
|
||||
triangles.push(indices[i]);
|
||||
triangles.push(indices[(i + 1) % vertexCount]);
|
||||
indices.splice(i, 1);
|
||||
isConcave.splice(i, 1);
|
||||
vertexCount--;
|
||||
var previousIndex = (vertexCount + i - 1) % vertexCount;
|
||||
var nextIndex = i == vertexCount ? 0 : i;
|
||||
isConcave[previousIndex] = ConvexDecomposer.isConcave(previousIndex, vertexCount, vertices, indices);
|
||||
isConcave[nextIndex] = ConvexDecomposer.isConcave(nextIndex, vertexCount, vertices, indices);
|
||||
}
|
||||
if (vertexCount == 3) {
|
||||
triangles.push(indices[2]);
|
||||
triangles.push(indices[0]);
|
||||
triangles.push(indices[1]);
|
||||
}
|
||||
var convexPolygons = this.convexPolygons;
|
||||
this.polygonPool.freeAll(convexPolygons);
|
||||
convexPolygons.length = 0;
|
||||
var convexPolygonsIndices = this.convexPolygonsIndices;
|
||||
this.polygonIndicesPool.freeAll(convexPolygonsIndices);
|
||||
convexPolygonsIndices.length = 0;
|
||||
var polygonIndices = this.polygonIndicesPool.obtain();
|
||||
polygonIndices.length = 0;
|
||||
var polygon = this.polygonPool.obtain();
|
||||
polygon.length = 0;
|
||||
var fanBaseIndex = -1, lastWinding = 0;
|
||||
for (var i = 0, n = triangles.length; i < n; i += 3) {
|
||||
var t1 = triangles[i] << 1, t2 = triangles[i + 1] << 1, t3 = triangles[i + 2] << 1;
|
||||
var x1 = vertices[t1], y1 = vertices[t1 + 1];
|
||||
var x2 = vertices[t2], y2 = vertices[t2 + 1];
|
||||
var x3 = vertices[t3], y3 = vertices[t3 + 1];
|
||||
var merged = false;
|
||||
if (fanBaseIndex == t1) {
|
||||
var o = polygon.length - 4;
|
||||
var winding1 = ConvexDecomposer.winding(polygon[o], polygon[o + 1], polygon[o + 2], polygon[o + 3], x3, y3);
|
||||
var winding2 = ConvexDecomposer.winding(x3, y3, polygon[0], polygon[1], polygon[2], polygon[3]);
|
||||
if (winding1 == lastWinding && winding2 == lastWinding) {
|
||||
polygon.push(x3);
|
||||
polygon.push(y3);
|
||||
polygonIndices.push(t3);
|
||||
merged = true;
|
||||
}
|
||||
}
|
||||
if (!merged) {
|
||||
if (polygon.length > 0) {
|
||||
convexPolygons.push(polygon);
|
||||
convexPolygonsIndices.push(polygonIndices);
|
||||
}
|
||||
polygon = this.polygonPool.obtain();
|
||||
polygon.length = 0;
|
||||
polygon.push(x1);
|
||||
polygon.push(y1);
|
||||
polygon.push(x2);
|
||||
polygon.push(y2);
|
||||
polygon.push(x3);
|
||||
polygon.push(y3);
|
||||
polygonIndices = this.polygonIndicesPool.obtain();
|
||||
polygonIndices.length = 0;
|
||||
polygonIndices.push(t1);
|
||||
polygonIndices.push(t2);
|
||||
polygonIndices.push(t3);
|
||||
lastWinding = ConvexDecomposer.winding(x1, y1, x2, y2, x3, y3);
|
||||
fanBaseIndex = t1;
|
||||
}
|
||||
}
|
||||
if (polygon.length > 0) {
|
||||
convexPolygons.push(polygon);
|
||||
convexPolygonsIndices.push(polygonIndices);
|
||||
}
|
||||
for (var i = 0, n = convexPolygons.length; i < n; i++) {
|
||||
polygonIndices = convexPolygonsIndices[i];
|
||||
if (polygonIndices.length == 0)
|
||||
continue;
|
||||
var firstIndex = polygonIndices[0];
|
||||
var lastIndex = polygonIndices[polygonIndices.length - 1];
|
||||
polygon = convexPolygons[i];
|
||||
var o = polygon.length - 4;
|
||||
var prevPrevX = polygon[o], prevPrevY = polygon[o + 1];
|
||||
var prevX = polygon[o + 2], prevY = polygon[o + 3];
|
||||
var firstX = polygon[0], firstY = polygon[1];
|
||||
var secondX = polygon[2], secondY = polygon[3];
|
||||
var winding = ConvexDecomposer.winding(prevPrevX, prevPrevY, prevX, prevY, firstX, firstY);
|
||||
for (var ii = 0; ii < n; ii++) {
|
||||
if (ii == i)
|
||||
continue;
|
||||
var otherIndices = convexPolygonsIndices[ii];
|
||||
if (otherIndices.length != 3)
|
||||
continue;
|
||||
var otherFirstIndex = otherIndices[0];
|
||||
var otherSecondIndex = otherIndices[1];
|
||||
var otherLastIndex = otherIndices[2];
|
||||
var otherPoly = convexPolygons[ii];
|
||||
var x3 = otherPoly[otherPoly.length - 2], y3 = otherPoly[otherPoly.length - 1];
|
||||
if (otherFirstIndex != firstIndex || otherSecondIndex != lastIndex)
|
||||
continue;
|
||||
var winding1 = ConvexDecomposer.winding(prevPrevX, prevPrevY, prevX, prevY, x3, y3);
|
||||
var winding2 = ConvexDecomposer.winding(x3, y3, firstX, firstY, secondX, secondY);
|
||||
if (winding1 == winding && winding2 == winding) {
|
||||
otherPoly.length = 0;
|
||||
otherIndices.length = 0;
|
||||
polygon.push(x3);
|
||||
polygon.push(y3);
|
||||
polygonIndices.push(otherLastIndex);
|
||||
prevPrevX = prevX;
|
||||
prevPrevY = prevY;
|
||||
prevX = x3;
|
||||
prevY = y3;
|
||||
ii = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (var i = convexPolygons.length - 1; i >= 0; i--) {
|
||||
polygon = convexPolygons[i];
|
||||
if (polygon.length == 0) {
|
||||
convexPolygons.splice(i, 1);
|
||||
this.polygonPool.free(polygon);
|
||||
}
|
||||
}
|
||||
return convexPolygons;
|
||||
};
|
||||
ConvexDecomposer.isConcave = function (index, vertexCount, vertices, indices) {
|
||||
var previous = indices[(vertexCount + index - 1) % vertexCount] << 1;
|
||||
var current = indices[index] << 1;
|
||||
var next = indices[(index + 1) % vertexCount] << 1;
|
||||
return !this.positiveArea(vertices[previous], vertices[previous + 1], vertices[current], vertices[current + 1], vertices[next], vertices[next + 1]);
|
||||
};
|
||||
ConvexDecomposer.positiveArea = function (p1x, p1y, p2x, p2y, p3x, p3y) {
|
||||
return p1x * (p3y - p2y) + p2x * (p1y - p3y) + p3x * (p2y - p1y) >= 0;
|
||||
};
|
||||
ConvexDecomposer.winding = function (p1x, p1y, p2x, p2y, p3x, p3y) {
|
||||
var px = p2x - p1x, py = p2y - p1y;
|
||||
return p3x * py - p3y * px + px * p1y - p1x * py >= 0 ? 1 : -1;
|
||||
};
|
||||
return ConvexDecomposer;
|
||||
}());
|
||||
spine.ConvexDecomposer = ConvexDecomposer;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var Event = (function () {
|
||||
function Event(time, data) {
|
||||
@ -3945,6 +4161,285 @@ var spine;
|
||||
spine.SkeletonBounds = SkeletonBounds;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var SkeletonClipping = (function () {
|
||||
function SkeletonClipping() {
|
||||
this.decomposer = new spine.ConvexDecomposer();
|
||||
this.clippingPolygon = new Array();
|
||||
this.clipOutput = new Array();
|
||||
this.clippedVertices = new Array();
|
||||
this.clippedTriangles = new Array();
|
||||
this.scratch = new Array();
|
||||
}
|
||||
SkeletonClipping.prototype.clipStart = function (slot, clip) {
|
||||
if (this.clipAttachment != null)
|
||||
return;
|
||||
this.clipAttachment = clip;
|
||||
var n = clip.worldVerticesLength;
|
||||
var vertices = spine.Utils.setArraySize(this.clippingPolygon, n);
|
||||
clip.computeWorldVertices(slot, 0, n, vertices, 0, 2);
|
||||
var clippingPolygon = this.clippingPolygon;
|
||||
SkeletonClipping.makeClockwise(clippingPolygon);
|
||||
var clippingPolygons = this.clippingPolygons = this.decomposer.decompose(clippingPolygon);
|
||||
for (var i = 0, n_1 = clippingPolygons.length; i < n_1; i++) {
|
||||
var polygon = clippingPolygons[i];
|
||||
SkeletonClipping.makeClockwise(polygon);
|
||||
polygon.push(polygon[0]);
|
||||
polygon.push(polygon[1]);
|
||||
}
|
||||
};
|
||||
SkeletonClipping.prototype.clipEndWithSlot = function (slot) {
|
||||
if (this.clipAttachment != null && this.clipAttachment.endSlot == slot.data)
|
||||
this.clipEnd();
|
||||
};
|
||||
SkeletonClipping.prototype.clipEnd = function () {
|
||||
if (this.clipAttachment == null)
|
||||
return;
|
||||
this.clipAttachment = null;
|
||||
this.clippingPolygons = null;
|
||||
this.clippedVertices.length = 0;
|
||||
this.clippedTriangles.length = 0;
|
||||
this.clippingPolygon.length = 0;
|
||||
};
|
||||
SkeletonClipping.prototype.isClipping = function () {
|
||||
return this.clipAttachment != null;
|
||||
};
|
||||
SkeletonClipping.prototype.clipTriangles = function (vertices, verticesLength, triangles, trianglesLength, uvs, light, dark, twoColor) {
|
||||
var clipOutput = this.clipOutput, clippedVertices = this.clippedVertices;
|
||||
var clippedTriangles = this.clippedTriangles;
|
||||
var polygons = this.clippingPolygons;
|
||||
var polygonsCount = this.clippingPolygons.length;
|
||||
var vertexSize = twoColor ? 12 : 8;
|
||||
var index = 0;
|
||||
clippedVertices.length = 0;
|
||||
clippedTriangles.length = 0;
|
||||
outer: for (var i = 0; i < trianglesLength; i += 3) {
|
||||
var vertexOffset = triangles[i] << 1;
|
||||
var x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1];
|
||||
var u1 = uvs[vertexOffset], v1 = uvs[vertexOffset + 1];
|
||||
vertexOffset = triangles[i + 1] << 1;
|
||||
var x2 = vertices[vertexOffset], y2 = vertices[vertexOffset + 1];
|
||||
var u2 = uvs[vertexOffset], v2 = uvs[vertexOffset + 1];
|
||||
vertexOffset = triangles[i + 2] << 1;
|
||||
var x3 = vertices[vertexOffset], y3 = vertices[vertexOffset + 1];
|
||||
var u3 = uvs[vertexOffset], v3 = uvs[vertexOffset + 1];
|
||||
for (var p = 0; p < polygonsCount; p++) {
|
||||
var s = clippedVertices.length;
|
||||
if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) {
|
||||
var clipOutputLength = clipOutput.length;
|
||||
if (clipOutputLength == 0)
|
||||
continue;
|
||||
var d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1;
|
||||
var d = 1 / (d0 * d2 + d1 * (y1 - y3));
|
||||
var clipOutputCount = clipOutputLength >> 1;
|
||||
var clipOutputItems = this.clipOutput;
|
||||
var clippedVerticesItems = spine.Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize);
|
||||
for (var ii = 0; ii < clipOutputLength; ii += 2) {
|
||||
var x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
|
||||
clippedVerticesItems[s] = x;
|
||||
clippedVerticesItems[s + 1] = y;
|
||||
clippedVerticesItems[s + 2] = light.r;
|
||||
clippedVerticesItems[s + 3] = light.g;
|
||||
clippedVerticesItems[s + 4] = light.b;
|
||||
clippedVerticesItems[s + 5] = light.a;
|
||||
var c0 = x - x3, c1 = y - y3;
|
||||
var a = (d0 * c0 + d1 * c1) * d;
|
||||
var b = (d4 * c0 + d2 * c1) * d;
|
||||
var c = 1 - a - b;
|
||||
clippedVerticesItems[s + 6] = u1 * a + u2 * b + u3 * c;
|
||||
clippedVerticesItems[s + 7] = v1 * a + v2 * b + v3 * c;
|
||||
if (twoColor) {
|
||||
clippedVerticesItems[s + 8] = dark.r;
|
||||
clippedVerticesItems[s + 8] = dark.g;
|
||||
clippedVerticesItems[s + 10] = dark.b;
|
||||
clippedVerticesItems[s + 11] = dark.a;
|
||||
}
|
||||
s += vertexSize;
|
||||
}
|
||||
s = clippedTriangles.length;
|
||||
var clippedTrianglesItems = spine.Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
|
||||
clipOutputCount--;
|
||||
for (var ii = 1; ii < clipOutputCount; ii++) {
|
||||
clippedTrianglesItems[s] = index;
|
||||
clippedTrianglesItems[s + 1] = (index + ii);
|
||||
clippedTrianglesItems[s + 2] = (index + ii + 1);
|
||||
s += 3;
|
||||
}
|
||||
index += clipOutputCount + 1;
|
||||
}
|
||||
else {
|
||||
var clippedVerticesItems = spine.Utils.setArraySize(clippedVertices, s + 3 * vertexSize);
|
||||
clippedVerticesItems[s] = x1;
|
||||
clippedVerticesItems[s + 1] = y1;
|
||||
clippedVerticesItems[s + 2] = light.r;
|
||||
clippedVerticesItems[s + 3] = light.g;
|
||||
clippedVerticesItems[s + 4] = light.b;
|
||||
clippedVerticesItems[s + 5] = light.a;
|
||||
if (!twoColor) {
|
||||
clippedVerticesItems[s + 6] = u1;
|
||||
clippedVerticesItems[s + 7] = v1;
|
||||
clippedVerticesItems[s + 8] = x2;
|
||||
clippedVerticesItems[s + 9] = y2;
|
||||
clippedVerticesItems[s + 10] = light.r;
|
||||
clippedVerticesItems[s + 11] = light.g;
|
||||
clippedVerticesItems[s + 12] = light.b;
|
||||
clippedVerticesItems[s + 13] = light.a;
|
||||
clippedVerticesItems[s + 14] = u2;
|
||||
clippedVerticesItems[s + 15] = v2;
|
||||
clippedVerticesItems[s + 16] = x3;
|
||||
clippedVerticesItems[s + 17] = y3;
|
||||
clippedVerticesItems[s + 18] = light.r;
|
||||
clippedVerticesItems[s + 19] = light.g;
|
||||
clippedVerticesItems[s + 20] = light.b;
|
||||
clippedVerticesItems[s + 21] = light.a;
|
||||
clippedVerticesItems[s + 22] = u3;
|
||||
clippedVerticesItems[s + 23] = v3;
|
||||
}
|
||||
else {
|
||||
clippedVerticesItems[s + 6] = u1;
|
||||
clippedVerticesItems[s + 7] = v1;
|
||||
clippedVerticesItems[s + 8] = dark.r;
|
||||
clippedVerticesItems[s + 9] = dark.g;
|
||||
clippedVerticesItems[s + 10] = dark.b;
|
||||
clippedVerticesItems[s + 11] = dark.a;
|
||||
clippedVerticesItems[s + 12] = x2;
|
||||
clippedVerticesItems[s + 13] = y2;
|
||||
clippedVerticesItems[s + 14] = light.r;
|
||||
clippedVerticesItems[s + 15] = light.g;
|
||||
clippedVerticesItems[s + 16] = light.b;
|
||||
clippedVerticesItems[s + 17] = light.a;
|
||||
clippedVerticesItems[s + 18] = u2;
|
||||
clippedVerticesItems[s + 19] = v2;
|
||||
clippedVerticesItems[s + 20] = dark.r;
|
||||
clippedVerticesItems[s + 21] = dark.g;
|
||||
clippedVerticesItems[s + 22] = dark.b;
|
||||
clippedVerticesItems[s + 23] = dark.a;
|
||||
clippedVerticesItems[s + 24] = x3;
|
||||
clippedVerticesItems[s + 25] = y3;
|
||||
clippedVerticesItems[s + 26] = light.r;
|
||||
clippedVerticesItems[s + 27] = light.g;
|
||||
clippedVerticesItems[s + 28] = light.b;
|
||||
clippedVerticesItems[s + 29] = light.a;
|
||||
clippedVerticesItems[s + 30] = u3;
|
||||
clippedVerticesItems[s + 31] = v3;
|
||||
clippedVerticesItems[s + 32] = dark.r;
|
||||
clippedVerticesItems[s + 33] = dark.g;
|
||||
clippedVerticesItems[s + 34] = dark.b;
|
||||
clippedVerticesItems[s + 35] = dark.a;
|
||||
}
|
||||
s = clippedTriangles.length;
|
||||
var clippedTrianglesItems = spine.Utils.setArraySize(clippedTriangles, s + 3);
|
||||
clippedTrianglesItems[s] = index;
|
||||
clippedTrianglesItems[s + 1] = (index + 1);
|
||||
clippedTrianglesItems[s + 2] = (index + 2);
|
||||
index += 3;
|
||||
continue outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
SkeletonClipping.prototype.clip = function (x1, y1, x2, y2, x3, y3, clippingArea, output) {
|
||||
var originalOutput = output;
|
||||
var clipped = false;
|
||||
var input = null;
|
||||
if (clippingArea.length % 4 >= 2) {
|
||||
input = output;
|
||||
output = this.scratch;
|
||||
}
|
||||
else
|
||||
input = this.scratch;
|
||||
input.length = 0;
|
||||
input.push(x1);
|
||||
input.push(y1);
|
||||
input.push(x2);
|
||||
input.push(y2);
|
||||
input.push(x3);
|
||||
input.push(y3);
|
||||
input.push(x1);
|
||||
input.push(y1);
|
||||
output.length = 0;
|
||||
var clippingVertices = clippingArea;
|
||||
var clippingVerticesLast = clippingArea.length - 4;
|
||||
for (var i = 0;; i += 2) {
|
||||
var edgeX = clippingVertices[i], edgeY = clippingVertices[i + 1];
|
||||
var edgeX2 = clippingVertices[i + 2], edgeY2 = clippingVertices[i + 3];
|
||||
var deltaX = edgeX - edgeX2, deltaY = edgeY - edgeY2;
|
||||
var inputVertices = input;
|
||||
var inputVerticesLength = input.length - 2, outputStart = output.length;
|
||||
for (var ii = 0; ii < inputVerticesLength; ii += 2) {
|
||||
var inputX = inputVertices[ii], inputY = inputVertices[ii + 1];
|
||||
var inputX2 = inputVertices[ii + 2], inputY2 = inputVertices[ii + 3];
|
||||
var side2 = deltaX * (inputY2 - edgeY2) - deltaY * (inputX2 - edgeX2) > 0;
|
||||
if (deltaX * (inputY - edgeY2) - deltaY * (inputX - edgeX2) > 0) {
|
||||
if (side2) {
|
||||
output.push(inputX2);
|
||||
output.push(inputY2);
|
||||
continue;
|
||||
}
|
||||
var c0 = inputY2 - inputY, c2 = inputX2 - inputX;
|
||||
var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / (c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY));
|
||||
output.push(edgeX + (edgeX2 - edgeX) * ua);
|
||||
output.push(edgeY + (edgeY2 - edgeY) * ua);
|
||||
}
|
||||
else if (side2) {
|
||||
var c0 = inputY2 - inputY, c2 = inputX2 - inputX;
|
||||
var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / (c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY));
|
||||
output.push(edgeX + (edgeX2 - edgeX) * ua);
|
||||
output.push(edgeY + (edgeY2 - edgeY) * ua);
|
||||
output.push(inputX2);
|
||||
output.push(inputY2);
|
||||
}
|
||||
clipped = true;
|
||||
}
|
||||
if (outputStart == output.length) {
|
||||
originalOutput.length = 0;
|
||||
return true;
|
||||
}
|
||||
output.push(output[0]);
|
||||
output.push(output[1]);
|
||||
if (i == clippingVerticesLast)
|
||||
break;
|
||||
var temp = output;
|
||||
output = input;
|
||||
output.length = 0;
|
||||
input = temp;
|
||||
}
|
||||
if (originalOutput != output) {
|
||||
originalOutput.length = 0;
|
||||
for (var i = 0, n = output.length - 2; i < n; i++)
|
||||
originalOutput[i] = output[i];
|
||||
}
|
||||
else
|
||||
originalOutput.length = originalOutput.length - 2;
|
||||
return clipped;
|
||||
};
|
||||
SkeletonClipping.makeClockwise = function (polygon) {
|
||||
var vertices = polygon;
|
||||
var verticeslength = polygon.length;
|
||||
var area = vertices[verticeslength - 2] * vertices[1] - vertices[0] * vertices[verticeslength - 1], p1x = 0, p1y = 0, p2x = 0, p2y = 0;
|
||||
for (var i = 0, n = verticeslength - 3; i < n; i += 2) {
|
||||
p1x = vertices[i];
|
||||
p1y = vertices[i + 1];
|
||||
p2x = vertices[i + 2];
|
||||
p2y = vertices[i + 3];
|
||||
area += p1x * p2y - p2x * p1y;
|
||||
}
|
||||
if (area < 0)
|
||||
return;
|
||||
for (var i = 0, lastX = verticeslength - 2, n = verticeslength >> 1; i < n; i += 2) {
|
||||
var x = vertices[i], y = vertices[i + 1];
|
||||
var other = lastX - i;
|
||||
vertices[i] = vertices[other];
|
||||
vertices[i + 1] = vertices[other + 1];
|
||||
vertices[other] = x;
|
||||
vertices[other + 1] = y;
|
||||
}
|
||||
};
|
||||
return SkeletonClipping;
|
||||
}());
|
||||
spine.SkeletonClipping = SkeletonClipping;
|
||||
})(spine || (spine = {}));
|
||||
var spine;
|
||||
(function (spine) {
|
||||
var SkeletonData = (function () {
|
||||
function SkeletonData() {
|
||||
@ -4236,7 +4731,7 @@ var spine;
|
||||
throw new Error("Slot not found: " + slotName);
|
||||
var slotMap = skinMap[slotName];
|
||||
for (var entryName in slotMap) {
|
||||
var attachment = this.readAttachment(slotMap[entryName], skin, slotIndex, entryName);
|
||||
var attachment = this.readAttachment(slotMap[entryName], skin, slotIndex, entryName, skeletonData);
|
||||
if (attachment != null)
|
||||
skin.addAttachment(slotIndex, entryName, attachment);
|
||||
}
|
||||
@ -4276,7 +4771,7 @@ var spine;
|
||||
}
|
||||
return skeletonData;
|
||||
};
|
||||
SkeletonJson.prototype.readAttachment = function (map, skin, slotIndex, name) {
|
||||
SkeletonJson.prototype.readAttachment = function (map, skin, slotIndex, name, skeletonData) {
|
||||
var scale = this.scale;
|
||||
name = this.getValue(map, "name", name);
|
||||
var type = this.getValue(map, "type", "region");
|
||||
@ -4363,6 +4858,24 @@ var spine;
|
||||
point.color.setFromString(color);
|
||||
return point;
|
||||
}
|
||||
case "clipping": {
|
||||
var clip = this.attachmentLoader.newClippingAttachment(skin, name);
|
||||
if (clip == null)
|
||||
return null;
|
||||
var end = this.getValue(map, "end", null);
|
||||
if (end != null) {
|
||||
var slot = skeletonData.findSlot(end);
|
||||
if (slot == null)
|
||||
throw new Error("Clipping end slot not found: " + end);
|
||||
clip.endSlot = slot;
|
||||
}
|
||||
var vertexCount = map.vertexCount;
|
||||
this.readVertices(map, clip, vertexCount << 1);
|
||||
var color = this.getValue(map, "color", null);
|
||||
if (color != null)
|
||||
clip.color.setFromString(color);
|
||||
return clip;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
@ -5543,6 +6056,17 @@ var spine;
|
||||
return array;
|
||||
}
|
||||
};
|
||||
Utils.newShortArray = function (size) {
|
||||
if (Utils.SUPPORTS_TYPED_ARRAYS) {
|
||||
return new Int16Array(size);
|
||||
}
|
||||
else {
|
||||
var array = new Array(size);
|
||||
for (var i = 0; i < array.length; i++)
|
||||
array[i] = 0;
|
||||
return array;
|
||||
}
|
||||
};
|
||||
Utils.toFloatArray = function (array) {
|
||||
return Utils.SUPPORTS_TYPED_ARRAYS ? new Float32Array(array) : array;
|
||||
};
|
||||
@ -7563,6 +8087,7 @@ var spine;
|
||||
this.attachmentLineColor = new spine.Color(0, 0, 1, 0.5);
|
||||
this.triangleLineColor = new spine.Color(1, 0.64, 0, 0.5);
|
||||
this.pathColor = new spine.Color().setFromString("FF7F00");
|
||||
this.clipColor = new spine.Color(0.8, 0, 0, 2);
|
||||
this.aabbColor = new spine.Color(0, 1, 0, 0.5);
|
||||
this.drawBones = true;
|
||||
this.drawRegionAttachments = true;
|
||||
@ -7571,6 +8096,7 @@ var spine;
|
||||
this.drawMeshTriangles = true;
|
||||
this.drawPaths = true;
|
||||
this.drawSkeletonXY = false;
|
||||
this.drawClipping = true;
|
||||
this.premultipliedAlpha = false;
|
||||
this.scale = 1;
|
||||
this.boneWidth = 2;
|
||||
@ -7711,6 +8237,27 @@ var spine;
|
||||
shapes.circle(true, skeletonX + bone.worldX, skeletonY + bone.worldY, 3 * this.scale, SkeletonDebugRenderer.GREEN, 8);
|
||||
}
|
||||
}
|
||||
if (this.drawClipping) {
|
||||
var slots = skeleton.slots;
|
||||
shapes.setColor(this.clipColor);
|
||||
for (var i = 0, n = slots.length; i < n; i++) {
|
||||
var slot = slots[i];
|
||||
var attachment = slot.getAttachment();
|
||||
if (!(attachment instanceof spine.ClippingAttachment))
|
||||
continue;
|
||||
var clip = attachment;
|
||||
var nn = clip.worldVerticesLength;
|
||||
var world = this.temp = spine.Utils.setArraySize(this.temp, nn, 0);
|
||||
clip.computeWorldVertices(slot, 0, nn, world, 0, 2);
|
||||
for (var i_5 = 0, n_2 = world.length; i_5 < n_2; i_5 += 2) {
|
||||
var x = world[i_5];
|
||||
var y = world[i_5 + 1];
|
||||
var x2 = world[(i_5 + 2) % world.length];
|
||||
var y2 = world[(i_5 + 3) % world.length];
|
||||
shapes.line(x, y, x2, y2);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
SkeletonDebugRenderer.prototype.dispose = function () {
|
||||
};
|
||||
@ -7726,8 +8273,9 @@ var spine;
|
||||
var webgl;
|
||||
(function (webgl) {
|
||||
var Renderable = (function () {
|
||||
function Renderable(vertices, numFloats) {
|
||||
function Renderable(vertices, numVertices, numFloats) {
|
||||
this.vertices = vertices;
|
||||
this.numVertices = numVertices;
|
||||
this.numFloats = numFloats;
|
||||
}
|
||||
return Renderable;
|
||||
@ -7741,7 +8289,8 @@ var spine;
|
||||
this.tempColor2 = new spine.Color();
|
||||
this.vertexSize = 2 + 2 + 4;
|
||||
this.twoColorTint = false;
|
||||
this.renderable = new Renderable(null, 0);
|
||||
this.renderable = new Renderable(null, 0, 0);
|
||||
this.clipper = new spine.SkeletonClipping();
|
||||
this.gl = gl;
|
||||
this.twoColorTint = twoColorTint;
|
||||
if (twoColorTint)
|
||||
@ -7749,165 +8298,115 @@ var spine;
|
||||
this.vertices = spine.Utils.newFloatArray(this.vertexSize * 1024);
|
||||
}
|
||||
SkeletonRenderer.prototype.draw = function (batcher, skeleton) {
|
||||
var clipper = this.clipper;
|
||||
var premultipliedAlpha = this.premultipliedAlpha;
|
||||
var twoColorTint = this.twoColorTint;
|
||||
var blendMode = null;
|
||||
var vertices = null;
|
||||
var renderable = this.renderable;
|
||||
var uvs = null;
|
||||
var triangles = null;
|
||||
var drawOrder = skeleton.drawOrder;
|
||||
var attachmentColor = null;
|
||||
var skeletonColor = skeleton.color;
|
||||
var vertexSize = twoColorTint ? 12 : 8;
|
||||
for (var i = 0, n = drawOrder.length; i < n; i++) {
|
||||
var clippedVertexSize = clipper.isClipping() ? 2 : vertexSize;
|
||||
var slot = drawOrder[i];
|
||||
var attachment = slot.getAttachment();
|
||||
var texture = null;
|
||||
if (attachment instanceof spine.RegionAttachment) {
|
||||
var region = attachment;
|
||||
vertices = this.computeRegionVertices(slot, region, premultipliedAlpha, this.twoColorTint);
|
||||
renderable.vertices = this.vertices;
|
||||
renderable.numVertices = 4;
|
||||
renderable.numFloats = clippedVertexSize << 2;
|
||||
region.computeWorldVertices(slot.bone, renderable.vertices, 0, clippedVertexSize);
|
||||
triangles = SkeletonRenderer.QUAD_TRIANGLES;
|
||||
uvs = region.uvs;
|
||||
texture = region.region.renderObject.texture;
|
||||
attachmentColor = region.color;
|
||||
}
|
||||
else if (attachment instanceof spine.MeshAttachment) {
|
||||
var mesh = attachment;
|
||||
vertices = this.computeMeshVertices(slot, mesh, premultipliedAlpha, this.twoColorTint);
|
||||
renderable.vertices = this.vertices;
|
||||
renderable.numVertices = (mesh.worldVerticesLength >> 1);
|
||||
renderable.numFloats = renderable.numVertices * clippedVertexSize;
|
||||
if (renderable.numFloats > renderable.vertices.length) {
|
||||
renderable.vertices = this.vertices = spine.Utils.newFloatArray(renderable.numFloats);
|
||||
}
|
||||
mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, renderable.vertices, 0, clippedVertexSize);
|
||||
triangles = mesh.triangles;
|
||||
texture = mesh.region.renderObject.texture;
|
||||
uvs = mesh.uvs;
|
||||
attachmentColor = mesh.color;
|
||||
}
|
||||
else if (attachment instanceof spine.ClippingAttachment) {
|
||||
var clip = (attachment);
|
||||
clipper.clipStart(slot, clip);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
continue;
|
||||
if (texture != null) {
|
||||
var slotColor = slot.color;
|
||||
var finalColor = this.tempColor;
|
||||
finalColor.r = skeletonColor.r * slotColor.r * attachmentColor.r;
|
||||
finalColor.g = skeletonColor.g * slotColor.g * attachmentColor.g;
|
||||
finalColor.b = skeletonColor.b * slotColor.b * attachmentColor.b;
|
||||
finalColor.a = skeletonColor.a * slotColor.a * attachmentColor.a;
|
||||
if (premultipliedAlpha) {
|
||||
finalColor.r *= finalColor.a;
|
||||
finalColor.g *= finalColor.a;
|
||||
finalColor.b *= finalColor.a;
|
||||
}
|
||||
var darkColor = this.tempColor2;
|
||||
if (slot.darkColor == null)
|
||||
darkColor.set(0, 0, 0, 1);
|
||||
else
|
||||
darkColor.setFromColor(slot.darkColor);
|
||||
var slotBlendMode = slot.data.blendMode;
|
||||
if (slotBlendMode != blendMode) {
|
||||
blendMode = slotBlendMode;
|
||||
batcher.setBlendMode(webgl.getSourceGLBlendMode(this.gl, blendMode, premultipliedAlpha), webgl.getDestGLBlendMode(this.gl, blendMode));
|
||||
}
|
||||
var view = vertices.vertices.subarray(0, vertices.numFloats);
|
||||
batcher.draw(texture, view, triangles);
|
||||
if (clipper.isClipping()) {
|
||||
clipper.clipTriangles(renderable.vertices, renderable.numFloats, triangles, triangles.length, uvs, finalColor, darkColor, twoColorTint);
|
||||
var clippedVertices = new Float32Array(clipper.clippedVertices);
|
||||
var clippedTriangles = clipper.clippedTriangles;
|
||||
batcher.draw(texture, clippedVertices, clippedTriangles);
|
||||
}
|
||||
else {
|
||||
var verts = renderable.vertices;
|
||||
if (!twoColorTint) {
|
||||
for (var v = 2, u = 0, n_3 = renderable.numFloats; v < n_3; v += vertexSize, u += 2) {
|
||||
verts[v] = finalColor.r;
|
||||
verts[v + 1] = finalColor.g;
|
||||
verts[v + 2] = finalColor.b;
|
||||
verts[v + 3] = finalColor.a;
|
||||
verts[v + 4] = uvs[u];
|
||||
verts[v + 5] = uvs[u + 1];
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (var v = 2, u = 0, n_4 = renderable.numFloats; v < n_4; v += vertexSize, u += 2) {
|
||||
verts[v] = finalColor.r;
|
||||
verts[v + 1] = finalColor.g;
|
||||
verts[v + 2] = finalColor.b;
|
||||
verts[v + 3] = finalColor.a;
|
||||
verts[v + 4] = uvs[u];
|
||||
verts[v + 5] = uvs[u + 1];
|
||||
verts[v + 6] = darkColor.r;
|
||||
verts[v + 7] = darkColor.g;
|
||||
verts[v + 8] = darkColor.b;
|
||||
verts[v + 9] = darkColor.a;
|
||||
}
|
||||
}
|
||||
var view = renderable.vertices.subarray(0, renderable.numFloats);
|
||||
batcher.draw(texture, view, triangles);
|
||||
}
|
||||
}
|
||||
clipper.clipEndWithSlot(slot);
|
||||
}
|
||||
};
|
||||
SkeletonRenderer.prototype.computeRegionVertices = function (slot, region, pma, twoColorTint) {
|
||||
if (twoColorTint === void 0) { twoColorTint = false; }
|
||||
var skeleton = slot.bone.skeleton;
|
||||
var skeletonColor = skeleton.color;
|
||||
var slotColor = slot.color;
|
||||
var regionColor = region.color;
|
||||
var alpha = skeletonColor.a * slotColor.a * regionColor.a;
|
||||
var multiplier = pma ? alpha : 1;
|
||||
var color = this.tempColor;
|
||||
color.set(skeletonColor.r * slotColor.r * regionColor.r * multiplier, skeletonColor.g * slotColor.g * regionColor.g * multiplier, skeletonColor.b * slotColor.b * regionColor.b * multiplier, alpha);
|
||||
var dark = this.tempColor2;
|
||||
if (slot.darkColor == null)
|
||||
dark.set(0, 0, 0, 1);
|
||||
else
|
||||
dark.setFromColor(slot.darkColor);
|
||||
region.computeWorldVertices(slot.bone, this.vertices, 0, this.vertexSize);
|
||||
var vertices = this.vertices;
|
||||
var uvs = region.uvs;
|
||||
var i = 2;
|
||||
vertices[i++] = color.r;
|
||||
vertices[i++] = color.g;
|
||||
vertices[i++] = color.b;
|
||||
vertices[i++] = color.a;
|
||||
vertices[i++] = uvs[0];
|
||||
vertices[i++] = uvs[1];
|
||||
if (twoColorTint) {
|
||||
vertices[i++] = dark.r;
|
||||
vertices[i++] = dark.g;
|
||||
vertices[i++] = dark.b;
|
||||
vertices[i++] = 1;
|
||||
}
|
||||
i += 2;
|
||||
vertices[i++] = color.r;
|
||||
vertices[i++] = color.g;
|
||||
vertices[i++] = color.b;
|
||||
vertices[i++] = color.a;
|
||||
vertices[i++] = uvs[2];
|
||||
vertices[i++] = uvs[3];
|
||||
if (twoColorTint) {
|
||||
vertices[i++] = dark.r;
|
||||
vertices[i++] = dark.g;
|
||||
vertices[i++] = dark.b;
|
||||
vertices[i++] = 1;
|
||||
}
|
||||
i += 2;
|
||||
vertices[i++] = color.r;
|
||||
vertices[i++] = color.g;
|
||||
vertices[i++] = color.b;
|
||||
vertices[i++] = color.a;
|
||||
vertices[i++] = uvs[4];
|
||||
vertices[i++] = uvs[5];
|
||||
if (twoColorTint) {
|
||||
vertices[i++] = dark.r;
|
||||
vertices[i++] = dark.g;
|
||||
vertices[i++] = dark.b;
|
||||
vertices[i++] = 1;
|
||||
}
|
||||
i += 2;
|
||||
vertices[i++] = color.r;
|
||||
vertices[i++] = color.g;
|
||||
vertices[i++] = color.b;
|
||||
vertices[i++] = color.a;
|
||||
vertices[i++] = uvs[6];
|
||||
vertices[i++] = uvs[7];
|
||||
if (twoColorTint) {
|
||||
vertices[i++] = dark.r;
|
||||
vertices[i++] = dark.g;
|
||||
vertices[i++] = dark.b;
|
||||
vertices[i++] = 1;
|
||||
}
|
||||
this.renderable.vertices = vertices;
|
||||
this.renderable.numFloats = 4 * (twoColorTint ? 12 : 8);
|
||||
return this.renderable;
|
||||
};
|
||||
SkeletonRenderer.prototype.computeMeshVertices = function (slot, mesh, pma, twoColorTint) {
|
||||
if (twoColorTint === void 0) { twoColorTint = false; }
|
||||
var skeleton = slot.bone.skeleton;
|
||||
var skeletonColor = skeleton.color;
|
||||
var slotColor = slot.color;
|
||||
var regionColor = mesh.color;
|
||||
var alpha = skeletonColor.a * slotColor.a * regionColor.a;
|
||||
var multiplier = pma ? alpha : 1;
|
||||
var color = this.tempColor;
|
||||
color.set(skeletonColor.r * slotColor.r * regionColor.r * multiplier, skeletonColor.g * slotColor.g * regionColor.g * multiplier, skeletonColor.b * slotColor.b * regionColor.b * multiplier, alpha);
|
||||
var dark = this.tempColor2;
|
||||
if (slot.darkColor == null)
|
||||
dark.set(0, 0, 0, 1);
|
||||
else
|
||||
dark.setFromColor(slot.darkColor);
|
||||
var numVertices = mesh.worldVerticesLength / 2;
|
||||
if (this.vertices.length < mesh.worldVerticesLength) {
|
||||
this.vertices = spine.Utils.newFloatArray(mesh.worldVerticesLength);
|
||||
}
|
||||
var vertices = this.vertices;
|
||||
mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, vertices, 0, this.vertexSize);
|
||||
var uvs = mesh.uvs;
|
||||
if (!twoColorTint) {
|
||||
for (var i = 0, n = numVertices, u = 0, v = 2; i < n; i++) {
|
||||
vertices[v++] = color.r;
|
||||
vertices[v++] = color.g;
|
||||
vertices[v++] = color.b;
|
||||
vertices[v++] = color.a;
|
||||
vertices[v++] = uvs[u++];
|
||||
vertices[v++] = uvs[u++];
|
||||
v += 2;
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (var i = 0, n = numVertices, u = 0, v = 2; i < n; i++) {
|
||||
vertices[v++] = color.r;
|
||||
vertices[v++] = color.g;
|
||||
vertices[v++] = color.b;
|
||||
vertices[v++] = color.a;
|
||||
vertices[v++] = uvs[u++];
|
||||
vertices[v++] = uvs[u++];
|
||||
vertices[v++] = dark.r;
|
||||
vertices[v++] = dark.g;
|
||||
vertices[v++] = dark.b;
|
||||
vertices[v++] = 1;
|
||||
v += 2;
|
||||
}
|
||||
}
|
||||
this.renderable.vertices = vertices;
|
||||
this.renderable.numFloats = numVertices * (twoColorTint ? 12 : 8);
|
||||
return this.renderable;
|
||||
clipper.clipEnd();
|
||||
};
|
||||
SkeletonRenderer.QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0];
|
||||
return SkeletonRenderer;
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -33,8 +33,8 @@ module spine {
|
||||
private decomposer = new ConvexDecomposer();
|
||||
private clippingPolygon = new Array<number>();
|
||||
private clipOutput = new Array<number>();
|
||||
private clippedVertices = new Array<number>();
|
||||
private clippedTriangles = new Array<number>();
|
||||
clippedVertices = new Array<number>();
|
||||
clippedTriangles = new Array<number>();
|
||||
private scratch = new Array<number>();
|
||||
|
||||
private clipAttachment: ClippingAttachment;
|
||||
@ -82,7 +82,7 @@ module spine {
|
||||
let clippedTriangles = this.clippedTriangles;
|
||||
let polygons = this.clippingPolygons;
|
||||
let polygonsCount = this.clippingPolygons.length;
|
||||
let vertexSize = twoColor ? 6 : 5;
|
||||
let vertexSize = twoColor ? 12 : 8;
|
||||
|
||||
let index = 0;
|
||||
clippedVertices.length = 0;
|
||||
@ -120,21 +120,19 @@ module spine {
|
||||
clippedVerticesItems[s + 3] = light.g;
|
||||
clippedVerticesItems[s + 4] = light.b;
|
||||
clippedVerticesItems[s + 5] = light.a;
|
||||
if (twoColor) {
|
||||
clippedVerticesItems[s + 6] = dark.r;
|
||||
clippedVerticesItems[s + 7] = dark.g;
|
||||
clippedVerticesItems[s + 8] = dark.b;
|
||||
clippedVerticesItems[s + 9] = dark.a;
|
||||
s += 10;
|
||||
} else
|
||||
s += 6;
|
||||
let c0 = x - x3, c1 = y - y3;
|
||||
let a = (d0 * c0 + d1 * c1) * d;
|
||||
let b = (d4 * c0 + d2 * c1) * d;
|
||||
let c = 1 - a - b;
|
||||
clippedVerticesItems[s] = u1 * a + u2 * b + u3 * c;
|
||||
clippedVerticesItems[s + 1] = v1 * a + v2 * b + v3 * c;
|
||||
s += 2;
|
||||
clippedVerticesItems[s + 6] = u1 * a + u2 * b + u3 * c;
|
||||
clippedVerticesItems[s + 7] = v1 * a + v2 * b + v3 * c;
|
||||
if (twoColor) {
|
||||
clippedVerticesItems[s + 8] = dark.r;
|
||||
clippedVerticesItems[s + 8] = dark.g;
|
||||
clippedVerticesItems[s + 10] = dark.b;
|
||||
clippedVerticesItems[s + 11] = dark.a;
|
||||
}
|
||||
s += vertexSize;
|
||||
}
|
||||
|
||||
s = clippedTriangles.length;
|
||||
@ -178,12 +176,12 @@ module spine {
|
||||
clippedVerticesItems[s + 22] = u3;
|
||||
clippedVerticesItems[s + 23] = v3;
|
||||
} else {
|
||||
clippedVerticesItems[s + 6] = dark.r;
|
||||
clippedVerticesItems[s + 7] = dark.g;
|
||||
clippedVerticesItems[s + 8] = dark.b;
|
||||
clippedVerticesItems[s + 9] = dark.a;
|
||||
clippedVerticesItems[s + 10] = u1;
|
||||
clippedVerticesItems[s + 11] = v1;
|
||||
clippedVerticesItems[s + 6] = u1;
|
||||
clippedVerticesItems[s + 7] = v1;
|
||||
clippedVerticesItems[s + 8] = dark.r;
|
||||
clippedVerticesItems[s + 9] = dark.g;
|
||||
clippedVerticesItems[s + 10] = dark.b;
|
||||
clippedVerticesItems[s + 11] = dark.a;
|
||||
|
||||
clippedVerticesItems[s + 12] = x2;
|
||||
clippedVerticesItems[s + 13] = y2;
|
||||
@ -191,12 +189,12 @@ module spine {
|
||||
clippedVerticesItems[s + 15] = light.g;
|
||||
clippedVerticesItems[s + 16] = light.b;
|
||||
clippedVerticesItems[s + 17] = light.a;
|
||||
clippedVerticesItems[s + 18] = dark.r;
|
||||
clippedVerticesItems[s + 19] = dark.g;
|
||||
clippedVerticesItems[s + 20] = dark.b;
|
||||
clippedVerticesItems[s + 21] = dark.a;
|
||||
clippedVerticesItems[s + 22] = u2;
|
||||
clippedVerticesItems[s + 23] = v2;
|
||||
clippedVerticesItems[s + 18] = u2;
|
||||
clippedVerticesItems[s + 19] = v2;
|
||||
clippedVerticesItems[s + 20] = dark.r;
|
||||
clippedVerticesItems[s + 21] = dark.g;
|
||||
clippedVerticesItems[s + 22] = dark.b;
|
||||
clippedVerticesItems[s + 23] = dark.a;
|
||||
|
||||
clippedVerticesItems[s + 24] = x3;
|
||||
clippedVerticesItems[s + 25] = y3;
|
||||
@ -204,12 +202,12 @@ module spine {
|
||||
clippedVerticesItems[s + 27] = light.g;
|
||||
clippedVerticesItems[s + 28] = light.b;
|
||||
clippedVerticesItems[s + 29] = light.a;
|
||||
clippedVerticesItems[s + 30] = dark.r;
|
||||
clippedVerticesItems[s + 31] = dark.g;
|
||||
clippedVerticesItems[s + 32] = dark.b;
|
||||
clippedVerticesItems[s + 33] = dark.a;
|
||||
clippedVerticesItems[s + 34] = u3;
|
||||
clippedVerticesItems[s + 35] = v3;
|
||||
clippedVerticesItems[s + 30] = u3;
|
||||
clippedVerticesItems[s + 31] = v3;
|
||||
clippedVerticesItems[s + 32] = dark.r;
|
||||
clippedVerticesItems[s + 33] = dark.g;
|
||||
clippedVerticesItems[s + 34] = dark.b;
|
||||
clippedVerticesItems[s + 35] = dark.a;
|
||||
}
|
||||
|
||||
s = clippedTriangles.length;
|
||||
|
||||
@ -1,279 +1,251 @@
|
||||
|
||||
raptor.png
|
||||
size: 1024,1024
|
||||
size: 2048,2048
|
||||
format: RGBA8888
|
||||
filter: Linear,Linear
|
||||
repeat: none
|
||||
back_arm
|
||||
rotate: true
|
||||
xy: 140, 191
|
||||
size: 46, 29
|
||||
orig: 46, 29
|
||||
rotate: false
|
||||
xy: 1888, 1638
|
||||
size: 91, 57
|
||||
orig: 91, 57
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
back_bracer
|
||||
rotate: true
|
||||
xy: 167, 317
|
||||
size: 39, 28
|
||||
orig: 39, 28
|
||||
rotate: false
|
||||
xy: 1888, 1581
|
||||
size: 77, 55
|
||||
orig: 77, 55
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
back_hand
|
||||
rotate: false
|
||||
xy: 167, 358
|
||||
size: 36, 34
|
||||
orig: 36, 34
|
||||
xy: 1954, 1764
|
||||
size: 72, 68
|
||||
orig: 72, 68
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
back_knee
|
||||
rotate: false
|
||||
xy: 299, 478
|
||||
size: 49, 67
|
||||
orig: 49, 67
|
||||
xy: 275, 438
|
||||
size: 97, 134
|
||||
orig: 97, 134
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
back_thigh
|
||||
rotate: true
|
||||
xy: 167, 437
|
||||
size: 39, 24
|
||||
orig: 39, 24
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
eyes_closed
|
||||
rotate: true
|
||||
xy: 2, 2
|
||||
size: 47, 45
|
||||
orig: 47, 45
|
||||
rotate: false
|
||||
xy: 1778, 1518
|
||||
size: 78, 47
|
||||
orig: 78, 47
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
eyes_open
|
||||
rotate: true
|
||||
xy: 49, 2
|
||||
size: 47, 45
|
||||
orig: 47, 45
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
eyes_surprised
|
||||
rotate: true
|
||||
xy: 96, 2
|
||||
size: 47, 45
|
||||
orig: 47, 45
|
||||
rotate: false
|
||||
xy: 275, 347
|
||||
size: 93, 89
|
||||
orig: 93, 89
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_arm
|
||||
rotate: false
|
||||
xy: 419, 544
|
||||
size: 48, 30
|
||||
orig: 48, 30
|
||||
xy: 830, 1089
|
||||
size: 96, 60
|
||||
orig: 96, 60
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_bracer
|
||||
rotate: false
|
||||
xy: 880, 695
|
||||
size: 41, 29
|
||||
orig: 41, 29
|
||||
xy: 1888, 1697
|
||||
size: 81, 58
|
||||
orig: 81, 58
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_hand
|
||||
rotate: true
|
||||
xy: 167, 394
|
||||
size: 41, 38
|
||||
orig: 41, 38
|
||||
rotate: false
|
||||
xy: 1870, 1757
|
||||
size: 82, 75
|
||||
orig: 82, 75
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_open_hand
|
||||
rotate: false
|
||||
xy: 880, 726
|
||||
size: 43, 44
|
||||
orig: 43, 44
|
||||
xy: 192, 15
|
||||
size: 86, 87
|
||||
orig: 86, 87
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
front_thigh
|
||||
rotate: false
|
||||
xy: 360, 545
|
||||
size: 57, 29
|
||||
orig: 57, 29
|
||||
xy: 714, 1091
|
||||
size: 114, 58
|
||||
orig: 114, 58
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
gun
|
||||
rotate: false
|
||||
xy: 785, 774
|
||||
size: 107, 103
|
||||
orig: 107, 103
|
||||
xy: 1563, 1543
|
||||
size: 213, 206
|
||||
orig: 213, 206
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
gun_nohand
|
||||
rotate: false
|
||||
xy: 614, 703
|
||||
size: 105, 102
|
||||
orig: 105, 102
|
||||
xy: 1223, 1403
|
||||
size: 210, 203
|
||||
orig: 210, 203
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
head
|
||||
rotate: false
|
||||
xy: 2, 137
|
||||
size: 136, 149
|
||||
orig: 136, 149
|
||||
xy: 2, 274
|
||||
size: 271, 298
|
||||
orig: 271, 298
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
lower_leg
|
||||
rotate: true
|
||||
xy: 780, 699
|
||||
size: 73, 98
|
||||
orig: 73, 98
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
mouth_grind
|
||||
rotate: false
|
||||
xy: 469, 544
|
||||
size: 47, 30
|
||||
orig: 47, 30
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
mouth_oooo
|
||||
rotate: true
|
||||
xy: 894, 772
|
||||
size: 105, 30
|
||||
orig: 105, 30
|
||||
xy: 551, 893
|
||||
size: 146, 195
|
||||
orig: 146, 195
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
mouth_smile
|
||||
rotate: true
|
||||
xy: 140, 239
|
||||
size: 47, 30
|
||||
orig: 47, 30
|
||||
rotate: false
|
||||
xy: 928, 1090
|
||||
size: 93, 59
|
||||
orig: 93, 59
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
neck
|
||||
rotate: true
|
||||
xy: 538, 577
|
||||
size: 18, 21
|
||||
orig: 18, 21
|
||||
rotate: false
|
||||
xy: 330, 908
|
||||
size: 36, 41
|
||||
orig: 36, 41
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_arm_back
|
||||
rotate: false
|
||||
xy: 940, 936
|
||||
size: 82, 86
|
||||
orig: 82, 86
|
||||
xy: 386, 916
|
||||
size: 163, 172
|
||||
orig: 163, 172
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_body
|
||||
rotate: false
|
||||
xy: 2, 737
|
||||
size: 610, 285
|
||||
orig: 610, 285
|
||||
xy: 2, 1467
|
||||
size: 1219, 570
|
||||
orig: 1219, 570
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_front_arm
|
||||
rotate: true
|
||||
xy: 195, 464
|
||||
size: 81, 102
|
||||
orig: 81, 102
|
||||
rotate: false
|
||||
xy: 1870, 1834
|
||||
size: 162, 203
|
||||
orig: 162, 203
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_front_leg
|
||||
rotate: false
|
||||
xy: 2, 478
|
||||
size: 191, 257
|
||||
orig: 191, 257
|
||||
xy: 2, 951
|
||||
size: 382, 514
|
||||
orig: 382, 514
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_hindleg_back
|
||||
rotate: false
|
||||
xy: 614, 807
|
||||
size: 169, 215
|
||||
orig: 169, 215
|
||||
xy: 1223, 1608
|
||||
size: 338, 429
|
||||
orig: 338, 429
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_horn
|
||||
rotate: false
|
||||
xy: 360, 655
|
||||
size: 182, 80
|
||||
orig: 182, 80
|
||||
xy: 714, 1306
|
||||
size: 363, 159
|
||||
orig: 363, 159
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_horn_back
|
||||
rotate: false
|
||||
xy: 360, 576
|
||||
size: 176, 77
|
||||
orig: 176, 77
|
||||
xy: 714, 1151
|
||||
size: 351, 153
|
||||
orig: 351, 153
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_jaw
|
||||
rotate: false
|
||||
xy: 785, 879
|
||||
size: 153, 143
|
||||
orig: 153, 143
|
||||
xy: 1563, 1751
|
||||
size: 305, 286
|
||||
orig: 305, 286
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_saddle_noshadow
|
||||
rotate: false
|
||||
xy: 2, 288
|
||||
size: 163, 188
|
||||
orig: 163, 188
|
||||
xy: 2, 574
|
||||
size: 326, 375
|
||||
orig: 326, 375
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_saddle_strap_front
|
||||
rotate: false
|
||||
xy: 721, 710
|
||||
size: 57, 95
|
||||
orig: 57, 95
|
||||
xy: 1435, 1417
|
||||
size: 114, 189
|
||||
orig: 114, 189
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_saddle_strap_rear
|
||||
rotate: true
|
||||
xy: 940, 880
|
||||
size: 54, 74
|
||||
orig: 54, 74
|
||||
rotate: false
|
||||
xy: 1079, 1317
|
||||
size: 108, 148
|
||||
orig: 108, 148
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_saddle_w_shadow
|
||||
rotate: false
|
||||
xy: 195, 547
|
||||
size: 163, 188
|
||||
orig: 163, 188
|
||||
xy: 386, 1090
|
||||
size: 326, 375
|
||||
orig: 326, 375
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
raptor_tongue
|
||||
rotate: true
|
||||
xy: 544, 649
|
||||
size: 86, 64
|
||||
orig: 86, 64
|
||||
rotate: false
|
||||
xy: 1551, 1413
|
||||
size: 171, 128
|
||||
orig: 171, 128
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
stirrup_back
|
||||
rotate: true
|
||||
xy: 140, 145
|
||||
size: 44, 35
|
||||
orig: 44, 35
|
||||
rotate: false
|
||||
xy: 275, 276
|
||||
size: 87, 69
|
||||
orig: 87, 69
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
stirrup_front
|
||||
rotate: false
|
||||
xy: 538, 597
|
||||
size: 45, 50
|
||||
orig: 45, 50
|
||||
xy: 2, 2
|
||||
size: 89, 100
|
||||
orig: 89, 100
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
stirrup_strap
|
||||
rotate: false
|
||||
xy: 350, 497
|
||||
size: 49, 46
|
||||
orig: 49, 46
|
||||
xy: 93, 11
|
||||
size: 97, 91
|
||||
orig: 97, 91
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
torso
|
||||
rotate: true
|
||||
xy: 610, 647
|
||||
size: 54, 91
|
||||
orig: 54, 91
|
||||
rotate: false
|
||||
xy: 1778, 1567
|
||||
size: 108, 182
|
||||
orig: 108, 182
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
visor
|
||||
rotate: false
|
||||
xy: 2, 51
|
||||
size: 131, 84
|
||||
orig: 131, 84
|
||||
xy: 2, 104
|
||||
size: 261, 168
|
||||
orig: 261, 168
|
||||
offset: 0, 0
|
||||
index: -1
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
{
|
||||
"skeleton": { "hash": "WOArBZLexLEX/Tow3AuM8ddszEE", "spine": "3.6.14-beta", "width": 1223.73, "height": 1055.62, "images": "./images/" },
|
||||
"skeleton": { "hash": "T+jP778edtEIrEMb7QvVNAgiHUo", "spine": "3.6.14-beta", "width": 1223.73, "height": 1056.91, "images": "./images/" },
|
||||
"bones": [
|
||||
{ "name": "root" },
|
||||
{ "name": "hip", "parent": "root", "rotation": 3.16, "x": -136.79, "y": 415.48, "color": "fbff00ff" },
|
||||
@ -199,6 +199,7 @@
|
||||
{ "name": "tongue3", "parent": "tongue2", "length": 43.65, "rotation": 12.86, "x": 44.27, "y": -0.21, "color": "fff200ff" }
|
||||
],
|
||||
"slots": [
|
||||
{ "name": "clip", "bone": "root", "attachment": "clip" },
|
||||
{ "name": "back_hand", "bone": "back_hand", "attachment": "back_hand" },
|
||||
{ "name": "back_arm", "bone": "back_arm", "attachment": "back_arm" },
|
||||
{ "name": "back_bracer", "bone": "back_bracer", "attachment": "back_bracer" },
|
||||
@ -310,6 +311,15 @@
|
||||
"back_thigh": {
|
||||
"back_thigh": { "x": 37.85, "y": -4.37, "rotation": 19.25, "width": 78, "height": 47 }
|
||||
},
|
||||
"clip": {
|
||||
"clip": {
|
||||
"type": "clipping",
|
||||
"end": "clip",
|
||||
"vertexCount": 25,
|
||||
"vertices": [ -31.42, 352.85, -182.02, 382.27, -214.91, 562.3, -8.92, 647.12, 183.22, 555.37, 254.19, 375.35, 261.12, 153.78, 3.2, 13.57, -270.3, -36.63, -408.78, 48.19, -349.93, 280.14, -228.76, 133.01, -59.12, 94.93, 107.06, 160.71, 202.26, 349.38, 122.64, 487.86, -41.81, 557.1, -142.21, 489.6, -57.39, 422.09, 49.94, 432.47, 133.02, 370.16, 94.94, 271.49, 43.01, 186.67, -138.74, 174.55, -230.49, 273.22 ],
|
||||
"color": "ce3a3aff"
|
||||
}
|
||||
},
|
||||
"eyes_open": {
|
||||
"eyes_open": { "x": 93.24, "y": -25.45, "rotation": -70.58, "width": 93, "height": 89 }
|
||||
},
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 495 KiB After Width: | Height: | Size: 1.7 MiB |
@ -13,8 +13,9 @@
|
||||
<script>
|
||||
|
||||
var FILE = "coin";
|
||||
var ANIMATION = "rotate";
|
||||
var NUM_SKELETONS = 1;
|
||||
var SCALE = 0.6;
|
||||
var SCALE = 0.5;
|
||||
|
||||
var canvas, gl, renderer, input, assetManager;
|
||||
var skeletons = [];
|
||||
@ -29,6 +30,12 @@ function init() {
|
||||
gl = canvas.getContext("webgl", { alpha: false }) || canvas.getContext("experimental-webgl", { alpha: false });
|
||||
|
||||
renderer = new spine.webgl.SceneRenderer(canvas, gl);
|
||||
renderer.skeletonDebugRenderer.drawBones = false;
|
||||
renderer.skeletonDebugRenderer.drawMeshTriangles = false;
|
||||
renderer.skeletonDebugRenderer.drawMeshHull = false;
|
||||
renderer.skeletonDebugRenderer.drawRegionAttachments = false;
|
||||
renderer.skeletonDebugRenderer.drawBoundingBoxes = false;
|
||||
|
||||
assetManager = new spine.webgl.AssetManager(gl, "assets/");
|
||||
var textureLoader = function(img) { return new spine.webgl.GLTexture(gl, img); };
|
||||
input = new spine.webgl.Input(canvas);
|
||||
@ -62,10 +69,9 @@ function load() {
|
||||
stateData.defaultMix = mixDuration;
|
||||
|
||||
state.multipleMixing = false;
|
||||
state.setAnimation(0, "rotate", true);
|
||||
state.apply(skeleton);
|
||||
skeleton.x = Math.random() * 200 - Math.random() * 200;
|
||||
skeleton.y = Math.random() * 200 - Math.random() * 200;
|
||||
state.setAnimation(0, "walk", true);
|
||||
skeleton.x = 0;
|
||||
skeleton.y = 0;
|
||||
skeleton.updateWorldTransform();
|
||||
skeletons.push({ skeleton: skeleton, state: state });
|
||||
}
|
||||
@ -92,7 +98,7 @@ function render() {
|
||||
updateMean.addValue(Date.now() - start);
|
||||
start = Date.now();
|
||||
|
||||
gl.clearColor(0, 0, 0, 1);
|
||||
gl.clearColor(0.2, 0.2, 0.2, 1);
|
||||
gl.clear(gl.COLOR_BUFFER_BIT);
|
||||
|
||||
renderer.resize(spine.webgl.ResizeMode.Fit);
|
||||
@ -100,6 +106,7 @@ function render() {
|
||||
for (var i = 0; i < skeletons.length; i++) {
|
||||
var skeleton = skeletons[i].skeleton;
|
||||
renderer.drawSkeleton(skeleton);
|
||||
renderer.drawSkeletonDebug(skeleton);
|
||||
}
|
||||
renderer.end();
|
||||
|
||||
|
||||
@ -35,6 +35,7 @@ module spine.webgl {
|
||||
attachmentLineColor = new Color(0, 0, 1, 0.5);
|
||||
triangleLineColor = new Color(1, 0.64, 0, 0.5);
|
||||
pathColor = new Color().setFromString("FF7F00");
|
||||
clipColor = new Color(0.8, 0, 0, 2);
|
||||
aabbColor = new Color(0, 1, 0, 0.5);
|
||||
drawBones = true;
|
||||
drawRegionAttachments = true;
|
||||
@ -43,6 +44,7 @@ module spine.webgl {
|
||||
drawMeshTriangles = true;
|
||||
drawPaths = true;
|
||||
drawSkeletonXY = false;
|
||||
drawClipping = true;
|
||||
premultipliedAlpha = false;
|
||||
scale = 1;
|
||||
boneWidth = 2;
|
||||
@ -192,6 +194,27 @@ module spine.webgl {
|
||||
shapes.circle(true, skeletonX + bone.worldX, skeletonY + bone.worldY, 3 * this.scale, SkeletonDebugRenderer.GREEN, 8);
|
||||
}
|
||||
}
|
||||
|
||||
if (this.drawClipping) {
|
||||
let slots = skeleton.slots;
|
||||
shapes.setColor(this.clipColor)
|
||||
for (let i = 0, n = slots.length; i < n; i++) {
|
||||
let slot = slots[i];
|
||||
let attachment = slot.getAttachment();
|
||||
if (!(attachment instanceof ClippingAttachment)) continue;
|
||||
let clip = <ClippingAttachment>attachment;
|
||||
let nn = clip.worldVerticesLength;
|
||||
let world = this.temp = Utils.setArraySize(this.temp, nn, 0);
|
||||
clip.computeWorldVertices(slot, 0, nn, world, 0, 2);
|
||||
for (let i = 0, n = world.length; i < n; i+=2) {
|
||||
let x = world[i];
|
||||
let y = world[i + 1];
|
||||
let x2 = world[(i + 2) % world.length];
|
||||
let y2 = world[(i + 3) % world.length];
|
||||
shapes.line(x, y, x2, y2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dispose () {
|
||||
|
||||
@ -30,7 +30,7 @@
|
||||
|
||||
module spine.webgl {
|
||||
class Renderable {
|
||||
constructor(public vertices: ArrayLike<number>, public numFloats: number) {}
|
||||
constructor(public vertices: ArrayLike<number>, public numVertices: number, public numFloats: number) {}
|
||||
};
|
||||
|
||||
export class SkeletonRenderer {
|
||||
@ -43,7 +43,8 @@ module spine.webgl {
|
||||
private vertices:ArrayLike<number>;
|
||||
private vertexSize = 2 + 2 + 4;
|
||||
private twoColorTint = false;
|
||||
private renderable: Renderable = new Renderable(null, 0);
|
||||
private renderable: Renderable = new Renderable(null, 0, 0);
|
||||
private clipper: SkeletonClipping = new SkeletonClipping();
|
||||
|
||||
constructor (gl: WebGLRenderingContext, twoColorTint: boolean = true) {
|
||||
this.gl = gl;
|
||||
@ -54,177 +55,112 @@ module spine.webgl {
|
||||
}
|
||||
|
||||
draw (batcher: PolygonBatcher, skeleton: Skeleton) {
|
||||
let clipper = this.clipper;
|
||||
let premultipliedAlpha = this.premultipliedAlpha;
|
||||
let twoColorTint = this.twoColorTint;
|
||||
let blendMode: BlendMode = null;
|
||||
|
||||
let vertices: Renderable = null;
|
||||
let renderable: Renderable = this.renderable;
|
||||
let uvs: ArrayLike<number> = null;
|
||||
let triangles: Array<number> = null;
|
||||
let drawOrder = skeleton.drawOrder;
|
||||
let attachmentColor: Color = null;
|
||||
let skeletonColor = skeleton.color;
|
||||
let vertexSize = twoColorTint ? 12 : 8;
|
||||
for (let i = 0, n = drawOrder.length; i < n; i++) {
|
||||
let clippedVertexSize = clipper.isClipping() ? 2 : vertexSize;
|
||||
let slot = drawOrder[i];
|
||||
let attachment = slot.getAttachment();
|
||||
let texture: GLTexture = null;
|
||||
if (attachment instanceof RegionAttachment) {
|
||||
let region = <RegionAttachment>attachment;
|
||||
vertices = this.computeRegionVertices(slot, region, premultipliedAlpha, this.twoColorTint);
|
||||
renderable.vertices = this.vertices;
|
||||
renderable.numVertices = 4;
|
||||
renderable.numFloats = clippedVertexSize << 2;
|
||||
region.computeWorldVertices(slot.bone, renderable.vertices, 0, clippedVertexSize);
|
||||
triangles = SkeletonRenderer.QUAD_TRIANGLES;
|
||||
uvs = region.uvs;
|
||||
texture = <GLTexture>(<TextureAtlasRegion>region.region.renderObject).texture;
|
||||
|
||||
attachmentColor = region.color;
|
||||
} else if (attachment instanceof MeshAttachment) {
|
||||
let mesh = <MeshAttachment>attachment;
|
||||
vertices = this.computeMeshVertices(slot, mesh, premultipliedAlpha, this.twoColorTint);
|
||||
renderable.vertices = this.vertices;
|
||||
renderable.numVertices = (mesh.worldVerticesLength >> 1);
|
||||
renderable.numFloats = renderable.numVertices * clippedVertexSize;
|
||||
if (renderable.numFloats > renderable.vertices.length) {
|
||||
renderable.vertices = this.vertices = spine.Utils.newFloatArray(renderable.numFloats);
|
||||
}
|
||||
mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, renderable.vertices, 0, clippedVertexSize);
|
||||
triangles = mesh.triangles;
|
||||
texture = <GLTexture>(<TextureAtlasRegion>mesh.region.renderObject).texture;
|
||||
uvs = mesh.uvs;
|
||||
attachmentColor = mesh.color;
|
||||
} else if (attachment instanceof ClippingAttachment) {
|
||||
let clip = <ClippingAttachment>(attachment);
|
||||
clipper.clipStart(slot, clip);
|
||||
continue;
|
||||
} else continue;
|
||||
|
||||
if (texture != null) {
|
||||
let slotColor = slot.color;
|
||||
let finalColor = this.tempColor;
|
||||
finalColor.r = skeletonColor.r * slotColor.r * attachmentColor.r;
|
||||
finalColor.g = skeletonColor.g * slotColor.g * attachmentColor.g;
|
||||
finalColor.b = skeletonColor.b * slotColor.b * attachmentColor.b;
|
||||
finalColor.a = skeletonColor.a * slotColor.a * attachmentColor.a;
|
||||
if (premultipliedAlpha) {
|
||||
finalColor.r *= finalColor.a;
|
||||
finalColor.g *= finalColor.a;
|
||||
finalColor.b *= finalColor.a;
|
||||
}
|
||||
let darkColor = this.tempColor2;
|
||||
if (slot.darkColor == null) darkColor.set(0, 0, 0, 1);
|
||||
else darkColor.setFromColor(slot.darkColor);
|
||||
|
||||
let slotBlendMode = slot.data.blendMode;
|
||||
if (slotBlendMode != blendMode) {
|
||||
blendMode = slotBlendMode;
|
||||
batcher.setBlendMode(getSourceGLBlendMode(this.gl, blendMode, premultipliedAlpha), getDestGLBlendMode(this.gl, blendMode));
|
||||
}
|
||||
|
||||
let view = (vertices.vertices as Float32Array).subarray(0, vertices.numFloats);
|
||||
batcher.draw(texture, view, triangles);
|
||||
if (clipper.isClipping()) {
|
||||
clipper.clipTriangles(renderable.vertices, renderable.numFloats, triangles, triangles.length, uvs, finalColor, darkColor, twoColorTint);
|
||||
let clippedVertices = new Float32Array(clipper.clippedVertices);
|
||||
let clippedTriangles = clipper.clippedTriangles;
|
||||
batcher.draw(texture, clippedVertices, clippedTriangles);
|
||||
} else {
|
||||
let verts = renderable.vertices;
|
||||
if (!twoColorTint) {
|
||||
for (let v = 2, u = 0, n = renderable.numFloats; v < n; v += vertexSize, u += 2) {
|
||||
verts[v] = finalColor.r;
|
||||
verts[v + 1] = finalColor.g;
|
||||
verts[v + 2] = finalColor.b;
|
||||
verts[v + 3] = finalColor.a;
|
||||
verts[v + 4] = uvs[u];
|
||||
verts[v + 5] = uvs[u + 1];
|
||||
}
|
||||
} else {
|
||||
for (let v = 2, u = 0, n = renderable.numFloats; v < n; v += vertexSize, u += 2) {
|
||||
verts[v] = finalColor.r;
|
||||
verts[v + 1] = finalColor.g;
|
||||
verts[v + 2] = finalColor.b;
|
||||
verts[v + 3] = finalColor.a;
|
||||
verts[v + 4] = uvs[u];
|
||||
verts[v + 5] = uvs[u + 1];
|
||||
verts[v + 6] = darkColor.r;
|
||||
verts[v + 7] = darkColor.g;
|
||||
verts[v + 8] = darkColor.b;
|
||||
verts[v + 9] = darkColor.a;
|
||||
}
|
||||
}
|
||||
let view = (renderable.vertices as Float32Array).subarray(0, renderable.numFloats);
|
||||
batcher.draw(texture, view, triangles);
|
||||
}
|
||||
}
|
||||
|
||||
clipper.clipEndWithSlot(slot);
|
||||
}
|
||||
}
|
||||
|
||||
private computeRegionVertices(slot: Slot, region: RegionAttachment, pma: boolean, twoColorTint: boolean = false) {
|
||||
let skeleton = slot.bone.skeleton;
|
||||
let skeletonColor = skeleton.color;
|
||||
let slotColor = slot.color;
|
||||
let regionColor = region.color;
|
||||
let alpha = skeletonColor.a * slotColor.a * regionColor.a;
|
||||
let multiplier = pma ? alpha : 1;
|
||||
let color = this.tempColor;
|
||||
color.set(skeletonColor.r * slotColor.r * regionColor.r * multiplier,
|
||||
skeletonColor.g * slotColor.g * regionColor.g * multiplier,
|
||||
skeletonColor.b * slotColor.b * regionColor.b * multiplier,
|
||||
alpha);
|
||||
let dark = this.tempColor2;
|
||||
if (slot.darkColor == null) dark.set(0, 0, 0, 1);
|
||||
else dark.setFromColor(slot.darkColor);
|
||||
|
||||
region.computeWorldVertices(slot.bone, this.vertices, 0, this.vertexSize);
|
||||
|
||||
let vertices = this.vertices;
|
||||
let uvs = region.uvs;
|
||||
|
||||
let i = 2;
|
||||
vertices[i++] = color.r;
|
||||
vertices[i++] = color.g;
|
||||
vertices[i++] = color.b;
|
||||
vertices[i++] = color.a;
|
||||
vertices[i++] = uvs[0];
|
||||
vertices[i++] = uvs[1];
|
||||
if (twoColorTint) {
|
||||
vertices[i++] = dark.r;
|
||||
vertices[i++] = dark.g;
|
||||
vertices[i++] = dark.b;
|
||||
vertices[i++] = 1;
|
||||
}
|
||||
i+=2;
|
||||
|
||||
vertices[i++] = color.r;
|
||||
vertices[i++] = color.g;
|
||||
vertices[i++] = color.b;
|
||||
vertices[i++] = color.a;
|
||||
vertices[i++] = uvs[2];
|
||||
vertices[i++] = uvs[3];
|
||||
if (twoColorTint) {
|
||||
vertices[i++] = dark.r;
|
||||
vertices[i++] = dark.g;
|
||||
vertices[i++] = dark.b;
|
||||
vertices[i++] = 1;
|
||||
}
|
||||
i+=2;
|
||||
|
||||
vertices[i++] = color.r;
|
||||
vertices[i++] = color.g;
|
||||
vertices[i++] = color.b;
|
||||
vertices[i++] = color.a;
|
||||
vertices[i++] = uvs[4];
|
||||
vertices[i++] = uvs[5];
|
||||
if (twoColorTint) {
|
||||
vertices[i++] = dark.r;
|
||||
vertices[i++] = dark.g;
|
||||
vertices[i++] = dark.b;
|
||||
vertices[i++] = 1;
|
||||
}
|
||||
i+=2;
|
||||
|
||||
vertices[i++] = color.r;
|
||||
vertices[i++] = color.g;
|
||||
vertices[i++] = color.b;
|
||||
vertices[i++] = color.a;
|
||||
vertices[i++] = uvs[6];
|
||||
vertices[i++] = uvs[7];
|
||||
if (twoColorTint) {
|
||||
vertices[i++] = dark.r;
|
||||
vertices[i++] = dark.g;
|
||||
vertices[i++] = dark.b;
|
||||
vertices[i++] = 1;
|
||||
}
|
||||
|
||||
this.renderable.vertices = vertices;
|
||||
this.renderable.numFloats = 4 * (twoColorTint ? 12 : 8);
|
||||
return this.renderable;
|
||||
}
|
||||
|
||||
private computeMeshVertices(slot: Slot, mesh: MeshAttachment, pma: boolean, twoColorTint: boolean = false) {
|
||||
let skeleton = slot.bone.skeleton;
|
||||
let skeletonColor = skeleton.color;
|
||||
let slotColor = slot.color;
|
||||
let regionColor = mesh.color;
|
||||
let alpha = skeletonColor.a * slotColor.a * regionColor.a;
|
||||
let multiplier = pma ? alpha : 1;
|
||||
let color = this.tempColor;
|
||||
color.set(skeletonColor.r * slotColor.r * regionColor.r * multiplier,
|
||||
skeletonColor.g * slotColor.g * regionColor.g * multiplier,
|
||||
skeletonColor.b * slotColor.b * regionColor.b * multiplier,
|
||||
alpha);
|
||||
let dark = this.tempColor2;
|
||||
if (slot.darkColor == null) dark.set(0, 0, 0, 1);
|
||||
else dark.setFromColor(slot.darkColor);
|
||||
|
||||
let numVertices = mesh.worldVerticesLength / 2;
|
||||
if (this.vertices.length < mesh.worldVerticesLength) {
|
||||
this.vertices = Utils.newFloatArray(mesh.worldVerticesLength);
|
||||
}
|
||||
let vertices = this.vertices;
|
||||
mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, vertices, 0, this.vertexSize);
|
||||
|
||||
let uvs = mesh.uvs;
|
||||
if (!twoColorTint) {
|
||||
for (let i = 0, n = numVertices, u = 0, v = 2; i < n; i++) {
|
||||
vertices[v++] = color.r;
|
||||
vertices[v++] = color.g;
|
||||
vertices[v++] = color.b;
|
||||
vertices[v++] = color.a;
|
||||
vertices[v++] = uvs[u++];
|
||||
vertices[v++] = uvs[u++];
|
||||
v += 2;
|
||||
}
|
||||
} else {
|
||||
for (let i = 0, n = numVertices, u = 0, v = 2; i < n; i++) {
|
||||
vertices[v++] = color.r;
|
||||
vertices[v++] = color.g;
|
||||
vertices[v++] = color.b;
|
||||
vertices[v++] = color.a;
|
||||
vertices[v++] = uvs[u++];
|
||||
vertices[v++] = uvs[u++];
|
||||
vertices[v++] = dark.r;
|
||||
vertices[v++] = dark.g;
|
||||
vertices[v++] = dark.b;
|
||||
vertices[v++] = 1;
|
||||
v += 2;
|
||||
}
|
||||
}
|
||||
|
||||
this.renderable.vertices = vertices;
|
||||
this.renderable.numFloats = numVertices * (twoColorTint ? 12 : 8);
|
||||
return this.renderable;
|
||||
clipper.clipEnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user