diff options
-rw-r--r-- | o3d/samples/o3d-webgl/curve.js | 2 | ||||
-rw-r--r-- | o3d/samples/o3d-webgl/param_operation.js | 178 | ||||
-rw-r--r-- | o3d/samples/o3d-webgl/skin.js | 6 | ||||
-rw-r--r-- | o3d/samples/o3d-webgl/transform.js | 12 |
4 files changed, 174 insertions, 24 deletions
diff --git a/o3d/samples/o3d-webgl/curve.js b/o3d/samples/o3d-webgl/curve.js index 54c76f5..6425fbb 100644 --- a/o3d/samples/o3d-webgl/curve.js +++ b/o3d/samples/o3d-webgl/curve.js @@ -584,7 +584,7 @@ o3d.Curve.prototype.addBezierKeys = function(values) { "addBezierKeys: expected multiple of 6 values got "+values.size()); return; } - for (var ii = 0; ii < values.length; ii += kNumBezierKeyValues) { + for (var i = 0; i < values.length; i += kNumBezierKeyValues) { var newKey = this.createKey("BezierCurveKey"); newKey.input = values[i]; newKey.output = values[i+1]; diff --git a/o3d/samples/o3d-webgl/param_operation.js b/o3d/samples/o3d-webgl/param_operation.js index f847670..69ecea7 100644 --- a/o3d/samples/o3d-webgl/param_operation.js +++ b/o3d/samples/o3d-webgl/param_operation.js @@ -132,7 +132,7 @@ o3d.ParamMatrix4Output.prototype.__defineSetter__("value", */ o3d.ParamOp2FloatsToFloat2 = function() { o3d.ParamObject.call(this); - this.last_output_value_ = [0,0]; + this.last_output_value_ = [0, 0]; }; o3d.inherit('ParamOp2FloatsToFloat2', 'ParamObject'); @@ -147,7 +147,7 @@ o3d.inherit('ParamOp2FloatsToFloat2', 'ParamObject'); /** * Called by o3d.Param*Output whenever its value gets read. - * @return {!Array<number>} 2-element array equal to [input0,input1] + * @return {!Array.<number>} 2-element array equal to [input0,input1] */ o3d.ParamOp2FloatsToFloat2.prototype.updateOutputs = function() { this.last_output_value_[0] = this.getParam("input0").value; @@ -162,7 +162,7 @@ o3d.ParamOp2FloatsToFloat2.prototype.updateOutputs = function() { */ o3d.ParamOp3FloatsToFloat3 = function() { o3d.ParamObject.call(this); - this.last_output_value_ = [0,0,0]; + this.last_output_value_ = [0, 0, 0]; }; o3d.inherit('ParamOp3FloatsToFloat3', 'ParamObject'); @@ -177,7 +177,7 @@ o3d.inherit('ParamOp3FloatsToFloat3', 'ParamObject'); /** * Called by o3d.Param*Output whenever its value gets read. - * @return {!Array<number>} 3-element array equal to [input0,input1,input2] + * @return {!Array.<number>} 3-element array equal to [input0,input1,input2] */ o3d.ParamOp3FloatsToFloat3.prototype.updateOutputs = function() { this.last_output_value_[0] = this.getParam("input0").value; @@ -193,7 +193,7 @@ o3d.ParamOp3FloatsToFloat3.prototype.updateOutputs = function() { */ o3d.ParamOp4FloatsToFloat4 = function() { o3d.ParamObject.call(this); - this.last_output_value_ = [0,0,0,0]; + this.last_output_value_ = [0, 0, 0, 0]; }; o3d.inherit('ParamOp4FloatsToFloat4', 'ParamObject'); @@ -208,7 +208,7 @@ o3d.inherit('ParamOp4FloatsToFloat4', 'ParamObject'); /** * Called by o3d.Param*Output whenever its value gets read. - * @return {!Array<number>} 4-element array equal to + * @return {!Array.<number>} 4-element array equal to * [input0,input1,input2,input3] */ o3d.ParamOp4FloatsToFloat4.prototype.updateOutputs = function() { @@ -226,7 +226,8 @@ o3d.ParamOp4FloatsToFloat4.prototype.updateOutputs = function() { */ o3d.ParamOp16FloatsToMatrix4 = function() { o3d.ParamObject.call(this); - this.last_output_value_ = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]; + this.last_output_value_ = + [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]; }; o3d.inherit('ParamOp16FloatsToMatrix4', 'ParamObject'); @@ -241,7 +242,7 @@ o3d.inherit('ParamOp16FloatsToMatrix4', 'ParamObject'); /** * Called by o3d.Param*Output whenever its value gets read. - * @return {!Array<!Array<number>>} 4x4 array equal to + * @return {!Array.<!Array.<number>>} 4x4 array equal to * [[i0,i1,i2,i3],[i4,i5,i6,i7],[i8,i9,i10,i11],[i12,i13,i14,i15]] */ o3d.ParamOp16FloatsToMatrix4.prototype.updateOutputs = function() { @@ -281,7 +282,8 @@ o3d.TRSToMatrix4 = function() { this.scaleY = 1; this.scaleZ = 1; - this.last_output_value_ = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]; + this.last_output_value_ = + [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]; }; o3d.inherit('TRSToMatrix4', 'ParamObject'); @@ -298,7 +300,8 @@ o3d.inherit('TRSToMatrix4', 'ParamObject'); /** * Called by o3d.Param*Output whenever its value gets read. - * @return {!Array<!Array<number>>} Matrix4 equal to Translate * Rotate * Scale. + * @return {!Array.<!Array.<number>>} Matrix4 equal to applying the operations + * in the order Translate * Rotate * Scale. */ o3d.TRSToMatrix4.prototype.updateOutputs = function () { var ret = this.last_output_value_; @@ -337,13 +340,15 @@ o3d.TRSToMatrix4.prototype.updateOutputs = function () { }; /** - * A Param operation that takes 16 floats to produce a 4-by-4 matrix. + * A Param operation that takes an input matrix and a local matrix + * to produce an output matrix. * @constructor * @extends {o3d.ParamObject} */ o3d.Matrix4Composition = function() { o3d.ParamObject.call(this); - this.last_output_value_ = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]; + this.last_output_value_ = + [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]; }; o3d.inherit('Matrix4Composition', 'ParamObject'); @@ -358,13 +363,154 @@ o3d.ParamObject.setUpO3DParam_( /** * Called by o3d.Param*Output whenever its value gets read. - * @return {!Array<!Array<number>>} 4x4 array equal to - * [[i0,i1,i2,i3],[i4,i5,i6,i7],[i8,i9,i10,i11],[i12,i13,i14,i15]] + * @return {!Array.<!Array.<number>>} 4x4 array equal to + * inputMatrix * localMatrix */ o3d.Matrix4Composition.prototype.updateOutputs = function() { - o3d.Transform.compose(this.inputMatrix, this.localMatrix, - this.last_output_value_); + var input = this.getParam("inputMatrix").value; + var local = this.getParam("localMatrix").value; + o3d.Transform.compose(input, local, this.last_output_value_); return this.last_output_value_; }; +/** + * A Param operation that takes an input matrix, a float3 axis and an angle + * to produce an output matrix. + * @constructor + * @extends {o3d.ParamObject} + */ +o3d.Matrix4AxisRotation = function() { + o3d.ParamObject.call(this); + this.last_output_value_ = + [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]; +}; +o3d.inherit('Matrix4AxisRotation', 'ParamObject'); + +o3d.ParamObject.setUpO3DParam_( + o3d.Matrix4AxisRotation, "inputMatrix", "ParamMatrix4"); + +o3d.ParamObject.setUpO3DParam_( + o3d.Matrix4AxisRotation, "axis", "ParamFloat3"); + +o3d.ParamObject.setUpO3DParam_( + o3d.Matrix4AxisRotation, "angle", "ParamFloat"); + +o3d.ParamObject.setUpO3DParam_( + o3d.Matrix4AxisRotation, "outputMatrix", "ParamMatrix4Output"); + +/** + * Called by o3d.Param*Output whenever its value gets read. + * @return {!Array.<!Array.<number>>} 4x4 array from rotating inputMatrix around + * axis by angle. + */ +o3d.Matrix4AxisRotation.prototype.updateOutputs = function() { + var input = this.getParam("inputMatrix").value; + var axis = this.getParam("axis").value; + var angle = this.getParam("angle").value; + o3d.Transform.axisRotateMatrix(input, axis, angle, this.last_output_value_); + return this.last_output_value_; +}; + + +/** + * A Param operation that takes an input matrix and a float3 scale + * to produce an output matrix. + * @constructor + * @extends {o3d.ParamObject} + */ +o3d.Matrix4Scale = function() { + o3d.ParamObject.call(this); + this.last_output_value_ = + [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]; +}; +o3d.inherit('Matrix4Scale', 'ParamObject'); + +o3d.ParamObject.setUpO3DParam_( + o3d.Matrix4Scale, "inputMatrix", "ParamMatrix4"); + +o3d.ParamObject.setUpO3DParam_( + o3d.Matrix4Scale, "scale", "ParamFloat3"); + +o3d.ParamObject.setUpO3DParam_( + o3d.Matrix4Scale, "outputMatrix", "ParamMatrix4Output"); + +/** + * Called by o3d.Param*Output whenever its value gets read. + * @return {!Array.<!Array.<number>>} 4x4 array from scaling inputMatrix by + * scale. + */ +o3d.Matrix4Scale.prototype.updateOutputs = function() { + var m = this.getParam("inputMatrix").value; + var ret = this.last_output_value_; + var v = this.getParam("scale").value; + + var v0 = v[0]; + var v1 = v[1]; + var v2 = v[2]; + + var m0 = m[0]; + var m1 = m[1]; + var m2 = m[2]; + var m3 = m[3]; + + ret[0].splice(0, 4, v0 * m0[0], v0 * m0[1], v0 * m0[2], v0 * m0[3]); + ret[1].splice(0, 4, v1 * m1[0], v1 * m1[1], v1 * m1[2], v1 * m1[3]); + ret[2].splice(0, 4, v2 * m2[0], v2 * m2[1], v2 * m2[2], v2 * m2[3]); + ret[3] = m3.slice(0); + return ret; +}; + + +/** + * A Param operation that takes an input matrix, and a translation + * to produce an output matrix. + * @constructor + * @extends {o3d.ParamObject} + */ +o3d.Matrix4Translation = function() { + o3d.ParamObject.call(this); + this.last_output_value_ = + [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]; +}; +o3d.inherit('Matrix4Translation', 'ParamObject'); + +o3d.ParamObject.setUpO3DParam_( + o3d.Matrix4Translation, "inputMatrix", "ParamMatrix4"); + +o3d.ParamObject.setUpO3DParam_( + o3d.Matrix4Translation, "translation", "ParamFloat3"); + +o3d.ParamObject.setUpO3DParam_( + o3d.Matrix4Translation, "outputMatrix", "ParamMatrix4Output"); + +/** + * Called by o3d.Param*Output whenever its value gets read. + * @return {!Array.<!Array.<number>>} 4x4 array from translating inputMatrix + * by translation. + */ +o3d.Matrix4Translation.prototype.updateOutputs = function() { + var m = this.getParam("inputMatrix").value; + var ret = this.last_output_value_; + var v = this.getParam("translation").value; + + var v0 = v[0]; + var v1 = v[1]; + var v2 = v[2]; + + var m0 = m[0]; + var m1 = m[1]; + var m2 = m[2]; + var m3 = m[3]; + + ret[0] = m0.slice(0); + ret[1] = m1.slice(0); + ret[2] = m2.slice(0); + ret[3].splice(0, 4, m0[0] * v0 + m1[0] * v1 + m2[0] * v2 + m3[0], + m0[1] * v0 + m1[1] * v1 + m2[1] * v2 + m3[1], + m0[2] * v0 + m1[2] * v1 + m2[2] * v2 + m3[2], + m0[3] * v0 + m1[3] * v1 + m2[3] * v2 + m3[3]); + return ret; +}; + + diff --git a/o3d/samples/o3d-webgl/skin.js b/o3d/samples/o3d-webgl/skin.js index ae88933..ea16430 100644 --- a/o3d/samples/o3d-webgl/skin.js +++ b/o3d/samples/o3d-webgl/skin.js @@ -211,14 +211,14 @@ o3d.SkinEval = function() { * The base matrix to subtract from the matrices before skinning. * @type {!Array<!Array<number>>} */ - this.base = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]; + this.base = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]; /** * Temporary storage for matrix ops. * @type {!Array<!Array<number>>} * @private */ - this.temp_matrix_ = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]; + this.temp_matrix_ = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]; /** * Array of matrices representing each bone. @@ -487,7 +487,7 @@ o3d.SkinEval.prototype.updateBones_ = function() { + " is not a ParamMatrix4"); return; } - this.bones_[ii] = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]; + this.bones_[ii] = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]; o3d.Transform.compose(param.value, inverse_bind_pose_array[ii], this.bones_[ii]); o3d.Transform.compose(inverse_base, this.bones_[ii], this.bones_[ii]); diff --git a/o3d/samples/o3d-webgl/transform.js b/o3d/samples/o3d-webgl/transform.js index a569dc2..331654f 100644 --- a/o3d/samples/o3d-webgl/transform.js +++ b/o3d/samples/o3d-webgl/transform.js @@ -832,8 +832,12 @@ o3d.Transform.prototype.rotateZYX = */ o3d.Transform.prototype.axisRotate = function(axis, angle) { - var m = this.localMatrix; + o3d.Transform.axisRotateMatrix(this.localMatrix, axis, angle); +}; +o3d.Transform.axisRotateMatrix = + function(m, axis, angle, opt_target) { + opt_target = opt_target || m; var x = axis[0]; var y = axis[1]; var z = axis[2]; @@ -880,19 +884,19 @@ o3d.Transform.prototype.axisRotate = var m32 = m3[2]; var m33 = m3[3]; - m0.splice(0, 4, + opt_target[0].splice(0, 4, r00 * m00 + r01 * m10 + r02 * m20, r00 * m01 + r01 * m11 + r02 * m21, r00 * m02 + r01 * m12 + r02 * m22, r00 * m03 + r01 * m13 + r02 * m23); - m1.splice(0, 4, + opt_target[1].splice(0, 4, r10 * m00 + r11 * m10 + r12 * m20, r10 * m01 + r11 * m11 + r12 * m21, r10 * m02 + r11 * m12 + r12 * m22, r10 * m03 + r11 * m13 + r12 * m23); - m2.splice(0, 4, + opt_target[2].splice(0, 4, r20 * m00 + r21 * m10 + r22 * m20, r20 * m01 + r21 * m11 + r22 * m21, r20 * m02 + r21 * m12 + r22 * m22, |