mirror of
https://github.com/Doodle3D/Doodle3D-Slicer.git
synced 2024-12-25 12:23:49 +01:00
259 lines
4.8 KiB
JavaScript
Executable File
259 lines
4.8 KiB
JavaScript
Executable File
/**
|
|
* @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 ) ) );
|
|
|
|
}, onProgress, onError );
|
|
|
|
},
|
|
|
|
setCrossOrigin: function ( value ) {
|
|
|
|
this.crossOrigin = value;
|
|
|
|
},
|
|
|
|
parse: function ( json ) {
|
|
|
|
var materials = this.parseMaterials( json );
|
|
var scene = this.parseObjects( json, materials );
|
|
|
|
return scene;
|
|
|
|
},
|
|
|
|
parseMaterials: function ( json ) {
|
|
|
|
var materials = {};
|
|
|
|
for ( var i = 0, l = json.materials.length; i < l; i ++ ) {
|
|
|
|
var data = json.materials[ i ];
|
|
|
|
var material = new THREE.MeshPhongMaterial();
|
|
material.name = data.name;
|
|
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;
|
|
|
|
}
|
|
|
|
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;
|
|
|
|
},
|
|
|
|
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 ) {
|
|
|
|
var objects = {};
|
|
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;
|
|
|
|
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:
|
|
light = new THREE.SpotLight();
|
|
break;
|
|
|
|
case 3:
|
|
light = new THREE.HemisphereLight();
|
|
break;
|
|
}
|
|
|
|
light.name = data.name;
|
|
light.position.set( data.position[ 0 ], data.position[ 1 ], - data.position[ 2 ] );
|
|
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 ) {
|
|
|
|
var geometry = this.parseGeometry( data );
|
|
|
|
object = new THREE.Mesh( geometry, materials[ data.materialId ] );
|
|
|
|
} else {
|
|
|
|
object = new THREE.Group();
|
|
|
|
}
|
|
|
|
object.name = data.name;
|
|
object.position.set( data.position[ 0 ], data.position[ 1 ], - data.position[ 2 ] );
|
|
object.rotation.fromArray( data.rotation );
|
|
if ( data.rotationQuaternion ) object.quaternion.fromArray( data.rotationQuaternion );
|
|
object.scale.fromArray( data.scaling );
|
|
// object.visible = data.isVisible;
|
|
|
|
if ( data.parentId ) {
|
|
|
|
objects[ data.parentId ].add( object );
|
|
|
|
} else {
|
|
|
|
scene.add( object );
|
|
|
|
}
|
|
|
|
objects[ data.id ] = object;
|
|
|
|
}
|
|
|
|
return scene;
|
|
|
|
}
|
|
|
|
};
|