Преглед на файлове

Added PlayCanvasLoader.

Mr.doob преди 9 години
родител
ревизия
4024d52dee
променени са 3 файла, в които са добавени 194 реда и са изтрити 1 реда
  1. 2 1
      editor/index.html
  2. 18 0
      editor/js/Loader.js
  3. 174 0
      examples/js/loaders/PlayCanvasLoader.js

+ 2 - 1
editor/index.html

@@ -23,6 +23,7 @@
 		<script src="../examples/js/loaders/KMZLoader.js"></script>
 		<script src="../examples/js/loaders/MD2Loader.js"></script>
 		<script src="../examples/js/loaders/OBJLoader.js"></script>
+		<script src="../examples/js/loaders/PlayCanvasLoader.js"></script>
 		<script src="../examples/js/loaders/PLYLoader.js"></script>
 		<script src="../examples/js/loaders/STLLoader.js"></script>
 		<script src="../examples/js/loaders/UTF8Loader.js"></script>
@@ -288,7 +289,7 @@
 						if ( parent !== null ) editor.execute( new CmdRemoveObject( object ) );
 
 						break;
-						
+
 					case 90: // Register Ctrl-Z for Undo, Ctrl-Shift-Z for Redo
 
 						if ( event.ctrlKey && event.shiftKey ) {

+ 18 - 0
editor/js/Loader.js

@@ -252,6 +252,24 @@ var Loader = function ( editor ) {
 
 				break;
 
+			case 'playcanvas':
+
+				var reader = new FileReader();
+				reader.addEventListener( 'load', function ( event ) {
+
+					var contents = event.target.result;
+					var json = JSON.parse( contents );
+
+					var loader = new THREE.PlayCanvasLoader();
+					var object = loader.parse( json );
+
+					editor.execute( new CmdAddObject( object ) );
+
+				}, false );
+				reader.readAsText( file );
+
+				break;
+
 			case 'ply':
 
 				var reader = new FileReader();

+ 174 - 0
examples/js/loaders/PlayCanvasLoader.js

@@ -0,0 +1,174 @@
+/**
+ * @author mrdoob / http://mrdoob.com/
+ */
+
+THREE.PlayCanvasLoader = function ( manager ) {
+
+	this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
+
+};
+
+THREE.PlayCanvasLoader.prototype = {
+
+	constructor: THREE.PlayCanvasLoader,
+
+	load: function ( url, onLoad, onProgress, onError ) {
+
+		var scope = this;
+
+		var loader = new THREE.XHRLoader( scope.manager );
+		loader.setCrossOrigin( this.crossOrigin );
+		loader.load( url, function ( text ) {
+
+			onLoad( scope.parse( JSON.parse( text ) ) );
+
+		}, onProgress, onError );
+
+	},
+
+	parse: function ( json ) {
+
+		function parseVertices( data ) {
+
+			var attributes = {};
+
+			for ( var name in data ) {
+
+				var attribute = data[ name ];
+
+				var type = attribute.type;
+				var size = attribute.components;
+
+				var array;
+
+				if ( type === 'float32' ) array = new Float32Array( attribute.data );
+				if ( array === undefined ) console.log( 'PlayCanvasLoader: TODO', type );
+
+				attributes[ name ] = new THREE.BufferAttribute( array, size );
+
+			}
+
+			data._attributes = attributes;
+
+		}
+
+		function parseMeshes( data ) {
+
+			var geometry = new THREE.BufferGeometry();
+
+			geometry.setIndex( new THREE.Uint16Attribute( data.indices, 1 ) );
+
+			var attributes = model.vertices[ data.vertices ]._attributes;
+
+			for ( var name in attributes ) {
+
+				var attribute = attributes[ name ];
+
+				if ( name === 'texCoord0' ) name = 'uv';
+
+				geometry.addAttribute( name, attribute );
+
+			}
+
+			data._geometry = geometry;
+
+		}
+
+		function parseMeshInstances( data ) {
+
+			var node = model.nodes[ data.node ];
+			var mesh = model.meshes[ data.mesh ];
+
+			if ( node._geometries === undefined ) {
+
+				node._geometries = [];
+
+			}
+
+			node._geometries.push( mesh._geometry );
+
+		}
+
+		function parseNodes( data ) {
+
+			var object = new THREE.Group();
+			object.name = data.name;
+
+			if ( data._geometries !== undefined ) {
+
+				var material = new THREE.MeshPhongMaterial();
+
+				for ( var i = 0; i < data._geometries.length; i ++ ) {
+
+					var geometry = data._geometries[ i ];
+
+					object.add( new THREE.Mesh( geometry, material ) );
+
+				}
+
+			}
+
+			for ( var i = 0; i < data.rotation.length; i ++ ) {
+				data.rotation[ i ] *= Math.PI / 180;
+			}
+
+			object.position.fromArray( data.position );
+			object.rotation.fromArray( data.rotation );
+			object.scale.fromArray( data.scale );
+
+			data._object = object;
+
+		}
+
+		//
+
+		console.log( json );
+
+		var model = json.model;
+
+		for ( var i = 0; i < model.vertices.length; i ++ ) {
+
+			parseVertices( model.vertices[ i ] );
+
+		}
+
+		for ( var i = 0; i < model.meshes.length; i ++ ) {
+
+			parseMeshes( model.meshes[ i ] );
+
+		}
+
+		for ( var i = 0; i < model.meshInstances.length; i ++ ) {
+
+			parseMeshInstances( model.meshInstances[ i ] );
+
+		}
+
+		for ( var i = 0; i < model.nodes.length; i ++ ) {
+
+			parseNodes( model.nodes[ i ] );
+
+		}
+
+		for ( var i = 0; i < model.parents.length; i ++ ) {
+
+			var parent = model.parents[ i ];
+
+			if ( parent === -1 ) continue;
+
+			model.nodes[ parent ]._object.add( model.nodes[ i ]._object );
+
+
+		}
+
+		return model.nodes[ 0 ]._object;
+
+	},
+
+	setCrossOrigin: function ( value ) {
+
+		this.crossOrigin = value;
+
+	}
+
+};