EdgesGeometry.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. module( "EdgesGeometry" );
  2. var DEBUG = false;
  3. var vertList = [
  4. new THREE.Vector3(0, 0, 0),
  5. new THREE.Vector3(1, 0, 0),
  6. new THREE.Vector3(1, 1, 0),
  7. new THREE.Vector3(0, 1, 0),
  8. new THREE.Vector3(1, 1, 1),
  9. ];
  10. test( "singularity", function() {
  11. testEdges( vertList, [1, 1, 1], 0 );
  12. });
  13. test( "needle", function() {
  14. testEdges( vertList, [0, 0, 1], 0 );
  15. });
  16. test( "single triangle", function() {
  17. testEdges( vertList, [0, 1, 2], 3 );
  18. });
  19. test( "two isolated triangles", function() {
  20. var vertList = [
  21. new THREE.Vector3(0, 0, 0),
  22. new THREE.Vector3(1, 0, 0),
  23. new THREE.Vector3(1, 1, 0),
  24. new THREE.Vector3(0, 0, 1),
  25. new THREE.Vector3(1, 0, 1),
  26. new THREE.Vector3(1, 1, 1),
  27. ];
  28. testEdges( vertList, [0, 1, 2, 3, 4, 5], 6 );
  29. });
  30. test( "two flat triangles", function() {
  31. testEdges( vertList, [0, 1, 2, 0, 2, 3], 4 );
  32. });
  33. test( "two flat triangles, inverted", function() {
  34. testEdges( vertList, [0, 1, 2, 0, 3, 2], 5 );
  35. });
  36. test( "two non-coplanar triangles", function() {
  37. testEdges( vertList, [0, 1, 2, 0, 4, 2], 5 );
  38. });
  39. test( "three triangles, coplanar first", function() {
  40. testEdges( vertList, [0, 1, 2, 0, 2, 3, 0, 4, 2], 7 );
  41. });
  42. test( "three triangles, coplanar last", function() {
  43. testEdges( vertList, [0, 1, 2, 0, 4, 2, 0, 2, 3], 6 ); // Should be 7
  44. });
  45. test( "tetrahedron", function() {
  46. testEdges( vertList, [0, 1, 2, 0, 1, 4, 0, 4, 2, 1, 2, 4], 6 );
  47. });
  48. //
  49. // HELPERS
  50. //
  51. function testEdges ( vertList, idxList, numAfter ) {
  52. var geoms = createGeometries ( vertList, idxList );
  53. for ( var i = 0 ; i < geoms.length ; i ++ ) {
  54. var geom = geoms[i];
  55. var numBefore = idxList.length;
  56. equal( countEdges (geom), numBefore, "Edges before!" );
  57. var egeom = new THREE.EdgesGeometry( geom );
  58. equal( countEdges (egeom), numAfter, "Edges after!" );
  59. output( geom, egeom );
  60. }
  61. }
  62. function createGeometries ( vertList, idxList ) {
  63. var geomIB = createIndexedBufferGeometry ( vertList, idxList );
  64. var geom = new THREE.Geometry().fromBufferGeometry( geomIB );
  65. var geomB = new THREE.BufferGeometry().fromGeometry( geom );
  66. var geomDC = addDrawCalls( geomIB.clone() );
  67. return [ geom, geomB, geomIB, geomDC ];
  68. }
  69. function createIndexedBufferGeometry ( vertList, idxList ) {
  70. var geom = new THREE.BufferGeometry();
  71. var indexTable = [];
  72. var numTris = idxList.length / 3;
  73. var numVerts = 0;
  74. var indices = new Uint32Array( numTris * 3 );
  75. var vertices = new Float32Array( vertList.length * 3 );
  76. for ( var i = 0; i < numTris; i ++ ) {
  77. for ( var j = 0; j < 3; j ++ ) {
  78. var idx = idxList[ 3 * i + j ];
  79. if ( indexTable[ idx ] === undefined ) {
  80. var v = vertList[ idx ];
  81. vertices[ 3 * numVerts ] = v.x;
  82. vertices[ 3 * numVerts + 1 ] = v.y;
  83. vertices[ 3 * numVerts + 2 ] = v.z;
  84. indexTable[ idx ] = numVerts;
  85. numVerts ++;
  86. }
  87. indices[ 3 * i + j ] = indexTable[ idx ] ;
  88. }
  89. }
  90. vertices = vertices.subarray( 0, 3 * numVerts );
  91. geom.setIndex( new THREE.BufferAttribute( indices, 1 ) );
  92. geom.addAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );
  93. geom.computeFaceNormals();
  94. return geom;
  95. }
  96. function addDrawCalls ( geometry ) {
  97. var numTris = geometry.index.count / 3;
  98. var offset = 0;
  99. for ( var i = 0 ; i < numTris; i ++ ) {
  100. var start = i * 3;
  101. var count = 3;
  102. geometry.addGroup( start, count );
  103. }
  104. return geometry;
  105. }
  106. function countEdges ( geom ) {
  107. if ( geom instanceof THREE.EdgesGeometry ) {
  108. return geom.getAttribute( 'position' ).count / 2;
  109. }
  110. if ( geom.faces !== undefined ) {
  111. return geom.faces.length * 3;
  112. }
  113. var indices = geom.getAttribute( 'index' );
  114. if ( indices !== undefined ) {
  115. return indices.count;
  116. }
  117. return geom.getAttribute( 'position' ).count;
  118. }
  119. //
  120. // DEBUGGING
  121. //
  122. var renderer;
  123. var camera;
  124. var scene = new THREE.Scene();
  125. var xoffset = 0;
  126. function output ( geom, egeom ) {
  127. if ( DEBUG !== true ) return;
  128. if ( !renderer ) initDebug();
  129. var mesh = new THREE.Mesh( geom, undefined );
  130. var edges = new THREE.LineSegments( egeom, new THREE.LineBasicMaterial( { color: 'black' } ) );
  131. mesh.position.setX( xoffset );
  132. edges.position.setX( xoffset ++ );
  133. scene.add(mesh);
  134. scene.add(edges);
  135. if (scene.children.length % 8 === 0) {
  136. xoffset += 2;
  137. }
  138. }
  139. function initDebug () {
  140. renderer = new THREE.WebGLRenderer({
  141. antialias: true
  142. });
  143. var width = 600;
  144. var height = 480;
  145. renderer.setSize(width, height);
  146. renderer.setClearColor( 0xCCCCCC );
  147. camera = new THREE.PerspectiveCamera(45, width / height, 1, 100);
  148. camera.position.x = 30;
  149. camera.position.z = 40;
  150. camera.lookAt(new THREE.Vector3(30, 0, 0));
  151. document.body.appendChild(renderer.domElement);
  152. var controls = new THREE.OrbitControls( camera, renderer.domElement );
  153. controls.target = new THREE.Vector3(30, 0, 0);
  154. animate();
  155. function animate() {
  156. requestAnimationFrame( animate );
  157. controls.update();
  158. renderer.render( scene, camera );
  159. }
  160. }