From 9f6bbb9d7bee9fb74d8d7a592a65a8423f9f826f Mon Sep 17 00:00:00 2001 From: 17146 <1714673995@qq.com> Date: Sat, 17 May 2025 15:49:32 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=B8=B2=E6=9F=93=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../superbwarfare/client/CustomRenderer.java | 85 +++++++++++++++---- 1 file changed, 70 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/atsuishio/superbwarfare/client/CustomRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/CustomRenderer.java index 086d1aa2e..58b928bf3 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/CustomRenderer.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/CustomRenderer.java @@ -6,11 +6,14 @@ import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.world.item.Item; +import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; import software.bernie.geckolib.animatable.GeoAnimatable; +import software.bernie.geckolib.cache.object.BakedGeoModel; import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.renderer.GeoItemRenderer; +import software.bernie.geckolib.util.Color; import software.bernie.geckolib.util.RenderUtil; public class CustomRenderer extends GeoItemRenderer { @@ -20,7 +23,60 @@ public class CustomRenderer extends GeoItemRende } @Override - public void renderRecursively(PoseStack poseStack, T animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int color) { + public void defaultRender(PoseStack poseStack, T animatable, MultiBufferSource bufferSource, @Nullable RenderType renderType, @Nullable VertexConsumer buffer, float yaw, float partialTick, int packedLight) { + poseStack.pushPose(); + + Color renderColor = getRenderColor(animatable, partialTick, packedLight); + float red = renderColor.getRedFloat(); + float green = renderColor.getGreenFloat(); + float blue = renderColor.getBlueFloat(); + float alpha = renderColor.getAlphaFloat(); + int packedOverlay = getPackedOverlay(animatable, 0, partialTick); + BakedGeoModel model = getGeoModel().getBakedModel(getGeoModel().getModelResource(animatable)); + + if (renderType == null) + renderType = getRenderType(animatable, getTextureLocation(animatable), bufferSource, partialTick); + + if (buffer == null) + buffer = bufferSource.getBuffer(renderType); + + preRender(poseStack, animatable, model, bufferSource, buffer, false, partialTick, packedLight, packedOverlay, renderColor.argbInt()); + + if (firePreRenderEvent(poseStack, model, bufferSource, partialTick, packedLight)) { + preApplyRenderLayers(poseStack, animatable, model, renderType, bufferSource, buffer, packedLight, packedLight, packedOverlay); + actuallyRender(poseStack, animatable, model, renderType, + bufferSource, buffer, false, partialTick, packedLight, packedOverlay, renderColor.argbInt()); + this.renderIlluminatedBones(model, poseStack, bufferSource, animatable, renderType, buffer, partialTick, packedLight, packedOverlay, renderColor.argbInt()); + postRender(poseStack, animatable, model, bufferSource, buffer, false, partialTick, packedLight, packedOverlay, renderColor.argbInt()); + firePostRenderEvent(poseStack, model, bufferSource, partialTick, packedLight); + } + + poseStack.popPose(); + + renderFinal(poseStack, animatable, model, bufferSource, buffer, partialTick, packedLight, packedOverlay, renderColor.argbInt()); + } + + public void renderIlluminatedBones(BakedGeoModel model, PoseStack poseStack, MultiBufferSource bufferSource, T animatable, + RenderType renderType, VertexConsumer buffer, float partialTick, + int packedLight, int packedOverlay, int color) { + poseStack.pushPose(); + preRender(poseStack, animatable, model, bufferSource, buffer, true, partialTick, packedLight, packedOverlay, color); + + this.modelRenderTranslations = new Matrix4f(poseStack.last().pose()); + + updateAnimatedTextureFrame(animatable); + + for (GeoBone bone : model.topLevelBones()) { + this.illuminatedRender(poseStack, animatable, bone, renderType, bufferSource, buffer, + partialTick, packedLight, packedOverlay, color); + } + + postRender(poseStack, animatable, model, bufferSource, buffer, true, partialTick, packedLight, packedOverlay, color); + poseStack.popPose(); + } + + public void illuminatedRender(PoseStack poseStack, T animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, float partialTick, int packedLight, + int packedOverlay, int color) { if (bone.isTrackingMatrices()) { Matrix4f poseState = new Matrix4f(poseStack.last().pose()); @@ -31,22 +87,21 @@ public class CustomRenderer extends GeoItemRende poseStack.pushPose(); RenderUtil.prepMatrixForBone(poseStack, bone); - // TODO 为什么会出现全部发光? - // 我感觉这个地方已经查明了对于指定后缀名group的全部cube,并且传入一个魔改后的buffer来实现发光渲染,后续用的buffer都是之前的内容,理论上不会影响递归调用啊 - var bf = buffer; - var overlay = packedOverlay; if (bone.getName().endsWith("_illuminated")) { - bf = bufferSource.getBuffer(ModRenderTypes.GUN_ILLUMINATED.apply(this.getTextureLocation(animatable))); - overlay = OverlayTexture.NO_OVERLAY; + renderCubesOfBone(poseStack, bone, bufferSource.getBuffer(ModRenderTypes.GUN_ILLUMINATED.apply(this.getTextureLocation(animatable))), + packedLight, OverlayTexture.NO_OVERLAY, color); } - - renderCubesOfBone(poseStack, bone, bf, packedLight, overlay, color); - - if (!isReRender) { - applyRenderLayersForBone(poseStack, animatable, bone, renderType, bufferSource, buffer, partialTick, packedLight, packedOverlay); - } - - renderChildBones(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, color); + this.illuminatedRenderChildBones(poseStack, animatable, bone, renderType, bufferSource, buffer, partialTick, packedLight, packedOverlay, color); poseStack.popPose(); } + + public void illuminatedRenderChildBones(PoseStack poseStack, T animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, + float partialTick, int packedLight, int packedOverlay, int color) { + if (bone.isHidingChildren()) + return; + + for (GeoBone childBone : bone.getChildBones()) { + illuminatedRender(poseStack, animatable, childBone, renderType, bufferSource, buffer, partialTick, packedLight, packedOverlay, color); + } + } }