智慧水务管理系统 - 精河县供水工程综合管理平台

meshopt_encoder.test.js 8.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. import assert from 'assert/strict';
  2. import { MeshoptEncoder as encoder } from './meshopt_encoder.js';
  3. import { MeshoptDecoder as decoder } from './meshopt_decoder.mjs';
  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([4, 2, 5, 3, 1, 4, 0, 1, 3, 1, 2, 4]);
  14. var expected = new Uint32Array([0, 1, 2, 3, 1, 0, 4, 3, 0, 5, 3, 4]);
  15. var remap = new Uint32Array([5, 3, 1, 4, 0, 2]);
  16. var res = encoder.reorderMesh(indices, /* triangles= */ true, /* optsize= */ true);
  17. assert.deepEqual(indices, expected);
  18. assert.deepEqual(res[0], remap);
  19. assert.equal(res[1], 6); // unique
  20. },
  21. reorderPoints: function () {
  22. var points = new Float32Array([1, 1, 1, 11, 11, 11, 2, 2, 2, 12, 12, 12]);
  23. var expected = new Uint32Array([0, 2, 1, 3]);
  24. var remap = encoder.reorderPoints(points, 3);
  25. assert.deepEqual(remap, expected);
  26. },
  27. roundtripVertexBuffer: function () {
  28. var data = new Uint8Array(16 * 4);
  29. // this tests 0/2/4/8 bit groups in one stream
  30. for (var i = 0; i < 16; ++i) {
  31. data[i * 4 + 0] = 0;
  32. data[i * 4 + 1] = i * 1;
  33. data[i * 4 + 2] = i * 2;
  34. data[i * 4 + 3] = i * 8;
  35. }
  36. var encoded = encoder.encodeVertexBuffer(data, 16, 4);
  37. assert.equal(encoded[0], 0xa1);
  38. var decoded = new Uint8Array(16 * 4);
  39. decoder.decodeVertexBuffer(decoded, 16, 4, encoded);
  40. assert.deepEqual(decoded, data);
  41. },
  42. roundtripVertexBufferV1: function () {
  43. var data = new Uint8Array(16 * 4);
  44. // this tests 0/2/4/8 bit groups in one stream
  45. for (var i = 0; i < 16; ++i) {
  46. data[i * 4 + 0] = 0;
  47. data[i * 4 + 1] = i * 1;
  48. data[i * 4 + 2] = i * 2;
  49. data[i * 4 + 3] = i * 8;
  50. }
  51. var encoded = encoder.encodeVertexBufferLevel(data, 16, 4, 3, /* version= */ 1);
  52. assert.equal(encoded[0], 0xa1);
  53. var decoded = new Uint8Array(16 * 4);
  54. decoder.decodeVertexBuffer(decoded, 16, 4, encoded);
  55. assert.deepEqual(decoded, data);
  56. },
  57. roundtripIndexBuffer: function () {
  58. var data = new Uint32Array([0, 1, 2, 2, 1, 3, 4, 6, 5, 7, 8, 9]);
  59. var encoded = encoder.encodeIndexBuffer(bytes(data), data.length, 4);
  60. var decoded = new Uint32Array(data.length);
  61. decoder.decodeIndexBuffer(bytes(decoded), data.length, 4, encoded);
  62. assert.deepEqual(decoded, data);
  63. },
  64. roundtripIndexBuffer16: function () {
  65. var data = new Uint16Array([0, 1, 2, 2, 1, 3, 4, 6, 5, 7, 8, 9]);
  66. var encoded = encoder.encodeIndexBuffer(bytes(data), data.length, 2);
  67. var decoded = new Uint16Array(data.length);
  68. decoder.decodeIndexBuffer(bytes(decoded), data.length, 2, encoded);
  69. assert.deepEqual(decoded, data);
  70. },
  71. roundtripIndexSequence: function () {
  72. var data = new Uint32Array([0, 1, 51, 2, 49, 1000]);
  73. var encoded = encoder.encodeIndexSequence(bytes(data), data.length, 4);
  74. var decoded = new Uint32Array(data.length);
  75. decoder.decodeIndexSequence(bytes(decoded), data.length, 4, encoded);
  76. assert.deepEqual(decoded, data);
  77. },
  78. roundtripIndexSequence16: function () {
  79. var data = new Uint16Array([0, 1, 51, 2, 49, 1000]);
  80. var encoded = encoder.encodeIndexSequence(bytes(data), data.length, 2);
  81. var decoded = new Uint16Array(data.length);
  82. decoder.decodeIndexSequence(bytes(decoded), data.length, 2, encoded);
  83. assert.deepEqual(decoded, data);
  84. },
  85. encodeFilterOct8: function () {
  86. var data = new Float32Array([1, 0, 0, 0, 0, -1, 0, 0, 0.7071068, 0, 0.707168, 1, -0.7071068, 0, -0.707168, 1]);
  87. var expected = new Uint8Array([0x7f, 0, 0x7f, 0, 0, 0x81, 0x7f, 0, 0x3f, 0, 0x7f, 0x7f, 0x81, 0x40, 0x7f, 0x7f]);
  88. // 4 vectors, encode each vector into 4 bytes with 8 bits of precision/component
  89. var encoded = encoder.encodeFilterOct(data, 4, 4, 8);
  90. assert.deepEqual(encoded, expected);
  91. },
  92. encodeFilterOct12: function () {
  93. var data = new Float32Array([1, 0, 0, 0, 0, -1, 0, 0, 0.7071068, 0, 0.707168, 1, -0.7071068, 0, -0.707168, 1]);
  94. var expected = new Uint16Array([0x7ff, 0, 0x7ff, 0, 0x0, 0xf801, 0x7ff, 0, 0x3ff, 0, 0x7ff, 0x7fff, 0xf801, 0x400, 0x7ff, 0x7fff]);
  95. // 4 vectors, encode each vector into 8 bytes with 12 bits of precision/component
  96. var encoded = encoder.encodeFilterOct(data, 4, 8, 12);
  97. assert.deepEqual(encoded, bytes(expected));
  98. },
  99. encodeFilterQuat12: function () {
  100. var data = new Float32Array([1, 0, 0, 0, 0, -1, 0, 0, 0.7071068, 0, 0, 0.707168, -0.7071068, 0, 0, -0.707168]);
  101. var expected = new Uint16Array([0, 0, 0, 0x7fc, 0, 0, 0, 0x7fd, 0x7ff, 0, 0, 0x7ff, 0x7ff, 0, 0, 0x7ff]);
  102. // 4 quaternions, encode each quaternion into 8 bytes with 12 bits of precision/component
  103. var encoded = encoder.encodeFilterQuat(data, 4, 8, 12);
  104. assert.deepEqual(encoded, bytes(expected));
  105. },
  106. encodeFilterExp: function () {
  107. var data = new Float32Array([1, -23.4, -0.1]);
  108. var expected = new Uint32Array([0xf7000200, 0xf7ffd133, 0xf7ffffcd]);
  109. // 1 vector with 3 components (12 bytes), encode each vector into 12 bytes with 15 bits of precision/component
  110. var encoded = encoder.encodeFilterExp(data, 1, 12, 15);
  111. assert.deepEqual(encoded, bytes(expected));
  112. },
  113. encodeFilterExpMode: function () {
  114. var data = new Float32Array([1, -23.4, -0.1, 11.0]);
  115. var expected = new Uint32Array([0xf3002000, 0xf7ffd133, 0xf3fffccd, 0xf7001600]);
  116. // 2 vectors with 2 components (8 bytes), encode each vector into 8 bytes with 15 bits of precision/component
  117. var encoded = encoder.encodeFilterExp(data, 2, 8, 15, 'SharedComponent');
  118. assert.deepEqual(encoded, bytes(expected));
  119. },
  120. encodeFilterExpClamp: function () {
  121. var data = new Float32Array([1, -23.4, -0.1]);
  122. var expected = new Uint32Array([0xf3002000, 0xf7ffd133, 0xf2fff99a]);
  123. // 1 vector with 3 components (12 bytes), encode each vector into 12 bytes with 15 bits of precision/component
  124. // exponents are separate but clamped to 0
  125. var encoded = encoder.encodeFilterExp(data, 1, 12, 15, 'Clamped');
  126. assert.deepEqual(encoded, bytes(expected));
  127. },
  128. encodeFilterColor8: function () {
  129. var data = new Float32Array([1, 0, 0, 1, 0, 1, 0, 0.5, 0, 0, 1, 0.25, 0.4, 0.4, 0.4, 0.75]);
  130. var expected = new Uint8Array([0x40, 0x7f, 0xc1, 0xff, 0x7f, 0x00, 0x7f, 0xc0, 0x40, 0x81, 0xc0, 0xa0, 0x66, 0x00, 0x00, 0xdf]);
  131. // 4 vectors, encode each vector into 4 bytes with 8 bits of precision/component
  132. var encoded = encoder.encodeFilterColor(data, 4, 4, 8);
  133. assert.deepEqual(encoded, expected);
  134. },
  135. encodeFilterColor12: function () {
  136. var data = new Float32Array([1, 0, 0, 1, 0, 1, 0, 0.5, 0, 0, 1, 0.25, 0.4, 0.4, 0.4, 0.75]);
  137. var expected = new Uint16Array([
  138. 0x0400, 0x07ff, 0xfc01, 0x0fff, 0x07ff, 0x0000, 0x07ff, 0x0c00, 0x0400, 0xf801, 0xfc00, 0x0a00, 0x0666, 0x0000, 0x0000, 0x0dff,
  139. ]);
  140. // 4 vectors, encode each vector into 8 bytes with 12 bits of precision/component
  141. var encoded = encoder.encodeFilterColor(data, 4, 8, 12);
  142. assert.deepEqual(encoded, bytes(expected));
  143. },
  144. encodeGltfBuffer: function () {
  145. var data = new Uint32Array([0, 1, 2, 2, 1, 3, 4, 6, 5, 7, 8, 9]);
  146. var encoded = encoder.encodeGltfBuffer(bytes(data), data.length, 4, 'TRIANGLES');
  147. var decoded = new Uint32Array(data.length);
  148. decoder.decodeGltfBuffer(bytes(decoded), data.length, 4, encoded, 'TRIANGLES');
  149. assert.equal(encoded[0], 0xe1);
  150. assert.deepEqual(decoded, data);
  151. },
  152. encodeGltfBufferAttribute: function () {
  153. var data = new Uint32Array([0, 1, 2, 2, 1, 3, 4, 6, 5, 7, 8, 9]);
  154. var encoded = encoder.encodeGltfBuffer(bytes(data), data.length, 4, 'ATTRIBUTES');
  155. var decoded = new Uint32Array(data.length);
  156. decoder.decodeGltfBuffer(bytes(decoded), data.length, 4, encoded, 'ATTRIBUTES');
  157. assert.equal(encoded[0], 0xa0);
  158. assert.deepEqual(decoded, data);
  159. },
  160. encodeGltfBufferAttributeV1: function () {
  161. var data = new Uint32Array([0, 1, 2, 2, 1, 3, 4, 6, 5, 7, 8, 9]);
  162. var encoded = encoder.encodeGltfBuffer(bytes(data), data.length, 4, 'ATTRIBUTES', 1);
  163. var decoded = new Uint32Array(data.length);
  164. decoder.decodeGltfBuffer(bytes(decoded), data.length, 4, encoded, 'ATTRIBUTES');
  165. assert.equal(encoded[0], 0xa1);
  166. assert.deepEqual(decoded, data);
  167. },
  168. };
  169. Promise.all([encoder.ready, decoder.ready]).then(() => {
  170. var count = 0;
  171. for (var key in tests) {
  172. tests[key]();
  173. count++;
  174. }
  175. console.log(count, 'tests passed');
  176. });