调整渲染方式
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.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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue