179 lines
8.3 KiB
Java
179 lines
8.3 KiB
Java
package net.minecraft.client.renderer.entity;
|
|
|
|
import com.mojang.blaze3d.vertex.PoseStack;
|
|
import com.mojang.blaze3d.vertex.VertexConsumer;
|
|
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.MultiBufferSource;
|
|
import net.minecraft.client.renderer.block.BlockRenderDispatcher;
|
|
import net.minecraft.client.renderer.entity.state.MinecartRenderState;
|
|
import net.minecraft.client.renderer.texture.OverlayTexture;
|
|
import net.minecraft.resources.ResourceLocation;
|
|
import net.minecraft.util.Mth;
|
|
import net.minecraft.world.entity.vehicle.AbstractMinecart;
|
|
import net.minecraft.world.entity.vehicle.NewMinecartBehavior;
|
|
import net.minecraft.world.entity.vehicle.OldMinecartBehavior;
|
|
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 net.minecraftforge.api.distmarker.Dist;
|
|
import net.minecraftforge.api.distmarker.OnlyIn;
|
|
|
|
@OnlyIn(Dist.CLIENT)
|
|
public abstract class AbstractMinecartRenderer<T extends AbstractMinecart, S extends MinecartRenderState> extends EntityRenderer<T, S> {
|
|
private static final ResourceLocation MINECART_LOCATION = ResourceLocation.withDefaultNamespace("textures/entity/minecart.png");
|
|
private static final float DISPLAY_BLOCK_SCALE = 0.75F;
|
|
protected final MinecartModel model;
|
|
private final BlockRenderDispatcher blockRenderer;
|
|
|
|
public AbstractMinecartRenderer(EntityRendererProvider.Context p_369922_, ModelLayerLocation p_364230_) {
|
|
super(p_369922_);
|
|
this.shadowRadius = 0.7F;
|
|
this.model = new MinecartModel(p_369922_.bakeLayer(p_364230_));
|
|
this.blockRenderer = p_369922_.getBlockRenderDispatcher();
|
|
}
|
|
|
|
public void render(S p_361135_, PoseStack p_366647_, MultiBufferSource p_368030_, int p_370214_) {
|
|
super.render(p_361135_, p_366647_, p_368030_, p_370214_);
|
|
p_366647_.pushPose();
|
|
long i = p_361135_.offsetSeed;
|
|
float f = (((float)(i >> 16 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F;
|
|
float f1 = (((float)(i >> 20 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F;
|
|
float f2 = (((float)(i >> 24 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F;
|
|
p_366647_.translate(f, f1, f2);
|
|
if (p_361135_.isNewRender) {
|
|
newRender(p_361135_, p_366647_);
|
|
} else {
|
|
oldRender(p_361135_, p_366647_);
|
|
}
|
|
|
|
float f3 = p_361135_.hurtTime;
|
|
if (f3 > 0.0F) {
|
|
p_366647_.mulPose(Axis.XP.rotationDegrees(Mth.sin(f3) * f3 * p_361135_.damageTime / 10.0F * p_361135_.hurtDir));
|
|
}
|
|
|
|
BlockState blockstate = p_361135_.displayBlockState;
|
|
if (blockstate.getRenderShape() != RenderShape.INVISIBLE) {
|
|
p_366647_.pushPose();
|
|
p_366647_.scale(0.75F, 0.75F, 0.75F);
|
|
p_366647_.translate(-0.5F, (p_361135_.displayOffset - 8) / 16.0F, 0.5F);
|
|
p_366647_.mulPose(Axis.YP.rotationDegrees(90.0F));
|
|
this.renderMinecartContents(p_361135_, blockstate, p_366647_, p_368030_, p_370214_);
|
|
p_366647_.popPose();
|
|
}
|
|
|
|
p_366647_.scale(-1.0F, -1.0F, 1.0F);
|
|
this.model.setupAnim(p_361135_);
|
|
VertexConsumer vertexconsumer = p_368030_.getBuffer(this.model.renderType(MINECART_LOCATION));
|
|
this.model.renderToBuffer(p_366647_, vertexconsumer, p_370214_, OverlayTexture.NO_OVERLAY);
|
|
p_366647_.popPose();
|
|
}
|
|
|
|
private static <S extends MinecartRenderState> void newRender(S p_369039_, PoseStack p_366808_) {
|
|
p_366808_.mulPose(Axis.YP.rotationDegrees(p_369039_.yRot));
|
|
p_366808_.mulPose(Axis.ZP.rotationDegrees(-p_369039_.xRot));
|
|
p_366808_.translate(0.0F, 0.375F, 0.0F);
|
|
}
|
|
|
|
private static <S extends MinecartRenderState> void oldRender(S p_364306_, PoseStack p_367729_) {
|
|
double d0 = p_364306_.x;
|
|
double d1 = p_364306_.y;
|
|
double d2 = p_364306_.z;
|
|
float f = p_364306_.xRot;
|
|
float f1 = p_364306_.yRot;
|
|
if (p_364306_.posOnRail != null && p_364306_.frontPos != null && p_364306_.backPos != null) {
|
|
Vec3 vec3 = p_364306_.frontPos;
|
|
Vec3 vec31 = p_364306_.backPos;
|
|
p_367729_.translate(p_364306_.posOnRail.x - d0, (vec3.y + vec31.y) / 2.0 - d1, p_364306_.posOnRail.z - d2);
|
|
Vec3 vec32 = vec31.add(-vec3.x, -vec3.y, -vec3.z);
|
|
if (vec32.length() != 0.0) {
|
|
vec32 = vec32.normalize();
|
|
f1 = (float)(Math.atan2(vec32.z, vec32.x) * 180.0 / Math.PI);
|
|
f = (float)(Math.atan(vec32.y) * 73.0);
|
|
}
|
|
}
|
|
|
|
p_367729_.translate(0.0F, 0.375F, 0.0F);
|
|
p_367729_.mulPose(Axis.YP.rotationDegrees(180.0F - f1));
|
|
p_367729_.mulPose(Axis.ZP.rotationDegrees(-f));
|
|
}
|
|
|
|
public void extractRenderState(T p_369176_, S p_364445_, float p_364174_) {
|
|
super.extractRenderState(p_369176_, p_364445_, p_364174_);
|
|
if (p_369176_.getBehavior() instanceof NewMinecartBehavior newminecartbehavior) {
|
|
newExtractState(p_369176_, newminecartbehavior, p_364445_, p_364174_);
|
|
p_364445_.isNewRender = true;
|
|
} else if (p_369176_.getBehavior() instanceof OldMinecartBehavior oldminecartbehavior) {
|
|
oldExtractState(p_369176_, oldminecartbehavior, p_364445_, p_364174_);
|
|
p_364445_.isNewRender = false;
|
|
}
|
|
|
|
long i = p_369176_.getId() * 493286711L;
|
|
p_364445_.offsetSeed = i * i * 4392167121L + i * 98761L;
|
|
p_364445_.hurtTime = p_369176_.getHurtTime() - p_364174_;
|
|
p_364445_.hurtDir = p_369176_.getHurtDir();
|
|
p_364445_.damageTime = Math.max(p_369176_.getDamage() - p_364174_, 0.0F);
|
|
p_364445_.displayOffset = p_369176_.getDisplayOffset();
|
|
p_364445_.displayBlockState = p_369176_.getDisplayBlockState();
|
|
}
|
|
|
|
private static <T extends AbstractMinecart, S extends MinecartRenderState> void newExtractState(
|
|
T p_366236_, NewMinecartBehavior p_366892_, S p_367623_, float p_365529_
|
|
) {
|
|
if (p_366892_.cartHasPosRotLerp()) {
|
|
p_367623_.renderPos = p_366892_.getCartLerpPosition(p_365529_);
|
|
p_367623_.xRot = p_366892_.getCartLerpXRot(p_365529_);
|
|
p_367623_.yRot = p_366892_.getCartLerpYRot(p_365529_);
|
|
} else {
|
|
p_367623_.renderPos = null;
|
|
p_367623_.xRot = p_366236_.getXRot();
|
|
p_367623_.yRot = p_366236_.getYRot();
|
|
}
|
|
}
|
|
|
|
private static <T extends AbstractMinecart, S extends MinecartRenderState> void oldExtractState(
|
|
T p_367481_, OldMinecartBehavior p_362885_, S p_368073_, float p_362159_
|
|
) {
|
|
float f = 0.3F;
|
|
p_368073_.xRot = p_367481_.getXRot(p_362159_);
|
|
p_368073_.yRot = p_367481_.getYRot(p_362159_);
|
|
double d0 = p_368073_.x;
|
|
double d1 = p_368073_.y;
|
|
double d2 = p_368073_.z;
|
|
Vec3 vec3 = p_362885_.getPos(d0, d1, d2);
|
|
if (vec3 != null) {
|
|
p_368073_.posOnRail = vec3;
|
|
Vec3 vec31 = p_362885_.getPosOffs(d0, d1, d2, 0.3F);
|
|
Vec3 vec32 = p_362885_.getPosOffs(d0, d1, d2, -0.3F);
|
|
p_368073_.frontPos = Objects.requireNonNullElse(vec31, vec3);
|
|
p_368073_.backPos = Objects.requireNonNullElse(vec32, vec3);
|
|
} else {
|
|
p_368073_.posOnRail = null;
|
|
p_368073_.frontPos = null;
|
|
p_368073_.backPos = null;
|
|
}
|
|
}
|
|
|
|
protected void renderMinecartContents(S p_361290_, BlockState p_362203_, PoseStack p_367440_, MultiBufferSource p_368595_, int p_366033_) {
|
|
this.blockRenderer.renderSingleBlock(p_362203_, p_367440_, p_368595_, p_366033_, OverlayTexture.NO_OVERLAY);
|
|
}
|
|
|
|
protected AABB getBoundingBoxForCulling(T p_363708_) {
|
|
AABB aabb = super.getBoundingBoxForCulling(p_363708_);
|
|
return !p_363708_.getDisplayBlockState().isAir() ? aabb.expandTowards(0.0, p_363708_.getDisplayOffset() * 0.75F / 16.0F, 0.0) : aabb;
|
|
}
|
|
|
|
public Vec3 getRenderOffset(S p_367749_) {
|
|
Vec3 vec3 = super.getRenderOffset(p_367749_);
|
|
return p_367749_.isNewRender && p_367749_.renderPos != null
|
|
? vec3.add(
|
|
p_367749_.renderPos.x - p_367749_.x,
|
|
p_367749_.renderPos.y - p_367749_.y,
|
|
p_367749_.renderPos.z - p_367749_.z
|
|
)
|
|
: vec3;
|
|
}
|
|
} |