cleaner input handling for cursors
This commit is contained in:
parent
1309ab1c63
commit
305491d317
2 changed files with 22 additions and 20 deletions
|
@ -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));
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue