调整渲染方式

This commit is contained in:
17146 2025-05-17 15:49:32 +08:00 committed by Light_Quanta
parent 9c1f9427db
commit 9f6bbb9d7b
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959

View file

@ -6,11 +6,14 @@ import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import org.jetbrains.annotations.Nullable;
import org.joml.Matrix4f; import org.joml.Matrix4f;
import software.bernie.geckolib.animatable.GeoAnimatable; import software.bernie.geckolib.animatable.GeoAnimatable;
import software.bernie.geckolib.cache.object.BakedGeoModel;
import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.cache.object.GeoBone;
import software.bernie.geckolib.model.GeoModel; import software.bernie.geckolib.model.GeoModel;
import software.bernie.geckolib.renderer.GeoItemRenderer; import software.bernie.geckolib.renderer.GeoItemRenderer;
import software.bernie.geckolib.util.Color;
import software.bernie.geckolib.util.RenderUtil; import software.bernie.geckolib.util.RenderUtil;
public class CustomRenderer<T extends Item & GeoAnimatable> extends GeoItemRenderer<T> { public class CustomRenderer<T extends Item & GeoAnimatable> extends GeoItemRenderer<T> {
@ -20,7 +23,60 @@ public class CustomRenderer<T extends Item & GeoAnimatable> extends GeoItemRende
} }
@Override @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()) { if (bone.isTrackingMatrices()) {
Matrix4f poseState = new Matrix4f(poseStack.last().pose()); Matrix4f poseState = new Matrix4f(poseStack.last().pose());
@ -31,22 +87,21 @@ public class CustomRenderer<T extends Item & GeoAnimatable> extends GeoItemRende
poseStack.pushPose(); poseStack.pushPose();
RenderUtil.prepMatrixForBone(poseStack, bone); RenderUtil.prepMatrixForBone(poseStack, bone);
// TODO 为什么会出现全部发光
// 我感觉这个地方已经查明了对于指定后缀名group的全部cube并且传入一个魔改后的buffer来实现发光渲染后续用的buffer都是之前的内容理论上不会影响递归调用啊
var bf = buffer;
var overlay = packedOverlay;
if (bone.getName().endsWith("_illuminated")) { if (bone.getName().endsWith("_illuminated")) {
bf = bufferSource.getBuffer(ModRenderTypes.GUN_ILLUMINATED.apply(this.getTextureLocation(animatable))); renderCubesOfBone(poseStack, bone, bufferSource.getBuffer(ModRenderTypes.GUN_ILLUMINATED.apply(this.getTextureLocation(animatable))),
overlay = OverlayTexture.NO_OVERLAY; packedLight, OverlayTexture.NO_OVERLAY, color);
} }
this.illuminatedRenderChildBones(poseStack, animatable, bone, renderType, bufferSource, buffer, partialTick, packedLight, packedOverlay, 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);
poseStack.popPose(); 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);
}
}
} }