Draw the player preview at a given yaw

EntityDrawerImpl follows common's new EntityDrawer contract: it draws the
player filling the preview box, turned by the yaw the cosmetics screen's
drag sets, and returns false when there's no player. The angle no longer
follows the cursor.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-09-27 17:33:25 +02:00
co-authored by claude
parent fbd0e23fb3
commit f69c379ae1
@@ -7,7 +7,6 @@ import org.jetbrains.annotations.Nullable;
import org.joml.Quaternionf; import org.joml.Quaternionf;
import org.joml.Vector3f; import org.joml.Vector3f;
import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.ui.ElementContext;
import org.saturnclient.ui.RenderScope; import org.saturnclient.ui.RenderScope;
import org.saturnclient.ui.components.SkinPreview.EntityDrawer; import org.saturnclient.ui.components.SkinPreview.EntityDrawer;
@@ -21,33 +20,32 @@ import net.minecraft.entity.LivingEntity;
public class EntityDrawerImpl implements EntityDrawer { public class EntityDrawerImpl implements EntityDrawer {
@Override @Override
public void render(RenderScope renderScope, boolean negativeAngle, float angle, float scale, ElementContext ctx) { public boolean render(RenderScope renderScope, int width, int height, float yaw) {
LivingEntity entity = SaturnClient.client.player; LivingEntity entity = SaturnClient.client.player;
if (entity != null) { if (entity == null) {
drawEntity(renderScope, 0, 0, 75, 78, 30, 0.0625F, ctx.mouseX / scale, ctx.mouseY / scale, return false;
SaturnClient.client.player);
} }
// The player is about 1.8 blocks tall; leave some room above and below.
drawEntity(renderScope, 0, 0, width, height, (int) (height / 2.2F), 0.0625F, yaw, entity);
return true;
} }
// Draws the entity in the box, turned by yaw degrees (0 faces the viewer) with its head straight.
public static void drawEntity(RenderScope renderScope, int x1, int y1, int x2, int y2, int size, float scale, public static void drawEntity(RenderScope renderScope, int x1, int y1, int x2, int y2, int size, float scale,
float mouseX, float mouseY, LivingEntity entity) { float yaw, LivingEntity entity) {
float f = (float) (x1 + x2) / 2.0F;
float g = (float) (y1 + y2) / 2.0F;
renderScope.enableScissor(x1, y1, x2, y2); renderScope.enableScissor(x1, y1, x2, y2);
float h = (float) Math.atan((double) ((f - mouseX) / 40.0F));
float i = (float) Math.atan((double) ((g - mouseY) / 40.0F));
Quaternionf quaternionf = (new Quaternionf()).rotateZ((float) Math.PI); Quaternionf quaternionf = (new Quaternionf()).rotateZ((float) Math.PI);
Quaternionf quaternionf2 = (new Quaternionf()).rotateX(i * 20.0F * ((float) Math.PI / 180F)); Quaternionf quaternionf2 = new Quaternionf();
quaternionf.mul(quaternionf2);
float j = entity.bodyYaw; float j = entity.bodyYaw;
float k = entity.getYaw(); float k = entity.getYaw();
float l = entity.getPitch(); float l = entity.getPitch();
float m = entity.lastHeadYaw; float m = entity.lastHeadYaw;
float n = entity.headYaw; float n = entity.headYaw;
entity.bodyYaw = 180.0F + h * 20.0F; entity.bodyYaw = 180.0F + yaw;
entity.setYaw(180.0F + h * 40.0F); entity.setYaw(180.0F + yaw);
entity.setPitch(-i * 20.0F); entity.setPitch(0.0F);
entity.headYaw = entity.getYaw(); entity.headYaw = entity.getYaw();
entity.lastHeadYaw = entity.getYaw(); entity.lastHeadYaw = entity.getYaw();
float o = entity.getScale(); float o = entity.getScale();
@@ -83,7 +81,6 @@ public class EntityDrawerImpl implements EntityDrawer {
import org.joml.Quaternionf; import org.joml.Quaternionf;
import org.joml.Vector3f; import org.joml.Vector3f;
import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.saturnclient.SaturnClient;
import org.saturnclient.ui.ElementContext;
import org.saturnclient.ui.RenderScope; import org.saturnclient.ui.RenderScope;
import org.saturnclient.ui.components.SkinPreview.EntityDrawer; import org.saturnclient.ui.components.SkinPreview.EntityDrawer;
@@ -92,14 +89,12 @@ import net.minecraft.client.render.entity.EntityRenderDispatcher;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
public class EntityDrawerImpl implements EntityDrawer { public class EntityDrawerImpl implements EntityDrawer {
// Draws the entity in the box, turned by yaw degrees (0 faces the viewer) with its head straight.
public static void drawEntity(RenderScope renderScope, int x1, int y1, int x2, int y2, int size, float f, public static void drawEntity(RenderScope renderScope, int x1, int y1, int x2, int y2, int size, float f,
float mouseX, float yaw, LivingEntity entity) {
float mouseY, LivingEntity entity, float angle, boolean negativeAngle) {
float g = (float) (x1 + x2) / 2.0F; float g = (float) (x1 + x2) / 2.0F;
float h = (float) (y1 + y2) / 2.0F; float h = (float) (y1 + y2) / 2.0F;
renderScope.enableScissor(0, 6, x2, y2); renderScope.enableScissor(x1, y1, x2, y2);
float i = (float) Math.atan((double) ((g - mouseX) / 40.0F));
float j = (float) Math.atan((double) ((h - mouseY) / 40.0F));
Quaternionf quaternionf = (new Quaternionf()).rotateZ(3.1415927F); Quaternionf quaternionf = (new Quaternionf()).rotateZ(3.1415927F);
float k = entity.bodyYaw; float k = entity.bodyYaw;
float l = entity.getYaw(); float l = entity.getYaw();
@@ -109,10 +104,10 @@ public class EntityDrawerImpl implements EntityDrawer {
//? if <1.21.5 //? if <1.21.5
//float n = entity.prevHeadYaw; //float n = entity.prevHeadYaw;
float o = entity.headYaw; float o = entity.headYaw;
entity.setYaw(angle); entity.setYaw(180.0F + yaw);
entity.bodyYaw = angle; entity.bodyYaw = 180.0F + yaw;
entity.setPitch(-(j * 20.0F)); entity.setPitch(0.0F);
entity.headYaw = negativeAngle ? (i * 40.0F) + 180f : -(i * 40.0F); entity.headYaw = entity.getYaw();
//? if >=1.21.5 //? if >=1.21.5
entity.lastHeadYaw = entity.getHeadYaw(); entity.lastHeadYaw = entity.getHeadYaw();
//? if <1.21.5 //? if <1.21.5
@@ -166,12 +161,15 @@ public class EntityDrawerImpl implements EntityDrawer {
} }
@Override @Override
public void render(RenderScope renderScope, boolean negativeAngle, float angle, float scale, ElementContext ctx) { public boolean render(RenderScope renderScope, int width, int height, float yaw) {
LivingEntity entity = SaturnClient.client.player; LivingEntity entity = SaturnClient.client.player;
if (entity != null) { if (entity == null) {
drawEntity(renderScope, 0, 0, 75, 78, 30, 0.0625F, ctx.mouseX / scale, ctx.mouseY / scale, entity, angle, return false;
negativeAngle);
} }
// The player is about 1.8 blocks tall; leave some room above and below.
drawEntity(renderScope, 0, 0, width, height, (int) (height / 2.2F), 0.0625F, yaw, entity);
return true;
} }
} }
*///?} *///?}