diff --git a/common/src/main/java/top/r3944realms/lib39/client/model/DollModel.java b/common/src/main/java/top/r3944realms/lib39/client/model/DollModel.java index e96d5a6..7cde471 100644 --- a/common/src/main/java/top/r3944realms/lib39/client/model/DollModel.java +++ b/common/src/main/java/top/r3944realms/lib39/client/model/DollModel.java @@ -9,6 +9,7 @@ import net.minecraft.client.model.geom.PartPose; import net.minecraft.client.model.geom.builders.*; import net.minecraft.client.renderer.RenderType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import top.r3944realms.lib39.Lib39; /** @@ -31,13 +32,56 @@ public class DollModel extends Model { private final ModelPart rightArmSlim; private final ModelPart leftArmSlim; private final ModelPart leftLeg; + @Nullable + private IDollPose currentPose; + /** + * Gets current pose. + * + * @return the current pose + */ + @Nullable + public IDollPose getCurrentPose() { + return currentPose; + } + + /** + * Sets doll pose. + * + * @param dollPose the doll pose + */ + public void setDollPose(@NotNull IDollPose dollPose) { + this.currentPose = dollPose; + this.head.loadPose(dollPose.getHeadPose()); + this.body.loadPose(dollPose.getBodyPose()); + this.rightArm.loadPose(dollPose.getRightArmPose()); + this.leftArm.loadPose(dollPose.getLeftArmPose()); + this.rightArmSlim.loadPose(dollPose.getRightArmPose()); + this.leftArmSlim.loadPose(dollPose.getLeftArmPose()); + this.rightLeg.loadPose(dollPose.getRightLegPose()); + this.leftLeg.loadPose(dollPose.getLeftLegPose()); + } + + /** + * Reset pose. + */ + public void resetPose() { + this.currentPose = DollPoses.DEFAULT; + this.head.resetPose(); + this.body.resetPose(); + this.rightArm.resetPose(); + this.leftArm.resetPose(); + this.rightArmSlim.resetPose(); + this.leftArmSlim.resetPose(); + this.rightLeg.resetPose(); + this.leftLeg.resetPose(); + } /** * Instantiates a new Doll model. * * @param root the root */ - public DollModel(ModelPart root) { + public DollModel(@NotNull ModelPart root) { super(RenderType::entityTranslucent); this.head = root.getChild("head"); this.body = root.getChild("body"); @@ -54,21 +98,104 @@ public class DollModel extends Model { * * @return the layer definition */ - public static LayerDefinition createBodyLayer() { + public static @NotNull LayerDefinition createBodyLayer() { + return createBodyLayer(DollPoses.DEFAULT); + } + + private static @NotNull LayerDefinition createBodyLayer(@NotNull IDollPose dollPoses) { MeshDefinition meshdefinition = new MeshDefinition(); PartDefinition partdefinition = meshdefinition.getRoot(); - partdefinition.addOrReplaceChild("head", CubeListBuilder.create().texOffs(0, 0).addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.0F)).texOffs(32, 0).addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.5F)), PartPose.offset(0.0F, 9.0F, 0.0F)); - partdefinition.addOrReplaceChild("body", CubeListBuilder.create().texOffs(16, 16).addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)).texOffs(16, 32).addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.25F)), PartPose.offset(0.0F, 9.0F, 0.0F)); - partdefinition.addOrReplaceChild("right_arm", CubeListBuilder.create().texOffs(40, 16).addBox(-3.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)).texOffs(40, 32).addBox(-3.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.25F)), PartPose.offsetAndRotation(-5.0F, 11.0F, 0.0F, 0.0F, 0.0F, 0.3927F)); - partdefinition.addOrReplaceChild("right_arm_slim", CubeListBuilder.create().texOffs(40, 16).addBox(-2.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)).texOffs(40, 32).addBox(-2.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F, new CubeDeformation(0.25F)), PartPose.offsetAndRotation(-5.0F, 11.0F, 0.0F, 0.0F, 0.0F, 0.3927F)); - partdefinition.addOrReplaceChild("left_arm_slim", CubeListBuilder.create().texOffs(32, 48).addBox(-1.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)).texOffs(48, 48).addBox(-1.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F, new CubeDeformation(0.25F)), PartPose.offsetAndRotation(5.0F, 11.0F, 0.0F, 0.0F, 0.0F, -0.3927F)); - partdefinition.addOrReplaceChild("left_arm", CubeListBuilder.create().texOffs(32, 48).addBox(-1.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)).texOffs(48, 48).addBox(-1.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.25F)), PartPose.offsetAndRotation(5.0F, 11.0F, 0.0F, 0.0F, 0.0F, -0.3927F)); - partdefinition.addOrReplaceChild("right_leg", CubeListBuilder.create().texOffs(0, 16).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)).texOffs(0, 32).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.25F)), PartPose.offsetAndRotation(-2.0F, 19.0F, -2.0F, -1.5708F, 0.3927F, 0.0F)); - partdefinition.addOrReplaceChild("left_leg", CubeListBuilder.create().texOffs(16, 48).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)).texOffs(0, 48).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.25F)), PartPose.offsetAndRotation(2.0F, 19.0F, -2.0F, -1.5708F, -0.3927F, 0.0F)); + partdefinition.addOrReplaceChild( + "head", + CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(32, 0) + .addBox( + -4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, + new CubeDeformation(0.5F) + ), dollPoses.getHeadPose() + ); + partdefinition.addOrReplaceChild( + "body", + CubeListBuilder.create() + .texOffs(16, 16) + .addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(16, 32) + .addBox( + -4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, + new CubeDeformation(0.25F) + ), dollPoses.getBodyPose() + ); + partdefinition.addOrReplaceChild( + "right_arm", + CubeListBuilder.create() + .texOffs(40, 16) + .addBox(-3.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(40, 32) + .addBox( + -3.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, + new CubeDeformation(0.25F) + ), dollPoses.getRightArmPose() + ); + partdefinition.addOrReplaceChild( + "right_arm_slim", + CubeListBuilder.create() + .texOffs(40, 16) + .addBox(-2.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(40, 32) + .addBox(-2.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F, + new CubeDeformation(0.25F) + ), dollPoses.getRightArmPose() + ); + partdefinition.addOrReplaceChild( + "left_arm_slim", + CubeListBuilder.create() + .texOffs(32, 48) + .addBox(-1.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(48, 48) + .addBox( + -1.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F, + new CubeDeformation(0.25F) + ), dollPoses.getLeftArmPose() + ); + partdefinition.addOrReplaceChild( + "left_arm", + CubeListBuilder.create() + .texOffs(32, 48) + .addBox(-1.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(48, 48) + .addBox( + -1.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, + new CubeDeformation(0.25F) + ), dollPoses.getLeftArmPose() + ); + partdefinition.addOrReplaceChild( + "right_leg", + CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(0, 32) + .addBox( + -2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.25F) + ), dollPoses.getRightLegPose() + ); + partdefinition.addOrReplaceChild( + "left_leg", + CubeListBuilder.create() + .texOffs(16, 48) + .addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)) + .texOffs(0, 48) + .addBox( + -2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, + new CubeDeformation(0.25F) + ), dollPoses.getLeftLegPose() + ); return LayerDefinition.create(meshdefinition, 64, 64); } + @Override public void renderToBuffer(PoseStack poseStack, @NotNull VertexConsumer vertexConsumer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { poseStack.pushPose(); diff --git a/common/src/main/java/top/r3944realms/lib39/client/model/DollPoses.java b/common/src/main/java/top/r3944realms/lib39/client/model/DollPoses.java new file mode 100644 index 0000000..e09429a --- /dev/null +++ b/common/src/main/java/top/r3944realms/lib39/client/model/DollPoses.java @@ -0,0 +1,93 @@ +package top.r3944realms.lib39.client.model; + +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import top.r3944realms.lib39.Lib39; + +/** + * The enum Doll poses. + */ +public enum DollPoses implements IDollPose{ + /** + * Default doll poses. + */ + DEFAULT( + "default", + PartPose.offset(0.0F, 9.0F, 0.0F), + PartPose.offset(0.0F, 9.0F, 0.0F), + PartPose.offsetAndRotation(-5.0F, 11.0F, 0.0F, 0.0F, 0.0F, 0.3927F), + PartPose.offsetAndRotation(5.0F, 11.0F, 0.0F, 0.0F, 0.0F, -0.3927F), + PartPose.offsetAndRotation(-2.0F, 19.0F, -2.0F, -1.5708F, 0.3927F, 0.0F), + PartPose.offsetAndRotation(2.0F, 19.0F, -2.0F, -1.5708F, -0.3927F, 0.0F) + ); + // 注册全局? + private final ResourceLocation id; + private final Vec3 offset; + private final PartPose headPose; + private final PartPose bodyPose; + private final PartPose rightArmPose; + private final PartPose leftArmPose; + private final PartPose rightLegPose; + private final PartPose leftLegPose; + + DollPoses(String name, PartPose headPose, PartPose bodyPose, + PartPose rightArmPose, PartPose leftArmPose, + PartPose rightLegPose, PartPose leftLegPose) { + this(name, Vec3.ZERO, headPose, bodyPose, rightArmPose, leftArmPose, rightLegPose, leftLegPose); + } + + DollPoses(String name, Vec3 offset, PartPose headPose, PartPose bodyPose, + PartPose rightArmPose, PartPose leftArmPose, + PartPose rightLegPose, PartPose leftLegPose) { + this.id = Lib39.rl(name); + this.offset = offset; + this.headPose = headPose; + this.bodyPose = bodyPose; + this.rightArmPose = rightArmPose; + this.leftArmPose = leftArmPose; + this.rightLegPose = rightLegPose; + this.leftLegPose = leftLegPose; + } + + @Override + public @NotNull ResourceLocation getId() { + return id; + } + + @Override + public PartPose getHeadPose() { + return headPose; + } + + @Override + public PartPose getBodyPose() { + return bodyPose; + } + + @Override + public PartPose getRightArmPose() { + return rightArmPose; + } + + @Override + public PartPose getLeftArmPose() { + return leftArmPose; + } + + @Override + public PartPose getRightLegPose() { + return rightLegPose; + } + + @Override + public PartPose getLeftLegPose() { + return leftLegPose; + } + + @Override + public @NotNull Vec3 getTotalOffset() { + return offset; + } +} diff --git a/common/src/main/java/top/r3944realms/lib39/client/model/IDollPose.java b/common/src/main/java/top/r3944realms/lib39/client/model/IDollPose.java new file mode 100644 index 0000000..dfaf12a --- /dev/null +++ b/common/src/main/java/top/r3944realms/lib39/client/model/IDollPose.java @@ -0,0 +1,69 @@ +package top.r3944realms.lib39.client.model; + +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; + +/** + * The interface Doll pose. + */ +public interface IDollPose { + /** + * Gets id. + * + * @return the id + */ + @NotNull ResourceLocation getId(); + + /** + * Gets total offset. + * + * @return the total offset + */ + @NotNull default Vec3 getTotalOffset() { + return Vec3.ZERO; + } + + /** + * Gets head pose. + * + * @return the head pose + */ + @NotNull PartPose getHeadPose(); + + /** + * Gets body pose. + * + * @return the body pose + */ + @NotNull PartPose getBodyPose(); + + /** + * Gets right arm pose. + * + * @return the right arm pose + */ + @NotNull PartPose getRightArmPose(); + + /** + * Gets left arm pose. + * + * @return the left arm pose + */ + @NotNull PartPose getLeftArmPose(); + + /** + * Gets right leg pose. + * + * @return the right leg pose + */ + @NotNull PartPose getRightLegPose(); + + /** + * Gets left leg pose. + * + * @return the left leg pose + */ + @NotNull PartPose getLeftLegPose(); +}