use a proper inverse of hit2px for the coordinate calculation for the keyboard camera

This commit is contained in:
GiantLuigi4 2023-11-22 23:59:18 -05:00
parent f3f3cff079
commit 84d475d61c
2 changed files with 74 additions and 40 deletions

View File

@ -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;

View File

@ -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)