Index: tools/cc-frame-viewer/third_party/gl-matrix/src/gl-matrix/quat.js |
diff --git a/tools/cc-frame-viewer/third_party/gl-matrix/src/gl-matrix/quat.js b/tools/cc-frame-viewer/third_party/gl-matrix/src/gl-matrix/quat.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c2290d3f1af7b2294732a2d762aee47c5c151e7a |
--- /dev/null |
+++ b/tools/cc-frame-viewer/third_party/gl-matrix/src/gl-matrix/quat.js |
@@ -0,0 +1,457 @@ |
+/* Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved. |
+ |
+Redistribution and use in source and binary forms, with or without modification, |
+are permitted provided that the following conditions are met: |
+ |
+ * Redistributions of source code must retain the above copyright notice, this |
+ list of conditions and the following disclaimer. |
+ * Redistributions in binary form must reproduce the above copyright notice, |
+ this list of conditions and the following disclaimer in the documentation |
+ and/or other materials provided with the distribution. |
+ |
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR |
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ |
+ |
+/** |
+ * @class Quaternion |
+ * @name quat |
+ */ |
+var quat = {}; |
+ |
+/** |
+ * Creates a new identity quat |
+ * |
+ * @returns {quat} a new quaternion |
+ */ |
+quat.create = function() { |
+ var out = new GLMAT_ARRAY_TYPE(4); |
+ out[0] = 0; |
+ out[1] = 0; |
+ out[2] = 0; |
+ out[3] = 1; |
+ return out; |
+}; |
+ |
+/** |
+ * Creates a new quat initialized with values from an existing quaternion |
+ * |
+ * @param {quat} a quaternion to clone |
+ * @returns {quat} a new quaternion |
+ * @function |
+ */ |
+quat.clone = vec4.clone; |
+ |
+/** |
+ * Creates a new quat initialized with the given values |
+ * |
+ * @param {Number} x X component |
+ * @param {Number} y Y component |
+ * @param {Number} z Z component |
+ * @param {Number} w W component |
+ * @returns {quat} a new quaternion |
+ * @function |
+ */ |
+quat.fromValues = vec4.fromValues; |
+ |
+/** |
+ * Copy the values from one quat to another |
+ * |
+ * @param {quat} out the receiving quaternion |
+ * @param {quat} a the source quaternion |
+ * @returns {quat} out |
+ * @function |
+ */ |
+quat.copy = vec4.copy; |
+ |
+/** |
+ * Set the components of a quat to the given values |
+ * |
+ * @param {quat} out the receiving quaternion |
+ * @param {Number} x X component |
+ * @param {Number} y Y component |
+ * @param {Number} z Z component |
+ * @param {Number} w W component |
+ * @returns {quat} out |
+ * @function |
+ */ |
+quat.set = vec4.set; |
+ |
+/** |
+ * Set a quat to the identity quaternion |
+ * |
+ * @param {quat} out the receiving quaternion |
+ * @returns {quat} out |
+ */ |
+quat.identity = function(out) { |
+ out[0] = 0; |
+ out[1] = 0; |
+ out[2] = 0; |
+ out[3] = 1; |
+ return out; |
+}; |
+ |
+/** |
+ * Sets a quat from the given angle and rotation axis, |
+ * then returns it. |
+ * |
+ * @param {quat} out the receiving quaternion |
+ * @param {vec3} axis the axis around which to rotate |
+ * @param {Number} rad the angle in radians |
+ * @returns {quat} out |
+ **/ |
+quat.setAxisAngle = function(out, axis, rad) { |
+ rad = rad * 0.5; |
+ var s = Math.sin(rad); |
+ out[0] = s * axis[0]; |
+ out[1] = s * axis[1]; |
+ out[2] = s * axis[2]; |
+ out[3] = Math.cos(rad); |
+ return out; |
+}; |
+ |
+/** |
+ * Adds two quat's |
+ * |
+ * @param {quat} out the receiving quaternion |
+ * @param {quat} a the first operand |
+ * @param {quat} b the second operand |
+ * @returns {quat} out |
+ * @function |
+ */ |
+quat.add = vec4.add; |
+ |
+/** |
+ * Multiplies two quat's |
+ * |
+ * @param {quat} out the receiving quaternion |
+ * @param {quat} a the first operand |
+ * @param {quat} b the second operand |
+ * @returns {quat} out |
+ */ |
+quat.multiply = function(out, a, b) { |
+ var ax = a[0], ay = a[1], az = a[2], aw = a[3], |
+ bx = b[0], by = b[1], bz = b[2], bw = b[3]; |
+ |
+ out[0] = ax * bw + aw * bx + ay * bz - az * by; |
+ out[1] = ay * bw + aw * by + az * bx - ax * bz; |
+ out[2] = az * bw + aw * bz + ax * by - ay * bx; |
+ out[3] = aw * bw - ax * bx - ay * by - az * bz; |
+ return out; |
+}; |
+ |
+/** |
+ * Alias for {@link quat.multiply} |
+ * @function |
+ */ |
+quat.mul = quat.multiply; |
+ |
+/** |
+ * Scales a quat by a scalar number |
+ * |
+ * @param {quat} out the receiving vector |
+ * @param {quat} a the vector to scale |
+ * @param {Number} b amount to scale the vector by |
+ * @returns {quat} out |
+ * @function |
+ */ |
+quat.scale = vec4.scale; |
+ |
+/** |
+ * Rotates a quaternion by the given angle around the X axis |
+ * |
+ * @param {quat} out quat receiving operation result |
+ * @param {quat} a quat to rotate |
+ * @param {number} rad angle (in radians) to rotate |
+ * @returns {quat} out |
+ */ |
+quat.rotateX = function (out, a, rad) { |
+ rad *= 0.5; |
+ |
+ var ax = a[0], ay = a[1], az = a[2], aw = a[3], |
+ bx = Math.sin(rad), bw = Math.cos(rad); |
+ |
+ out[0] = ax * bw + aw * bx; |
+ out[1] = ay * bw + az * bx; |
+ out[2] = az * bw - ay * bx; |
+ out[3] = aw * bw - ax * bx; |
+ return out; |
+}; |
+ |
+/** |
+ * Rotates a quaternion by the given angle around the Y axis |
+ * |
+ * @param {quat} out quat receiving operation result |
+ * @param {quat} a quat to rotate |
+ * @param {number} rad angle (in radians) to rotate |
+ * @returns {quat} out |
+ */ |
+quat.rotateY = function (out, a, rad) { |
+ rad *= 0.5; |
+ |
+ var ax = a[0], ay = a[1], az = a[2], aw = a[3], |
+ by = Math.sin(rad), bw = Math.cos(rad); |
+ |
+ out[0] = ax * bw - az * by; |
+ out[1] = ay * bw + aw * by; |
+ out[2] = az * bw + ax * by; |
+ out[3] = aw * bw - ay * by; |
+ return out; |
+}; |
+ |
+/** |
+ * Rotates a quaternion by the given angle around the Z axis |
+ * |
+ * @param {quat} out quat receiving operation result |
+ * @param {quat} a quat to rotate |
+ * @param {number} rad angle (in radians) to rotate |
+ * @returns {quat} out |
+ */ |
+quat.rotateZ = function (out, a, rad) { |
+ rad *= 0.5; |
+ |
+ var ax = a[0], ay = a[1], az = a[2], aw = a[3], |
+ bz = Math.sin(rad), bw = Math.cos(rad); |
+ |
+ out[0] = ax * bw + ay * bz; |
+ out[1] = ay * bw - ax * bz; |
+ out[2] = az * bw + aw * bz; |
+ out[3] = aw * bw - az * bz; |
+ return out; |
+}; |
+ |
+/** |
+ * Calculates the W component of a quat from the X, Y, and Z components. |
+ * Assumes that quaternion is 1 unit in length. |
+ * Any existing W component will be ignored. |
+ * |
+ * @param {quat} out the receiving quaternion |
+ * @param {quat} a quat to calculate W component of |
+ * @returns {quat} out |
+ */ |
+quat.calculateW = function (out, a) { |
+ var x = a[0], y = a[1], z = a[2]; |
+ |
+ out[0] = x; |
+ out[1] = y; |
+ out[2] = z; |
+ out[3] = -Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z)); |
+ return out; |
+}; |
+ |
+/** |
+ * Calculates the dot product of two quat's |
+ * |
+ * @param {quat} a the first operand |
+ * @param {quat} b the second operand |
+ * @returns {Number} dot product of a and b |
+ * @function |
+ */ |
+quat.dot = vec4.dot; |
+ |
+/** |
+ * Performs a linear interpolation between two quat's |
+ * |
+ * @param {quat} out the receiving quaternion |
+ * @param {quat} a the first operand |
+ * @param {quat} b the second operand |
+ * @param {Number} t interpolation amount between the two inputs |
+ * @returns {quat} out |
+ * @function |
+ */ |
+quat.lerp = vec4.lerp; |
+ |
+/** |
+ * Performs a spherical linear interpolation between two quat |
+ * |
+ * @param {quat} out the receiving quaternion |
+ * @param {quat} a the first operand |
+ * @param {quat} b the second operand |
+ * @param {Number} t interpolation amount between the two inputs |
+ * @returns {quat} out |
+ */ |
+quat.slerp = function (out, a, b, t) { |
+ var ax = a[0], ay = a[1], az = a[2], aw = a[3], |
+ bx = b[0], by = b[1], bz = b[2], bw = b[3]; |
+ |
+ var cosHalfTheta = ax * bx + ay * by + az * bz + aw * bw, |
+ halfTheta, |
+ sinHalfTheta, |
+ ratioA, |
+ ratioB; |
+ |
+ if (Math.abs(cosHalfTheta) >= 1.0) { |
+ if (out !== a) { |
+ out[0] = ax; |
+ out[1] = ay; |
+ out[2] = az; |
+ out[3] = aw; |
+ } |
+ return out; |
+ } |
+ |
+ halfTheta = Math.acos(cosHalfTheta); |
+ sinHalfTheta = Math.sqrt(1.0 - cosHalfTheta * cosHalfTheta); |
+ |
+ if (Math.abs(sinHalfTheta) < 0.001) { |
+ out[0] = (ax * 0.5 + bx * 0.5); |
+ out[1] = (ay * 0.5 + by * 0.5); |
+ out[2] = (az * 0.5 + bz * 0.5); |
+ out[3] = (aw * 0.5 + bw * 0.5); |
+ return out; |
+ } |
+ |
+ ratioA = Math.sin((1 - t) * halfTheta) / sinHalfTheta; |
+ ratioB = Math.sin(t * halfTheta) / sinHalfTheta; |
+ |
+ out[0] = (ax * ratioA + bx * ratioB); |
+ out[1] = (ay * ratioA + by * ratioB); |
+ out[2] = (az * ratioA + bz * ratioB); |
+ out[3] = (aw * ratioA + bw * ratioB); |
+ |
+ return out; |
+}; |
+ |
+/** |
+ * Calculates the inverse of a quat |
+ * |
+ * @param {quat} out the receiving quaternion |
+ * @param {quat} a quat to calculate inverse of |
+ * @returns {quat} out |
+ */ |
+quat.invert = function(out, a) { |
+ var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], |
+ dot = a0*a0 + a1*a1 + a2*a2 + a3*a3, |
+ invDot = dot ? 1.0/dot : 0; |
+ |
+ // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0 |
+ |
+ out[0] = -a0*invDot; |
+ out[1] = -a1*invDot; |
+ out[2] = -a2*invDot; |
+ out[3] = a3*invDot; |
+ return out; |
+}; |
+ |
+/** |
+ * Calculates the conjugate of a quat |
+ * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result. |
+ * |
+ * @param {quat} out the receiving quaternion |
+ * @param {quat} a quat to calculate conjugate of |
+ * @returns {quat} out |
+ */ |
+quat.conjugate = function (out, a) { |
+ out[0] = -a[0]; |
+ out[1] = -a[1]; |
+ out[2] = -a[2]; |
+ out[3] = a[3]; |
+ return out; |
+}; |
+ |
+/** |
+ * Calculates the length of a quat |
+ * |
+ * @param {quat} a vector to calculate length of |
+ * @returns {Number} length of a |
+ * @function |
+ */ |
+quat.length = vec4.length; |
+ |
+/** |
+ * Alias for {@link quat.length} |
+ * @function |
+ */ |
+quat.len = quat.length; |
+ |
+/** |
+ * Calculates the squared length of a quat |
+ * |
+ * @param {quat} a vector to calculate squared length of |
+ * @returns {Number} squared length of a |
+ * @function |
+ */ |
+quat.squaredLength = vec4.squaredLength; |
+ |
+/** |
+ * Alias for {@link quat.squaredLength} |
+ * @function |
+ */ |
+quat.sqrLen = quat.squaredLength; |
+ |
+/** |
+ * Normalize a quat |
+ * |
+ * @param {quat} out the receiving quaternion |
+ * @param {quat} a quaternion to normalize |
+ * @returns {quat} out |
+ * @function |
+ */ |
+quat.normalize = vec4.normalize; |
+ |
+/** |
+ * Creates a quaternion from the given 3x3 rotation matrix. |
+ * |
+ * @param {quat} out the receiving quaternion |
+ * @param {mat3} m rotation matrix |
+ * @returns {quat} out |
+ * @function |
+ */ |
+quat.fromMat3 = (function() { |
+ var s_iNext = [1,2,0]; |
+ return function(out, m) { |
+ // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes |
+ // article "Quaternion Calculus and Fast Animation". |
+ var fTrace = m[0] + m[4] + m[8]; |
+ var fRoot; |
+ |
+ if ( fTrace > 0.0 ) { |
+ // |w| > 1/2, may as well choose w > 1/2 |
+ fRoot = Math.sqrt(fTrace + 1.0); // 2w |
+ out[3] = 0.5 * fRoot; |
+ fRoot = 0.5/fRoot; // 1/(4w) |
+ out[0] = (m[7]-m[5])*fRoot; |
+ out[1] = (m[2]-m[6])*fRoot; |
+ out[2] = (m[3]-m[1])*fRoot; |
+ } else { |
+ // |w| <= 1/2 |
+ var i = 0; |
+ if ( m[4] > m[0] ) |
+ i = 1; |
+ if ( m[8] > m[i*3+i] ) |
+ i = 2; |
+ var j = s_iNext[i]; |
+ var k = s_iNext[j]; |
+ |
+ fRoot = Math.sqrt(m[i*3+i]-m[j*3+j]-m[k*3+k] + 1.0); |
+ out[i] = 0.5 * fRoot; |
+ fRoot = 0.5 / fRoot; |
+ out[3] = (m[k*3+j] - m[j*3+k]) * fRoot; |
+ out[j] = (m[j*3+i] + m[i*3+j]) * fRoot; |
+ out[k] = (m[k*3+i] + m[i*3+k]) * fRoot; |
+ } |
+ |
+ return out; |
+ }; |
+})(); |
+ |
+/** |
+ * Returns a string representation of a quatenion |
+ * |
+ * @param {quat} vec vector to represent as a string |
+ * @returns {String} string representation of the vector |
+ */ |
+quat.str = function (a) { |
+ return 'quat(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')'; |
+}; |
+ |
+if(typeof(exports) !== 'undefined') { |
+ exports.quat = quat; |
+} |