Code/net/minecraft/client/renderer/entity/ItemEntityRenderer.java

107 lines
5.2 KiB
Java
Raw Normal View History

2025-07-01 06:20:03 +00:00
package net.minecraft.client.renderer.entity;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Axis;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.entity.state.ItemClusterRenderState;
import net.minecraft.client.renderer.entity.state.ItemEntityRenderState;
import net.minecraft.client.renderer.item.ItemModelResolver;
import net.minecraft.client.renderer.item.ItemStackRenderState;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.util.Mth;
import net.minecraft.util.RandomSource;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.phys.AABB;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT)
public class ItemEntityRenderer extends EntityRenderer<ItemEntity, ItemEntityRenderState> {
private static final float ITEM_MIN_HOVER_HEIGHT = 0.0625F;
private static final float ITEM_BUNDLE_OFFSET_SCALE = 0.15F;
private static final float FLAT_ITEM_DEPTH_THRESHOLD = 0.0625F;
private final ItemModelResolver itemModelResolver;
private final RandomSource random = RandomSource.create();
public ItemEntityRenderer(EntityRendererProvider.Context p_174198_) {
super(p_174198_);
this.itemModelResolver = p_174198_.getItemModelResolver();
this.shadowRadius = 0.15F;
this.shadowStrength = 0.75F;
}
public ItemEntityRenderState createRenderState() {
return new ItemEntityRenderState();
}
public void extractRenderState(ItemEntity p_365788_, ItemEntityRenderState p_361751_, float p_369533_) {
super.extractRenderState(p_365788_, p_361751_, p_369533_);
p_361751_.ageInTicks = p_365788_.getAge() + p_369533_;
p_361751_.bobOffset = p_365788_.bobOffs;
p_361751_.extractItemGroupRenderState(p_365788_, p_365788_.getItem(), this.itemModelResolver);
}
private static AABB calculateModelBoundingBox(ItemStackRenderState p_393011_) {
AABB.Builder aabb$builder = new AABB.Builder();
p_393011_.visitExtents(aabb$builder::include);
return aabb$builder.build();
}
public void render(ItemEntityRenderState p_365095_, PoseStack p_115030_, MultiBufferSource p_115031_, int p_115032_) {
if (!p_365095_.item.isEmpty()) {
p_115030_.pushPose();
AABB aabb = calculateModelBoundingBox(p_365095_.item);
float f = -((float)aabb.minY) + 0.0625F;
float f1 = Mth.sin(p_365095_.ageInTicks / 10.0F + p_365095_.bobOffset) * 0.1F + 0.1F;
p_115030_.translate(0.0F, f1 + f, 0.0F);
float f2 = ItemEntity.getSpin(p_365095_.ageInTicks, p_365095_.bobOffset);
p_115030_.mulPose(Axis.YP.rotation(f2));
renderMultipleFromCount(p_115030_, p_115031_, p_115032_, p_365095_, this.random, aabb);
p_115030_.popPose();
super.render(p_365095_, p_115030_, p_115031_, p_115032_);
}
}
public static void renderMultipleFromCount(PoseStack p_330844_, MultiBufferSource p_333382_, int p_334169_, ItemClusterRenderState p_377874_, RandomSource p_331892_) {
renderMultipleFromCount(p_330844_, p_333382_, p_334169_, p_377874_, p_331892_, calculateModelBoundingBox(p_377874_.item));
}
public static void renderMultipleFromCount(
PoseStack p_393139_, MultiBufferSource p_391270_, int p_395923_, ItemClusterRenderState p_394871_, RandomSource p_392388_, AABB p_394505_
) {
int i = p_394871_.count;
if (i != 0) {
p_392388_.setSeed(p_394871_.seed);
ItemStackRenderState itemstackrenderstate = p_394871_.item;
float f = (float)p_394505_.getZsize();
if (f > 0.0625F) {
itemstackrenderstate.render(p_393139_, p_391270_, p_395923_, OverlayTexture.NO_OVERLAY);
for (int j = 1; j < i; j++) {
p_393139_.pushPose();
float f1 = (p_392388_.nextFloat() * 2.0F - 1.0F) * 0.15F;
float f2 = (p_392388_.nextFloat() * 2.0F - 1.0F) * 0.15F;
float f3 = (p_392388_.nextFloat() * 2.0F - 1.0F) * 0.15F;
p_393139_.translate(f1, f2, f3);
itemstackrenderstate.render(p_393139_, p_391270_, p_395923_, OverlayTexture.NO_OVERLAY);
p_393139_.popPose();
}
} else {
float f4 = f * 1.5F;
p_393139_.translate(0.0F, 0.0F, -(f4 * (i - 1) / 2.0F));
itemstackrenderstate.render(p_393139_, p_391270_, p_395923_, OverlayTexture.NO_OVERLAY);
p_393139_.translate(0.0F, 0.0F, f4);
for (int k = 1; k < i; k++) {
p_393139_.pushPose();
float f5 = (p_392388_.nextFloat() * 2.0F - 1.0F) * 0.15F * 0.5F;
float f6 = (p_392388_.nextFloat() * 2.0F - 1.0F) * 0.15F * 0.5F;
p_393139_.translate(f5, f6, 0.0F);
itemstackrenderstate.render(p_393139_, p_391270_, p_395923_, OverlayTexture.NO_OVERLAY);
p_393139_.popPose();
p_393139_.translate(0.0F, 0.0F, f4);
}
}
}
}
}