From 1bd6dcbf1271f89f56041b38d567b482cc408603 Mon Sep 17 00:00:00 2001 From: gnembon Date: Tue, 16 Mar 2021 15:31:58 -0300 Subject: [PATCH] rework on shapes. Labels are showing up, but lines don't. --- gradle.properties | 6 +- .../java/carpet/commands/ScriptCommand.java | 4 +- ...PistonBlockEntity_playerHandlingMixin.java | 2 +- .../WorldRenderer_scarpetRenderMixin.java | 32 ++---- .../carpet/script/utils/ShapesRenderer.java | 105 ++++++++++++------ .../java/carpet/utils/FabricAPIHooks.java | 3 +- 6 files changed, 89 insertions(+), 63 deletions(-) diff --git a/gradle.properties b/gradle.properties index e7d9094a..b87c4d41 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,9 +5,9 @@ org.gradle.jvmargs=-Xmx1G # check these on https://fabricmc.net/use # or better: https://modmuss50.me/fabric.html minecraft_version=21w10a - yarn_mappings=21w10a+build.1 - loader_version=0.11.2 - fabric_version=0.32.1+1.17 + yarn_mappings=21w10a+build.15 + loader_version=0.11.3 + fabric_version=0.32.2+1.17 # Mod Properties mod_version = 1.4.29 diff --git a/src/main/java/carpet/commands/ScriptCommand.java b/src/main/java/carpet/commands/ScriptCommand.java index 4d841f01..ceda769d 100644 --- a/src/main/java/carpet/commands/ScriptCommand.java +++ b/src/main/java/carpet/commands/ScriptCommand.java @@ -468,7 +468,7 @@ public class ScriptCommand { ServerCommandSource source = context.getSource(); CarpetScriptHost host = getHost(context); - BlockBox area = BlockBox.method_34390(a, b); + BlockBox area = BlockBox.create(a, b); CarpetExpression cexpr = new CarpetExpression(host.main, expr, source, origin); int int_1 = area.getBlockCountX() * area.getBlockCountY() * area.getBlockCountZ(); if (int_1 > CarpetSettings.fillLimit) @@ -517,7 +517,7 @@ public class ScriptCommand { ServerCommandSource source = context.getSource(); CarpetScriptHost host = getHost(context); - BlockBox area = BlockBox.method_34390(a, b); // create + BlockBox area = BlockBox.create(a, b); CarpetExpression cexpr = new CarpetExpression(host.main, expr, source, origin); int int_1 = area.getBlockCountX() * area.getBlockCountY() * area.getBlockCountZ(); if (int_1 > CarpetSettings.fillLimit) diff --git a/src/main/java/carpet/mixins/PistonBlockEntity_playerHandlingMixin.java b/src/main/java/carpet/mixins/PistonBlockEntity_playerHandlingMixin.java index 4f5ac386..bf08598f 100644 --- a/src/main/java/carpet/mixins/PistonBlockEntity_playerHandlingMixin.java +++ b/src/main/java/carpet/mixins/PistonBlockEntity_playerHandlingMixin.java @@ -26,7 +26,7 @@ public abstract class PistonBlockEntity_playerHandlingMixin @Shadow public abstract Direction getMovementDirection(); - @Inject(method = "method_23672", at = @At("HEAD"), cancellable = true) + @Inject(method = "moveEntity", at = @At("HEAD"), cancellable = true) private static void dontPushSpectators(Direction direction, Entity entity, double d, Direction direction2, CallbackInfo ci) { if (CarpetSettings.creativeNoClip && entity instanceof PlayerEntity && (((PlayerEntity) entity).isCreative()) && ((PlayerEntity) entity).getAbilities().flying) ci.cancel(); diff --git a/src/main/java/carpet/mixins/WorldRenderer_scarpetRenderMixin.java b/src/main/java/carpet/mixins/WorldRenderer_scarpetRenderMixin.java index 8f28b5cd..7ae262c0 100644 --- a/src/main/java/carpet/mixins/WorldRenderer_scarpetRenderMixin.java +++ b/src/main/java/carpet/mixins/WorldRenderer_scarpetRenderMixin.java @@ -22,8 +22,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(WorldRenderer.class) public class WorldRenderer_scarpetRenderMixin { - @Shadow private /*@Nullable*/ ShaderEffect transparencyShader; - @Inject(method = "", at = @At("RETURN")) private void addRenderers(MinecraftClient client, BufferBuilderStorage bufferBuilders, CallbackInfo ci) { @@ -32,37 +30,23 @@ public class WorldRenderer_scarpetRenderMixin @Inject(method = "render", at = @At( value = "INVOKE", - target = "Lnet/minecraft/client/render/WorldRenderer;renderChunkDebugInfo(Lnet/minecraft/client/render/Camera;)V", - shift = At.Shift.AFTER + target = "Lnet/minecraft/client/render/BufferBuilderStorage;getEffectVertexConsumers()Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;", shift = At.Shift.BEFORE + //target = "Lnet/minecraft/client/render/WorldRenderer;renderChunkDebugInfo(Lnet/minecraft/client/render/Camera;)V", shift = At.Shift.AFTER + //target = "Lnet/minecraft/client/render/BackgroundRenderer;method_23792()V", shift = At.Shift.AFTER + //target = "Lnet/minecraft/client/render/BufferBuilderStorage;getEntityVertexConsumers()Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;", shift = At.Shift.AFTER + //target = "Lnet/minecraft/client/render/WorldRenderer;renderChunkDebugInfo(Lnet/minecraft/client/render/Camera;)V", shift = At.Shift.AFTER // before return )) private void renderScarpetThings(MatrixStack matrices, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, Matrix4f matrix4f, CallbackInfo ci) { // in normal circumstances we want to render shapes at the very end so it appears correctly behind stuff. - if (!FabricAPIHooks.WORLD_RENDER_EVENTS && CarpetClient.shapes != null && transparencyShader == null) + // we might actually not need to play with render hooks here. + if (!FabricAPIHooks.WORLD_RENDER_EVENTS && CarpetClient.shapes != null ) { matrices.push(); - //RenderSystem.pushMatrix(); ?? CarpetClient.shapes.render(matrices, camera, tickDelta); - //RenderSystem.popMatrix(); ?? matrices.pop(); - } - } + RenderSystem.applyModelViewMatrix(); - @Inject(method = "render", at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/render/debug/DebugRenderer;render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;DDD)V", - shift = At.Shift.AFTER - )) - private void renderScarpetThingsFabulously(MatrixStack matrices, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, Matrix4f matrix4f, CallbackInfo ci) - { - // with fabulous graphics - stuff doesn't work this way for some reason - need to render with chunk lines. - if (!FabricAPIHooks.WORLD_RENDER_EVENTS && CarpetClient.shapes != null && transparencyShader != null) - { - matrices.push(); - //RenderSystem.pushMatrix(); - CarpetClient.shapes.render(matrices, camera, tickDelta); - //RenderSystem.popMatrix(); - matrices.pop(); } } } diff --git a/src/main/java/carpet/script/utils/ShapesRenderer.java b/src/main/java/carpet/script/utils/ShapesRenderer.java index 2af4ff84..019018fb 100644 --- a/src/main/java/carpet/script/utils/ShapesRenderer.java +++ b/src/main/java/carpet/script/utils/ShapesRenderer.java @@ -10,19 +10,20 @@ import net.minecraft.client.render.Camera; import net.minecraft.client.render.Tessellator; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.VertexFormat; +import net.minecraft.client.render.debug.DebugRenderer; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.AffineTransformation; import net.minecraft.client.world.ClientWorld; import net.minecraft.client.render.VertexFormats; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; +import net.minecraft.util.math.Box; import net.minecraft.util.math.Direction; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Matrix4f; import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3f; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.World; -import org.lwjgl.opengl.GL11; import java.util.HashMap; import java.util.Map; @@ -31,6 +32,7 @@ import java.util.function.BiFunction; public class ShapesRenderer { private final Map, Long2ObjectOpenHashMap>> shapes; + private final Map, Long2ObjectOpenHashMap>> labels; private MinecraftClient client; private Map>> renderedShapes @@ -47,6 +49,7 @@ public class ShapesRenderer { this.client = minecraftClient; shapes = new HashMap<>(); + labels = new HashMap<>(); } public void render(MatrixStack matrices, Camera camera, float partialTick) @@ -54,18 +57,22 @@ public class ShapesRenderer //Camera camera = this.client.gameRenderer.getCamera(); ClientWorld iWorld = this.client.world; RegistryKey dimensionType = iWorld.getRegistryKey(); - if (shapes.get(dimensionType) == null || shapes.get(dimensionType).isEmpty()) return; + if ((shapes.get(dimensionType) == null || shapes.get(dimensionType).isEmpty()) && + (labels.get(dimensionType) == null || labels.get(dimensionType).isEmpty())) return; long currentTime = client.world.getTime(); RenderSystem.disableTexture(); RenderSystem.enableDepthTest(); RenderSystem.depthFunc(515); RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); + //RenderSystem.blendFuncSeparate(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE, GlStateManager.SrcFactor.ONE, GlStateManager.DstFactor.ZERO); //RenderSystem.shadeModel(7425); //////////RenderSystem.shadeModel(GL11.GL_FLAT); //////////RenderSystem.enableAlphaTest(); + //GL11.glEnable(GL11.GL_ALPHA_TEST); //////////RenderSystem.alphaFunc(GL11.GL_GREATER, 0.003f); + //GL11.glAlphaFunc(GL11.GL_GREATER, 0.003f); RenderSystem.disableCull(); //////////RenderSystem.disableLighting(); RenderSystem.depthMask(false); @@ -83,16 +90,19 @@ public class ShapesRenderer double cameraY = camera.getPos().y; double cameraZ = camera.getPos().z; - synchronized (shapes) - { + if (shapes.size() != 0) { synchronized (shapes) { shapes.get(dimensionType).long2ObjectEntrySet().removeIf( entry -> entry.getValue().isExpired(currentTime) ); + matrices.push(); + matrices.method_34425(matrices.peek().getModel()); + RenderSystem.applyModelViewMatrix(); + shapes.get(dimensionType).values().forEach( s -> { - if ( !s.lastCall() && s.shouldRender(dimensionType)) + if (s.shouldRender(dimensionType)) s.renderFaces(tessellator, bufferBuilder, cameraX, cameraY, cameraZ, partialTick); } ); @@ -100,21 +110,29 @@ public class ShapesRenderer shapes.get(dimensionType).values().forEach( s -> { - if ( !s.lastCall() && s.shouldRender(dimensionType)) + if (s.shouldRender(dimensionType)) s.renderLines(matrices, tessellator, bufferBuilder, cameraX, cameraY, cameraZ, partialTick); } ); + matrices.pop(); + RenderSystem.applyModelViewMatrix(); + }} + if (labels.size() != 0) { synchronized (labels) + { + labels.get(dimensionType).long2ObjectEntrySet().removeIf( + entry -> entry.getValue().isExpired(currentTime) + ); //texts // maybe we can move it laster to lines and makes sure we don't overpass and don't have blinky transparency problems - shapes.get(dimensionType).values().forEach( + labels.get(dimensionType).values().forEach( s -> { - if ( s.lastCall() && s.shouldRender(dimensionType)) + if (s.shouldRender(dimensionType)) s.renderLines(matrices, tessellator, bufferBuilder, cameraX, cameraY, cameraZ, partialTick); } ); - } + }} RenderSystem.enableCull(); RenderSystem.depthMask(true); RenderSystem.lineWidth(1.0F); @@ -147,16 +165,18 @@ public class ShapesRenderer RenderedShape rshape = shapeFactory.apply(client, shape); RegistryKey dim = shape.shapeDimension; long key = rshape.key(); - synchronized (shapes) + Map, Long2ObjectOpenHashMap>> container = + rshape.stageDeux()?labels:shapes; + synchronized (container) { - RenderedShape existing = shapes.computeIfAbsent(dim, d -> new Long2ObjectOpenHashMap<>()).get(key); + RenderedShape existing = container.computeIfAbsent(dim, d -> new Long2ObjectOpenHashMap<>()).get(key); if (existing != null) { // promoting previous shape existing.promoteWith(rshape); } else { - shapes.get(dim).put(key, rshape); + container.get(dim).put(key, rshape); } } } @@ -167,6 +187,10 @@ public class ShapesRenderer { shapes.values().forEach(Long2ObjectOpenHashMap::clear); } + synchronized (labels) + { + labels.values().forEach(Long2ObjectOpenHashMap::clear); + } } public void renewShapes() @@ -177,6 +201,12 @@ public class ShapesRenderer shape.expiryTick++; })); } + synchronized (labels) + { + labels.values().forEach(el -> el.values().forEach(shape -> { + shape.expiryTick++; + })); + } } public abstract static class RenderedShape @@ -211,7 +241,7 @@ public class ShapesRenderer if (client.world.getEntityById(shape.followEntity) == null) return false; return true; } - public boolean lastCall() + public boolean stageDeux() { return false; } @@ -233,7 +263,6 @@ public class ShapesRenderer @Override public void renderLines(MatrixStack matrices, Tessellator tessellator, BufferBuilder builder, double cx, double cy, double cz, float partialTick) { - /* if (shape.a == 0.0) return; Vec3d v1 = shape.relativiseRender(client.world, shape.pos, partialTick); Camera camera1 = client.gameRenderer.getCamera(); @@ -250,11 +279,12 @@ public class ShapesRenderer //RenderSystem.translatef((float)(v1.x - d), (float)(v1.y - e), (float)(v1.z - f)); matrices.translate(v1.x - d,v1.y - e,v1.z - f); //RenderSystem.normal3f(0.0F, 1.0F, 0.0F); - //matrices. + // not needed if (shape.facing == null) { - matrices.multiply(camera1.getRotation()); + matrices.method_34425(new Matrix4f(camera1.getRotation())); + // or better matrices.multiply(camera1.getRotation()); //RenderSystem.multMatrix(new Matrix4f(camera1.getRotation())); } else @@ -264,31 +294,40 @@ public class ShapesRenderer case NORTH: break; case SOUTH: - matrices. - RenderSystem.rotatef(180.0f, 0.0f, 1.0f, 0.0f); + matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(180)); + //RenderSystem.rotatef(180.0f, 0.0f, 1.0f, 0.0f); break; case EAST: - RenderSystem.rotatef(270.0f, 0.0f, 1.0f, 0.0f); + matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(270)); + //RenderSystem.rotatef(270.0f, 0.0f, 1.0f, 0.0f); break; case WEST: - RenderSystem.rotatef(90.0f, 0.0f, 1.0f, 0.0f); + matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(90)); + //RenderSystem.rotatef(90.0f, 0.0f, 1.0f, 0.0f); break; case UP: - RenderSystem.rotatef(90.0f, 1.0f, 0.0f, 0.0f); + matrices.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(90)); + //RenderSystem.rotatef(90.0f, 1.0f, 0.0f, 0.0f); break; case DOWN: - RenderSystem.rotatef(-90.0f, 1.0f, 0.0f, 0.0f); + matrices.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(-90)); + //RenderSystem.rotatef(-90.0f, 1.0f, 0.0f, 0.0f); break; } } - RenderSystem.scalef(shape.size* 0.0025f, -shape.size*0.0025f, shape.size*0.0025f); + matrices.scale(shape.size* 0.0025f, -shape.size*0.0025f, shape.size*0.0025f); + //RenderSystem.scalef(shape.size* 0.0025f, -shape.size*0.0025f, shape.size*0.0025f); if (shape.tilt!=0.0f) { - RenderSystem.rotatef(shape.tilt, 0.0f, 0.0f, 1.0f); + matrices.multiply(Vec3f.POSITIVE_Z.getDegreesQuaternion(shape.tilt)); + //RenderSystem.rotatef(shape.tilt, 0.0f, 0.0f, 1.0f); } - RenderSystem.translatef(-10*shape.indent, -10*shape.height-9, (float) (-10*renderEpsilon)-10*shape.raise); + matrices.translate(-10*shape.indent, -10*shape.height-9, (-10*renderEpsilon)-10*shape.raise); + //RenderSystem.translatef(-10*shape.indent, -10*shape.height-9, (float) (-10*renderEpsilon)-10*shape.raise); //if (visibleThroughWalls) RenderSystem.disableDepthTest(); - RenderSystem.scalef(-1.0F, 1.0F, 1.0F); + //RenderSystem.scalef(-1.0F, 1.0F, 1.0F); + matrices.scale(-1, 1, 1); + //RenderSystem.applyModelViewMatrix(); // passed matrix directly to textRenderer.draw float text_x = 0; if (shape.align == 0) @@ -300,20 +339,23 @@ public class ShapesRenderer text_x = (float)(-textRenderer.getWidth(shape.value.getString())); } VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(Tessellator.getInstance().getBuffer()); - textRenderer.draw(shape.value, text_x, 0.0F, shape.textcolor, false, AffineTransformation.identity().getMatrix(), immediate, false, shape.textbck, 15728880); + textRenderer.draw(shape.value, text_x, 0.0F, shape.textcolor, false, matrices.peek().getModel(), /*AffineTransformation.identity().getMatrix(),*/ immediate, false, shape.textbck, 15728880); + //textRenderer.draw(shape.value, text_x, 0.0F, shape.textcolor, false, AffineTransformation.identity().getMatrix(), immediate, false, shape.textbck, 15728880); immediate.draw(); - RenderSystem.popMatrix(); + matrices.pop(); + RenderSystem.applyModelViewMatrix(); + //RenderSystem.popMatrix(); RenderSystem.enableCull(); //RenderSystem.enableDepthTest(); //RenderSystem.depthFunc(515); //RenderSystem.enableAlphaTest(); //RenderSystem.alphaFunc(GL11.GL_GREATER, 0.003f); - */ + } @Override - public boolean lastCall() + public boolean stageDeux() { return true; } @@ -348,6 +390,7 @@ public class ShapesRenderer Vec3d v1 = shape.relativiseRender(client.world, shape.from, partialTick); Vec3d v2 = shape.relativiseRender(client.world, shape.to, partialTick); RenderSystem.lineWidth(shape.lineWidth); + //DebugRenderer.drawBox(new Box(v1.x, v1.y, v1.z, v2.x, v2.y, v2.z), 0.5f, 0.5f, 0.5f, 0.5f);//shape.r, shape.g, shape.b, shape.a); drawBoxWireGLLines(tessellator, bufferBuilder, (float)(v1.x-cx-renderEpsilon), (float)(v1.y-cy-renderEpsilon), (float)(v1.z-cz-renderEpsilon), (float)(v2.x-cx+renderEpsilon), (float)(v2.y-cy+renderEpsilon), (float)(v2.z-cz+renderEpsilon), diff --git a/src/main/java/carpet/utils/FabricAPIHooks.java b/src/main/java/carpet/utils/FabricAPIHooks.java index c0274419..38c23c25 100644 --- a/src/main/java/carpet/utils/FabricAPIHooks.java +++ b/src/main/java/carpet/utils/FabricAPIHooks.java @@ -20,10 +20,9 @@ public class FabricAPIHooks { WorldRenderEvents.BEFORE_DEBUG_RENDER.register(context -> { if (CarpetClient.shapes != null) { context.matrixStack().push(); - //RenderSystem.pushMatrix(); CarpetClient.shapes.render(context.matrixStack(), context.camera(), context.tickDelta()); - //RenderSystem.popMatrix(); context.matrixStack().pop(); + RenderSystem.applyModelViewMatrix(); } }); }