From 70666c8cc6c3153b28dfd069c1e81c89d380cff0 Mon Sep 17 00:00:00 2001 From: 3944Realms Date: Wed, 24 Jun 2026 08:09:29 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=91=8A=E7=A4=BA=E7=89=8C=E7=94=B2?= =?UTF-8?q?=E6=B8=B2=E6=9F=93=E9=87=8D=E6=9E=84):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model_source/blender/kneel_display_rack.blend | Bin 1839785 -> 1847705 bytes .../blender/kneel_display_rack.blend1 | Bin 2159197 -> 1839785 bytes .../client/renderer/armor/SignArmorLayer.java | 194 ++++++++++++++++ .../renderer/armor/SignArmorRenderer.java | 199 ++++++++-------- .../renderer/item/SignArmorItemRenderer.java | 215 ++++++++++-------- .../content/item/SignArmorItem.java | 8 +- .../minecraft/MixinLivingEntityRenderer.java | 40 ++++ .../resources/eroticdungeongame.mixins.json | 1 + 8 files changed, 465 insertions(+), 192 deletions(-) create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/client/renderer/armor/SignArmorLayer.java create mode 100644 src/main/java/top/r3944realms/eroticdungeongame/mixin/minecraft/MixinLivingEntityRenderer.java diff --git a/model_source/blender/kneel_display_rack.blend b/model_source/blender/kneel_display_rack.blend index 15d19cb562dba1002491a35acc3980e05320ff95..603465a24220a88f078b074f6f1f29dae6742242 100644 GIT binary patch delta 10181 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 delta 9954 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 S7qbs@7Ut~ufxbB%u73l5RH?uK diff --git a/model_source/blender/kneel_display_rack.blend1 b/model_source/blender/kneel_display_rack.blend1 index 75cf99b578d03d334980a933ff3a946af024b1aa..15d19cb562dba1002491a35acc3980e05320ff95 100644 GIT binary patch delta 75982 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

