@woosh/meep-engine 2.119.12 → 2.119.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +9 -0
  2. package/build/bundle-worker-terrain.js +1 -1
  3. package/package.json +1 -1
  4. package/src/core/collection/array/typed/array_buffer_hash.d.ts +9 -0
  5. package/src/core/collection/array/typed/array_buffer_hash.d.ts.map +1 -0
  6. package/src/core/collection/array/typed/array_buffer_hash.js +39 -0
  7. package/src/core/collection/array/typed/uint16_array_hash.d.ts +9 -0
  8. package/src/core/collection/array/typed/uint16_array_hash.d.ts.map +1 -0
  9. package/src/core/collection/array/typed/uint16_array_hash.js +29 -0
  10. package/src/core/collection/array/typed/uint32_array_hash.d.ts +9 -0
  11. package/src/core/collection/array/typed/uint32_array_hash.d.ts.map +1 -0
  12. package/src/core/collection/array/typed/uint32_array_hash.js +20 -0
  13. package/src/core/collection/array/typed/uint8_array_hash.d.ts +9 -0
  14. package/src/core/collection/array/typed/uint8_array_hash.d.ts.map +1 -0
  15. package/src/core/collection/array/typed/uint8_array_hash.js +36 -0
  16. package/src/core/geom/3d/sphere/sphere_project.d.ts +10 -0
  17. package/src/core/geom/3d/sphere/sphere_project.d.ts.map +1 -0
  18. package/src/core/geom/3d/sphere/sphere_project.js +39 -0
  19. package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.d.ts +9 -0
  20. package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.d.ts.map +1 -0
  21. package/src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.js +45 -0
  22. package/src/core/geom/Quaternion.d.ts.map +1 -1
  23. package/src/core/geom/Quaternion.js +8 -17
  24. package/src/core/graph/layout/box/position_box_next_to_box.d.ts.map +1 -1
  25. package/src/core/graph/layout/box/position_box_next_to_box.js +0 -23
  26. package/src/core/parser/simple/readArrayLiteral.d.ts +9 -0
  27. package/src/core/parser/simple/readArrayLiteral.d.ts.map +1 -0
  28. package/src/core/parser/simple/readArrayLiteral.js +73 -0
  29. package/src/core/parser/simple/readLiteralToken.d.ts.map +1 -1
  30. package/src/core/parser/simple/readLiteralToken.js +1 -53
  31. package/src/core/parser/simple/skipWhitespace.d.ts +2 -2
  32. package/src/core/parser/simple/skipWhitespace.d.ts.map +1 -1
  33. package/src/core/parser/simple/skipWhitespace.js +4 -4
  34. package/src/engine/ecs/components/Tag.d.ts.map +1 -1
  35. package/src/engine/ecs/components/Tag.js +0 -1
  36. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescriptionTable.d.ts.map +1 -1
  37. package/src/engine/ecs/dynamic_actions/rules/DynamicRuleDescriptionTable.js +14 -19
  38. package/src/engine/ecs/systems/AnimationSystem.d.ts.map +1 -1
  39. package/src/engine/ecs/systems/AnimationSystem.js +2 -2
  40. package/src/engine/graphics/ecs/animation/animator/AnimationGraphSystem.d.ts.map +1 -1
  41. package/src/engine/graphics/ecs/animation/animator/AnimationGraphSystem.js +2 -2
  42. package/src/engine/graphics/sh3/lpv/LightProbeVolume.d.ts +0 -8
  43. package/src/engine/graphics/sh3/lpv/LightProbeVolume.d.ts.map +1 -1
  44. package/src/engine/graphics/sh3/lpv/LightProbeVolume.js +0 -32
  45. package/src/engine/graphics/sh3/lpv/util/lpv_visualise_probes.d.ts +10 -0
  46. package/src/engine/graphics/sh3/lpv/util/lpv_visualise_probes.d.ts.map +1 -0
  47. package/src/engine/graphics/sh3/lpv/util/lpv_visualise_probes.js +33 -0
  48. package/src/engine/graphics/sh3/prototypeSH3Probe.js +3 -2
  49. package/src/engine/graphics/texture/atlas/AtlasPatch.d.ts.map +1 -1
  50. package/src/engine/graphics/texture/atlas/AtlasPatch.js +62 -63
  51. package/src/engine/graphics/texture/sampler/Sampler2D.d.ts.map +1 -1
  52. package/src/engine/graphics/texture/sampler/Sampler2D.js +9 -25
  53. package/src/engine/graphics/texture/virtual/NOTES.md +11 -2
  54. package/src/engine/graphics/texture/virtual/VirtualTextureMaterial.d.ts +1 -1
  55. package/src/engine/graphics/texture/virtual/VirtualTextureMaterial.d.ts.map +1 -1
  56. package/src/engine/graphics/texture/virtual/VirtualTextureMaterial.js +1 -12
  57. package/src/engine/graphics/texture/virtual/VirtualTexturePage.d.ts.map +1 -1
  58. package/src/engine/graphics/texture/virtual/VirtualTexturePage.js +0 -10
  59. package/src/engine/graphics/texture/virtual/VirtualTextureSystem.d.ts.map +1 -1
  60. package/src/engine/graphics/texture/virtual/VirtualTextureSystem.js +0 -2
  61. package/src/engine/graphics/trail/x/RibbonXMaterialSpec.d.ts.map +1 -1
  62. package/src/engine/graphics/trail/x/RibbonXMaterialSpec.js +6 -7
  63. package/src/engine/save/GameStateLoader.d.ts.map +1 -1
  64. package/src/engine/save/GameStateLoader.js +6 -9
  65. package/src/engine/save/StorageBackedList.d.ts.map +1 -1
  66. package/src/engine/save/StorageBackedList.js +16 -19
  67. package/src/generation/grid/generation/GridTaskApplyActionToCells.d.ts.map +1 -1
  68. package/src/generation/grid/generation/GridTaskApplyActionToCells.js +12 -16
  69. package/src/generation/grid/generation/GridTaskExecuteRuleTimes.d.ts.map +1 -1
  70. package/src/generation/grid/generation/GridTaskExecuteRuleTimes.js +6 -6
  71. package/src/generation/grid/generation/GridTaskSequence.d.ts.map +1 -1
  72. package/src/generation/grid/generation/GridTaskSequence.js +5 -5
  73. package/src/generation/grid/generation/discrete/GridTaskActionRuleSet.d.ts +2 -6
  74. package/src/generation/grid/generation/discrete/GridTaskActionRuleSet.d.ts.map +1 -1
  75. package/src/generation/grid/generation/discrete/GridTaskActionRuleSet.js +1 -1
  76. package/src/generation/grid/generation/road/RoadConnection.d.ts.map +1 -1
  77. package/src/generation/grid/generation/road/RoadConnection.js +17 -15
  78. package/src/engine/graphics/util/projectSphere.d.ts +0 -24
  79. package/src/engine/graphics/util/projectSphere.d.ts.map +0 -1
  80. package/src/engine/graphics/util/projectSphere.js +0 -103
package/README.md CHANGED
@@ -6,6 +6,15 @@ Minimal project with no bells or whistles, just enough to run the engine and get
6
6
 
