|
@@ -34,7 +34,7 @@ THREE.BabylonLoader.prototype = {
|
|
|
|
|
|
parse: function ( json ) {
|
|
parse: function ( json ) {
|
|
|
|
|
|
- var materials = this.parseMaterials( json.materials );
|
|
|
|
|
|
+ var materials = this.parseMaterials( json );
|
|
var scene = this.parseObjects( json, materials );
|
|
var scene = this.parseObjects( json, materials );
|
|
|
|
|
|
return scene;
|
|
return scene;
|
|
@@ -45,9 +45,9 @@ THREE.BabylonLoader.prototype = {
|
|
|
|
|
|
var materials = {};
|
|
var materials = {};
|
|
|
|
|
|
- for ( var i = 0, l = json.length; i < l; i ++ ) {
|
|
|
|
|
|
+ for ( var i = 0, l = json.materials.length; i < l; i ++ ) {
|
|
|
|
|
|
- var data = json[ i ];
|
|
|
|
|
|
+ var data = json.materials[ i ];
|
|
|
|
|
|
var material = new THREE.MeshPhongMaterial();
|
|
var material = new THREE.MeshPhongMaterial();
|
|
material.name = data.name;
|
|
material.name = data.name;
|
|
@@ -62,15 +62,117 @@ THREE.BabylonLoader.prototype = {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if ( json.multiMaterials ) {
|
|
|
|
+
|
|
|
|
+ for ( var i = 0, l = json.multiMaterials.length; i < l; i ++ ) {
|
|
|
|
+
|
|
|
|
+ var data = json.multiMaterials[ i ];
|
|
|
|
+
|
|
|
|
+ console.warn( 'THREE.BabylonLoader: Multi materials not yet supported.' );
|
|
|
|
+
|
|
|
|
+ materials[ data.id ] = new THREE.MeshPhongMaterial();
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
return materials;
|
|
return materials;
|
|
|
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
+ parseGeometry: function ( json ) {
|
|
|
|
+
|
|
|
|
+ var geometry = new THREE.BufferGeometry();
|
|
|
|
+
|
|
|
|
+ // indices
|
|
|
|
+
|
|
|
|
+ var indices = new Uint16Array( json.indices );
|
|
|
|
+
|
|
|
|
+ geometry.addAttribute( 'index', new THREE.BufferAttribute( indices, 1 ) );
|
|
|
|
+
|
|
|
|
+ // positions
|
|
|
|
+
|
|
|
|
+ var positions = new Float32Array( json.positions );
|
|
|
|
+
|
|
|
|
+ for ( var j = 2, jl = positions.length; j < jl; j += 3 ) {
|
|
|
|
+
|
|
|
|
+ positions[ j ] = - positions[ j ];
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ geometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
|
|
|
|
+
|
|
|
|
+ // normals
|
|
|
|
+
|
|
|
|
+ if ( json.normals ) {
|
|
|
|
+
|
|
|
|
+ var normals = new Float32Array( json.normals );
|
|
|
|
+
|
|
|
|
+ for ( var j = 2, jl = normals.length; j < jl; j += 3 ) {
|
|
|
|
+
|
|
|
|
+ normals[ j ] = - normals[ j ];
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ geometry.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // uvs
|
|
|
|
+
|
|
|
|
+ if ( json.uvs ) {
|
|
|
|
+
|
|
|
|
+ var uvs = new Float32Array( json.uvs );
|
|
|
|
+
|
|
|
|
+ geometry.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // offsets
|
|
|
|
+
|
|
|
|
+ var subMeshes = json.subMeshes;
|
|
|
|
+
|
|
|
|
+ if ( subMeshes ) {
|
|
|
|
+
|
|
|
|
+ for ( var j = 0, jl = subMeshes.length; j < jl; j ++ ) {
|
|
|
|
+
|
|
|
|
+ var subMesh = subMeshes[ j ];
|
|
|
|
+
|
|
|
|
+ geometry.addDrawCall( subMesh.indexStart, subMesh.indexCount );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+
|
|
|
|
+ geometry.addDrawCall( 0, json.indices.length );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return geometry;
|
|
|
|
+
|
|
|
|
+ },
|
|
|
|
+
|
|
parseObjects: function ( json, materials ) {
|
|
parseObjects: function ( json, materials ) {
|
|
|
|
|
|
var objects = {};
|
|
var objects = {};
|
|
var scene = new THREE.Scene();
|
|
var scene = new THREE.Scene();
|
|
|
|
|
|
|
|
+ var cameras = json.cameras;
|
|
|
|
+
|
|
|
|
+ for ( var i = 0, l = cameras.length; i < l; i ++ ) {
|
|
|
|
+
|
|
|
|
+ var data = cameras[ i ];
|
|
|
|
+
|
|
|
|
+ var camera = new THREE.PerspectiveCamera( ( data.fov / Math.PI ) * 180, 1.33, data.minZ, data.maxZ );
|
|
|
|
+
|
|
|
|
+ camera.name = data.name;
|
|
|
|
+ camera.position.fromArray( data.position );
|
|
|
|
+ if ( data.rotation ) camera.rotation.fromArray( data.rotation );
|
|
|
|
+
|
|
|
|
+ objects[ data.id ] = camera;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
var lights = json.lights;
|
|
var lights = json.lights;
|
|
|
|
|
|
for ( var i = 0, l = lights.length; i < l; i ++ ) {
|
|
for ( var i = 0, l = lights.length; i < l; i ++ ) {
|
|
@@ -117,65 +219,9 @@ THREE.BabylonLoader.prototype = {
|
|
|
|
|
|
var object;
|
|
var object;
|
|
|
|
|
|
- if ( data.indices !== null ) {
|
|
|
|
-
|
|
|
|
- var geometry = new THREE.BufferGeometry();
|
|
|
|
-
|
|
|
|
- // indices
|
|
|
|
-
|
|
|
|
- var indices = new Uint16Array( data.indices );
|
|
|
|
-
|
|
|
|
- geometry.addAttribute( 'index', new THREE.BufferAttribute( indices, 1 ) );
|
|
|
|
-
|
|
|
|
- // positions
|
|
|
|
-
|
|
|
|
- var positions = new Float32Array( data.positions );
|
|
|
|
-
|
|
|
|
- for ( var j = 2, jl = positions.length; j < jl; j += 3 ) {
|
|
|
|
-
|
|
|
|
- positions[ j ] = - positions[ j ];
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- geometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
|
|
|
|
-
|
|
|
|
- // normals
|
|
|
|
-
|
|
|
|
- var normals = new Float32Array( data.normals );
|
|
|
|
-
|
|
|
|
- for ( var j = 2, jl = normals.length; j < jl; j += 3 ) {
|
|
|
|
-
|
|
|
|
- normals[ j ] = - normals[ j ];
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- geometry.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) );
|
|
|
|
-
|
|
|
|
- // uvs
|
|
|
|
-
|
|
|
|
- var uvs = new Float32Array( data.uvs );
|
|
|
|
-
|
|
|
|
- geometry.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) );
|
|
|
|
-
|
|
|
|
- // offsets
|
|
|
|
-
|
|
|
|
- var subMeshes = data.subMeshes;
|
|
|
|
-
|
|
|
|
- if ( subMeshes !== null ) {
|
|
|
|
-
|
|
|
|
- for ( var j = 0, jl = subMeshes.length; j < jl; j ++ ) {
|
|
|
|
-
|
|
|
|
- var subMesh = subMeshes[ j ];
|
|
|
|
-
|
|
|
|
- geometry.addDrawCall( subMesh.indexStart, subMesh.indexCount );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- } else {
|
|
|
|
-
|
|
|
|
- geometry.addDrawCall( 0, data.indices.length );
|
|
|
|
|
|
+ if ( data.indices ) {
|
|
|
|
|
|
- }
|
|
|
|
|
|
+ var geometry = this.parseGeometry( data );
|
|
|
|
|
|
object = new THREE.Mesh( geometry, materials[ data.materialId ] );
|
|
object = new THREE.Mesh( geometry, materials[ data.materialId ] );
|
|
|
|
|
|
@@ -188,9 +234,11 @@ THREE.BabylonLoader.prototype = {
|
|
object.name = data.name;
|
|
object.name = data.name;
|
|
object.position.set( data.position[ 0 ], data.position[ 1 ], - data.position[ 2 ] );
|
|
object.position.set( data.position[ 0 ], data.position[ 1 ], - data.position[ 2 ] );
|
|
object.rotation.fromArray( data.rotation );
|
|
object.rotation.fromArray( data.rotation );
|
|
|
|
+ if ( data.rotationQuaternion ) object.quaternion.fromArray( data.rotationQuaternion );
|
|
object.scale.fromArray( data.scaling );
|
|
object.scale.fromArray( data.scaling );
|
|
|
|
+ // object.visible = data.isVisible;
|
|
|
|
|
|
- if ( data.parentId !== undefined && data.parentId !== '' ) {
|
|
|
|
|
|
+ if ( data.parentId ) {
|
|
|
|
|
|
objects[ data.parentId ].add( object );
|
|
objects[ data.parentId ].add( object );
|
|
|
|
|