Skip to content

Commit

Permalink
Merge pull request #1279 from ZhuRuoLing/releases/1.21
Browse files Browse the repository at this point in the history
修复流体渲染以及为方块添加tint
  • Loading branch information
ZhuRuoLing authored Dec 8, 2024
2 parents 5fc4605 + a6357d7 commit 54d5642
Show file tree
Hide file tree
Showing 4 changed files with 147 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import dev.dubhe.anvilcraft.util.LevelLike;
import dev.dubhe.anvilcraft.util.RecipeUtil;

import dev.dubhe.anvilcraft.util.VertexConsumerWithPose;
import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.Minecraft;
Expand Down Expand Up @@ -232,7 +233,7 @@ public void draw(
if (!fluid.isEmpty()) {
RenderType renderType = ItemBlockRenderTypes.getRenderLayer(fluid);
VertexConsumer vertex = buffers.getBuffer(renderType);
blockRenderer.renderLiquid(pos, level, vertex, state, fluid);
blockRenderer.renderLiquid(pos, level, new VertexConsumerWithPose(vertex, pose.last(), pos), state, fluid);
}
if (state.getRenderShape() != RenderShape.INVISIBLE) {
BakedModel bakedModel = blockRenderer.getBlockModel(state);
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/dev/dubhe/anvilcraft/util/LevelLike.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import lombok.Getter;
import lombok.Setter;
import net.minecraft.world.level.material.Fluids;
import org.jetbrains.annotations.Nullable;

import java.util.HashMap;
Expand Down Expand Up @@ -147,4 +148,21 @@ public void previousLayer() {
currentVisibleLayer--;
}
}

public static class AirLevelLike extends LevelLike{

public AirLevelLike(ClientLevel parent) {
super(parent);
}

@Override
public BlockState getBlockState(BlockPos pos) {
return Blocks.AIR.defaultBlockState();
}

@Override
public FluidState getFluidState(BlockPos blockPos) {
return Fluids.EMPTY.defaultFluidState();
}
}
}
78 changes: 67 additions & 11 deletions src/main/java/dev/dubhe/anvilcraft/util/RenderHelper.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.dubhe.anvilcraft.util;

import com.mojang.blaze3d.platform.Lighting;
import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.SheetedDecalTextureGenerator;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.blaze3d.vertex.VertexMultiConsumer;
Expand All @@ -10,12 +11,15 @@
import net.minecraft.ReportedException;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.ItemBlockRenderTypes;
import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderStateShard;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.Sheets;
import net.minecraft.client.renderer.block.BlockRenderDispatcher;
import net.minecraft.client.renderer.block.LiquidBlockRenderer;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.entity.ItemRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture;
Expand All @@ -35,16 +39,20 @@
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.HalfTransparentBlock;
import net.minecraft.world.level.block.LiquidBlock;
import net.minecraft.world.level.block.RenderShape;
import net.minecraft.world.level.block.StainedGlassPaneBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.material.FlowingFluid;
import net.minecraft.world.level.material.FluidState;

import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Axis;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import net.minecraft.world.level.material.Fluids;
import net.neoforged.neoforge.client.model.data.ModelData;
import org.joml.Vector3f;

