Browse Source

Merge remote-tracking branch 'jbaicoianu/colladaloader-camera' into dev

Mr.doob 13 years ago
parent
commit
f4c2a0e502
1 changed files with 108 additions and 0 deletions
  1. 108 0
      src/extras/loaders/ColladaLoader.js

+ 108 - 0
src/extras/loaders/ColladaLoader.js

@@ -17,6 +17,7 @@ THREE.ColladaLoader = function () {
 	var geometries = {};
 	var materials = {};
 	var effects = {};
+	var cameras = {};
 
 	var animData;
 	var visualScenes;
@@ -127,6 +128,7 @@ THREE.ColladaLoader = function () {
 		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" );
 		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" );
@@ -154,6 +156,7 @@ THREE.ColladaLoader = function () {
 			dae: {
 				images: images,
 				materials: materials,
+				cameras: cameras,
 				effects: effects,
 				geometries: geometries,
 				controllers: controllers,
@@ -801,6 +804,15 @@ THREE.ColladaLoader = function () {
 
 		}
 
+		for ( i = 0; i < node.cameras.length; i ++ ) {
+
+			var instance_camera = node.cameras[i];
+			var cparams = cameras[instance_camera.url];
+
+			obj = new THREE.PerspectiveCamera(cparams.fov, cparams.aspect_ratio, cparams.znear, cparams.zfar);
+
+		}
+
 		obj.name = node.id || "";
 		obj.matrix = node.matrix;
 		var props = node.matrix.decompose();
@@ -1739,6 +1751,7 @@ THREE.ColladaLoader = function () {
 		this.nodes = [];
 		this.transforms = [];
 		this.geometries = [];
+		this.cameras = [];
 		this.controllers = [];
 		this.matrix = new THREE.Matrix4();
 
@@ -1756,6 +1769,7 @@ THREE.ColladaLoader = function () {
 
 				case 'instance_camera':
 
+					this.cameras.push( ( new InstanceCamera() ).parse( child ) );
 					break;
 
 				case 'instance_controller':
@@ -3609,6 +3623,100 @@ THREE.ColladaLoader = function () {
 
 		}
 
+	function Camera () {
+
+		this.id = "";
+		this.name = "";
+
+	};
+
+	Camera.prototype.parse = function ( element ) {
+
+		this.id = element.getAttribute( 'id' );
+		this.name = element.getAttribute( 'name' );
+
+		for ( var i = 0; i < element.childNodes.length; i ++ ) {
+
+			var child = element.childNodes[ i ];
+			if ( child.nodeType != 1 ) continue;
+
+			switch ( child.nodeName ) {
+
+				case 'optics':
+
+					this.parseOptics( child );
+					break;
+
+				default:
+					break;
+
+			}
+
+		}
+
+		return this;
+
+	};
+
+	Camera.prototype.parseOptics = function ( element ) {
+
+		for ( var i = 0; i < element.childNodes.length; i ++ ) {
+
+			if ( element.childNodes[ i ].nodeName == 'technique_common' ) {
+
+				var technique = element.childNodes[ i ];
+
+				for ( var j = 0; j < technique.childNodes.length; j ++ ) {
+
+					if ( technique.childNodes[ j ].nodeName == 'perspective' ) {
+
+						var perspective = technique.childNodes[ j ];
+
+						for ( var k = 0; k < perspective.childNodes.length; k ++ ) {
+
+							var param = perspective.childNodes[ k ];
+							switch ( param.nodeName ) {
+
+								case 'xfov':
+									this.fov = param.textContent;
+									break;
+								case 'znear':
+									this.znear = .4;//param.textContent;
+									break;
+								case 'zfar':
+									this.zfar = 1e15;//param.textContent;
+									break;
+								case 'aspect_ratio':
+									this.aspect_ratio = param.textContent;
+									break;
+
+							}
+
+						}
+
+					}
+
+				}
+				
+			}
+
+		}
+		
+		return this;
+
+	};
+	function InstanceCamera() {
+
+		this.url = "";
+
+	};
+
+	InstanceCamera.prototype.parse = function ( element ) {
+
+		this.url = element.getAttribute('url').replace(/^#/, '');
+
+		return this;
+
 	};
 
 	function _source ( element ) {