BufferGeometryUtils.tests.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /**
  2. * @author Don McCurdy / https://www.donmccurdy.com
  3. */
  4. /* global QUnit */
  5. import { BufferGeometryUtils } from '../../../../examples/jsm/utils/BufferGeometryUtils';
  6. import { BufferAttribute } from '../../../../src/core/BufferAttribute';
  7. import { BufferGeometry } from '../../../../src/core/BufferGeometry';
  8. import { TriangleStripDrawMode, TriangleFanDrawMode } from '../../../../src/constants';
  9. export default QUnit.module( 'Utils', () => {
  10. QUnit.module( 'BufferGeometryUtils', () => {
  11. QUnit.test( 'mergeBufferAttributes - basic', ( assert ) => {
  12. var array1 = new Float32Array( [ 1, 2, 3, 4 ] );
  13. var attr1 = new BufferAttribute( array1, 2, false );
  14. var array2 = new Float32Array( [ 5, 6, 7, 8 ] );
  15. var attr2 = new BufferAttribute( array2, 2, false );
  16. var mergedAttr = BufferGeometryUtils.mergeBufferAttributes( [ attr1, attr2 ] );
  17. assert.smartEqual( Array.from( mergedAttr.array ), [ 1, 2, 3, 4, 5, 6, 7, 8 ], 'merges elements' );
  18. assert.equal( mergedAttr.itemSize, 2, 'retains .itemSize' );
  19. assert.equal( mergedAttr.normalized, false, 'retains .normalized' );
  20. } );
  21. QUnit.test( 'mergeBufferAttributes - invalid', ( assert ) => {
  22. var array1 = new Float32Array( [ 1, 2, 3, 4 ] );
  23. var attr1 = new BufferAttribute( array1, 2, false );
  24. var array2 = new Float32Array( [ 5, 6, 7, 8 ] );
  25. var attr2 = new BufferAttribute( array2, 4, false );
  26. assert.notOk( BufferGeometryUtils.mergeBufferAttributes( [ attr1, attr2 ] ) );
  27. attr2.itemSize = 2;
  28. attr2.normalized = true;
  29. assert.notOk( BufferGeometryUtils.mergeBufferAttributes( [ attr1, attr2 ] ) );
  30. attr2.normalized = false;
  31. assert.ok( BufferGeometryUtils.mergeBufferAttributes( [ attr1, attr2 ] ) );
  32. } );
  33. QUnit.test( 'mergeBufferGeometries - basic', ( assert ) => {
  34. var geometry1 = new BufferGeometry();
  35. geometry1.setAttribute( 'position', new BufferAttribute( new Float32Array( [ 1, 2, 3 ] ), 1, false ) );
  36. var geometry2 = new BufferGeometry();
  37. geometry2.setAttribute( 'position', new BufferAttribute( new Float32Array( [ 4, 5, 6 ] ), 1, false ) );
  38. var mergedGeometry = BufferGeometryUtils.mergeBufferGeometries( [ geometry1, geometry2 ] );
  39. assert.ok( mergedGeometry, 'merge succeeds' );
  40. assert.smartEqual( Array.from( mergedGeometry.attributes.position.array ), [ 1, 2, 3, 4, 5, 6 ], 'merges elements' );
  41. assert.equal( mergedGeometry.attributes.position.itemSize, 1, 'retains .itemSize' );
  42. } );
  43. QUnit.test( 'mergeBufferGeometries - indexed', ( assert ) => {
  44. var geometry1 = new BufferGeometry();
  45. geometry1.setAttribute( 'position', new BufferAttribute( new Float32Array( [ 1, 2, 3 ] ), 1, false ) );
  46. geometry1.setIndex( new BufferAttribute( new Uint16Array( [ 0, 1, 2, 2, 1, 0 ] ), 1, false ) );
  47. var geometry2 = new BufferGeometry();
  48. geometry2.setAttribute( 'position', new BufferAttribute( new Float32Array( [ 4, 5, 6 ] ), 1, false ) );
  49. geometry2.setIndex( new BufferAttribute( new Uint16Array( [ 0, 1, 2 ] ), 1, false ) );
  50. var mergedGeometry = BufferGeometryUtils.mergeBufferGeometries( [ geometry1, geometry2 ] );
  51. assert.ok( mergedGeometry, 'merge succeeds' );
  52. assert.smartEqual( Array.from( mergedGeometry.attributes.position.array ), [ 1, 2, 3, 4, 5, 6 ], 'merges elements' );
  53. assert.smartEqual( Array.from( mergedGeometry.index.array ), [ 0, 1, 2, 2, 1, 0, 3, 4, 5 ], 'merges indices' );
  54. assert.equal( mergedGeometry.attributes.position.itemSize, 1, 'retains .itemSize' );
  55. } );
  56. QUnit.test( 'mergeBufferGeometries - morph targets', ( assert ) => {
  57. var geometry1 = new BufferGeometry();
  58. geometry1.setAttribute( 'position', new BufferAttribute( new Float32Array( [ 1, 2, 3 ] ), 1, false ) );
  59. geometry1.morphAttributes.position = [
  60. new BufferAttribute( new Float32Array( [ 10, 20, 30 ] ), 1, false ),
  61. new BufferAttribute( new Float32Array( [ 100, 200, 300 ] ), 1, false )
  62. ];
  63. var geometry2 = new BufferGeometry();
  64. geometry2.setAttribute( 'position', new BufferAttribute( new Float32Array( [ 4, 5, 6 ] ), 1, false ) );
  65. geometry2.morphAttributes.position = [
  66. new BufferAttribute( new Float32Array( [ 40, 50, 60 ] ), 1, false ),
  67. new BufferAttribute( new Float32Array( [ 400, 500, 600 ] ), 1, false )
  68. ];
  69. var mergedGeometry = BufferGeometryUtils.mergeBufferGeometries( [ geometry1, geometry2 ] );
  70. assert.ok( mergedGeometry, 'merge succeeds' );
  71. assert.smartEqual( Array.from( mergedGeometry.attributes.position.array ), [ 1, 2, 3, 4, 5, 6 ], 'merges elements' );
  72. assert.smartEqual( Array.from( mergedGeometry.morphAttributes.position[ 0 ].array ), [ 10, 20, 30, 40, 50, 60 ], 'merges morph targets' );
  73. assert.smartEqual( Array.from( mergedGeometry.morphAttributes.position[ 1 ].array ), [ 100, 200, 300, 400, 500, 600 ], 'merges morph targets' );
  74. assert.equal( mergedGeometry.attributes.position.itemSize, 1, 'retains .itemSize' );
  75. } );
  76. QUnit.test( 'mergeBufferGeometries - invalid', ( assert ) => {
  77. var geometry1 = new BufferGeometry();
  78. geometry1.setAttribute( 'position', new BufferAttribute( new Float32Array( [ 1, 2, 3 ] ), 1, false ) );
  79. geometry1.setIndex( new BufferAttribute( new Uint16Array( [ 0, 1, 2 ] ), 1, false ) );
  80. var geometry2 = new BufferGeometry();
  81. geometry2.setAttribute( 'position', new BufferAttribute( new Float32Array( [ 4, 5, 6 ] ), 1, false ) );
  82. assert.notOk( BufferGeometryUtils.mergeBufferGeometries( [ geometry1, geometry2 ] ) );
  83. geometry2.setIndex( new BufferAttribute( new Uint16Array( [ 0, 1, 2 ] ), 1, false ) );
  84. assert.ok( BufferGeometryUtils.mergeBufferGeometries( [ geometry1, geometry2 ] ) );
  85. geometry2.setAttribute( 'foo', new BufferAttribute( new Float32Array( [ 1, 2, 3 ] ), 1, false ) );
  86. assert.notOk( BufferGeometryUtils.mergeBufferGeometries( [ geometry1, geometry2 ] ) );
  87. } );
  88. QUnit.test( 'toTrianglesDrawMode()', ( assert ) => {
  89. // TRIANGLE_STRIP
  90. const vertices1 = [];
  91. vertices1.push( 0, 0, 0 ); // v0
  92. vertices1.push( 1, 0, 0 ); // v1
  93. vertices1.push( 0, 1, 0 ); // v2
  94. vertices1.push( 2, 0, 0 ); // v3
  95. vertices1.push( 2, 1, 0 ); // v4
  96. vertices1.push( 3, 0, 0 ); // v5
  97. var geometry1 = new BufferGeometry();
  98. geometry1.setAttribute( 'position', new BufferAttribute( new Float32Array( vertices1 ), 3 ) );
  99. geometry1 = BufferGeometryUtils.toTrianglesDrawMode( geometry1, TriangleStripDrawMode );
  100. assert.deepEqual( geometry1.index.array, new Uint16Array( [ 0, 1, 2, 3, 2, 1, 2, 3, 4, 5, 4, 3 ] ), 'correct triangle indices from triangle strip' );
  101. // TRIANGLE_FAN
  102. const vertices2 = [];
  103. vertices2.push( 0, 0, 0 ); // v0
  104. vertices2.push( 1, 0, 0 ); // v1
  105. vertices2.push( 1, 1, 0 ); // v2
  106. vertices2.push( 0, 1, 0 ); // v3
  107. vertices2.push( - 1, 1, 0 ); // v4
  108. vertices2.push( - 1, 0, 0 ); // v5
  109. var geometry2 = new BufferGeometry();
  110. geometry2.setAttribute( 'position', new BufferAttribute( new Float32Array( vertices2 ), 3 ) );
  111. geometry2 = BufferGeometryUtils.toTrianglesDrawMode( geometry2, TriangleFanDrawMode );
  112. assert.deepEqual( geometry2.index.array, new Uint16Array( [ 0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5 ] ), 'correct triangle indices from triangle fan' );
  113. } );
  114. } );
  115. } );