two finger rotation
This commit is contained in:
52
src/input.rs
52
src/input.rs
@@ -408,22 +408,48 @@ impl InputState {
|
|||||||
let mut positions = self.pressed_touch_positions.iter();
|
let mut positions = self.pressed_touch_positions.iter();
|
||||||
let (id_1, pos_1) = positions.next().unwrap();
|
let (id_1, pos_1) = positions.next().unwrap();
|
||||||
let (id_2, pos_2) = positions.next().unwrap();
|
let (id_2, pos_2) = positions.next().unwrap();
|
||||||
let mut vec_1 = None;
|
let mut touch_loc_1 = vec2(0., 0.);
|
||||||
let mut vec_2 = None;
|
let mut touch_loc_2 = vec2(0., 0.);
|
||||||
for input in &self.touch_inputs {
|
let mut touch_1 = None;
|
||||||
if input.id == *id_1 { vec_1 = Some(input.touch_location - pos_1) }
|
let mut touch_2 = None;
|
||||||
if input.id == *id_2 { vec_2 = Some(input.touch_location - pos_2) }
|
|
||||||
|
fn filtered_vector_sub(a: Vector2<f64>, b: &Vector2<f64>) -> Option<Vector2<f64>> {
|
||||||
|
Some(a - b).filter(|v| v.magnitude() > 0.01)
|
||||||
}
|
}
|
||||||
match (vec_1, vec_2) {
|
|
||||||
|
for input in &self.touch_inputs {
|
||||||
|
if input.id == *id_1 {
|
||||||
|
touch_1 = filtered_vector_sub(input.touch_location, &pos_1);
|
||||||
|
touch_loc_1 = input.touch_location;
|
||||||
|
}
|
||||||
|
if input.id == *id_2 {
|
||||||
|
touch_2 = filtered_vector_sub(input.touch_location, &pos_2);
|
||||||
|
touch_loc_2 = input.touch_location;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let diff = touch_loc_2 - touch_loc_1;
|
||||||
|
let norm_n = vec2(-diff.y, diff.x).normalize();
|
||||||
|
|
||||||
|
match (touch_1, touch_2) {
|
||||||
(Some(v1), Some(v2)) => {
|
(Some(v1), Some(v2)) => {
|
||||||
let movement_length = (v1.magnitude() + v2.magnitude()) / 2.0;
|
let v1_n = v1.normalize();
|
||||||
let opposing = f64::abs(-v1.dot(v2));
|
let v2_n = v2.normalize();
|
||||||
let rotating = 1.0;
|
|
||||||
(movement_length * opposing * rotating) as f32
|
let direction = v1_n.dot(norm_n) - v2_n.dot(norm_n);
|
||||||
|
let rotation = f64::abs(direction);
|
||||||
|
let distance = (v1.magnitude() + v2.magnitude()) / 2.;
|
||||||
|
(rotation * distance * f64::signum(direction)) as f32
|
||||||
},
|
},
|
||||||
(Some(v1), None) => v1.magnitude() as f32,
|
(Some(v1), None) => {
|
||||||
(None, Some(v2)) => v2.magnitude() as f32,
|
let direction = v1.normalize().dot(norm_n);
|
||||||
(None, None) => 0.0
|
(v1.magnitude() * f64::signum(direction)) as f32
|
||||||
|
},
|
||||||
|
(None, Some(v2)) => {
|
||||||
|
let direction = v2.normalize().dot(norm_n);
|
||||||
|
(v2.magnitude() * f64::signum(direction)) as f32
|
||||||
|
},
|
||||||
|
(None, None) => { 0.0 }
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
0.0
|
0.0
|
||||||
|
|||||||
Reference in New Issue
Block a user