[ts] 4.3 porting WIP - latest updates.

This commit is contained in:
Davide Tantillo 2025-06-19 12:25:42 +02:00
parent 317aa13c87
commit e723893c0c
6 changed files with 38 additions and 26 deletions

View File

@ -334,6 +334,7 @@ export class SkeletonBinary {
default: continue;
};
data.property.offset = offset;
data.offset = input.readFloat();
data.scale = input.readFloat();
}
constraints.push(data);

View File

@ -343,7 +343,9 @@ export class SkeletonJson {
if (!data.bone) throw new Error("Slider bone not found: " + boneName);
const property = constraintMap.property;
data.property = this.fromProperty(property);
data.property.offset = getValue(constraintMap, "offset", 0) * this.propertyScale(property, scale);
const propertyScale = this.propertyScale(property, scale);
data.property.offset = getValue(constraintMap, "from", 0) * propertyScale;
data.offset = getValue(constraintMap, "to", 0);
data.scale = getValue(constraintMap, "scale", 1);
data.local = getValue(constraintMap, "local", false);
}
@ -919,12 +921,10 @@ export class SkeletonJson {
skeletonData.constraints.indexOf(constraint));
let time = getValue(keyMap, "time", 0);
let mixRotate = getValue(keyMap, "mixRotate", 0);
let mixX = getValue(keyMap, "mixX", 0);
let mixY = getValue(keyMap, "mixY", mixX);
let mixScaleX = getValue(keyMap, "mixScaleX", 0);
let mixScaleY = getValue(keyMap, "mixScaleY", mixScaleX);
let mixShearY = getValue(keyMap, "mixShearY", 0);
let mixRotate = getValue(keyMap, "mixRotate", 1);
let mixX = getValue(keyMap, "mixX", 1), mixY = getValue(keyMap, "mixY", mixX);
let mixScaleX = getValue(keyMap, "mixScaleX", 1), mixScaleY = getValue(keyMap, "mixScaleY", 1);
let mixShearY = getValue(keyMap, "mixShearY", 1);
for (let frame = 0, bezier = 0; ; frame++) {
timeline.setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY);
@ -936,10 +936,8 @@ export class SkeletonJson {
let time2 = getValue(nextMap, "time", 0);
let mixRotate2 = getValue(nextMap, "mixRotate", 1);
let mixX2 = getValue(nextMap, "mixX", 1);
let mixY2 = getValue(nextMap, "mixY", mixX2);
let mixScaleX2 = getValue(nextMap, "mixScaleX", 1);
let mixScaleY2 = getValue(nextMap, "mixScaleY", mixScaleX2);
let mixX2 = getValue(nextMap, "mixX", 1), mixY2 = getValue(nextMap, "mixY", mixX2);
let mixScaleX2 = getValue(nextMap, "mixScaleX", 1), mixScaleY2 = getValue(nextMap, "mixScaleY", 1);
let mixShearY2 = getValue(nextMap, "mixShearY", 1);
let curve = keyMap.curve;
if (curve) {

View File

@ -64,7 +64,8 @@ export class Slider extends Constraint<Slider, SliderData, SliderPose> {
if (bone !== null) {
if (!bone.active) return;
if (data.local) bone.applied.validateLocalTransform(skeleton);
p.time = (data.property.value(bone.applied, data.local, Slider.offsets) - data.property.offset) * data.scale;
p.time = data.offset
+ (data.property.value(skeleton, bone.applied, data.local, Slider.offsets) - data.property.offset) * data.scale;
if (data.loop)
p.time = animation.duration + (p.time % animation.duration);
else

View File

@ -45,6 +45,7 @@ export class SliderData extends ConstraintData<Slider, SliderPose> {
bone: BoneData | null = null;
property!: FromProperty;
scale = 0;
offset = 0;
local = false;
constructor (name: string) {

View File

@ -88,7 +88,7 @@ export class TransformConstraint extends Constraint<TransformConstraint, Transfo
bone.modifyWorld(update);
for (let f = 0; f < fn; f++) {
const from = fromItems[f];
const value = from.value(source, localSource, offsets) - from.offset;
const value = from.value(skeleton, source, localSource, offsets) - from.offset;
const toItems = from.to;
for (let t = 0, tn = from.to.length; t < tn; t++) {
const to = toItems[t];

View File

@ -153,7 +153,7 @@ export abstract class FromProperty {
readonly to: Array<ToProperty> = [];
/** Reads this property from the specified bone. */
abstract value (source: BonePose, local: boolean, offsets: Array<number>): number;
abstract value (skeleton: Skeleton, source: BonePose, local: boolean, offsets: Array<number>): number;
}
/** Constrained property for a {@link TransformConstraint}. */
@ -175,9 +175,9 @@ export abstract class ToProperty {
}
export class FromRotate extends FromProperty {
value (source: BonePose, local: boolean, offsets: Array<number>): number {
value (skeleton: Skeleton, source: BonePose, local: boolean, offsets: Array<number>): number {
if (local) return source.rotation + offsets[TransformConstraintData.ROTATION];
let value = Math.atan2(source.c, source.a) * MathUtils.radDeg
let value = Math.atan2(source.c / skeleton.scaleY, source.a / skeleton.scaleX) * MathUtils.radDeg
+ (source.a * source.d - source.b * source.c > 0 ? offsets[TransformConstraintData.ROTATION] : -offsets[TransformConstraintData.ROTATION]);
if (value < 0) value += 360;
return value;
@ -212,8 +212,10 @@ export class ToRotate extends ToProperty {
}
export class FromX extends FromProperty {
value (source: BonePose, local: boolean, offsets: Array<number>): number {
return local ? source.x + offsets[TransformConstraintData.X] : offsets[TransformConstraintData.X] * source.a + offsets[TransformConstraintData.Y] * source.b + source.worldX;
value (skeleton: Skeleton, source: BonePose, local: boolean, offsets: Array<number>): number {
return local
? source.x + offsets[TransformConstraintData.X]
: (offsets[TransformConstraintData.X] * source.a + offsets[TransformConstraintData.Y] * source.b + source.worldX) / skeleton.scaleX;
}
}
@ -234,8 +236,10 @@ export class ToX extends ToProperty {
}
export class FromY extends FromProperty {
value (source: BonePose, local: boolean, offsets: Array<number>): number {
return local ? source.y + offsets[TransformConstraintData.Y] : offsets[TransformConstraintData.X] * source.c + offsets[TransformConstraintData.Y] * source.d + source.worldY;
value (skeleton: Skeleton, source: BonePose, local: boolean, offsets: Array<number>): number {
return local
? source.y + offsets[TransformConstraintData.Y]
: (offsets[TransformConstraintData.X] * source.c + offsets[TransformConstraintData.Y] * source.d + source.worldY) / skeleton.scaleY;
}
}
@ -256,8 +260,10 @@ export class ToY extends ToProperty {
}
export class FromScaleX extends FromProperty {
value (source: BonePose, local: boolean, offsets: Array<number>): number {
return local ? source.scaleX : Math.sqrt(source.a * source.a + source.c * source.c) + offsets[TransformConstraintData.SCALEX];
value (skeleton: Skeleton, source: BonePose, local: boolean, offsets: Array<number>): number {
if (local) return source.scaleX + offsets[TransformConstraintData.SCALEX];
const a = source.a / skeleton.scaleX, c = source.c / skeleton.scaleY;
return Math.sqrt(a * a + c * c) + offsets[TransformConstraintData.SCALEX];
}
}
@ -287,8 +293,10 @@ export class ToScaleX extends ToProperty {
}
export class FromScaleY extends FromProperty {
value (source: BonePose, local: boolean, offsets: Array<number>): number {
return local ? source.scaleY : Math.sqrt(source.b * source.b + source.d * source.d) + offsets[TransformConstraintData.SCALEY];
value (skeleton: Skeleton, source: BonePose, local: boolean, offsets: Array<number>): number {
if (local) return source.scaleY + offsets[TransformConstraintData.SCALEY];
const b = source.b / skeleton.scaleX, d = source.d / skeleton.scaleY;
return Math.sqrt(b * b + d * d) + offsets[TransformConstraintData.SCALEY];
}
}
@ -318,8 +326,11 @@ export class ToScaleY extends ToProperty {
}
export class FromShearY extends FromProperty {
value (source: BonePose, local: boolean, offsets: Array<number>): number {
return (local ? source.shearY : (Math.atan2(source.d, source.b) - Math.atan2(source.c, source.a)) * MathUtils.radDeg - 90) + offsets[TransformConstraintData.SHEARY];
value (skeleton: Skeleton, source: BonePose, local: boolean, offsets: Array<number>): number {
if (local) return source.shearY + offsets[TransformConstraintData.SHEARY];
const sx = 1 / skeleton.scaleX, sy = 1 / skeleton.scaleY;
return (Math.atan2(source.d * sy, source.b * sx) - Math.atan2(source.c * sy, source.a * sx))
* MathUtils.radDeg - 90 + offsets[TransformConstraintData.SHEARY];
}
}