2025-11-24 22:52:51 +03:00

187 lines
9.6 KiB
Java

/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* org.joml.Quaternionfc
*/
package net.minecraft.client.renderer.entity;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Axis;
import java.util.Objects;
import net.minecraft.client.model.MinecartModel;
import net.minecraft.client.model.geom.ModelLayerLocation;
import net.minecraft.client.renderer.SubmitNodeCollector;
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.entity.state.MinecartRenderState;
import net.minecraft.client.renderer.state.CameraRenderState;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.resources.Identifier;
import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.vehicle.AbstractMinecart;
import net.minecraft.world.entity.vehicle.MinecartBehavior;
import net.minecraft.world.entity.vehicle.NewMinecartBehavior;
import net.minecraft.world.entity.vehicle.OldMinecartBehavior;
import net.minecraft.world.entity.vehicle.VehicleEntity;
import net.minecraft.world.level.block.RenderShape;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import org.joml.Quaternionfc;
public abstract class AbstractMinecartRenderer<T extends AbstractMinecart, S extends MinecartRenderState>
extends EntityRenderer<T, S> {
private static final Identifier MINECART_LOCATION = Identifier.withDefaultNamespace("textures/entity/minecart.png");
private static final float DISPLAY_BLOCK_SCALE = 0.75f;
protected final MinecartModel model;
public AbstractMinecartRenderer(EntityRendererProvider.Context context, ModelLayerLocation model) {
super(context);
this.shadowRadius = 0.7f;
this.model = new MinecartModel(context.bakeLayer(model));
}
@Override
public void submit(S state, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, CameraRenderState camera) {
BlockState blockState;
super.submit(state, poseStack, submitNodeCollector, camera);
poseStack.pushPose();
long seed = ((MinecartRenderState)state).offsetSeed;
float offsetX = (((float)(seed >> 16 & 7L) + 0.5f) / 8.0f - 0.5f) * 0.004f;
float offsetY = (((float)(seed >> 20 & 7L) + 0.5f) / 8.0f - 0.5f) * 0.004f;
float offsetZ = (((float)(seed >> 24 & 7L) + 0.5f) / 8.0f - 0.5f) * 0.004f;
poseStack.translate(offsetX, offsetY, offsetZ);
if (((MinecartRenderState)state).isNewRender) {
AbstractMinecartRenderer.newRender(state, poseStack);
} else {
AbstractMinecartRenderer.oldRender(state, poseStack);
}
float hurt = ((MinecartRenderState)state).hurtTime;
if (hurt > 0.0f) {
poseStack.mulPose((Quaternionfc)Axis.XP.rotationDegrees(Mth.sin(hurt) * hurt * ((MinecartRenderState)state).damageTime / 10.0f * (float)((MinecartRenderState)state).hurtDir));
}
if ((blockState = ((MinecartRenderState)state).displayBlockState).getRenderShape() != RenderShape.INVISIBLE) {
poseStack.pushPose();
poseStack.scale(0.75f, 0.75f, 0.75f);
poseStack.translate(-0.5f, (float)(((MinecartRenderState)state).displayOffset - 8) / 16.0f, 0.5f);
poseStack.mulPose((Quaternionfc)Axis.YP.rotationDegrees(90.0f));
this.submitMinecartContents(state, blockState, poseStack, submitNodeCollector, ((MinecartRenderState)state).lightCoords);
poseStack.popPose();
}
poseStack.scale(-1.0f, -1.0f, 1.0f);
submitNodeCollector.submitModel(this.model, state, poseStack, this.model.renderType(MINECART_LOCATION), ((MinecartRenderState)state).lightCoords, OverlayTexture.NO_OVERLAY, ((MinecartRenderState)state).outlineColor, null);
poseStack.popPose();
}
private static <S extends MinecartRenderState> void newRender(S state, PoseStack poseStack) {
poseStack.mulPose((Quaternionfc)Axis.YP.rotationDegrees(state.yRot));
poseStack.mulPose((Quaternionfc)Axis.ZP.rotationDegrees(-state.xRot));
poseStack.translate(0.0f, 0.375f, 0.0f);
}
private static <S extends MinecartRenderState> void oldRender(S state, PoseStack poseStack) {
double entityX = state.x;
double entityY = state.y;
double entityZ = state.z;
float xRot = state.xRot;
float rotation = state.yRot;
if (state.posOnRail != null && state.frontPos != null && state.backPos != null) {
Vec3 frontPos = state.frontPos;
Vec3 backPos = state.backPos;
poseStack.translate(state.posOnRail.x - entityX, (frontPos.y + backPos.y) / 2.0 - entityY, state.posOnRail.z - entityZ);
Vec3 direction = backPos.add(-frontPos.x, -frontPos.y, -frontPos.z);
if (direction.length() != 0.0) {
direction = direction.normalize();
rotation = (float)(Math.atan2(direction.z, direction.x) * 180.0 / Math.PI);
xRot = (float)(Math.atan(direction.y) * 73.0);
}
}
poseStack.translate(0.0f, 0.375f, 0.0f);
poseStack.mulPose((Quaternionfc)Axis.YP.rotationDegrees(180.0f - rotation));
poseStack.mulPose((Quaternionfc)Axis.ZP.rotationDegrees(-xRot));
}
@Override
public void extractRenderState(T entity, S state, float partialTicks) {
super.extractRenderState(entity, state, partialTicks);
MinecartBehavior minecartBehavior = ((AbstractMinecart)entity).getBehavior();
if (minecartBehavior instanceof NewMinecartBehavior) {
NewMinecartBehavior behavior = (NewMinecartBehavior)minecartBehavior;
AbstractMinecartRenderer.newExtractState(entity, behavior, state, partialTicks);
((MinecartRenderState)state).isNewRender = true;
} else {
minecartBehavior = ((AbstractMinecart)entity).getBehavior();
if (minecartBehavior instanceof OldMinecartBehavior) {
OldMinecartBehavior behavior = (OldMinecartBehavior)minecartBehavior;
AbstractMinecartRenderer.oldExtractState(entity, behavior, state, partialTicks);
((MinecartRenderState)state).isNewRender = false;
}
}
long seed = (long)((Entity)entity).getId() * 493286711L;
((MinecartRenderState)state).offsetSeed = seed * seed * 4392167121L + seed * 98761L;
((MinecartRenderState)state).hurtTime = (float)((VehicleEntity)entity).getHurtTime() - partialTicks;
((MinecartRenderState)state).hurtDir = ((VehicleEntity)entity).getHurtDir();
((MinecartRenderState)state).damageTime = Math.max(((VehicleEntity)entity).getDamage() - partialTicks, 0.0f);
((MinecartRenderState)state).displayOffset = ((AbstractMinecart)entity).getDisplayOffset();
((MinecartRenderState)state).displayBlockState = ((AbstractMinecart)entity).getDisplayBlockState();
}
private static <T extends AbstractMinecart, S extends MinecartRenderState> void newExtractState(T entity, NewMinecartBehavior behavior, S state, float partialTicks) {
if (behavior.cartHasPosRotLerp()) {
state.renderPos = behavior.getCartLerpPosition(partialTicks);
state.xRot = behavior.getCartLerpXRot(partialTicks);
state.yRot = behavior.getCartLerpYRot(partialTicks);
} else {
state.renderPos = null;
state.xRot = entity.getXRot();
state.yRot = entity.getYRot();
}
}
private static <T extends AbstractMinecart, S extends MinecartRenderState> void oldExtractState(T entity, OldMinecartBehavior behavior, S state, float partialTicks) {
float HALF_LENGTH = 0.3f;
state.xRot = entity.getXRot(partialTicks);
state.yRot = entity.getYRot(partialTicks);
double entityX = state.x;
double entityY = state.y;
double entityZ = state.z;
Vec3 pos = behavior.getPos(entityX, entityY, entityZ);
if (pos != null) {
state.posOnRail = pos;
Vec3 p0 = behavior.getPosOffs(entityX, entityY, entityZ, 0.3f);
Vec3 p1 = behavior.getPosOffs(entityX, entityY, entityZ, -0.3f);
state.frontPos = Objects.requireNonNullElse(p0, pos);
state.backPos = Objects.requireNonNullElse(p1, pos);
} else {
state.posOnRail = null;
state.frontPos = null;
state.backPos = null;
}
}
protected void submitMinecartContents(S state, BlockState blockState, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int lightCoords) {
submitNodeCollector.submitBlock(poseStack, blockState, lightCoords, OverlayTexture.NO_OVERLAY, ((MinecartRenderState)state).outlineColor);
}
@Override
protected AABB getBoundingBoxForCulling(T entity) {
AABB aabb = super.getBoundingBoxForCulling(entity);
if (!((AbstractMinecart)entity).getDisplayBlockState().isAir()) {
return aabb.expandTowards(0.0, (float)((AbstractMinecart)entity).getDisplayOffset() * 0.75f / 16.0f, 0.0);
}
return aabb;
}
@Override
public Vec3 getRenderOffset(S state) {
Vec3 offset = super.getRenderOffset(state);
if (((MinecartRenderState)state).isNewRender && ((MinecartRenderState)state).renderPos != null) {
return offset.add(((MinecartRenderState)state).renderPos.x - ((MinecartRenderState)state).x, ((MinecartRenderState)state).renderPos.y - ((MinecartRenderState)state).y, ((MinecartRenderState)state).renderPos.z - ((MinecartRenderState)state).z);
}
return offset;
}
}