Implemented interpolation options for player model animations.

This commit is contained in:
Luis C.M committed 2023-01-07 13:38:44 -06:00
1 parent d6ed069862
commit 235ddaa1ea
2 files changed
+59 -12

No files matched your search

@@ -29,6 +29,7 @@ public class PlayerModelData implements IPlayerModelData {
public boolean animate = false;
public float animRate = 1.0F;
public boolean interpolate;
//Client-sided use
public float modelRotPartialTicks;
@@ -75,6 +76,7 @@ public class PlayerModelData implements IPlayerModelData {
compound.setBoolean("PuppetRotationEnabledY",rotationEnabledY);
compound.setBoolean("PuppetRotationEnabledZ",rotationEnabledZ);
compound.setBoolean("PuppetInterpolate", interpolate);
compound.setBoolean("PuppetAnimate", animate);
compound.setFloat("PuppetAnimSpeed", animRate);
return compound;
@@ -101,6 +103,11 @@ public class PlayerModelData implements IPlayerModelData {
rotationEnabledY = compound.getBoolean("PuppetRotationEnabledY");
rotationEnabledZ = compound.getBoolean("PuppetRotationEnabledZ");
if (!compound.hasKey("PuppetInterpolate")) {
interpolate = true;
} else {
interpolate = compound.getBoolean("PuppetInterpolate");
}
animate = compound.getBoolean("PuppetAnimate");
animRate = compound.getFloat("PuppetAnimSpeed");
}
@@ -121,6 +128,14 @@ public class PlayerModelData implements IPlayerModelData {
return this.animate;
}
public void setInterpolated(boolean interpolate) {
this.interpolate = interpolate;
}
public boolean isInterpolated() {
return this.interpolate;
}
public void setFullAngles(boolean limit) {
fullAngles = limit;
}
@@ -130,6 +145,8 @@ public class PlayerModelData implements IPlayerModelData {
}
public void setAnimRate(float animRate) {
if (animRate < 0)
animRate = 0;
this.animRate = animRate;
}
@@ -193,12 +193,27 @@ public class MixinModelRenderer {
this.rotateAngleZ = puppetPart.rotationZ * pi;
} else if (puppetPart.partialRotationTick != ClientEventHandler.partialRenderTick) {
puppetPart.partialRotationTick = ClientEventHandler.partialRenderTick;
if (puppetPart.rotationX * pi - this.rotateAngleX != 0)
this.rotateAngleX = (puppetPart.rotationX * pi - this.rotateAngleX) * modelData.animRate /10f + this.rotateAngleX;
if (puppetPart.rotationY * pi - this.rotateAngleY != 0)
this.rotateAngleY = (puppetPart.rotationY * pi - this.rotateAngleY) * modelData.animRate /10f + this.rotateAngleY;
if (puppetPart.rotationZ * pi - this.rotateAngleZ != 0)
this.rotateAngleZ = (puppetPart.rotationZ * pi - this.rotateAngleZ) * modelData.animRate /10f + this.rotateAngleZ;
if (modelData.interpolate) {
if (puppetPart.rotationX * pi - this.rotateAngleX != 0)
this.rotateAngleX = (puppetPart.rotationX * pi - this.rotateAngleX) * modelData.animRate / 10f + this.rotateAngleX;
if (puppetPart.rotationY * pi - this.rotateAngleY != 0)
this.rotateAngleY = (puppetPart.rotationY * pi - this.rotateAngleY) * modelData.animRate / 10f + this.rotateAngleY;
if (puppetPart.rotationZ * pi - this.rotateAngleZ != 0)
this.rotateAngleZ = (puppetPart.rotationZ * pi - this.rotateAngleZ) * modelData.animRate / 10f + this.rotateAngleZ;
} else {
int directionX = Float.compare(puppetPart.rotationX * pi, this.rotateAngleX);
this.rotateAngleX += directionX * modelData.animRate / 10f;
this.rotateAngleX = directionX == 1 ?
Math.min(puppetPart.rotationX * pi,this.rotateAngleX) : Math.max(puppetPart.rotationX * pi,this.rotateAngleX);
int directionY = Float.compare(puppetPart.rotationY * pi, this.rotateAngleY);
this.rotateAngleY += directionY * modelData.animRate / 10f;
this.rotateAngleY = directionY == 1 ?
Math.min(puppetPart.rotationY * pi,this.rotateAngleY) : Math.max(puppetPart.rotationY * pi,this.rotateAngleY);
int directionZ = Float.compare(puppetPart.rotationZ * pi, this.rotateAngleZ);
this.rotateAngleZ += directionZ * modelData.animRate / 10f;
this.rotateAngleZ = directionZ == 1 ?
Math.min(puppetPart.rotationZ * pi,this.rotateAngleZ) : Math.max(puppetPart.rotationZ * pi,this.rotateAngleZ);
}
}
}
@@ -216,12 +231,27 @@ public class MixinModelRenderer {
this.rotationPointZ = puppetPart.originalPivotZ + puppetPart.pivotZ;
} else if (puppetPart.partialPivotTick != ClientEventHandler.partialRenderTick) {
puppetPart.partialPivotTick = ClientEventHandler.partialRenderTick;
puppetPart.destPivotX = (puppetPart.pivotX - puppetPart.destPivotX) * modelData.animRate /10f + puppetPart.destPivotX;
this.rotationPointX = puppetPart.originalPivotX + puppetPart.destPivotX;
puppetPart.destPivotY = (puppetPart.pivotY - puppetPart.destPivotY) * modelData.animRate /10f + puppetPart.destPivotY;
this.rotationPointY = puppetPart.originalPivotY + puppetPart.destPivotY;
puppetPart.destPivotZ = (puppetPart.pivotZ - puppetPart.destPivotZ) * modelData.animRate /10f + puppetPart.destPivotZ;
this.rotationPointZ = puppetPart.originalPivotZ + puppetPart.destPivotZ;
if (modelData.interpolate) {
puppetPart.destPivotX = (puppetPart.pivotX - puppetPart.destPivotX) * modelData.animRate / 10f + puppetPart.destPivotX;
this.rotationPointX = puppetPart.originalPivotX + puppetPart.destPivotX;
puppetPart.destPivotY = (puppetPart.pivotY - puppetPart.destPivotY) * modelData.animRate / 10f + puppetPart.destPivotY;
this.rotationPointY = puppetPart.originalPivotY + puppetPart.destPivotY;
puppetPart.destPivotZ = (puppetPart.pivotZ - puppetPart.destPivotZ) * modelData.animRate / 10f + puppetPart.destPivotZ;
this.rotationPointZ = puppetPart.originalPivotZ + puppetPart.destPivotZ;
} else {
int directionX = Float.compare(puppetPart.pivotX, this.rotationPointX);
this.rotationPointX = puppetPart.originalPivotX + directionX * modelData.animRate / 10f;
this.rotationPointX = directionX == 1 ?
Math.min(puppetPart.originalPivotX + puppetPart.pivotX,this.rotationPointX) : Math.max(puppetPart.originalPivotX + puppetPart.pivotX,this.rotationPointX);
int directionY = Float.compare(puppetPart.pivotY, this.rotationPointY);
this.rotationPointY = puppetPart.originalPivotY + directionY * modelData.animRate / 10f;
this.rotationPointY = directionY == 1 ?
Math.min(puppetPart.originalPivotY + puppetPart.pivotY,this.rotationPointY) : Math.max(puppetPart.originalPivotY + puppetPart.pivotY,this.rotationPointY);
int directionZ = Float.compare(puppetPart.pivotZ, this.rotationPointZ);
this.rotationPointZ = puppetPart.originalPivotZ + directionZ * modelData.animRate / 10f;
this.rotationPointZ = directionZ == 1 ?
Math.min(puppetPart.originalPivotZ + puppetPart.pivotZ,this.rotationPointZ) : Math.max(puppetPart.originalPivotZ + puppetPart.pivotZ,this.rotationPointZ);
}
}
}