Sfoglia il codice sorgente

OBJLoader: Better support point clouds.

Mugen87 4 anni fa
parent
commit
0830808cae
2 ha cambiato i file con 210 aggiunte e 154 eliminazioni
  1. 105 77
      examples/js/loaders/OBJLoader.js
  2. 105 77
      examples/jsm/loaders/OBJLoader.js

+ 105 - 77
examples/js/loaders/OBJLoader.js

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

+ 105 - 77
examples/jsm/loaders/OBJLoader.js

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