Spaces:
Build error
Build error
package net.minecraft.client.renderer.entity; | |
import com.mojang.blaze3d.vertex.PoseStack; | |
import com.mojang.blaze3d.vertex.VertexConsumer; | |
import javax.annotation.Nullable; | |
import net.minecraft.client.Minecraft; | |
import net.minecraft.client.gui.Font; | |
import net.minecraft.client.renderer.LightTexture; | |
import net.minecraft.client.renderer.MultiBufferSource; | |
import net.minecraft.client.renderer.RenderType; | |
import net.minecraft.client.renderer.culling.Frustum; | |
import net.minecraft.client.renderer.entity.state.EntityRenderState; | |
import net.minecraft.core.BlockPos; | |
import net.minecraft.network.chat.Component; | |
import net.minecraft.util.Mth; | |
import net.minecraft.world.entity.Entity; | |
import net.minecraft.world.entity.EntityAttachment; | |
import net.minecraft.world.entity.Leashable; | |
import net.minecraft.world.entity.vehicle.AbstractMinecart; | |
import net.minecraft.world.entity.vehicle.NewMinecartBehavior; | |
import net.minecraft.world.level.LightLayer; | |
import net.minecraft.world.phys.AABB; | |
import net.minecraft.world.phys.Vec3; | |
import net.minecraftforge.api.distmarker.Dist; | |
import net.minecraftforge.api.distmarker.OnlyIn; | |
import org.joml.Matrix4f; | |
public abstract class EntityRenderer<T extends Entity, S extends EntityRenderState> { | |
protected static final float NAMETAG_SCALE = 0.025F; | |
public static final int LEASH_RENDER_STEPS = 24; | |
protected final EntityRenderDispatcher entityRenderDispatcher; | |
private final Font font; | |
protected float shadowRadius; | |
protected float shadowStrength = 1.0F; | |
private final S reusedState = this.createRenderState(); | |
protected EntityRenderer(EntityRendererProvider.Context p_174008_) { | |
this.entityRenderDispatcher = p_174008_.getEntityRenderDispatcher(); | |
this.font = p_174008_.getFont(); | |
} | |
public final int getPackedLightCoords(T p_114506_, float p_114507_) { | |
BlockPos blockpos = BlockPos.containing(p_114506_.getLightProbePosition(p_114507_)); | |
return LightTexture.pack(this.getBlockLightLevel(p_114506_, blockpos), this.getSkyLightLevel(p_114506_, blockpos)); | |
} | |
protected int getSkyLightLevel(T p_114509_, BlockPos p_114510_) { | |
return p_114509_.level().getBrightness(LightLayer.SKY, p_114510_); | |
} | |
protected int getBlockLightLevel(T p_114496_, BlockPos p_114497_) { | |
return p_114496_.isOnFire() ? 15 : p_114496_.level().getBrightness(LightLayer.BLOCK, p_114497_); | |
} | |
public boolean shouldRender(T p_114491_, Frustum p_114492_, double p_114493_, double p_114494_, double p_114495_) { | |
if (!p_114491_.shouldRender(p_114493_, p_114494_, p_114495_)) { | |
return false; | |
} else if (!this.affectedByCulling(p_114491_)) { | |
return true; | |
} else { | |
AABB aabb = this.getBoundingBoxForCulling(p_114491_).inflate(0.5); | |
if (aabb.hasNaN() || aabb.getSize() == 0.0) { | |
aabb = new AABB( | |
p_114491_.getX() - 2.0, | |
p_114491_.getY() - 2.0, | |
p_114491_.getZ() - 2.0, | |
p_114491_.getX() + 2.0, | |
p_114491_.getY() + 2.0, | |
p_114491_.getZ() + 2.0 | |
); | |
} | |
if (p_114492_.isVisible(aabb)) { | |
return true; | |
} else { | |
if (p_114491_ instanceof Leashable leashable) { | |
Entity entity = leashable.getLeashHolder(); | |
if (entity != null) { | |
return p_114492_.isVisible(this.entityRenderDispatcher.getRenderer(entity).getBoundingBoxForCulling(entity)); | |
} | |
} | |
return false; | |
} | |
} | |
} | |
protected AABB getBoundingBoxForCulling(T p_365369_) { | |
return p_365369_.getBoundingBox(); | |
} | |
protected boolean affectedByCulling(T p_366877_) { | |
return true; | |
} | |
public Vec3 getRenderOffset(S p_367733_) { | |
return p_367733_.passengerOffset != null ? p_367733_.passengerOffset : Vec3.ZERO; | |
} | |
public void render(S p_370221_, PoseStack p_114488_, MultiBufferSource p_114489_, int p_114490_) { | |
EntityRenderState.LeashState entityrenderstate$leashstate = p_370221_.leashState; | |
if (entityrenderstate$leashstate != null) { | |
renderLeash(p_114488_, p_114489_, entityrenderstate$leashstate); | |
} | |
if (p_370221_.nameTag != null) { | |
this.renderNameTag(p_370221_, p_370221_.nameTag, p_114488_, p_114489_, p_114490_); | |
} | |
} | |
private static void renderLeash(PoseStack p_344390_, MultiBufferSource p_342590_, EntityRenderState.LeashState p_366061_) { | |
float f = 0.025F; | |
float f1 = (float)(p_366061_.end.x - p_366061_.start.x); | |
float f2 = (float)(p_366061_.end.y - p_366061_.start.y); | |
float f3 = (float)(p_366061_.end.z - p_366061_.start.z); | |
float f4 = Mth.invSqrt(f1 * f1 + f3 * f3) * 0.025F / 2.0F; | |
float f5 = f3 * f4; | |
float f6 = f1 * f4; | |
p_344390_.pushPose(); | |
p_344390_.translate(p_366061_.offset); | |
VertexConsumer vertexconsumer = p_342590_.getBuffer(RenderType.leash()); | |
Matrix4f matrix4f = p_344390_.last().pose(); | |
for (int i = 0; i <= 24; i++) { | |
addVertexPair( | |
vertexconsumer, | |
matrix4f, | |
f1, | |
f2, | |
f3, | |
p_366061_.startBlockLight, | |
p_366061_.endBlockLight, | |
p_366061_.startSkyLight, | |
p_366061_.endSkyLight, | |
0.025F, | |
0.025F, | |
f5, | |
f6, | |
i, | |
false | |
); | |
} | |
for (int j = 24; j >= 0; j--) { | |
addVertexPair( | |
vertexconsumer, | |
matrix4f, | |
f1, | |
f2, | |
f3, | |
p_366061_.startBlockLight, | |
p_366061_.endBlockLight, | |
p_366061_.startSkyLight, | |
p_366061_.endSkyLight, | |
0.025F, | |
0.0F, | |
f5, | |
f6, | |
j, | |
true | |
); | |
} | |
p_344390_.popPose(); | |
} | |
private static void addVertexPair( | |
VertexConsumer p_344804_, | |
Matrix4f p_343855_, | |
float p_342047_, | |
float p_343146_, | |
float p_342344_, | |
int p_342780_, | |
int p_343511_, | |
int p_342326_, | |
int p_343961_, | |
float p_342941_, | |
float p_343681_, | |
float p_343907_, | |
float p_343356_, | |
int p_342821_, | |
boolean p_343253_ | |
) { | |
float f = (float)p_342821_ / 24.0F; | |
int i = (int)Mth.lerp(f, (float)p_342780_, (float)p_343511_); | |
int j = (int)Mth.lerp(f, (float)p_342326_, (float)p_343961_); | |
int k = LightTexture.pack(i, j); | |
float f1 = p_342821_ % 2 == (p_343253_ ? 1 : 0) ? 0.7F : 1.0F; | |
float f2 = 0.5F * f1; | |
float f3 = 0.4F * f1; | |
float f4 = 0.3F * f1; | |
float f5 = p_342047_ * f; | |
float f6 = p_343146_ > 0.0F ? p_343146_ * f * f : p_343146_ - p_343146_ * (1.0F - f) * (1.0F - f); | |
float f7 = p_342344_ * f; | |
p_344804_.addVertex(p_343855_, f5 - p_343907_, f6 + p_343681_, f7 + p_343356_).setColor(f2, f3, f4, 1.0F).setLight(k); | |
p_344804_.addVertex(p_343855_, f5 + p_343907_, f6 + p_342941_ - p_343681_, f7 - p_343356_).setColor(f2, f3, f4, 1.0F).setLight(k); | |
} | |
protected boolean shouldShowName(T p_114504_, double p_363875_) { | |
return p_114504_.shouldShowName() || p_114504_.hasCustomName() && p_114504_ == this.entityRenderDispatcher.crosshairPickEntity; | |
} | |
public Font getFont() { | |
return this.font; | |
} | |
protected void renderNameTag(S p_364888_, Component p_114499_, PoseStack p_114500_, MultiBufferSource p_114501_, int p_114502_) { | |
Vec3 vec3 = p_364888_.nameTagAttachment; | |
if (vec3 != null) { | |
boolean flag = !p_364888_.isDiscrete; | |
int i = "deadmau5".equals(p_114499_.getString()) ? -10 : 0; | |
p_114500_.pushPose(); | |
p_114500_.translate(vec3.x, vec3.y + 0.5, vec3.z); | |
p_114500_.mulPose(this.entityRenderDispatcher.cameraOrientation()); | |
p_114500_.scale(0.025F, -0.025F, 0.025F); | |
Matrix4f matrix4f = p_114500_.last().pose(); | |
Font font = this.getFont(); | |
float f = (float)(-font.width(p_114499_)) / 2.0F; | |
int j = (int)(Minecraft.getInstance().options.getBackgroundOpacity(0.25F) * 255.0F) << 24; | |
font.drawInBatch( | |
p_114499_, f, (float)i, -2130706433, false, matrix4f, p_114501_, flag ? Font.DisplayMode.SEE_THROUGH : Font.DisplayMode.NORMAL, j, p_114502_ | |
); | |
if (flag) { | |
font.drawInBatch(p_114499_, f, (float)i, -1, false, matrix4f, p_114501_, Font.DisplayMode.NORMAL, 0, LightTexture.lightCoordsWithEmission(p_114502_, 2)); | |
} | |
p_114500_.popPose(); | |
} | |
} | |
protected Component getNameTag(T p_361489_) { | |
return p_361489_.getDisplayName(); | |
} | |
protected float getShadowRadius(S p_364114_) { | |
return this.shadowRadius; | |
} | |
protected float getShadowStrength(S p_376038_) { | |
return this.shadowStrength; | |
} | |
public abstract S createRenderState(); | |
public final S createRenderState(T p_363266_, float p_363950_) { | |
S s = this.reusedState; | |
this.extractRenderState(p_363266_, s, p_363950_); | |
return s; | |
} | |
public void extractRenderState(T p_367571_, S p_367427_, float p_363243_) { | |
p_367427_.x = Mth.lerp((double)p_363243_, p_367571_.xOld, p_367571_.getX()); | |
p_367427_.y = Mth.lerp((double)p_363243_, p_367571_.yOld, p_367571_.getY()); | |
p_367427_.z = Mth.lerp((double)p_363243_, p_367571_.zOld, p_367571_.getZ()); | |
p_367427_.isInvisible = p_367571_.isInvisible(); | |
p_367427_.ageInTicks = (float)p_367571_.tickCount + p_363243_; | |
p_367427_.boundingBoxWidth = p_367571_.getBbWidth(); | |
p_367427_.boundingBoxHeight = p_367571_.getBbHeight(); | |
p_367427_.eyeHeight = p_367571_.getEyeHeight(); | |
if (p_367571_.isPassenger() | |
&& p_367571_.getVehicle() instanceof AbstractMinecart abstractminecart | |
&& abstractminecart.getBehavior() instanceof NewMinecartBehavior newminecartbehavior | |
&& newminecartbehavior.cartHasPosRotLerp()) { | |
double d2 = Mth.lerp((double)p_363243_, abstractminecart.xOld, abstractminecart.getX()); | |
double d0 = Mth.lerp((double)p_363243_, abstractminecart.yOld, abstractminecart.getY()); | |
double d1 = Mth.lerp((double)p_363243_, abstractminecart.zOld, abstractminecart.getZ()); | |
p_367427_.passengerOffset = newminecartbehavior.getCartLerpPosition(p_363243_).subtract(new Vec3(d2, d0, d1)); | |
} else { | |
p_367427_.passengerOffset = null; | |
} | |
p_367427_.distanceToCameraSq = this.entityRenderDispatcher.distanceToSqr(p_367571_); | |
boolean flag = p_367427_.distanceToCameraSq < 4096.0 && this.shouldShowName(p_367571_, p_367427_.distanceToCameraSq); | |
if (flag) { | |
p_367427_.nameTag = this.getNameTag(p_367571_); | |
p_367427_.nameTagAttachment = p_367571_.getAttachments().getNullable(EntityAttachment.NAME_TAG, 0, p_367571_.getYRot(p_363243_)); | |
} else { | |
p_367427_.nameTag = null; | |
} | |
p_367427_.isDiscrete = p_367571_.isDiscrete(); | |
Entity entity = p_367571_ instanceof Leashable leashable ? leashable.getLeashHolder() : null; | |
if (entity != null) { | |
float f = p_367571_.getPreciseBodyRotation(p_363243_) * (float) (Math.PI / 180.0); | |
Vec3 vec3 = p_367571_.getLeashOffset(p_363243_).yRot(-f); | |
BlockPos blockpos1 = BlockPos.containing(p_367571_.getEyePosition(p_363243_)); | |
BlockPos blockpos = BlockPos.containing(entity.getEyePosition(p_363243_)); | |
if (p_367427_.leashState == null) { | |
p_367427_.leashState = new EntityRenderState.LeashState(); | |
} | |
EntityRenderState.LeashState entityrenderstate$leashstate = p_367427_.leashState; | |
entityrenderstate$leashstate.offset = vec3; | |
entityrenderstate$leashstate.start = p_367571_.getPosition(p_363243_).add(vec3); | |
entityrenderstate$leashstate.end = entity.getRopeHoldPosition(p_363243_); | |
entityrenderstate$leashstate.startBlockLight = this.getBlockLightLevel(p_367571_, blockpos1); | |
entityrenderstate$leashstate.endBlockLight = this.entityRenderDispatcher.getRenderer(entity).getBlockLightLevel(entity, blockpos); | |
entityrenderstate$leashstate.startSkyLight = p_367571_.level().getBrightness(LightLayer.SKY, blockpos1); | |
entityrenderstate$leashstate.endSkyLight = p_367571_.level().getBrightness(LightLayer.SKY, blockpos); | |
} else { | |
p_367427_.leashState = null; | |
} | |
p_367427_.displayFireAnimation = p_367571_.displayFireAnimation(); | |
} | |
} |