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 { 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); } } } }