98 lines
4 KiB
Java
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);
|
|
}
|
|
}
|
|
}
|
|
}
|