(sampler, time, path)
| 75 | } |
| 76 | |
| 77 | function sampleSampler(sampler, time, path) { |
| 78 | const input = sampler.input; |
| 79 | const output = sampler.output; |
| 80 | if (!input || !output || input.length === 0) return null; |
| 81 | |
| 82 | const minTime = input[0]; |
| 83 | const maxTime = input[input.length - 1]; |
| 84 | time = Math.max(minTime, Math.min(maxTime, time)); |
| 85 | |
| 86 | let i0 = 0; |
| 87 | for (let i = 0; i < input.length - 1; i++) { |
| 88 | if (time >= input[i] && time <= input[i + 1]) { |
| 89 | i0 = i; |
| 90 | break; |
| 91 | } |
| 92 | if (time < input[i]) break; |
| 93 | i0 = i; |
| 94 | } |
| 95 | const i1 = Math.min(i0 + 1, input.length - 1); |
| 96 | |
| 97 | const t0 = input[i0]; |
| 98 | const t1 = input[i1]; |
| 99 | const t = t1 > t0 ? (time - t0) / (t1 - t0) : 0; |
| 100 | |
| 101 | const componentCount = path === 'rotation' ? 4 : 3; |
| 102 | |
| 103 | if (path === 'rotation') { |
| 104 | const q0 = [output[i0 * 4], output[i0 * 4 + 1], output[i0 * 4 + 2], output[i0 * 4 + 3]]; |
| 105 | const q1 = [output[i1 * 4], output[i1 * 4 + 1], output[i1 * 4 + 2], output[i1 * 4 + 3]]; |
| 106 | return slerpQuaternion(q0, q1, t); |
| 107 | } |
| 108 | |
| 109 | const result = []; |
| 110 | for (let c = 0; c < componentCount; c++) { |
| 111 | const v0 = output[i0 * componentCount + c]; |
| 112 | const v1 = output[i1 * componentCount + c]; |
| 113 | result.push(v0 + (v1 - v0) * t); |
| 114 | } |
| 115 | return result; |
| 116 | } |
| 117 | |
| 118 | function sampleAnimation(clip, time, nodes) { |
| 119 | const nodeTransforms = new Map(); |
no test coverage detected