rework interactions
This commit is contained in:
@@ -239,6 +239,7 @@ pub enum PointerMode {
|
||||
Left,
|
||||
Right,
|
||||
Middle,
|
||||
Special,
|
||||
}
|
||||
|
||||
pub fn interact<O>(
|
||||
@@ -371,7 +372,7 @@ impl Pointer {
|
||||
let mut hits: SmallVec<[RayHit; 8]> = smallvec!();
|
||||
|
||||
for overlay in overlays.iter() {
|
||||
if !overlay.state.want_visible {
|
||||
if !overlay.state.want_visible || !overlay.state.interactable {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -435,30 +436,32 @@ impl Pointer {
|
||||
O: Default,
|
||||
{
|
||||
if self.now.grab {
|
||||
if self.now.click && !self.before.click {
|
||||
log::warn!("todo: click-while-grabbed");
|
||||
}
|
||||
|
||||
let grab_data = self.interaction.grabbed.as_mut().unwrap();
|
||||
match self.interaction.mode {
|
||||
PointerMode::Left => {
|
||||
grab_data.offset.z -= self.now.scroll * 0.05;
|
||||
}
|
||||
_ => {
|
||||
overlay.state.transform.matrix3 = overlay
|
||||
.state
|
||||
.transform
|
||||
.matrix3
|
||||
.mul_scalar(1.0 + 0.01 * self.now.scroll);
|
||||
if self.now.click {
|
||||
self.interaction.mode = PointerMode::Special;
|
||||
let cur_scale = overlay.state.transform.x_axis.length();
|
||||
if cur_scale < 0.1 && self.now.scroll > 0.0 {
|
||||
return;
|
||||
} else if cur_scale > 20. && self.now.scroll < 0.0 {
|
||||
return;
|
||||
}
|
||||
|
||||
overlay.state.transform.matrix3 = overlay
|
||||
.state
|
||||
.transform
|
||||
.matrix3
|
||||
.mul_scalar(1.0 - 0.025 * self.now.scroll);
|
||||
} else {
|
||||
grab_data.offset.z -= self.now.scroll * 0.05;
|
||||
}
|
||||
overlay.state.transform.translation = self.pose.transform_point3a(grab_data.offset);
|
||||
overlay.state.realign(hmd);
|
||||
overlay.state.dirty = true;
|
||||
} else {
|
||||
overlay.state.spawn_point = hmd
|
||||
.inverse()
|
||||
.transform_point3a(overlay.state.transform.translation);
|
||||
overlay.state.saved_point = Some(
|
||||
hmd.inverse()
|
||||
.transform_point3a(overlay.state.transform.translation),
|
||||
);
|
||||
self.interaction.grabbed = None;
|
||||
log::info!("Hand {}: dropped {}", self.idx, overlay.state.name);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user