From 174516bfae68b895888080244d5b6636a67c3ff8 Mon Sep 17 00:00:00 2001 From: ZhuRuoLing <3489382552@qq.com> Date: Wed, 6 Nov 2024 18:46:37 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=BF=80=E5=85=89?= =?UTF-8?q?=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../block/entity/BaseLaserBlockEntity.java | 4 + .../block/entity/RubyLaserBlockEntity.java | 5 + .../renderer/blockentity/LaserRenderer.java | 174 +---------------- .../client/renderer/laser/LaserCompiler.java | 176 ++++++++++++++++++ .../client/renderer/laser/LaserState.java | 43 +++++ .../dubhe/anvilcraft/init/ModRenderTypes.java | 55 +++++- .../anvilcraft/mixin/LevelRendererMixin.java | 99 ++++++++++ .../anvilcraft/mixin/RenderTypeMixin.java | 32 ++++ .../mixin/SectionCompilerMixin.java | 73 ++++++++ .../anvilcraft/network/LaserEmitPacket.java | 5 + .../resources/META-INF/accesstransformer.cfg | 4 +- src/main/resources/anvilcraft.mixins.json | 2 + 12 files changed, 499 insertions(+), 173 deletions(-) create mode 100644 src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java create mode 100644 src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserState.java create mode 100644 src/main/java/dev/dubhe/anvilcraft/mixin/LevelRendererMixin.java create mode 100644 src/main/java/dev/dubhe/anvilcraft/mixin/RenderTypeMixin.java create mode 100644 src/main/java/dev/dubhe/anvilcraft/mixin/SectionCompilerMixin.java diff --git a/src/main/java/dev/dubhe/anvilcraft/block/entity/BaseLaserBlockEntity.java b/src/main/java/dev/dubhe/anvilcraft/block/entity/BaseLaserBlockEntity.java index be7fcf028..4ef92154d 100644 --- a/src/main/java/dev/dubhe/anvilcraft/block/entity/BaseLaserBlockEntity.java +++ b/src/main/java/dev/dubhe/anvilcraft/block/entity/BaseLaserBlockEntity.java @@ -225,6 +225,10 @@ public void setRemoved() { irradiateBlockEntity.onCancelingIrradiation(this); } + public float laserOffset() { + return 0; + } + /** * 为了适配forge中修改的渲染逻辑所添加的函数 * 返回一个无限碰撞箱 diff --git a/src/main/java/dev/dubhe/anvilcraft/block/entity/RubyLaserBlockEntity.java b/src/main/java/dev/dubhe/anvilcraft/block/entity/RubyLaserBlockEntity.java index 1bfe886f0..842e259f1 100644 --- a/src/main/java/dev/dubhe/anvilcraft/block/entity/RubyLaserBlockEntity.java +++ b/src/main/java/dev/dubhe/anvilcraft/block/entity/RubyLaserBlockEntity.java @@ -95,6 +95,11 @@ public int getInputPower() { return getBlockState().getValue(RubyLaserBlock.SWITCH) == Switch.OFF ? 0 : 16; } + @Override + public float laserOffset() { + return 0.489f; + } + @Override public Direction getDirection() { return this.getBlockState().getValue(RubyLaserBlock.FACING); diff --git a/src/main/java/dev/dubhe/anvilcraft/client/renderer/blockentity/LaserRenderer.java b/src/main/java/dev/dubhe/anvilcraft/client/renderer/blockentity/LaserRenderer.java index fc6277fcb..dbfd14ff2 100644 --- a/src/main/java/dev/dubhe/anvilcraft/client/renderer/blockentity/LaserRenderer.java +++ b/src/main/java/dev/dubhe/anvilcraft/client/renderer/blockentity/LaserRenderer.java @@ -1,24 +1,15 @@ package dev.dubhe.anvilcraft.client.renderer.blockentity; -import dev.dubhe.anvilcraft.AnvilCraft; import dev.dubhe.anvilcraft.block.entity.BaseLaserBlockEntity; -import dev.dubhe.anvilcraft.block.entity.RubyLaserBlockEntity; -import dev.dubhe.anvilcraft.init.ModRenderTypes; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.client.renderer.texture.TextureAtlas; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.phys.AABB; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; import javax.annotation.ParametersAreNonnullByDefault; @@ -39,172 +30,17 @@ public void render( int packedLight, int packedOverlay ) { - if (blockEntity.getLevel() == null) return; - if (blockEntity.irradiateBlockPos == null) return; - final TextureAtlasSprite sprite = Minecraft.getInstance() - .getTextureAtlas(TextureAtlas.LOCATION_BLOCKS) - .apply(AnvilCraft.of("block/laser")); - poseStack.pushPose(); - poseStack.translate(0.5f, 0.5f, 0.5); - float offset = 0; - VertexConsumer consumer = buffer.getBuffer(ModRenderTypes.LASER); - float length = (float) (blockEntity - .irradiateBlockPos - .getCenter() - .distanceTo(blockEntity.getBlockPos().getCenter()) - 0.5); - if (blockEntity instanceof RubyLaserBlockEntity) offset = 0.489f; - poseStack.mulPose(blockEntity.getDirection().getRotation()); - renderBox( - consumer, - poseStack, - -0.0625f, - -offset, - -0.0625f, - 0.0625f, - length, - 0.0625f, - sprite - ); - renderBox( - consumer, - poseStack, - -0.0625f, - length, - -0.0625f, - 0.0625f, - length + 0.3f, - 0.0625f, - 0.35f, - sprite - ); - renderBox( - consumer, - poseStack, - -0.0625f, - length + 0.3f, - -0.0625f, - 0.0625f, - length + 0.57f, - 0.0625f, - 0.15f, - sprite - ); - if (buffer instanceof MultiBufferSource.BufferSource bufferSource) { - bufferSource.endBatch(); - } - poseStack.popPose(); - } - - private static void renderBox( - VertexConsumer consumer, - PoseStack poseStack, - float minX, - float minY, - float minZ, - float maxX, - float maxY, - float maxZ, - TextureAtlasSprite sprite) { - renderQuadX(consumer, poseStack, maxX, maxX, minY, minZ, maxY, maxZ, 0.5f, sprite); - renderQuadX(consumer, poseStack, minX, minX, minY, maxZ, maxY, minZ, 0.5f, sprite); - renderQuadY(consumer, poseStack, maxY, maxY, minX, minZ, maxX, maxZ, 0.5f, sprite); - renderQuadY(consumer, poseStack, minY, minY, maxX, minZ, minX, maxZ, 0.5f, sprite); - renderQuadZ(consumer, poseStack, maxZ, maxZ, minX, maxY, maxX, minY, 0.5f, sprite); - renderQuadZ(consumer, poseStack, minZ, minZ, minX, minY, maxX, maxY, 0.5f, sprite); - } - - private static void renderBox( - VertexConsumer consumer, - PoseStack poseStack, - float minX, - float minY, - float minZ, - float maxX, - float maxY, - float maxZ, - float a, - TextureAtlasSprite sprite) { - renderQuadX(consumer, poseStack, maxX, maxX, minY, minZ, maxY, maxZ, a, sprite); - renderQuadX(consumer, poseStack, minX, minX, minY, maxZ, maxY, minZ, a, sprite); - renderQuadY(consumer, poseStack, maxY, maxY, minX, minZ, maxX, maxZ, a, sprite); - renderQuadY(consumer, poseStack, minY, minY, maxX, minZ, minX, maxZ, a, sprite); - renderQuadZ(consumer, poseStack, maxZ, maxZ, minX, maxY, maxX, minY, a, sprite); - renderQuadZ(consumer, poseStack, minZ, minZ, minX, minY, maxX, maxY, a, sprite); - } - - private static void renderQuadX( - VertexConsumer consumer, - PoseStack poseStack, - float minX, - float maxX, - float minY, - float minZ, - float maxY, - float maxZ, - float a, - TextureAtlasSprite sprite) { - addVertex(consumer, poseStack, minX, maxY, minZ, sprite.getU1(), sprite.getV1(), a); - addVertex(consumer, poseStack, minX, maxY, maxZ, sprite.getU0(), sprite.getV1(), a); - addVertex(consumer, poseStack, maxX, minY, maxZ, sprite.getU0(), sprite.getV0(), a); - addVertex(consumer, poseStack, maxX, minY, minZ, sprite.getU1(), sprite.getV0(), a); - } - - private static void renderQuadY( - VertexConsumer consumer, - PoseStack poseStack, - float minY, - float maxY, - float minX, - float minZ, - float maxX, - float maxZ, - float a, - TextureAtlasSprite sprite) { - addVertex(consumer, poseStack, minX, minY, minZ, sprite.getU1(), sprite.getV1(), a); - addVertex(consumer, poseStack, minX, minY, maxZ, sprite.getU0(), sprite.getV1(), a); - addVertex(consumer, poseStack, maxX, maxY, maxZ, sprite.getU0(), sprite.getV0(), a); - addVertex(consumer, poseStack, maxX, maxY, minZ, sprite.getU1(), sprite.getV0(), a); - } - - private static void renderQuadZ( - VertexConsumer consumer, - PoseStack poseStack, - float minZ, - float maxZ, - float minX, - float minY, - float maxX, - float maxY, - float a, - TextureAtlasSprite sprite) { - addVertex(consumer, poseStack, minX, maxY, minZ, sprite.getU1(), sprite.getV1(), a); - addVertex(consumer, poseStack, maxX, maxY, minZ, sprite.getU0(), sprite.getV1(), a); - addVertex(consumer, poseStack, maxX, minY, maxZ, sprite.getU0(), sprite.getV0(), a); - addVertex(consumer, poseStack, minX, minY, maxZ, sprite.getU1(), sprite.getV0(), a); } @Override public AABB getRenderBoundingBox(BaseLaserBlockEntity blockEntity) { int renderDistance = Minecraft.getInstance().options.getEffectiveRenderDistance() * 16; return AABB.ofSize( - blockEntity.getBlockPos().getCenter(), renderDistance * 2, renderDistance * 2, renderDistance * 2); - } - - private static void addVertex( - VertexConsumer consumer, - PoseStack poseStack, - float x, - float y, - float z, - float u, - float v, - float a) { - consumer.addVertex(poseStack.last().pose(), x, y, z) - .setColor(1f, .2f, .2f, a) - .setUv(u, v) - .setUv1(0, 0) - .setUv2(240, 240) - .setNormal(1, 0, 0); + blockEntity.getBlockPos().getCenter(), + renderDistance * 2, + renderDistance * 2, + renderDistance * 2 + ); } @Override diff --git a/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java b/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java new file mode 100644 index 000000000..6dae39be6 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java @@ -0,0 +1,176 @@ +package dev.dubhe.anvilcraft.client.renderer.laser; + +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.blaze3d.vertex.VertexSorting; +import dev.dubhe.anvilcraft.init.ModRenderTypes; +import lombok.Getter; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.SectionBufferBuilderPack; +import net.minecraft.client.renderer.chunk.RenderChunkRegion; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.SectionPos; +import net.neoforged.neoforge.client.event.AddSectionGeometryEvent; + +import java.util.List; +import java.util.function.Function; + +public class LaserCompiler { + @Getter + private static final LaserCompiler instance = new LaserCompiler(); + + public void compile( + SectionPos sectionPos, + RenderChunkRegion region, + VertexSorting vertexSorting, + SectionBufferBuilderPack sectionBufferBuilderPack, + List additionalRenderers, + LaserState state, + Function bufferBuilderFunction + ) { + BufferBuilder builder = bufferBuilderFunction.apply(RenderType.TRANSLUCENT); + renderBox( + builder, + state.pose(), + -0.0625f, + -state.offset(), + -0.0625f, + 0.0625f, + state.length(), + 0.0625f, + state.atlasSprite() + ); + renderBox( + builder, + state.pose(), + -0.0625f, + state.length(), + -0.0625f, + 0.0625f, + state.length() + 0.3f, + 0.0625f, + 0.35f, + state.atlasSprite() + ); + renderBox( + builder, + state.pose(), + -0.0625f, + state.length() + 0.3f, + -0.0625f, + 0.0625f, + state.length() + 0.57f, + 0.0625f, + 0.15f, + state.atlasSprite() + ); + } + + private static void renderBox( + VertexConsumer consumer, + PoseStack.Pose pose, + float minX, + float minY, + float minZ, + float maxX, + float maxY, + float maxZ, + TextureAtlasSprite sprite) { + renderQuadX(consumer, pose, maxX, maxX, minY, minZ, maxY, maxZ, 0.5f, sprite); + renderQuadX(consumer, pose, minX, minX, minY, maxZ, maxY, minZ, 0.5f, sprite); + renderQuadY(consumer, pose, maxY, maxY, minX, minZ, maxX, maxZ, 0.5f, sprite); + renderQuadY(consumer, pose, minY, minY, maxX, minZ, minX, maxZ, 0.5f, sprite); + renderQuadZ(consumer, pose, maxZ, maxZ, minX, maxY, maxX, minY, 0.5f, sprite); + renderQuadZ(consumer, pose, minZ, minZ, minX, minY, maxX, maxY, 0.5f, sprite); + } + + private static void renderBox( + VertexConsumer consumer, + PoseStack.Pose pose, + float minX, + float minY, + float minZ, + float maxX, + float maxY, + float maxZ, + float a, + TextureAtlasSprite sprite) { + renderQuadX(consumer, pose, maxX, maxX, minY, minZ, maxY, maxZ, a, sprite); + renderQuadX(consumer, pose, minX, minX, minY, maxZ, maxY, minZ, a, sprite); + renderQuadY(consumer, pose, maxY, maxY, minX, minZ, maxX, maxZ, a, sprite); + renderQuadY(consumer, pose, minY, minY, maxX, minZ, minX, maxZ, a, sprite); + renderQuadZ(consumer, pose, maxZ, maxZ, minX, maxY, maxX, minY, a, sprite); + renderQuadZ(consumer, pose, minZ, minZ, minX, minY, maxX, maxY, a, sprite); + } + + private static void renderQuadX( + VertexConsumer consumer, + PoseStack.Pose pose, + float minX, + float maxX, + float minY, + float minZ, + float maxY, + float maxZ, + float a, + TextureAtlasSprite sprite) { + addVertex(consumer, pose, minX, maxY, minZ, sprite.getU1(), sprite.getV1(), a); + addVertex(consumer, pose, minX, maxY, maxZ, sprite.getU0(), sprite.getV1(), a); + addVertex(consumer, pose, maxX, minY, maxZ, sprite.getU0(), sprite.getV0(), a); + addVertex(consumer, pose, maxX, minY, minZ, sprite.getU1(), sprite.getV0(), a); + } + + private static void renderQuadY( + VertexConsumer consumer, + PoseStack.Pose pose, + float minY, + float maxY, + float minX, + float minZ, + float maxX, + float maxZ, + float a, + TextureAtlasSprite sprite) { + addVertex(consumer, pose, minX, minY, minZ, sprite.getU1(), sprite.getV1(), a); + addVertex(consumer, pose, minX, minY, maxZ, sprite.getU0(), sprite.getV1(), a); + addVertex(consumer, pose, maxX, maxY, maxZ, sprite.getU0(), sprite.getV0(), a); + addVertex(consumer, pose, maxX, maxY, minZ, sprite.getU1(), sprite.getV0(), a); + } + + private static void renderQuadZ( + VertexConsumer consumer, + PoseStack.Pose pose, + float minZ, + float maxZ, + float minX, + float minY, + float maxX, + float maxY, + float a, + TextureAtlasSprite sprite) { + addVertex(consumer, pose, minX, maxY, minZ, sprite.getU1(), sprite.getV1(), a); + addVertex(consumer, pose, maxX, maxY, minZ, sprite.getU0(), sprite.getV1(), a); + addVertex(consumer, pose, maxX, minY, maxZ, sprite.getU0(), sprite.getV0(), a); + addVertex(consumer, pose, minX, minY, maxZ, sprite.getU1(), sprite.getV0(), a); + } + + private static void addVertex( + VertexConsumer consumer, + PoseStack.Pose pose, + float x, + float y, + float z, + float u, + float v, + float a) { + consumer.addVertex(pose.pose(), x, y, z) + .setColor(1f, .2f, .2f, a) + .setUv(u, v) + .setUv1(0, 0) + .setUv2(240, 240) + .setNormal(1, 0, 0); + } + + +} diff --git a/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserState.java b/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserState.java new file mode 100644 index 000000000..4c273347c --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserState.java @@ -0,0 +1,43 @@ +package dev.dubhe.anvilcraft.client.renderer.laser; + +import com.mojang.blaze3d.vertex.PoseStack; +import dev.dubhe.anvilcraft.AnvilCraft; +import dev.dubhe.anvilcraft.block.entity.BaseLaserBlockEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; + +public record LaserState( + BaseLaserBlockEntity blockEntity, + BlockPos pos, + float length, + float offset, + PoseStack.Pose pose, + TextureAtlasSprite atlasSprite +) { + public static LaserState create(BaseLaserBlockEntity blockEntity, PoseStack poseStack){ + if (blockEntity.getLevel() == null) return null; + if (blockEntity.irradiateBlockPos == null) return null; + final TextureAtlasSprite sprite = Minecraft.getInstance() + .getTextureAtlas(TextureAtlas.LOCATION_BLOCKS) + .apply(AnvilCraft.of("block/laser")); + poseStack.pushPose(); + poseStack.translate(0.5f, 0.5f, 0.5); + float length = (float) (blockEntity + .irradiateBlockPos + .getCenter() + .distanceTo(blockEntity.getBlockPos().getCenter()) - 0.5); + poseStack.mulPose(blockEntity.getDirection().getRotation()); + LaserState laserState = new LaserState( + blockEntity, + blockEntity.getBlockPos(), + length, + blockEntity.laserOffset(), + poseStack.last(), + sprite + ); + poseStack.popPose(); + return laserState; + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/init/ModRenderTypes.java b/src/main/java/dev/dubhe/anvilcraft/init/ModRenderTypes.java index c428d96f1..0ef0e0f00 100644 --- a/src/main/java/dev/dubhe/anvilcraft/init/ModRenderTypes.java +++ b/src/main/java/dev/dubhe/anvilcraft/init/ModRenderTypes.java @@ -7,20 +7,30 @@ import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.TextureAtlas; +import org.spongepowered.asm.launch.platform.CommandLineOptions; import static net.minecraft.client.renderer.RenderStateShard.BLOCK_SHEET_MIPPED; +import static net.minecraft.client.renderer.RenderStateShard.CLOUDS_TARGET; +import static net.minecraft.client.renderer.RenderStateShard.COLOR_DEPTH_WRITE; import static net.minecraft.client.renderer.RenderStateShard.COLOR_WRITE; import static net.minecraft.client.renderer.RenderStateShard.CULL; +import static net.minecraft.client.renderer.RenderStateShard.DEPTH_WRITE; +import static net.minecraft.client.renderer.RenderStateShard.GREATER_DEPTH_TEST; +import static net.minecraft.client.renderer.RenderStateShard.ITEM_ENTITY_TARGET; import static net.minecraft.client.renderer.RenderStateShard.LIGHTMAP; +import static net.minecraft.client.renderer.RenderStateShard.MAIN_TARGET; import static net.minecraft.client.renderer.RenderStateShard.OVERLAY; +import static net.minecraft.client.renderer.RenderStateShard.RENDERTYPE_CLOUDS_SHADER; import static net.minecraft.client.renderer.RenderStateShard.RENDERTYPE_ENTITY_TRANSLUCENT_EMISSIVE_SHADER; import static net.minecraft.client.renderer.RenderStateShard.RENDERTYPE_TRANSLUCENT_SHADER; import static net.minecraft.client.renderer.RenderStateShard.TRANSLUCENT_TARGET; import static net.minecraft.client.renderer.RenderStateShard.TRANSLUCENT_TRANSPARENCY; +import static net.minecraft.client.renderer.RenderStateShard.VIEW_OFFSET_Z_LAYERING; +import static net.minecraft.client.renderer.RenderStateShard.WEATHER_TARGET; public class ModRenderTypes { public static final RenderType LASER = RenderType.create( - "laser", + "anvilcraft:laser", DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 1536, @@ -49,13 +59,52 @@ public class ModRenderTypes { RenderSystem.defaultBlendFunc(); } )).setCullState(CULL) - .setWriteMaskState(COLOR_WRITE) + .setWriteMaskState(COLOR_DEPTH_WRITE) .setOverlayState(OVERLAY) + .setOutputState(TRANSLUCENT_TARGET) .createCompositeState(true) ); + public static RenderType laser(){ + return RenderType.create( + "anvilcraft:laser", + DefaultVertexFormat.POSITION_TEX_COLOR_NORMAL, + VertexFormat.Mode.QUADS, + 1536, + true, + true, + RenderType.CompositeState.builder() + .setLightmapState(LIGHTMAP) + .setShaderState(RENDERTYPE_CLOUDS_SHADER) + .setTextureState(new RenderStateShard.TextureStateShard( + TextureAtlas.LOCATION_BLOCKS, + false, + false + )).setTransparencyState(new RenderStateShard.TransparencyStateShard( + "laser_transparency", + () -> { + RenderSystem.enableBlend(); + RenderSystem.blendFuncSeparate( + GlStateManager.SourceFactor.SRC_COLOR, + GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, + GlStateManager.SourceFactor.ZERO, + GlStateManager.DestFactor.ONE + ); + }, + () -> { + RenderSystem.disableBlend(); + RenderSystem.defaultBlendFunc(); + } + )).setCullState(CULL) + .setWriteMaskState(COLOR_WRITE) + .setOverlayState(OVERLAY) + .setOutputState(MAIN_TARGET) + .createCompositeState(true) + ); + } + public static final RenderType BEACON_GLASS = RenderType.create( - "translucent", + "anvilcraft:beacon_glass", DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, 786432, diff --git a/src/main/java/dev/dubhe/anvilcraft/mixin/LevelRendererMixin.java b/src/main/java/dev/dubhe/anvilcraft/mixin/LevelRendererMixin.java new file mode 100644 index 000000000..81a246825 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/mixin/LevelRendererMixin.java @@ -0,0 +1,99 @@ +package dev.dubhe.anvilcraft.mixin; + +import com.mojang.blaze3d.pipeline.RenderTarget; +import dev.dubhe.anvilcraft.init.ModRenderTypes; +import net.minecraft.client.Camera; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.phys.Vec3; +import org.joml.Matrix4f; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import javax.annotation.Nullable; + +@Mixin(LevelRenderer.class) +public abstract class LevelRendererMixin { + @Shadow + protected abstract void renderSectionLayer(RenderType renderType, double x, double y, double z, Matrix4f frustrumMatrix, Matrix4f projectionMatrix); + + @Shadow @Nullable private RenderTarget translucentTarget; + + @Shadow @Final private Minecraft minecraft; + + @Inject( + method = "renderLevel", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;DDDLorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V", + ordinal = 5, + shift = At.Shift.AFTER + ) + ) + void renderLayer( + DeltaTracker deltaTracker, + boolean renderBlockOutline, + Camera camera, + GameRenderer gameRenderer, + LightTexture lightTexture, + Matrix4f frustumMatrix, + Matrix4f projectionMatrix, + CallbackInfo ci + ) { + anvilcraft$renderLaser(deltaTracker, renderBlockOutline, camera, gameRenderer, lightTexture, frustumMatrix, projectionMatrix); + } + + @Inject( + method = "renderLevel", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;DDDLorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V", + ordinal = 3, + shift = At.Shift.AFTER + ) + ) + void renderLayer1( + DeltaTracker deltaTracker, + boolean renderBlockOutline, + Camera camera, + GameRenderer gameRenderer, + LightTexture lightTexture, + Matrix4f frustumMatrix, + Matrix4f projectionMatrix, + CallbackInfo ci + ) { + anvilcraft$renderLaser(deltaTracker, renderBlockOutline, camera, gameRenderer, lightTexture, frustumMatrix, projectionMatrix); + } + + @Unique + private void anvilcraft$renderLaser( + DeltaTracker deltaTracker, + boolean renderBlockOutline, + Camera camera, + GameRenderer gameRenderer, + LightTexture lightTexture, + Matrix4f frustumMatrix, + Matrix4f projectionMatrix + ) { + Vec3 vec3 = camera.getPosition(); + double d0 = vec3.x(); + double d1 = vec3.y(); + double d2 = vec3.z(); + if (this.translucentTarget != null) { + this.translucentTarget.clear(Minecraft.ON_OSX); + this.translucentTarget.copyDepthFrom(this.minecraft.getMainRenderTarget()); + } + this.renderSectionLayer(ModRenderTypes.LASER, d0, d1, d2, frustumMatrix, projectionMatrix); + } + + +} diff --git a/src/main/java/dev/dubhe/anvilcraft/mixin/RenderTypeMixin.java b/src/main/java/dev/dubhe/anvilcraft/mixin/RenderTypeMixin.java new file mode 100644 index 000000000..83eccee59 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/mixin/RenderTypeMixin.java @@ -0,0 +1,32 @@ +package dev.dubhe.anvilcraft.mixin; + +import com.google.common.collect.ImmutableList; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import dev.dubhe.anvilcraft.init.ModRenderTypes; +import net.minecraft.client.renderer.RenderType; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(RenderType.class) +public class RenderTypeMixin { + @Mutable + @Shadow + @Final + public static ImmutableList CHUNK_BUFFER_LAYERS; + + @WrapOperation( + method = "", + at = @At(value = "FIELD", target = "Lnet/minecraft/client/renderer/RenderType;CHUNK_BUFFER_LAYERS:Lcom/google/common/collect/ImmutableList;") + ) + private static void registerChunkBufferLayer(ImmutableList value, Operation original){ + original.call(ImmutableList.builder() + .addAll(value) + .add(ModRenderTypes.LASER) + .build() + ); + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/mixin/SectionCompilerMixin.java b/src/main/java/dev/dubhe/anvilcraft/mixin/SectionCompilerMixin.java new file mode 100644 index 000000000..a86aa26a4 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/mixin/SectionCompilerMixin.java @@ -0,0 +1,73 @@ +package dev.dubhe.anvilcraft.mixin; + +import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexSorting; +import dev.dubhe.anvilcraft.block.entity.BaseLaserBlockEntity; +import dev.dubhe.anvilcraft.client.renderer.laser.LaserCompiler; +import dev.dubhe.anvilcraft.client.renderer.laser.LaserState; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.SectionBufferBuilderPack; +import net.minecraft.client.renderer.chunk.RenderChunkRegion; +import net.minecraft.client.renderer.chunk.SectionCompiler; +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.neoforged.neoforge.client.event.AddSectionGeometryEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.List; +import java.util.Map; + +@Mixin(SectionCompiler.class) +public abstract class SectionCompilerMixin { + + @Shadow protected abstract BufferBuilder getOrBeginLayer(Map bufferLayers, SectionBufferBuilderPack sectionBufferBuilderPack, RenderType renderType); + + @Inject( + method = "compile(Lnet/minecraft/core/SectionPos;Lnet/minecraft/client/renderer/chunk/RenderChunkRegion;Lcom/mojang/blaze3d/vertex/VertexSorting;Lnet/minecraft/client/renderer/SectionBufferBuilderPack;Ljava/util/List;)Lnet/minecraft/client/renderer/chunk/SectionCompiler$Results;", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/chunk/SectionCompiler;handleBlockEntity(Lnet/minecraft/client/renderer/chunk/SectionCompiler$Results;Lnet/minecraft/world/level/block/entity/BlockEntity;)V") + ) + void compile( + SectionPos sectionPos, + RenderChunkRegion region, + VertexSorting vertexSorting, + SectionBufferBuilderPack sectionBufferBuilderPack, + List additionalRenderers, + CallbackInfoReturnable cir, + @Local PoseStack poseStack, + @Local(index = 16) BlockEntity blockEntity, + @Local(index = 11) Map map + ) { + if (!(blockEntity instanceof BaseLaserBlockEntity baseLaserBlockEntity))return; + poseStack.pushPose(); + BlockPos pos = blockEntity.getBlockPos(); + poseStack.translate( + (float)SectionPos.sectionRelative(pos.getX()), + (float)SectionPos.sectionRelative(pos.getY()), + (float)SectionPos.sectionRelative(pos.getZ()) + ); + LaserState laserState = LaserState.create(baseLaserBlockEntity, poseStack); + if (laserState != null) { + LaserCompiler.getInstance().compile( + sectionPos, + region, + vertexSorting, + sectionBufferBuilderPack, + additionalRenderers, + laserState, + renderType -> this.getOrBeginLayer( + map, + sectionBufferBuilderPack, + renderType + ) + ); + } + poseStack.popPose(); + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/network/LaserEmitPacket.java b/src/main/java/dev/dubhe/anvilcraft/network/LaserEmitPacket.java index 18f211ec3..435440bf4 100644 --- a/src/main/java/dev/dubhe/anvilcraft/network/LaserEmitPacket.java +++ b/src/main/java/dev/dubhe/anvilcraft/network/LaserEmitPacket.java @@ -5,6 +5,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; @@ -70,6 +71,10 @@ public static void clientHandler(LaserEmitPacket data, IPayloadContext context) instanceof BaseLaserBlockEntity baseLaserBlockEntity) { baseLaserBlockEntity.irradiateBlockPos = data.irradiateBlockPos; baseLaserBlockEntity.laserLevel = data.lightPowerLevel; + Minecraft.getInstance().levelRenderer.setBlockDirty( + data.laserBlockPos, + false + ); } }); } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index d0dc33e44..e7cde66a8 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -47,4 +47,6 @@ public net.minecraft.client.renderer.RenderType$CompositeState transparencyState public net.minecraft.client.renderer.RenderStateShard$TextureStateShard texture public net.minecraft.world.level.block.TrapDoorBlock toggle(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/player/Player;)V # toggle -public net.minecraft.world.level.block.DoorBlock getHinge(Lnet/minecraft/world/item/context/BlockPlaceContext;)Lnet/minecraft/world/level/block/state/properties/DoorHingeSide; # getHinge \ No newline at end of file +public net.minecraft.world.level.block.DoorBlock getHinge(Lnet/minecraft/world/item/context/BlockPlaceContext;)Lnet/minecraft/world/level/block/state/properties/DoorHingeSide; # getHinge + +public net.minecraft.client.renderer.LevelRenderer setBlockDirty(Lnet/minecraft/core/BlockPos;Z)V \ No newline at end of file diff --git a/src/main/resources/anvilcraft.mixins.json b/src/main/resources/anvilcraft.mixins.json index db10db2f9..dc7e04d5a 100644 --- a/src/main/resources/anvilcraft.mixins.json +++ b/src/main/resources/anvilcraft.mixins.json @@ -31,6 +31,8 @@ "client": [ "ClientLevelMixin", "ItemInHandRendererMixin", + "RenderTypeMixin", + "SectionCompilerMixin", "SoundEngineMixin" ], "plugin": "dev.dubhe.anvilcraft.mixin.plugin.AnvilCraftMixinPlugin", From 486680a82a183e297ff333e59bad3b2f7e8453c8 Mon Sep 17 00:00:00 2001 From: ZhuRuoLing <3489382552@qq.com> Date: Wed, 6 Nov 2024 19:11:35 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=BF=80=E5=85=89?= =?UTF-8?q?=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/renderer/laser/LaserCompiler.java | 2 +- .../dubhe/anvilcraft/init/ModRenderTypes.java | 77 +++++-------------- src/main/resources/anvilcraft.mixins.json | 1 + 3 files changed, 23 insertions(+), 57 deletions(-) diff --git a/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java b/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java index 6dae39be6..8f0a8ed73 100644 --- a/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java +++ b/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java @@ -29,7 +29,7 @@ public void compile( LaserState state, Function bufferBuilderFunction ) { - BufferBuilder builder = bufferBuilderFunction.apply(RenderType.TRANSLUCENT); + BufferBuilder builder = bufferBuilderFunction.apply(ModRenderTypes.LASER); renderBox( builder, state.pose(), diff --git a/src/main/java/dev/dubhe/anvilcraft/init/ModRenderTypes.java b/src/main/java/dev/dubhe/anvilcraft/init/ModRenderTypes.java index 0ef0e0f00..2993a2c9e 100644 --- a/src/main/java/dev/dubhe/anvilcraft/init/ModRenderTypes.java +++ b/src/main/java/dev/dubhe/anvilcraft/init/ModRenderTypes.java @@ -29,6 +29,23 @@ import static net.minecraft.client.renderer.RenderStateShard.WEATHER_TARGET; public class ModRenderTypes { + public static final RenderStateShard.TransparencyStateShard LASER_TRANSPARENCY = new RenderStateShard.TransparencyStateShard( + "anvilcraft:laser_transparency", + () -> { + RenderSystem.enableBlend(); + RenderSystem.blendFuncSeparate( + GlStateManager.SourceFactor.SRC_COLOR, + GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, + GlStateManager.SourceFactor.ZERO, + GlStateManager.DestFactor.ONE + ); + }, + () -> { + RenderSystem.disableBlend(); + RenderSystem.defaultBlendFunc(); + } + ); + public static final RenderType LASER = RenderType.create( "anvilcraft:laser", DefaultVertexFormat.NEW_ENTITY, @@ -38,71 +55,19 @@ public class ModRenderTypes { true, RenderType.CompositeState.builder() .setLightmapState(LIGHTMAP) - .setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_EMISSIVE_SHADER) + .setShaderState(RENDERTYPE_TRANSLUCENT_SHADER) .setTextureState(new RenderStateShard.TextureStateShard( TextureAtlas.LOCATION_BLOCKS, false, false - )).setTransparencyState(new RenderStateShard.TransparencyStateShard( - "laser_transparency", - () -> { - RenderSystem.enableBlend(); - RenderSystem.blendFuncSeparate( - GlStateManager.SourceFactor.SRC_COLOR, - GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, - GlStateManager.SourceFactor.ZERO, - GlStateManager.DestFactor.ONE - ); - }, - () -> { - RenderSystem.disableBlend(); - RenderSystem.defaultBlendFunc(); - } - )).setCullState(CULL) + )).setTransparencyState(LASER_TRANSPARENCY) + .setCullState(CULL) .setWriteMaskState(COLOR_DEPTH_WRITE) .setOverlayState(OVERLAY) - .setOutputState(TRANSLUCENT_TARGET) + .setOutputState(MAIN_TARGET) .createCompositeState(true) ); - public static RenderType laser(){ - return RenderType.create( - "anvilcraft:laser", - DefaultVertexFormat.POSITION_TEX_COLOR_NORMAL, - VertexFormat.Mode.QUADS, - 1536, - true, - true, - RenderType.CompositeState.builder() - .setLightmapState(LIGHTMAP) - .setShaderState(RENDERTYPE_CLOUDS_SHADER) - .setTextureState(new RenderStateShard.TextureStateShard( - TextureAtlas.LOCATION_BLOCKS, - false, - false - )).setTransparencyState(new RenderStateShard.TransparencyStateShard( - "laser_transparency", - () -> { - RenderSystem.enableBlend(); - RenderSystem.blendFuncSeparate( - GlStateManager.SourceFactor.SRC_COLOR, - GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, - GlStateManager.SourceFactor.ZERO, - GlStateManager.DestFactor.ONE - ); - }, - () -> { - RenderSystem.disableBlend(); - RenderSystem.defaultBlendFunc(); - } - )).setCullState(CULL) - .setWriteMaskState(COLOR_WRITE) - .setOverlayState(OVERLAY) - .setOutputState(MAIN_TARGET) - .createCompositeState(true) - ); - } - public static final RenderType BEACON_GLASS = RenderType.create( "anvilcraft:beacon_glass", DefaultVertexFormat.BLOCK, diff --git a/src/main/resources/anvilcraft.mixins.json b/src/main/resources/anvilcraft.mixins.json index dc7e04d5a..770a6438b 100644 --- a/src/main/resources/anvilcraft.mixins.json +++ b/src/main/resources/anvilcraft.mixins.json @@ -31,6 +31,7 @@ "client": [ "ClientLevelMixin", "ItemInHandRendererMixin", + "LevelRendererMixin", "RenderTypeMixin", "SectionCompilerMixin", "SoundEngineMixin" From 7efe1b016b063d4b64f1f84071ac90b868d36807 Mon Sep 17 00:00:00 2001 From: ZhuRuoLing Date: Wed, 6 Nov 2024 22:12:16 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E4=B8=BA=E6=BF=80=E5=85=89=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=B2=97=E7=BB=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/renderer/laser/LaserCompiler.java | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java b/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java index 8f0a8ed73..f64258dc6 100644 --- a/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java +++ b/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java @@ -17,6 +17,17 @@ import java.util.function.Function; public class LaserCompiler { + public static final float[] LASER_WIDTH; + public static final float PIXEL = 1 / 16f; + + static { + float[] array = new float[65]; + for (int i = 1; i <= 64; i++) { + array[i] = (float) Math.sqrt(i) / 2f * PIXEL; + } + LASER_WIDTH = array; + } + @Getter private static final LaserCompiler instance = new LaserCompiler(); @@ -30,38 +41,39 @@ public void compile( Function bufferBuilderFunction ) { BufferBuilder builder = bufferBuilderFunction.apply(ModRenderTypes.LASER); + float width = LASER_WIDTH[Math.clamp(state.blockEntity().laserLevel, 1, 64)]; renderBox( builder, state.pose(), - -0.0625f, + -width, -state.offset(), - -0.0625f, - 0.0625f, + -width, + width, state.length(), - 0.0625f, + width, state.atlasSprite() ); renderBox( builder, state.pose(), - -0.0625f, + -width, state.length(), - -0.0625f, - 0.0625f, + -width, + width, state.length() + 0.3f, - 0.0625f, + width, 0.35f, state.atlasSprite() ); renderBox( builder, state.pose(), - -0.0625f, + -width, state.length() + 0.3f, - -0.0625f, - 0.0625f, + -width, + width, state.length() + 0.57f, - 0.0625f, + width, 0.15f, state.atlasSprite() ); From d2aec5e042a70c89410f3041cb23c402e2bd28a4 Mon Sep 17 00:00:00 2001 From: ZhuRuoLing Date: Wed, 6 Nov 2024 23:47:06 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E4=B8=BA=E6=BF=80=E5=85=89=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=8C=87=E7=A4=BA=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../anvilcraft/api/power/SimplePowerGrid.java | 23 +------------ .../api/tooltip/ItemTooltipManager.java | 6 ++-- .../anvilcraft/client/renderer/Line.java | 33 +++++++++++++++++++ .../renderer/blockentity/LaserRenderer.java | 33 +++++++++++++++++++ .../anvilcraft/config/AnvilCraftConfig.java | 6 ++-- 5 files changed, 73 insertions(+), 28 deletions(-) create mode 100644 src/main/java/dev/dubhe/anvilcraft/client/renderer/Line.java diff --git a/src/main/java/dev/dubhe/anvilcraft/api/power/SimplePowerGrid.java b/src/main/java/dev/dubhe/anvilcraft/api/power/SimplePowerGrid.java index d567e65ee..3bf824b1b 100644 --- a/src/main/java/dev/dubhe/anvilcraft/api/power/SimplePowerGrid.java +++ b/src/main/java/dev/dubhe/anvilcraft/api/power/SimplePowerGrid.java @@ -1,5 +1,6 @@ package dev.dubhe.anvilcraft.api.power; +import dev.dubhe.anvilcraft.client.renderer.Line; import dev.dubhe.anvilcraft.client.renderer.PowerGridRenderer; import net.minecraft.client.Minecraft; @@ -255,27 +256,5 @@ public static List findPowerGrid(BlockPos pos) { .toList(); } - public record Line(Vec3 start, Vec3 end, float distance) { - public void render(PoseStack pose, VertexConsumer vertex, Vec3 camera, int color) { - float dx = (float) (this.start().x - this.end().x); - float dy = (float) (this.start().y - this.end().y); - float dz = (float) (this.start().z - this.end().z); - Matrix4f mat = pose.last().pose(); - vertex.addVertex( - mat, - (float) (this.start().x - camera.x), - (float) (this.start().y - camera.y), - (float) (this.start().z - camera.z) - ).setColor(color) - .setNormal(pose.last(), dx /= this.distance(), dy /= this.distance(), dz /= this.distance()); - vertex.addVertex( - mat, - (float) (this.end().x - camera.x), - (float) (this.end().y - camera.y), - (float) (this.end().z - camera.z) - ).setColor(color) - .setNormal(pose.last(), dx, dy, dz); - } - } } diff --git a/src/main/java/dev/dubhe/anvilcraft/api/tooltip/ItemTooltipManager.java b/src/main/java/dev/dubhe/anvilcraft/api/tooltip/ItemTooltipManager.java index aa212ede4..829007cd5 100644 --- a/src/main/java/dev/dubhe/anvilcraft/api/tooltip/ItemTooltipManager.java +++ b/src/main/java/dev/dubhe/anvilcraft/api/tooltip/ItemTooltipManager.java @@ -32,12 +32,12 @@ public class ItemTooltipManager { map.put(ModItems.TOPAZ.get(), "Containing the power of lightning"); map.put(ModBlocks.RESIN_BLOCK.asItem(), "Use to capture friendly or weak hostile creatures LivingEntity"); map.put(ModBlocks.CRAB_TRAP.asItem(), "Placing it in the water to help you catch aquatic products"); - map.put(ModItems.CRAB_CLAW.get(), "Increase touch distance when holding"); + map.put(ModItems.CRAB_CLAW.get(), "Increase touch length when holding"); map.put(ModBlocks.ROYAL_ANVIL.asItem(), "Unbreakable and powerful compatibility"); map.put(ModBlocks.ROYAL_GRINDSTONE.asItem(), "Creeper proof, Eliminating Curses and Punishing"); map.put(ModBlocks.ROYAL_SMITHING_TABLE.asItem(), "Creeper proof, Saving your Smithing Template"); map.put(ModBlocks.HEATER.asItem(), "Heating the block above, consumes 16 kW"); - map.put(ModBlocks.TRANSMISSION_POLE.asItem(), "Build a power grid with a transmission distance of 8"); + map.put(ModBlocks.TRANSMISSION_POLE.asItem(), "Build a power grid with a transmission length of 8"); map.put(ModBlocks.CHARGE_COLLECTOR.asItem(), "Collecting charges to generate power"); map.put(ModBlocks.POWER_CONVERTER_SMALL.asItem(), "Convert power into FE, consumes 1 kW"); map.put(ModBlocks.POWER_CONVERTER_MIDDLE.asItem(), "Convert power into FE, consumes 3 kW"); @@ -62,7 +62,7 @@ public class ItemTooltipManager { map.put(ModBlocks.CUT_ROYAL_STEEL_STAIRS.asItem(), "Creeper proof"); map.put(ModBlocks.CUT_ROYAL_STEEL_SLAB.asItem(), "Creeper proof"); map.put(ModBlocks.TEMPERING_GLASS.asItem(), "Creeper proof, No tools required on collect"); - map.put(ModBlocks.REMOTE_TRANSMISSION_POLE.asItem(), "Build a power grid with a transmission distance of 8"); + map.put(ModBlocks.REMOTE_TRANSMISSION_POLE.asItem(), "Build a power grid with a transmission length of 8"); map.put(ModBlocks.HEAVY_IRON_BLOCK.asItem(), "Explosion proof"); map.put(ModBlocks.POLISHED_HEAVY_IRON_BLOCK.asItem(), "Explosion proof"); map.put(ModBlocks.POLISHED_HEAVY_IRON_SLAB.asItem(), "Explosion proof"); diff --git a/src/main/java/dev/dubhe/anvilcraft/client/renderer/Line.java b/src/main/java/dev/dubhe/anvilcraft/client/renderer/Line.java new file mode 100644 index 000000000..6b62fd6aa --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/client/renderer/Line.java @@ -0,0 +1,33 @@ +package dev.dubhe.anvilcraft.client.renderer; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.world.phys.Vec3; +import org.joml.Matrix4f; + +public record Line(Vec3 start, Vec3 end, float length) { + + public void render(PoseStack pose, VertexConsumer vertex, Vec3 camera, int color) { + render(pose.last(), vertex, camera, color); + } + + public void render(PoseStack.Pose pose, VertexConsumer vertex, Vec3 camera, int color) { + float dx = (float) (this.start().x - this.end().x); + float dy = (float) (this.start().y - this.end().y); + float dz = (float) (this.start().z - this.end().z); + vertex.addVertex( + pose.pose(), + (float) (this.start().x - camera.x), + (float) (this.start().y - camera.y), + (float) (this.start().z - camera.z) + ).setColor(color) + .setNormal(pose, dx /= this.length(), dy /= this.length(), dz /= this.length()); + vertex.addVertex( + pose.pose(), + (float) (this.end().x - camera.x), + (float) (this.end().y - camera.y), + (float) (this.end().z - camera.z) + ).setColor(color) + .setNormal(pose, dx, dy, dz); + } +} \ No newline at end of file diff --git a/src/main/java/dev/dubhe/anvilcraft/client/renderer/blockentity/LaserRenderer.java b/src/main/java/dev/dubhe/anvilcraft/client/renderer/blockentity/LaserRenderer.java index dbfd14ff2..d99582703 100644 --- a/src/main/java/dev/dubhe/anvilcraft/client/renderer/blockentity/LaserRenderer.java +++ b/src/main/java/dev/dubhe/anvilcraft/client/renderer/blockentity/LaserRenderer.java @@ -1,15 +1,24 @@ package dev.dubhe.anvilcraft.client.renderer.blockentity; +import com.mojang.blaze3d.vertex.VertexConsumer; +import dev.dubhe.anvilcraft.AnvilCraft; import dev.dubhe.anvilcraft.block.entity.BaseLaserBlockEntity; +import dev.dubhe.anvilcraft.client.renderer.Line; +import dev.dubhe.anvilcraft.client.renderer.laser.LaserState; import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.world.phys.AABB; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.world.phys.Vec3; import javax.annotation.ParametersAreNonnullByDefault; @@ -30,6 +39,30 @@ public void render( int packedLight, int packedOverlay ) { + if (blockEntity.getLevel() == null) return; + if (blockEntity.irradiateBlockPos == null) return; + poseStack.pushPose(); + poseStack.translate(0.5f, 0.5f, 0.5); + float length = (float) (blockEntity + .irradiateBlockPos + .getCenter() + .distanceTo(blockEntity.getBlockPos().getCenter()) - 0.5); + poseStack.mulPose(blockEntity.getDirection().getRotation()); + VertexConsumer vertexConsumer = buffer.getBuffer(RenderType.LINES); + Camera camera = Minecraft.getInstance().gameRenderer.getMainCamera(); + Vec3 camPos = camera.getPosition(); + Line line = new Line(Vec3.ZERO,Vec3.ZERO.add(0, length, 0), length); + line.render( + poseStack, + vertexConsumer, + Vec3.ZERO, + 0x88ff2020 + ); + if (buffer instanceof MultiBufferSource.BufferSource) { + ((MultiBufferSource.BufferSource) buffer).endBatch(); + } + poseStack.popPose(); + return; } @Override diff --git a/src/main/java/dev/dubhe/anvilcraft/config/AnvilCraftConfig.java b/src/main/java/dev/dubhe/anvilcraft/config/AnvilCraftConfig.java index 91f85d582..9e5f3fa24 100644 --- a/src/main/java/dev/dubhe/anvilcraft/config/AnvilCraftConfig.java +++ b/src/main/java/dev/dubhe/anvilcraft/config/AnvilCraftConfig.java @@ -26,7 +26,7 @@ public class AnvilCraftConfig implements ConfigData { @ConfigEntry.BoundedDiscrete(max = 8, min = 0) public int lightningStrikeRadius = 1; - @Comment("Maximum distance a magnet attracts") + @Comment("Maximum length a magnet attracts") @ConfigEntry.Gui.Tooltip @ConfigEntry.BoundedDiscrete(max = 16, min = 1) public int magnetAttractsDistance = 5; @@ -35,13 +35,13 @@ public class AnvilCraftConfig implements ConfigData { @ConfigEntry.Gui.Tooltip public double magnetItemAttractsRadius = 8; - @Comment("Redstone EMP distance generated per block dropped by the anvil") + @Comment("Redstone EMP length generated per block dropped by the anvil") @ConfigEntry.Gui.Tooltip @ConfigEntry.BoundedDiscrete(max = 64, min = 1) @SerializedName("Redstone EMP Radius Per Block") public int redstoneEmpRadius = 6; - @Comment("Maximum distance of redstone EMP") + @Comment("Maximum length of redstone EMP") @ConfigEntry.Gui.Tooltip @ConfigEntry.BoundedDiscrete(max = 64, min = 1) @SerializedName("Redstone Emp Max Radius") From d9a2e49053b3107c865b3aac6814f0b79152131d Mon Sep 17 00:00:00 2001 From: ZhuRuoLing Date: Sun, 10 Nov 2024 18:01:23 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=BF=80=E5=85=89?= =?UTF-8?q?=E6=B8=B2=E6=9F=93=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dependencies.gradle | 4 ++ .../renderer/blockentity/LaserRenderer.java | 50 +++++++++---------- .../client/renderer/laser/LaserCompiler.java | 35 +++++-------- 3 files changed, 40 insertions(+), 49 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index aed31af5a..fddbbcd38 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -27,4 +27,8 @@ dependencies { implementation(forge.theoneprobe) implementation(forge.kubejs) + + compileOnly("maven.modrinth:sodium:mc1.21.1-0.6.0-beta.4-neoforge") + compileOnly("maven.modrinth:iris:1.8.0-beta.5+1.21-neoforge") + compileOnly("maven.modrinth:embeddium:1.0.11+mc1.21.1") } diff --git a/src/main/java/dev/dubhe/anvilcraft/client/renderer/blockentity/LaserRenderer.java b/src/main/java/dev/dubhe/anvilcraft/client/renderer/blockentity/LaserRenderer.java index d99582703..b83a87560 100644 --- a/src/main/java/dev/dubhe/anvilcraft/client/renderer/blockentity/LaserRenderer.java +++ b/src/main/java/dev/dubhe/anvilcraft/client/renderer/blockentity/LaserRenderer.java @@ -1,11 +1,9 @@ package dev.dubhe.anvilcraft.client.renderer.blockentity; import com.mojang.blaze3d.vertex.VertexConsumer; -import dev.dubhe.anvilcraft.AnvilCraft; import dev.dubhe.anvilcraft.block.entity.BaseLaserBlockEntity; import dev.dubhe.anvilcraft.client.renderer.Line; -import dev.dubhe.anvilcraft.client.renderer.laser.LaserState; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; @@ -13,8 +11,6 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.minecraft.client.renderer.texture.TextureAtlas; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.world.phys.AABB; import com.mojang.blaze3d.vertex.PoseStack; @@ -39,29 +35,29 @@ public void render( int packedLight, int packedOverlay ) { - if (blockEntity.getLevel() == null) return; - if (blockEntity.irradiateBlockPos == null) return; - poseStack.pushPose(); - poseStack.translate(0.5f, 0.5f, 0.5); - float length = (float) (blockEntity - .irradiateBlockPos - .getCenter() - .distanceTo(blockEntity.getBlockPos().getCenter()) - 0.5); - poseStack.mulPose(blockEntity.getDirection().getRotation()); - VertexConsumer vertexConsumer = buffer.getBuffer(RenderType.LINES); - Camera camera = Minecraft.getInstance().gameRenderer.getMainCamera(); - Vec3 camPos = camera.getPosition(); - Line line = new Line(Vec3.ZERO,Vec3.ZERO.add(0, length, 0), length); - line.render( - poseStack, - vertexConsumer, - Vec3.ZERO, - 0x88ff2020 - ); - if (buffer instanceof MultiBufferSource.BufferSource) { - ((MultiBufferSource.BufferSource) buffer).endBatch(); - } - poseStack.popPose(); +// if (blockEntity.getLevel() == null) return; +// if (blockEntity.irradiateBlockPos == null) return; +// poseStack.pushPose(); +// poseStack.translate(0.5f, 0.5f, 0.5); +// float length = (float) (blockEntity +// .irradiateBlockPos +// .getCenter() +// .distanceTo(blockEntity.getBlockPos().getCenter()) - 0.5); +// poseStack.mulPose(blockEntity.getDirection().getRotation()); +// VertexConsumer vertexConsumer = buffer.getBuffer(RenderType.LINES); +// Camera camera = Minecraft.getInstance().gameRenderer.getMainCamera(); +// Vec3 camPos = camera.getPosition(); +// Line line = new Line(Vec3.ZERO,Vec3.ZERO.add(0, length, 0), length); +// line.render( +// poseStack, +// vertexConsumer, +// Vec3.ZERO, +// 0x88ff2020 +// ); +// if (buffer instanceof MultiBufferSource.BufferSource) { +// ((MultiBufferSource.BufferSource) buffer).endBatch(); +// } +// poseStack.popPose(); return; } diff --git a/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java b/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java index f64258dc6..edbc24b0f 100644 --- a/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java +++ b/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java @@ -19,6 +19,7 @@ public class LaserCompiler { public static final float[] LASER_WIDTH; public static final float PIXEL = 1 / 16f; + public static final float HALF_PIXEL = PIXEL / 2f; static { float[] array = new float[65]; @@ -40,41 +41,31 @@ public void compile( LaserState state, Function bufferBuilderFunction ) { - BufferBuilder builder = bufferBuilderFunction.apply(ModRenderTypes.LASER); + BufferBuilder solidLayer = bufferBuilderFunction.apply(RenderType.solid()); float width = LASER_WIDTH[Math.clamp(state.blockEntity().laserLevel, 1, 64)]; renderBox( - builder, + solidLayer, state.pose(), -width, -state.offset(), -width, width, - state.length(), + state.length() + 0.5f, width, + 1f, state.atlasSprite() ); + BufferBuilder builder = bufferBuilderFunction.apply(ModRenderTypes.LASER); + float haloWidth = width + HALF_PIXEL; renderBox( builder, state.pose(), - -width, - state.length(), - -width, - width, - state.length() + 0.3f, - width, - 0.35f, - state.atlasSprite() - ); - renderBox( - builder, - state.pose(), - -width, - state.length() + 0.3f, - -width, - width, - state.length() + 0.57f, - width, - 0.15f, + -haloWidth, + -state.offset(), + -haloWidth, + haloWidth, + state.length() + 0.5f, + haloWidth, state.atlasSprite() ); } From 2b83367fad8cdfa4695c96da9ded8458d1fc1af7 Mon Sep 17 00:00:00 2001 From: ZhuRuoLing Date: Sun, 10 Nov 2024 19:40:54 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E8=AE=A9=E6=B8=B2=E6=9F=93=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=B1=BBmod=E8=A3=85=E4=BA=86=E4=B9=9F=E8=83=BD?= =?UTF-8?q?=E7=9C=8B=E8=A7=81=E6=BF=80=E5=85=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dependencies.gradle | 6 +-- .../renderer/blockentity/LaserRenderer.java | 49 ++++++++----------- .../client/renderer/laser/LaserCompiler.java | 35 ++++--------- .../renderer/laser/LaserRenderStatus.java | 28 +++++++++++ .../mixin/SectionCompilerMixin.java | 20 ++++---- 5 files changed, 69 insertions(+), 69 deletions(-) create mode 100644 src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserRenderStatus.java diff --git a/dependencies.gradle b/dependencies.gradle index fddbbcd38..dc66e5397 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -28,7 +28,7 @@ dependencies { implementation(forge.kubejs) - compileOnly("maven.modrinth:sodium:mc1.21.1-0.6.0-beta.4-neoforge") - compileOnly("maven.modrinth:iris:1.8.0-beta.5+1.21-neoforge") - compileOnly("maven.modrinth:embeddium:1.0.11+mc1.21.1") +// compileOnly("maven.modrinth:sodium:mc1.21.1-0.6.0-beta.4-neoforge") +// compileOnly("maven.modrinth:iris:1.8.0-beta.5+1.21-neoforge") +// compileOnly("maven.modrinth:embeddium:1.0.11+mc1.21.1") } diff --git a/src/main/java/dev/dubhe/anvilcraft/client/renderer/blockentity/LaserRenderer.java b/src/main/java/dev/dubhe/anvilcraft/client/renderer/blockentity/LaserRenderer.java index b83a87560..64a6a85ea 100644 --- a/src/main/java/dev/dubhe/anvilcraft/client/renderer/blockentity/LaserRenderer.java +++ b/src/main/java/dev/dubhe/anvilcraft/client/renderer/blockentity/LaserRenderer.java @@ -1,11 +1,12 @@ package dev.dubhe.anvilcraft.client.renderer.blockentity; -import com.mojang.blaze3d.vertex.VertexConsumer; import dev.dubhe.anvilcraft.block.entity.BaseLaserBlockEntity; -import dev.dubhe.anvilcraft.client.renderer.Line; +import dev.dubhe.anvilcraft.client.renderer.laser.LaserCompiler; +import dev.dubhe.anvilcraft.client.renderer.laser.LaserRenderStatus; +import dev.dubhe.anvilcraft.client.renderer.laser.LaserState; +import dev.dubhe.anvilcraft.init.ModRenderTypes; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -14,7 +15,6 @@ import net.minecraft.world.phys.AABB; import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.world.phys.Vec3; import javax.annotation.ParametersAreNonnullByDefault; @@ -28,37 +28,28 @@ public LaserRenderer(BlockEntityRendererProvider.Context context) { @Override public void render( - BaseLaserBlockEntity blockEntity, + BaseLaserBlockEntity baseLaserBlockEntity, float partialTick, PoseStack poseStack, MultiBufferSource buffer, int packedLight, int packedOverlay ) { -// if (blockEntity.getLevel() == null) return; -// if (blockEntity.irradiateBlockPos == null) return; -// poseStack.pushPose(); -// poseStack.translate(0.5f, 0.5f, 0.5); -// float length = (float) (blockEntity -// .irradiateBlockPos -// .getCenter() -// .distanceTo(blockEntity.getBlockPos().getCenter()) - 0.5); -// poseStack.mulPose(blockEntity.getDirection().getRotation()); -// VertexConsumer vertexConsumer = buffer.getBuffer(RenderType.LINES); -// Camera camera = Minecraft.getInstance().gameRenderer.getMainCamera(); -// Vec3 camPos = camera.getPosition(); -// Line line = new Line(Vec3.ZERO,Vec3.ZERO.add(0, length, 0), length); -// line.render( -// poseStack, -// vertexConsumer, -// Vec3.ZERO, -// 0x88ff2020 -// ); -// if (buffer instanceof MultiBufferSource.BufferSource) { -// ((MultiBufferSource.BufferSource) buffer).endBatch(); -// } -// poseStack.popPose(); - return; + if (LaserRenderStatus.isEnhancedRenderingAvailable()) return; + poseStack.pushPose(); + LaserState laserState = LaserState.create(baseLaserBlockEntity, poseStack); + if (laserState != null) { + LaserCompiler.compile( + laserState, + renderType -> { + if (renderType == ModRenderTypes.LASER){ + return buffer.getBuffer(RenderType.translucent()); + } + return buffer.getBuffer(renderType); + } + ); + } + poseStack.popPose(); } @Override diff --git a/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java b/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java index edbc24b0f..b5627aa54 100644 --- a/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java +++ b/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserCompiler.java @@ -1,26 +1,17 @@ package dev.dubhe.anvilcraft.client.renderer.laser; -import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.blaze3d.vertex.VertexSorting; import dev.dubhe.anvilcraft.init.ModRenderTypes; -import lombok.Getter; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.SectionBufferBuilderPack; -import net.minecraft.client.renderer.chunk.RenderChunkRegion; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.core.SectionPos; -import net.neoforged.neoforge.client.event.AddSectionGeometryEvent; -import java.util.List; import java.util.function.Function; public class LaserCompiler { public static final float[] LASER_WIDTH; public static final float PIXEL = 1 / 16f; public static final float HALF_PIXEL = PIXEL / 2f; - static { float[] array = new float[65]; for (int i = 1; i <= 64; i++) { @@ -29,42 +20,34 @@ public class LaserCompiler { LASER_WIDTH = array; } - @Getter - private static final LaserCompiler instance = new LaserCompiler(); - - public void compile( - SectionPos sectionPos, - RenderChunkRegion region, - VertexSorting vertexSorting, - SectionBufferBuilderPack sectionBufferBuilderPack, - List additionalRenderers, + public static void compile( LaserState state, - Function bufferBuilderFunction + Function bufferBuilderFunction ) { - BufferBuilder solidLayer = bufferBuilderFunction.apply(RenderType.solid()); - float width = LASER_WIDTH[Math.clamp(state.blockEntity().laserLevel, 1, 64)]; + VertexConsumer solidLayer = bufferBuilderFunction.apply(RenderType.solid()); + float width = LASER_WIDTH[Math.clamp(state.blockEntity().laserLevel, 1, 64)] + 0.001f; renderBox( solidLayer, state.pose(), -width, - -state.offset(), + -state.offset() + 0.001f, -width, width, - state.length() + 0.5f, + state.length() + 0.501f, width, 1f, state.atlasSprite() ); - BufferBuilder builder = bufferBuilderFunction.apply(ModRenderTypes.LASER); + VertexConsumer builder = bufferBuilderFunction.apply(ModRenderTypes.LASER); float haloWidth = width + HALF_PIXEL; renderBox( builder, state.pose(), -haloWidth, - -state.offset(), + -state.offset()+ 0.001f, -haloWidth, haloWidth, - state.length() + 0.5f, + state.length() + 0.501f, haloWidth, state.atlasSprite() ); diff --git a/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserRenderStatus.java b/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserRenderStatus.java new file mode 100644 index 000000000..dcecef0fb --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/client/renderer/laser/LaserRenderStatus.java @@ -0,0 +1,28 @@ +package dev.dubhe.anvilcraft.client.renderer.laser; + +import com.mojang.logging.LogUtils; +import net.neoforged.fml.ModList; +import org.slf4j.Logger; + +public class LaserRenderStatus { + + private static boolean ENHANCED; + private static final String[] INCOMPATIBLE_MODS = { + "sodium" + }; + private static final Logger logger = LogUtils.getLogger(); + + static { + ENHANCED = true; + for (String incompatibleMod : INCOMPATIBLE_MODS) { + if (ModList.get().isLoaded(incompatibleMod)){ + logger.warn("Incompatible mod {} detected, fallback laser rendering into BlockEntityRenderer.", incompatibleMod); + ENHANCED = false; + } + } + } + + public static boolean isEnhancedRenderingAvailable() { + return ENHANCED; + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/mixin/SectionCompilerMixin.java b/src/main/java/dev/dubhe/anvilcraft/mixin/SectionCompilerMixin.java index a86aa26a4..815c36ab1 100644 --- a/src/main/java/dev/dubhe/anvilcraft/mixin/SectionCompilerMixin.java +++ b/src/main/java/dev/dubhe/anvilcraft/mixin/SectionCompilerMixin.java @@ -6,6 +6,7 @@ import com.mojang.blaze3d.vertex.VertexSorting; import dev.dubhe.anvilcraft.block.entity.BaseLaserBlockEntity; import dev.dubhe.anvilcraft.client.renderer.laser.LaserCompiler; +import dev.dubhe.anvilcraft.client.renderer.laser.LaserRenderStatus; import dev.dubhe.anvilcraft.client.renderer.laser.LaserState; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.SectionBufferBuilderPack; @@ -27,7 +28,8 @@ @Mixin(SectionCompiler.class) public abstract class SectionCompilerMixin { - @Shadow protected abstract BufferBuilder getOrBeginLayer(Map bufferLayers, SectionBufferBuilderPack sectionBufferBuilderPack, RenderType renderType); + @Shadow + protected abstract BufferBuilder getOrBeginLayer(Map bufferLayers, SectionBufferBuilderPack sectionBufferBuilderPack, RenderType renderType); @Inject( method = "compile(Lnet/minecraft/core/SectionPos;Lnet/minecraft/client/renderer/chunk/RenderChunkRegion;Lcom/mojang/blaze3d/vertex/VertexSorting;Lnet/minecraft/client/renderer/SectionBufferBuilderPack;Ljava/util/List;)Lnet/minecraft/client/renderer/chunk/SectionCompiler$Results;", @@ -44,22 +46,18 @@ void compile( @Local(index = 16) BlockEntity blockEntity, @Local(index = 11) Map map ) { - if (!(blockEntity instanceof BaseLaserBlockEntity baseLaserBlockEntity))return; + if (!LaserRenderStatus.isEnhancedRenderingAvailable()) return; + if (!(blockEntity instanceof BaseLaserBlockEntity baseLaserBlockEntity)) return; poseStack.pushPose(); BlockPos pos = blockEntity.getBlockPos(); poseStack.translate( - (float)SectionPos.sectionRelative(pos.getX()), - (float)SectionPos.sectionRelative(pos.getY()), - (float)SectionPos.sectionRelative(pos.getZ()) + (float) SectionPos.sectionRelative(pos.getX()), + (float) SectionPos.sectionRelative(pos.getY()), + (float) SectionPos.sectionRelative(pos.getZ()) ); LaserState laserState = LaserState.create(baseLaserBlockEntity, poseStack); if (laserState != null) { - LaserCompiler.getInstance().compile( - sectionPos, - region, - vertexSorting, - sectionBufferBuilderPack, - additionalRenderers, + LaserCompiler.compile( laserState, renderType -> this.getOrBeginLayer( map, From 5c3411c5e1c8f1263a853b2f3611f89f96954476 Mon Sep 17 00:00:00 2001 From: ZhuRuoLing Date: Sun, 10 Nov 2024 19:51:49 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E8=AE=A9=E5=86=92=E9=99=A9=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E4=B8=8D=E8=83=BD=E4=BD=BF=E7=94=A8=E9=93=81=E7=A0=A7?= =?UTF-8?q?=E9=94=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/dev/dubhe/anvilcraft/item/AnvilHammerItem.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/dev/dubhe/anvilcraft/item/AnvilHammerItem.java b/src/main/java/dev/dubhe/anvilcraft/item/AnvilHammerItem.java index 0f53334fa..be3a4e395 100644 --- a/src/main/java/dev/dubhe/anvilcraft/item/AnvilHammerItem.java +++ b/src/main/java/dev/dubhe/anvilcraft/item/AnvilHammerItem.java @@ -95,6 +95,7 @@ private static void breakBlock(ServerPlayer player, BlockPos pos, @NotNull Serve */ public static boolean ableToUseAnvilHammer(Level level, BlockPos blockPos, Player player) { BlockState state = level.getBlockState(blockPos); + if (!player.getAbilities().mayBuild) return false; return state.getBlock() instanceof IHammerRemovable || state.getBlock() instanceof IHammerChangeable || state.is(ModBlockTags.HAMMER_REMOVABLE)