var lerp = require('gl-vec3/lerp') var recompose = require('mat4-recompose') var decompose = require('mat4-decompose') var determinant = require('gl-mat4/determinant') var slerp = require('quat-slerp') var state0 = state() var state1 = state() var tmp = state() module.exports = interpolate function interpolate(out, start, end, alpha) { if (determinant(start) === 0 || determinant(end) === 0) return false //decompose the start and end matrices into individual components var r0 = decompose(start, state0.translate, state0.scale, state0.skew, state0.perspective, state0.quaternion) var r1 = decompose(end, state1.translate, state1.scale, state1.skew, state1.perspective, state1.quaternion) if (!r0 || !r1) return false //now lerp/slerp the start and end components into a temporary lerp(tmptranslate, state0.translate, state1.translate, alpha) lerp(tmp.translate, state0.translate, state1.translate, alpha) lerp(tmp.skew, state0.skew, state1.skew, alpha) lerp(tmp.scale, state0.scale, state1.scale, alpha) lerp(tmp.perspective, state0.perspective, state1.perspective, alpha) slerp(tmp.quaternion, state0.quaternion, state1.quaternion, alpha) //and recompose into our 'out' matrix recompose(out, tmp.translate, tmp.scale, tmp.skew, tmp.perspective, tmp.quaternion) return true } function state() { return { translate: vec3(), scale: vec3(1), skew: vec3(), perspective: vec4(), quaternion: vec4() } } function vec3(n) { return [n||0,n||0,n||0] } function vec4() { return [0,0,0,1] }