137 lines
5.7 KiB
Java
137 lines
5.7 KiB
Java
package net.minecraft.client.renderer;
|
|
|
|
import com.mojang.blaze3d.vertex.PoseStack;
|
|
import com.mojang.blaze3d.vertex.VertexConsumer;
|
|
import com.mojang.math.Axis;
|
|
import net.fabricmc.api.EnvType;
|
|
import net.fabricmc.api.Environment;
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
|
import net.minecraft.client.resources.model.ModelBakery;
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.resources.ResourceLocation;
|
|
import net.minecraft.tags.FluidTags;
|
|
import net.minecraft.util.ARGB;
|
|
import net.minecraft.util.Mth;
|
|
import net.minecraft.world.entity.player.Player;
|
|
import net.minecraft.world.level.block.RenderShape;
|
|
import net.minecraft.world.level.block.state.BlockState;
|
|
import org.jetbrains.annotations.Nullable;
|
|
import org.joml.Matrix4f;
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
public class ScreenEffectRenderer {
|
|
private static final ResourceLocation UNDERWATER_LOCATION = ResourceLocation.withDefaultNamespace("textures/misc/underwater.png");
|
|
|
|
public static void renderScreenEffect(Minecraft minecraft, PoseStack poseStack, MultiBufferSource bufferSource) {
|
|
Player player = minecraft.player;
|
|
if (!player.noPhysics) {
|
|
BlockState blockState = getViewBlockingState(player);
|
|
if (blockState != null) {
|
|
renderTex(minecraft.getBlockRenderer().getBlockModelShaper().getParticleIcon(blockState), poseStack, bufferSource);
|
|
}
|
|
}
|
|
|
|
if (!minecraft.player.isSpectator()) {
|
|
if (minecraft.player.isEyeInFluid(FluidTags.WATER)) {
|
|
renderWater(minecraft, poseStack, bufferSource);
|
|
}
|
|
|
|
if (minecraft.player.isOnFire()) {
|
|
renderFire(poseStack, bufferSource);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Nullable
|
|
private static BlockState getViewBlockingState(Player player) {
|
|
BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos();
|
|
|
|
for (int i = 0; i < 8; i++) {
|
|
double d = player.getX() + ((i >> 0) % 2 - 0.5F) * player.getBbWidth() * 0.8F;
|
|
double e = player.getEyeY() + ((i >> 1) % 2 - 0.5F) * 0.1F * player.getScale();
|
|
double f = player.getZ() + ((i >> 2) % 2 - 0.5F) * player.getBbWidth() * 0.8F;
|
|
mutableBlockPos.set(d, e, f);
|
|
BlockState blockState = player.level().getBlockState(mutableBlockPos);
|
|
if (blockState.getRenderShape() != RenderShape.INVISIBLE && blockState.isViewBlocking(player.level(), mutableBlockPos)) {
|
|
return blockState;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private static void renderTex(TextureAtlasSprite texture, PoseStack poseStack, MultiBufferSource bufferSource) {
|
|
float f = 0.1F;
|
|
int i = ARGB.colorFromFloat(1.0F, 0.1F, 0.1F, 0.1F);
|
|
float g = -1.0F;
|
|
float h = 1.0F;
|
|
float j = -1.0F;
|
|
float k = 1.0F;
|
|
float l = -0.5F;
|
|
float m = texture.getU0();
|
|
float n = texture.getU1();
|
|
float o = texture.getV0();
|
|
float p = texture.getV1();
|
|
Matrix4f matrix4f = poseStack.last().pose();
|
|
VertexConsumer vertexConsumer = bufferSource.getBuffer(RenderType.blockScreenEffect(texture.atlasLocation()));
|
|
vertexConsumer.addVertex(matrix4f, -1.0F, -1.0F, -0.5F).setUv(n, p).setColor(i);
|
|
vertexConsumer.addVertex(matrix4f, 1.0F, -1.0F, -0.5F).setUv(m, p).setColor(i);
|
|
vertexConsumer.addVertex(matrix4f, 1.0F, 1.0F, -0.5F).setUv(m, o).setColor(i);
|
|
vertexConsumer.addVertex(matrix4f, -1.0F, 1.0F, -0.5F).setUv(n, o).setColor(i);
|
|
}
|
|
|
|
private static void renderWater(Minecraft mnecraft, PoseStack poseStack, MultiBufferSource bufferSource) {
|
|
BlockPos blockPos = BlockPos.containing(mnecraft.player.getX(), mnecraft.player.getEyeY(), mnecraft.player.getZ());
|
|
float f = LightTexture.getBrightness(mnecraft.player.level().dimensionType(), mnecraft.player.level().getMaxLocalRawBrightness(blockPos));
|
|
int i = ARGB.colorFromFloat(0.1F, f, f, f);
|
|
float g = 4.0F;
|
|
float h = -1.0F;
|
|
float j = 1.0F;
|
|
float k = -1.0F;
|
|
float l = 1.0F;
|
|
float m = -0.5F;
|
|
float n = -mnecraft.player.getYRot() / 64.0F;
|
|
float o = mnecraft.player.getXRot() / 64.0F;
|
|
Matrix4f matrix4f = poseStack.last().pose();
|
|
VertexConsumer vertexConsumer = bufferSource.getBuffer(RenderType.blockScreenEffect(UNDERWATER_LOCATION));
|
|
vertexConsumer.addVertex(matrix4f, -1.0F, -1.0F, -0.5F).setUv(4.0F + n, 4.0F + o).setColor(i);
|
|
vertexConsumer.addVertex(matrix4f, 1.0F, -1.0F, -0.5F).setUv(0.0F + n, 4.0F + o).setColor(i);
|
|
vertexConsumer.addVertex(matrix4f, 1.0F, 1.0F, -0.5F).setUv(0.0F + n, 0.0F + o).setColor(i);
|
|
vertexConsumer.addVertex(matrix4f, -1.0F, 1.0F, -0.5F).setUv(4.0F + n, 0.0F + o).setColor(i);
|
|
}
|
|
|
|
private static void renderFire(PoseStack poseStack, MultiBufferSource bufferSource) {
|
|
TextureAtlasSprite textureAtlasSprite = ModelBakery.FIRE_1.sprite();
|
|
VertexConsumer vertexConsumer = bufferSource.getBuffer(RenderType.fireScreenEffect(textureAtlasSprite.atlasLocation()));
|
|
float f = textureAtlasSprite.getU0();
|
|
float g = textureAtlasSprite.getU1();
|
|
float h = (f + g) / 2.0F;
|
|
float i = textureAtlasSprite.getV0();
|
|
float j = textureAtlasSprite.getV1();
|
|
float k = (i + j) / 2.0F;
|
|
float l = textureAtlasSprite.uvShrinkRatio();
|
|
float m = Mth.lerp(l, f, h);
|
|
float n = Mth.lerp(l, g, h);
|
|
float o = Mth.lerp(l, i, k);
|
|
float p = Mth.lerp(l, j, k);
|
|
float q = 1.0F;
|
|
|
|
for (int r = 0; r < 2; r++) {
|
|
poseStack.pushPose();
|
|
float s = -0.5F;
|
|
float t = 0.5F;
|
|
float u = -0.5F;
|
|
float v = 0.5F;
|
|
float w = -0.5F;
|
|
poseStack.translate(-(r * 2 - 1) * 0.24F, -0.3F, 0.0F);
|
|
poseStack.mulPose(Axis.YP.rotationDegrees((r * 2 - 1) * 10.0F));
|
|
Matrix4f matrix4f = poseStack.last().pose();
|
|
vertexConsumer.addVertex(matrix4f, -0.5F, -0.5F, -0.5F).setUv(n, p).setColor(1.0F, 1.0F, 1.0F, 0.9F);
|
|
vertexConsumer.addVertex(matrix4f, 0.5F, -0.5F, -0.5F).setUv(m, p).setColor(1.0F, 1.0F, 1.0F, 0.9F);
|
|
vertexConsumer.addVertex(matrix4f, 0.5F, 0.5F, -0.5F).setUv(m, o).setColor(1.0F, 1.0F, 1.0F, 0.9F);
|
|
vertexConsumer.addVertex(matrix4f, -0.5F, 0.5F, -0.5F).setUv(n, o).setColor(1.0F, 1.0F, 1.0F, 0.9F);
|
|
poseStack.popPose();
|
|
}
|
|
}
|
|
}
|