WireframeHelper.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. THREE.WireframeHelper = function ( object, hex ) {
  5. var color = ( hex !== undefined ) ? hex : 0xffffff;
  6. var edge = [ 0, 0 ], hash = {};
  7. var sortFunction = function ( a, b ) { return a - b };
  8. var keys = [ 'a', 'b', 'c' ];
  9. var geometry = new THREE.BufferGeometry();
  10. if ( object.geometry instanceof THREE.Geometry ) {
  11. var vertices = object.geometry.vertices;
  12. var faces = object.geometry.faces;
  13. var numEdges = 0;
  14. // allocate maximal size
  15. var edges = new Uint32Array( 6 * faces.length );
  16. for ( var i = 0, l = faces.length; i < l; i ++ ) {
  17. var face = faces[ i ];
  18. for ( var j = 0; j < 3; j ++ ) {
  19. edge[ 0 ] = face[ keys[ j ] ];
  20. edge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];
  21. edge.sort( sortFunction );
  22. var key = edge.toString();
  23. if ( hash[ key ] === undefined ) {
  24. edges[ 2 * numEdges ] = edge[ 0 ];
  25. edges[ 2 * numEdges + 1 ] = edge[ 1 ];
  26. hash[ key ] = true;
  27. numEdges ++;
  28. }
  29. }
  30. }
  31. var coords = new Float32Array( numEdges * 2 * 3 );
  32. for ( var i = 0, l = numEdges; i < l; i ++ ) {
  33. for ( var j = 0; j < 2; j ++ ) {
  34. var vertex = vertices[ edges [ 2 * i + j] ];
  35. var index = 6 * i + 3 * j;
  36. coords[ index + 0 ] = vertex.x;
  37. coords[ index + 1 ] = vertex.y;
  38. coords[ index + 2 ] = vertex.z;
  39. }
  40. }
  41. geometry.addAttribute( 'position', new THREE.BufferAttribute( coords, 3 ) );
  42. } else if ( object.geometry instanceof THREE.BufferGeometry && object.geometry.attributes.index !== undefined ) { // Indexed BufferGeometry
  43. var vertices = object.geometry.attributes.position.array;
  44. var indices = object.geometry.attributes.index.array;
  45. var offsets = object.geometry.offsets;
  46. var numEdges = 0;
  47. // allocate maximal size
  48. var edges = new Uint32Array( 2 * indices.length );
  49. for ( var o = 0, ol = offsets.length; o < ol; ++ o ) {
  50. var start = offsets[ o ].start;
  51. var count = offsets[ o ].count;
  52. var index = offsets[ o ].index;
  53. for ( var i = start, il = start + count; i < il; i += 3 ) {
  54. for ( var j = 0; j < 3; j ++ ) {
  55. edge[ 0 ] = index + indices[ i + j ];
  56. edge[ 1 ] = index + indices[ i + ( j + 1 ) % 3 ];
  57. edge.sort( sortFunction );
  58. var key = edge.toString();
  59. if ( hash[ key ] === undefined ) {
  60. edges[ 2 * numEdges ] = edge[ 0 ];
  61. edges[ 2 * numEdges + 1 ] = edge[ 1 ];
  62. hash[ key ] = true;
  63. numEdges ++;
  64. }
  65. }
  66. }
  67. }
  68. var coords = new Float32Array( numEdges * 2 * 3 );
  69. for ( var i = 0, l = numEdges; i < l; i ++ ) {
  70. for ( var j = 0; j < 2; j ++ ) {
  71. var index = 6 * i + 3 * j;
  72. var index2 = 3 * edges[ 2 * i + j];
  73. coords[ index + 0 ] = vertices[ index2 ];
  74. coords[ index + 1 ] = vertices[ index2 + 1 ];
  75. coords[ index + 2 ] = vertices[ index2 + 2 ];
  76. }
  77. }
  78. geometry.addAttribute( 'position', new THREE.BufferAttribute( coords, 3 ) );
  79. } else if ( object.geometry instanceof THREE.BufferGeometry ) { // non-indexed BufferGeometry
  80. var vertices = object.geometry.attributes.position.array;
  81. var numEdges = vertices.length / 3;
  82. var numTris = numEdges / 3;
  83. var coords = new Float32Array( numEdges * 2 * 3 );
  84. for ( var i = 0, l = numTris; i < l; i ++ ) {
  85. for ( var j = 0; j < 3; j ++ ) {
  86. var index = 18 * i + 6 * j;
  87. var index1 = 9 * i + 3 * j;
  88. coords[ index + 0 ] = vertices[ index1 ];
  89. coords[ index + 1 ] = vertices[ index1 + 1 ];
  90. coords[ index + 2 ] = vertices[ index1 + 2 ];
  91. var index2 = 9 * i + 3 * ( ( j + 1 ) % 3 );
  92. coords[ index + 3 ] = vertices[ index2 ];
  93. coords[ index + 4 ] = vertices[ index2 + 1 ];
  94. coords[ index + 5 ] = vertices[ index2 + 2 ];
  95. }
  96. }
  97. geometry.addAttribute( 'position', new THREE.BufferAttribute( coords, 3 ) );
  98. }
  99. THREE.Line.call( this, geometry, new THREE.LineBasicMaterial( { color: color } ), THREE.LinePieces );
  100. this.matrixAutoUpdate = false;
  101. this.matrixWorld = object.matrixWorld;
  102. };
  103. THREE.WireframeHelper.prototype = Object.create( THREE.Line.prototype );