WireframeGeometry.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import { BufferGeometry } from '../core/BufferGeometry';
  2. import { BufferAttribute } from '../core/BufferAttribute';
  3. /**
  4. * @author mrdoob / http://mrdoob.com/
  5. */
  6. function WireframeGeometry( geometry ) {
  7. BufferGeometry.call( this );
  8. this.type = 'WireframeGeometry';
  9. var edge = [ 0, 0 ], hash = {};
  10. var keys = [ 'a', 'b', 'c' ];
  11. if ( geometry && geometry.isGeometry ) {
  12. var vertices = geometry.vertices;
  13. var faces = geometry.faces;
  14. var numEdges = 0;
  15. // allocate maximal size
  16. var edges = new Uint32Array( 6 * faces.length );
  17. for ( var i = 0, l = faces.length; i < l; i ++ ) {
  18. var face = faces[ i ];
  19. for ( var j = 0; j < 3; j ++ ) {
  20. edge[ 0 ] = face[ keys[ j ] ];
  21. edge[ 1 ] = face[ keys[ ( j + 1 ) % 3 ] ];
  22. edge.sort( sortFunction );
  23. var key = edge.toString();
  24. if ( hash[ key ] === undefined ) {
  25. edges[ 2 * numEdges ] = edge[ 0 ];
  26. edges[ 2 * numEdges + 1 ] = edge[ 1 ];
  27. hash[ key ] = true;
  28. numEdges ++;
  29. }
  30. }
  31. }
  32. var coords = new Float32Array( numEdges * 2 * 3 );
  33. for ( var i = 0, l = numEdges; i < l; i ++ ) {
  34. for ( var j = 0; j < 2; j ++ ) {
  35. var vertex = vertices[ edges [ 2 * i + j ] ];
  36. var index = 6 * i + 3 * j;
  37. coords[ index + 0 ] = vertex.x;
  38. coords[ index + 1 ] = vertex.y;
  39. coords[ index + 2 ] = vertex.z;
  40. }
  41. }
  42. this.addAttribute( 'position', new BufferAttribute( coords, 3 ) );
  43. } else if ( geometry && geometry.isBufferGeometry ) {
  44. if ( geometry.index !== null ) {
  45. // Indexed BufferGeometry
  46. var indices = geometry.index.array;
  47. var vertices = geometry.attributes.position;
  48. var groups = geometry.groups;
  49. var numEdges = 0;
  50. if ( groups.length === 0 ) {
  51. geometry.addGroup( 0, indices.length );
  52. }
  53. // allocate maximal size
  54. var edges = new Uint32Array( 2 * indices.length );
  55. for ( var o = 0, ol = groups.length; o < ol; ++ o ) {
  56. var group = groups[ o ];
  57. var start = group.start;
  58. var count = group.count;
  59. for ( var i = start, il = start + count; i < il; i += 3 ) {
  60. for ( var j = 0; j < 3; j ++ ) {
  61. edge[ 0 ] = indices[ i + j ];
  62. edge[ 1 ] = indices[ i + ( j + 1 ) % 3 ];
  63. edge.sort( sortFunction );
  64. var key = edge.toString();
  65. if ( hash[ key ] === undefined ) {
  66. edges[ 2 * numEdges ] = edge[ 0 ];
  67. edges[ 2 * numEdges + 1 ] = edge[ 1 ];
  68. hash[ key ] = true;
  69. numEdges ++;
  70. }
  71. }
  72. }
  73. }
  74. var coords = new Float32Array( numEdges * 2 * 3 );
  75. for ( var i = 0, l = numEdges; i < l; i ++ ) {
  76. for ( var j = 0; j < 2; j ++ ) {
  77. var index = 6 * i + 3 * j;
  78. var index2 = edges[ 2 * i + j ];
  79. coords[ index + 0 ] = vertices.getX( index2 );
  80. coords[ index + 1 ] = vertices.getY( index2 );
  81. coords[ index + 2 ] = vertices.getZ( index2 );
  82. }
  83. }
  84. this.addAttribute( 'position', new BufferAttribute( coords, 3 ) );
  85. } else {
  86. // non-indexed BufferGeometry
  87. var vertices = geometry.attributes.position.array;
  88. var numEdges = vertices.length / 3;
  89. var numTris = numEdges / 3;
  90. var coords = new Float32Array( numEdges * 2 * 3 );
  91. for ( var i = 0, l = numTris; i < l; i ++ ) {
  92. for ( var j = 0; j < 3; j ++ ) {
  93. var index = 18 * i + 6 * j;
  94. var index1 = 9 * i + 3 * j;
  95. coords[ index + 0 ] = vertices[ index1 ];
  96. coords[ index + 1 ] = vertices[ index1 + 1 ];
  97. coords[ index + 2 ] = vertices[ index1 + 2 ];
  98. var index2 = 9 * i + 3 * ( ( j + 1 ) % 3 );
  99. coords[ index + 3 ] = vertices[ index2 ];
  100. coords[ index + 4 ] = vertices[ index2 + 1 ];
  101. coords[ index + 5 ] = vertices[ index2 + 2 ];
  102. }
  103. }
  104. this.addAttribute( 'position', new BufferAttribute( coords, 3 ) );
  105. }
  106. }
  107. // custom array sort function
  108. function sortFunction( a, b ) {
  109. return a - b;
  110. }
  111. }
  112. WireframeGeometry.prototype = Object.create( BufferGeometry.prototype );
  113. WireframeGeometry.prototype.constructor = WireframeGeometry;
  114. export { WireframeGeometry };
粤ICP备19079148号