1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
ix!();
use crate::{PData,ParamRT,Param};
impl<P: Param + Clone> crate::Morph for ParamRT<P> {
fn morph(&mut self, b: &mut Self, x: f32) -> PData {
let fallback = {
if x > 0.5 {
b.val
} else {
self.val
}
};
match (self.val, b.val, self.control_type(), b.control_type()) {
(PData::Float(f1), PData::Float(f2), t1, t2) => {
if t1 == t2 {
PData::Float((1.0 - x) * f1 + x * f2)
} else {
fallback
}
},
_ => {
fallback
},
}
}
fn morph_alt( &mut self, a: &mut Self, b: &mut Self, x: f32) {
let mut do_fallback: bool = false;
match (
a.val,
b.val,
a.control_type(),
b.control_type()
) {
(PData::Float(f1), PData::Float(f2), t1, t2) => {
if t1 == t2 {
*self = a.clone();
self.val = PData::Float((1.0 - x) * f1 + x * f2);
} else {
do_fallback = true;
}
}
_ => { do_fallback = true; }
}
if do_fallback {
if x > 0.5 {
*self = b.clone();
} else {
*self = a.clone();
}
}
}
}