|
@@ -375,7 +375,10 @@ THREE.OBJLoader = ( function () {
|
|
|
|
|
|
for ( var vi = 0, l = vertices.length; vi < l; vi ++ ) {
|
|
|
|
|
|
- this.addVertexPoint( this.parseVertexIndex( vertices[ vi ], vLen ) );
|
|
|
+ var index = this.parseVertexIndex( vertices[ vi ], vLen );
|
|
|
+
|
|
|
+ this.addVertexPoint( index );
|
|
|
+ this.addColor( index );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -708,147 +711,181 @@ THREE.OBJLoader = ( function () {
|
|
|
var container = new THREE.Group();
|
|
|
container.materialLibraries = [].concat( state.materialLibraries );
|
|
|
|
|
|
- for ( var i = 0, l = state.objects.length; i < l; i ++ ) {
|
|
|
+ var hasPrimitives = ! ( state.objects.length === 1 && state.objects[ 0 ].geometry.vertices.length === 0 );
|
|
|
|
|
|
- var object = state.objects[ i ];
|
|
|
- var geometry = object.geometry;
|
|
|
- var materials = object.materials;
|
|
|
- var isLine = ( geometry.type === 'Line' );
|
|
|
- var isPoints = ( geometry.type === 'Points' );
|
|
|
- var hasVertexColors = false;
|
|
|
+ if ( hasPrimitives === true ) {
|
|
|
|
|
|
- // Skip o/g line declarations that did not follow with any faces
|
|
|
- if ( geometry.vertices.length === 0 ) continue;
|
|
|
+ for ( var i = 0, l = state.objects.length; i < l; i ++ ) {
|
|
|
|
|
|
- var buffergeometry = new THREE.BufferGeometry();
|
|
|
+ var object = state.objects[ i ];
|
|
|
+ var geometry = object.geometry;
|
|
|
+ var materials = object.materials;
|
|
|
+ var isLine = ( geometry.type === 'Line' );
|
|
|
+ var isPoints = ( geometry.type === 'Points' );
|
|
|
+ var hasVertexColors = false;
|
|
|
|
|
|
- buffergeometry.setAttribute( 'position', new THREE.Float32BufferAttribute( geometry.vertices, 3 ) );
|
|
|
+ // Skip o/g line declarations that did not follow with any faces
|
|
|
+ if ( geometry.vertices.length === 0 ) continue;
|
|
|
|
|
|
- buffergeometry.setAttribute( 'normal', new THREE.Float32BufferAttribute( geometry.normals, 3 ) );
|
|
|
+ var buffergeometry = new THREE.BufferGeometry();
|
|
|
|
|
|
- if ( geometry.colors.length > 0 ) {
|
|
|
+ buffergeometry.setAttribute( 'position', new THREE.Float32BufferAttribute( geometry.vertices, 3 ) );
|
|
|
|
|
|
- hasVertexColors = true;
|
|
|
- buffergeometry.setAttribute( 'color', new THREE.Float32BufferAttribute( geometry.colors, 3 ) );
|
|
|
+ if ( geometry.normals.length > 0 ) {
|
|
|
|
|
|
- }
|
|
|
+ buffergeometry.setAttribute( 'normal', new THREE.Float32BufferAttribute( geometry.normals, 3 ) );
|
|
|
|
|
|
- if ( geometry.hasUVIndices === true ) {
|
|
|
+ }
|
|
|
|
|
|
- buffergeometry.setAttribute( 'uv', new THREE.Float32BufferAttribute( geometry.uvs, 2 ) );
|
|
|
+ if ( geometry.colors.length > 0 ) {
|
|
|
|
|
|
- }
|
|
|
+ hasVertexColors = true;
|
|
|
+ buffergeometry.setAttribute( 'color', new THREE.Float32BufferAttribute( geometry.colors, 3 ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( geometry.hasUVIndices === true ) {
|
|
|
|
|
|
- // Create materials
|
|
|
+ buffergeometry.setAttribute( 'uv', new THREE.Float32BufferAttribute( geometry.uvs, 2 ) );
|
|
|
|
|
|
- var createdMaterials = [];
|
|
|
+ }
|
|
|
+
|
|
|
+ // Create materials
|
|
|
|
|
|
- for ( var mi = 0, miLen = materials.length; mi < miLen; mi ++ ) {
|
|
|
+ var createdMaterials = [];
|
|
|
|
|
|
- var sourceMaterial = materials[ mi ];
|
|
|
- var materialHash = sourceMaterial.name + '_' + sourceMaterial.smooth + '_' + hasVertexColors;
|
|
|
- var material = state.materials[ materialHash ];
|
|
|
+ for ( var mi = 0, miLen = materials.length; mi < miLen; mi ++ ) {
|
|
|
|
|
|
- if ( this.materials !== null ) {
|
|
|
+ var sourceMaterial = materials[ mi ];
|
|
|
+ var materialHash = sourceMaterial.name + '_' + sourceMaterial.smooth + '_' + hasVertexColors;
|
|
|
+ var material = state.materials[ materialHash ];
|
|
|
|
|
|
- material = this.materials.create( sourceMaterial.name );
|
|
|
+ if ( this.materials !== null ) {
|
|
|
|
|
|
- // mtl etc. loaders probably can't create line materials correctly, copy properties to a line material.
|
|
|
- if ( isLine && material && ! ( material instanceof THREE.LineBasicMaterial ) ) {
|
|
|
+ material = this.materials.create( sourceMaterial.name );
|
|
|
|
|
|
- var materialLine = new THREE.LineBasicMaterial();
|
|
|
- THREE.Material.prototype.copy.call( materialLine, material );
|
|
|
- materialLine.color.copy( material.color );
|
|
|
- material = materialLine;
|
|
|
+ // mtl etc. loaders probably can't create line materials correctly, copy properties to a line material.
|
|
|
+ if ( isLine && material && ! ( material instanceof THREE.LineBasicMaterial ) ) {
|
|
|
|
|
|
- } else if ( isPoints && material && ! ( material instanceof THREE.PointsMaterial ) ) {
|
|
|
+ var materialLine = new THREE.LineBasicMaterial();
|
|
|
+ THREE.Material.prototype.copy.call( materialLine, material );
|
|
|
+ materialLine.color.copy( material.color );
|
|
|
+ material = materialLine;
|
|
|
|
|
|
- var materialPoints = new THREE.PointsMaterial( { size: 10, sizeAttenuation: false } );
|
|
|
- THREE.Material.prototype.copy.call( materialPoints, material );
|
|
|
- materialPoints.color.copy( material.color );
|
|
|
- materialPoints.map = material.map;
|
|
|
- material = materialPoints;
|
|
|
+ } else if ( isPoints && material && ! ( material instanceof THREE.PointsMaterial ) ) {
|
|
|
+
|
|
|
+ var materialPoints = new THREE.PointsMaterial( { size: 10, sizeAttenuation: false } );
|
|
|
+ THREE.Material.prototype.copy.call( materialPoints, material );
|
|
|
+ materialPoints.color.copy( material.color );
|
|
|
+ materialPoints.map = material.map;
|
|
|
+ material = materialPoints;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
- }
|
|
|
+ if ( material === undefined ) {
|
|
|
|
|
|
- if ( material === undefined ) {
|
|
|
+ if ( isLine ) {
|
|
|
|
|
|
- if ( isLine ) {
|
|
|
+ material = new THREE.LineBasicMaterial();
|
|
|
|
|
|
- material = new THREE.LineBasicMaterial();
|
|
|
+ } else if ( isPoints ) {
|
|
|
|
|
|
- } else if ( isPoints ) {
|
|
|
+ material = new THREE.PointsMaterial( { size: 1, sizeAttenuation: false } );
|
|
|
|
|
|
- material = new THREE.PointsMaterial( { size: 1, sizeAttenuation: false } );
|
|
|
+ } else {
|
|
|
|
|
|
- } else {
|
|
|
+ material = new THREE.MeshPhongMaterial();
|
|
|
|
|
|
- material = new THREE.MeshPhongMaterial();
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
+ material.name = sourceMaterial.name;
|
|
|
+ material.flatShading = sourceMaterial.smooth ? false : true;
|
|
|
+ material.vertexColors = hasVertexColors;
|
|
|
|
|
|
- material.name = sourceMaterial.name;
|
|
|
- material.flatShading = sourceMaterial.smooth ? false : true;
|
|
|
- material.vertexColors = hasVertexColors;
|
|
|
+ state.materials[ materialHash ] = material;
|
|
|
|
|
|
- state.materials[ materialHash ] = material;
|
|
|
+ }
|
|
|
+
|
|
|
+ createdMaterials.push( material );
|
|
|
|
|
|
}
|
|
|
|
|
|
- createdMaterials.push( material );
|
|
|
+ // Create mesh
|
|
|
|
|
|
- }
|
|
|
+ var mesh;
|
|
|
|
|
|
- // Create mesh
|
|
|
+ if ( createdMaterials.length > 1 ) {
|
|
|
|
|
|
- var mesh;
|
|
|
+ for ( var mi = 0, miLen = materials.length; mi < miLen; mi ++ ) {
|
|
|
|
|
|
- if ( createdMaterials.length > 1 ) {
|
|
|
+ var sourceMaterial = materials[ mi ];
|
|
|
+ buffergeometry.addGroup( sourceMaterial.groupStart, sourceMaterial.groupCount, mi );
|
|
|
|
|
|
- for ( var mi = 0, miLen = materials.length; mi < miLen; mi ++ ) {
|
|
|
+ }
|
|
|
|
|
|
- var sourceMaterial = materials[ mi ];
|
|
|
- buffergeometry.addGroup( sourceMaterial.groupStart, sourceMaterial.groupCount, mi );
|
|
|
+ if ( isLine ) {
|
|
|
|
|
|
- }
|
|
|
+ mesh = new THREE.LineSegments( buffergeometry, createdMaterials );
|
|
|
|
|
|
- if ( isLine ) {
|
|
|
+ } else if ( isPoints ) {
|
|
|
|
|
|
- mesh = new THREE.LineSegments( buffergeometry, createdMaterials );
|
|
|
+ mesh = new THREE.Points( buffergeometry, createdMaterials );
|
|
|
|
|
|
- } else if ( isPoints ) {
|
|
|
+ } else {
|
|
|
|
|
|
- mesh = new THREE.Points( buffergeometry, createdMaterials );
|
|
|
+ mesh = new THREE.Mesh( buffergeometry, createdMaterials );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- mesh = new THREE.Mesh( buffergeometry, createdMaterials );
|
|
|
+ if ( isLine ) {
|
|
|
|
|
|
- }
|
|
|
+ mesh = new THREE.LineSegments( buffergeometry, createdMaterials[ 0 ] );
|
|
|
|
|
|
- } else {
|
|
|
+ } else if ( isPoints ) {
|
|
|
|
|
|
- if ( isLine ) {
|
|
|
+ mesh = new THREE.Points( buffergeometry, createdMaterials[ 0 ] );
|
|
|
|
|
|
- mesh = new THREE.LineSegments( buffergeometry, createdMaterials[ 0 ] );
|
|
|
+ } else {
|
|
|
|
|
|
- } else if ( isPoints ) {
|
|
|
+ mesh = new THREE.Mesh( buffergeometry, createdMaterials[ 0 ] );
|
|
|
|
|
|
- mesh = new THREE.Points( buffergeometry, createdMaterials[ 0 ] );
|
|
|
+ }
|
|
|
|
|
|
- } else {
|
|
|
+ }
|
|
|
|
|
|
- mesh = new THREE.Mesh( buffergeometry, createdMaterials[ 0 ] );
|
|
|
+ mesh.name = object.name;
|
|
|
|
|
|
- }
|
|
|
+ container.add( mesh );
|
|
|
|
|
|
}
|
|
|
|
|
|
- mesh.name = object.name;
|
|
|
+ } else {
|
|
|
+
|
|
|
+ // if there is only the default parser state object with no geometry data, interpret data as point cloud
|
|
|
+
|
|
|
+ if ( state.vertices.length > 0 ) {
|
|
|
+
|
|
|
+ var material = new THREE.PointsMaterial( { size: 1, sizeAttenuation: false } );
|
|
|
+
|
|
|
+ var buffergeometry = new THREE.BufferGeometry();
|
|
|
+
|
|
|
+ buffergeometry.setAttribute( 'position', new THREE.Float32BufferAttribute( state.vertices, 3 ) );
|
|
|
|
|
|
- container.add( mesh );
|
|
|
+ if ( state.colors.length > 0 && state.colors[ 0 ] !== undefined ) {
|
|
|
+
|
|
|
+ buffergeometry.setAttribute( 'color', new THREE.Float32BufferAttribute( state.colors, 3 ) );
|
|
|
+ material.vertexColors = true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ var points = new THREE.Points( buffergeometry, material );
|
|
|
+ container.add( points );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|