Browse Source

Object file format 4.1

Mr.doob 12 years ago
parent
commit
3587ba0de6

+ 1 - 0
editor/index.html

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

+ 5 - 3
editor/js/Loader.js

@@ -1,4 +1,3 @@
-
 var Loader = function ( editor, signals ) {
 
 	var scope = this;
@@ -109,12 +108,15 @@ var Loader = function ( editor, signals ) {
 
 		} else if ( data.metadata.type === 'object' ) {
 
-			var loader = new THREE.ObjectLoader();
+			var loader = data.metadata.version === 4
+				? new THREE.ObjectLoader4()
+				: new THREE.ObjectLoader();
+
 			var result = loader.parse( data );
 
 			if ( result instanceof THREE.Scene ) {
 
-				editor.addObject( result );
+				editor.addObject( result.children );
 
 			} else {
 

+ 1 - 4
editor/js/Sidebar.Outliner.Geometries.js

@@ -16,10 +16,7 @@ Sidebar.Outliner.Geometries = function ( signals ) {
 		for ( var i in editor.geometries ) {
 
 			var geometry = editor.geometries[ i ];
-
-			if ( geometry.name == '') geometry.name = 'Geometry' + geometry.id;
-
-			options[ i ] = geometry.name;
+			options[ i ] = '- ' + geometry.name;
 
 		}
 

+ 1 - 4
editor/js/Sidebar.Outliner.Materials.js

@@ -16,10 +16,7 @@ Sidebar.Outliner.Materials = function ( signals ) {
 		for ( var i in editor.materials ) {
 
 			var material = editor.materials[ i ];
-
-			if ( material.name == '') material.name = 'Material' + material.id;
-
-			options[ i ] = material.name;
+			options[ i ] = '- ' + material.name;
 
 		}
 

+ 1 - 4
editor/js/Sidebar.Outliner.Textures.js

@@ -16,10 +16,7 @@ Sidebar.Outliner.Textures = function ( signals ) {
 		for ( var i in editor.textures ) {
 
 			var texture = editor.textures[ i ];
-
-			if ( texture.name == '') texture.name = 'Texture' + texture.id;
-
-			options[ i ] = texture.name;
+			options[ i ] = '- ' + texture.name;
 
 		}
 

+ 16 - 22
examples/js/exporters/ObjectExporter.js

@@ -14,7 +14,7 @@ THREE.ObjectExporter.prototype = {
 
 		var output = {
 			metadata: {
-				version: 4.0,
+				version: 4.1,
 				type: 'object',
 				generator: 'ObjectExporter'
 			}
@@ -22,20 +22,17 @@ THREE.ObjectExporter.prototype = {
 
 		//
 
-		var geometries = {};
 		var geometryExporter = new THREE.GeometryExporter();
 
 		var parseGeometry = function ( geometry ) {
 
-			if ( geometries[ geometry.id ] === undefined ) {
+			if ( output.geometries === undefined ) {
 
-				if ( output.geometries === undefined ) {
+				output.geometries = {};
 
-					output.geometries = [];
-
-				}
+			}
 
-				geometries[ geometry.id ] = output.geometries.length;
+			if ( output.geometries[ geometry.id ] === undefined ) {
 
 				var data = {};
 
@@ -115,40 +112,37 @@ THREE.ObjectExporter.prototype = {
 
 				}
 
-				output.geometries.push( data );
+				output.geometries[ geometry.id ] = data;
 
 			}
 
-			return geometries[ geometry.id ];
+			return geometry.id;
 
 		};
 
 		//
 
-		var materials = {};
 		var materialExporter = new THREE.MaterialExporter();
 
 		var parseMaterial = function ( material ) {
 
-			if ( materials[ material.id ] === undefined ) {
+			if ( output.materials === undefined ) {
 
-				if ( output.materials === undefined ) {
+				output.materials = {};
 
-					output.materials = [];
-
-				}
+			}
 
-				materials[ material.id ] = output.materials.length;
+			if ( output.materials[ material.id ] === undefined ) {
 
 				var data = materialExporter.parse( material );
 
 				delete data.metadata;
 
-				output.materials.push( data );
+				output.materials[ material.id ] = data;
 
 			}
 
-			return materials[ material.id ];
+			return material.id;
 
 		};
 
@@ -159,7 +153,6 @@ THREE.ObjectExporter.prototype = {
 			var data = {};
 
 			if ( object.name !== '' ) data.name = object.name;
-			if ( object.uuid !== '' ) data.uuid = object.uuid;
 			if ( JSON.stringify( object.userData ) !== '{}' ) data.userData = object.userData;
 			if ( object.visible !== true ) data.visible = object.visible;
 
@@ -246,11 +239,12 @@ THREE.ObjectExporter.prototype = {
 
 			if ( object.children.length > 0 ) {
 
-				data.children = [];
+				data.children = {};
 
 				for ( var i = 0; i < object.children.length; i ++ ) {
 
-					data.children.push( parseObject( object.children[ i ] ) );
+					var child = object.children[ i ];
+					data.children[ child.id ] = parseObject( child );
 
 				}
 

+ 10 - 13
examples/js/loaders/ObjectLoader.js

@@ -46,9 +46,7 @@ THREE.ObjectLoader.prototype = {
 	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;
@@ -57,16 +55,16 @@ THREE.ObjectLoader.prototype = {
 
 	parseGeometries: function ( json ) {
 
-		var geometries = [];
+		var geometries = {};
 
 		if ( json !== undefined ) {
 
 			var loader = new THREE.JSONLoader();
 
-			for ( var i = 0, l = json.length; i < l; i ++ ) {
+			for ( var id in json ) {
 
 				var geometry;
-				var data = json[ i ];
+				var data = json[ id ];
 
 				switch ( data.type ) {
 
@@ -166,7 +164,7 @@ THREE.ObjectLoader.prototype = {
 
 				if ( data.name !== undefined ) geometry.name = data.name;
 
-				geometries.push( geometry );
+				geometries[ id ] = geometry;
 
 			}
 
@@ -178,20 +176,20 @@ THREE.ObjectLoader.prototype = {
 
 	parseMaterials: function ( json ) {
 
-		var materials = [];
+		var materials = {};
 
 		if ( json !== undefined ) {
 
 			var loader = new THREE.MaterialLoader();
 
-			for ( var i = 0, l = json.length; i < l; i ++ ) {
+			for ( var id in json ) {
 
-				var data = json[ i ];
+				var data = json[ id ];
 				var material = loader.parse( data );
 
 				if ( data.name !== undefined ) material.name = data.name;
 
-				materials.push( material );
+				materials[ id ] = material;
 
 			}
 
@@ -287,15 +285,14 @@ THREE.ObjectLoader.prototype = {
 
 		if ( data.children !== undefined ) {
 
-			for ( var i = 0, l = data.children.length; i < l; i ++ ) {
+			for ( var child in data.children ) {
 
-				object.add( this.parseObject( data.children[ i ], geometries, materials ) );
+				object.add( this.parseObject( data.children[ child ], geometries, materials ) );
 
 			}
 
 		}
 
-
 		return object;
 
 	}

+ 302 - 0
examples/js/loaders/ObjectLoader4.js

@@ -0,0 +1,302 @@
+/**
+ * @author mrdoob / http://mrdoob.com/
+ */
+
+THREE.ObjectLoader4 = function () {};
+
+THREE.ObjectLoader4.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 i = 0, l = json.length; i < l; i ++ ) {
+
+				var geometry;
+				var data = json[ i ];
+
+				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.push( geometry );
+
+			}
+
+		}
+
+		return geometries;
+
+	},
+
+	parseMaterials: function ( json ) {
+
+		var materials = [];
+
+		if ( json !== undefined ) {
+
+			var loader = new THREE.MaterialLoader();
+
+			for ( var i = 0, l = json.length; i < l; i ++ ) {
+
+				var data = json[ i ];
+				var material = loader.parse( data );
+
+				if ( data.name !== undefined ) material.name = data.name;
+
+				materials.push( 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 i = 0, l = data.children.length; i < l; i ++ ) {
+
+				object.add( this.parseObject( data.children[ i ], geometries, materials ) );
+
+			}
+
+		}
+
+		return object;
+
+	}
+
+};