[haxe] Port to 4.3 - fix clipping.

This commit is contained in:
Davide Tantillo 2025-06-06 14:34:00 +02:00
parent b42daae7f2
commit b06a485ad8
4 changed files with 43 additions and 48 deletions

View File

@ -54,10 +54,12 @@ class VineExample extends Scene {
var skeletonSprite = new SkeletonSprite(skeletondata, animationStateData);
skeletonSprite.skeleton.updateWorldTransform(Physics.none);
var bounds = skeletonSprite.skeleton.getBounds();
skeletonSprite.scale = Starling.current.stage.stageWidth / bounds.width;
skeletonSprite.scale = Starling.current.stage.stageWidth / bounds.width / 10;
skeletonSprite.x = Starling.current.stage.stageWidth / 2;
skeletonSprite.y = Starling.current.stage.stageHeight * 0.5;
skeletonSprite.state.setAnimationByName(0, "grow", true);
addChild(skeletonSprite);
juggler.add(skeletonSprite);
@ -67,7 +69,8 @@ class VineExample extends Scene {
public function onTouch(e:TouchEvent) {
var touch = e.getTouch(this);
if (touch != null && touch.phase == TouchPhase.ENDED) {
SceneManager.getInstance().switchScene(new SackExample());
SceneManager.getInstance().switchScene(new CelestialCircusExample());
// SceneManager.getInstance().switchScene(new SackExample());
}
}
}

View File

@ -157,7 +157,7 @@ class SkeletonClipping {
return clipOutputItems != null;
}
public function clipTriangles(vertices:Array<Float>, triangles:Array<Int>, trianglesLength:Float, uvs:Array<Float> = null, stride:Int = 0):Bool {
public function clipTriangles(vertices:Array<Float>, triangles:Array<Int>, trianglesLength:Float, uvs:Array<Float> = null):Bool {
if (uvs == null) {
return clipTrianglesNoRender(vertices, triangles, trianglesLength);
}
@ -170,17 +170,17 @@ class SkeletonClipping {
var i:Int = 0;
var clipOutputItems:Array<Float> = null;
while (i < trianglesLength) {
var t:Int = triangles[i];
var u1:Float = uvs[t << 1], v1:Float = uvs[(t << 1) + 1];
var x1:Float = vertices[t * stride], y1:Float = vertices[t * stride + 1];
var vertexOffset:Int = triangles[i] << 1;
var x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1];
var u1 = uvs[vertexOffset], v1 = uvs[vertexOffset + 1];
t = triangles[i + 1];
var u2:Float = uvs[t << 1], v2:Float = uvs[(t << 1) + 1];
var x2:Float = vertices[t * stride], y2:Float = vertices[t * stride + 1];
vertexOffset = triangles[i + 1] << 1;
var x2 = vertices[vertexOffset], y2 = vertices[vertexOffset + 1];
var u2 = uvs[vertexOffset], v2 = uvs[vertexOffset + 1];
t = triangles[i + 2];
var u3:Float = uvs[t << 1], v3:Float = uvs[(t << 1) + 1];
var x3:Float = vertices[t * stride], y3:Float = vertices[t * stride + 1];
vertexOffset = triangles[i + 2] << 1;
var x3 = vertices[vertexOffset], y3 = vertices[vertexOffset + 1];
var u3 = uvs[vertexOffset], v3 = uvs[vertexOffset + 1];
for (p in 0...polygonsCount) {
var s:Int = clippedVertices.length;
@ -192,28 +192,24 @@ class SkeletonClipping {
var clipOutputLength:Int = clipOutput.length;
if (clipOutputLength == 0)
continue;
var d0:Float = y2 - y3,
d1:Float = x3 - x2,
d2:Float = x1 - x3,
d4:Float = y3 - y1;
var d:Float = 1 / (d0 * d2 + d1 * (y1 - y3));
var d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1;
var d = 1 / (d0 * d2 + d1 * (y1 - y3));
var clipOutputCount:Int = clipOutputLength >> 1;
clippedVerticesItems = clippedVertices;
clippedVerticesItems.resize(s + clipOutputLength * stride);
clippedVerticesItems.resize(s + clipOutputLength);
clippedUvsItems = clippedUvs;
clippedUvsItems.resize(s + clipOutputLength);
var ii:Int = 0;
while (ii < clipOutputLength) {
var x:Float = clipOutputItems[ii],
y:Float = clipOutputItems[ii + 1];
var x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
clippedVerticesItems[s] = x;
clippedVerticesItems[s + 1] = y;
var c0:Float = x - x3, c1:Float = y - y3;
var a:Float = (d0 * c0 + d1 * c1) * d;
var b:Float = (d4 * c0 + d2 * c1) * d;
var c:Float = 1 - a - b;
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;
clippedUvsItems[s] = u1 * a + u2 * b + u3 * c;
clippedUvsItems[s + 1] = v1 * a + v2 * b + v3 * c;
s += 2;
@ -234,7 +230,7 @@ class SkeletonClipping {
index += clipOutputCount + 1;
} else {
clippedVerticesItems = clippedVertices;
clippedVerticesItems.resize(s + 3 * stride);
clippedVerticesItems.resize(s + 3 * 2);
clippedVerticesItems[s] = x1;
clippedVerticesItems[s + 1] = y1;
clippedVerticesItems[s + 2] = x2;
@ -243,7 +239,7 @@ class SkeletonClipping {
clippedVerticesItems[s + 5] = y3;
clippedUvsItems = clippedUvs;
clippedUvsItems.resize(s + 3 * 2);
clippedUvsItems.resize(s + 3);
clippedUvsItems[s] = u1;
clippedUvsItems[s + 1] = v1;
clippedUvsItems[s + 2] = u2;

View File

@ -199,7 +199,9 @@ class SkeletonSprite extends FlxObject
var vertexSize:Int = twoColorTint ? 12 : 8;
_tempMatrix = getTransformMatrix();
for (slot in drawOrder) {
var clippedVertexSize:Int = clipper.isClipping() ? 2 : vertexSize;
// no two tint color support and tint is passed as parameter to mesh, so vertex size is 2
// var clippedVertexSize = clipper.isClipping() ? 2 : vertexSize;
var clippedVertexSize = 2;
if (!slot.bone.active) {
clipper.clipEnd(slot);
continue;
@ -212,9 +214,8 @@ class SkeletonSprite extends FlxObject
var region:RegionAttachment = cast(attachment, RegionAttachment);
numVertices = 4;
numFloats = clippedVertexSize << 2;
if (numFloats > worldVertices.length) {
if (numFloats > worldVertices.length)
worldVertices.resize(numFloats);
}
region.computeWorldVertices(slot, worldVertices, 0, clippedVertexSize);
mesh = getFlixelMeshFromRendererAttachment(region);
@ -238,6 +239,7 @@ class SkeletonSprite extends FlxObject
attachmentColor = meshAttachment.color;
} else if (Std.isOfType(attachment, ClippingAttachment)) {
var clip:ClippingAttachment = cast(attachment, ClippingAttachment);
clipper.clipEnd(slot);
clipper.clipStart(skeleton, slot, clip);
continue;
} else {
@ -256,12 +258,9 @@ class SkeletonSprite extends FlxObject
);
mesh.alpha = skeleton.color.a * pose.color.a * attachmentColor.a * alpha;
if (clipper.isClipping()) {
clipper.clipTriangles(worldVertices, triangles, triangles.length, uvs);
if (clipper.isClipping() && clipper.clipTriangles(worldVertices, triangles, triangles.length, uvs)) {
mesh.indices = Vector.ofArray(clipper.clippedTriangles);
mesh.uvtData = Vector.ofArray(clipper.clippedUvs);
if (angle == 0) {
mesh.vertices = Vector.ofArray(clipper.clippedVertices);
mesh.x = x + offsetX;
@ -278,21 +277,19 @@ class SkeletonSprite extends FlxObject
}
}
} else {
var v = 0;
var n = numFloats;
var i = 0;
mesh.vertices.length = numVertices;
while (v < n) {
while (i < n) {
if (angle == 0) {
mesh.vertices[i] = worldVertices[v];
mesh.vertices[i + 1] = worldVertices[v + 1];
mesh.vertices[i] = worldVertices[i];
mesh.vertices[i + 1] = worldVertices[i + 1];
} else {
_tempPoint.setTo(worldVertices[v], worldVertices[v + 1]);
_tempPoint.setTo(worldVertices[i], worldVertices[i + 1]);
_tempPoint = _tempMatrix.transformPoint(_tempPoint);
mesh.vertices[i] = _tempPoint.x;
mesh.vertices[i + 1] = _tempPoint.y;
}
v += 8;
i += 2;
}
if (angle == 0) {

View File

@ -118,8 +118,8 @@ class SkeletonSprite extends DisplayObject implements IAnimatable {
var worldVertices:Array<Float> = _tempVertices;
var pose = slot.pose;
var attachment = pose.attachment;
if (Std.isOfType(pose, RegionAttachment)) {
var region:RegionAttachment = cast(pose, RegionAttachment);
if (Std.isOfType(attachment, RegionAttachment)) {
var region:RegionAttachment = cast(attachment, RegionAttachment);
verticesLength = 8;
verticesCount = verticesLength >> 1;
if (worldVertices.length < verticesLength)
@ -146,8 +146,8 @@ class SkeletonSprite extends DisplayObject implements IAnimatable {
indexData = mesh.getIndexData();
attachmentColor = region.color;
uvs = region.uvs;
} else if (Std.isOfType(pose, MeshAttachment)) {
var meshAttachment:MeshAttachment = cast(pose, MeshAttachment);
} else if (Std.isOfType(attachment, MeshAttachment)) {
var meshAttachment:MeshAttachment = cast(attachment, MeshAttachment);
verticesLength = meshAttachment.worldVerticesLength;
verticesCount = verticesLength >> 1;
if (worldVertices.length < verticesLength)
@ -175,8 +175,9 @@ class SkeletonSprite extends DisplayObject implements IAnimatable {
indexData = mesh.getIndexData();
attachmentColor = meshAttachment.color;
uvs = meshAttachment.uvs;
} else if (Std.isOfType(pose, ClippingAttachment)) {
var clip:ClippingAttachment = cast(pose, ClippingAttachment);
} else if (Std.isOfType(attachment, ClippingAttachment)) {
var clip:ClippingAttachment = cast(attachment, ClippingAttachment);
clipper.clipEnd(slot);
clipper.clipStart(skeleton, slot, clip);
continue;
} else {
@ -197,9 +198,7 @@ class SkeletonSprite extends DisplayObject implements IAnimatable {
dark = Color.rgb(Std.int(pose.darkColor.r * 255), Std.int(pose.darkColor.g * 255), Std.int(pose.darkColor.b * 255));
}
if (clipper.isClipping()) {
clipper.clipTriangles(worldVertices, indices, indices.length, uvs);
if (clipper.isClipping() && clipper.clipTriangles(worldVertices, indices, indices.length, uvs)) {
// Need to create a new mesh here, see https://github.com/EsotericSoftware/spine-runtimes/issues/1125
mesh = new SkeletonMesh(mesh.texture);
indexData = mesh.getIndexData();