| 109 | public List<Node> n = new ArrayList<>(); |
| 110 | |
| 111 | public Vec3 evaluateFrame(Node left, Node right, double s, Vec3 storage) { |
| 112 | if (storage == null) |
| 113 | storage = new Vec3(); |
| 114 | if (left == null && right == null) |
| 115 | throw new NullPointerException(); |
| 116 | if (left == null) |
| 117 | return storage.set(right.v); |
| 118 | if (right == null) |
| 119 | return storage.set(left.v); |
| 120 | double h0 = 2 * s * s * s - 3 * s * s + 1; |
| 121 | double h1 = -2 * s * s * s + 3 * s * s; |
| 122 | double h2 = s * s * s - 2 * s * s + s; |
| 123 | double h3 = s * s * s - s * s; |
| 124 | |
| 125 | storage.scale(0).fma(left.v, h0).fma(right.v, h1).fma(left.tO, h2).fma(right.tI, h3); |
| 126 | |
| 127 | return storage; |
| 128 | // double v = left.v * h0 + right.v * h1 + left.tO * h2 + |
| 129 | // right.tI * h3; |
| 130 | // return v; |
| 131 | } |
| 132 | |
| 133 | Comparator<Object> finder = new Comparator<Object>() { |
| 134 | @Override |