From 69534712264c686bf7c03c8875fb6f67508030fb Mon Sep 17 00:00:00 2001 From: hama Date: Sun, 3 Nov 2024 12:06:36 -0800 Subject: [PATCH] feat: pathing target render --- .../armistice/client/MechaPlayerControl.java | 4 +- .../client/render/hud/MechaHudRenderer.java | 70 ++++++++++++++++++ .../division/armistice/mecha/MechaCore.java | 5 ++ .../armistice/mixin/GameRenderAccessor.java | 12 +++ src/main/resources/armistice.mixins.json | 1 + .../armistice/textures/hud/pathtarget.png | Bin 0 -> 4369 bytes 6 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 src/main/java/symbolics/division/armistice/mixin/GameRenderAccessor.java create mode 100644 src/main/resources/assets/armistice/textures/hud/pathtarget.png diff --git a/src/main/java/symbolics/division/armistice/client/MechaPlayerControl.java b/src/main/java/symbolics/division/armistice/client/MechaPlayerControl.java index afd01ab..5cc742a 100644 --- a/src/main/java/symbolics/division/armistice/client/MechaPlayerControl.java +++ b/src/main/java/symbolics/division/armistice/client/MechaPlayerControl.java @@ -82,11 +82,11 @@ private static void onRightClick(LocalPlayer player, MechaEntity mecha, int acti HitResult raycast = Minecraft.getInstance().getCameraEntity().pick(200, 0, false); if (raycast.getType() == HitResult.Type.MISS) return; - player.connection.send(new MechaMovementRequestC2SPayload(raycast.getLocation().toVector3f())); mecha.core().setPathingTarget(raycast.getLocation().toVector3f()); - System.out.println("sound"); player.playSound(ArmisticeSoundEventRegistrar.ENTITY$MECHA$ALERT, 0.3f, AudioUtil.randomizedPitch(player.getRandom(), 1, 0.4f)); + + } } diff --git a/src/main/java/symbolics/division/armistice/client/render/hud/MechaHudRenderer.java b/src/main/java/symbolics/division/armistice/client/render/hud/MechaHudRenderer.java index 277e4a4..68cc6c5 100644 --- a/src/main/java/symbolics/division/armistice/client/render/hud/MechaHudRenderer.java +++ b/src/main/java/symbolics/division/armistice/client/render/hud/MechaHudRenderer.java @@ -2,8 +2,10 @@ import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.renderer.GameRenderer; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; @@ -11,10 +13,14 @@ import net.minecraft.world.phys.Vec3; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.neoforge.client.event.RegisterGuiLayersEvent; +import org.joml.Matrix4f; +import org.joml.Quaternionf; +import org.joml.Vector3f; import org.joml.Vector4f; import symbolics.division.armistice.Armistice; import symbolics.division.armistice.client.ArmisticeClient; import symbolics.division.armistice.mecha.MechaEntity; +import symbolics.division.armistice.mixin.GameRenderAccessor; import java.util.ArrayList; import java.util.List; @@ -42,6 +48,7 @@ public final class MechaHudRenderer { private static final ResourceLocation BIG_ELEV_TICK = Armistice.id("textures/hud/big_elev_tick.png"); private static final ResourceLocation CROSSHAIR = Armistice.id("textures/hud/crosshair.png"); + private static final ResourceLocation PATHTARGET = Armistice.id("textures/hud/pathtarget.png"); @SubscribeEvent private static void registerGuiLayers(RegisterGuiLayersEvent event) { @@ -73,6 +80,7 @@ private static void registerGuiLayers(RegisterGuiLayersEvent event) { renderCrosshair(drawHelper, mecha); renderHeat(drawHelper, mecha); renderElevation(drawHelper, mecha); + renderPathtarget(drawHelper, mecha); RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); @@ -325,6 +333,68 @@ private static void renderHeading(DrawHelper drawHelper, MechaEntity mecha) { resetColor(); } + private static void renderPathtarget(DrawHelper drawHelper, Entity mecha) { + float gw = drawHelper.guiGraphics().guiWidth(); + float gh = drawHelper.guiGraphics().guiHeight(); + float ar = gw / gh; + if (mecha instanceof MechaEntity mechaEntity) { + var tgt = mechaEntity.core().getPathingTarget(); + if (tgt != null) { + GameRenderer gr = Minecraft.getInstance().gameRenderer; + Entity cameraEntity = Minecraft.getInstance().getCameraEntity(); + Camera cam = gr.getMainCamera(); + + double fov = Math.max( + Minecraft.getInstance().options.fov().get().intValue(), + ((GameRenderAccessor) gr).invokeGetFov(cam, cam.getPartialTickTime(), false) + ); + + // camera to screen matrix + Matrix4f mat = gr.getProjectionMatrix(fov); + + // world to camera matrix + Vec3 camPos = cameraEntity.getEyePosition(cam.getPartialTickTime()); + mat.rotate(cam.rotation().conjugate(new Quaternionf())); + mat.translate((float) -camPos.x, (float) -camPos.y, (float) -camPos.z); + + Vector3f p = mat.transformPosition(tgt.toVector3f()); + + if (p.z < 0) return; // not in frame + + // perspective division!!!!!! + p.mul(1 / p.z); + float screenX = gw / 2 * (p.x + 1); + float screenY = gh / 2 * (-p.y + 1); + + drawHelper.renderFlicker( + pos -> drawHelper.guiGraphics().blit( + PATHTARGET, + (int) pos.x, (int) pos.y, + 15, 15, + 0, 0, + 15, 15, + 15, 15 + ), + new Vec2( + screenX - 9, + screenY - 9 + ), + lightbulbColor() + ); + + drawHelper.renderCenteredNumber( + (int) camPos.distanceTo(tgt), + screenX, + screenY + 10, + 1, + lightbulbColor() + ); + + resetColor(); + } + } + } + private static void renderSpeedometer(DrawHelper drawHelper, Entity mecha) { final float bottomOffset = drawHelper.guiGraphics().guiHeight() - drawHelper.guiGraphics().guiHeight() / 3f; final float leftOffset = drawHelper.guiGraphics().guiWidth() / 4.6f; diff --git a/src/main/java/symbolics/division/armistice/mecha/MechaCore.java b/src/main/java/symbolics/division/armistice/mecha/MechaCore.java index b79fdb4..227824d 100644 --- a/src/main/java/symbolics/division/armistice/mecha/MechaCore.java +++ b/src/main/java/symbolics/division/armistice/mecha/MechaCore.java @@ -239,4 +239,9 @@ public void setHeat(int heat) { public void setPathingTarget(Vector3f pos) { chassis.setPathingTarget(new Vec3(pos)); } + + @Nullable + public Vec3 getPathingTarget() { + return chassis.pathingTarget; + } } diff --git a/src/main/java/symbolics/division/armistice/mixin/GameRenderAccessor.java b/src/main/java/symbolics/division/armistice/mixin/GameRenderAccessor.java new file mode 100644 index 0000000..469190f --- /dev/null +++ b/src/main/java/symbolics/division/armistice/mixin/GameRenderAccessor.java @@ -0,0 +1,12 @@ +package symbolics.division.armistice.mixin; + +import net.minecraft.client.Camera; +import net.minecraft.client.renderer.GameRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(GameRenderer.class) +public interface GameRenderAccessor { + @Invoker + double invokeGetFov(Camera activeRenderInfo, float partialTicks, boolean useFOVSetting); +} diff --git a/src/main/resources/armistice.mixins.json b/src/main/resources/armistice.mixins.json index 9fb128a..1dd3306 100644 --- a/src/main/resources/armistice.mixins.json +++ b/src/main/resources/armistice.mixins.json @@ -10,6 +10,7 @@ "defaultRequire": 1 }, "client": [ + "GameRenderAccessor", "GameRendererMixin", "GuiMixin" ] diff --git a/src/main/resources/assets/armistice/textures/hud/pathtarget.png b/src/main/resources/assets/armistice/textures/hud/pathtarget.png new file mode 100644 index 0000000000000000000000000000000000000000..2f6484ee080158a9b23dde26dd4a99135402cc54 GIT binary patch literal 4369 zcmeHKe^3?XkCT z2htjU&_JvpjxmYBTCF&W14&Uc5UW5jHJKO_Llg}SAv7i?O%9!QN)i?N-8+6xGt*(F z`H!2~+uiql@AKaKeBXPs->R(4)iIIrkq`vMSToGo;QpX;MLYohmtB2+4Y+lb*>mJ< z+6Q|i(a9Hbuw3flV9w7wA;|xskhNh>CmeBi@JFT@uf!Rv`8_Z7{^0_8|DGzLyD0T) zZf*0~O`A*g5%q791;XiVsr$(<_a)u`T}OoE$$PhwIlFO2ZWSUWoc`?I$?6wUcet<1 z#QUzux06WgmV27R5nuhJ^xV;(ubqGNAuOh>JnC0n-wsu9+aHcUqpzwKhU;7}_fprF zJ$?$;#1RE#`?-3LE^OD<#^itBh&8nweJSSCkLxn`J}4f@E$Y1dsuzO7cJS%xS=RLQ z(PTghb-%7PWpu7gcwgsI; z9UV1qG;H5_vT1hHHu#&c{;&Fu+*B9Qko_G^^YJ4& zNlld&BBc zUE%P$r;(4K@Mqi270uno-j6=+>1lIO_wGT>eyKe$>xqX!(UtI^xN>ZdQ;aC6X;yS_ zYQNwCRR=-F6@CxR6mT-^;9R`hq#8KWrh<9aqY_>6Yw|9gEzz6E5Jt(fmP(eT^T6kqk2>=-h z=zA@^cF?0}Hs=+KC5E$?NfU>&1GVNwK1qy(xd4S_EXdEe8 z5=Wd4217{F;6xk*O(TSkO`%DW*0OlY1c-GK52}(boEVh?#R4dtj^2lS-q;#wA&WwCn^1 zpa*z2EBd_SOLku1*2}cQC$1wfEw0xX3|dmJ#X^Y(5ufBFFQ`QY701+sK4`9N3oEXS5@prKe=rp>g>0Z>dsQaDawgdM{uTu?6u zDf?)NOLYMr0au_vgIvK$BU_a`S>Kn>Df<8@LvS1!r_7*2N0LRAi7}e35&bVdj6sD7 zBL>)oWMFiGNr;Y(!V$idq4NX&M)u(c^Z=lzolJ?}X}YHAni2z3Ql74^X}YGwz?77y ztLy(pSLFC%igSZ6ARjm?J+ZON3XWM1IM%K}||uKCd4Oly*Fcb|J_Y1zOhfj`Z@u?YV#=K^7m z^$p()1P(P+Ml_yI^hc{cFHi0Z)Ovsa&(h?**@p**UfV)!K0d5znbR`!m4w~{Vw(eE kOy92g>9SwWDxc97cDwY}%3Dvy*Md|at0mLil$N*cKMyoIu>b%7 literal 0 HcmV?d00001