mw}tsWr5Nlc{NZi6~SC&(GY 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�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 diff --git a/src/main/java/top/r3944realms/eroticdungeongame/client/renderer/armor/SignArmorLayer.java b/src/main/java/top/r3944realms/eroticdungeongame/client/renderer/armor/SignArmorLayer.java new file mode 100644 index 00000000..5f971a2b --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/client/renderer/armor/SignArmorLayer.java @@ -0,0 +1,194 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.r3944realms.eroticdungeongame.client.renderer.armor; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.properties.WoodType; +import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoRenderer; +import top.r3944realms.eroticdungeongame.content.item.SignArmorItem; + +import java.util.HashMap; +import java.util.Map; + +public class SignArmorLayer extends RenderLayer> { + + // ==================== 可配置的旋转限制 ==================== + + /** 垂直速度缩放 */ + private static final float VERTICAL_SCALE = 10.0F; + /** 垂直旋转钳制 [min, max] 度 */ + private static final float VERTICAL_CLAMP_MIN = -6.0F; + private static final float VERTICAL_CLAMP_MAX = 32.0F; + + /** 前进速度缩放 */ + private static final float FORWARD_SCALE = 100.0F; + /** 前进旋转钳制 [min, max] 度 */ + private static final float FORWARD_CLAMP_MIN = 0.0F; + private static final float FORWARD_CLAMP_MAX = 150.0F; + + /** 侧向速度缩放 */ + private static final float SIDEWAYS_SCALE = 100.0F; + /** 侧向旋转钳制 [min, max] 度 */ + private static final float SIDEWAYS_CLAMP_MIN = -20.0F; + private static final float SIDEWAYS_CLAMP_MAX = 20.0F; + + /** 基准俯仰角(负值=后仰远离身体) */ + private static final float BASE_PITCH_DEG = -7.5F; + + /** 旋转除数 */ + private static final float FORWARD_DIVISOR = 2.0F; + private static final float SIDEWAYS_DIVISOR = 2.0F; + private static final float YAW_BASE_DEG = 180.0F; + + /** 走路弹跳幅度 */ + private static final float WALK_BOB_SCALE = 32.0F; + /** 蹲下附加上仰 */ + private static final float CROUCH_BONUS = 25.0F; + + /** 旋转平滑系数 (0=无平滑, 1=完全不更新) */ + private static final float SMOOTHING = 0.5F; + + private static final float BASE_YP_ROTATION = 180F; + + private static final double BASE_X_TRANS = 0; + private static final double BASE_Y_TRANS = -1.5D; + private static final double BASE_Z_TRANS = 0; + + + + // ==================== 实现 ==================== + + private static final Map RENDERERS = new HashMap<>(); + private float smoothPitch, smoothRoll, smoothYaw; + + public SignArmorLayer(RenderLayerParent> parent) { + super(parent); + } + + @Override + public void render(@NotNull PoseStack poseStack, @NotNull MultiBufferSource buffer, int packedLight, + LivingEntity entity, float limbSwing, float limbSwingAmount, + float partialTick, float ageInTicks, float netHeadYaw, float headPitch) { + ItemStack chest = entity.getItemBySlot(EquipmentSlot.CHEST); + if (!(chest.getItem() instanceof SignArmorItem signItem)) return; + + // 模型必须有 body 部分才渲染(即 HumanoidModel 子类) + EntityModel parentModel = getParentModel(); + if (!(parentModel instanceof HumanoidModel humanoidModel)) return; + + SignArmorRenderer renderer = RENDERERS.computeIfAbsent( + signItem.getWoodType(), SignArmorRenderer::new); + + // CapeLayer 式物理 → bipedBody 骨骼旋转 + applyCapeLayerPhysics(entity, partialTick, limbSwing, limbSwingAmount, renderer); + + renderer.prepForRender(entity, chest, EquipmentSlot.CHEST, humanoidModel); + // 手动触发文字准备 (renderRecursively 绕过 preRender) + renderer.prepareSignText(signItem); + + poseStack.pushPose(); + humanoidModel.body.translateAndRotate(poseStack); + // GeckoLib armor 内部坐标系矫正 (GeoArmorRenderer.render 默认应用此变换) + poseStack.scale(-1, -1, 1); + poseStack.mulPose(Axis.YP.rotationDegrees(BASE_YP_ROTATION)); + poseStack.translate(BASE_X_TRANS, BASE_Y_TRANS, BASE_Z_TRANS); + + + GeoRenderer gr = renderer; + ResourceLocation modelRes = renderer.getGeoModel().getModelResource(signItem); + BakedGeoModel baked = renderer.getGeoModel().getBakedModel(modelRes); + RenderType rt = RenderType.entityCutoutNoCull( + renderer.getGeoModel().getTextureResource(signItem)); + VertexConsumer vc = buffer.getBuffer(rt); + + for (GeoBone topBone : baked.topLevelBones()) { + gr.renderRecursively(poseStack, signItem, topBone, rt, buffer, vc, + false, partialTick, packedLight, OverlayTexture.NO_OVERLAY, + 1, 1, 1, 1); + } + poseStack.popPose(); + } + + /** + * 基于 CapeLayer 的速度分解物理。 + * 对 LivingEntity 使用通用字段 (yBodyRot, walkDist, xo/yo/zo), + * 走路弹跳使用传入的 limbSwing 参数代替 Player 专属的 bob。 + */ + private void applyCapeLayerPhysics(@NotNull LivingEntity entity, float partialTick, + float limbSwing, float limbSwingAmount, + SignArmorRenderer renderer) { + float bodyYaw = Mth.rotLerp(partialTick, entity.yBodyRotO, entity.yBodyRot); + float yawRad = bodyYaw * Mth.DEG_TO_RAD; + double sin = Mth.sin(yawRad); + double cos = -Mth.cos(yawRad); + + double dx = entity.getX() - entity.xo; + double dy = entity.getY() - entity.yo; + double dz = entity.getZ() - entity.zo; + + float forward = (float) (dx * sin + dz * cos) * FORWARD_SCALE; + forward = Mth.clamp(forward, FORWARD_CLAMP_MIN, FORWARD_CLAMP_MAX); + if (forward < 0.0F) forward = 0.0F; + + float sideways = (float) (dx * cos - dz * sin) * SIDEWAYS_SCALE; + sideways = Mth.clamp(sideways, SIDEWAYS_CLAMP_MIN, SIDEWAYS_CLAMP_MAX); + + float vertical = (float) dy * VERTICAL_SCALE; + vertical = Mth.clamp(vertical, VERTICAL_CLAMP_MIN, VERTICAL_CLAMP_MAX); + + // 走路弹跳:使用 limbSwing 和 walkDist + float walkDist = Mth.lerp(partialTick, entity.walkDistO, entity.walkDist); + float bobAmount = Math.min(limbSwingAmount * 1.5F, 1.0F); + vertical += Mth.sin(walkDist * 6.0F) * WALK_BOB_SCALE * bobAmount; + + if (entity.isCrouching()) { + vertical += CROUCH_BONUS; + } + + float targetPitch = BASE_PITCH_DEG + forward / FORWARD_DIVISOR + vertical; + float targetRoll = sideways / SIDEWAYS_DIVISOR; + float targetYaw = YAW_BASE_DEG - sideways / SIDEWAYS_DIVISOR; + + float a = SMOOTHING; + smoothPitch = Mth.lerp(a, smoothPitch, targetPitch); + smoothRoll = Mth.lerp(a, smoothRoll, targetRoll); + smoothYaw = Mth.lerp(a, smoothYaw, targetYaw); + + renderer.getGeoModel().getBone("bipedBody").ifPresent(b -> { + b.setRotX(smoothPitch * Mth.DEG_TO_RAD); + b.setRotY(smoothYaw * Mth.DEG_TO_RAD); + b.setRotZ(smoothRoll * Mth.DEG_TO_RAD); + }); + } +} diff --git a/src/main/java/top/r3944realms/eroticdungeongame/client/renderer/armor/SignArmorRenderer.java b/src/main/java/top/r3944realms/eroticdungeongame/client/renderer/armor/SignArmorRenderer.java index d6f269b7..51276787 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/client/renderer/armor/SignArmorRenderer.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/client/renderer/armor/SignArmorRenderer.java @@ -16,6 +16,7 @@ package top.r3944realms.eroticdungeongame.client.renderer.armor; +import com.github.tartaricacid.touhoulittlemaid.geckolib3.geo.raw.pojo.Bone; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Axis; @@ -24,8 +25,11 @@ import net.minecraft.client.gui.Font; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.util.FormattedCharSequence; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.entity.SignText; import net.minecraft.world.level.block.state.properties.WoodType; +import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import software.bernie.geckolib.cache.object.BakedGeoModel; @@ -36,16 +40,38 @@ import top.r3944realms.eroticdungeongame.content.item.SignArmorItem; import top.r3944realms.eroticdungeongame.util.ColorUtil; import java.util.List; +import java.util.Map; import java.util.Optional; +import java.util.WeakHashMap; +import java.util.function.Consumer; public class SignArmorRenderer extends GeoArmorRenderer { private static final float TEXT_SCALE = 0.015625F * 0.9f; - private static final float TEXT_Y_OFFSET = 51; - private static final float TEXT_Z_OFFSET = -14.2f; private static final float LINE_HEIGHT = 9.5F; - private float crouchingYOffset = 0; - private boolean isCrouching; - private boolean init; + + // 文字在 bone 局部空间的偏移(手调值,对应牌面在 bone pivot 的相对位置) + // bone pivot = [0, 24, 0], board face center ≈ [0, 21, -2.025] + // 相对 pivot = [0, -3, -2.025] BB单位 → /16 → /TEXT_SCALE → 手调修正 + private static final float BONE_LOCAL_TEXT_Y = (-3f / 16f) / TEXT_SCALE - 43; + private static final float BONE_LOCAL_TEXT_Z = (-2.025f / 16f) / TEXT_SCALE + 30; + private static final float BONE_ROTATE_XP = 7.5f; + + private float crouchingYOffset; + + private FormattedCharSequence[] signMessages; + private boolean signHasGlowingText; + private int signTextColor; + private int signDarkColor; + + private static class CapePhysics { + Vec3 prevPos = Vec3.ZERO; + float prevYRot; + float accYaw, accPitch, accRoll; + float targetYaw, targetPitch, targetRoll; + float walkTime; + boolean wasOnGround; + } + public SignArmorRenderer(WoodType woodType) { super(new SignArmorModel(woodType)); } @@ -57,114 +83,109 @@ public class SignArmorRenderer extends GeoArmorRenderer { float red, float green, float blue, float alpha) { super.preRender(poseStack, animatable, model, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); + if (currentEntity != null && currentEntity.isCrouching()) { crouchingYOffset = -4.5f; - isCrouching = true; - Optional bipedBody = this.model.getBone("bipedBody"); - bipedBody.ifPresent(geoBone -> geoBone.setPosY(crouchingYOffset)); + this.model.getBone("bipedBody") + .ifPresent(geoBone -> geoBone.setPosY(crouchingYOffset)); } else { crouchingYOffset = 0; - isCrouching = false; } + + prepareSignText(animatable); } @Override - public void actuallyRender(PoseStack poseStack, SignArmorItem animatable, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, red, green, blue, alpha); - // 后渲染文字 - renderSignText(animatable, poseStack, bufferSource, packedLight, animatable.getTextLineHeight(), animatable.getMaxTextLineWidth()); + public void renderRecursively(PoseStack poseStack, SignArmorItem animatable, GeoBone bone, + RenderType renderType, MultiBufferSource bufferSource, + VertexConsumer buffer, boolean isReRender, float partialTick, + int packedLight, int packedOverlay, + float red, float green, float blue, float alpha) { + super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, + buffer, isReRender, partialTick, packedLight, packedOverlay, + red, green, blue, alpha); + + if ("bone".equals(bone.getName()) && signMessages != null) { + renderSignTextInBoneSpace(poseStack, bufferSource, packedLight); + } } - private void renderSignText(@NotNull SignArmorItem armorItem, PoseStack poseStack, - MultiBufferSource bufferSource, int packedLight, int lineHeight, int maxWidth) { - SignText signText = armorItem.getSignText(currentStack); - if (signText == null) { - return; - } + // ==================== 文字渲染 ==================== - // 检查是否有任何文字 - boolean hasText = false; + void prepareSignText(SignArmorItem armorItem) { + SignText signText = armorItem.getSignText(currentStack); + if (signText == null) { signMessages = null; return; } + boolean any = false; for (int i = 0; i < 4; i++) { - if (!signText.getMessage(i, false).getString().isEmpty()) { - hasText = true; - break; - } + if (!signText.getMessage(i, false).getString().isEmpty()) { any = true; break; } } - if (!hasText) return; + if (!any) { signMessages = null; return; } + + signHasGlowingText = signText.hasGlowingText(); + signDarkColor = ColorUtil.getDarkColor(signText); + signTextColor = signHasGlowingText ? signText.getColor().getTextColor() : signDarkColor; Minecraft mc = Minecraft.getInstance(); Font font = mc.font; + int maxWidth = armorItem.getMaxTextLineWidth(); + FormattedCharSequence[] msgs = signText.getRenderMessages(mc.isTextFilteringEnabled(), split -> { + List l = font.split(split, maxWidth); + return l.isEmpty() ? FormattedCharSequence.EMPTY : l.get(0); + }); + signMessages = new FormattedCharSequence[4]; + for (int i = 0; i < 4; i++) { + signMessages[i] = msgs[i] != null ? msgs[i] : null; + } + } + + /** + * 在 bone 骨骼局部空间中渲染文字。 + * PoseStack 已累积了 bipedBody → bone 的完整层级变换(含任意角度骨骼旋转), + * 此处的 translate 在已旋转空间中位移至牌面位置,无需手动 mulPose。 + */ + private void renderSignTextInBoneSpace(PoseStack poseStack, MultiBufferSource bufferSource, int packedLight) { + if (signMessages == null) return; + + Minecraft mc = Minecraft.getInstance(); + Font font = mc.font; + int light = signHasGlowingText ? 15728880 : packedLight; poseStack.pushPose(); - poseStack.scale(TEXT_SCALE, TEXT_SCALE, TEXT_SCALE); - poseStack.mulPose(Axis.XP.rotationDegrees(-7.5f)); - poseStack.translate(0, TEXT_Y_OFFSET, TEXT_Z_OFFSET); - if(isCrouching) { - poseStack.translate(0, - (crouchingYOffset*4.5), 3.2); - } - - // 发光文字使用高亮度 - int light = signText.hasGlowingText() ? 15728880 : packedLight; + poseStack.scale(-TEXT_SCALE, -TEXT_SCALE, -TEXT_SCALE); + poseStack.translate(0, BONE_LOCAL_TEXT_Y, BONE_LOCAL_TEXT_Z); + poseStack.mulPose(Axis.XP.rotationDegrees(BONE_ROTATE_XP)); for (int i = 0; i < 4; i++) { - if (!signText.getMessage(i, false).getString().isEmpty()) { - break; + FormattedCharSequence message = signMessages[i]; + if (message == null) continue; + + float x = -font.width(message) / 2f; + float y = i * LINE_HEIGHT - 4 * LINE_HEIGHT / 2f; + + if (signHasGlowingText) { + font.drawInBatch8xOutline( + message, x, y, signTextColor, signDarkColor, + poseStack.last().pose(), bufferSource, light); + } else { + font.drawInBatch( + message, x, y, signTextColor, + false, poseStack.last().pose(), bufferSource, + Font.DisplayMode.POLYGON_OFFSET, 0, light); } } - - // 获取文字颜色(原版使用 getDarkColor) - int darkColor = ColorUtil.getDarkColor(signText); - - // 获取渲染用的文字行(原版使用 getRenderMessages) - FormattedCharSequence[] renderMessages = signText.getRenderMessages(Minecraft.getInstance().isTextFilteringEnabled(), (split) -> { - List list = font.split(split, maxWidth); - return list.isEmpty() ? FormattedCharSequence.EMPTY : list.get(0); - }); - - // 确定是否使用发光文字 - boolean hasGlowingText = signText.hasGlowingText(); - int glowLight = hasGlowingText ? 15728880 : packedLight; - int textColor = hasGlowingText ? signText.getColor().getTextColor() : darkColor; - - // 渲染4行文字(原版循环) - for (int line = 0; line < 4; line++) { - FormattedCharSequence formattedText = renderMessages[line]; - if (formattedText != null) { - // 计算X轴偏移(居中) - float xOffset = (float)(-font.width(formattedText) / 2); - // 计算Y轴偏移(原版公式) - float yOffset = line * LINE_HEIGHT - 4 * LINE_HEIGHT / 2; - - if (hasGlowingText) { - // 发光文字 - font.drawInBatch8xOutline( - formattedText, - xOffset, yOffset, - textColor, // 内部颜色 - darkColor, // 轮廓颜色 - poseStack.last().pose(), - bufferSource, - glowLight - ); - } else { - // 普通文字 - font.drawInBatch( - formattedText, - xOffset, yOffset, - textColor, - false, - poseStack.last().pose(), - bufferSource, - Font.DisplayMode.POLYGON_OFFSET, - 0, - packedLight - ); - } - } - } poseStack.popPose(); } - + @Override + public void actuallyRender(PoseStack poseStack, SignArmorItem animatable, BakedGeoModel model, + RenderType renderType, MultiBufferSource bufferSource, + VertexConsumer buffer, boolean isReRender, float partialTick, + int packedLight, int packedOverlay, + float red, float green, float blue, float alpha) { + super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, + buffer, isReRender, partialTick, packedLight, packedOverlay, + red, green, blue, alpha); + signMessages = null; + } } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/client/renderer/item/SignArmorItemRenderer.java b/src/main/java/top/r3944realms/eroticdungeongame/client/renderer/item/SignArmorItemRenderer.java index ec31ebc1..69c5b5ae 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/client/renderer/item/SignArmorItemRenderer.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/client/renderer/item/SignArmorItemRenderer.java @@ -17,28 +17,44 @@ package top.r3944realms.eroticdungeongame.client.renderer.item; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Axis; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; -import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.entity.ItemRenderer; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.network.chat.Style; +import net.minecraft.client.renderer.RenderType; import net.minecraft.util.FormattedCharSequence; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.SignText; import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoItemRenderer; +import top.r3944realms.eroticdungeongame.client.model.item.SignArmorModel; import top.r3944realms.eroticdungeongame.content.item.SignArmorItem; import top.r3944realms.eroticdungeongame.util.ColorUtil; -public class SignArmorItemRenderer extends BlockEntityWithoutLevelRenderer { +import java.util.List; +import java.util.Optional; + +public class SignArmorItemRenderer extends GeoItemRenderer { + private static final float TEXT_SCALE = 0.015625F * 0.9f; + private static final float LINE_HEIGHT = 9.5F; + private static final float BONE_ROTATE_XP = 7.5f; + + // 文字在 bone 局部空间的偏移(bone pivot [0,24,0], face cube [0,21,-2.025]) + private static final float BONE_LOCAL_TEXT_Y = (-3f / 16f) / TEXT_SCALE - 43; + private static final float BONE_LOCAL_TEXT_Z = (-2.025f / 16f) / TEXT_SCALE + 30; + private final SignArmorItem item; + private FormattedCharSequence[] signMessages; + private boolean signHasGlowingText; + private int signTextColor; + private int signDarkColor; public SignArmorItemRenderer(SignArmorItem item) { - super(Minecraft.getInstance().getBlockEntityRenderDispatcher(), - Minecraft.getInstance().getEntityModels()); + super(new SignArmorModel(item.getWoodType())); this.item = item; } @@ -46,114 +62,119 @@ public class SignArmorItemRenderer extends BlockEntityWithoutLevelRenderer { public void renderByItem(@NotNull ItemStack stack, @NotNull ItemDisplayContext transformType, @NotNull PoseStack poseStack, @NotNull MultiBufferSource bufferSource, int packedLight, int packedOverlay) { - - // 1. 渲染原版 JSON 模型 - Minecraft mc = Minecraft.getInstance(); - ItemRenderer itemRenderer = mc.getItemRenderer(); - BakedModel bakedModel = itemRenderer.getModel(stack, null, null, 0); - - // 使用原版渲染器渲染模型 - itemRenderer.render(stack, transformType, false, poseStack, bufferSource, packedLight, packedOverlay, bakedModel); - - // 2. 在模型之上渲染文字 - renderSignText(stack, transformType, poseStack, bufferSource, packedLight); + prepareSignText(stack); + super.renderByItem(stack, transformType, poseStack, bufferSource, packedLight, packedOverlay); + signMessages = null; } - private void renderSignText(ItemStack stack, ItemDisplayContext transformType, - PoseStack poseStack, MultiBufferSource bufferSource, int packedLight) { - SignText signText = item.getSignText(stack); - if (signText == null) return; + @Override + public void actuallyRender(PoseStack poseStack, SignArmorItem animatable, BakedGeoModel model, + RenderType renderType, MultiBufferSource bufferSource, + VertexConsumer buffer, boolean isReRender, float partialTick, + int packedLight, int packedOverlay, + float red, float green, float blue, float alpha) { + super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, + buffer, isReRender, partialTick, packedLight, packedOverlay, + red, green, blue, alpha); - // 检查是否有文字内容 - boolean hasText = false; - for (int i = 0; i < 4; i++) { - if (!signText.getMessage(i, false).getString().isEmpty()) { - hasText = true; - break; - } + // 直接在模型渲染完成后渲染文字 + if (signMessages != null) { + renderSignTextOnBone(poseStack, model, bufferSource, packedLight); } - if (!hasText) return; + } + + private void prepareSignText(ItemStack stack) { + SignText signText = item.getSignText(stack); + if (signText == null) { signMessages = null; return; } + boolean any = false; + for (int i = 0; i < 4; i++) { + if (!signText.getMessage(i, false).getString().isEmpty()) { any = true; break; } + } + if (!any) { signMessages = null; return; } + + signHasGlowingText = signText.hasGlowingText(); + signDarkColor = ColorUtil.getDarkColor(signText); + signTextColor = signHasGlowingText ? signText.getColor().getTextColor() : signDarkColor; Minecraft mc = Minecraft.getInstance(); Font font = mc.font; + int maxWidth = item.getMaxTextLineWidth(); + FormattedCharSequence[] msgs = signText.getRenderMessages(mc.isTextFilteringEnabled(), split -> { + List l = font.split(split, maxWidth); + return l.isEmpty() ? FormattedCharSequence.EMPTY : l.get(0); + }); + signMessages = new FormattedCharSequence[4]; + for (int i = 0; i < 4; i++) { + signMessages[i] = msgs[i] != null ? msgs[i] : null; + } + } + + /** + * 从 BakedGeoModel 找到 "bone" 骨骼,在其局部空间渲染文字。 + * 手动遍历骨骼层级累积变换矩阵,不依赖 renderRecursively 回调。 + */ + private void renderSignTextOnBone(PoseStack poseStack, BakedGeoModel model, + MultiBufferSource bufferSource, int packedLight) { + for (GeoBone topBone : model.topLevelBones()) { + findAndRenderOnBone(poseStack, topBone, bufferSource, packedLight); + } + } + + private boolean findAndRenderOnBone(PoseStack poseStack, GeoBone bone, + MultiBufferSource bufferSource, int packedLight) { + poseStack.pushPose(); + // 应用骨骼变换 + poseStack.translate(bone.getPivotX() / 16f, -bone.getPivotY() / 16f, bone.getPivotZ() / 16f); + poseStack.mulPose(Axis.XP.rotation(bone.getRotX())); + poseStack.mulPose(Axis.YP.rotation(bone.getRotY())); + poseStack.mulPose(Axis.ZP.rotation(bone.getRotZ())); + + boolean found = false; + if ("bone".equals(bone.getName())) { + renderSignTextInBoneSpace(poseStack, bufferSource, packedLight); + found = true; + } + + for (GeoBone child : bone.getChildBones()) { + if (findAndRenderOnBone(poseStack, child, bufferSource, packedLight)) { + found = true; + } + } + poseStack.popPose(); + return found; + } + + private void renderSignTextInBoneSpace(PoseStack poseStack, MultiBufferSource bufferSource, int packedLight) { + if (signMessages == null) return; + + Minecraft mc = Minecraft.getInstance(); + Font font = mc.font; + int light = signHasGlowingText ? 15728880 : packedLight; poseStack.pushPose(); + poseStack.scale(-TEXT_SCALE, -TEXT_SCALE, -TEXT_SCALE); + poseStack.translate(0, BONE_LOCAL_TEXT_Y, BONE_LOCAL_TEXT_Z); + poseStack.mulPose(Axis.XP.rotationDegrees(BONE_ROTATE_XP)); - // 根据不同显示模式调整文字位置和缩放 - applyTransform(transformType, poseStack); + for (int i = 0; i < 4; i++) { + FormattedCharSequence message = signMessages[i]; + if (message == null) continue; - boolean hasGlowingText = signText.hasGlowingText(); - int textColor = signText.getColor().getTextColor(); - int darkColor = ColorUtil.getDarkColor(signText); - int glowLight = hasGlowingText ? 15728880 : packedLight; + float x = -font.width(message) / 2f; + float y = i * LINE_HEIGHT - 4 * LINE_HEIGHT / 2f; - // 渲染4行文字 - for (int line = 0; line < 4; line++) { - String message = signText.getMessage(line, false).getString(); - if (message.isEmpty()) continue; - - float xOffset = -font.width(message) / 2.0f; - float yOffset = line * item.getTextLineHeight() - ((float) (4 * item.getTextLineHeight()) / 2); - - if (hasGlowingText) { + if (signHasGlowingText) { font.drawInBatch8xOutline( - FormattedCharSequence.forward(message, Style.EMPTY), - xOffset, yOffset, - textColor, darkColor, - poseStack.last().pose(), - bufferSource, - glowLight - ); + message, x, y, signTextColor, signDarkColor, + poseStack.last().pose(), bufferSource, light); } else { font.drawInBatch( - message, - xOffset, yOffset, - textColor, - false, - poseStack.last().pose(), - bufferSource, - Font.DisplayMode.NORMAL, - 0, - packedLight - ); + message, x, y, signTextColor, + false, poseStack.last().pose(), bufferSource, + Font.DisplayMode.POLYGON_OFFSET, 0, light); } } poseStack.popPose(); } - - private void applyTransform(@NotNull ItemDisplayContext transformType, PoseStack poseStack) { - switch (transformType) { - case GUI -> { - // 物品栏显示 - poseStack.translate(8, 4, 0); - poseStack.scale(0.025f, 0.025f, 0.025f); - poseStack.mulPose(Axis.ZP.rotationDegrees(180)); - } - case GROUND -> { - // 掉落物实体 - poseStack.translate(8, 2, 0); - poseStack.scale(0.03f, 0.03f, 0.03f); - } - case FIRST_PERSON_RIGHT_HAND, FIRST_PERSON_LEFT_HAND -> { - // 第一人称手持 - poseStack.translate(6, 4, 5); - poseStack.scale(0.02f, 0.02f, 0.02f); - } - case THIRD_PERSON_RIGHT_HAND, THIRD_PERSON_LEFT_HAND -> { - // 第三人称手持 - poseStack.translate(4, 2, 3); - poseStack.scale(0.02f, 0.02f, 0.02f); - } - case FIXED -> { - // 展示框 - poseStack.translate(8, 4, 0); - poseStack.scale(0.025f, 0.025f, 0.025f); - } - default -> { - poseStack.translate(8, 4, 0); - poseStack.scale(0.025f, 0.025f, 0.025f); - } - } - } } diff --git a/src/main/java/top/r3944realms/eroticdungeongame/content/item/SignArmorItem.java b/src/main/java/top/r3944realms/eroticdungeongame/content/item/SignArmorItem.java index e64a9da2..f89ce731 100644 --- a/src/main/java/top/r3944realms/eroticdungeongame/content/item/SignArmorItem.java +++ b/src/main/java/top/r3944realms/eroticdungeongame/content/item/SignArmorItem.java @@ -213,16 +213,12 @@ public class SignArmorItem extends ArmorItem implements GeoItem { @Override public void initializeClient(@NotNull Consumer consumer) { consumer.accept(new IClientItemExtensions() { - private GeoArmorRenderer renderer; private SignArmorItemRenderer itemRenderer; - @Override public @NotNull HumanoidModel getHumanoidArmorModel(LivingEntity livingEntity, ItemStack itemStack, EquipmentSlot equipmentSlot, HumanoidModel original) { - if (this.renderer == null) - this.renderer = new SignArmorRenderer(woodType); - this.renderer.prepForRender(livingEntity, itemStack, equipmentSlot, original); - return this.renderer; + // 告示牌甲的模型渲染由 SignArmorLayer 统一处理,此处返回原始模型避免双重渲染 + return original; } @Override diff --git a/src/main/java/top/r3944realms/eroticdungeongame/mixin/minecraft/MixinLivingEntityRenderer.java b/src/main/java/top/r3944realms/eroticdungeongame/mixin/minecraft/MixinLivingEntityRenderer.java new file mode 100644 index 00000000..3cbbd09c --- /dev/null +++ b/src/main/java/top/r3944realms/eroticdungeongame/mixin/minecraft/MixinLivingEntityRenderer.java @@ -0,0 +1,40 @@ +/* + * Copyright 2025-2026 R3944Realms + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.r3944realms.eroticdungeongame.mixin.minecraft; + +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.world.entity.LivingEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import top.r3944realms.eroticdungeongame.client.renderer.armor.SignArmorLayer; + +@Mixin(LivingEntityRenderer.class) +public class MixinLivingEntityRenderer { + + @SuppressWarnings({"unchecked"}) + @Inject(method = "", at = @At("RETURN")) + private void edg$addSignArmorLayer(CallbackInfo ci) { + LivingEntityRenderer.class.cast(this) .addLayer( + new SignArmorLayer( + (RenderLayerParent>) this) + ); + } +} diff --git a/src/main/resources/eroticdungeongame.mixins.json b/src/main/resources/eroticdungeongame.mixins.json index 9caac11a..acef1fce 100644 --- a/src/main/resources/eroticdungeongame.mixins.json +++ b/src/main/resources/eroticdungeongame.mixins.json @@ -25,6 +25,7 @@ "minecraft.MixinGameRender", "minecraft.MixinIntegratedServer", "minecraft.MixinItemInHandRenderer", + "minecraft.MixinLivingEntityRenderer", "minecraft.MixinMinecraft", "minecraft.MixinPlayerRenderer" ]