diff options
Diffstat (limited to 'o3d/samples/o3djs/serialization.js')
-rw-r--r-- | o3d/samples/o3djs/serialization.js | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/o3d/samples/o3djs/serialization.js b/o3d/samples/o3djs/serialization.js index c300023..9a5ed29 100644 --- a/o3d/samples/o3djs/serialization.js +++ b/o3d/samples/o3djs/serialization.js @@ -38,6 +38,7 @@ o3djs.provide('o3djs.serialization'); +o3djs.require('o3djs.math'); o3djs.require('o3djs.error'); o3djs.require('o3djs.texture'); @@ -447,7 +448,10 @@ o3djs.serialization.Deserializer.prototype.deserializeValue = function( for (var i = 0; i != valueAsObject.length; ++i) { valueAsObject[i] = this.deserializeValue(valueAsObject[i]); } - return valueAsObject; + if (o3djs.math.usePluginMath_) { + return valueAsObject; + } + return o3djs.serialization.fixMatrices(valueAsObject); } var refId = valueAsObject['ref']; @@ -746,6 +750,50 @@ o3djs.serialization.deserialize = function(pack, json) { }; /** + * This function looks at a given data type, determines if it is an old style + * matrix that is a 2d doubly nested array. If so, it flattens the matrix in + * place so that it may be handled by the code. + * @param {object} parsed a potential array that will be repaired + */ +o3djs.serialization.fixMatrices = function(parsed) { + function isMatrix(m) { + var len = m && m.length; + if (len && len <= 4) { + for (var i = 0; i < len; ++i) { + var mi = m[i]; + var mlen = mi.length; + if (mlen != len) { + return false; + } + for(var j = 0; j < len; ++j) { + if (Number(mi[j]) == NaN){ + return false; + } + } + } + return true; + } else { + return false; + } + } + + function flatten(m) { + var len = m.length; + var retval = new o3djs.math.makeMatrix4(len * len); + for (var i = 0; i < len; ++i) { + for (var j = 0; j < len; ++j) { + retval[i * len + j] = m[i][j]; + } + } + return retval; + } + if (isMatrix(parsed)) { + return flatten(parsed); + } + return parsed; +}; + +/** * Deserializes a single json object named 'scene.json' from a loaded * o3djs.io.ArchiveInfo. * @param {!o3djs.io.ArchiveInfo} archiveInfo Archive to load from. |