74 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			74 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								import {
							 | 
						||
| 
								 | 
							
									LineSegments,
							 | 
						||
| 
								 | 
							
									BufferGeometry,
							 | 
						||
| 
								 | 
							
									Float32BufferAttribute,
							 | 
						||
| 
								 | 
							
									LineBasicMaterial
							 | 
						||
| 
								 | 
							
								} from 'three';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class OctreeHelper extends LineSegments {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									constructor( octree, color = 0xffff00 ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										super( new BufferGeometry(), new LineBasicMaterial( { color: color, toneMapped: false } ) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										this.octree = octree;
							 | 
						||
| 
								 | 
							
										this.color = color;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										this.type = 'OctreeHelper';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										this.update();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									update() {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										const vertices = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										function traverse( tree ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											for ( let i = 0; i < tree.length; i ++ ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												const min = tree[ i ].box.min;
							 | 
						||
| 
								 | 
							
												const max = tree[ i ].box.max;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												vertices.push( max.x, max.y, max.z ); vertices.push( min.x, max.y, max.z ); // 0, 1
							 | 
						||
| 
								 | 
							
												vertices.push( min.x, max.y, max.z ); vertices.push( min.x, min.y, max.z ); // 1, 2
							 | 
						||
| 
								 | 
							
												vertices.push( min.x, min.y, max.z ); vertices.push( max.x, min.y, max.z ); // 2, 3
							 | 
						||
| 
								 | 
							
												vertices.push( max.x, min.y, max.z ); vertices.push( max.x, max.y, max.z ); // 3, 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												vertices.push( max.x, max.y, min.z ); vertices.push( min.x, max.y, min.z ); // 4, 5
							 | 
						||
| 
								 | 
							
												vertices.push( min.x, max.y, min.z ); vertices.push( min.x, min.y, min.z ); // 5, 6
							 | 
						||
| 
								 | 
							
												vertices.push( min.x, min.y, min.z ); vertices.push( max.x, min.y, min.z ); // 6, 7
							 | 
						||
| 
								 | 
							
												vertices.push( max.x, min.y, min.z ); vertices.push( max.x, max.y, min.z ); // 7, 4
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												vertices.push( max.x, max.y, max.z ); vertices.push( max.x, max.y, min.z ); // 0, 4
							 | 
						||
| 
								 | 
							
												vertices.push( min.x, max.y, max.z ); vertices.push( min.x, max.y, min.z ); // 1, 5
							 | 
						||
| 
								 | 
							
												vertices.push( min.x, min.y, max.z ); vertices.push( min.x, min.y, min.z ); // 2, 6
							 | 
						||
| 
								 | 
							
												vertices.push( max.x, min.y, max.z ); vertices.push( max.x, min.y, min.z ); // 3, 7
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												traverse( tree[ i ].subTrees );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										traverse( this.octree.subTrees );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										this.geometry.dispose();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										this.geometry = new BufferGeometry();
							 | 
						||
| 
								 | 
							
										this.geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									dispose() {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										this.geometry.dispose();
							 | 
						||
| 
								 | 
							
										this.material.dispose();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export { OctreeHelper };
							 |