调整渲染方式
This commit is contained in:
parent
9c1f9427db
commit
9f6bbb9d7b
1 changed files with 70 additions and 15 deletions
|
@ -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<T extends Item & GeoAnimatable> extends GeoItemRenderer<T> {
|
||||
|
@ -20,7 +23,60 @@ public class CustomRenderer<T extends Item & GeoAnimatable> 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<T extends Item & GeoAnimatable> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue