|
@@ -64,7 +64,7 @@ THREE.CTMLoader.prototype.loadParts = function( url, callback, parameters ) {
|
|
|
// load joined CTM file
|
|
|
|
|
|
var partUrl = basePath + jsonObject.data;
|
|
|
- var parametersPart = { useWorker: parameters.useWorker, useBuffers: parameters.useBuffers, offsets: jsonObject.offsets };
|
|
|
+ var parametersPart = { useWorker: parameters.useWorker, offsets: jsonObject.offsets };
|
|
|
scope.load( partUrl, callbackFinal, parametersPart );
|
|
|
|
|
|
}
|
|
@@ -91,7 +91,6 @@ THREE.CTMLoader.prototype.load = function( url, callback, parameters ) {
|
|
|
var scope = this;
|
|
|
|
|
|
var offsets = parameters.offsets !== undefined ? parameters.offsets : [ 0 ];
|
|
|
- var useBuffers = parameters.useBuffers !== undefined ? parameters.useBuffers : true;
|
|
|
|
|
|
var xhr = new XMLHttpRequest(),
|
|
|
callbackProgress = null;
|
|
@@ -123,15 +122,7 @@ THREE.CTMLoader.prototype.load = function( url, callback, parameters ) {
|
|
|
var e1 = Date.now();
|
|
|
// console.log( "CTM data parse time [worker]: " + (e1-s) + " ms" );
|
|
|
|
|
|
- if ( useBuffers ) {
|
|
|
-
|
|
|
- scope.createModelBuffers( ctmFile, callback );
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- scope.createModelClassic( ctmFile, callback );
|
|
|
-
|
|
|
- }
|
|
|
+ scope.createModel( ctmFile, callback );
|
|
|
|
|
|
var e = Date.now();
|
|
|
console.log( "model load time [worker]: " + (e-e1) + " ms, total: " + (e-s));
|
|
@@ -152,15 +143,7 @@ THREE.CTMLoader.prototype.load = function( url, callback, parameters ) {
|
|
|
|
|
|
var ctmFile = new CTM.File( stream );
|
|
|
|
|
|
- if ( useBuffers ) {
|
|
|
-
|
|
|
- scope.createModelBuffers( ctmFile, callback );
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- scope.createModelClassic( ctmFile, callback );
|
|
|
-
|
|
|
- }
|
|
|
+ scope.createModel( ctmFile, callback );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -205,16 +188,14 @@ THREE.CTMLoader.prototype.load = function( url, callback, parameters ) {
|
|
|
};
|
|
|
|
|
|
|
|
|
-THREE.CTMLoader.prototype.createModelBuffers = function ( file, callback ) {
|
|
|
+THREE.CTMLoader.prototype.createModel = function ( file, callback ) {
|
|
|
|
|
|
var Model = function ( ) {
|
|
|
|
|
|
- var scope = this;
|
|
|
-
|
|
|
- scope.materials = [];
|
|
|
-
|
|
|
THREE.BufferGeometry.call( this );
|
|
|
|
|
|
+ this.materials = [];
|
|
|
+
|
|
|
// init GL buffers
|
|
|
var vertexIndexArray = file.body.indices,
|
|
|
vertexPositionArray = file.body.vertices,
|
|
@@ -230,20 +211,18 @@ THREE.CTMLoader.prototype.createModelBuffers = function ( file, callback ) {
|
|
|
vertexColorArray = file.body.attrMaps[ 0 ].attr;
|
|
|
}
|
|
|
|
|
|
- // attributes
|
|
|
- var attributes = scope.attributes;
|
|
|
-
|
|
|
- attributes[ "index" ] = { itemSize: 1, array: vertexIndexArray };
|
|
|
- attributes[ "position" ] = { itemSize: 3, array: vertexPositionArray };
|
|
|
+ this.addAttribute( 'index', vertexIndexArray, 1 );
|
|
|
+ this.addAttribute( 'position', vertexPositionArray, 3 );
|
|
|
|
|
|
if ( vertexNormalArray !== undefined )
|
|
|
- attributes[ "normal" ] = { itemSize: 3, array: vertexNormalArray };
|
|
|
+ this.addAttribute( 'normal', vertexNormalArray, 3 );
|
|
|
|
|
|
if ( vertexUvArray !== undefined )
|
|
|
- attributes[ "uv" ] = { itemSize: 2, array: vertexUvArray };
|
|
|
+ this.addAttribute( 'uv', vertexUvArray, 2 );
|
|
|
|
|
|
if ( vertexColorArray !== undefined )
|
|
|
- attributes[ "color" ] = { itemSize: 4, array: vertexColorArray };
|
|
|
+ this.addAttribute( 'color', vertexColorArray, 4 );
|
|
|
+
|
|
|
}
|
|
|
|
|
|
Model.prototype = Object.create( THREE.BufferGeometry.prototype );
|
|
@@ -259,219 +238,4 @@ THREE.CTMLoader.prototype.createModelBuffers = function ( file, callback ) {
|
|
|
|
|
|
callback( geometry );
|
|
|
|
|
|
-};
|
|
|
-
|
|
|
-THREE.CTMLoader.prototype.createModelClassic = function ( file, callback ) {
|
|
|
-
|
|
|
- var Model = function ( ) {
|
|
|
-
|
|
|
- var scope = this;
|
|
|
-
|
|
|
- scope.materials = [];
|
|
|
-
|
|
|
- THREE.Geometry.call( this );
|
|
|
-
|
|
|
- var normals = [],
|
|
|
- uvs = [],
|
|
|
- colors = [];
|
|
|
-
|
|
|
- init_vertices( file.body.vertices );
|
|
|
-
|
|
|
- if ( file.body.normals !== undefined )
|
|
|
- init_normals( file.body.normals );
|
|
|
-
|
|
|
- if ( file.body.uvMaps !== undefined && file.body.uvMaps.length > 0 )
|
|
|
- init_uvs( file.body.uvMaps[ 0 ].uv );
|
|
|
-
|
|
|
- if ( file.body.attrMaps !== undefined && file.body.attrMaps.length > 0 && file.body.attrMaps[ 0 ].name === "Color" )
|
|
|
- init_colors( file.body.attrMaps[ 0 ].attr );
|
|
|
-
|
|
|
- var hasNormals = normals.length > 0 ? true : false,
|
|
|
- hasUvs = uvs.length > 0 ? true : false,
|
|
|
- hasColors = colors.length > 0 ? true : false;
|
|
|
-
|
|
|
- init_faces( file.body.indices );
|
|
|
-
|
|
|
- this.computeCentroids();
|
|
|
- this.computeFaceNormals();
|
|
|
- //this.computeTangents();
|
|
|
-
|
|
|
- function init_vertices( buffer ) {
|
|
|
-
|
|
|
- var x, y, z, i, il = buffer.length;
|
|
|
-
|
|
|
- for( i = 0; i < il; i += 3 ) {
|
|
|
-
|
|
|
- x = buffer[ i ];
|
|
|
- y = buffer[ i + 1 ];
|
|
|
- z = buffer[ i + 2 ];
|
|
|
-
|
|
|
- vertex( scope, x, y, z );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- };
|
|
|
-
|
|
|
- function init_normals( buffer ) {
|
|
|
-
|
|
|
- var x, y, z, i, il = buffer.length;
|
|
|
-
|
|
|
- for( i = 0; i < il; i += 3 ) {
|
|
|
-
|
|
|
- x = buffer[ i ];
|
|
|
- y = buffer[ i + 1 ];
|
|
|
- z = buffer[ i + 2 ];
|
|
|
-
|
|
|
- normals.push( x, y, z );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- };
|
|
|
-
|
|
|
- function init_colors( buffer ) {
|
|
|
-
|
|
|
- var r, g, b, a, i, il = buffer.length;
|
|
|
-
|
|
|
- for( i = 0; i < il; i += 4 ) {
|
|
|
-
|
|
|
- r = buffer[ i ];
|
|
|
- g = buffer[ i + 1 ];
|
|
|
- b = buffer[ i + 2 ];
|
|
|
- a = buffer[ i + 3 ];
|
|
|
-
|
|
|
- var color = new THREE.Color();
|
|
|
- color.setRGB( r, g, b );
|
|
|
-
|
|
|
- colors.push( color );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- };
|
|
|
-
|
|
|
-
|
|
|
- function init_uvs( buffer ) {
|
|
|
-
|
|
|
- var u, v, i, il = buffer.length;
|
|
|
-
|
|
|
- for( i = 0; i < il; i += 2 ) {
|
|
|
-
|
|
|
- u = buffer[ i ];
|
|
|
- v = buffer[ i + 1 ];
|
|
|
-
|
|
|
- uvs.push( u, v );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- };
|
|
|
-
|
|
|
- function init_faces( buffer ) {
|
|
|
-
|
|
|
- var a, b, c,
|
|
|
- u1, v1, u2, v2, u3, v3,
|
|
|
- m, face,
|
|
|
- i, il = buffer.length;
|
|
|
-
|
|
|
- m = 0; // all faces defaulting to material 0
|
|
|
-
|
|
|
- for( i = 0; i < il; i += 3 ) {
|
|
|
-
|
|
|
- a = buffer[ i ];
|
|
|
- b = buffer[ i + 1 ];
|
|
|
- c = buffer[ i + 2 ];
|
|
|
-
|
|
|
- if ( hasNormals ){
|
|
|
-
|
|
|
- face = f3n( scope, normals, a, b, c, m, a, b, c );
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- face = f3( scope, a, b, c, m );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if ( hasColors ) {
|
|
|
-
|
|
|
- face.vertexColors[ 0 ] = colors[ a ];
|
|
|
- face.vertexColors[ 1 ] = colors[ b ];
|
|
|
- face.vertexColors[ 2 ] = colors[ c ];
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if ( hasUvs ) {
|
|
|
-
|
|
|
- u1 = uvs[ a * 2 ];
|
|
|
- v1 = uvs[ a * 2 + 1 ];
|
|
|
-
|
|
|
- u2 = uvs[ b * 2 ];
|
|
|
- v2 = uvs[ b * 2 + 1 ];
|
|
|
-
|
|
|
- u3 = uvs[ c * 2 ];
|
|
|
- v3 = uvs[ c * 2 + 1 ];
|
|
|
-
|
|
|
- uv3( scope.faceVertexUvs[ 0 ], u1, v1, u2, v2, u3, v3 );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- };
|
|
|
-
|
|
|
- function vertex ( scope, x, y, z ) {
|
|
|
-
|
|
|
- scope.vertices.push( new THREE.Vector3( x, y, z ) );
|
|
|
-
|
|
|
- };
|
|
|
-
|
|
|
- function f3 ( scope, a, b, c, mi ) {
|
|
|
-
|
|
|
- var face = new THREE.Face3( a, b, c, null, null, mi );
|
|
|
-
|
|
|
- scope.faces.push( face );
|
|
|
-
|
|
|
- return face;
|
|
|
-
|
|
|
- };
|
|
|
-
|
|
|
- function f3n ( scope, normals, a, b, c, mi, nai, nbi, nci ) {
|
|
|
-
|
|
|
- var nax = normals[ nai * 3 ],
|
|
|
- nay = normals[ nai * 3 + 1 ],
|
|
|
- naz = normals[ nai * 3 + 2 ],
|
|
|
-
|
|
|
- nbx = normals[ nbi * 3 ],
|
|
|
- nby = normals[ nbi * 3 + 1 ],
|
|
|
- nbz = normals[ nbi * 3 + 2 ],
|
|
|
-
|
|
|
- ncx = normals[ nci * 3 ],
|
|
|
- ncy = normals[ nci * 3 + 1 ],
|
|
|
- ncz = normals[ nci * 3 + 2 ];
|
|
|
-
|
|
|
- var na = new THREE.Vector3( nax, nay, naz ),
|
|
|
- nb = new THREE.Vector3( nbx, nby, nbz ),
|
|
|
- nc = new THREE.Vector3( ncx, ncy, ncz );
|
|
|
-
|
|
|
- var face = new THREE.Face3( a, b, c, [ na, nb, nc ], null, mi );
|
|
|
-
|
|
|
- scope.faces.push( face );
|
|
|
-
|
|
|
- return face;
|
|
|
-
|
|
|
- };
|
|
|
-
|
|
|
- function uv3 ( where, u1, v1, u2, v2, u3, v3 ) {
|
|
|
-
|
|
|
- var uv = [];
|
|
|
- uv.push( new THREE.Vector2( u1, v1 ) );
|
|
|
- uv.push( new THREE.Vector2( u2, v2 ) );
|
|
|
- uv.push( new THREE.Vector2( u3, v3 ) );
|
|
|
- where.push( uv );
|
|
|
-
|
|
|
- };
|
|
|
-
|
|
|
- Model.prototype = Object.create( THREE.Geometry.prototype );
|
|
|
-
|
|
|
- callback( new Model() );
|
|
|
-
|
|
|
-};
|
|
|
+};
|