From bec13b8e7db02bd18f586456e3f1fcefce860fa9 Mon Sep 17 00:00:00 2001 From: Zelophed Date: Tue, 16 Feb 2021 22:50:11 +0100 Subject: [PATCH] Assisted Placement, Part IV-b --- .../create/foundation/gui/AllGuiTextures.java | 4 +- .../foundation/utility/ghost/GhostBlocks.java | 3 +- .../utility/placement/PlacementHelpers.java | 81 +++++++++++++++--- .../textures/gui/placement_indicator.png | Bin 0 -> 9385 bytes 4 files changed, 75 insertions(+), 13 deletions(-) create mode 100644 src/main/resources/assets/create/textures/gui/placement_indicator.png diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 5528f791b..520cde09e 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -1,7 +1,6 @@ package com.simibubi.create.foundation.gui; import com.simibubi.create.Create; - import net.minecraft.client.Minecraft; import net.minecraft.client.gui.AbstractGui; import net.minecraft.client.gui.screen.Screen; @@ -79,6 +78,9 @@ public enum AllGuiTextures { INDICATOR_YELLOW("widgets.png", 54, 18, 18, 6), INDICATOR_RED("widgets.png", 72, 18, 18, 6), + // PlacementIndicator + PLACEMENT_INDICATOR_SHEET("placement_indicator.png", 0, 0, 256, 256); + ; public static final int FONT_COLOR = 0x575F7A; diff --git a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java index 01d31b076..d5ae5d175 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlocks.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.utility.ghost; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import net.minecraft.block.BlockState; +import net.minecraft.util.math.MathHelper; import java.util.HashMap; import java.util.Map; @@ -12,7 +13,7 @@ public class GhostBlocks { public static double getBreathingAlpha() { double period = 2500; double timer = System.currentTimeMillis() % period; - double offset = Math.cos((2d/period) * Math.PI * timer); + double offset = MathHelper.cos((float) ((2d/period) * Math.PI * timer)); return 0.75d - 0.2d * offset; } diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java index 0026d5fe6..002bc3e49 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.utility.placement; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingAngle; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.utility.AngleHelper; @@ -35,7 +36,7 @@ public class PlacementHelpers { private static final List helpers = new ArrayList<>(); private static int animationTick = 0; - private static final InterpolatedChasingValue angle = new InterpolatedChasingAngle().withSpeed(0.15f); + private static final InterpolatedChasingValue angle = new InterpolatedChasingAngle().withSpeed(0.25f); private static BlockPos target = null; private static BlockPos lastTarget = null; @@ -163,13 +164,7 @@ public class PlacementHelpers { //mc.fontRenderer.drawString(text, x, y, 0xFFFFFF | opacity); - boolean flag = AllConfigs.CLIENT.smoothPlacementIndicator.get(); - if (flag) - drawDirectionIndicator(event.getPartialTicks(), screenX, screenY, progress); - - else { - //TODO find something more in style - } + drawDirectionIndicator(event.getPartialTicks(), screenX, screenY, progress); //matrix.pop(); } } @@ -184,11 +179,17 @@ public class PlacementHelpers { Vec3d projTarget = VecHelper.projectToPlayerView(VecHelper.getCenterOf(lastTarget), partialTicks); Vec3d target = new Vec3d(projTarget.x, projTarget.y, 0); + if (projTarget.z > 0) { + target = target.inverse(); + } + Vec3d norm = target.normalize(); Vec3d ref = new Vec3d(0, 1, 0); float targetAngle = AngleHelper.deg(Math.acos(norm.dotProduct(ref))); - if (norm.x > 0) { + angle.withSpeed(0.25f); + + if (norm.x < 0) { targetAngle = 360 - targetAngle; } @@ -198,10 +199,21 @@ public class PlacementHelpers { angle.target(targetAngle); angle.tick(); + float snapSize = 22.5f; + float snappedAngle = (snapSize * Math.round(angle.get(0f) / snapSize)) % 360f; float length = 10; //TOD O if the target is off screen, use length to show a meaningful distance + boolean flag = AllConfigs.CLIENT.smoothPlacementIndicator.get(); + if (flag) + fadedArrow(centerX, centerY, r, g, b, a, length, snappedAngle); + + else + textured(centerX, centerY, a, snappedAngle); + } + + private static void fadedArrow(float centerX, float centerY, float r, float g, float b, float a, float length, float snappedAngle) { RenderSystem.pushMatrix(); RenderSystem.disableTexture(); RenderSystem.enableBlend(); @@ -210,8 +222,8 @@ public class PlacementHelpers { RenderSystem.shadeModel(GL11.GL_SMOOTH); RenderSystem.translated(centerX, centerY, 0); - RenderSystem.rotatef(angle.get(0.1f), 0, 0, -1); - //RenderSystem.scaled(3, 3, 3); + RenderSystem.rotatef(angle.get(0), 0, 0, 1); + //RenderSystem.rotatef(snappedAngle, 0, 0, 1); Tessellator tessellator = Tessellator.getInstance(); BufferBuilder bufferbuilder = tessellator.getBuffer(); @@ -234,4 +246,51 @@ public class PlacementHelpers { RenderSystem.enableTexture(); RenderSystem.popMatrix(); } + + private static void textured(float centerX, float centerY, float alpha, float snappedAngle) { + RenderSystem.pushMatrix(); + RenderSystem.enableTexture(); + //RenderSystem.disableTexture(); + AllGuiTextures.PLACEMENT_INDICATOR_SHEET.bind(); + RenderSystem.enableBlend(); + //RenderSystem.disableAlphaTest(); + RenderSystem.enableAlphaTest(); + RenderSystem.defaultBlendFunc(); + RenderSystem.color4f(1f, 1f, 1f, 1f); + RenderSystem.shadeModel(GL11.GL_SMOOTH); + + RenderSystem.translated(centerX, centerY, 0); + //RenderSystem.rotatef(angle.get(0.1f), 0, 0, -1); + //RenderSystem.translated(0, 10, 0); + //RenderSystem.rotatef(angle.get(0.1f), 0, 0, 1); + RenderSystem.scaled(12, 12, 0); + + float index = snappedAngle / 22.5f; + float tex_size = 16f/256f; + + float tx = 0; + float ty = index * tex_size; + float tw = 1f; + float th = tex_size; + + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder buffer = tessellator.getBuffer(); + buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR_TEXTURE); + + + buffer.vertex(-1, -1, 0).color(1f, 1f, 1f, alpha).texture(tx, ty).endVertex(); + buffer.vertex(-1, 1, 0).color(1f, 1f, 1f, alpha).texture(tx, ty + th).endVertex(); + buffer.vertex(1, 1, 0).color(1f, 1f, 1f, alpha).texture(tx + tw, ty + th).endVertex(); + buffer.vertex(1, -1, 0).color(1f, 1f, 1f, alpha).texture(tx + tw, ty).endVertex(); + + tessellator.draw(); + RenderSystem.shadeModel(GL11.GL_FLAT); + + //RenderSystem.enableTexture(); + + RenderSystem.disableBlend(); + //RenderSystem.enableAlphaTest(); + RenderSystem.popMatrix(); + } + } diff --git a/src/main/resources/assets/create/textures/gui/placement_indicator.png b/src/main/resources/assets/create/textures/gui/placement_indicator.png new file mode 100644 index 0000000000000000000000000000000000000000..cb53a47fcb3c027831ef62e2a077a255fb5ddeaf GIT binary patch literal 9385 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 literal 0 HcmV?d00001