ode_base/
lib.rs

1#![doc(html_root_url = "https://docs.rs/ode-base/0.2.1")]
2//! ODE Open Dynamics Engine bindings base for Rust
3//!
4//! # Requirements
5//!
6//! - [ ode ]( https://ode.org/ )
7//!
8//! to build dll
9//!
10//! - premake4 --with-demos --only-double --with-libccd --cc=gcc --platform--x64 --os=windows codeblocks
11//! - premake4 --with-demos --only-double --with-libccd --platform--x64 --os=windows vs2010
12//!
13//! in the running directory
14//!
15//! - ode.dll
16//! - libstdc++-6.dll
17//! - libgcc_s_seh-1.dll
18//! - libwinpthread-1.dll
19//!
20//! see also
21//!
22//! - [ https://crates.io/crates/ode-rs ]( https://crates.io/crates/ode-rs )
23//! - [ https://github.com/nomissbowling/ode-rs ]( https://github.com/nomissbowling/ode-rs )
24//!
25//! # Examples
26//!
27//! - [ https://crates.io/crates/ode-rs-0000 ]( https://crates.io/crates/ode-rs-0000 )
28//! - [ https://github.com/nomissbowling/ode-rs-0000 ]( https://github.com/nomissbowling/ode-rs-0000 )
29//!
30
31pub mod ode;
32
33#[cfg(test)]
34mod tests {
35  use super::ode::{size_type_of, dReal};
36  use super::ode::{dVector3, dVector4, dQuaternion};
37  use super::ode::{dMatrix3, dMatrix4};
38
39  /// with [-- --nocapture] or with [-- --show-output]
40  #[test]
41  fn test_ode_base() {
42    let r: dReal = 0.0;
43    assert_eq!(size_type_of(&r), (8, "f64"));
44    let v3: dVector3 = [1.0, 1.0, 1.0, 0.0];
45    assert_eq!(size_type_of(&v3), (32, "[f64; 4]"));
46    let v4: dVector4 = [1.0, 1.0, 1.0, 1.0];
47    assert_eq!(size_type_of(&v4), (32, "[f64; 4]"));
48    let q: dQuaternion = [1.0, 0.0, 0.0, 0.0];
49    assert_eq!(size_type_of(&q), (32, "[f64; 4]"));
50    let m3: dMatrix3 = [
51      1.0, 0.0, 0.0, 0.0,
52      0.0, 1.0, 0.0, 0.0,
53      0.0, 0.0, 1.0, 0.0];
54    assert_eq!(size_type_of(&m3), (96, "[f64; 12]"));
55    let m4: dMatrix4 = [
56      1.0, 0.0, 0.0, 0.0,
57      0.0, 1.0, 0.0, 0.0,
58      0.0, 0.0, 1.0, 0.0,
59      0.0, 0.0, 0.0, 1.0];
60    assert_eq!(size_type_of(&m4), (128, "[f64; 16]"));
61  }
62
63/*
64  #[test]
65  fn check_quaternion_matrix() {
66    let q = dQuaternion::from_axis_and_angle([1.0, 0.0, 0.0], PIh);
67    let p = dQuaternion::from_axis_and_angle([0.0, 1.0, 0.0], PIh);
68    let o = dQuaternion::from_axis_and_angle([0.0, 0.0, 1.0], PIh);
69    println!("q, p, o");
70    println!("{}", q.as_vec());
71    println!("{}", p.as_vec());
72    println!("{}", o.as_vec());
73    assert!(q.prec_eq(1e-15, [PIq.cos(), PIq.sin(), 0.0, 0.0]));
74    assert!(p.prec_eq(1e-15, [PIq.cos(), 0.0, PIq.sin(), 0.0]));
75    assert!(o.prec_eq(1e-15, [PIq.cos(), 0.0, 0.0, PIq.sin()]));
76
77    let oq = dQuaternion::multiply0(o, q);
78    let po = dQuaternion::multiply0(p, o);
79    let pq = dQuaternion::multiply0(p, q);
80    println!("oq, po, pq");
81    println!("{}", oq.as_vec());
82    println!("{}", po.as_vec());
83    println!("{}", pq.as_vec());
84    assert!(oq.prec_eq(1e-15, [0.5, 0.5, 0.5, 0.5])); // j
85    assert!(po.prec_eq(1e-15, [0.5, 0.5, 0.5, 0.5])); // i
86    assert!(pq.prec_eq(1e-15, [0.5, 0.5, 0.5, -0.5])); // k
87    assert!(oq.prec_eq(1e-15, po));
88
89    let nq = dMatrix4::from_P(q);
90    let np = dMatrix4::from_P(p);
91    let no = dMatrix4::from_P(o);
92    println!("nq, np, no");
93    println!("{}", nq.as_mat());
94    println!("{}", np.as_mat());
95    println!("{}", no.as_mat());
96    assert!(dQuaternion::multiply0_441(nq, o).prec_eq(1e-15, oq));
97    assert!(dQuaternion::multiply0_441(no, p).prec_eq(1e-15, po));
98    assert!(dQuaternion::multiply0_441(nq, p).prec_eq(1e-15, pq));
99
100    let nqno = dMatrix4::multiply0_444(nq, no);
101    let nonp = dMatrix4::multiply0_444(no, np);
102    let nqnp = dMatrix4::multiply0_444(nq, np);
103    println!("nqno, nonp, nqnp");
104    println!("{}", nqno.as_mat());
105    println!("{}", nonp.as_mat());
106    println!("{}", nqnp.as_mat());
107    assert!(nqno.is_quaternion());
108    assert!(nqno.to_Q().prec_eq(1e-15, oq));
109    assert!(nonp.is_quaternion());
110    assert!(nonp.to_Q().prec_eq(1e-15, po));
111    assert!(nqnp.is_quaternion());
112    assert!(nqnp.to_Q().prec_eq(1e-15, pq));
113    assert!(nqno.prec_eq(1e-15, nonp));
114
115    let mq = dMatrix4::from_Q(q);
116    let mp = dMatrix4::from_Q(p);
117    let mo = dMatrix4::from_Q(o);
118    println!("mq, mp, mo");
119    println!("{}", mq.as_mat());
120    println!("{}", mp.as_mat());
121    println!("{}", mo.as_mat());
122    assert!(dQuaternion::multiply0_441(mo, q).prec_eq(1e-15, oq));
123    assert!(dQuaternion::multiply0_441(mp, o).prec_eq(1e-15, po));
124    assert!(dQuaternion::multiply0_441(mp, q).prec_eq(1e-15, pq));
125
126    let momq = dMatrix4::multiply0_444(mo, mq);
127    let mpmo = dMatrix4::multiply0_444(mp, mo);
128    let mpmq = dMatrix4::multiply0_444(mp, mq);
129    println!("momq, mpmo, mpmq");
130    println!("{}", momq.as_mat());
131    println!("{}", mpmo.as_mat());
132    println!("{}", mpmq.as_mat());
133    assert!(momq.is_quaternion());
134    assert!(momq.to_Q().prec_eq(1e-15, oq));
135    assert!(mpmo.is_quaternion());
136    assert!(mpmo.to_Q().prec_eq(1e-15, po));
137    assert!(mpmq.is_quaternion());
138    assert!(mpmq.to_Q().prec_eq(1e-15, pq));
139    assert!(momq.prec_eq(1e-15, mpmo));
140  }
141*/
142}