|
@@ -131,16 +131,16 @@ THREE.ColladaLoader = function () {
|
|
|
|
|
|
parseAsset();
|
|
|
setUpConversion();
|
|
|
- images = parseLib( "//dae:library_images/dae:image", _Image, "image" );
|
|
|
- materials = parseLib( "//dae:library_materials/dae:material", Material, "material" );
|
|
|
- effects = parseLib( "//dae:library_effects/dae:effect", Effect, "effect" );
|
|
|
- geometries = parseLib( "//dae:library_geometries/dae:geometry", Geometry, "geometry" );
|
|
|
- cameras = parseLib( ".//dae:library_cameras/dae:camera", Camera, "camera" );
|
|
|
- lights = parseLib( ".//dae:library_lights/dae:light", Light, "light" );
|
|
|
- controllers = parseLib( "//dae:library_controllers/dae:controller", Controller, "controller" );
|
|
|
- animations = parseLib( "//dae:library_animations/dae:animation", Animation, "animation" );
|
|
|
- visualScenes = parseLib( ".//dae:library_visual_scenes/dae:visual_scene", VisualScene, "visual_scene" );
|
|
|
-
|
|
|
+ images = parseLib( "library_images image", _Image, "image" );
|
|
|
+ materials = parseLib( "library_materials material", Material, "material" );
|
|
|
+ effects = parseLib( "library_effects effect", Effect, "effect" );
|
|
|
+ geometries = parseLib( "library_geometries geometry", Geometry, "geometry" );
|
|
|
+ cameras = parseLib( "library_cameras camera", Camera, "camera" );
|
|
|
+ lights = parseLib( "library_lights light", Light, "light" );
|
|
|
+ controllers = parseLib( "library_controllers controller", Controller, "controller" );
|
|
|
+ animations = parseLib( "library_animations animation", Animation, "animation" );
|
|
|
+ visualScenes = parseLib( "library_visual_scenes visual_scene", VisualScene, "visual_scene" );
|
|
|
+
|
|
|
morphs = [];
|
|
|
skins = [];
|
|
|
|
|
@@ -197,15 +197,16 @@ THREE.ColladaLoader = function () {
|
|
|
|
|
|
function parseAsset () {
|
|
|
|
|
|
- var elements = COLLADA.evaluate( '//dae:asset', COLLADA, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
|
|
|
-
|
|
|
- var element = elements.iterateNext();
|
|
|
-
|
|
|
- if ( element && element.childNodes ) {
|
|
|
+ var elements = COLLADA.querySelectorAll('asset');
|
|
|
+
|
|
|
+ var elementsLength = elements.length; //cache loop length
|
|
|
+ for (var i = 0; i < elementsLength; i ++){
|
|
|
+ var element = elements[i];
|
|
|
+
|
|
|
+ var elementChildNodesLength = element.childNodes.length;
|
|
|
+ for ( var j = 0; j < elementChildNodesLength; j ++ ) {
|
|
|
|
|
|
- for ( var i = 0; i < element.childNodes.length; i ++ ) {
|
|
|
-
|
|
|
- var child = element.childNodes[ i ];
|
|
|
+ var child = element.childNodes[ j ];
|
|
|
|
|
|
switch ( child.nodeName ) {
|
|
|
|
|
@@ -236,20 +237,20 @@ THREE.ColladaLoader = function () {
|
|
|
|
|
|
function parseLib ( q, classSpec, prefix ) {
|
|
|
|
|
|
- var elements = COLLADA.evaluate(q, COLLADA, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null) ;
|
|
|
+ var elements = COLLADA.querySelectorAll(q);
|
|
|
+
|
|
|
+ var lib = {};
|
|
|
|
|
|
- var lib = {};
|
|
|
- var element = elements.iterateNext();
|
|
|
var i = 0;
|
|
|
|
|
|
- while ( element ) {
|
|
|
+ var elementsLength = elements.length;
|
|
|
+ for (var j = 0; j < elementsLength; j++){
|
|
|
+ var element = elements[j];
|
|
|
|
|
|
- var daeElement = ( new classSpec() ).parse( element );
|
|
|
+ var daeElement = ( new classSpec() ).parse( element );
|
|
|
if ( !daeElement.id || daeElement.id.length == 0 ) daeElement.id = prefix + ( i ++ );
|
|
|
lib[ daeElement.id ] = daeElement;
|
|
|
|
|
|
- element = elements.iterateNext();
|
|
|
-
|
|
|
}
|
|
|
|
|
|
return lib;
|
|
@@ -257,9 +258,9 @@ THREE.ColladaLoader = function () {
|
|
|
};
|
|
|
|
|
|
function parseScene() {
|
|
|
-
|
|
|
- var sceneElement = COLLADA.evaluate( './/dae:scene/dae:instance_visual_scene', COLLADA, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ).iterateNext();
|
|
|
-
|
|
|
+
|
|
|
+ var sceneElement = COLLADA.querySelectorAll('scene instance_visual_scene')[0];
|
|
|
+
|
|
|
if ( sceneElement ) {
|
|
|
|
|
|
var url = sceneElement.getAttribute( 'url' ).replace( /^#/, '' );
|
|
@@ -494,15 +495,15 @@ THREE.ColladaLoader = function () {
|
|
|
function setupSkinningMatrices ( bones, skin ) {
|
|
|
|
|
|
// FIXME: this is dumb...
|
|
|
-
|
|
|
- for ( var i = 0; i < bones.length; i ++ ) {
|
|
|
-
|
|
|
+
|
|
|
+ for ( var i = 0; i < bones.length ; i ++ ) {
|
|
|
+
|
|
|
var bone = bones[ i ];
|
|
|
var found = -1;
|
|
|
|
|
|
if ( bone.type != 'JOINT' ) continue;
|
|
|
|
|
|
- for ( var j = 0; j < skin.joints.length; j ++ ) {
|
|
|
+ for ( var j = 0; j < skin.joints.length ; j ++ ) {
|
|
|
|
|
|
if ( bone.sid == skin.joints[ j ] ) {
|
|
|
|
|
@@ -523,8 +524,8 @@ THREE.ColladaLoader = function () {
|
|
|
|
|
|
bone.weights = [];
|
|
|
|
|
|
- for ( var j = 0; j < skin.weights.length; j ++ ) {
|
|
|
-
|
|
|
+ for ( var j = 0; j < skin.weights.length ; j ++ ) {
|
|
|
+
|
|
|
for (var k = 0; k < skin.weights[ j ].length; k ++) {
|
|
|
|
|
|
var w = skin.weights[ j ][ k ];
|
|
@@ -926,8 +927,8 @@ THREE.ColladaLoader = function () {
|
|
|
};
|
|
|
|
|
|
function getLibraryNode( id ) {
|
|
|
-
|
|
|
- return COLLADA.evaluate( './/dae:library_nodes//dae:node[@id=\'' + id + '\']', COLLADA, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null ).iterateNext();
|
|
|
+
|
|
|
+ return COLLADA.querySelectorAll('library_nodes node#'+id)[0]; //returns 'undefined' if nothing is matched
|
|
|
|
|
|
};
|
|
|
|
|
@@ -2203,21 +2204,17 @@ THREE.ColladaLoader = function () {
|
|
|
break;
|
|
|
|
|
|
case 'bind_material':
|
|
|
+
|
|
|
+ var instances = child.querySelectorAll('instance_material');
|
|
|
+
|
|
|
+ for (var j = 0; j < instances.length; j ++){
|
|
|
|
|
|
- var instances = COLLADA.evaluate( './/dae:instance_material', child, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
|
|
|
-
|
|
|
- if ( instances ) {
|
|
|
-
|
|
|
- var instance = instances.iterateNext();
|
|
|
-
|
|
|
- while ( instance ) {
|
|
|
+ var instance = instances[j];
|
|
|
|
|
|
- this.instance_material.push( (new InstanceMaterial()).parse(instance) );
|
|
|
- instance = instances.iterateNext();
|
|
|
+ this.instance_material.push( (new InstanceMaterial()).parse(instance) );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
|
|
|
break;
|
|
|
|
|
@@ -2268,19 +2265,11 @@ THREE.ColladaLoader = function () {
|
|
|
|
|
|
if ( child.nodeName == 'bind_material' ) {
|
|
|
|
|
|
- var instances = COLLADA.evaluate( './/dae:instance_material', child, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
|
|
|
-
|
|
|
- if ( instances ) {
|
|
|
-
|
|
|
- var instance = instances.iterateNext();
|
|
|
-
|
|
|
- while ( instance ) {
|
|
|
-
|
|
|
- this.instance_material.push( (new InstanceMaterial()).parse(instance) );
|
|
|
- instance = instances.iterateNext();
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
+ var instances = child.querySelectorAll('instance_material');
|
|
|
+
|
|
|
+ for (var j = 0; j < instances.length; j++){
|
|
|
+ var instance = instances[j];
|
|
|
+ this.instance_material.push( (new InstanceMaterial()).parse(instance) );
|
|
|
}
|
|
|
|
|
|
break;
|
|
@@ -2425,8 +2414,8 @@ THREE.ColladaLoader = function () {
|
|
|
var source, numParams;
|
|
|
var vcIndex = 0, vcount = 3, maxOffset = 0;
|
|
|
var texture_sets = [];
|
|
|
-
|
|
|
- for ( j = 0; j < inputs.length; j ++ ) {
|
|
|
+
|
|
|
+ for ( j = 0; j < inputs.length ; j ++ ) {
|
|
|
|
|
|
input = inputs[ j ];
|
|
|
var offset = input.offset + 1;
|
|
@@ -3150,7 +3139,7 @@ THREE.ColladaLoader = function () {
|
|
|
case 'index_of_refraction':
|
|
|
case 'transparency':
|
|
|
|
|
|
- var f = evaluateXPath( child, './/dae:float' );
|
|
|
+ var f = child.querySelectorAll('float');
|
|
|
|
|
|
if ( f.length > 0 )
|
|
|
this[ child.nodeName ] = parseFloat( f[ 0 ].textContent );
|
|
@@ -4414,34 +4403,14 @@ THREE.ColladaLoader = function () {
|
|
|
|
|
|
};
|
|
|
|
|
|
- function evaluateXPath( node, query ) {
|
|
|
-
|
|
|
- var instances = COLLADA.evaluate( query, node, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
|
|
|
-
|
|
|
- var inst = instances.iterateNext();
|
|
|
- var result = [];
|
|
|
-
|
|
|
- while ( inst ) {
|
|
|
-
|
|
|
- result.push( inst );
|
|
|
- inst = instances.iterateNext();
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- return result;
|
|
|
-
|
|
|
- };
|
|
|
-
|
|
|
function extractDoubleSided( obj, element ) {
|
|
|
|
|
|
obj.doubleSided = false;
|
|
|
|
|
|
- var node = COLLADA.evaluate( './/dae:extra//dae:double_sided', element, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
|
|
|
-
|
|
|
+ var node = element.querySelectorAll('extra double_sided')[0];
|
|
|
+
|
|
|
if ( node ) {
|
|
|
|
|
|
- node = node.iterateNext();
|
|
|
-
|
|
|
if ( node && parseInt( node.textContent, 10 ) === 1 ) {
|
|
|
|
|
|
obj.doubleSided = true;
|