浏览代码

ColladaLoader2: Light parsing.

Mr.doob 9 年之前
父节点
当前提交
d403bad611
共有 1 个文件被更改,包括 124 次插入0 次删除
  1. 124 0
      examples/js/loaders/ColladaLoader2.js

+ 124 - 0
examples/js/loaders/ColladaLoader2.js

@@ -133,6 +133,121 @@ THREE.ColladaLoader.prototype = {
 
 
 		}
 		}
 
 
+		// light
+
+		function parseLight( xml ) {
+
+			var data = {};
+
+			for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
+
+				var child = xml.childNodes[ i ];
+
+				if ( child.nodeType !== 1 ) continue;
+
+				switch ( child.nodeName ) {
+
+					case 'technique_common':
+						data = parseLightTechnique( child );
+						break;
+
+				}
+
+			}
+
+			//
+
+			var light;
+
+			switch ( data.technique ) {
+
+				case 'directional':
+					light = new THREE.DirectionalLight();
+					break;
+
+				case 'point':
+					light = new THREE.PointLight();
+					break;
+
+				case 'spot':
+					light = new THREE.SpotLight();
+					break;
+
+				case 'ambient':
+					light = new THREE.AmbientLight();
+					break;
+
+			}
+
+			if ( data.parameters.color ) light.color.copy( data.parameters.color );
+			if ( data.parameters.distance ) light.distance = data.parameters.distance;
+
+			return light;
+
+		}
+
+		function parseLightTechnique( xml ) {
+
+			var data = {};
+
+			for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
+
+				var child = xml.childNodes[ i ];
+
+				if ( child.nodeType !== 1 ) continue;
+
+				switch ( child.nodeName ) {
+
+					case 'directional':
+					case 'point':
+					case 'spot':
+					case 'ambient':
+
+						data.technique = child.nodeName;
+						data.parameters = parseLightParameters( child );
+
+				}
+
+			}
+
+			return data;
+
+		}
+
+		function parseLightParameters( xml ) {
+
+			var data = {};
+
+			for ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {
+
+				var child = xml.childNodes[ i ];
+
+				if ( child.nodeType !== 1 ) continue;
+
+				switch ( child.nodeName ) {
+
+					case 'color':
+						var array = parseFloats( child.textContent );
+						data.color = new THREE.Color().fromArray( array );
+						break;
+
+					case 'falloff_angle':
+						data.falloffAngle = parseFloat( child.textContent );
+						break;
+
+					case 'quadratic_attenuation':
+						var f = parseFloat( child.textContent );
+						data.distance = f ? Math.sqrt( 1 / f ) : 0;
+						break;
+
+				}
+
+			}
+
+			return data;
+
+		}
+
 		// geometry
 		// geometry
 
 
 		function parseGeometry( xml ) {
 		function parseGeometry( xml ) {
@@ -352,6 +467,10 @@ THREE.ColladaLoader.prototype = {
 						node.camera = camerasLibrary[ parseId( child.getAttribute( 'url' ) ) ];
 						node.camera = camerasLibrary[ parseId( child.getAttribute( 'url' ) ) ];
 						break;
 						break;
 
 
+					case 'instance_light':
+						node.light = lightsLibrary[ parseId( child.getAttribute( 'url' ) ) ];
+						break;
+
 					case 'instance_geometry':
 					case 'instance_geometry':
 						node.geometry = geometriesLibrary[ parseId( child.getAttribute( 'url' ) ) ];
 						node.geometry = geometriesLibrary[ parseId( child.getAttribute( 'url' ) ) ];
 						break;
 						break;
@@ -403,6 +522,10 @@ THREE.ColladaLoader.prototype = {
 
 
 				object = node.camera.clone();
 				object = node.camera.clone();
 
 
+			} else if ( node.light !== undefined) {
+
+				object = node.light.clone();
+
 			} else if ( node.geometry !== undefined ) {
 			} else if ( node.geometry !== undefined ) {
 
 
 				object = new THREE.Mesh( node.geometry, material );
 				object = new THREE.Mesh( node.geometry, material );
@@ -468,6 +591,7 @@ THREE.ColladaLoader.prototype = {
 
 
 		var imagesLibrary = parseLibrary( xml, 'library_images', 'image', parseImage );
 		var imagesLibrary = parseLibrary( xml, 'library_images', 'image', parseImage );
 		var camerasLibrary = parseLibrary( xml, 'library_cameras', 'camera', parseCamera );
 		var camerasLibrary = parseLibrary( xml, 'library_cameras', 'camera', parseCamera );
+		var lightsLibrary = parseLibrary( xml, 'library_lights', 'light', parseLight );
 		var geometriesLibrary = parseLibrary( xml, 'library_geometries', 'geometry', parseGeometry );
 		var geometriesLibrary = parseLibrary( xml, 'library_geometries', 'geometry', parseGeometry );
 		var nodesLibrary = parseLibrary( xml, 'library_nodes', 'node', parseNode );
 		var nodesLibrary = parseLibrary( xml, 'library_nodes', 'node', parseNode );
 		var visualScenesLibrary = parseLibrary( xml, 'library_visual_scenes', 'visual_scene', parseVisualScene );
 		var visualScenesLibrary = parseLibrary( xml, 'library_visual_scenes', 'visual_scene', parseVisualScene );