|
|
|
@ -286,34 +286,6 @@ struct State {
|
|
|
|
|
instance_buffer: wgpu::Buffer,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn quat_mul(q: cgmath::Quaternion<f32>, r: cgmath::Quaternion<f32>) -> cgmath::Quaternion<f32> {
|
|
|
|
|
// This block uses quaternions of the form of
|
|
|
|
|
|
|
|
|
|
// q=q0+iq1+jq2+kq3
|
|
|
|
|
|
|
|
|
|
// and
|
|
|
|
|
|
|
|
|
|
// r=r0+ir1+jr2+kr3.
|
|
|
|
|
|
|
|
|
|
// The quaternion product has the form of
|
|
|
|
|
|
|
|
|
|
// t=q×r=t0+it1+jt2+kt3,
|
|
|
|
|
|
|
|
|
|
// where
|
|
|
|
|
|
|
|
|
|
// t0=(r0 q0 − r1 q1 − r2 q2 − r3 q3)
|
|
|
|
|
// t1=(r0 q1 + r1 q0 − r2 q3 + r3 q2)
|
|
|
|
|
// t2=(r0 q2 + r1 q3 + r2 q0 − r3 q1)
|
|
|
|
|
// t3=(r0 q3 − r1 q2 + r2 q1 + r3 q0
|
|
|
|
|
|
|
|
|
|
let w = r.s * q.s - r.v.x * q.v.x - r.v.y * q.v.y - r.v.z * q.v.z;
|
|
|
|
|
let xi = r.s * q.v.x + r.v.x * q.s - r.v.y * q.v.z + r.v.z * q.v.y;
|
|
|
|
|
let yj = r.s * q.v.y + r.v.x * q.v.z + r.v.y * q.s - r.v.z * q.v.x;
|
|
|
|
|
let zk = r.s * q.v.z - r.v.x * q.v.y + r.v.y * q.v.x + r.v.z * q.s;
|
|
|
|
|
|
|
|
|
|
cgmath::Quaternion::new(w, xi, yj, zk)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl State {
|
|
|
|
|
async fn new(window: &Window) -> Self {
|
|
|
|
|
let size = window.inner_size();
|
|
|
|
@ -592,7 +564,7 @@ impl State {
|
|
|
|
|
for instance in &mut self.instances {
|
|
|
|
|
let amount = cgmath::Quaternion::from_angle_y(cgmath::Rad(ROTATION_SPEED));
|
|
|
|
|
let current = instance.rotation;
|
|
|
|
|
instance.rotation = quat_mul(amount, current);
|
|
|
|
|
instance.rotation = amount * current;
|
|
|
|
|
}
|
|
|
|
|
let instance_data = self
|
|
|
|
|
.instances
|
|
|
|
|