BabylonLoader.js 3.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/**
 * @author mrdoob / http://mrdoob.com/
 */

THREE.BabylonLoader = function ( manager ) {

	this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;

};

THREE.BabylonLoader.prototype = {

	constructor: THREE.ObjectLoader,

	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 ) ) );

25
		}, onProgress, onError );
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92

	},

	setCrossOrigin: function ( value ) {

		this.crossOrigin = value;

	},

	parse: function ( json ) {

		var materials = this.parseMaterials( json.materials );
		var scene = this.parseObjects( json, materials );

		return scene;

	},

	parseMaterials: function ( json ) {

		var materials = {};

		for ( var i = 0, l = json.length; i < l; i ++ ) {

			var data = json[ i ];

			var material = new THREE.MeshPhongMaterial();
			material.name = data.name;
			material.ambient.fromArray( data.ambient );
			material.color.fromArray( data.diffuse );
			material.emissive.fromArray( data.emissive );
			material.specular.fromArray( data.specular );
			material.shininess = data.specularPower;
			material.opacity = data.alpha;

			materials[ data.id ] = material;

		}

		return materials;

	},

	parseObjects: function ( json, materials ) {

		var objects = {};
		var scene = new THREE.Scene();

		var lights = json.lights;

		for ( var i = 0, l = lights.length; i < l; i ++ ) {

			var data = lights[ i ];

			var light;

			switch ( data.type ) {

				case 0:
					light = new THREE.PointLight();
					break;

				case 1:
					light = new THREE.DirectionalLight();
					break;

				case 2:
M
Mr.doob 已提交
93
					light = new THREE.SpotLight();
94 95 96
					break;

				case 3:
M
Mr.doob 已提交
97
					light = new THREE.HemisphereLight();
98 99 100 101
					break;
			}

			light.name = data.name;
M
Mr.doob 已提交
102
			light.position.set( data.position[ 0 ], data.position[ 1 ], - data.position[ 2 ] );
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
			light.color.fromArray( data.diffuse );
			if ( data.intensity ) light.intensity = data.intensity;

			objects[ data.id ] = light;

			scene.add( light );

		}

		var meshes = json.meshes;

		for ( var i = 0, l = meshes.length; i < l; i ++ ) {

			var data = meshes[ i ];

			var object;

			if ( data.indices !== null  ) {

				var geometry = new THREE.BufferGeometry();

124
				// indices
125

126
				var indices = new Uint16Array( data.indices );
M
Mr.doob 已提交
127

128 129 130 131 132
				geometry.addAttribute( 'index', new THREE.BufferAttribute( indices, 1 ) );

				// positions

				var positions = new Float32Array( data.positions );
133

M
Mr.doob 已提交
134
				for ( var j = 2, jl = positions.length; j < jl; j += 3 ) {
135

M
Mr.doob 已提交
136
					positions[ j ] = - positions[ j ]; 
137 138 139

				}

140
				geometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
M
Mr.doob 已提交
141

142 143 144
				// normals

				var normals = new Float32Array( data.normals );
145

M
Mr.doob 已提交
146
				for ( var j = 2, jl = normals.length; j < jl; j += 3 ) {
147

M
Mr.doob 已提交
148
					normals[ j ] = - normals[ j ]; 
149 150 151

				}

152 153 154 155 156 157 158 159 160
				geometry.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) );

				// uvs

				var uvs = new Float32Array( data.uvs );

				geometry.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) );

				// offsets
161 162 163 164 165 166 167 168 169

				var subMeshes = data.subMeshes;

				if ( subMeshes !== null ) {

					for ( var j = 0, jl = subMeshes.length; j < jl; j ++ ) {

						var subMesh = subMeshes[ j ];

170
						geometry.addDrawCall( subMesh.indexStart, subMesh.indexCount );
171 172 173 174 175

					}

				} else {

176
					geometry.addDrawCall( 0, data.indices.length );
177 178 179

				}

180
				object = new THREE.Mesh( geometry, materials[ data.materialId ] );
181 182 183

			} else {

184
				object = new THREE.Group();
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211

			}

			object.name = data.name;
			object.position.set( data.position[ 0 ], data.position[ 1 ], - data.position[ 2 ] );
			object.rotation.fromArray( data.rotation );
			object.scale.fromArray( data.scaling );

			if ( data.parentId !== undefined && data.parentId !== '' ) {

				objects[ data.parentId ].add( object );

			} else {

				scene.add( object );

			}

			objects[ data.id ] = object;

		}

		return scene;

	}

};