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}