meshopt_encoder.test.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. var assert = require('assert').strict;
  2. var encoder = require('./meshopt_encoder.js');
  3. var decoder = require('./meshopt_decoder.js');
  4. process.on('unhandledRejection', error => {
  5. console.log('unhandledRejection', error);
  6. process.exit(1);
  7. });
  8. function bytes(view) {
  9. return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
  10. }
  11. var tests = {
  12. reorderMesh: function() {
  13. var indices = new Uint32Array([
  14. 4, 2, 5,
  15. 3, 1, 4,
  16. 0, 1, 3,
  17. 1, 2, 4,
  18. ]);
  19. var expected = new Uint32Array([
  20. 0, 1, 2,
  21. 3, 1, 0,
  22. 4, 3, 0,
  23. 5, 3, 4,
  24. ]);
  25. var remap = new Uint32Array([
  26. 5, 3, 1, 4, 0, 2
  27. ]);
  28. var res = encoder.reorderMesh(indices, /* triangles= */ true, /* optsize= */ true);
  29. assert.deepEqual(indices, expected);
  30. assert.deepEqual(res[0], remap);
  31. assert.equal(res[1], 6); // unique
  32. },
  33. roundtripVertexBuffer: function() {
  34. var data = new Uint8Array(16 * 4);
  35. // this tests 0/2/4/8 bit groups in one stream
  36. for (var i = 0; i < 16; ++i)
  37. {
  38. data[i * 4 + 0] = 0;
  39. data[i * 4 + 1] = i * 1;
  40. data[i * 4 + 2] = i * 2;
  41. data[i * 4 + 3] = i * 8;
  42. }
  43. var encoded = encoder.encodeVertexBuffer(data, 16, 4);
  44. var decoded = new Uint8Array(16 * 4);
  45. decoder.decodeVertexBuffer(decoded, 16, 4, encoded);
  46. assert.deepEqual(decoded, data);
  47. },
  48. roundtripIndexBuffer: function() {
  49. var data = new Uint32Array([0, 1, 2, 2, 1, 3, 4, 6, 5, 7, 8, 9]);
  50. var encoded = encoder.encodeIndexBuffer(bytes(data), data.length, 4);
  51. var decoded = new Uint32Array(data.length);
  52. decoder.decodeIndexBuffer(bytes(decoded), data.length, 4, encoded);
  53. assert.deepEqual(decoded, data);
  54. },
  55. roundtripIndexBuffer16: function() {
  56. var data = new Uint16Array([0, 1, 2, 2, 1, 3, 4, 6, 5, 7, 8, 9]);
  57. var encoded = encoder.encodeIndexBuffer(bytes(data), data.length, 2);
  58. var decoded = new Uint16Array(data.length);
  59. decoder.decodeIndexBuffer(bytes(decoded), data.length, 2, encoded);
  60. assert.deepEqual(decoded, data);
  61. },
  62. roundtripIndexSequence: function() {
  63. var data = new Uint32Array([0, 1, 51, 2, 49, 1000]);
  64. var encoded = encoder.encodeIndexSequence(bytes(data), data.length, 4);
  65. var decoded = new Uint32Array(data.length);
  66. decoder.decodeIndexSequence(bytes(decoded), data.length, 4, encoded);
  67. assert.deepEqual(decoded, data);
  68. },
  69. roundtripIndexSequence16: function() {
  70. var data = new Uint16Array([0, 1, 51, 2, 49, 1000]);
  71. var encoded = encoder.encodeIndexSequence(bytes(data), data.length, 2);
  72. var decoded = new Uint16Array(data.length);
  73. decoder.decodeIndexSequence(bytes(decoded), data.length, 2, encoded);
  74. assert.deepEqual(decoded, data);
  75. },
  76. encodeFilterOct8: function() {
  77. var data = new Float32Array([
  78. 1, 0, 0, 0,
  79. 0, -1, 0, 0,
  80. 0.7071068, 0, 0.707168, 1,
  81. -0.7071068, 0, -0.707168, 1,
  82. ]);
  83. var expected = new Uint8Array([
  84. 0x7f, 0, 0x7f, 0,
  85. 0, 0x81, 0x7f, 0,
  86. 0x3f, 0, 0x7f, 0x7f,
  87. 0x81, 0x40, 0x7f, 0x7f,
  88. ]);
  89. // 4 vectors, encode each vector into 4 bytes with 8 bits of precision/component
  90. var encoded = encoder.encodeFilterOct(data, 4, 4, 8);
  91. assert.deepEqual(encoded, expected);
  92. },
  93. encodeFilterOct12: function() {
  94. var data = new Float32Array([
  95. 1, 0, 0, 0,
  96. 0, -1, 0, 0,
  97. 0.7071068, 0, 0.707168, 1,
  98. -0.7071068, 0, -0.707168, 1,
  99. ]);
  100. var expected = new Uint16Array([
  101. 0x7ff, 0, 0x7ff, 0,
  102. 0x0, 0xf801, 0x7ff, 0,
  103. 0x3ff, 0, 0x7ff, 0x7fff,
  104. 0xf801, 0x400, 0x7ff, 0x7fff,
  105. ]);
  106. // 4 vectors, encode each vector into 8 bytes with 12 bits of precision/component
  107. var encoded = encoder.encodeFilterOct(data, 4, 8, 12);
  108. assert.deepEqual(encoded, bytes(expected));
  109. },
  110. encodeFilterQuat12: function() {
  111. var data = new Float32Array([
  112. 1, 0, 0, 0,
  113. 0, -1, 0, 0,
  114. 0.7071068, 0, 0, 0.707168,
  115. -0.7071068, 0, 0, -0.707168,
  116. ]);
  117. var expected = new Uint16Array([
  118. 0, 0, 0, 0x7fc,
  119. 0, 0, 0, 0x7fd,
  120. 0x7ff, 0, 0, 0x7ff,
  121. 0x7ff, 0, 0, 0x7ff,
  122. ]);
  123. // 4 quaternions, encode each quaternion into 8 bytes with 12 bits of precision/component
  124. var encoded = encoder.encodeFilterQuat(data, 4, 8, 12);
  125. assert.deepEqual(encoded, bytes(expected));
  126. },
  127. encodeFilterExp: function() {
  128. var data = new Float32Array([
  129. 1,
  130. -23.4,
  131. -0.1,
  132. ]);
  133. var expected = new Uint32Array([
  134. 0xf7000200,
  135. 0xf7ffd133,
  136. 0xf7ffffcd,
  137. ]);
  138. // 1 vector with 3 components (12 bytes), encode each vector into 12 bytes with 15 bits of precision/component
  139. var encoded = encoder.encodeFilterExp(data, 1, 12, 15);
  140. assert.deepEqual(encoded, bytes(expected));
  141. },
  142. encodeGltfBuffer: function() {
  143. var data = new Uint32Array([0, 1, 2, 2, 1, 3, 4, 6, 5, 7, 8, 9]);
  144. var encoded = encoder.encodeGltfBuffer(bytes(data), data.length, 4, 'TRIANGLES');
  145. var decoded = new Uint32Array(data.length);
  146. decoder.decodeGltfBuffer(bytes(decoded), data.length, 4, encoded, 'TRIANGLES');
  147. assert.deepEqual(decoded, data);
  148. },
  149. };
  150. Promise.all([encoder.ready, decoder.ready]).then(() => {
  151. var count = 0;
  152. for (var key in tests) {
  153. tests[key]();
  154. count++;
  155. }
  156. console.log(count, 'tests passed');
  157. });