ah yes, no hooks for layers

This commit is contained in:
DBotThePony 2022-10-21 19:31:53 +07:00
parent 16bd9cd20a
commit 5a76223f14
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -1,7 +1,10 @@
package ru.dbotthepony.mc.otm.client.model; package ru.dbotthepony.mc.otm.client.model;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import it.unimi.dsi.fastutil.objects.ReferenceArraySet;
import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.model.PlayerModel;
import net.minecraft.client.model.geom.PartPose; import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.CubeDeformation; import net.minecraft.client.model.geom.builders.CubeDeformation;
import net.minecraft.client.model.geom.builders.CubeListBuilder; import net.minecraft.client.model.geom.builders.CubeListBuilder;
@ -10,13 +13,20 @@ import net.minecraft.client.model.geom.builders.MeshDefinition;
import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.model.geom.builders.PartDefinition;
import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.player.AbstractClientPlayer;
import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.client.renderer.entity.LivingEntityRenderer;
import net.minecraft.client.renderer.entity.RenderLayerParent;
import net.minecraft.client.renderer.entity.layers.RenderLayer;
import net.minecraft.client.renderer.entity.player.PlayerRenderer;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.client.event.RenderPlayerEvent; import net.minecraftforge.client.event.RenderPlayerEvent;
import ru.dbotthepony.mc.otm.OverdriveThatMatters; import ru.dbotthepony.mc.otm.OverdriveThatMatters;
import ru.dbotthepony.mc.otm.capability.MatteryCapability; import ru.dbotthepony.mc.otm.capability.MatteryCapability;
import javax.annotation.Nonnull;
import java.util.Set;
public final class ExosuitModel { public final class ExosuitModel {
private ExosuitModel() {} private ExosuitModel() {}
@ -84,40 +94,65 @@ public final class ExosuitModel {
modelGlow.rightLeg.visible = false; modelGlow.rightLeg.visible = false;
} }
@SuppressWarnings("OptionalGetWithoutIsPresent") private static final Set<PlayerRenderer> patchedRenderers = new ReferenceArraySet<>();
public static void onPlayerRendered(final RenderPlayerEvent.Post event) {
var cap = event.getEntity().getCapability(MatteryCapability.MATTERY_PLAYER);
if (!cap.isPresent()) { private static class ExosuitLayer extends RenderLayer<AbstractClientPlayer, PlayerModel<AbstractClientPlayer>> {
return; public ExosuitLayer(RenderLayerParent<AbstractClientPlayer, PlayerModel<AbstractClientPlayer>> p_117346_) {
super(p_117346_);
} }
if (cap.resolve().get().getHasExoSuit()) { @SuppressWarnings("OptionalGetWithoutIsPresent")
var model = event.getRenderer().getModel(); @Override
model.copyPropertiesTo(modelNormal); public void render(
model.copyPropertiesTo(modelGlow); @Nonnull PoseStack poseStack,
@Nonnull MultiBufferSource bufferSource,
int packedLight,
@Nonnull AbstractClientPlayer player,
float p_117353_,
float p_117354_,
float p_117355_,
float p_117356_,
float p_117357_,
float p_117358_
) {
var cap = player.getCapability(MatteryCapability.MATTERY_PLAYER);
int overlayCoords = LivingEntityRenderer.getOverlayCoords(event.getEntity(), 0f); if (!cap.isPresent()) {
return;
}
var rendertype = RenderType.entityCutoutNoCull(texture); if (cap.resolve().get().getHasExoSuit()) {
var model = getParentModel();
model.copyPropertiesTo(modelNormal);
model.copyPropertiesTo(modelGlow);
modelNormal.renderToBuffer( int overlayCoords = LivingEntityRenderer.getOverlayCoords(player, 0f);
event.getPoseStack(), var rendertype = RenderType.entityCutoutNoCull(texture);
event.getMultiBufferSource().getBuffer(rendertype),
event.getPackedLight(),
overlayCoords,
// rgba
1f, 1f, 1f, 1f
);
modelGlow.renderToBuffer( modelNormal.renderToBuffer(
event.getPoseStack(), poseStack,
event.getMultiBufferSource().getBuffer(rendertype), bufferSource.getBuffer(rendertype),
event.getPackedLight(), packedLight,
overlayCoords, overlayCoords,
// rgba // rgba
1f, 1f, 1f, 1f 1f, 1f, 1f, 1f
); );
modelGlow.renderToBuffer(
poseStack,
bufferSource.getBuffer(rendertype),
packedLight,
overlayCoords,
// rgba
1f, 1f, 1f, 1f
);
}
}
}
public static void onPlayerRendered(final RenderPlayerEvent.Post event) {
if (patchedRenderers.add(event.getRenderer())) {
event.getRenderer().addLayer(new ExosuitLayer(event.getRenderer()));
} }
} }
} }