minecraft-src/net/minecraft/client/renderer/entity/ItemEntityRenderer.java
2025-07-04 03:15:13 +03:00

98 lines
4 KiB
Java

package net.minecraft.client.renderer.entity;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Axis;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
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;
@Environment(EnvType.CLIENT)
public class ItemEntityRenderer extends EntityRenderer<ItemEntity, ItemEntityRenderState> {
private static final float ITEM_BUNDLE_OFFSET_SCALE = 0.15F;
private static final float FLAT_ITEM_BUNDLE_OFFSET_X = 0.0F;
private static final float FLAT_ITEM_BUNDLE_OFFSET_Y = 0.0F;
private static final float FLAT_ITEM_BUNDLE_OFFSET_Z = 0.09375F;
private final ItemModelResolver itemModelResolver;
private final RandomSource random = RandomSource.create();
public ItemEntityRenderer(EntityRendererProvider.Context context) {
super(context);
this.itemModelResolver = context.getItemModelResolver();
this.shadowRadius = 0.15F;
this.shadowStrength = 0.75F;
}
public ItemEntityRenderState createRenderState() {
return new ItemEntityRenderState();
}
public void extractRenderState(ItemEntity itemEntity, ItemEntityRenderState itemEntityRenderState, float f) {
super.extractRenderState(itemEntity, itemEntityRenderState, f);
itemEntityRenderState.ageInTicks = itemEntity.getAge() + f;
itemEntityRenderState.bobOffset = itemEntity.bobOffs;
itemEntityRenderState.extractItemGroupRenderState(itemEntity, itemEntity.getItem(), this.itemModelResolver);
}
public void render(ItemEntityRenderState itemEntityRenderState, PoseStack poseStack, MultiBufferSource multiBufferSource, int i) {
if (!itemEntityRenderState.item.isEmpty()) {
poseStack.pushPose();
float f = 0.25F;
float g = Mth.sin(itemEntityRenderState.ageInTicks / 10.0F + itemEntityRenderState.bobOffset) * 0.1F + 0.1F;
float h = itemEntityRenderState.item.transform().scale.y();
poseStack.translate(0.0F, g + 0.25F * h, 0.0F);
float j = ItemEntity.getSpin(itemEntityRenderState.ageInTicks, itemEntityRenderState.bobOffset);
poseStack.mulPose(Axis.YP.rotation(j));
renderMultipleFromCount(poseStack, multiBufferSource, i, itemEntityRenderState, this.random);
poseStack.popPose();
super.render(itemEntityRenderState, poseStack, multiBufferSource, i);
}
}
public static void renderMultipleFromCount(
PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, ItemClusterRenderState renderState, RandomSource random
) {
random.setSeed(renderState.seed);
int i = renderState.count;
ItemStackRenderState itemStackRenderState = renderState.item;
boolean bl = itemStackRenderState.isGui3d();
float f = itemStackRenderState.transform().scale.x();
float g = itemStackRenderState.transform().scale.y();
float h = itemStackRenderState.transform().scale.z();
if (!bl) {
float j = -0.0F * (i - 1) * 0.5F * f;
float k = -0.0F * (i - 1) * 0.5F * g;
float l = -0.09375F * (i - 1) * 0.5F * h;
poseStack.translate(j, k, l);
}
for (int m = 0; m < i; m++) {
poseStack.pushPose();
if (m > 0) {
if (bl) {
float k = (random.nextFloat() * 2.0F - 1.0F) * 0.15F;
float l = (random.nextFloat() * 2.0F - 1.0F) * 0.15F;
float n = (random.nextFloat() * 2.0F - 1.0F) * 0.15F;
poseStack.translate(k, l, n);
} else {
float k = (random.nextFloat() * 2.0F - 1.0F) * 0.15F * 0.5F;
float l = (random.nextFloat() * 2.0F - 1.0F) * 0.15F * 0.5F;
poseStack.translate(k, l, 0.0F);
}
}
itemStackRenderState.render(poseStack, bufferSource, packedLight, OverlayTexture.NO_OVERLAY);
poseStack.popPose();
if (!bl) {
poseStack.translate(0.0F * f, 0.0F * g, 0.09375F * h);
}
}
}
}