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; // Default.MaterialHand["color"] = cube.color;
// reachCursor.Step(); // reachCursor.Step();
supineCursor.Step(); supineCursor.Step(
mainHand.aim.position,
offHand.aim.orientation,
mainHand.aim.orientation,
Mono.mainHand.IsStickClicked
);
// oriel.Step(); // oriel.Step();
// cursor.Draw(Matrix.S(0.1f)); // cursor.Draw(Matrix.S(0.1f));

View file

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