Expand All @@ -58,15 +66,47 @@ public class RenderHelper {
private static final Vector3f L1 = new Vector3f(0.4F, 0.0F, 1.0F).normalize();
private static final Vector3f L2 = new Vector3f(-0.4F, 1.0F, -0.2F).normalize();

public static final BlockRenderFunction SINGLE_BLOCK = (block, poseStack, buffers) -> Minecraft.getInstance()
.getBlockRenderer()
.renderSingleBlock(block, poseStack, buffers, 0xF000F0, OverlayTexture.NO_OVERLAY);

private static final ModelResourceLocation TRIDENT_MODEL = ModelResourceLocation.inventory(ResourceLocation.withDefaultNamespace("trident"));
private static final ModelResourceLocation SPYGLASS_MODEL = ModelResourceLocation.inventory(ResourceLocation.withDefaultNamespace("spyglass"));
private static ClientLevel currentClientLevel = null;
private static LevelLike.AirLevelLike airLevelLike = null;

public static final BlockRenderFunction SINGLE_BLOCK = (blockState, poseStack, buffers) -> {
BlockRenderDispatcher blockRenderDispatcher = Minecraft.getInstance().getBlockRenderer();
BakedModel model = blockRenderDispatcher.getBlockModel(blockState);
for (RenderType renderType : model.getRenderTypes(blockState, RANDOM, ModelData.EMPTY)) {
VertexConsumer bufferBuilder = buffers.getBuffer(renderType);
blockRenderDispatcher.renderBatched(
blockState,
BlockPos.ZERO,
airLevelLike,
poseStack,
bufferBuilder,
true,
RANDOM,
ModelData.EMPTY,
renderType
);
}
};

public static void renderBlock(
GuiGraphics guiGraphics, BlockState block, float x, float y, float z, float scale, BlockRenderFunction fn) {
GuiGraphics guiGraphics,
BlockState block,
float x,
float y,
float z,
float scale,
BlockRenderFunction fn
) {
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();
ClientLevel level = Minecraft.getInstance().level;
if (currentClientLevel != level) {
airLevelLike = new LevelLike.AirLevelLike(level);
currentClientLevel = level;
}
PoseStack poseStack = guiGraphics.pose();

poseStack.pushPose();
Expand All @@ -82,13 +122,28 @@ public static void renderBlock(
poseStack.translate(0, 0, -1);

FluidState fluidState = block.getFluidState();
if (fluidState.isEmpty()) {
MultiBufferSource.BufferSource buffers =
Minecraft.getInstance().renderBuffers().bufferSource();

RenderSystem.setupGui3DDiffuseLighting(L1, L2);
fn.renderBlock(block, poseStack, buffers);

MultiBufferSource.BufferSource buffers =
Minecraft.getInstance().renderBuffers().bufferSource();

RenderSystem.setupGui3DDiffuseLighting(L1, L2);
fn.renderBlock(block, poseStack, buffers);
buffers.endLastBatch();
if (!fluidState.isEmpty()) {
if (block.getBlock() instanceof LiquidBlock) {
block = block.setValue(LiquidBlock.LEVEL, block.getFluidState().getAmount());
}
BlockRenderDispatcher blockRenderDispatcher = Minecraft.getInstance().getBlockRenderer();
blockRenderDispatcher.renderLiquid(
BlockPos.ZERO,
airLevelLike,
new VertexConsumerWithPose(
buffers.getBuffer(ItemBlockRenderTypes.getRenderLayer(fluidState)),
poseStack.last(),
BlockPos.ZERO
),
block,
fluidState
);
buffers.endLastBatch();
}

Expand Down Expand Up @@ -283,6 +338,7 @@ public static float getPartialTick() {
return Minecraft.getInstance().getTimer().getGameTimeDeltaPartialTick(Minecraft.getInstance().isPaused());
}


@FunctionalInterface
public interface BlockRenderFunction {
void renderBlock(BlockState block, PoseStack poseStack, MultiBufferSource.BufferSource buffers);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package dev.dubhe.anvilcraft.util;

import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.core.BlockPos;

import javax.annotation.ParametersAreNonnullByDefault;

@ParametersAreNonnullByDefault
public class VertexConsumerWithPose implements VertexConsumer {
private final VertexConsumer parent;
private final PoseStack.Pose pose;
private final BlockPos originPos;


public VertexConsumerWithPose(VertexConsumer parent, PoseStack.Pose pose, BlockPos originPos) {
this.parent = parent;
this.pose = pose;
this.originPos = originPos;
}

@Override
public VertexConsumer addVertex(float x, float y, float z) {
float dx = originPos.getX() & 15;
float dy = originPos.getY() & 15;
float dz = originPos.getZ() & 15;
return parent.addVertex(pose, x - dx, y - dy, z - dz);
}

@Override
public VertexConsumer setColor(int r, int g, int b, int a) {
return parent.setColor(r, g, b, a);
}

@Override
public VertexConsumer setUv(float u, float v) {
return parent.setUv(u, v);
}

@Override
public VertexConsumer setUv1(int u, int v) {
return parent.setUv1(u, v);
}

@Override
public VertexConsumer setOverlay(int uv) {
return parent.setUv1(uv & 65535, uv >> 16 & 65535);
}

@Override
public VertexConsumer setUv2(int u, int v) {
return parent.setUv2(u, v);
}

@Override
public VertexConsumer setNormal(float x, float y, float z) {
return parent.setNormal(pose, x, y, z);
}

}

0 comments on commit 54d5642

Please sign in to comment.