107 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			107 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								import {
							 | 
						||
| 
								 | 
							
									BufferGeometry,
							 | 
						||
| 
								 | 
							
									Color,
							 | 
						||
| 
								 | 
							
									FileLoader,
							 | 
						||
| 
								 | 
							
									Float32BufferAttribute,
							 | 
						||
| 
								 | 
							
									Loader
							 | 
						||
| 
								 | 
							
								} from 'three';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class XYZLoader extends Loader {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									load( url, onLoad, onProgress, onError ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										const scope = this;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										const loader = new FileLoader( this.manager );
							 | 
						||
| 
								 | 
							
										loader.setPath( this.path );
							 | 
						||
| 
								 | 
							
										loader.setRequestHeader( this.requestHeader );
							 | 
						||
| 
								 | 
							
										loader.setWithCredentials( this.withCredentials );
							 | 
						||
| 
								 | 
							
										loader.load( url, function ( text ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											try {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												onLoad( scope.parse( text ) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											} catch ( e ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( onError ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													onError( e );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												} else {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													console.error( e );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												scope.manager.itemError( url );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										}, onProgress, onError );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									parse( text ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										const lines = text.split( '\n' );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										const vertices = [];
							 | 
						||
| 
								 | 
							
										const colors = [];
							 | 
						||
| 
								 | 
							
										const color = new Color();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										for ( let line of lines ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											line = line.trim();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											if ( line.charAt( 0 ) === '#' ) continue; // skip comments
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											const lineValues = line.split( /\s+/ );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											if ( lineValues.length === 3 ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												// XYZ
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												vertices.push( parseFloat( lineValues[ 0 ] ) );
							 | 
						||
| 
								 | 
							
												vertices.push( parseFloat( lineValues[ 1 ] ) );
							 | 
						||
| 
								 | 
							
												vertices.push( parseFloat( lineValues[ 2 ] ) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											if ( lineValues.length === 6 ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												// XYZRGB
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												vertices.push( parseFloat( lineValues[ 0 ] ) );
							 | 
						||
| 
								 | 
							
												vertices.push( parseFloat( lineValues[ 1 ] ) );
							 | 
						||
| 
								 | 
							
												vertices.push( parseFloat( lineValues[ 2 ] ) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												const r = parseFloat( lineValues[ 3 ] ) / 255;
							 | 
						||
| 
								 | 
							
												const g = parseFloat( lineValues[ 4 ] ) / 255;
							 | 
						||
| 
								 | 
							
												const b = parseFloat( lineValues[ 5 ] ) / 255;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												color.set( r, g, b ).convertSRGBToLinear();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												colors.push( color.r, color.g, color.b );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										const geometry = new BufferGeometry();
							 | 
						||
| 
								 | 
							
										geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if ( colors.length > 0 ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return geometry;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export { XYZLoader };
							 |