Add support for z elevation.

This commit is contained in:
Davide Tantillo 2026-02-10 12:48:17 +01:00
parent 8aba39f7d5
commit bc6f750a39
5 changed files with 18 additions and 8 deletions

View File

@ -37,21 +37,24 @@ export class C3Matrix {
public d = 0; public d = 0;
public tx = 0; public tx = 0;
public ty = 0; public ty = 0;
public tz = 0;
public prevX = Infinity; public prevX = Infinity;
public prevY = Infinity; public prevY = Infinity;
public prevZ = Infinity;
public prevAngle = Infinity; public prevAngle = Infinity;
public prevScaleX = Infinity; public prevScaleX = Infinity;
public prevScaleY = Infinity; public prevScaleY = Infinity;
private tempPoint = new Vector2(); private tempPoint = new Vector2();
public update (x: number, y: number, angle: number, scaleX = 1, scaleY = 1) { public update (x: number, y: number, z: number, angle: number, scaleX = 1, scaleY = 1) {
if (this.prevX === x && this.prevY === y && if (this.prevX === x && this.prevY === y && this.prevZ === z &&
this.prevAngle === angle && this.prevAngle === angle &&
this.prevScaleX === scaleX && this.prevScaleY === scaleY) return false; this.prevScaleX === scaleX && this.prevScaleY === scaleY) return false;
this.prevX = x; this.prevX = x;
this.prevY = y; this.prevY = y;
this.prevZ = z;
this.prevAngle = angle; this.prevAngle = angle;
this.prevScaleX = scaleX; this.prevScaleX = scaleX;
this.prevScaleY = scaleY; this.prevScaleY = scaleY;
@ -63,6 +66,7 @@ export class C3Matrix {
this.d = scaleY * cos; this.d = scaleY * cos;
this.tx = x; this.tx = x;
this.ty = y; this.ty = y;
this.tz = z;
return true; return true;
} }

View File

@ -49,6 +49,7 @@ abstract class C3SkeletonRenderer<
private prevX = Infinity; private prevX = Infinity;
private prevY = Infinity; private prevY = Infinity;
private prevZ = Infinity;
private prevAngle = Infinity; private prevAngle = Infinity;
private prevRed = -1; private prevRed = -1;
private prevGreen = -1; private prevGreen = -1;
@ -64,11 +65,12 @@ abstract class C3SkeletonRenderer<
draw (skeleton: Skeleton, inColors: [number, number, number], opacity = 1, requestRedraw = true) { draw (skeleton: Skeleton, inColors: [number, number, number], opacity = 1, requestRedraw = true) {
const { matrix, inv255 } = this; const { matrix, inv255 } = this;
const { a, b, c, d, tx, ty, prevX, prevY, prevAngle } = matrix; const { a, b, c, d, tx, ty, prevX, prevY, prevZ, prevAngle } = matrix;
const requestRedrawForMatrix = this.prevX !== prevX || this.prevY !== prevY || this.prevAngle !== prevAngle; const requestRedrawForMatrix = this.prevX !== prevX || this.prevY !== prevY || this.prevZ !== prevZ || this.prevAngle !== prevAngle;
this.prevX = prevX; this.prevX = prevX;
this.prevY = prevY; this.prevY = prevY;
this.prevZ = prevZ;
this.prevAngle = prevAngle; this.prevAngle = prevAngle;
const requestRedrawForColor = this.prevRed !== inColors[0] || this.prevGreen !== inColors[1] || this.prevBlue !== inColors[2] || this.prevAlpha !== opacity; const requestRedrawForColor = this.prevRed !== inColors[0] || this.prevGreen !== inColors[1] || this.prevBlue !== inColors[2] || this.prevAlpha !== opacity;
@ -95,6 +97,7 @@ abstract class C3SkeletonRenderer<
const y = positions[index + 1]; const y = positions[index + 1];
positions[index] = a * x + c * y + tx; positions[index] = a * x + c * y + tx;
positions[index + 1] = b * x + d * y + ty; positions[index + 1] = b * x + d * y + ty;
positions[index + 2] = prevZ;
const color = colors[i]; const color = colors[i];
const colorDst = i * 4; const colorDst = i * 4;

View File

@ -163,6 +163,7 @@ class SpineC3Instance extends globalThis.ISDKWorldInstanceBase {
this.matrix.update( this.matrix.update(
this.x + this.propOffsetX, this.x + this.propOffsetX,
this.y + this.propOffsetY, this.y + this.propOffsetY,
this.totalZElevation,
this.angle + this.propOffsetAngle, this.angle + this.propOffsetAngle,
this.width / this.spineBounds.width * this.propScaleX * (this.isFlippedX ? -1 : 1), this.width / this.spineBounds.width * this.propScaleX * (this.isFlippedX ? -1 : 1),
this.height / this.spineBounds.height * this.propScaleY); this.height / this.spineBounds.height * this.propScaleY);

View File

@ -572,6 +572,7 @@ class SpineC3PluginInstance extends SDK.IWorldInstanceBase {
this.matrix.update( this.matrix.update(
this._inst.GetX() + this.propOffsetX, this._inst.GetX() + this.propOffsetX,
this._inst.GetY() + this.propOffsetY, this._inst.GetY() + this.propOffsetY,
this._inst.GetTotalZElevation(),
this._inst.GetAngle() + this.propOffsetAngle, this._inst.GetAngle() + this.propOffsetAngle,
actualScaleX, actualScaleX,
actualScaleY); actualScaleY);

View File

@ -78,14 +78,15 @@ const PLUGIN_CLASS = class SpineC3Plugin extends SDK.IPluginBase {
this._info.SetCategory(PLUGIN_CATEGORY); this._info.SetCategory(PLUGIN_CATEGORY);
this._info.SetAuthor("Esoteric Software"); this._info.SetAuthor("Esoteric Software");
this._info.SetHelpUrl(globalThis.lang(".help-url")); this._info.SetHelpUrl(globalThis.lang(".help-url"));
this._info.SetPluginType("world"); // mark as world plugin, which can draw this._info.SetPluginType("world"); // mark as world plugin, which can draw
this._info.SetIsResizable(true); // allow to be resized this._info.SetIsResizable(true); // allow to be resized
this._info.SetIsRotatable(true); // allow to be rotated this._info.SetIsRotatable(true); // allow to be rotated
this._info.SetHasImage(false); this._info.SetHasImage(false);
this._info.SetSupportsEffects(true); // allow effects this._info.SetSupportsEffects(true); // allow effects
this._info.SetMustPreDraw(true); this._info.SetMustPreDraw(true);
this._info.SetSupportsColor(true); // enable system colour/transparency this._info.SetSupportsColor(true); // enable system colour/transparency
this._info.SetSupportsZElevation(true); // enable z elevation
this._info.AddCommonPositionACEs(); // Position: Set X/Y, Set position, etc. this._info.AddCommonPositionACEs(); // Position: Set X/Y, Set position, etc.
this._info.AddCommonSizeACEs(); // Size: Set size, width, height this._info.AddCommonSizeACEs(); // Size: Set size, width, height