/* * Decompiled with CFR 0.152. * * Could not load the following classes: * org.joml.Matrix4f * org.joml.Matrix4fc * org.joml.Quaternionfc * org.jspecify.annotations.Nullable */ package net.minecraft.client.renderer; import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Axis; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.item.ItemStackRenderState; import net.minecraft.client.renderer.rendertype.RenderTypes; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.MaterialSet; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.core.BlockPos; import net.minecraft.resources.Identifier; import net.minecraft.tags.FluidTags; import net.minecraft.util.ARGB; import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; import org.joml.Matrix4f; import org.joml.Matrix4fc; import org.joml.Quaternionfc; import org.jspecify.annotations.Nullable; public class ScreenEffectRenderer { private static final Identifier UNDERWATER_LOCATION = Identifier.withDefaultNamespace("textures/misc/underwater.png"); private final Minecraft minecraft; private final MaterialSet materials; private final MultiBufferSource bufferSource; public static final int ITEM_ACTIVATION_ANIMATION_LENGTH = 40; private @Nullable ItemStack itemActivationItem; private int itemActivationTicks; private float itemActivationOffX; private float itemActivationOffY; public ScreenEffectRenderer(Minecraft minecraft, MaterialSet materials, MultiBufferSource bufferSource) { this.minecraft = minecraft; this.materials = materials; this.bufferSource = bufferSource; } public void tick() { if (this.itemActivationTicks > 0) { --this.itemActivationTicks; if (this.itemActivationTicks == 0) { this.itemActivationItem = null; } } } public void renderScreenEffect(boolean isSleeping, float partialTicks, SubmitNodeCollector submitNodeCollector) { PoseStack poseStack = new PoseStack(); LocalPlayer player = this.minecraft.player; if (this.minecraft.options.getCameraType().isFirstPerson() && !isSleeping) { BlockState blockState; if (!player.noPhysics && (blockState = ScreenEffectRenderer.getViewBlockingState(player)) != null) { ScreenEffectRenderer.renderTex(this.minecraft.getBlockRenderer().getBlockModelShaper().getParticleIcon(blockState), poseStack, this.bufferSource); } if (!this.minecraft.player.isSpectator()) { if (this.minecraft.player.isEyeInFluid(FluidTags.WATER)) { ScreenEffectRenderer.renderWater(this.minecraft, poseStack, this.bufferSource); } if (this.minecraft.player.isOnFire()) { TextureAtlasSprite fireSprite = this.materials.get(ModelBakery.FIRE_1); ScreenEffectRenderer.renderFire(poseStack, this.bufferSource, fireSprite); } } } if (!this.minecraft.options.hideGui) { this.renderItemActivationAnimation(poseStack, partialTicks, submitNodeCollector); } } private void renderItemActivationAnimation(PoseStack poseStack, float partialTicks, SubmitNodeCollector submitNodeCollector) { if (this.itemActivationItem == null || this.itemActivationTicks <= 0) { return; } int tick = 40 - this.itemActivationTicks; float scale = ((float)tick + partialTicks) / 40.0f; float ts = scale * scale; float tc = scale * ts; float smoothScale = 10.25f * tc * ts - 24.95f * ts * ts + 25.5f * tc - 13.8f * ts + 4.0f * scale; float piScale = smoothScale * (float)Math.PI; float aspectRatio = (float)this.minecraft.getWindow().getWidth() / (float)this.minecraft.getWindow().getHeight(); float offX = this.itemActivationOffX * 0.3f * aspectRatio; float offY = this.itemActivationOffY * 0.3f; poseStack.pushPose(); poseStack.translate(offX * Mth.abs(Mth.sin(piScale * 2.0f)), offY * Mth.abs(Mth.sin(piScale * 2.0f)), -10.0f + 9.0f * Mth.sin(piScale)); float size = 0.8f; poseStack.scale(0.8f, 0.8f, 0.8f); poseStack.mulPose((Quaternionfc)Axis.YP.rotationDegrees(900.0f * Mth.abs(Mth.sin(piScale)))); poseStack.mulPose((Quaternionfc)Axis.XP.rotationDegrees(6.0f * Mth.cos(scale * 8.0f))); poseStack.mulPose((Quaternionfc)Axis.ZP.rotationDegrees(6.0f * Mth.cos(scale * 8.0f))); this.minecraft.gameRenderer.getLighting().setupFor(Lighting.Entry.ITEMS_3D); ItemStackRenderState itemState = new ItemStackRenderState(); this.minecraft.getItemModelResolver().updateForTopItem(itemState, this.itemActivationItem, ItemDisplayContext.FIXED, this.minecraft.level, null, 0); itemState.submit(poseStack, submitNodeCollector, 0xF000F0, OverlayTexture.NO_OVERLAY, 0); poseStack.popPose(); } public void resetItemActivation() { this.itemActivationItem = null; } public void displayItemActivation(ItemStack itemStack, RandomSource random) { this.itemActivationItem = itemStack; this.itemActivationTicks = 40; this.itemActivationOffX = random.nextFloat() * 2.0f - 1.0f; this.itemActivationOffY = random.nextFloat() * 2.0f - 1.0f; } private static @Nullable BlockState getViewBlockingState(Player player) { BlockPos.MutableBlockPos testPos = new BlockPos.MutableBlockPos(); for (int i = 0; i < 8; ++i) { double xo = player.getX() + (double)(((float)((i >> 0) % 2) - 0.5f) * player.getBbWidth() * 0.8f); double yo = player.getEyeY() + (double)(((float)((i >> 1) % 2) - 0.5f) * 0.1f * player.getScale()); double zo = player.getZ() + (double)(((float)((i >> 2) % 2) - 0.5f) * player.getBbWidth() * 0.8f); testPos.set(xo, yo, zo); BlockState blockState = player.level().getBlockState(testPos); if (blockState.getRenderShape() == RenderShape.INVISIBLE || !blockState.isViewBlocking(player.level(), testPos)) continue; return blockState; } return null; } private static void renderTex(TextureAtlasSprite sprite, PoseStack poseStack, MultiBufferSource bufferSource) { float br = 0.1f; int color = ARGB.colorFromFloat(1.0f, 0.1f, 0.1f, 0.1f); float x0 = -1.0f; float x1 = 1.0f; float y0 = -1.0f; float y1 = 1.0f; float z0 = -0.5f; float u0 = sprite.getU0(); float u1 = sprite.getU1(); float v0 = sprite.getV0(); float v1 = sprite.getV1(); Matrix4f pose = poseStack.last().pose(); VertexConsumer builder = bufferSource.getBuffer(RenderTypes.blockScreenEffect(sprite.atlasLocation())); builder.addVertex((Matrix4fc)pose, -1.0f, -1.0f, -0.5f).setUv(u1, v1).setColor(color); builder.addVertex((Matrix4fc)pose, 1.0f, -1.0f, -0.5f).setUv(u0, v1).setColor(color); builder.addVertex((Matrix4fc)pose, 1.0f, 1.0f, -0.5f).setUv(u0, v0).setColor(color); builder.addVertex((Matrix4fc)pose, -1.0f, 1.0f, -0.5f).setUv(u1, v0).setColor(color); } private static void renderWater(Minecraft minecraft, PoseStack poseStack, MultiBufferSource bufferSource) { BlockPos pos = BlockPos.containing(minecraft.player.getX(), minecraft.player.getEyeY(), minecraft.player.getZ()); float br = LightTexture.getBrightness(minecraft.player.level().dimensionType(), minecraft.player.level().getMaxLocalRawBrightness(pos)); int color = ARGB.colorFromFloat(0.1f, br, br, br); float size = 4.0f; float x0 = -1.0f; float x1 = 1.0f; float y0 = -1.0f; float y1 = 1.0f; float z0 = -0.5f; float uo = -minecraft.player.getYRot() / 64.0f; float vo = minecraft.player.getXRot() / 64.0f; Matrix4f pose = poseStack.last().pose(); VertexConsumer builder = bufferSource.getBuffer(RenderTypes.blockScreenEffect(UNDERWATER_LOCATION)); builder.addVertex((Matrix4fc)pose, -1.0f, -1.0f, -0.5f).setUv(4.0f + uo, 4.0f + vo).setColor(color); builder.addVertex((Matrix4fc)pose, 1.0f, -1.0f, -0.5f).setUv(0.0f + uo, 4.0f + vo).setColor(color); builder.addVertex((Matrix4fc)pose, 1.0f, 1.0f, -0.5f).setUv(0.0f + uo, 0.0f + vo).setColor(color); builder.addVertex((Matrix4fc)pose, -1.0f, 1.0f, -0.5f).setUv(4.0f + uo, 0.0f + vo).setColor(color); } private static void renderFire(PoseStack poseStack, MultiBufferSource bufferSource, TextureAtlasSprite sprite) { VertexConsumer builder = bufferSource.getBuffer(RenderTypes.fireScreenEffect(sprite.atlasLocation())); float u0 = sprite.getU0(); float u1 = sprite.getU1(); float v0 = sprite.getV0(); float v1 = sprite.getV1(); float size = 1.0f; for (int i = 0; i < 2; ++i) { poseStack.pushPose(); float x0 = -0.5f; float x1 = 0.5f; float y0 = -0.5f; float y1 = 0.5f; float z0 = -0.5f; poseStack.translate((float)(-(i * 2 - 1)) * 0.24f, -0.3f, 0.0f); poseStack.mulPose((Quaternionfc)Axis.YP.rotationDegrees((float)(i * 2 - 1) * 10.0f)); Matrix4f pose = poseStack.last().pose(); builder.addVertex((Matrix4fc)pose, -0.5f, -0.5f, -0.5f).setUv(u1, v1).setColor(1.0f, 1.0f, 1.0f, 0.9f); builder.addVertex((Matrix4fc)pose, 0.5f, -0.5f, -0.5f).setUv(u0, v1).setColor(1.0f, 1.0f, 1.0f, 0.9f); builder.addVertex((Matrix4fc)pose, 0.5f, 0.5f, -0.5f).setUv(u0, v0).setColor(1.0f, 1.0f, 1.0f, 0.9f); builder.addVertex((Matrix4fc)pose, -0.5f, 0.5f, -0.5f).setUv(u1, v0).setColor(1.0f, 1.0f, 1.0f, 0.9f); poseStack.popPose(); } } }