HexCasting/src/main/java/at/petrak/hex/client/HexRenderOverlays.java

89 lines
3.9 KiB
Java

package at.petrak.hex.client;
import at.petrak.hex.HexUtils;
import at.petrak.hex.casting.CastingHarness;
import at.petrak.hex.items.HexItems;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.LongArrayTag;
import net.minecraft.nbt.Tag;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
// https://github.com/gamma-delta/VCC/blob/master/src/main/java/me/gammadelta/client/VCCRenderOverlays.java⌈
public class HexRenderOverlays {
@SubscribeEvent
public static void renderOverlay(RenderGameOverlayEvent e) {
LocalPlayer player = Minecraft.getInstance().player;
ItemStack held = player.getMainHandItem();
if (held.getItem() == HexItems.wand.get()) {
tryRenderCastOverlay(e, player, held);
}
}
private static void tryRenderCastOverlay(RenderGameOverlayEvent e, LocalPlayer player, ItemStack wand) {
if (wand.hasTag() && !wand.getTag().isEmpty()) {
CompoundTag tag = wand.getTag();
if (tag.contains(CastingHarness.TAG_POINTS)) {
PoseStack ps = e.getMatrixStack();
Minecraft mc = Minecraft.getInstance();
MultiBufferSource.BufferSource buffers = mc.renderBuffers().bufferSource();
Vec3 camPos = mc.gameRenderer.getMainCamera().getPosition();
Vec3 eyePos = player.getEyePosition(e.getPartialTicks());
ps.pushPose();
ps.translate(camPos.x, camPos.y, camPos.z);
// comment from when i tried to do this in VCC says I need this
// the chain of trust goes back to eutro
// *shudders*
ps.translate(-eyePos.x, -eyePos.y, -eyePos.z);
ListTag tagPointBlobs = tag.getList(CastingHarness.TAG_POINTS, Tag.TAG_LIST);
for (int patIdx = 0; patIdx < tagPointBlobs.size(); patIdx++) {
ListTag tagPoints = tagPointBlobs.getList(patIdx);
// Start new line
VertexConsumer buf = buffers.getBuffer(RenderType.LINES);
for (int idx = 0; idx < tagPoints.size(); idx++) {
// getLongArray is borken, who knew
Vec3 here = HexUtils.deserializeVec3FromNBT(
((LongArrayTag) tagPoints.get(idx)).getAsLongArray());
addVertex(ps, buf, here);
if (idx == tagPoints.size() - 1 &&
patIdx == tagPointBlobs.size() - 1 &&
tag.contains(CastingHarness.TAG_PDS) &&
!tag.getCompound(CastingHarness.TAG_PDS)
.contains(CastingHarness.PatternDrawState.TAG_BETWEEN_PATTERNS)) {
// Draw the final line to the player cursor
VertexConsumer buf1 = buffers.getBuffer(RenderType.LINES);
addVertex(ps, buf1, player.position().add(player.getLookAngle()));
}
}
}
ps.popPose();
buffers.endBatch();
}
}
}
private static void addVertex(PoseStack ps, VertexConsumer buf, Vec3 vert) {
buf.vertex(ps.last().pose(), (float) vert.x, (float) vert.y, (float) vert.z)
.color(128, 128, 255, 255)
.normal(0.0f, 1.0f, 0.0f)
.endVertex();
}
}