Browse Source

Object format 4.2. See #3488.

Mr.doob 12 years ago
parent
commit
28a95b8090

+ 1 - 0
editor/index.html

@@ -101,6 +101,7 @@
 		<!-- WIP -->
 		<!-- WIP -->
 
 
 		<script src="../examples/js/loaders/ObjectLoader4.js"></script> <!-- DEPRECATED -->
 		<script src="../examples/js/loaders/ObjectLoader4.js"></script> <!-- DEPRECATED -->
+		<script src="../examples/js/loaders/ObjectLoader41.js"></script> <!-- DEPRECATED -->
 		<script src="../examples/js/loaders/ObjectLoader.js"></script>
 		<script src="../examples/js/loaders/ObjectLoader.js"></script>
 		<script src="../examples/js/exporters/GeometryExporter.js"></script>
 		<script src="../examples/js/exporters/GeometryExporter.js"></script>
 		<script src="../examples/js/exporters/MaterialExporter.js"></script>
 		<script src="../examples/js/exporters/MaterialExporter.js"></script>

+ 20 - 3
editor/js/Loader.js

@@ -108,9 +108,26 @@ var Loader = function ( editor, signals ) {
 
 
 		} else if ( data.metadata.type === 'object' ) {
 		} else if ( data.metadata.type === 'object' ) {
 
 
-			var loader = data.metadata.version === 4
-				? new THREE.ObjectLoader4()
-				: new THREE.ObjectLoader();
+			var loader;
+
+			switch ( data.metadata.version ) {
+
+				case 4:
+					console.log( 'Loading Object format 4.0');
+					loader = new THREE.ObjectLoader4(); // DEPRECATED
+					break;
+
+				case 4.1:
+					console.log( 'Loading Object format 4.1');
+					loader = new THREE.ObjectLoader41(); // DEPRECATED
+					break;
+
+				default:
+					console.log( 'Loading Object format 4.2');				
+					loader = new THREE.ObjectLoader();
+					break;
+
+			}
 
 
 			var result = loader.parse( data );
 			var result = loader.parse( data );
 
 

+ 3 - 1
examples/js/exporters/MaterialExporter.js

@@ -12,12 +12,14 @@ THREE.MaterialExporter.prototype = {
 
 
 		var output = {
 		var output = {
 			metadata: {
 			metadata: {
-				version: 4.0,
+				version: 4.2,
 				type: 'material',
 				type: 'material',
 				generator: 'MaterialExporter'
 				generator: 'MaterialExporter'
 			}
 			}
 		};
 		};
 
 
+		output.id = material.id;
+
 		if ( material.name !== "" ) output.name = material.name;
 		if ( material.name !== "" ) output.name = material.name;
 
 
 		if ( material instanceof THREE.MeshBasicMaterial ) {
 		if ( material instanceof THREE.MeshBasicMaterial ) {

+ 19 - 10
examples/js/exporters/ObjectExporter.js

@@ -14,7 +14,7 @@ THREE.ObjectExporter.prototype = {
 
 
 		var output = {
 		var output = {
 			metadata: {
 			metadata: {
-				version: 4.1,
+				version: 4.2,
 				type: 'object',
 				type: 'object',
 				generator: 'ObjectExporter'
 				generator: 'ObjectExporter'
 			}
 			}
@@ -22,20 +22,23 @@ THREE.ObjectExporter.prototype = {
 
 
 		//
 		//
 
 
+		var geometries = {};
 		var geometryExporter = new THREE.GeometryExporter();
 		var geometryExporter = new THREE.GeometryExporter();
 
 
 		var parseGeometry = function ( geometry ) {
 		var parseGeometry = function ( geometry ) {
 
 
 			if ( output.geometries === undefined ) {
 			if ( output.geometries === undefined ) {
 
 
-				output.geometries = {};
+				output.geometries = [];
 
 
 			}
 			}
 
 
-			if ( output.geometries[ geometry.id ] === undefined ) {
+			if ( geometries[ geometry.id ] === undefined ) {
 
 
 				var data = {};
 				var data = {};
 
 
+				data.id = geometry.id;
+
 				if ( geometry.name !== "" ) data.name = geometry.name;
 				if ( geometry.name !== "" ) data.name = geometry.name;
 
 
 				if ( geometry instanceof THREE.PlaneGeometry ) {
 				if ( geometry instanceof THREE.PlaneGeometry ) {
@@ -112,7 +115,9 @@ THREE.ObjectExporter.prototype = {
 
 
 				}
 				}
 
 
-				output.geometries[ geometry.id ] = data;
+				geometries[ geometry.id ] = data;
+
+				output.geometries.push( data );
 
 
 			}
 			}
 
 
@@ -122,23 +127,26 @@ THREE.ObjectExporter.prototype = {
 
 
 		//
 		//
 
 
+		var materials = {};
 		var materialExporter = new THREE.MaterialExporter();
 		var materialExporter = new THREE.MaterialExporter();
 
 
 		var parseMaterial = function ( material ) {
 		var parseMaterial = function ( material ) {
 
 
 			if ( output.materials === undefined ) {
 			if ( output.materials === undefined ) {
 
 
-				output.materials = {};
+				output.materials = [];
 
 
 			}
 			}
 
 
-			if ( output.materials[ material.id ] === undefined ) {
+			if ( materials[ material.id ] === undefined ) {
 
 
 				var data = materialExporter.parse( material );
 				var data = materialExporter.parse( material );
 
 
 				delete data.metadata;
 				delete data.metadata;
 
 
-				output.materials[ material.id ] = data;
+				materials[ material.id ] = data;
+
+				output.materials.push( data );
 
 
 			}
 			}
 
 
@@ -152,6 +160,8 @@ THREE.ObjectExporter.prototype = {
 
 
 			var data = {};
 			var data = {};
 
 
+			data.id = object.id;
+
 			if ( object.name !== '' ) data.name = object.name;
 			if ( object.name !== '' ) data.name = object.name;
 			if ( JSON.stringify( object.userData ) !== '{}' ) data.userData = object.userData;
 			if ( JSON.stringify( object.userData ) !== '{}' ) data.userData = object.userData;
 			if ( object.visible !== true ) data.visible = object.visible;
 			if ( object.visible !== true ) data.visible = object.visible;
@@ -239,12 +249,11 @@ THREE.ObjectExporter.prototype = {
 
 
 			if ( object.children.length > 0 ) {
 			if ( object.children.length > 0 ) {
 
 
-				data.children = {};
+				data.children = [];
 
 
 				for ( var i = 0; i < object.children.length; i ++ ) {
 				for ( var i = 0; i < object.children.length; i ++ ) {
 
 
-					var child = object.children[ i ];
-					data.children[ child.id ] = parseObject( child );
+					data.children.push( parseObject( object.children[ i ] ) );
 
 
 				}
 				}
 
 

+ 9 - 6
examples/js/loaders/ObjectLoader.js

@@ -61,10 +61,10 @@ THREE.ObjectLoader.prototype = {
 
 
 			var loader = new THREE.JSONLoader();
 			var loader = new THREE.JSONLoader();
 
 
-			for ( var id in json ) {
+			for ( var i = 0, l = json.length; i < l; i ++ ) {
 
 
 				var geometry;
 				var geometry;
-				var data = json[ id ];
+				var data = json[ i ];
 
 
 				switch ( data.type ) {
 				switch ( data.type ) {
 
 
@@ -162,9 +162,10 @@ THREE.ObjectLoader.prototype = {
 
 
 				}
 				}
 
 
+				if ( data.id !== undefined ) geometry.id = data.id;
 				if ( data.name !== undefined ) geometry.name = data.name;
 				if ( data.name !== undefined ) geometry.name = data.name;
 
 
-				geometries[ id ] = geometry;
+				geometries[ data.id ] = geometry;
 
 
 			}
 			}
 
 
@@ -182,14 +183,15 @@ THREE.ObjectLoader.prototype = {
 
 
 			var loader = new THREE.MaterialLoader();
 			var loader = new THREE.MaterialLoader();
 
 
-			for ( var id in json ) {
+			for ( var i = 0, l = json.length; i < l; i ++ ) {
 
 
-				var data = json[ id ];
+				var data = json[ i ];
 				var material = loader.parse( data );
 				var material = loader.parse( data );
 
 
+				if ( data.id !== undefined ) material.id = data.id;
 				if ( data.name !== undefined ) material.name = data.name;
 				if ( data.name !== undefined ) material.name = data.name;
 
 
-				materials[ id ] = material;
+				materials[ data.id ] = material;
 
 
 			}
 			}
 
 
@@ -279,6 +281,7 @@ THREE.ObjectLoader.prototype = {
 
 
 		}
 		}
 
 
+		if ( data.id !== undefined ) object.id = data.id;
 		if ( data.name !== undefined ) object.name = data.name;
 		if ( data.name !== undefined ) object.name = data.name;
 		if ( data.visible !== undefined ) object.visible = data.visible;
 		if ( data.visible !== undefined ) object.visible = data.visible;
 		if ( data.userData !== undefined ) object.userData = data.userData;
 		if ( data.userData !== undefined ) object.userData = data.userData;

+ 300 - 0
examples/js/loaders/ObjectLoader41.js

@@ -0,0 +1,300 @@
+/**
+ * @author mrdoob / http://mrdoob.com/
+ */
+
+THREE.ObjectLoader41 = function () {};
+
+THREE.ObjectLoader41.prototype = {
+
+	constructor: THREE.ObjectLoader,
+
+	addEventListener: THREE.EventDispatcher.prototype.addEventListener,
+	hasEventListener: THREE.EventDispatcher.prototype.hasEventListener,
+	removeEventListener: THREE.EventDispatcher.prototype.removeEventListener,
+	dispatchEvent: THREE.EventDispatcher.prototype.dispatchEvent,
+
+	load: function ( url ) {
+
+		var scope = this;
+		var request = new XMLHttpRequest();
+
+		request.addEventListener( 'load', function ( event ) {
+
+			var response = scope.parse( JSON.parse( event.target.responseText ) );
+
+			scope.dispatchEvent( { type: 'load', content: response } );
+
+		}, false );
+
+		request.addEventListener( 'progress', function ( event ) {
+
+			scope.dispatchEvent( { type: 'progress', loaded: event.loaded, total: event.total } );
+
+		}, false );
+
+		request.addEventListener( 'error', function () {
+
+			scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']' } );
+
+		}, false );
+
+		request.open( 'GET', url, true );
+		request.send( null );
+
+	},
+
+	parse: function ( json ) {
+
+		var geometries = this.parseGeometries( json.geometries );
+		var materials = this.parseMaterials( json.materials );
+		var object = this.parseObject( json.object, geometries, materials );
+
+		return object;
+
+	},
+
+	parseGeometries: function ( json ) {
+
+		var geometries = {};
+
+		if ( json !== undefined ) {
+
+			var loader = new THREE.JSONLoader();
+
+			for ( var id in json ) {
+
+				var geometry;
+				var data = json[ id ];
+
+				switch ( data.type ) {
+
+					case 'PlaneGeometry':
+
+						geometry = new THREE.PlaneGeometry(
+							data.width,
+							data.height,
+							data.widthSegments,
+							data.heightSegments
+						);
+
+						break;
+
+					case 'CubeGeometry':
+
+						geometry = new THREE.CubeGeometry(
+							data.width,
+							data.height,
+							data.depth,
+							data.widthSegments,
+							data.heightSegments,
+							data.depthSegments
+						);
+
+						break;
+
+					case 'CylinderGeometry':
+
+						geometry = new THREE.CylinderGeometry(
+							data.radiusTop,
+							data.radiusBottom,
+							data.height,
+							data.radiusSegments,
+							data.heightSegments,
+							data.openEnded
+						);
+
+						break;
+
+					case 'SphereGeometry':
+
+						geometry = new THREE.SphereGeometry(
+							data.radius,
+							data.widthSegments,
+							data.heightSegments,
+							data.phiStart,
+							data.phiLength,
+							data.thetaStart,
+							data.thetaLength
+						);
+
+						break;
+
+					case 'IcosahedronGeometry':
+
+						geometry = new THREE.IcosahedronGeometry(
+							data.radius,
+							data.detail
+						);
+
+						break;
+
+					case 'TorusGeometry':
+
+						geometry = new THREE.TorusGeometry(
+							data.radius,
+							data.tube,
+							data.radialSegments,
+							data.tubularSegments,
+							data.arc
+						);
+
+						break;
+
+					case 'TorusKnotGeometry':
+
+						geometry = new THREE.TorusKnotGeometry(
+							data.radius,
+							data.tube,
+							data.radialSegments,
+							data.tubularSegments,
+							data.p,
+							data.q,
+							data.heightScale
+						);
+
+						break;
+
+					case 'Geometry':
+
+						geometry = loader.parse( data.data ).geometry;
+
+						break;
+
+				}
+
+				if ( data.name !== undefined ) geometry.name = data.name;
+
+				geometries[ id ] = geometry;
+
+			}
+
+		}
+
+		return geometries;
+
+	},
+
+	parseMaterials: function ( json ) {
+
+		var materials = {};
+
+		if ( json !== undefined ) {
+
+			var loader = new THREE.MaterialLoader();
+
+			for ( var id in json ) {
+
+				var data = json[ id ];
+				var material = loader.parse( data );
+
+				if ( data.name !== undefined ) material.name = data.name;
+
+				materials[ id ] = material;
+
+			}
+
+		}
+
+		return materials;
+
+	},
+
+	parseObject: function ( data, geometries, materials ) {
+
+		var object;
+
+		switch ( data.type ) {
+
+			case 'Scene':
+
+				object = new THREE.Scene();
+
+				break;
+
+			case 'PerspectiveCamera':
+
+				object = new THREE.PerspectiveCamera( data.fov, data.aspect, data.near, data.far );
+				object.position.fromArray( data.position );
+				object.rotation.fromArray( data.rotation );
+
+				break;
+
+			case 'OrthographicCamera':
+
+				object = new THREE.OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );
+				object.position.fromArray( data.position );
+				object.rotation.fromArray( data.rotation );
+
+				break;
+
+			case 'AmbientLight':
+
+				object = new THREE.AmbientLight( data.color );
+
+				break;
+
+			case 'DirectionalLight':
+
+				object = new THREE.DirectionalLight( data.color, data.intensity );
+				object.position.fromArray( data.position );
+
+				break;
+
+			case 'PointLight':
+
+				object = new THREE.PointLight( data.color, data.intensity, data.distance );
+				object.position.fromArray( data.position );
+
+				break;
+
+			case 'SpotLight':
+
+				object = new THREE.SpotLight( data.color, data.intensity, data.distance, data.angle, data.exponent );
+				object.position.fromArray( data.position );
+
+				break;
+
+			case 'HemisphereLight':
+
+				object = new THREE.HemisphereLight( data.color, data.groundColor, data.intensity );
+				object.position.fromArray( data.position );
+
+				break;
+
+			case 'Mesh':
+
+				object = new THREE.Mesh( geometries[ data.geometry ], materials[ data.material ] );
+				object.position.fromArray( data.position );
+				object.rotation.fromArray( data.rotation );
+				object.scale.fromArray( data.scale );
+
+				break;
+
+			default:
+
+				object = new THREE.Object3D();
+				object.position.fromArray( data.position );
+				object.rotation.fromArray( data.rotation );
+				object.scale.fromArray( data.scale );
+
+		}
+
+		if ( data.name !== undefined ) object.name = data.name;
+		if ( data.visible !== undefined ) object.visible = data.visible;
+		if ( data.userData !== undefined ) object.userData = data.userData;
+
+		if ( data.children !== undefined ) {
+
+			for ( var child in data.children ) {
+
+				object.add( this.parseObject( data.children[ child ], geometries, materials ) );
+
+			}
+
+		}
+
+		return object;
+
+	}
+
+};