From 43e8c330620de57df72fa1225e6e2efd828737f8 Mon Sep 17 00:00:00 2001
From: Aaron <51387595+azureaaron@users.noreply.github.com>
Date: Wed, 2 Aug 2023 13:03:58 +0800
Subject: Add text rendering method
---
.../me/xmrvizzy/skyblocker/utils/RenderHelper.java | 187 ++++++++++++---------
1 file changed, 103 insertions(+), 84 deletions(-)
(limited to 'src/main/java/me/xmrvizzy/skyblocker/utils')
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java
index 8f0f7860..5de3ce77 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java
@@ -1,5 +1,8 @@
package me.xmrvizzy.skyblocker.utils;
+import com.mojang.blaze3d.platform.GlStateManager.DstFactor;
+import com.mojang.blaze3d.platform.GlStateManager.SrcFactor;
+import com.mojang.blaze3d.systems.RenderSystem;
import me.x150.renderer.render.Renderer3d;
import me.xmrvizzy.skyblocker.mixin.accessor.BeaconBlockEntityRendererInvoker;
import me.xmrvizzy.skyblocker.utils.culling.OcclusionCulling;
@@ -7,34 +10,26 @@ import me.xmrvizzy.skyblocker.utils.title.Title;
import me.xmrvizzy.skyblocker.utils.title.TitleContainer;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.render.BufferBuilder;
-import net.minecraft.client.render.Camera;
-import net.minecraft.client.render.GameRenderer;
-import net.minecraft.client.render.Tessellator;
-import net.minecraft.client.render.VertexConsumerProvider;
-import net.minecraft.client.render.VertexFormats;
+import net.minecraft.client.font.TextRenderer;
+import net.minecraft.client.render.*;
import net.minecraft.client.render.VertexFormat.DrawMode;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.sound.SoundEvent;
-import net.minecraft.text.Text;
-import net.minecraft.util.Formatting;
+import net.minecraft.text.OrderedText;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
-import java.awt.*;
-
import org.joml.Matrix3f;
import org.joml.Matrix4f;
import org.joml.Vector3f;
import org.lwjgl.opengl.GL11;
-import com.mojang.blaze3d.platform.GlStateManager.DstFactor;
-import com.mojang.blaze3d.platform.GlStateManager.SrcFactor;
-import com.mojang.blaze3d.systems.RenderSystem;
+import java.awt.*;
public class RenderHelper {
private static final Vec3d ONE = new Vec3d(1, 1, 1);
private static final int MAX_OVERWORLD_BUILD_HEIGHT = 319;
+ private static final MinecraftClient client = MinecraftClient.getInstance();
public static void renderFilledThroughWallsWithBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) {
renderFilledThroughWalls(context, pos, colorComponents, alpha);
@@ -44,8 +39,8 @@ public class RenderHelper {
public static void renderFilledThroughWalls(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) {
if (FrustumUtils.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) {
Renderer3d.renderThroughWalls();
- renderFilled(context, pos, colorComponents, alpha);
- Renderer3d.stopRenderThroughWalls();
+ renderFilled(context, pos, colorComponents, alpha);
+ Renderer3d.stopRenderThroughWalls();
}
}
@@ -63,84 +58,108 @@ public class RenderHelper {
if (FrustumUtils.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, MAX_OVERWORLD_BUILD_HEIGHT, pos.getZ() + 1)) {
MatrixStack matrices = context.matrixStack();
Vec3d camera = context.camera().getPos();
-
+
matrices.push();
- matrices.translate(pos.getX() - camera.x, pos.getY() - camera.y, pos.getZ() - camera.z);
-
+ matrices.translate(pos.getX() - camera.getX(), pos.getY() - camera.getY(), pos.getZ() - camera.getZ());
+
Tessellator tessellator = RenderSystem.renderThreadTesselator();
BufferBuilder buffer = tessellator.getBuffer();
VertexConsumerProvider.Immediate consumer = VertexConsumerProvider.immediate(buffer);
-
+
BeaconBlockEntityRendererInvoker.renderBeam(matrices, consumer, context.tickDelta(), context.world().getTime(), 0, MAX_OVERWORLD_BUILD_HEIGHT, colorComponents);
-
+
consumer.draw();
matrices.pop();
}
}
-
- /**
- * Draws lines from point to point.
- *
- * Tip: To draw lines from the center of a block, offset the X, Y and Z each by 0.5
- *
- * @param context The WorldRenderContext which supplies the matrices and tick delta
- * @param points The points from which to draw lines between
- * @param colorComponents An array of R, G and B color components
- * @param alpha The alpha of the lines
- * @param lineWidth The width of the lines
- */
- public static void renderLinesFromPoints(WorldRenderContext context, Vec3d[] points, float[] colorComponents, float alpha, float lineWidth) {
- Vec3d camera = context.camera().getPos();
- MatrixStack matrices = context.matrixStack();
-
- matrices.push();
- matrices.translate(-camera.x, -camera.y, -camera.z);
-
- Tessellator tessellator = RenderSystem.renderThreadTesselator();
- BufferBuilder buffer = tessellator.getBuffer();
- Matrix4f projectionMatrix = matrices.peek().getPositionMatrix();
- Matrix3f normalMatrix = matrices.peek().getNormalMatrix();
-
- GL11.glEnable(GL11.GL_LINE_SMOOTH);
- GL11.glHint(GL11.GL_LINE_SMOOTH_HINT, GL11.GL_NICEST);
-
- RenderSystem.setShader(GameRenderer::getRenderTypeLinesProgram);
- RenderSystem.setShaderColor(1f, 1f, 1f, 1f);
- RenderSystem.lineWidth(lineWidth);
- RenderSystem.enableBlend();
- RenderSystem.blendFunc(SrcFactor.SRC_ALPHA, DstFactor.ONE_MINUS_SRC_ALPHA);
- RenderSystem.disableCull();
- RenderSystem.enableDepthTest();
-
- buffer.begin(DrawMode.LINE_STRIP, VertexFormats.LINES);
-
- for (int i = 0; i < points.length; i++) {
- Vec3d point = points[i];
- Vec3d nextPoint = (i + 1 == points.length) ? points[i - 1] : points[i + 1];
- Vector3f normalVec = new Vector3f((float) nextPoint.getX(), (float) nextPoint.getY(), (float) nextPoint.getZ()).sub((float) point.getX(), (float) point.getY(), (float) point.getZ()).normalize();
-
- buffer
- .vertex(projectionMatrix, (float) point.getX(), (float) point.getY(), (float) point.getZ())
- .color(colorComponents[0], colorComponents[1], colorComponents[2], alpha)
- .normal(normalMatrix, normalVec.x, normalVec.y, normalVec.z)
- .next();
- }
-
- tessellator.draw();
-
- matrices.pop();
- GL11.glDisable(GL11.GL_LINE_SMOOTH);
- RenderSystem.lineWidth(1f);
- RenderSystem.disableBlend();
- RenderSystem.defaultBlendFunc();
- RenderSystem.enableCull();
- RenderSystem.disableDepthTest();
- }
-
- public static void displayTitleAndPlaySound(int stayTicks, int fadeOutTicks, String titleKey, Formatting formatting) {
- MinecraftClient.getInstance().inGameHud.setTitleTicks(0, stayTicks, fadeOutTicks);
- MinecraftClient.getInstance().inGameHud.setTitle(Text.translatable(titleKey).formatted(formatting));
- playNotificationSound();
+
+ /**
+ * Draws lines from point to point.
+ *
+ * Tip: To draw lines from the center of a block, offset the X, Y and Z each by 0.5
+ *
+ * @param context The WorldRenderContext which supplies the matrices and tick delta
+ * @param points The points from which to draw lines between
+ * @param colorComponents An array of R, G and B color components
+ * @param alpha The alpha of the lines
+ * @param lineWidth The width of the lines
+ */
+ public static void renderLinesFromPoints(WorldRenderContext context, Vec3d[] points, float[] colorComponents, float alpha, float lineWidth) {
+ Vec3d camera = context.camera().getPos();
+ MatrixStack matrices = context.matrixStack();
+
+ matrices.push();
+ matrices.translate(-camera.x, -camera.y, -camera.z);
+
+ Tessellator tessellator = RenderSystem.renderThreadTesselator();
+ BufferBuilder buffer = tessellator.getBuffer();
+ Matrix4f projectionMatrix = matrices.peek().getPositionMatrix();
+ Matrix3f normalMatrix = matrices.peek().getNormalMatrix();
+
+ GL11.glEnable(GL11.GL_LINE_SMOOTH);
+ GL11.glHint(GL11.GL_LINE_SMOOTH_HINT, GL11.GL_NICEST);
+
+ RenderSystem.setShader(GameRenderer::getRenderTypeLinesProgram);
+ RenderSystem.setShaderColor(1f, 1f, 1f, 1f);
+ RenderSystem.lineWidth(lineWidth);
+ RenderSystem.enableBlend();
+ RenderSystem.blendFunc(SrcFactor.SRC_ALPHA, DstFactor.ONE_MINUS_SRC_ALPHA);
+ RenderSystem.disableCull();
+ RenderSystem.enableDepthTest();
+
+ buffer.begin(DrawMode.LINE_STRIP, VertexFormats.LINES);
+
+ for (int i = 0; i < points.length; i++) {
+ Vec3d point = points[i];
+ Vec3d nextPoint = (i + 1 == points.length) ? points[i - 1] : points[i + 1];
+ Vector3f normalVec = new Vector3f((float) nextPoint.getX(), (float) nextPoint.getY(), (float) nextPoint.getZ()).sub((float) point.getX(), (float) point.getY(), (float) point.getZ()).normalize();
+
+ buffer.vertex(projectionMatrix, (float) point.getX(), (float) point.getY(), (float) point.getZ()).color(colorComponents[0], colorComponents[1], colorComponents[2], alpha).normal(normalMatrix, normalVec.x, normalVec.y, normalVec.z).next();
+ }
+
+ tessellator.draw();
+
+ matrices.pop();
+ GL11.glDisable(GL11.GL_LINE_SMOOTH);
+ RenderSystem.lineWidth(1f);
+ RenderSystem.disableBlend();
+ RenderSystem.defaultBlendFunc();
+ RenderSystem.enableCull();
+ RenderSystem.disableDepthTest();
+ }
+
+ /**
+ * Renders text in the world space.
+ *
+ * @param seeThrough Whether the text should be able to be seen through walls or not.
+ */
+ public static void renderText(WorldRenderContext context, Vec3d pos, OrderedText text, float scale, boolean seeThrough) {
+ MatrixStack matrices = context.matrixStack();
+ Vec3d camera = context.camera().getPos();
+ TextRenderer textRenderer = client.textRenderer;
+
+ scale *= 0.025f;
+
+ matrices.push();
+ matrices.translate(pos.getX() - camera.getX(), pos.getY() - camera.getY(), pos.getZ() - camera.getZ());
+ matrices.peek().getPositionMatrix().mul(RenderSystem.getModelViewMatrix());
+ matrices.multiply(context.camera().getRotation());
+ matrices.scale(-scale, -scale, scale);
+
+ Matrix4f positionMatrix = matrices.peek().getPositionMatrix();
+ float xOffset = -textRenderer.getWidth(text) / 2f;
+
+ Tessellator tessellator = RenderSystem.renderThreadTesselator();
+ BufferBuilder buffer = tessellator.getBuffer();
+ VertexConsumerProvider.Immediate consumers = VertexConsumerProvider.immediate(buffer);
+
+ RenderSystem.depthFunc(seeThrough ? GL11.GL_ALWAYS : GL11.GL_LEQUAL);
+
+ textRenderer.draw(text, xOffset, 0, 0xFFFFFFFF, false, positionMatrix, consumers, TextRenderer.TextLayerType.SEE_THROUGH, 0, LightmapTextureManager.MAX_LIGHT_COORDINATE);
+ consumers.draw();
+
+ RenderSystem.depthFunc(GL11.GL_LEQUAL);
+ matrices.pop();
}
/**
--
cgit
From 3c999246269f76feb7c2496f4d23cd5d225b9941 Mon Sep 17 00:00:00 2001
From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>
Date: Fri, 11 Aug 2023 15:28:31 +0800
Subject: Add SecretWaypoint text rendering
---
.../skyblocker/skyblock/dungeon/secrets/Room.java | 20 ++---------
.../skyblock/dungeon/secrets/SecretWaypoint.java | 39 ++++++++++++++++++++--
.../me/xmrvizzy/skyblocker/utils/RenderHelper.java | 17 ++++++++--
3 files changed, 53 insertions(+), 23 deletions(-)
(limited to 'src/main/java/me/xmrvizzy/skyblocker/utils')
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/Room.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/Room.java
index da3ea5eb..e7ed7014 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/Room.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/Room.java
@@ -5,7 +5,6 @@ import com.google.gson.JsonObject;
import it.unimi.dsi.fastutil.ints.IntRBTreeSet;
import it.unimi.dsi.fastutil.ints.IntSortedSet;
import it.unimi.dsi.fastutil.ints.IntSortedSets;
-import me.xmrvizzy.skyblocker.utils.RenderHelper;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
import net.fabricmc.fabric.api.util.TriState;
import net.minecraft.block.MapColor;
@@ -185,30 +184,15 @@ public class Room {
JsonObject waypoint = waypointElement.getAsJsonObject();
String secretName = waypoint.get("secretName").getAsString();
int secretIndex = Integer.parseInt(secretName.substring(0, Character.isDigit(secretName.charAt(1)) ? 2 : 1));
- secretWaypoints.add(new SecretWaypoint(secretIndex, getCategory(waypoint), DungeonMapUtils.relativeToActual(directionRooms.getMiddle(), directionRooms.getLeft(), waypoint), true));
+ secretWaypoints.add(new SecretWaypoint(secretIndex, waypoint, secretName, DungeonMapUtils.relativeToActual(directionRooms.getMiddle(), directionRooms.getLeft(), waypoint)));
}
DungeonSecrets.LOGGER.info("[Skyblocker] Room {} matched after checking {} block(s)", name, checkedBlocks.size()); // TODO change to debug
}
- private SecretWaypoint.Category getCategory(JsonObject categoryJson) {
- return switch (categoryJson.get("category").getAsString()) {
- case "entrance" -> SecretWaypoint.Category.ENTRANCE;
- case "superboom" -> SecretWaypoint.Category.SUPERBOOM;
- case "chest" -> SecretWaypoint.Category.CHEST;
- case "item" -> SecretWaypoint.Category.ITEM;
- case "bat" -> SecretWaypoint.Category.BAT;
- case "wither" -> SecretWaypoint.Category.WITHER;
- case "lever" -> SecretWaypoint.Category.LEVER;
- case "fairysoul" -> SecretWaypoint.Category.FAIRYSOUL;
- case "stonk" -> SecretWaypoint.Category.STONK;
- default -> SecretWaypoint.Category.DEFAULT;
- };
- }
-
protected void render(WorldRenderContext context) {
for (SecretWaypoint secretWaypoint : secretWaypoints) {
if (secretWaypoint.missing()) {
- RenderHelper.renderFilledThroughWallsWithBeaconBeam(context, secretWaypoint.pos(), secretWaypoint.category().colorComponents, 0.5F);
+ secretWaypoint.render(context);
}
}
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/SecretWaypoint.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/SecretWaypoint.java
index 475229e0..08cba782 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/SecretWaypoint.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/SecretWaypoint.java
@@ -1,9 +1,27 @@
package me.xmrvizzy.skyblocker.skyblock.dungeon.secrets;
+import com.google.gson.JsonObject;
+import me.xmrvizzy.skyblocker.utils.RenderHelper;
+import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
import net.minecraft.util.math.BlockPos;
-public record SecretWaypoint(int secretIndex, Category category, BlockPos pos, boolean missing) {
- enum Category {
+public record SecretWaypoint(int secretIndex, Category category, Text name, BlockPos pos, PlayerEntity player, boolean missing) {
+ SecretWaypoint(int secretIndex, JsonObject waypoint, String name, BlockPos pos) {
+ this(secretIndex, Category.get(waypoint), Text.of(name), pos, MinecraftClient.getInstance().player, true);
+ }
+
+ void render(WorldRenderContext context) {
+ RenderHelper.renderFilledThroughWallsWithBeaconBeam(context, pos(), category().colorComponents, 0.5F);
+ RenderHelper.renderText(context, name(), pos().up().toCenterPos(), true);
+ double distance = player().getPos().distanceTo(pos().toCenterPos());
+ RenderHelper.renderText(context, Text.literal(Math.round(distance) + "m").formatted(Formatting.YELLOW), pos().up().toCenterPos(), 1, MinecraftClient.getInstance().textRenderer.fontHeight + 1, true);
+ }
+
+ private enum Category {
ENTRANCE(0, 255, 0),
SUPERBOOM(255, 0, 0),
CHEST(2, 213, 250),
@@ -14,7 +32,7 @@ public record SecretWaypoint(int secretIndex, Category category, BlockPos pos, b
FAIRYSOUL(255, 85, 255),
STONK(146, 52, 235),
DEFAULT(190, 255, 252);
- final float[] colorComponents;
+ private final float[] colorComponents;
Category(int... intColorComponents) {
colorComponents = new float[intColorComponents.length];
@@ -22,5 +40,20 @@ public record SecretWaypoint(int secretIndex, Category category, BlockPos pos, b
colorComponents[i] = intColorComponents[i] / 255F;
}
}
+
+ private static Category get(JsonObject categoryJson) {
+ return switch (categoryJson.get("category").getAsString()) {
+ case "entrance" -> Category.ENTRANCE;
+ case "superboom" -> Category.SUPERBOOM;
+ case "chest" -> Category.CHEST;
+ case "item" -> Category.ITEM;
+ case "bat" -> Category.BAT;
+ case "wither" -> Category.WITHER;
+ case "lever" -> Category.LEVER;
+ case "fairysoul" -> Category.FAIRYSOUL;
+ case "stonk" -> Category.STONK;
+ default -> Category.DEFAULT;
+ };
+ }
}
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java
index 5de3ce77..a38f1ab8 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java
@@ -16,6 +16,7 @@ import net.minecraft.client.render.VertexFormat.DrawMode;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.sound.SoundEvent;
import net.minecraft.text.OrderedText;
+import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
@@ -73,6 +74,18 @@ public class RenderHelper {
}
}
+ public static void renderText(WorldRenderContext context, Text text, Vec3d pos, boolean seeThrough) {
+ renderText(context, text, pos, 1, seeThrough);
+ }
+
+ public static void renderText(WorldRenderContext context, Text text, Vec3d pos, float scale, boolean seeThrough) {
+ renderText(context, text, pos, scale, 0, seeThrough);
+ }
+
+ public static void renderText(WorldRenderContext context, Text text, Vec3d pos, float scale, float yOffset, boolean seeThrough) {
+ renderText(context, text.asOrderedText(), pos, scale, yOffset, seeThrough);
+ }
+
/**
* Draws lines from point to point.
*
@@ -133,7 +146,7 @@ public class RenderHelper { * * @param seeThrough Whether the text should be able to be seen through walls or not. */ - public static void renderText(WorldRenderContext context, Vec3d pos, OrderedText text, float scale, boolean seeThrough) { + public static void renderText(WorldRenderContext context, OrderedText text, Vec3d pos, float scale, float yOffset, boolean seeThrough) { MatrixStack matrices = context.matrixStack(); Vec3d camera = context.camera().getPos(); TextRenderer textRenderer = client.textRenderer; @@ -155,7 +168,7 @@ public class RenderHelper { RenderSystem.depthFunc(seeThrough ? GL11.GL_ALWAYS : GL11.GL_LEQUAL); - textRenderer.draw(text, xOffset, 0, 0xFFFFFFFF, false, positionMatrix, consumers, TextRenderer.TextLayerType.SEE_THROUGH, 0, LightmapTextureManager.MAX_LIGHT_COORDINATE); + textRenderer.draw(text, xOffset, yOffset, 0xFFFFFFFF, false, positionMatrix, consumers, TextRenderer.TextLayerType.SEE_THROUGH, 0, LightmapTextureManager.MAX_LIGHT_COORDINATE); consumers.draw(); RenderSystem.depthFunc(GL11.GL_LEQUAL); -- cgit