7
7
  [GitLab Repository](http://gitlab.company-named.com/travnik/dream-engine-template)
8
8
 
9
+ ## Quality
10
+
11
+ Meep is covered by 1,959 unit tests
12
+
13
+ ![coverage](http://gitlab.company-named.com/travnik/meep/badges/master/coverage.svg)
14
+
15
+ The aim is not to have 100% coverage, [but to ensure quality](https://about.codecov.io/blog/the-case-against-100-code-coverage/). As a result, the tests are written to cover complex code first and to exhaustively validate critical algorithms.
16
+ Most of the test code is significantly larger than the code that they are testing.
17
+
9
18
  ## Samples
10
19
  To help get you started, various samples are provided under `/samples` folder. Feel free to use them as a point of reference.
11
20
 
@@ -1 +1 @@
1
- function t(t,e){const n=t.length;if(n!==e.length)return!1;for(let r=0;r<n;r++)if(t[r]!==e[r])return!1;return!0}class e{appendDescriptionOf(t){throw new Error("Not Implemented")}appendList(t,e,n,r){throw new Error("Not Implemented")}appendText(t){throw new Error("Not Implemented")}appendValue(t){throw new Error("Not Implemented")}appendValueList(t,e,n,r){throw new Error("Not Implemented")}}class n{describeTo(t){throw new Error("Not Implemented")}}class r extends n{value;constructor(t){super(),this.value=t}describeTo(t){t.appendValue(this.value)}}class i{#t;constructor(t){this.#t=t}*[Symbol.iterator](){for(const t of this.#t)yield new r(t)}}class s extends e{appendDescriptionOf(t){return t.describeTo(this),this}#e(t){this.appendText('"'),this.appendText(t),this.appendText('"')}appendValue(t){return null==t?this.appendText("null"):void 0===t?this.appendText("undefined"):"string"==typeof t?this.#e(t):"number"==typeof t?this.appendText(function(t){return String(t)}(t)):Array.isArray(t)?this.appendValueList("[",", ","]",t):(this.appendText("<"),this.appendText(function(t){try{return String(t)}catch(t){return"VALUE@0"}}(t)),this.appendText(">")),this}appendValueList(t,e,n,r){return this.appendList(t,e,n,new i(r)),this}appendList(t,e,n,r){let i=!1;this.appendText(t);const s=r[Symbol.iterator]();for(let t=s.next();!0!==t.done;t=s.next())i&&this.appendText(e),this.appendDescriptionOf(t.value),i=!0;return this.appendText(n),this}}class o extends s{value="";appendText(t){return this.value+=t,this}}function a(t,e){if(!t)throw new Error(e||"AssertionError")}function c(t,e,n,r,i){let s,o,a;for(a=0;a<i;a++)s=e+a,o=r+a,n[o]=t[s]}a.enum=function(t,e,n="value"){for(let n in e)if(e[n]===t)return;throw new Error(`${n}(=${t}) is not a valid enumerable value, valid values are: [${Object.values(e).join(", ")}]`)},a.notEqual=function(t,e,n){a(t!==e,n)},a.notOk=function(t,e){a(!t,e)},a.equal=function(t,e,n){if(t!==e){const r=`${t} !== ${e}`;throw new Error(void 0!==n&&""!==n?`${n}. ${r}`:r)}},a.logicalyEqual=function(t,e,n){},a.ok=a,a.greaterThan=function(t,e,n){if(!(t>e)){let r="";throw void 0!==n&&(r+=n+". "),r+=`Expected ${t} > ${e}.`,new Error(r)}},a.greaterThanOrEqual=function(t,e,n){if(!(t>=e)){let r="";throw void 0!==n&&(r+=n+". "),r+=`Expected ${t} >= ${e}.`,new Error(r)}},a.lessThan=function(t,e,n){if(!(t<e)){let r="";throw void 0!==n&&(r+=n+". "),r+=`Expected ${t} < ${e}.`,new Error(r)}},a.lessThanOrEqual=function(t,e,n){if(!(t<=e)){let r="";throw void 0!==n&&(r+=n+". "),r+=`Expected ${t} <= ${e}.`,new Error(r)}},a.typeOf=function(t,e,n="value"){const r=typeof t;if(r!==e)throw new Error(`expected ${n} to be ${e}, instead was '${r}'(=${t})`)},a.arrayHas=function(t,e,n="Array does not contain the item"){},a.arrayHasNo=function(t,e,n="Array contains the item"){},a.arrayEqual=function(e,n,r="Arrays are not equal"){if(!t(e,n))throw new Error(r)},a.isInstanceOf=function(t,e,n="value",r=e.name){},a.isNumber=function(t,e="value"){const n=typeof t;if("number"!==n)throw new Error(`expected ${e} to be a number, instead was '${n}'(=${t})`)},a.isString=function(t,e="value"){const n=typeof t;if("string"!==n)throw new Error(`expected ${e} to be a string, instead was '${n}'(=${t})`)},a.isBoolean=function(t,e="value"){const n=typeof t;if("boolean"!==n)throw new Error(`expected ${e} to be a boolean, instead was '${n}'(=${t})`)},a.isFunction=function(t,e="value"){const n=typeof t;if("function"!==n)throw new Error(`expected ${e} to be a function, instead was '${n}'(=${t})`)},a.isObject=function(t,e="value"){const n=typeof t;if("object"!==n)throw new Error(`expected ${e} to be an object, instead was '${n}'(=${t})`)},a.isInteger=function(t,e="value"){if(!Number.isInteger(t))throw new Error(`${e} must be an integer, instead was ${t}`)},a.isNonNegativeInteger=function(t,e="value"){if(t<0)throw new Error(`${e} must be >= 0, instead was ${t}`)},a.isArray=function(t,e="value"){if(!Array.isArray(t))throw new Error(`expected ${e} to be an array, instead was something else (typeof ='${typeof t}')`)},a.isArrayLike=function(t,e="value"){if(!Array.isArray(t)&&!function(t){if("object"!=typeof t)return!1;if(null===t)return!1;const e=t.constructor;return e===Uint8Array||e===Uint16Array||e===Uint32Array||e===Int8Array||e===Int16Array||e===Int32Array||e===Float32Array||e===Float64Array||e===BigUint64Array||e===BigInt64Array}(t))throw new Error(`expected ${e} to be an array-like structure, instead was something else (typeof ='${typeof t}')`)},a.defined=function(t,e="value"){if(void 0===t)throw new Error(`${e} is undefined`)},a.isNull=function(t,e){if(null!==t)throw new Error(`${e} is NOT null`)},a.notNull=function(t,e="value"){if(null===t)throw new Error(`${e} is null`)},a.notNaN=function(t,e="value"){if(Number.isNaN(t))throw new Error(`${e} must be a valid number, instead was NaN`)},a.isFiniteNumber=function(t,e="value"){if(!Number.isFinite(t))throw new Error(`${e} must be a finite number, instead was ${t}`)},a.that=function(t,e,n){if(n.matches(t))return;const r=new o;throw r.appendText(`Expected ${e} to be `),n.describeTo(r),r.appendText(" instead "),n.describeMismatch(t,r),new Error(r.value)};const h=new Uint32Array(781250);function u(t,e){return t<e?e:t}function d(t,e){return t<e?t:e}function l(t,e,n,r,i,s){const o=n[r+0],a=n[r+1],c=n[r+2],h=n[r+3],l=n[r+4],f=n[r+5],g=i[s+0],p=i[s+1],y=i[s+2],_=i[s+3],w=i[s+4],m=i[s+5],v=d(o,g),A=d(a,p),x=d(c,y),b=u(h,_),E=u(l,w),U=u(f,m);t[e+0]=v,t[e+1]=A,t[e+2]=x,t[e+3]=b,t[e+4]=E,t[e+5]=U}function f(t,e,n,r,i,s,o,a){t[e]=n,t[e+1]=r,t[e+2]=i,t[e+3]=s,t[e+4]=o,t[e+5]=a}function g(t,e,n,r,i,s){const o=r-t,a=s-n;return(i-e)*(o+a)+a*o}function p(t){let e=t;return e=50331903&(e|e<<16),e=50393103&(e|e<<8),e=51130563&(e|e<<4),e=153391689&(e|e<<2),e}function y(t,e,n){const r=t[n],i=t[n+1],s=t[n+2];f(t,e,r,i,s,r,i,s)}function _(t,e,n){const r=t[e],i=t[e+1],s=t[e+2];return function(t,e,n,r){const i=r[0],s=r[1],o=r[2],a=1023*(t-i)/(r[3]-i),c=1023*(e-s)/(r[4]-s),h=1023*(n-o)/(r[5]-o);return function(t,e,n){return p(t)|p(e)<<1|p(n)<<2}(Math.round(a),Math.round(c),Math.round(h))}(.5*(r+t[e+3]),.5*(i+t[e+4]),.5*(s+t[e+5]),n)}h.pointer=0;const w=h;class m{__data_buffer;__data_float32;__data_uint32;__node_count_binary=0;__node_count_leaf=0;constructor(){this.data=new ArrayBuffer(320)}estimateByteSize(){return this.data.byteLength+248}getTotalBoxCount(){return this.__node_count_binary+this.__node_count_leaf}get binary_node_count(){return this.__node_count_binary}get leaf_node_count(){return this.__node_count_leaf}getLeafBlockAddress(){return 6*this.__node_count_binary}get float32(){return this.__data_float32}get uint32(){return this.__data_uint32}set data(t){this.__data_buffer=t,this.__data_float32=new Float32Array(this.__data_buffer),this.__data_uint32=new Uint32Array(this.__data_buffer)}get data(){return this.__data_buffer}getNodeAddress(t){const e=this.__node_count_binary,n=t-e;return n<0?6*t:6*e+7*n}initialize_structure(){const t=4*(6*this.__node_count_binary+7*this.__node_count_leaf);this.__data_buffer.byteLength<t&&(this.data=new ArrayBuffer(t))}setLeafCount(t){this.__node_count_leaf=t;const e=function(t){let e=t-1;return e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,e|=e>>16,e++,e}(t);this.__node_count_binary=t<=1?e:e-1}getLeafAddress(t){return 7*t+6*this.__node_count_binary}setLeafData(t,e,n,r,i,s,o,a){const c=this.getLeafAddress(t);f(this.__data_float32,c,n,r,i,s,o,a),this.__data_uint32[c+6]=e}readBounds(t,e,n){c(this.__data_float32,t,e,n,6)}readLeafPayload(t){const e=this.getLeafBlockAddress()+7*t+6;return this.__data_uint32[e]}compute_total_surface_area(){let t=0;const e=new Float32Array(6);for(let n=0;n<this.getTotalBoxCount();n++){let r;r=n<this.__node_count_binary?6*n:7*(n-this.__node_count_binary)+this.getLeafBlockAddress(),this.readBounds(r,e,0),t+=g(e[0],e[1],e[2],e[3],e[4],e[5])}return t}sort_morton(t){const e=6*this.__node_count_binary;if(this.__node_count_leaf<2)return;const n=w.pointer;let r,i,s=n;w[s++]=0,w[s++]=this.__node_count_leaf-1;const o=this.__data_float32;for(;s>n;){s-=2;const n=w[s+1],a=w[s];r=a,i=n;const c=_(o,7*(a+n>>1)+e,t);for(;r<=i;){for(;_(o,7*r+e,t)<c;)r++;for(;_(o,7*i+e,t)>c;)i--;r<=i&&(r!==i&&this.__swap_leaves(r,i),r++,i--)}a<i&&(w[s++]=a,w[s++]=i),r<n&&(w[s++]=r,w[s++]=n)}}__swap_leaves(t,e){const n=this.getLeafBlockAddress(),r=7*t+n,i=7*e+n;!function(t,e,n,r,i){for(let i=0;i<7;i++){const s=e+i,o=r+i,a=n[o];n[o]=t[s],t[s]=a}}(this.__data_float32,r,this.__data_float32,i)}build(){const t=this.__node_count_binary,e=6*t;let n,r,i,s,o=Math.floor(Math.log(t)/Math.log(2));i=Math.pow(2,o),r=6*(i-1);const a=this.__node_count_leaf,h=this.__data_float32;for(n=0;n<i;n++){const t=n<<1,i=t+1,s=e+7*t;i<a?l(h,r,h,s,h,e+7*i):t<a?c(h,s,h,r,6):y(this.__data_float32,r,r-6),r+=6}for(o--;o>=0;o--)for(i=1<<o,s=i-1,n=0;n<i;n++){const t=6*(1+(s<<1));l(h,6*s,h,t,h,t+6),s++}}}function v(t,e,n){let r=t;return r<e&&(r=e),r<n&&(r=n),r}function A(t,e,n){let r=t;return r>e&&(r=e),r>n&&(r=n),r}function x(t,e,n,r,i,s){const o=t.getLeafAddress(e);!function(t,e,n,r,i,s){const o=3*r,a=3*i,c=3*s,h=n[o],u=n[o+1],d=n[o+2],l=n[a],f=n[a+1],g=n[a+2],p=n[c],y=n[c+1],_=n[c+2];t[e]=A(h,l,p),t[e+1]=A(u,f,y),t[e+2]=A(d,g,_),t[e+3]=v(h,l,p),t[e+4]=v(u,f,y),t[e+5]=v(d,g,_)}(t.__data_float32,o,n,r,i,s),t.__data_uint32[o+6]=e}function b(t){return 1===t.faces.length}function E(t,e){return t.v0===e?t.v1:t.v1===e?t.v0:null}var U,$="undefined"!=typeof Float32Array?Float32Array:Array;function F(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t}function S(t,e){return-1===t.indexOf(e)&&(t.push(e),!0)}function z(){}function C(t,e=","){return t.toString().replace(/\B(?=(\d{3})+(?!\d))/g,e)}function V(t,e){t.__edges.delete(e)}function B(t,e,n=0,r=t.length){const i=n+r;for(let r=n;r<i;r++)if(t[r]===e)return t.splice(r,1),!0;return!1}function M(t,e){return t.v0===e||t.v1===e}function I(t,e,n){const r=t.v0,i=t.v1;return!(r!==e&&r!==n||i!==e&&i!==n)}Math.hypot||(Math.hypot=function(){for(var t=0,e=arguments.length;e--;)t+=arguments[e]*arguments[e];return Math.sqrt(t)}),U=new $(3),$!=Float32Array&&(U[0]=0,U[1]=0,U[2]=0);let L=0;class T{index=L++;v0=null;v1=null;faces=[];lengthSqr=-1;get byteSize(){return 128+8*this.faces.length+10}getVertexByIndex(t){if(0===t)return this.v0;if(1===t)return this.v1;throw new Error("Index out of bounds")}copy(t){this.v0=t.v0,this.v1=t.v1,this.lengthSqr=t.lengthSqr,this.faces=t.faces.slice()}clone(){const t=new T;return t.copy(this),t}validate(t){let e=!0;const n=this.faces,r=n.length;for(let i=0;i<r;i++)n[i].containsEdge(this)||(t(`Missing back-link from face[${i}]`),e=!1);return this.v0.containsEdge(this)||(t("Missing back-link from vertex v0"),e=!1),this.v1.containsEdge(this)||(t("Missing back-link from vertex v1"),e=!1),e}isLinked(){return this.v0.containsEdge(this)}unlink(){const t=this.v0,e=this.v1;t.removeEdge(this),t!==e&&e.removeEdge(this);const n=this.faces,r=n.length;for(let t=0;t<r;t++)n[t].removeEdge(this)}isDegenerateEdge(){return this.v0===this.v1}isTopologyBorder(){return b(this)}get length(){return this.lengthSqr<0&&this.computeSquaredLength(),Math.sqrt(this.lengthSqr)}computeSquaredLength(){const t=this.v0,e=this.v1,n=t.x,r=t.y,i=t.z,s=n-e.x,o=r-e.y,a=i-e.z;this.lengthSqr=s*s+o*o+a*a}replaceVertex(t,e){t===this.v0&&(this.v0=e),t===this.v1&&(this.v1=e)}merge(t){const e=t.faces,n=this.faces,r=e.length;for(let i=0;i<r;i++){const r=e[i];r.removeEdge(t),-1===n.indexOf(r)&&(n.push(r),r.addUniqueEdge(this))}t.v0.removeEdge(t),t.v1.removeEdge(t)}containsFace(t){return-1!==this.faces.indexOf(t)}addFace(t){this.faces.push(t)}addUniqueFace(t){S(this.faces,t)}removeFace(t){B(this.faces,t)}getOtherVertex(t){return E(this,t)}containsVertex(t){return M(this,t)}containsBothVertices(t,e){return I(this,t,e)}containsSameVerticesAs(t){return I(this,t.v0,t.v1)}}function q(t,e,n){const r=t.length;for(let i=0;i<r;i++)t[i]===e&&(t[i]=n);return t}function N(t,e,n,r,i,s,o,a,c,h,u){const d=c-s,l=h-o,f=u-a,g=n-s,p=r-o,y=i-a,_=l*y-f*p,w=f*g-d*y,m=d*p-l*g,v=function(t,e,n){return t*t+e*e+n*n}(_,w,m);if(0===v)return t[e]=0,t[e+1]=1,void(t[e+2]=0);const A=1/Math.sqrt(v),x=_*A,b=w*A,E=m*A;t[e]=x,t[e+1]=b,t[e+2]=E}function k(t,e,n){return Math.sqrt(t*t+e*e+n*n)}T.prototype.isTopoEdge=!0;let O=0;class j{index=O++;edges=[];faces=[];x=0;y=0;z=0;get 0(){return this.x}get 1(){return this.y}get 2(){return this.z}get byteSize(){return 112+8*this.edges.length+10+8*this.faces.length+10}copy(t){this.x=t.x,this.y=t.y,this.z=t.z,this.index=t.index,this.faces=t.faces.slice(),this.edges=t.edges.slice()}clone(){const t=new j;return t.copy(this),t}validate(t){let e=!0;const n=this.faces,r=n.length;for(let i=0;i<r;i++)n[i].containsVertex(this)||(t(`Missing back-link from face[${i}]`),e=!1);const i=this.edges,s=i.length;for(let n=0;n<s;n++)M(i[n],this)||(t(`Missing back-link from edge[${n}]`),e=!1);return e}distanceTo(t){return e=this.x,n=this.y,r=this.z,k(t.x-e,t.y-n,t.z-r);var e,n,r}addFace(t){this.faces.push(t)}addUniqueFace(t){return S(this.faces,t)}containsFace(t){return-1!==this.faces.indexOf(t)}removeFace(t){B(this.faces,t)}addEdge(t){this.edges.push(t)}addUniqueEdge(t){return S(this.edges,t)}replaceEdge(t,e){const n=this.edges,r=n.indexOf(t);n[r]=e}containsEdge(t){return-1!==this.edges.indexOf(t)}removeEdge(t){return B(this.edges,t)}replaceAnotherVertex(t){throw new Error('deprecated, use "tm_vert_splice" instead')}computeNeighbourVertices(t,e){let n=0;const r=this.edges,i=r.length;for(let s=0;s<i;s++){const i=r[s].getOtherVertex(this);t[e+n]=i,n++}return n}static from(t,e,n){const r=new j;return r.x=t,r.y=e,r.z=n,r}}j.prototype.isTopoVertex=!0;let D=0;class R{index=D++;vertices=[];edges=[];normal=[0,0,0];get byteSize(){return 100+8*this.vertices.length+10+8*this.edges.length+10+24+10}copy(t){this.index=t.index,this.vertices=t.vertices.slice(),this.edges=t.edges.slice(),F(this.normal,t.normal)}clone(){const t=new R;return t.copy(this),t}validate(t){let e=!0;const n=this.vertices,r=n.length;3!==r&&(t(`Expected number of vertices is 3, instead got ${r}`),e=!1);for(let i=0;i<r;i++)n[i].containsFace(this)||(t(`Missing back-link from vertex[${i}]`),e=!1);const i=this.edges,s=i.length;3!==s&&(t(`Expected number of edges is 3, instead got ${s}`),e=!1);for(let n=0;n<s;n++)i[n].containsFace(this)||(t(`Missing back-link from edge[${n}]`),e=!1);return e}isLinked(){return this.vertices[0].containsFace(this)}replaceEdge(t,e){q(this.edges,t,e)}replaceVertex(t,e){q(this.vertices,t,e)}isDegenerateTopology(){const t=this.vertices,e=t[0],n=t[1],r=t[2];return e===n||e===r||n===r}unlink(){const t=this.vertices,e=t.length;for(let n=0;n<e;n++)t[n].removeFace(this);const n=this.edges,r=n.length;for(let t=0;t<r;t++)n[t].removeFace(this)}addEdge(t){this.edges.push(t)}addUniqueEdge(t){return S(this.edges,t)}removeEdge(t){B(this.edges,t)}containsEdge(t){return-1!==this.edges.indexOf(t)}computeNormal(){const t=this.vertices,e=t[0],n=t[1],r=t[2];!function(t,e,n,r){N(t,0,e[0],e[1],e[2],n[0],n[1],n[2],r[0],r[1],r[2])}(this.normal,e,n,r)}setVertexAt(t,e){this.vertices[t]=e}containsVertex(t){return-1!==this.vertices.indexOf(t)}getEdgeNeighbours(t,e){let n=0;const r=this.edges,i=r.length;for(let s=0;s<i;s++){const i=r[s].faces,o=i.length;for(let r=0;r<o;r++){const s=i[r];s!==this&&(t[e+n]=s,n++)}}return n}static fromPoints(t,e,n,r,i,s,o,a,c){const h=j.from(t,e,n),u=j.from(r,i,s),d=j.from(o,a,c),l=new T,f=new T,g=new T;l.v0=h,l.v1=u,f.v0=u,f.v1=d,g.v0=d,g.v1=h;const p=new R;return p.edges.push(l,f,g),p.vertices.push(h,u,d),h.faces.push(p),u.faces.push(p),d.faces.push(p),l.faces.push(p),f.faces.push(p),g.faces.push(p),h.edges.push(l,g),u.edges.push(l,f),d.edges.push(f,g),p}}R.prototype.isTopoFace=!0;class J{vertices=[];__edges=new Set;__faces=new Set;get byteSize(){let t=0;for(let e=0;e<this.vertices.length;e++)t+=this.vertices[e].byteSize;for(const e of this.__edges)t+=e.byteSize;for(const e of this.__faces)t+=e.byteSize;return t}getEdges(){return this.__edges}getFaces(){return this.__faces}getFaceByIndex(t){for(const e of this.__faces)if(e.index===t)return e}validate(t=z){let e=!0,n="",r=0;function i(i){t(`${n}[${r}]: ${i}`),e=!1}n="Edge",r=0;const s=this.getEdges();for(let t of s){t.validate(i),this.containsVertex(t.v0)||i("Link to off-mesh vertex v0"),this.containsVertex(t.v1)||i("Link to off-mesh vertex v1");const e=t.faces,n=e.length;for(let t=0;t<n;t++){const n=e[t];this.containsFace(n)||i(`Link to off-mesh face[${t}]`)}r++}const o=this.getFaces();n="Face",r=0;for(let t of o){t.validate(i);const e=t.edges,n=e.length;for(let t=0;t<n;t++){const n=e[t];this.containsEdge(n)||i(`Link to off-mesh edge[${t}]`)}const s=t.vertices,o=s.length;for(let t=0;t<o;t++){const e=s[t];this.containsVertex(e)||i(`Link to off-mesh vertex[${t}]`)}r++}const a=this.vertices,c=a.length;n="Vertex";for(let t=0;t<c;t++){r=t;const e=a[t];e.validate(i);const n=e.edges,s=n.length;for(let t=0;t<s;t++){const e=n[t];this.containsEdge(e)||i(`Link to off-mesh edge[${t}]`)}const o=e.faces,c=o.length;for(let t=0;t<c;t++){const e=o[t];this.containsFace(e)||i(`Link to off-mesh face[${t}]`)}}return e}clone(){const t=new J;return t.add(this),t}buildVertexMapping(){const t=new Map,e=this.vertices,n=e.length;for(let r=0;r<n;r++){const n=e[r];t.set(n.index,n)}return t}_addWithVertexMap(t,e){const n=t.getFaces();for(let t of n)this.addFaceCopy(t,e)}addFaceCopy(t,e){const n=new R;F(n.normal,t.normal);const r=t.vertices;for(let t=0;t<3;t++){const i=r[t];let s=e.get(i.index);void 0===s&&(s=new j,s.index=i.index,s.x=i.x,s.y=i.y,s.z=i.z,e.set(i.index,s),this.addVertex(s)),n.setVertexAt(t,s),s.addUniqueFace(n)}this.addFace(n),this.patchFaceEdges(n)}patchFaceEdges(t){const e=t.vertices,n=e[0],r=e[1],i=e[2],s=this.ensureEdge(n,r),o=this.ensureEdge(r,i),a=this.ensureEdge(i,n);s.addUniqueFace(t),o.addUniqueFace(t),a.addUniqueFace(t),t.addUniqueEdge(s),t.addUniqueEdge(o),t.addUniqueEdge(a)}add(t){const e=this.buildVertexMapping();this._addWithVertexMap(t,e)}addVertex(t){this.vertices.push(t)}addUniqueVertex(t){S(this.vertices,t)}removeVertex(t){var e;e=t,B(this.vertices,e)}containsVertex(t){return-1!==this.vertices.indexOf(t)}addEdge(t){this.__edges.add(t)}addUniqueEdge(t){this.__edges.add(t)}removeEdge(t){V(this,t)}containsEdge(t){return this.__edges.has(t)}addFace(t){this.__faces.add(t)}injectManyFaces(t){for(let e of t)this.injectFace(e)}injectFace(t){this.addFace(t);const e=t.edges,n=e.length;for(let t=0;t<n;t++){const n=e[t];this.addUniqueEdge(n)}const r=t.vertices,i=r.length;for(let t=0;t<i;t++){const e=r[t];this.addUniqueVertex(e)}}removeFace(t){var e;e=t,this.__faces.delete(e)}containsFace(t){return this.__faces.has(t)}ensureEdge(t,e){const n=t.edges,r=n.length;for(let i=0;i<r;i++){const r=n[i];if(E(r,t)===e)return r}const i=new T;return i.v0=t,i.v1=e,t.edges.push(i),e.edges.push(i),this.__edges.add(i),i}mergeEdges(){const t=this.getEdges();for(let e of t){const n=e.v0,r=e.v1;for(let i of t){if(e===i)continue;const t=i.v0,s=i.v1;if(n===t){if(r!==s)continue}else{if(n!==s)continue;if(r!==t)continue}V(this,i),e.merge(i)}}}computeEdgeSquaredLengths(){const t=this.getEdges();for(let e of t)e.computeSquaredLength()}setVerticesFromArray(t){const e=t.length/3,n=this.vertices;for(let r=0;r<e;r++){const e=3*r,i=new j;i.index=r,i.x=t[e],i.y=t[e+1],i.z=t[e+2],n[r]=i}}setFacesFromIndexArray(t){const e=t.length,n=this.vertices,r=e/3;for(let e=0;e<r;e++){const r=3*e,i=t[r],s=t[r+1],o=t[r+2];this.createTriangle(e,n[i],n[s],n[o])}}setFacedUnindexed(){const t=this.vertices,e=t.length/3;for(let n=0;n<e;n++){const e=3*n;this.createTriangle(n,t[e],t[e+1],t[e+2])}}build(t,e){this.setVerticesFromArray(t),null==e?this.setFacedUnindexed():this.setFacesFromIndexArray(e)}createTriangle(t,e,n,r){const i=new R;i.index=t;const s=this.ensureEdge(e,n),o=this.ensureEdge(n,r),a=this.ensureEdge(r,e);return s.faces.push(i),o.faces.push(i),a.faces.push(i),i.vertices.push(e,n,r),i.edges.push(s,o,a),e.faces.push(i),n.faces.push(i),r.faces.push(i),this.__faces.add(i),i}toString(){return`TopoMesh{ vertices: ${C(this.vertices.length)}, edges: ${C(this.getEdges().size)}, faces: ${C(this.getFaces().size)} }`}}J.prototype.isTopoMesh=!0;const P=[],H=[],W="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(let t=0,e=64;t<e;++t)P[t]=W[t],H[W.charCodeAt(t)]=t;function G(t,e,n){const r=[];for(let s=e;s<n;s+=3){const e=(t[s]<<16&16711680)+(t[s+1]<<8&65280)+(255&t[s+2]);r.push(P[(i=e)>>18&63]+P[i>>12&63]+P[i>>6&63]+P[63&i])}var i;return r.join("")}H["-".charCodeAt(0)]=62,H["_".charCodeAt(0)]=63;const Y=16383;class K{static encode(t){return function(t){const e=t.length,n=e%3,r=[],i=e-n;for(let e=0;e<i;e+=Y){const n=G(t,e,e+Y>i?i:e+Y);r.push(n)}if(1===n){const n=t[e-1];r.push(P[n>>2]+P[n<<4&63]+"==")}else if(2===n){const n=(t[e-2]<<8)+t[e-1];r.push(P[n>>10]+P[n>>4&63]+P[n<<2&63]+"=")}return r.join("")}(new Uint8Array(t))}static decode(t){return function(t){let e;const n=function(t){const e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");let n=t.indexOf("=");return-1===n&&(n=e),[n,n===e?0:4-n%4]}(t),r=n[0],i=n[1],s=new Uint8Array(function(t,e){return 3*(t+e)/4-e}(r,i));let o=0;const a=i>0?r-4:r;let c=0;for(;c<a;c+=4){const n=t.charCodeAt(c),r=t.charCodeAt(c+1),i=t.charCodeAt(c+2),a=t.charCodeAt(c+3);e=H[n]<<18|H[r]<<12|H[i]<<6|H[a],s[o++]=e>>16&255,s[o++]=e>>8&255,s[o++]=255&e}if(2===i){const n=t.charCodeAt(c),r=t.charCodeAt(c+1);e=H[n]<<2|H[r]>>4,s[o++]=255&e}if(1===i){const n=t.charCodeAt(c),r=t.charCodeAt(c+1),i=t.charCodeAt(c+2);e=H[n]<<10|H[r]<<4|H[i]>>2,s[o++]=e>>8&255,s[o++]=255&e}return s}(t).buffer}}const Q="uint8",X="uint16",Z="uint32",tt="int8",et="int16",nt="int32",rt="float32",it="float64",st={[Q]:Uint8Array,[X]:Uint16Array,[Z]:Uint32Array,[tt]:Int8Array,[et]:Int16Array,[nt]:Int32Array,float16:Uint16Array,[rt]:Float32Array,[it]:Float64Array};function ot(t){const e=Object.getPrototypeOf(t).constructor;switch(e){case Uint8Array:case Uint8ClampedArray:return Q;case Uint16Array:return X;case Uint32Array:return Z;case Int8Array:return tt;case Int16Array:return et;case Int32Array:return nt;case Float32Array:return rt;case Float64Array:return it;default:throw new Error(`unsupported constructor type ${e.name}`)}}function at(t,e,n){return t<e?e:t>n?n:t}function ct(t,e,n){return(e-t)*n+t}function ht(t,e,n,r,i){return.5*(r-e+(2*e-5*n+4*r-i+(3*(n-r)+i-e)*t)*t)*t+n}function ut(t){const e=t>>0;return 4294967295*(t-e)^e}class dt{constructor(t=[],e=1,n=0,r=0){if(!Number.isInteger(e)||e<0)throw new Error(`itemSize must be a non-negative integer, instead was ${e}`);if(!Number.isInteger(n)||n<0)throw new Error(`width must be a non-negative integer, instead was ${n}`);if(!Number.isInteger(r)||n<0)throw new Error(`height must be a non-negative integer, instead was ${r}`);if(void 0===t)throw new Error("data was undefined");if(t.length<n*r*e)throw new Error(`Buffer underflow, data.length(=${t.length}) is too small. Expected at least ${n*r*e}`);this.width=n,this.height=r,this.itemSize=e,this.data=t,this.version=0}sampleCatmullRomUV(t,e,n){const r=this.itemSize;for(let i=0;i<r;i++)n[i]=this.sampleChannelCatmullRomUV(t,e,i)}sampleChannelCatmullRomUV(t,e,n){const r=t*this.width-.5,i=e*this.height-.5;return this.sampleChannelCatmullRom(r,i,n)}sampleChannelCatmullRom(t,e,n){const r=Math.floor(t),i=Math.floor(e),s=t-r,o=e-i,a=s*(s*(1-.5*s)-.5),c=o*(o*(1-.5*o)-.5),h=s*(.5+s*(2-1.5*s)),u=o*(.5+o*(2-1.5*o)),d=s*s*(.5*s-.5),l=o*o*(.5*o-.5),f=1+s*s*(1.5*s-2.5)+h,g=1+o*o*(1.5*o-2.5)+u,p=r-1,y=i-1,_=r+2,w=i+2,m=r+h/f,v=i+u/g;let A=0;return A+=this.sampleChannelBilinear(p,y,n)*a*c,A+=this.sampleChannelBilinear(m,y,n)*f*c,A+=this.sampleChannelBilinear(_,y,n)*d*c,A+=this.sampleChannelBilinear(p,v,n)*a*g,A+=this.sampleChannelBilinear(m,v,n)*f*g,A+=this.sampleChannelBilinear(_,v,n)*d*g,A+=this.sampleChannelBilinear(p,w,n)*a*l,A+=this.sampleChannelBilinear(m,w,n)*f*l,A+=this.sampleChannelBilinear(_,w,n)*d*l,A}sampleBicubicUV(t,e,n){const r=this.itemSize;for(let i=0;i<r;i++)n[i]=this.sampleChannelBicubicUV(t,e,i)}sampleBicubic(t,e,n,r){const i=this.itemSize;for(let s=0;s<i;s++)n[s+r]=this.sampleChannelBicubic(t,e,s)}sampleChannelBicubicUV(t,e,n){const r=t*this.width,i=e*this.height;return this.sampleChannelBicubic(r-.5,i-.5,n)}sampleChannelBicubic(t,e,n){const r=this.itemSize,i=this.width,s=this.height,o=this.data,a=i*r,c=i-1,h=s-1,l=at(t,0,c),f=at(e,0,h),g=0|l,p=0|f,y=l-g,_=f-p,w=u(0,g-1),m=u(0,p-1),v=d(c,g+1),A=d(h,p+1),x=d(c,v+1),b=m*a+n,E=p*a+n,U=A*a+n,$=d(h,A+1)*a+n,F=w*r,S=g*r,z=v*r,C=x*r,V=o[b+F],B=o[b+S],M=o[b+z],I=o[b+C],L=o[E+F],T=o[E+S],q=o[E+z],N=o[E+C],k=o[U+F],O=o[U+S],j=o[U+z],D=o[U+C],R=o[$+F],J=o[$+S],P=o[$+z],H=o[$+C],W=ht(y,V,B,M,I),G=ht(y,L,T,q,N),Y=ht(y,k,O,j,D),K=ht(y,R,J,P,H);return ht(_,W,G,Y,K)}sampleBilinearUV(t,e,n,r=0){const i=this.itemSize;for(let s=0;s<i;s++)n[s+r]=this.sampleChannelBilinearUV(t,e,s)}sampleBilinear(t,e,n,r=0){const i=this.itemSize;for(let s=0;s<i;s++)n[s+r]=this.sampleChannelBilinear(t,e,s)}sampleChannelBilinearUV(t,e,n){const r=t*this.width-.5,i=e*this.height-.5;return this.sampleChannelBilinear(r,i,n)}sampleChannelBilinear(t,e,n){const r=this.itemSize,i=this.width,s=i*r,o=this.height-1,a=at(t,0,i-1),c=at(e,0,o),h=a>>>0,u=c>>>0,d=u*s,l=h*r+n,f=d+l;let g,p;g=a===h?h:h+1,p=c===u?u:u+1;const y=this.data,_=y[f];if(h===g&&u===p)return _;const w=a-h,m=c-u,v=g*r+n,A=p*s,x=A+l,b=A+v,E=y[d+v],U=y[x],$=y[b],F=ct(_,E,w),S=ct(U,$,w);return ct(F,S,m)}sampleNearestUV(t,e,n){const r=this.width,i=this.height,s=Math.round(t*r-.5),o=Math.round(e*i-.5);this.read(at(s,0,r-1),at(o,0,i-1),n)}readChannel(t,e,n){const r=(e*this.width+t)*this.itemSize+n;return this.data[r]}read(t,e,n){const r=this.width,i=this.itemSize,s=(e*r+t)*i;for(let t=0;t<i;t++)n[t]=this.data[s+t]}write(t,e,n){const r=this.width,i=this.itemSize,s=(e*r+t)*i;for(let t=0;t<i;t++)this.data[s+t]=n[t];this.version++}point2index(t,e){return t+e*this.width}index2point(t,e){const n=this.width,r=t%n,i=t/n|0;e.set(r,i)}copy(t,e,n,r,i,s,o){const a=Math.min(s,t.width-e,this.width-r),c=Math.min(o,t.height-n,this.height-i),h=this.itemSize,u=t.itemSize,d=Math.min(h,u),l=h*this.width,f=u*t.width,g=t.data,p=this.data;let y,_,w;for(_=0;_<c;_++){const t=(_+i)*l,s=(_+n)*f;for(y=0;y<a;y++){const n=t+(y+r)*h,i=s+(y+e)*u;for(w=0;w<d;w++)p[n+w]=g[i+w]}}this.version++}zeroFill(t,e,n,r){const i=at(t,0,this.width),s=at(e,0,this.height),o=at(t+n,0,this.width),a=at(e+r,0,this.height),c=this.data,h=this.itemSize,u=h*this.width,d=i*h,l=o*h;let f;for(f=s;f<a;f++){const t=f*u;c.fill(0,t+d,t+l)}this.version++}channelFill(t,e){const n=this.itemSize,r=this.data,i=r.length;for(let s=t;s<i;s+=n)r[s]=e;this.version++}fill(t,e,n,r,i){const s=this.width,o=this.height,a=at(t,0,s),c=at(e,0,o),h=at(t+n,0,s),u=at(e+r,0,o),d=this.data,l=this.itemSize,f=l*s;let g,p,y;for(g=c;g<u;g++){const t=g*f;for(p=a;p<h;p++){const e=t+p*l;for(y=0;y<l;y++)d[e+y]=i[y]}}this.version++}writeChannel(t,e,n,r){const i=(e*this.width+t)*this.itemSize+n;this.data[i]=r,this.version++}traverseCircle(t,e,n,r){let i,s;const o=0|t,a=0|e,c=n*n,h=Math.ceil(n);for(s=-h;s<=h;s++){const t=s*s;for(i=-h;i<=h;i++)i*i+t<=c&&r(o+i,a+s,this)}}resize(t,e,n=!0){const r=this.width,i=this.height;if(r===t&&i===e)return;const s=this.itemSize,o=t*e*s,a=this.data,c=new(function(t){if(t instanceof Int8Array)return Int8Array;if(t instanceof Int16Array)return Int16Array;if(t instanceof Int32Array)return Int32Array;if(t instanceof Uint8Array)return Uint8Array;if(t instanceof Uint8ClampedArray)return Uint8ClampedArray;if(t instanceof Uint16Array)return Uint16Array;if(t instanceof Uint32Array)return Uint32Array;if(t instanceof Float32Array)return Float32Array;if(t instanceof Float64Array)return Float64Array;if(Array.isArray(t))return Array;throw new TypeError("Unsupported array type")}(a))(o);if(n)if(t===r)c.set(a.subarray(0,Math.min(a.length,o)));else{const n=d(e,i),o=d(t,r);for(let e=0;e<n;e++)for(let n=0;n<o;n++){const i=(e*t+n)*s,o=(e*r+n)*s;for(let t=0;t<s;t++)c[i+t]=a[o+t]}}this.width=t,this.height=e,this.data=c,this.version++}computeByteSize(){let t;const e=this.data;return t=Array.isArray(e)?8*e.length:e.byteLength,t+280}equals(e){return this===e||this.width===e.width&&this.height===e.height&&this.itemSize===e.itemSize&&function(e,n){if(e===n)return!0;const r=e.length;if(r!==n.length)return!1;const i=e.constructor;if(i!==n.constructor)return!1;if(0===r)return!0;if(r<128)return t(e,n);const s=e.byteLength;if(s!==n.byteLength)return!1;const o=e.buffer,a=n.buffer,c=e.byteOffset,h=n.byteOffset;if(o===a&&c===h)return!0;let u=e,d=n;const l=i.BYTES_PER_ELEMENT,f=function(t,e,n){const r=t|e|n;return 0==(3&r)?4:0==(1&r)?2:1}(c,h,s);return l<4&&4===f?(u=new Uint32Array(o,c,s>>>2),d=new Uint32Array(a,h,s>>>2)):l<2&&2===f&&(u=new Uint16Array(o,c,s>>>1),d=new Uint16Array(a,h,s>>>1)),t(u,d)}(this.data,e.data)}hash(){const t=this.itemSize,e=this.width,n=this.height,r=this.data;let i=((65535&e)<<16|65535&n)^t;const s=e*n,o=Math.min(2048/t,s),a=Math.max(1,Math.round(s/o));if(function(t){const e=t.constructor;return e===Uint8ClampedArray||e===Uint8Array||e===Uint16Array||e===Uint32Array||e===Int8Array||e===Int16Array||e===Int32Array}(r))for(let e=0;e<s;e+=a)for(let n=0;n<t;n++)i=(i<<5)-i+r[e*t+n];else for(let e=0;e<s;e+=a)for(let n=0;n<t;n++)i=(i<<5)-i+ut(r[e*t+n]);return i}clone(){let t;return t=Array.isArray(this.data)?this.data.slice():new(0,this.data.constructor)(this.data),new dt(t,this.itemSize,this.width,this.height)}toJSON(){const t=K.encode(this.data.buffer);return{height:this.height,width:this.width,itemSize:this.itemSize,type:ot(this.data),data:t}}fromJSON({height:t,width:e,itemSize:n,type:r,data:i}){const s=function(t){const e=st[t];if(void 0===e)throw new Error(`Unsupported data type '${t}'`);return e}(r);if("string"==typeof i){const t=K.decode(i);this.data=new s(t)}else{if(!Array.isArray(i))throw new Error("Unsupported data format");this.data=new s(i)}this.height=t,this.width=e,this.itemSize=n}static uint8clamped(t,e,n){const r=new Uint8ClampedArray(e*n*t);return new dt(r,t,e,n)}static uint8(t,e,n){const r=new Uint8Array(e*n*t);return new dt(r,t,e,n)}static uint16(t,e,n){const r=new Uint16Array(e*n*t);return new dt(r,t,e,n)}static uint32(t,e,n){const r=new Uint32Array(e*n*t);return new dt(r,t,e,n)}static int8(t,e,n){const r=new Int8Array(e*n*t);return new dt(r,t,e,n)}static int16(t,e,n){const r=new Int16Array(e*n*t);return new dt(r,t,e,n)}static int32(t,e,n){const r=new Int32Array(e*n*t);return new dt(r,t,e,n)}static float32(t,e,n){const r=new Float32Array(e*n*t);return new dt(r,t,e,n)}static float64(t,e,n){const r=new Float64Array(e*n*t);return new dt(r,t,e,n)}}function lt(t,e,n,r){const i=n[r],s=n[r+1],o=n[r+2];t[e]+=i,t[e+1]+=s,t[e+2]+=o}function ft(t,e,n,r,i,s){const o=3*n,a=3*r,c=3*i;N(t,e,s[o],s[o+1],s[o+2],s[a],s[a+1],s[a+2],s[c],s[c+1],s[c+2])}function gt(t,e,n,r){const i=n[r],s=n[r+1],o=n[r+2],a=1/k(i,s,o);t[e]=i*a,t[e+1]=s*a,t[e+2]=o*a}dt.prototype.set=dt.prototype.write,dt.prototype.isSampler2D=!0,dt.typeName="Sampler2D";const pt=new Float64Array(3),yt={build:function(t,e,n,r,i,s){const o=n.x*s,a=n.y*s,c=o-1,h=a-1;let u=0,d=0;const l=o*a,f=new Float32Array(3*l),g=new Float32Array(3*l),p=new Float32Array(2*l);let y,_;const w=n.y/i.y/h,m=n.x/i.x/c,v=e.y/i.y,A=e.x/i.x,x=i.x*r.x,b=i.y*r.y;let E,U,$;for(y=0;y<a;y++){const e=y*w+v;for($=e*b,_=0;_<o;_++){const n=_*m+A;E=n*x,U=t.sampleChannelBicubicUV(n,e,0),f[u]=E,f[u+1]=U,f[u+2]=$,p[d]=n,p[d+1]=e,u+=3,d+=2}}u=0;const F=new(function(t){if(t<=256)return Uint8Array;if(t<=65536)return Uint16Array;if(t<=4294967295)return Uint32Array;throw new Error(`Unsupported size ${t}`)}(f.length/3))(c*h*6);for(y=0;y<h;y++)for(_=0;_<c;_++){const t=_+o*y,e=_+o*(y+1),n=_+1+o*(y+1),r=_+1+o*y;F[u]=t,F[u+1]=e,F[u+2]=r,F[u+3]=e,F[u+4]=n,F[u+5]=r,u+=6}return function(t,e,n){const r=n.length;for(let i=0;i<r;i+=3){const r=n[i],s=n[i+1],o=n[i+2];ft(pt,0,r,s,o,t),lt(e,3*r,pt,0),lt(e,3*s,pt,0),lt(e,3*o,pt,0)}!function(t,e=0,n=t.length-e){const r=e+n;for(let n=e;n<r;n+=3)gt(t,n,t,n)}(e)}(f,g,F),{indices:F,vertices:f,normals:g,uvs:p}}};self.Lib={build_bvh(t,e){const n=new m;return function(t,e,n){const r=n.length/3;t.setLeafCount(r),t.initialize_structure();for(let i=0;i<r;i++){const r=3*i;x(t,i,e,n[r],n[r+1],n[r+2])}t.build()}(n,t,e),n},Sampler2D:dt,BufferedGeometryArraysBuilder:yt,tensionOptimizeUV:function(t,e,n,r=3){const i=new J;i.build(t,n),i.computeEdgeSquaredLengths();const s=t.length/3;for(let t=0;t<r;t++)t:for(let t=0;t<s;t++){const n=i.vertices[t],r=n.edges,s=r.length;if(0===s)continue;let o=0,a=0,c=0;for(let t=0;t<s;t++){const i=r[t];if(b(i))continue t;const s=2*E(i,n).index,h=e[s],u=e[s+1],d=1/i.lengthSqr;o+=h*d,a+=u*d,c+=d}const h=o/c,u=a/c,d=2*n.index;e[d]=h,e[d+1]=u}},sampler2d_channel_compute_min:function(t,e=0){const n=t.itemSize,r=t.data,i=r.length;if(0===i)return;let s=r[e],o=e;for(let t=e+n;t<i;t+=n){const e=r[t];s>e&&(s=e,o=t)}const a=t.width,c=o/n|0;return{index:o,value:s,x:c%a,y:c/a|0}},sampler2d_channel_compute_max:function(t,e=0){const n=t.itemSize,r=t.data,i=r.length;if(0===i)return;let s=r[e],o=e;for(let t=e+n;t<i;t+=n){const e=r[t];s<e&&(s=e,o=t)}const a=t.width,c=o/n|0;return{index:o,value:s,x:c%a,y:c/a|0}}};
1
+ function t(t,e){const n=t.length;if(n!==e.length)return!1;for(let r=0;r<n;r++)if(t[r]!==e[r])return!1;return!0}function e(t){if("object"!=typeof t)return!1;if(null===t)return!1;const e=t.constructor;return e===Uint8Array||e===Uint16Array||e===Uint32Array||e===Int8Array||e===Int16Array||e===Int32Array||e===Float32Array||e===Float64Array||e===BigUint64Array||e===BigInt64Array}class n{appendDescriptionOf(t){throw new Error("Not Implemented")}appendList(t,e,n,r){throw new Error("Not Implemented")}appendText(t){throw new Error("Not Implemented")}appendValue(t){throw new Error("Not Implemented")}appendValueList(t,e,n,r){throw new Error("Not Implemented")}}class r{describeTo(t){throw new Error("Not Implemented")}}class i extends r{value;constructor(t){super(),this.value=t}describeTo(t){t.appendValue(this.value)}}class s{#t;constructor(t){this.#t=t}*[Symbol.iterator](){for(const t of this.#t)yield new i(t)}}class o extends n{appendDescriptionOf(t){return t.describeTo(this),this}#e(t){this.appendText('"'),this.appendText(t),this.appendText('"')}appendValue(t){return null==t?this.appendText("null"):void 0===t?this.appendText("undefined"):"string"==typeof t?this.#e(t):"number"==typeof t?this.appendText(function(t){return String(t)}(t)):Array.isArray(t)?this.appendValueList("[",", ","]",t):(this.appendText("<"),this.appendText(function(t){try{return String(t)}catch(t){return"VALUE@0"}}(t)),this.appendText(">")),this}appendValueList(t,e,n,r){return this.appendList(t,e,n,new s(r)),this}appendList(t,e,n,r){let i=!1;this.appendText(t);const s=r[Symbol.iterator]();for(let t=s.next();!0!==t.done;t=s.next())i&&this.appendText(e),this.appendDescriptionOf(t.value),i=!0;return this.appendText(n),this}}class a extends o{value="";appendText(t){return this.value+=t,this}}function c(t,e){if(!t)throw new Error(e||"AssertionError")}function h(t,e,n,r,i){let s,o,a;for(a=0;a<i;a++)s=e+a,o=r+a,n[o]=t[s]}c.enum=function(t,e,n="value"){for(let n in e)if(e[n]===t)return;throw new Error(`${n}(=${t}) is not a valid enumerable value, valid values are: [${Object.values(e).join(", ")}]`)},c.notEqual=function(t,e,n){c(t!==e,n)},c.notOk=function(t,e){c(!t,e)},c.equal=function(t,e,n){if(t!==e){const r=`${t} !== ${e}`;throw new Error(void 0!==n&&""!==n?`${n}. ${r}`:r)}},c.logicalyEqual=function(t,e,n){},c.ok=c,c.greaterThan=function(t,e,n){if(!(t>e)){let r="";throw void 0!==n&&(r+=n+". "),r+=`Expected ${t} > ${e}.`,new Error(r)}},c.greaterThanOrEqual=function(t,e,n){if(!(t>=e)){let r="";throw void 0!==n&&(r+=n+". "),r+=`Expected ${t} >= ${e}.`,new Error(r)}},c.lessThan=function(t,e,n){if(!(t<e)){let r="";throw void 0!==n&&(r+=n+". "),r+=`Expected ${t} < ${e}.`,new Error(r)}},c.lessThanOrEqual=function(t,e,n){if(!(t<=e)){let r="";throw void 0!==n&&(r+=n+". "),r+=`Expected ${t} <= ${e}.`,new Error(r)}},c.typeOf=function(t,e,n="value"){const r=typeof t;if(r!==e)throw new Error(`expected ${n} to be ${e}, instead was '${r}'(=${t})`)},c.arrayHas=function(t,e,n="Array does not contain the item"){},c.arrayHasNo=function(t,e,n="Array contains the item"){},c.arrayEqual=function(e,n,r="Arrays are not equal"){if(!t(e,n))throw new Error(r)},c.isInstanceOf=function(t,e,n="value",r=e.name){},c.isNumber=function(t,e="value"){const n=typeof t;if("number"!==n)throw new Error(`expected ${e} to be a number, instead was '${n}'(=${t})`)},c.isString=function(t,e="value"){const n=typeof t;if("string"!==n)throw new Error(`expected ${e} to be a string, instead was '${n}'(=${t})`)},c.isBoolean=function(t,e="value"){const n=typeof t;if("boolean"!==n)throw new Error(`expected ${e} to be a boolean, instead was '${n}'(=${t})`)},c.isFunction=function(t,e="value"){const n=typeof t;if("function"!==n)throw new Error(`expected ${e} to be a function, instead was '${n}'(=${t})`)},c.isObject=function(t,e="value"){const n=typeof t;if("object"!==n)throw new Error(`expected ${e} to be an object, instead was '${n}'(=${t})`)},c.isInteger=function(t,e="value"){if(!Number.isInteger(t))throw new Error(`${e} must be an integer, instead was ${t}`)},c.isNonNegativeInteger=function(t,e="value"){if(t<0)throw new Error(`${e} must be >= 0, instead was ${t}`)},c.isArray=function(t,e="value"){if(!Array.isArray(t))throw new Error(`expected ${e} to be an array, instead was something else (typeof ='${typeof t}')`)},c.isArrayLike=function(t,n="value"){if(!Array.isArray(t)&&!e(t))throw new Error(`expected ${n} to be an array-like structure, instead was something else (typeof ='${typeof t}')`)},c.defined=function(t,e="value"){if(void 0===t)throw new Error(`${e} is undefined`)},c.isNull=function(t,e){if(null!==t)throw new Error(`${e} is NOT null`)},c.notNull=function(t,e="value"){if(null===t)throw new Error(`${e} is null`)},c.notNaN=function(t,e="value"){if(Number.isNaN(t))throw new Error(`${e} must be a valid number, instead was NaN`)},c.isFiniteNumber=function(t,e="value"){if(!Number.isFinite(t))throw new Error(`${e} must be a finite number, instead was ${t}`)},c.that=function(t,e,n){if(n.matches(t))return;const r=new a;throw r.appendText(`Expected ${e} to be `),n.describeTo(r),r.appendText(" instead "),n.describeMismatch(t,r),new Error(r.value)};const u=new Uint32Array(781250);function d(t,e){return t<e?e:t}function l(t,e){return t<e?t:e}function f(t,e,n,r,i,s){const o=n[r+0],a=n[r+1],c=n[r+2],h=n[r+3],u=n[r+4],f=n[r+5],g=i[s+0],p=i[s+1],y=i[s+2],w=i[s+3],_=i[s+4],m=i[s+5],v=l(o,g),x=l(a,p),A=l(c,y),b=d(h,w),E=d(u,_),$=d(f,m);t[e+0]=v,t[e+1]=x,t[e+2]=A,t[e+3]=b,t[e+4]=E,t[e+5]=$}function g(t,e,n,r,i,s,o,a){t[e]=n,t[e+1]=r,t[e+2]=i,t[e+3]=s,t[e+4]=o,t[e+5]=a}function p(t,e,n,r,i,s){const o=r-t,a=s-n;return(i-e)*(o+a)+a*o}function y(t){let e=t;return e=50331903&(e|e<<16),e=50393103&(e|e<<8),e=51130563&(e|e<<4),e=153391689&(e|e<<2),e}function w(t,e,n){const r=t[n],i=t[n+1],s=t[n+2];g(t,e,r,i,s,r,i,s)}function _(t,e,n){const r=t[e],i=t[e+1],s=t[e+2];return function(t,e,n,r){const i=r[0],s=r[1],o=r[2],a=1023*(t-i)/(r[3]-i),c=1023*(e-s)/(r[4]-s),h=1023*(n-o)/(r[5]-o);return function(t,e,n){return y(t)|y(e)<<1|y(n)<<2}(Math.round(a),Math.round(c),Math.round(h))}(.5*(r+t[e+3]),.5*(i+t[e+4]),.5*(s+t[e+5]),n)}u.pointer=0;const m=u;class v{__data_buffer;__data_float32;__data_uint32;__node_count_binary=0;__node_count_leaf=0;constructor(){this.data=new ArrayBuffer(320)}estimateByteSize(){return this.data.byteLength+248}getTotalBoxCount(){return this.__node_count_binary+this.__node_count_leaf}get binary_node_count(){return this.__node_count_binary}get leaf_node_count(){return this.__node_count_leaf}getLeafBlockAddress(){return 6*this.__node_count_binary}get float32(){return this.__data_float32}get uint32(){return this.__data_uint32}set data(t){this.__data_buffer=t,this.__data_float32=new Float32Array(this.__data_buffer),this.__data_uint32=new Uint32Array(this.__data_buffer)}get data(){return this.__data_buffer}getNodeAddress(t){const e=this.__node_count_binary,n=t-e;return n<0?6*t:6*e+7*n}initialize_structure(){const t=4*(6*this.__node_count_binary+7*this.__node_count_leaf);this.__data_buffer.byteLength<t&&(this.data=new ArrayBuffer(t))}setLeafCount(t){this.__node_count_leaf=t;const e=function(t){let e=t-1;return e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,e|=e>>16,e++,e}(t);this.__node_count_binary=t<=1?e:e-1}getLeafAddress(t){return 7*t+6*this.__node_count_binary}setLeafData(t,e,n,r,i,s,o,a){const c=this.getLeafAddress(t);g(this.__data_float32,c,n,r,i,s,o,a),this.__data_uint32[c+6]=e}readBounds(t,e,n){h(this.__data_float32,t,e,n,6)}readLeafPayload(t){const e=this.getLeafBlockAddress()+7*t+6;return this.__data_uint32[e]}compute_total_surface_area(){let t=0;const e=new Float32Array(6);for(let n=0;n<this.getTotalBoxCount();n++){let r;r=n<this.__node_count_binary?6*n:7*(n-this.__node_count_binary)+this.getLeafBlockAddress(),this.readBounds(r,e,0),t+=p(e[0],e[1],e[2],e[3],e[4],e[5])}return t}sort_morton(t){const e=6*this.__node_count_binary;if(this.__node_count_leaf<2)return;const n=m.pointer;let r,i,s=n;m[s++]=0,m[s++]=this.__node_count_leaf-1;const o=this.__data_float32;for(;s>n;){s-=2;const n=m[s+1],a=m[s];r=a,i=n;const c=_(o,7*(a+n>>1)+e,t);for(;r<=i;){for(;_(o,7*r+e,t)<c;)r++;for(;_(o,7*i+e,t)>c;)i--;r<=i&&(r!==i&&this.__swap_leaves(r,i),r++,i--)}a<i&&(m[s++]=a,m[s++]=i),r<n&&(m[s++]=r,m[s++]=n)}}__swap_leaves(t,e){const n=this.getLeafBlockAddress(),r=7*t+n,i=7*e+n;!function(t,e,n,r,i){for(let i=0;i<7;i++){const s=e+i,o=r+i,a=n[o];n[o]=t[s],t[s]=a}}(this.__data_float32,r,this.__data_float32,i)}build(){const t=this.__node_count_binary,e=6*t;let n,r,i,s,o=Math.floor(Math.log(t)/Math.log(2));i=Math.pow(2,o),r=6*(i-1);const a=this.__node_count_leaf,c=this.__data_float32;for(n=0;n<i;n++){const t=n<<1,i=t+1,s=e+7*t;i<a?f(c,r,c,s,c,e+7*i):t<a?h(c,s,c,r,6):w(this.__data_float32,r,r-6),r+=6}for(o--;o>=0;o--)for(i=1<<o,s=i-1,n=0;n<i;n++){const t=6*(1+(s<<1));f(c,6*s,c,t,c,t+6),s++}}}function x(t,e,n){let r=t;return r<e&&(r=e),r<n&&(r=n),r}function A(t,e,n){let r=t;return r>e&&(r=e),r>n&&(r=n),r}function b(t,e,n,r,i,s){const o=t.getLeafAddress(e);!function(t,e,n,r,i,s){const o=3*r,a=3*i,c=3*s,h=n[o],u=n[o+1],d=n[o+2],l=n[a],f=n[a+1],g=n[a+2],p=n[c],y=n[c+1],w=n[c+2];t[e]=A(h,l,p),t[e+1]=A(u,f,y),t[e+2]=A(d,g,w),t[e+3]=x(h,l,p),t[e+4]=x(u,f,y),t[e+5]=x(d,g,w)}(t.__data_float32,o,n,r,i,s),t.__data_uint32[o+6]=e}function E(t){return 1===t.faces.length}function $(t,e){return t.v0===e?t.v1:t.v1===e?t.v0:null}var U,F="undefined"!=typeof Float32Array?Float32Array:Array;function S(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t}function z(t,e){return-1===t.indexOf(e)&&(t.push(e),!0)}function C(){}function V(t,e=","){return t.toString().replace(/\B(?=(\d{3})+(?!\d))/g,e)}function B(t,e){t.__edges.delete(e)}function L(t,e,n=0,r=t.length){const i=n+r;for(let r=n;r<i;r++)if(t[r]===e)return t.splice(r,1),!0;return!1}function T(t,e){return t.v0===e||t.v1===e}function q(t,e,n){const r=t.v0,i=t.v1;return!(r!==e&&r!==n||i!==e&&i!==n)}Math.hypot||(Math.hypot=function(){for(var t=0,e=arguments.length;e--;)t+=arguments[e]*arguments[e];return Math.sqrt(t)}),U=new F(3),F!=Float32Array&&(U[0]=0,U[1]=0,U[2]=0);let M=0;class I{index=M++;v0=null;v1=null;faces=[];lengthSqr=-1;get byteSize(){return 128+8*this.faces.length+10}getVertexByIndex(t){if(0===t)return this.v0;if(1===t)return this.v1;throw new Error("Index out of bounds")}copy(t){this.v0=t.v0,this.v1=t.v1,this.lengthSqr=t.lengthSqr,this.faces=t.faces.slice()}clone(){const t=new I;return t.copy(this),t}validate(t){let e=!0;const n=this.faces,r=n.length;for(let i=0;i<r;i++)n[i].containsEdge(this)||(t(`Missing back-link from face[${i}]`),e=!1);return this.v0.containsEdge(this)||(t("Missing back-link from vertex v0"),e=!1),this.v1.containsEdge(this)||(t("Missing back-link from vertex v1"),e=!1),e}isLinked(){return this.v0.containsEdge(this)}unlink(){const t=this.v0,e=this.v1;t.removeEdge(this),t!==e&&e.removeEdge(this);const n=this.faces,r=n.length;for(let t=0;t<r;t++)n[t].removeEdge(this)}isDegenerateEdge(){return this.v0===this.v1}isTopologyBorder(){return E(this)}get length(){return this.lengthSqr<0&&this.computeSquaredLength(),Math.sqrt(this.lengthSqr)}computeSquaredLength(){const t=this.v0,e=this.v1,n=t.x,r=t.y,i=t.z,s=n-e.x,o=r-e.y,a=i-e.z;this.lengthSqr=s*s+o*o+a*a}replaceVertex(t,e){t===this.v0&&(this.v0=e),t===this.v1&&(this.v1=e)}merge(t){const e=t.faces,n=this.faces,r=e.length;for(let i=0;i<r;i++){const r=e[i];r.removeEdge(t),-1===n.indexOf(r)&&(n.push(r),r.addUniqueEdge(this))}t.v0.removeEdge(t),t.v1.removeEdge(t)}containsFace(t){return-1!==this.faces.indexOf(t)}addFace(t){this.faces.push(t)}addUniqueFace(t){z(this.faces,t)}removeFace(t){L(this.faces,t)}getOtherVertex(t){return $(this,t)}containsVertex(t){return T(this,t)}containsBothVertices(t,e){return q(this,t,e)}containsSameVerticesAs(t){return q(this,t.v0,t.v1)}}function N(t,e,n){const r=t.length;for(let i=0;i<r;i++)t[i]===e&&(t[i]=n);return t}function k(t,e,n,r,i,s,o,a,c,h,u){const d=c-s,l=h-o,f=u-a,g=n-s,p=r-o,y=i-a,w=l*y-f*p,_=f*g-d*y,m=d*p-l*g,v=function(t,e,n){return t*t+e*e+n*n}(w,_,m);if(0===v)return t[e]=0,t[e+1]=1,void(t[e+2]=0);const x=1/Math.sqrt(v),A=w*x,b=_*x,E=m*x;t[e]=A,t[e+1]=b,t[e+2]=E}function O(t,e,n){return Math.sqrt(t*t+e*e+n*n)}I.prototype.isTopoEdge=!0;let j=0;class D{index=j++;edges=[];faces=[];x=0;y=0;z=0;get 0(){return this.x}get 1(){return this.y}get 2(){return this.z}get byteSize(){return 112+8*this.edges.length+10+8*this.faces.length+10}copy(t){this.x=t.x,this.y=t.y,this.z=t.z,this.index=t.index,this.faces=t.faces.slice(),this.edges=t.edges.slice()}clone(){const t=new D;return t.copy(this),t}validate(t){let e=!0;const n=this.faces,r=n.length;for(let i=0;i<r;i++)n[i].containsVertex(this)||(t(`Missing back-link from face[${i}]`),e=!1);const i=this.edges,s=i.length;for(let n=0;n<s;n++)T(i[n],this)||(t(`Missing back-link from edge[${n}]`),e=!1);return e}distanceTo(t){return e=this.x,n=this.y,r=this.z,O(t.x-e,t.y-n,t.z-r);var e,n,r}addFace(t){this.faces.push(t)}addUniqueFace(t){return z(this.faces,t)}containsFace(t){return-1!==this.faces.indexOf(t)}removeFace(t){L(this.faces,t)}addEdge(t){this.edges.push(t)}addUniqueEdge(t){return z(this.edges,t)}replaceEdge(t,e){const n=this.edges,r=n.indexOf(t);n[r]=e}containsEdge(t){return-1!==this.edges.indexOf(t)}removeEdge(t){return L(this.edges,t)}replaceAnotherVertex(t){throw new Error('deprecated, use "tm_vert_splice" instead')}computeNeighbourVertices(t,e){let n=0;const r=this.edges,i=r.length;for(let s=0;s<i;s++){const i=r[s].getOtherVertex(this);t[e+n]=i,n++}return n}static from(t,e,n){const r=new D;return r.x=t,r.y=e,r.z=n,r}}D.prototype.isTopoVertex=!0;let R=0;class J{index=R++;vertices=[];edges=[];normal=[0,0,0];get byteSize(){return 100+8*this.vertices.length+10+8*this.edges.length+10+24+10}copy(t){this.index=t.index,this.vertices=t.vertices.slice(),this.edges=t.edges.slice(),S(this.normal,t.normal)}clone(){const t=new J;return t.copy(this),t}validate(t){let e=!0;const n=this.vertices,r=n.length;3!==r&&(t(`Expected number of vertices is 3, instead got ${r}`),e=!1);for(let i=0;i<r;i++)n[i].containsFace(this)||(t(`Missing back-link from vertex[${i}]`),e=!1);const i=this.edges,s=i.length;3!==s&&(t(`Expected number of edges is 3, instead got ${s}`),e=!1);for(let n=0;n<s;n++)i[n].containsFace(this)||(t(`Missing back-link from edge[${n}]`),e=!1);return e}isLinked(){return this.vertices[0].containsFace(this)}replaceEdge(t,e){N(this.edges,t,e)}replaceVertex(t,e){N(this.vertices,t,e)}isDegenerateTopology(){const t=this.vertices,e=t[0],n=t[1],r=t[2];return e===n||e===r||n===r}unlink(){const t=this.vertices,e=t.length;for(let n=0;n<e;n++)t[n].removeFace(this);const n=this.edges,r=n.length;for(let t=0;t<r;t++)n[t].removeFace(this)}addEdge(t){this.edges.push(t)}addUniqueEdge(t){return z(this.edges,t)}removeEdge(t){L(this.edges,t)}containsEdge(t){return-1!==this.edges.indexOf(t)}computeNormal(){const t=this.vertices,e=t[0],n=t[1],r=t[2];!function(t,e,n,r){k(t,0,e[0],e[1],e[2],n[0],n[1],n[2],r[0],r[1],r[2])}(this.normal,e,n,r)}setVertexAt(t,e){this.vertices[t]=e}containsVertex(t){return-1!==this.vertices.indexOf(t)}getEdgeNeighbours(t,e){let n=0;const r=this.edges,i=r.length;for(let s=0;s<i;s++){const i=r[s].faces,o=i.length;for(let r=0;r<o;r++){const s=i[r];s!==this&&(t[e+n]=s,n++)}}return n}static fromPoints(t,e,n,r,i,s,o,a,c){const h=D.from(t,e,n),u=D.from(r,i,s),d=D.from(o,a,c),l=new I,f=new I,g=new I;l.v0=h,l.v1=u,f.v0=u,f.v1=d,g.v0=d,g.v1=h;const p=new J;return p.edges.push(l,f,g),p.vertices.push(h,u,d),h.faces.push(p),u.faces.push(p),d.faces.push(p),l.faces.push(p),f.faces.push(p),g.faces.push(p),h.edges.push(l,g),u.edges.push(l,f),d.edges.push(f,g),p}}J.prototype.isTopoFace=!0;class P{vertices=[];__edges=new Set;__faces=new Set;get byteSize(){let t=0;for(let e=0;e<this.vertices.length;e++)t+=this.vertices[e].byteSize;for(const e of this.__edges)t+=e.byteSize;for(const e of this.__faces)t+=e.byteSize;return t}getEdges(){return this.__edges}getFaces(){return this.__faces}getFaceByIndex(t){for(const e of this.__faces)if(e.index===t)return e}validate(t=C){let e=!0,n="",r=0;function i(i){t(`${n}[${r}]: ${i}`),e=!1}n="Edge",r=0;const s=this.getEdges();for(let t of s){t.validate(i),this.containsVertex(t.v0)||i("Link to off-mesh vertex v0"),this.containsVertex(t.v1)||i("Link to off-mesh vertex v1");const e=t.faces,n=e.length;for(let t=0;t<n;t++){const n=e[t];this.containsFace(n)||i(`Link to off-mesh face[${t}]`)}r++}const o=this.getFaces();n="Face",r=0;for(let t of o){t.validate(i);const e=t.edges,n=e.length;for(let t=0;t<n;t++){const n=e[t];this.containsEdge(n)||i(`Link to off-mesh edge[${t}]`)}const s=t.vertices,o=s.length;for(let t=0;t<o;t++){const e=s[t];this.containsVertex(e)||i(`Link to off-mesh vertex[${t}]`)}r++}const a=this.vertices,c=a.length;n="Vertex";for(let t=0;t<c;t++){r=t;const e=a[t];e.validate(i);const n=e.edges,s=n.length;for(let t=0;t<s;t++){const e=n[t];this.containsEdge(e)||i(`Link to off-mesh edge[${t}]`)}const o=e.faces,c=o.length;for(let t=0;t<c;t++){const e=o[t];this.containsFace(e)||i(`Link to off-mesh face[${t}]`)}}return e}clone(){const t=new P;return t.add(this),t}buildVertexMapping(){const t=new Map,e=this.vertices,n=e.length;for(let r=0;r<n;r++){const n=e[r];t.set(n.index,n)}return t}_addWithVertexMap(t,e){const n=t.getFaces();for(let t of n)this.addFaceCopy(t,e)}addFaceCopy(t,e){const n=new J;S(n.normal,t.normal);const r=t.vertices;for(let t=0;t<3;t++){const i=r[t];let s=e.get(i.index);void 0===s&&(s=new D,s.index=i.index,s.x=i.x,s.y=i.y,s.z=i.z,e.set(i.index,s),this.addVertex(s)),n.setVertexAt(t,s),s.addUniqueFace(n)}this.addFace(n),this.patchFaceEdges(n)}patchFaceEdges(t){const e=t.vertices,n=e[0],r=e[1],i=e[2],s=this.ensureEdge(n,r),o=this.ensureEdge(r,i),a=this.ensureEdge(i,n);s.addUniqueFace(t),o.addUniqueFace(t),a.addUniqueFace(t),t.addUniqueEdge(s),t.addUniqueEdge(o),t.addUniqueEdge(a)}add(t){const e=this.buildVertexMapping();this._addWithVertexMap(t,e)}addVertex(t){this.vertices.push(t)}addUniqueVertex(t){z(this.vertices,t)}removeVertex(t){var e;e=t,L(this.vertices,e)}containsVertex(t){return-1!==this.vertices.indexOf(t)}addEdge(t){this.__edges.add(t)}addUniqueEdge(t){this.__edges.add(t)}removeEdge(t){B(this,t)}containsEdge(t){return this.__edges.has(t)}addFace(t){this.__faces.add(t)}injectManyFaces(t){for(let e of t)this.injectFace(e)}injectFace(t){this.addFace(t);const e=t.edges,n=e.length;for(let t=0;t<n;t++){const n=e[t];this.addUniqueEdge(n)}const r=t.vertices,i=r.length;for(let t=0;t<i;t++){const e=r[t];this.addUniqueVertex(e)}}removeFace(t){var e;e=t,this.__faces.delete(e)}containsFace(t){return this.__faces.has(t)}ensureEdge(t,e){const n=t.edges,r=n.length;for(let i=0;i<r;i++){const r=n[i];if($(r,t)===e)return r}const i=new I;return i.v0=t,i.v1=e,t.edges.push(i),e.edges.push(i),this.__edges.add(i),i}mergeEdges(){const t=this.getEdges();for(let e of t){const n=e.v0,r=e.v1;for(let i of t){if(e===i)continue;const t=i.v0,s=i.v1;if(n===t){if(r!==s)continue}else{if(n!==s)continue;if(r!==t)continue}B(this,i),e.merge(i)}}}computeEdgeSquaredLengths(){const t=this.getEdges();for(let e of t)e.computeSquaredLength()}setVerticesFromArray(t){const e=t.length/3,n=this.vertices;for(let r=0;r<e;r++){const e=3*r,i=new D;i.index=r,i.x=t[e],i.y=t[e+1],i.z=t[e+2],n[r]=i}}setFacesFromIndexArray(t){const e=t.length,n=this.vertices,r=e/3;for(let e=0;e<r;e++){const r=3*e,i=t[r],s=t[r+1],o=t[r+2];this.createTriangle(e,n[i],n[s],n[o])}}setFacedUnindexed(){const t=this.vertices,e=t.length/3;for(let n=0;n<e;n++){const e=3*n;this.createTriangle(n,t[e],t[e+1],t[e+2])}}build(t,e){this.setVerticesFromArray(t),null==e?this.setFacedUnindexed():this.setFacesFromIndexArray(e)}createTriangle(t,e,n,r){const i=new J;i.index=t;const s=this.ensureEdge(e,n),o=this.ensureEdge(n,r),a=this.ensureEdge(r,e);return s.faces.push(i),o.faces.push(i),a.faces.push(i),i.vertices.push(e,n,r),i.edges.push(s,o,a),e.faces.push(i),n.faces.push(i),r.faces.push(i),this.__faces.add(i),i}toString(){return`TopoMesh{ vertices: ${V(this.vertices.length)}, edges: ${V(this.getEdges().size)}, faces: ${V(this.getFaces().size)} }`}}P.prototype.isTopoMesh=!0;const H=[],W=[],G="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(let t=0,e=64;t<e;++t)H[t]=G[t],W[G.charCodeAt(t)]=t;function Y(t,e,n){const r=[];for(let s=e;s<n;s+=3){const e=(t[s]<<16&16711680)+(t[s+1]<<8&65280)+(255&t[s+2]);r.push(H[(i=e)>>18&63]+H[i>>12&63]+H[i>>6&63]+H[63&i])}var i;return r.join("")}W["-".charCodeAt(0)]=62,W["_".charCodeAt(0)]=63;const K=16383;class Q{static encode(t){return function(t){const e=t.length,n=e%3,r=[],i=e-n;for(let e=0;e<i;e+=K){const n=Y(t,e,e+K>i?i:e+K);r.push(n)}if(1===n){const n=t[e-1];r.push(H[n>>2]+H[n<<4&63]+"==")}else if(2===n){const n=(t[e-2]<<8)+t[e-1];r.push(H[n>>10]+H[n>>4&63]+H[n<<2&63]+"=")}return r.join("")}(new Uint8Array(t))}static decode(t){return function(t){let e;const n=function(t){const e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");let n=t.indexOf("=");return-1===n&&(n=e),[n,n===e?0:4-n%4]}(t),r=n[0],i=n[1],s=new Uint8Array(function(t,e){return 3*(t+e)/4-e}(r,i));let o=0;const a=i>0?r-4:r;let c=0;for(;c<a;c+=4){const n=t.charCodeAt(c),r=t.charCodeAt(c+1),i=t.charCodeAt(c+2),a=t.charCodeAt(c+3);e=W[n]<<18|W[r]<<12|W[i]<<6|W[a],s[o++]=e>>16&255,s[o++]=e>>8&255,s[o++]=255&e}if(2===i){const n=t.charCodeAt(c),r=t.charCodeAt(c+1);e=W[n]<<2|W[r]>>4,s[o++]=255&e}if(1===i){const n=t.charCodeAt(c),r=t.charCodeAt(c+1),i=t.charCodeAt(c+2);e=W[n]<<10|W[r]<<4|W[i]>>2,s[o++]=e>>8&255,s[o++]=255&e}return s}(t).buffer}}const X="uint8",Z="uint16",tt="uint32",et="int8",nt="int16",rt="int32",it="float32",st="float64",ot={[X]:Uint8Array,[Z]:Uint16Array,[tt]:Uint32Array,[et]:Int8Array,[nt]:Int16Array,[rt]:Int32Array,float16:Uint16Array,[it]:Float32Array,[st]:Float64Array};function at(t){const e=Object.getPrototypeOf(t).constructor;switch(e){case Uint8Array:case Uint8ClampedArray:return X;case Uint16Array:return Z;case Uint32Array:return tt;case Int8Array:return et;case Int16Array:return nt;case Int32Array:return rt;case Float32Array:return it;case Float64Array:return st;default:throw new Error(`unsupported constructor type ${e.name}`)}}function ct(t,e,n){return t<e?e:t>n?n:t}function ht(t,e,n){return(e-t)*n+t}function ut(t,e,n,r,i){return.5*(r-e+(2*e-5*n+4*r-i+(3*(n-r)+i-e)*t)*t)*t+n}function dt(t){const e=t>>0;return 4294967295*(t-e)^e}class lt{constructor(t=[],e=1,n=0,r=0){if(!Number.isInteger(e)||e<0)throw new Error(`itemSize must be a non-negative integer, instead was ${e}`);if(!Number.isInteger(n)||n<0)throw new Error(`width must be a non-negative integer, instead was ${n}`);if(!Number.isInteger(r)||n<0)throw new Error(`height must be a non-negative integer, instead was ${r}`);if(void 0===t)throw new Error("data was undefined");if(t.length<n*r*e)throw new Error(`Buffer underflow, data.length(=${t.length}) is too small. Expected at least ${n*r*e}`);this.width=n,this.height=r,this.itemSize=e,this.data=t,this.version=0}sampleCatmullRomUV(t,e,n){const r=this.itemSize;for(let i=0;i<r;i++)n[i]=this.sampleChannelCatmullRomUV(t,e,i)}sampleChannelCatmullRomUV(t,e,n){const r=t*this.width-.5,i=e*this.height-.5;return this.sampleChannelCatmullRom(r,i,n)}sampleChannelCatmullRom(t,e,n){const r=Math.floor(t),i=Math.floor(e),s=t-r,o=e-i,a=s*(s*(1-.5*s)-.5),c=o*(o*(1-.5*o)-.5),h=s*(.5+s*(2-1.5*s)),u=o*(.5+o*(2-1.5*o)),d=s*s*(.5*s-.5),l=o*o*(.5*o-.5),f=1+s*s*(1.5*s-2.5)+h,g=1+o*o*(1.5*o-2.5)+u,p=r-1,y=i-1,w=r+2,_=i+2,m=r+h/f,v=i+u/g;let x=0;return x+=this.sampleChannelBilinear(p,y,n)*a*c,x+=this.sampleChannelBilinear(m,y,n)*f*c,x+=this.sampleChannelBilinear(w,y,n)*d*c,x+=this.sampleChannelBilinear(p,v,n)*a*g,x+=this.sampleChannelBilinear(m,v,n)*f*g,x+=this.sampleChannelBilinear(w,v,n)*d*g,x+=this.sampleChannelBilinear(p,_,n)*a*l,x+=this.sampleChannelBilinear(m,_,n)*f*l,x+=this.sampleChannelBilinear(w,_,n)*d*l,x}sampleBicubicUV(t,e,n){const r=this.itemSize;for(let i=0;i<r;i++)n[i]=this.sampleChannelBicubicUV(t,e,i)}sampleBicubic(t,e,n,r){const i=this.itemSize;for(let s=0;s<i;s++)n[s+r]=this.sampleChannelBicubic(t,e,s)}sampleChannelBicubicUV(t,e,n){const r=t*this.width,i=e*this.height;return this.sampleChannelBicubic(r-.5,i-.5,n)}sampleChannelBicubic(t,e,n){const r=this.itemSize,i=this.width,s=this.height,o=this.data,a=i*r,c=i-1,h=s-1,u=ct(t,0,c),f=ct(e,0,h),g=0|u,p=0|f,y=u-g,w=f-p,_=d(0,g-1),m=d(0,p-1),v=l(c,g+1),x=l(h,p+1),A=l(c,v+1),b=m*a+n,E=p*a+n,$=x*a+n,U=l(h,x+1)*a+n,F=_*r,S=g*r,z=v*r,C=A*r,V=o[b+F],B=o[b+S],L=o[b+z],T=o[b+C],q=o[E+F],M=o[E+S],I=o[E+z],N=o[E+C],k=o[$+F],O=o[$+S],j=o[$+z],D=o[$+C],R=o[U+F],J=o[U+S],P=o[U+z],H=o[U+C],W=ut(y,V,B,L,T),G=ut(y,q,M,I,N),Y=ut(y,k,O,j,D),K=ut(y,R,J,P,H);return ut(w,W,G,Y,K)}sampleBilinearUV(t,e,n,r=0){const i=this.itemSize;for(let s=0;s<i;s++)n[s+r]=this.sampleChannelBilinearUV(t,e,s)}sampleBilinear(t,e,n,r=0){const i=this.itemSize;for(let s=0;s<i;s++)n[s+r]=this.sampleChannelBilinear(t,e,s)}sampleChannelBilinearUV(t,e,n){const r=t*this.width-.5,i=e*this.height-.5;return this.sampleChannelBilinear(r,i,n)}sampleChannelBilinear(t,e,n){const r=this.itemSize,i=this.width,s=i*r,o=this.height-1,a=ct(t,0,i-1),c=ct(e,0,o),h=a>>>0,u=c>>>0,d=u*s,l=h*r+n,f=d+l;let g,p;g=a===h?h:h+1,p=c===u?u:u+1;const y=this.data,w=y[f];if(h===g&&u===p)return w;const _=a-h,m=c-u,v=g*r+n,x=p*s,A=x+l,b=x+v,E=y[d+v],$=y[A],U=y[b],F=ht(w,E,_),S=ht($,U,_);return ht(F,S,m)}sampleNearestUV(t,e,n){const r=this.width,i=this.height,s=Math.round(t*r-.5),o=Math.round(e*i-.5);this.read(ct(s,0,r-1),ct(o,0,i-1),n)}readChannel(t,e,n){const r=(e*this.width+t)*this.itemSize+n;return this.data[r]}read(t,e,n){const r=this.width,i=this.itemSize,s=(e*r+t)*i;for(let t=0;t<i;t++)n[t]=this.data[s+t]}write(t,e,n){const r=this.width,i=this.itemSize,s=(e*r+t)*i;for(let t=0;t<i;t++)this.data[s+t]=n[t];this.version++}point2index(t,e){return t+e*this.width}index2point(t,e){const n=this.width,r=t%n,i=t/n|0;e.set(r,i)}copy(t,e,n,r,i,s,o){const a=Math.min(s,t.width-e,this.width-r),c=Math.min(o,t.height-n,this.height-i),h=this.itemSize,u=t.itemSize,d=Math.min(h,u),l=h*this.width,f=u*t.width,g=t.data,p=this.data;let y,w,_;for(w=0;w<c;w++){const t=(w+i)*l,s=(w+n)*f;for(y=0;y<a;y++){const n=t+(y+r)*h,i=s+(y+e)*u;for(_=0;_<d;_++)p[n+_]=g[i+_]}}this.version++}zeroFill(t,e,n,r){const i=ct(t,0,this.width),s=ct(e,0,this.height),o=ct(t+n,0,this.width),a=ct(e+r,0,this.height),c=this.data,h=this.itemSize,u=h*this.width,d=i*h,l=o*h;let f;for(f=s;f<a;f++){const t=f*u;c.fill(0,t+d,t+l)}this.version++}channelFill(t,e){const n=this.itemSize,r=this.data,i=r.length;for(let s=t;s<i;s+=n)r[s]=e;this.version++}fill(t,e,n,r,i){const s=this.width,o=this.height,a=ct(t,0,s),c=ct(e,0,o),h=ct(t+n,0,s),u=ct(e+r,0,o),d=this.data,l=this.itemSize,f=l*s;let g,p,y;for(g=c;g<u;g++){const t=g*f;for(p=a;p<h;p++){const e=t+p*l;for(y=0;y<l;y++)d[e+y]=i[y]}}this.version++}writeChannel(t,e,n,r){const i=(e*this.width+t)*this.itemSize+n;this.data[i]=r,this.version++}traverseCircle(t,e,n,r){let i,s;const o=0|t,a=0|e,c=n*n,h=Math.ceil(n);for(s=-h;s<=h;s++){const t=s*s;for(i=-h;i<=h;i++)i*i+t<=c&&r(o+i,a+s,this)}}resize(t,e,n=!0){const r=this.width,i=this.height;if(r===t&&i===e)return;const s=this.itemSize,o=t*e*s,a=this.data,c=new(function(t){if(t instanceof Int8Array)return Int8Array;if(t instanceof Int16Array)return Int16Array;if(t instanceof Int32Array)return Int32Array;if(t instanceof Uint8Array)return Uint8Array;if(t instanceof Uint8ClampedArray)return Uint8ClampedArray;if(t instanceof Uint16Array)return Uint16Array;if(t instanceof Uint32Array)return Uint32Array;if(t instanceof Float32Array)return Float32Array;if(t instanceof Float64Array)return Float64Array;if(Array.isArray(t))return Array;throw new TypeError("Unsupported array type")}(a))(o);if(n)if(t===r)c.set(a.subarray(0,Math.min(a.length,o)));else{const n=l(e,i),o=l(t,r);for(let e=0;e<n;e++)for(let n=0;n<o;n++){const i=(e*t+n)*s,o=(e*r+n)*s;for(let t=0;t<s;t++)c[i+t]=a[o+t]}}this.width=t,this.height=e,this.data=c,this.version++}computeByteSize(){let t;const e=this.data;return t=Array.isArray(e)?8*e.length:e.byteLength,t+280}equals(e){return this===e||this.width===e.width&&this.height===e.height&&this.itemSize===e.itemSize&&function(e,n){if(e===n)return!0;const r=e.length;if(r!==n.length)return!1;const i=e.constructor;if(i!==n.constructor)return!1;if(0===r)return!0;if(r<128)return t(e,n);const s=e.byteLength;if(s!==n.byteLength)return!1;const o=e.buffer,a=n.buffer,c=e.byteOffset,h=n.byteOffset;if(o===a&&c===h)return!0;let u=e,d=n;const l=i.BYTES_PER_ELEMENT,f=function(t,e,n){const r=t|e|n;return 0==(3&r)?4:0==(1&r)?2:1}(c,h,s);return l<4&&4===f?(u=new Uint32Array(o,c,s>>>2),d=new Uint32Array(a,h,s>>>2)):l<2&&2===f&&(u=new Uint16Array(o,c,s>>>1),d=new Uint16Array(a,h,s>>>1)),t(u,d)}(this.data,e.data)}hash(){const t=this.itemSize,n=this.width,r=this.height,i=this.data;let s=((65535&n)<<16|65535&r)^t;const o=n*r*t;if(e(i))s^=function(t,e,n){const r=e|n;return 0==(3&r)?function(t,e,n){let r=n;for(let e=0;e<n;++e)r=(r<<5)-r+t[e];return r}(new Uint32Array(t,e,n>>>2),0,n>>>2):0==(2&r)?function(t,e,n){let r=n,i=0;for(0!=(1&n)&&(r=(r<<5)-r+t[i++]);i<n;i+=2)r=(r<<5)-r+(t[i]<<16|t[i+1]);return r}(new Uint16Array(t,e,n>>>1),0,n>>>1):function(t,e,n){let r=n,i=0;const s=3&n;for(;i<0+s;i++)r=(r<<5)-r+t[i];for(;i<n;i+=4)r=(r<<5)-r+(t[i]|t[i+1]<<8|t[i+2]<<16|t[i+3]<<24);return r}(new Uint8Array(t,e,n),0,n)}(i.buffer,i.byteOffset,i.byteLength);else for(let t=0;t<o;++t)s=(s<<5)-s+dt(i[t]);return s}clone(){let t;return t=Array.isArray(this.data)?this.data.slice():new(0,this.data.constructor)(this.data),new lt(t,this.itemSize,this.width,this.height)}toJSON(){const t=Q.encode(this.data.buffer);return{height:this.height,width:this.width,itemSize:this.itemSize,type:at(this.data),data:t}}fromJSON({height:t,width:e,itemSize:n,type:r,data:i}){const s=function(t){const e=ot[t];if(void 0===e)throw new Error(`Unsupported data type '${t}'`);return e}(r);if("string"==typeof i){const t=Q.decode(i);this.data=new s(t)}else{if(!Array.isArray(i))throw new Error("Unsupported data format");this.data=new s(i)}this.height=t,this.width=e,this.itemSize=n}static uint8clamped(t,e,n){const r=new Uint8ClampedArray(e*n*t);return new lt(r,t,e,n)}static uint8(t,e,n){const r=new Uint8Array(e*n*t);return new lt(r,t,e,n)}static uint16(t,e,n){const r=new Uint16Array(e*n*t);return new lt(r,t,e,n)}static uint32(t,e,n){const r=new Uint32Array(e*n*t);return new lt(r,t,e,n)}static int8(t,e,n){const r=new Int8Array(e*n*t);return new lt(r,t,e,n)}static int16(t,e,n){const r=new Int16Array(e*n*t);return new lt(r,t,e,n)}static int32(t,e,n){const r=new Int32Array(e*n*t);return new lt(r,t,e,n)}static float32(t,e,n){const r=new Float32Array(e*n*t);return new lt(r,t,e,n)}static float64(t,e,n){const r=new Float64Array(e*n*t);return new lt(r,t,e,n)}}function ft(t,e,n,r){const i=n[r],s=n[r+1],o=n[r+2];t[e]+=i,t[e+1]+=s,t[e+2]+=o}function gt(t,e,n,r,i,s){const o=3*n,a=3*r,c=3*i;k(t,e,s[o],s[o+1],s[o+2],s[a],s[a+1],s[a+2],s[c],s[c+1],s[c+2])}function pt(t,e,n,r){const i=n[r],s=n[r+1],o=n[r+2],a=1/O(i,s,o);t[e]=i*a,t[e+1]=s*a,t[e+2]=o*a}lt.prototype.set=lt.prototype.write,lt.prototype.isSampler2D=!0,lt.typeName="Sampler2D";const yt=new Float64Array(3),wt={build:function(t,e,n,r,i,s){const o=n.x*s,a=n.y*s,c=o-1,h=a-1;let u=0,d=0;const l=o*a,f=new Float32Array(3*l),g=new Float32Array(3*l),p=new Float32Array(2*l);let y,w;const _=n.y/i.y/h,m=n.x/i.x/c,v=e.y/i.y,x=e.x/i.x,A=i.x*r.x,b=i.y*r.y;let E,$,U;for(y=0;y<a;y++){const e=y*_+v;for(U=e*b,w=0;w<o;w++){const n=w*m+x;E=n*A,$=t.sampleChannelBicubicUV(n,e,0),f[u]=E,f[u+1]=$,f[u+2]=U,p[d]=n,p[d+1]=e,u+=3,d+=2}}u=0;const F=new(function(t){if(t<=256)return Uint8Array;if(t<=65536)return Uint16Array;if(t<=4294967295)return Uint32Array;throw new Error(`Unsupported size ${t}`)}(f.length/3))(c*h*6);for(y=0;y<h;y++)for(w=0;w<c;w++){const t=w+o*y,e=w+o*(y+1),n=w+1+o*(y+1),r=w+1+o*y;F[u]=t,F[u+1]=e,F[u+2]=r,F[u+3]=e,F[u+4]=n,F[u+5]=r,u+=6}return function(t,e,n){const r=n.length;for(let i=0;i<r;i+=3){const r=n[i],s=n[i+1],o=n[i+2];gt(yt,0,r,s,o,t),ft(e,3*r,yt,0),ft(e,3*s,yt,0),ft(e,3*o,yt,0)}!function(t,e=0,n=t.length-e){const r=e+n;for(let n=e;n<r;n+=3)pt(t,n,t,n)}(e)}(f,g,F),{indices:F,vertices:f,normals:g,uvs:p}}};self.Lib={build_bvh(t,e){const n=new v;return function(t,e,n){const r=n.length/3;t.setLeafCount(r),t.initialize_structure();for(let i=0;i<r;i++){const r=3*i;b(t,i,e,n[r],n[r+1],n[r+2])}t.build()}(n,t,e),n},Sampler2D:lt,BufferedGeometryArraysBuilder:wt,tensionOptimizeUV:function(t,e,n,r=3){const i=new P;i.build(t,n),i.computeEdgeSquaredLengths();const s=t.length/3;for(let t=0;t<r;t++)t:for(let t=0;t<s;t++){const n=i.vertices[t],r=n.edges,s=r.length;if(0===s)continue;let o=0,a=0,c=0;for(let t=0;t<s;t++){const i=r[t];if(E(i))continue t;const s=2*$(i,n).index,h=e[s],u=e[s+1],d=1/i.lengthSqr;o+=h*d,a+=u*d,c+=d}const h=o/c,u=a/c,d=2*n.index;e[d]=h,e[d+1]=u}},sampler2d_channel_compute_min:function(t,e=0){const n=t.itemSize,r=t.data,i=r.length;if(0===i)return;let s=r[e],o=e;for(let t=e+n;t<i;t+=n){const e=r[t];s>e&&(s=e,o=t)}const a=t.width,c=o/n|0;return{index:o,value:s,x:c%a,y:c/a|0}},sampler2d_channel_compute_max:function(t,e=0){const n=t.itemSize,r=t.data,i=r.length;if(0===i)return;let s=r[e],o=e;for(let t=e+n;t<i;t+=n){const e=r[t];s<e&&(s=e,o=t)}const a=t.width,c=o/n|0;return{index:o,value:s,x:c%a,y:c/a|0}}};
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "description": "Fully featured ECS game engine written in JavaScript",
6
6
  "type": "module",
7
7
  "author": "Alexander Goldring",
8
- "version": "2.119.12",
8
+ "version": "2.119.15",
9
9
  "main": "build/meep.module.js",
10
10
  "module": "build/meep.module.js",
11
11
  "exports": {
@@ -0,0 +1,9 @@
1
+ /**
2
+ *
3
+ * @param {ArrayBuffer} buffer
4
+ * @param {number} offset
5
+ * @param {number} length
6
+ * @return {number}
7
+ */
8
+ export function array_buffer_hash(buffer: ArrayBuffer, offset: number, length: number): number;
9
+ //# sourceMappingURL=array_buffer_hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array_buffer_hash.d.ts","sourceRoot":"","sources":["../../../../../../src/core/collection/array/typed/array_buffer_hash.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,0CALW,WAAW,UACX,MAAM,UACN,MAAM,GACL,MAAM,CA4BjB"}
@@ -0,0 +1,39 @@
1
+ import { uint16_array_hash } from "./uint16_array_hash.js";
2
+ import { uint32_array_hash } from "./uint32_array_hash.js";
3
+ import { uint8_array_hash } from "./uint8_array_hash.js";
4
+
5
+ /**
6
+ *
7
+ * @param {ArrayBuffer} buffer
8
+ * @param {number} offset
9
+ * @param {number} length
10
+ * @return {number}
11
+ */
12
+ export function array_buffer_hash(buffer, offset, length) {
13
+
14
+ const alignment_mask = offset | length;
15
+
16
+ if ((alignment_mask & 3) === 0) {
17
+ // 4-byte alignment
18
+ return uint32_array_hash(
19
+ new Uint32Array(buffer, offset, length >>> 2),
20
+ 0,
21
+ length >>> 2
22
+ );
23
+ } else if ((alignment_mask & 2) === 0) {
24
+ // 2-byte alignment
25
+ return uint16_array_hash(
26
+ new Uint16Array(buffer, offset, length >>> 1),
27
+ 0,
28
+ length >>> 1
29
+ );
30
+ } else {
31
+ // 1-byte
32
+ return uint8_array_hash(
33
+ new Uint8Array(buffer, offset, length),
34
+ 0,
35
+ length
36
+ );
37
+ }
38
+ }
39
+
@@ -0,0 +1,9 @@
1
+ /**
2
+ *
3
+ * @param {Uint16Array|Int16Array} array
4
+ * @param {number} offset
5
+ * @param {number} length
6
+ * @return {number}
7
+ */
8
+ export function uint16_array_hash(array: Uint16Array | Int16Array, offset: number, length: number): number;
9
+ //# sourceMappingURL=uint16_array_hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uint16_array_hash.d.ts","sourceRoot":"","sources":["../../../../../../src/core/collection/array/typed/uint16_array_hash.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,yCALW,WAAW,GAAC,UAAU,UACtB,MAAM,UACN,MAAM,GACL,MAAM,CAuBjB"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ *
3
+ * @param {Uint16Array|Int16Array} array
4
+ * @param {number} offset
5
+ * @param {number} length
6
+ * @return {number}
7
+ */
8
+ export function uint16_array_hash(array, offset, length) {
9
+ let hash = length;
10
+
11
+ let i = offset;
12
+
13
+ if ((length & 1) !== 0) {
14
+ hash = (hash << 5) - hash + array[i++];
15
+ }
16
+
17
+ for (; i < length; i += 2) {
18
+
19
+ const v0 = array[i];
20
+ const v1 = array[i + 1];
21
+
22
+ const word = (v0 << 16) | v1;
23
+
24
+ hash = ((hash << 5) - hash) + word;
25
+
26
+ }
27
+
28
+ return hash;
29
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ *
3
+ * @param {Uint32Array|Int32Array} array
4
+ * @param {number} offset
5
+ * @param {number} length
6
+ * @return {number}
7
+ */
8
+ export function uint32_array_hash(array: Uint32Array | Int32Array, offset: number, length: number): number;
9
+ //# sourceMappingURL=uint32_array_hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uint32_array_hash.d.ts","sourceRoot":"","sources":["../../../../../../src/core/collection/array/typed/uint32_array_hash.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,yCALW,WAAW,GAAC,UAAU,UACtB,MAAM,UACN,MAAM,GACL,MAAM,CAcjB"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ *
3
+ * @param {Uint32Array|Int32Array} array
4
+ * @param {number} offset
5
+ * @param {number} length
6
+ * @return {number}
7
+ */
8
+ export function uint32_array_hash(array, offset, length) {
9
+ let hash = length;
10
+
11
+ for (let i = offset; i < length; ++i) {
12
+
13
+ const channel_value = array[i];
14
+
15
+ hash = ((hash << 5) - hash) + channel_value;
16
+
17
+ }
18
+
19
+ return hash;
20
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ *
3
+ * @param {Uint8Array|Int8Array} array
4
+ * @param {number} offset
5
+ * @param {number} length
6
+ * @return {number}
7
+ */
8
+ export function uint8_array_hash(array: Uint8Array | Int8Array, offset: number, length: number): number;
9
+ //# sourceMappingURL=uint8_array_hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uint8_array_hash.d.ts","sourceRoot":"","sources":["../../../../../../src/core/collection/array/typed/uint8_array_hash.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wCALW,UAAU,GAAC,SAAS,UACpB,MAAM,UACN,MAAM,GACL,MAAM,CA8BjB"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ *
3
+ * @param {Uint8Array|Int8Array} array
4
+ * @param {number} offset
5
+ * @param {number} length
6
+ * @return {number}
7
+ */
8
+ export function uint8_array_hash(array, offset, length) {
9
+ let hash = length;
10
+
11
+ let i = offset;
12
+
13
+ const overflow = length & 3;
14
+
15
+ for (; i < offset + overflow; i++) {
16
+ hash = (hash << 5) - hash + array[i];
17
+ }
18
+
19
+ for (; i < length; i += 4) {
20
+
21
+ const v0 = array[i];
22
+ const v1 = array[i + 1];
23
+ const v2 = array[i + 2];
24
+ const v3 = array[i + 3];
25
+
26
+ const word = v0
27
+ | (v1 << 8)
28
+ | (v2 << 16)
29
+ | (v3 << 24);
30
+
31
+ hash = ((hash << 5) - hash) + word;
32
+
33
+ }
34
+
35
+ return hash;
36
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Computations of screen-space pixel area covered by a sphere
3
+ * NOTE: Port of GLSL code by Ingo Quilez. Source: http://www.iquilezles.org/www/articles/sphereproj/sphereproj.htm
4
+ * @param {Vector4} sph Sphere in world space
5
+ * @param {Matrix4} cam camera transform matrix (world to camera)(inverse world matrix of camera)
6
+ * @param {number} fl focal length (fov in Radians)
7
+ * @returns {number} area on the screen as a fraction, 1=entire screen, 0=zero area
8
+ */
9
+ export function sphere_project(sph: Vector4, cam: Matrix4, fl: number): number;
10
+ //# sourceMappingURL=sphere_project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sphere_project.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/sphere/sphere_project.js"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACH,+DAHW,MAAM,GACJ,MAAM,CA0BlB"}
@@ -0,0 +1,39 @@
1
+ import { assert } from "../../../assert.js";
2
+ import { v3_dot } from "../../vec3/v3_dot.js";
3
+ import { v4_multiply_mat4 } from "../../vec4/v4_multiply_mat4.js";
4
+
5
+ const v4 = [];
6
+
7
+ /**
8
+ * Computations of screen-space pixel area covered by a sphere
9
+ * NOTE: Port of GLSL code by Ingo Quilez. Source: http://www.iquilezles.org/www/articles/sphereproj/sphereproj.htm
10
+ * @param {Vector4} sph Sphere in world space
11
+ * @param {Matrix4} cam camera transform matrix (world to camera)(inverse world matrix of camera)
12
+ * @param {number} fl focal length (fov in Radians)
13
+ * @returns {number} area on the screen as a fraction, 1=entire screen, 0=zero area
14
+ */
15
+ export function sphere_project(sph, cam, fl) {
16
+ assert.notNull(cam, 'cam');
17
+
18
+ v4[0] = sph.x;
19
+ v4[1] = sph.y;
20
+ v4[2] = sph.z;
21
+ v4[3] = 1;
22
+
23
+ //transform to camera space
24
+ v4_multiply_mat4(v4, v4, cam.elements);
25
+
26
+ const r2 = sph.w * sph.w;
27
+
28
+ const v4_x = v4[0];
29
+ const v4_y = v4[1];
30
+ const v4_z = v4[2];
31
+
32
+ const z2 = v4_z * v4_z;
33
+
34
+ const l2 = v3_dot(v4_x, v4_y, v4_z, v4_x, v4_y, v4_z);
35
+
36
+ const area = -Math.PI * fl * fl * r2 * Math.sqrt(Math.abs((l2 - r2) / (r2 - z2))) / (r2 - z2);
37
+
38
+ return area;
39
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ *
3
+ * @param {number} fl
4
+ * @param {number[]} matrix
5
+ * @param {number[]} sph
6
+ * @returns {number}
7
+ */
8
+ export function sphere_projected_sphere_radius_sqr(fl: number, matrix: number[], sph: number[]): number;
9
+ //# sourceMappingURL=sphere_projected_sphere_radius_sqr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sphere_projected_sphere_radius_sqr.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/sphere/sphere_projected_sphere_radius_sqr.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,uDALW,MAAM,UACN,MAAM,EAAE,OACR,MAAM,EAAE,GACN,MAAM,CAmClB"}
@@ -0,0 +1,45 @@
1
+ import { v3_dot } from "../../vec3/v3_dot.js";
2
+ import { v4_multiply_mat4 } from "../../vec4/v4_multiply_mat4.js";
3
+
4
+ const v4 = [];
5
+ /**
6
+ *
7
+ * @param {number} fl
8
+ * @param {number[]} matrix
9
+ * @param {number[]} sph
10
+ * @returns {number}
11
+ */
12
+ export function sphere_projected_sphere_radius_sqr(fl, matrix, sph) {
13
+ v4[0] = sph[0];
14
+ v4[1] = sph[1];
15
+ v4[2] = sph[2];
16
+ v4[3] = 1;
17
+
18
+ //transform sphere center to camera space
19
+ v4_multiply_mat4(v4, v4, matrix);
20
+
21
+ const r2 = sph[3] * sph[3];
22
+
23
+ const v4_x = v4[0];
24
+ const v4_y = v4[1];
25
+ const v4_z = v4[2];
26
+ const v4_w = v4[3];
27
+
28
+ const d = 0.5 / Math.abs(v4_w);
29
+
30
+ const x = v4_x;
31
+ const y = v4_y;
32
+ const z = v4_z;
33
+
34
+ const z2 = z * x;
35
+
36
+ const l2 = v3_dot(x, y, z, x, y, z);
37
+
38
+ const sigma = Math.abs(r2 - z2);
39
+ const alpha = Math.sqrt(Math.abs(l2 - r2) / sigma);
40
+
41
+ const beta = fl * fl * r2 * alpha / sigma;
42
+
43
+
44
+ return beta * d;
45
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"Quaternion.d.ts","sourceRoot":"","sources":["../../../../src/core/geom/Quaternion.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Quaternion.d.ts","sourceRoot":"","sources":["../../../../src/core/geom/Quaternion.js"],"names":[],"mappings":"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"}
@@ -475,7 +475,7 @@ class Quaternion {
475
475
  * @param {Vector3} [up]
476
476
  */
477
477
  lookAt(source, target, up = Vector3.up) {
478
- const forward = new Vector3();
478
+ const forward = scratch_v3_a;
479
479
 
480
480
  forward.subVectors(target, source);
481
481
 
@@ -631,16 +631,6 @@ class Quaternion {
631
631
  result.set(psi, theta, phi);
632
632
  }
633
633
 
634
- /**
635
- * XYZ order
636
- * @source: https://stackoverflow.com/questions/12088610/conversion-between-euler-quaternion-like-in-unity3d-engine
637
- * @param {number} x angle in X axis in radians
638
- * @param {number} y angle in Y axis in radians
639
- * @param {number} z angle in Z axis in radians
640
- */
641
- fromEulerAngles(x, y, z) {
642
- return this.fromEulerAnglesXYZ(x, y, z);
643
- }
644
634
 
645
635
  /**
646
636
  * XYZ order
@@ -1270,18 +1260,17 @@ class Quaternion {
1270
1260
 
1271
1261
  /**
1272
1262
  *
1273
- * @param {number[]} array
1274
- * @param {number} offset
1263
+ * @param {number[]} [array]
1264
+ * @param {number} [offset]
1265
+ * @returns {number[]}
1275
1266
  */
1276
- writeToArray(array, offset = 0) {
1267
+ writeToArray(array = [], offset = 0) {
1277
1268
  array[offset] = this.x;
1278
1269
  array[offset + 1] = this.y;
1279
1270
  array[offset + 2] = this.z;
1280
1271
  array[offset + 3] = this.w;
1281
- }
1282
1272
 
1283
- asArray() {
1284
- return [this.x, this.y, this.z, this.w];
1273
+ return array;
1285
1274
  }
1286
1275
 
1287
1276
  /**
@@ -1419,6 +1408,8 @@ class Quaternion {
1419
1408
 
1420
1409
  Quaternion.prototype.fromArray = Quaternion.prototype.readFromArray;
1421
1410
  Quaternion.prototype.toArray = Quaternion.prototype.writeToArray;
1411
+ Quaternion.prototype.asArray = Quaternion.prototype.writeToArray;
1412
+ Quaternion.prototype.fromEulerAngles = Quaternion.prototype.fromEulerAnglesXYZ;
1422
1413
 
1423
1414
  /**
1424
1415
  * @readonly
@@ -1 +1 @@
1
- {"version":3,"file":"position_box_next_to_box.d.ts","sourceRoot":"","sources":["../../../../../../src/core/graph/layout/box/position_box_next_to_box.js"],"names":[],"mappings":"AAyJA;;;;;;GAMG;AACH,8CALW,KAAK,UACL,KAAK,UACL,KAAK,GACH,KAAK,CA2DjB;kBAzNiB,gCAAgC"}
1
+ {"version":3,"file":"position_box_next_to_box.d.ts","sourceRoot":"","sources":["../../../../../../src/core/graph/layout/box/position_box_next_to_box.js"],"names":[],"mappings":"AAyJA;;;;;;GAMG;AACH,8CALW,KAAK,UACL,KAAK,UACL,KAAK,GACH,KAAK,CAoCjB;kBAlMiB,gCAAgC"}
@@ -168,31 +168,8 @@ export function position_box_next_to_box(box, target, bounds) {
168
168
 
169
169
  b.set(x0, y0, x0 + b.width, y0 + b.height);
170
170
 
171
- const targetCenter = new Vector2(t.centerX, t.centerY);
172
-
173
171
  t.locked = true;
174
172
 
175
- function touch() {
176
-
177
- const bC = new Vector2(b.centerX, b.centerY);
178
-
179
- const bE = new Vector2();
180
- const tE = new Vector2();
181
-
182
-
183
- t.lineIntersectionPoint(bC, targetCenter, tE);
184
- const delta = new Vector2();
185
-
186
- if (b.lineIntersectionPoint(bC, targetCenter, bE)) {
187
- delta.copy(tE).sub(bE);
188
- } else {
189
- delta.copy(tE).sub(bC);
190
- }
191
-
192
- b.move(delta.x, delta.y);
193
- }
194
-
195
-
196
173
  const initialPosition = computeInitialPlacement(b, t, bounds);
197
174
  //set bounds to initial position
198
175
  b.set(initialPosition.x, initialPosition.y, initialPosition.x + b.width, initialPosition.y + b.height);
@@ -0,0 +1,9 @@
1
+ /**
2
+ *
3
+ * @param {string} text
4
+ * @param {number} cursor
5
+ * @param {number} limit
6
+ * @return {Token}
7
+ */
8
+ export function readArrayLiteral(text: string, cursor: number, limit: number): Token;
9
+ //# sourceMappingURL=readArrayLiteral.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readArrayLiteral.d.ts","sourceRoot":"","sources":["../../../../../src/core/parser/simple/readArrayLiteral.js"],"names":[],"mappings":"AAQA;;;;;;GAMG;AACH,uCALW,MAAM,UACN,MAAM,SACN,MAAM,SA4DhB"}