From 9fd7bf81e2f31cc7cb35abae52741a5d4e16d391 Mon Sep 17 00:00:00 2001 From: Ilya Bogdanov Date: Sat, 24 Feb 2018 13:46:40 +0300 Subject: [PATCH 1/2] Fix timed method in Delta implementation for axis::Key --- src/input/mod.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/input/mod.rs b/src/input/mod.rs index 17da412..da814a3 100644 --- a/src/input/mod.rs +++ b/src/input/mod.rs @@ -480,8 +480,12 @@ impl Delta for axis::Key { &self, input: &Input, ) -> Option { - self.delta(input) - .map(|delta| delta as TimerDuration * input.delta_time()) + match (self.pos.hit(input), self.neg.hit(input)) { + (true, true) => Some(0), + (true, false) => Some(1), + (false, true) => Some(-1), + (false, false) => None, + }.map(|delta| delta as TimerDuration * input.delta_time()) } } From 669640e89e21a6052ad83d9630f799ba63b451dc Mon Sep 17 00:00:00 2001 From: Ilya Bogdanov Date: Sat, 24 Feb 2018 14:22:08 +0300 Subject: [PATCH 2/2] Fix mouse wheel in orbit controls --- examples/obj.rs | 2 +- src/controls/orbit.rs | 42 ++++++++++++++++++++---------------------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/examples/obj.rs b/examples/obj.rs index 7979f21..6027d5b 100644 --- a/examples/obj.rs +++ b/examples/obj.rs @@ -8,7 +8,7 @@ fn main() { let obj_path = concat!(env!("CARGO_MANIFEST_DIR"), "/test_data/car.obj"); let path = args.nth(1).unwrap_or(obj_path.into()); let mut win = three::Window::new("Three-rs obj loading example"); - let cam = win.factory.perspective_camera(60.0, 1.0 .. 10.0); + let cam = win.factory.perspective_camera(60.0, 1.0 .. 1000.0); let mut controls = three::controls::Orbit::builder(&cam) .position([0.0, 2.0, -5.0]) .target([0.0, 0.0, 0.0]) diff --git a/src/controls/orbit.rs b/src/controls/orbit.rs index 5996e22..381bcab 100644 --- a/src/controls/orbit.rs +++ b/src/controls/orbit.rs @@ -122,27 +122,25 @@ impl Orbit { &mut self, input: &Input, ) { - if !input.hit(self.button) && input.mouse_wheel().abs() < 1e-6 { - return; - } - - if input.mouse_movements().len() > 0 { - let mouse_delta = input.mouse_delta_ndc(); - let pre = Decomposed { - disp: -self.target.to_vec(), - ..Decomposed::one() - }; - let q_ver = Quaternion::from_angle_y(Rad(self.speed * (mouse_delta.x))); - let axis = self.transform.rot * Vector3::unit_x(); - let q_hor = Quaternion::from_axis_angle(axis, Rad(self.speed * (mouse_delta.y))); - let post = Decomposed { - scale: 1.0 + input.mouse_wheel() / 1000.0, - rot: q_hor * q_ver, - disp: self.target.to_vec(), - }; - self.transform = post.concat(&pre.concat(&self.transform)); - let pf: mint::Vector3 = self.transform.disp.into(); - self.object.set_transform(pf, self.transform.rot, 1.0); - } + let mouse_delta = if input.hit(self.button) { + input.mouse_delta_ndc() + } else { + [0.0, 0.0].into() + }; + let pre = Decomposed { + disp: -self.target.to_vec(), + ..Decomposed::one() + }; + let q_ver = Quaternion::from_angle_y(Rad(self.speed * (mouse_delta.x))); + let axis = self.transform.rot * Vector3::unit_x(); + let q_hor = Quaternion::from_axis_angle(axis, Rad(self.speed * (mouse_delta.y))); + let post = Decomposed { + scale: 1.0 + input.mouse_wheel() / 1000.0, + rot: q_hor * q_ver, + disp: self.target.to_vec(), + }; + self.transform = post.concat(&pre.concat(&self.transform)); + let pf: mint::Vector3 = self.transform.disp.into(); + self.object.set_transform(pf, self.transform.rot, 1.0); } }