diff --git a/src/main/java/net/montoyo/wd/block/ScreenBlock.java b/src/main/java/net/montoyo/wd/block/ScreenBlock.java index 34950bb..b088da5 100644 --- a/src/main/java/net/montoyo/wd/block/ScreenBlock.java +++ b/src/main/java/net/montoyo/wd/block/ScreenBlock.java @@ -209,6 +209,7 @@ public class ScreenBlock extends BaseEntityBlock { Vector3f rel = new Vector3f(hitX, hitY, hitZ); + // this dot is acting as a "get distance from plane" where the plane is the edge of the screen float cx = rel.dot(side.right.toFloat()) - 2.f / 16.f; float cy = rel.dot(side.up.toFloat()) - 2.f / 16.f; float sw = ((float) scr.size.x) - 4.f / 16.f; diff --git a/src/main/java/net/montoyo/wd/client/gui/camera/KeyboardCamera.java b/src/main/java/net/montoyo/wd/client/gui/camera/KeyboardCamera.java index 112a631..795ca87 100644 --- a/src/main/java/net/montoyo/wd/client/gui/camera/KeyboardCamera.java +++ b/src/main/java/net/montoyo/wd/client/gui/camera/KeyboardCamera.java @@ -10,9 +10,11 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.event.ViewportEvent; import net.minecraftforge.event.TickEvent; import net.montoyo.wd.client.js.WDRouter; +import net.montoyo.wd.config.CommonConfig; import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.entity.ScreenData; import net.montoyo.wd.utilities.data.BlockSide; +import net.montoyo.wd.utilities.data.Rotation; public class KeyboardCamera { private static ScreenBlockEntity tes; @@ -28,6 +30,52 @@ public class KeyboardCamera { private static double nextX = -1; private static double nextY = -1; + protected static Vec2 pxToHit(ScreenData scr, Vec2 dst) { + float cx, cy; + if (scr.rotation.isVertical) { + cy = dst.x; + cx = dst.y; + } else { + cx = dst.x; + cy = dst.y; + } + + cx /= (float) scr.resolution.x; + cy /= (float) scr.resolution.y; + + switch (scr.rotation) { + case ROT_270: + cx = 1.0f - cx; + break; + + case ROT_180: + cx = 1.0f - cx; + cy = 1.0f - cy; + break; + + case ROT_90: + cy = 1.0f - cy; + break; + } + + if (side != BlockSide.BOTTOM) + cy = 1.0f - cy; + + float swInverse = (((float) scr.size.x) - 4.f / 16.f); + float shInverse = (((float) scr.size.y) - 4.f / 16.f); + + cx *= swInverse; + cy *= shInverse; + + if(side.right.x > 0 || side.right.z > 0) + cx += 1.f; + + if(side == BlockSide.TOP || side == BlockSide.BOTTOM) + cy -= 1.f; + + return new Vec2(cx + (2 / 16f), cy + (2 / 16f)); + } + protected static void updateCrd(JsonObject obj) { if (obj.getAsJsonPrimitive("exists").getAsBoolean()) { ScreenData scr = tes.getScreen(side); @@ -35,16 +83,17 @@ public class KeyboardCamera { nextX = obj.getAsJsonPrimitive("x").getAsDouble() + obj.getAsJsonPrimitive("w").getAsDouble() / 2; nextY = obj.getAsJsonPrimitive("y").getAsDouble() + obj.getAsJsonPrimitive("h").getAsDouble() / 2; - nextX /= scr.resolution.x; - if (nextX > 1 || nextX < 0) { - nextX = -1; - } else nextX *= scr.size.x; + Vec2 c = pxToHit(scr, new Vec2((float) nextX, (float) nextY)); - nextY /= scr.resolution.y; - nextY = 1 - nextY; - if (nextY > 1 || nextY < 0) { - nextY = -1; - } else nextY *= scr.size.y; + nextX = c.x; + nextY = c.y; + +// if (side.right.x > 0) +// nextX += 1.f; +// if (side.right.z > 0) +// nextX += 1.f; +// if (side == BlockSide.BOTTOM) +// nextY -= 1.f; } } else { nextX = -1; @@ -132,45 +181,24 @@ futureStart = System.currentTimeMillis(); return; // nothing to do } - if (xCrd < 0) return; - if (yCrd < 0) return; + if (xCrd == -1) return; + if (yCrd == -1) return; // TODO: implement double coxCrd = Mth.lerp(0.5 * event.getPartialTick(), oxCrd, xCrd); - double cxCrd = Mth.lerp(0.15 * event.getPartialTick(), xCrd, nxCrd); - double coyCrd = Mth.lerp(0.5 * event.getPartialTick(), oyCrd, yCrd); double focalX = tes.getBlockPos().getX() + - side.right.x * (coxCrd - 1) + side.up.x * coyCrd; + side.right.x * (coxCrd - 1) + side.up.x * coyCrd + Math.abs(side.forward.x) * 0.5; double focalY = tes.getBlockPos().getY() + - side.right.y * (coxCrd - 1) + side.up.y * coyCrd; + side.right.y * (coxCrd - 1) + side.up.y * coyCrd + Math.abs(side.forward.y) * 0.5; double focalZ = tes.getBlockPos().getZ() + - side.right.z * (coxCrd - 1) + side.up.z * coyCrd; + side.right.z * (coxCrd - 1) + side.up.z * coyCrd + Math.abs(side.forward.z) * 0.5; -//// double pct = 1 - event.getPartialTick(); -// double pct = 1; -//// pct = pct / 5 + (1 / 4f); -// focalX = Mth.lerp(pct, -// focalX, -// tes.getBlockPos().getX() + -// side.right.x * (coxCrd - 1) + side.up.x * coyCrd -// ); -// focalY = Mth.lerp(pct, -// focalY, -// tes.getBlockPos().getY() + -// side.right.y * (coxCrd - 1) + side.up.y * coyCrd -// ); -// focalZ = Mth.lerp(pct, -// focalZ, -// tes.getBlockPos().getZ() + -// side.right.z * (coxCrd - 1) + side.up.z * coyCrd -// ); - -// focalX += side.forward.x * 0.25f; -// focalY += side.forward.y * 0.25f; -// focalZ += side.forward.z * 0.25f; + focalX += side.forward.x * 0.5f; + focalY += side.forward.y * 0.5f; + focalZ += side.forward.z * 0.5f; float[] angle = lookAt( event.getCamera().getEntity(), @@ -189,8 +217,8 @@ futureStart = System.currentTimeMillis(); Vec2 v2 = new Vec2((float) mx, (float) my); v2 = v2.normalized().scale(Mth.sqrt(v2.length())); - angle[1] += (v2.x - 0.5f) * scl; - angle[0] += (v2.y - 0.5f) * scl; +// angle[1] += (v2.x - 0.5f) * scl; +// angle[0] += (v2.y - 0.5f) * scl; float xRot = event.getYaw(); // left right float yRot = event.getPitch(); // up down @@ -248,6 +276,11 @@ futureStart = System.currentTimeMillis(); anxx = data.size.x / 2.0; anxy = data.size.y / 2.0; + + if (nxCrd == -1) { + oxCrd = xCrd = nxCrd = anxx; + oyCrd = yCrd = nyCrd = anxy; + } } if (activeTask == null)