cleaner input handling for cursors

This commit is contained in:
spatialfree 2021-11-03 06:50:47 -04:00
parent 1309ab1c63
commit 305491d317
2 changed files with 22 additions and 20 deletions

View file

@ -43,7 +43,12 @@ public static class Mono {
// Default.MaterialHand["color"] = cube.color;
// reachCursor.Step();
supineCursor.Step();
supineCursor.Step(
mainHand.aim.position,
offHand.aim.orientation,
mainHand.aim.orientation,
Mono.mainHand.IsStickClicked
);
// oriel.Step();
// cursor.Draw(Matrix.S(0.1f));

View file

@ -39,11 +39,10 @@ public class ReachCursor {
}
public class TwistCursor : SpatialCursor {
public void Step() {
Quat rel = Quat.LookAt(Vec3.Zero, Mono.mainHand.aim.orientation * Vec3.Forward);
float twist = Vec3.Dot(rel * Vec3.Up, Mono.mainHand.aim.orientation * Vec3.Up);
twist = MathF.Max(twist - 0.05f, 0);
pos = Mono.mainHand.aim.position + Mono.mainHand.aim.orientation * Vec3.Forward * twist;
public void Step(Vec3 mainPos, Quat mainQuat) {
Quat rel = Quat.LookAt(Vec3.Zero, mainQuat * Vec3.Forward);
float twist = (Vec3.Dot(rel * -Vec3.Right, mainQuat * Vec3.Up) + 1) / 2;
pos = mainPos + mainQuat * Vec3.Forward * twist;
model.Draw(Matrix.TS(pos, 0.06f));
}
@ -52,22 +51,20 @@ public class TwistCursor : SpatialCursor {
public class SupineCursor : SpatialCursor {
float calibStr;
Quat calibQuat;
public void Step(Vec3 mainPos, Quat offQuat, Quat mainQuat, bool calibrate = false) {
Quat rel = Quat.LookAt(Vec3.Zero, offQuat * Vec3.Forward);
float twist = (Vec3.Dot(rel * -Vec3.Right, offQuat * Vec3.Up) + 1) / 2;
public void Step() {
// calibration
if (Mono.mainHand.IsStickClicked) {
pos = mainPos + mainQuat * calibQuat * Vec3.Forward * calibStr * twist;
if (calibrate) {
Vec3 target = Input.Head.position + Input.Head.Forward;
calibStr = Vec3.Distance(Mono.mainHand.aim.position, target) * 2;
calibStr = Vec3.Distance(mainPos, target) * 2;
Quat calibAlign = Quat.LookAt(Mono.mainHand.aim.position, target);
calibQuat = Mono.mainHand.aim.orientation.Inverse * calibAlign;
Quat calibAlign = Quat.LookAt(mainPos, target);
calibQuat = mainQuat.Inverse * calibAlign;
}
Quat rel = Quat.LookAt(Vec3.Zero, Mono.offHand.aim.orientation * Vec3.Forward);
float twist = (Vec3.Dot(rel * -Vec3.Right, Mono.offHand.aim.orientation * Vec3.Up) + 1) / 2;
pos = Mono.mainHand.aim.position + Mono.mainHand.aim.orientation * calibQuat * Vec3.Forward * calibStr * twist;
model.Draw(Matrix.TS(pos, 0.06f));
}
}