@woosh/meep-engine 2.70.0 → 2.72.0
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.
- package/build/bundle-worker-terrain.js +1 -1
- package/build/meep.cjs +111 -122
- package/build/meep.min.js +1 -1
- package/build/meep.module.js +111 -122
- package/package.json +1 -1
- package/src/core/collection/array/array_get_index_in_range.js +1 -1
- package/src/core/collection/array/array_swap.js +2 -2
- package/src/core/geom/3d/quaternion/quat_encode_to_uint32.js +2 -3
- package/src/core/geom/3d/v3_compute_triangle_normal.js +7 -1
- package/src/core/geom/vec3/v3_normalize_array.js +27 -0
- package/src/core/math/remap.js +5 -1
- package/src/core/math/statistics/computeStatisticalPartialMedian.js +1 -1
- package/src/core/process/task/Task.js +53 -34
- package/src/engine/achievements/AchievementManager.js +19 -19
- package/src/engine/animation/curve/compression/prototypeCurveCompression.js +6 -6
- package/src/engine/animation/curve/draw/build_plot_entity_from_array.js +11 -6
- package/src/engine/ecs/dynamic_actions/DynamicActor.js +5 -10
- package/src/engine/ecs/dynamic_actions/DynamicActorSystem.js +82 -89
- package/src/engine/ecs/dynamic_actions/RuleExecution.js +10 -12
- package/src/engine/ecs/gui/GUIElement.js +44 -61
- package/src/engine/ecs/gui/GUIElementSystem.js +26 -24
- package/src/engine/ecs/gui/hud/HeadsUpDisplay.js +12 -15
- package/src/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +15 -15
- package/src/engine/ecs/gui/parallax/GuiElementParallax.js +3 -3
- package/src/engine/ecs/gui/parallax/GuiElementParallaxSystem.js +2 -2
- package/src/engine/ecs/gui/position/ViewportPosition.js +5 -50
- package/src/engine/ecs/gui/position/ViewportPositionSerializationAdapter.js +42 -0
- package/src/engine/ecs/terrain/BufferedGeometryArraysBuilder.js +2 -2
- package/src/engine/ecs/transform/TransformSerializationAdapter.js +5 -10
- package/src/engine/graphics/geometry/buffered/ComputeNormals.js +11 -26
- package/src/engine/graphics/impostors/octahedral/prototypeBaker.js +20 -20
- package/src/engine/graphics/texture/sprite/prototypeSpriteCutoutGeometry.js +12 -12
- package/src/engine/graphics/texture/virtual/v2/NOTES.md +17 -0
- package/src/engine/graphics/texture/virtual/v2/ShaderUsage.js +49 -26
- package/src/engine/graphics/texture/virtual/v2/UsageDebugView.js +51 -0
- package/src/engine/graphics/texture/virtual/v2/UsageMetadata.js +221 -0
- package/src/engine/graphics/texture/virtual/v2/UsagePyramidDebugView.js +239 -0
- package/src/engine/graphics/texture/virtual/v2/VirtualTextureManager.js +248 -0
- package/src/engine/graphics/texture/virtual/v2/prototype.js +104 -31
- package/src/engine/navigation/ecs/components/PathSerializationAdapter.js +1 -4
- package/src/core/binary/ValidatingBitSetWrapper.js +0 -81
- package/src/core/binary/jsonToStringToByteArray.js +0 -27
- package/src/core/geom/2d/quad-tree/PointQuadTree.js +0 -478
- package/src/core/math/random/makeRangedRandom.js +0 -19
- package/src/engine/ecs/components/AreaOfEffect.js +0 -12
- package/src/engine/ecs/components/Mortality.js +0 -27
- package/src/engine/ecs/systems/AreaOfEffectSystem.js +0 -48
- package/src/engine/ecs/terrain/TerrainGeometryBuilder.js +0 -152
- package/src/engine/ecs/terrain/ecs/PromiseSamplerHeight.js +0 -66
- package/src/engine/ecs/terrain/ecs/TerrainClassifier.js +0 -125
- package/src/engine/graphics/texture/sampler/SampleTraverser.js +0 -165
|
@@ -1 +1 @@
|
|
|
1
|
-
function t(t,e){const n=t.length;if(n!==e.length)return!1;let i=0;for(;i<n;i++)if(t[i]!==e[i])return!1;return!0}class e{appendDescriptionOf(t){throw new Error("Not Implemented")}appendList(t,e,n,i){throw new Error("Not Implemented")}appendText(t){throw new Error("Not Implemented")}appendValue(t){throw new Error("Not Implemented")}appendValueList(t,e,n,i){throw new Error("Not Implemented")}}class n{describeTo(t){throw new Error("Not Implemented")}}class i extends n{value;constructor(t){super(),this.value=t}describeTo(t){t.appendValue(this.value)}}class r{#t;constructor(t){this.#t=t}*[Symbol.iterator](){for(const t of this.#t)yield new i(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,i){return this.appendList(t,e,n,new r(i)),this}appendList(t,e,n,i){let r=!1;this.appendText(t);const s=i[Symbol.iterator]();for(let t=s.next();!0!==t.done;t=s.next())r&&this.appendText(e),this.appendDescriptionOf(t.value),r=!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 h(t,e,n,i,r){let s,o,a;for(a=0;a<r;a++)s=e+a,o=i+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)throw new Error(void 0!==n?n:`${t} !== ${e}`)},a.logicalyEqual=function(t,e,n){},a.ok=a,a.greaterThan=function(t,e,n){if(!(t>e)){let i="";throw void 0!==n&&(i+=n+". "),i+=`Expected ${t} > ${e}.`,new Error(i)}},a.greaterThanOrEqual=function(t,e,n){if(!(t>=e)){let i="";throw void 0!==n&&(i+=n+". "),i+=`Expected ${t} >= ${e}.`,new Error(i)}},a.lessThan=function(t,e,n){if(!(t<e)){let i="";throw void 0!==n&&(i+=n+". "),i+=`Expected ${t} < ${e}.`,new Error(i)}},a.lessThanOrEqual=function(t,e,n){if(!(t<=e)){let i="";throw void 0!==n&&(i+=n+". "),i+=`Expected ${t} <= ${e}.`,new Error(i)}},a.typeOf=function(t,e,n="value"){const i=typeof t;if(i!==e)throw new Error(`expected ${n} to be ${e}, instead was '${i}'(=${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,i="Arrays are not equal"){if(!t(e,n))throw new Error(i)},a.isInstanceOf=function(t,e,n="value",i=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.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)||(n=t,n instanceof Int8Array||n instanceof Uint8Array||n instanceof Uint8ClampedArray||n instanceof Int16Array||n instanceof Uint16Array||n instanceof Int32Array||n instanceof Uint32Array||n instanceof Float32Array||n instanceof Float64Array)))throw new Error(`expected ${e} to be an array-like structure, instead was something else (typeof ='${typeof t}')`);var n},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 i=new o;throw i.appendText(`Expected ${e} to be `),n.describeTo(i),i.appendText(" instead "),n.describeMismatch(t,i),new Error(i.value)};const c=new Uint32Array(781250);function d(t,e){return t<e?e:t}function u(t,e){return t<e?t:e}function l(t,e,n,i,r,s){t[e+0]=u(n[i+0],r[s+0]),t[e+1]=u(n[i+1],r[s+1]),t[e+2]=u(n[i+2],r[s+2]),t[e+3]=d(n[i+3],r[s+3]),t[e+4]=d(n[i+4],r[s+4]),t[e+5]=d(n[i+5],r[s+5])}function f(t,e,n,i,r,s,o,a){t[e+0]=n,t[e+1]=i,t[e+2]=r,t[e+3]=s,t[e+4]=o,t[e+5]=a}function g(t,e,n,i,r,s){const o=i-t,a=s-n;return(r-e)*(o+a)+a*o}function _(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 p(t,e,n){let i=t;return i<e&&(i=e),i<n&&(i=n),i}function m(t,e,n){let i=t;return i>e&&(i=e),i>n&&(i=n),i}function w(t,e,n){const i=t[n],r=t[n+1],s=t[n+2];f(t,e,i,r,s,i,r,s)}function y(t,e,n){const i=t[e],r=t[e+1],s=t[e+2];return function(t,e,n,i){const r=i[0],s=i[1],o=i[2],a=1023*(t-r)/(i[3]-r),h=1023*(e-s)/(i[4]-s),c=1023*(n-o)/(i[5]-o);return function(t,e,n){return _(t)|_(e)<<1|_(n)<<2}(Math.round(a),Math.round(h),Math.round(c))}(.5*(i+t[e+3]),.5*(r+t[e+4]),.5*(s+t[e+5]),n)}c.pointer=0;const v=c;class x{__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}setLeafData(t,e,n,i,r,s,o,a){const h=7*t+6*this.__node_count_binary;f(this.__data_float32,h,n,i,r,s,o,a),this.__data_uint32[h+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 i;i=n<this.__node_count_binary?6*n:7*(n-this.__node_count_binary)+this.getLeafBlockAddress(),this.readBounds(i,e,0),t+=g(e[0],e[1],e[2],e[3],e[4],e[5])}return t}__compute_bounds_area_of_3_boxes(t,e,n){const i=this.__data_float32;return g(m(i[t+0],i[e+0],i[n+0]),m(i[t+1],i[e+1],i[n+1]),m(i[t+2],i[e+2],i[n+2]),p(i[t+3],i[e+3],i[n+3]),p(i[t+4],i[e+4],i[n+4]),p(i[t+5],i[e+5],i[n+5]))}__fitness_function_should_swap_leaves_sah(t,e){const n=d(t-1,0),i=u(t+1,this.__node_count_leaf-1),r=this.getLeafBlockAddress(),s=7*t+r,o=7*n+r,a=7*i+r,h=7*e+r,c=7*d(e-1,0)+r,l=7*u(e+1,this.__node_count_leaf-1)+r;return this.__compute_bounds_area_of_3_boxes(o,s,a)+this.__compute_bounds_area_of_3_boxes(c,h,l)-(this.__compute_bounds_area_of_3_boxes(o,h,a)+this.__compute_bounds_area_of_3_boxes(c,s,l))}sort_bubble_sah(){const t=this.__node_count_leaf;for(let e=0;e<t;e++)for(let n=e+1;n<t;n++)this.__fitness_function_should_swap_leaves_sah(e,n)>0&&this.__swap_leaves(e,n)}sort_morton(t){const e=6*this.__node_count_binary;if(this.__node_count_leaf<2)return;let n,i,r=2;v[0]=0,v[1]=this.__node_count_leaf-1;const s=this.__data_float32;for(;r>0;){r-=2;const o=v[r+1],a=v[r];n=a,i=o;const h=y(s,7*(a+o>>1)+e,t);for(;n<=i;){for(;y(s,7*n+e,t)<h;)n++;for(;y(s,7*i+e,t)>h;)i--;n<=i&&(n!==i&&this.__swap_leaves(n,i),n++,i--)}a<i&&(v[r++]=a,v[r++]=i),n<o&&(v[r++]=n,v[r++]=o)}}__swap_leaves(t,e){const n=this.getLeafBlockAddress(),i=7*t+n,r=7*e+n;!function(t,e,n,i,r){let s,o,a;for(a=0;a<7;a++){s=e+a,o=i+a;const r=n[o];n[o]=t[s],t[s]=r}}(this.__data_float32,i,this.__data_float32,r)}build(){const t=this.__node_count_binary,e=6*t;let n,i,r,s,o=Math.floor(Math.log(t)/Math.log(2));r=Math.pow(2,o),i=6*(r-1);const a=this.__node_count_leaf,c=this.__data_float32;for(n=0;n<r;n++){const t=2*n,r=t+1,s=e+7*t;r<a?l(c,i,c,s,c,e+7*r):t<a?h(c,s,c,i,6):w(this.__data_float32,i,i-6),i+=6}for(o--;o>=0;o--)for(r=Math.pow(2,o),s=r-1,n=0;n<r;n++){const t=1+(s<<1);l(c,6*s,c,6*t,c,6*(t+1)),s++}}}function b(t,e,n,i,r,s){const o=3*i,a=3*r,h=3*s,c=n[o],d=n[o+1],u=n[o+2],l=n[a],f=n[a+1],g=n[a+2],_=n[h],w=n[h+1],y=n[h+2],v=m(c,l,_),x=m(d,f,w),b=m(u,g,y),A=p(c,l,_),E=p(d,f,w),S=p(u,g,y);t.setLeafData(e,e,v,x,b,A,E,S)}function A(t,e,n){return t<e?e:t>n?n:t}const E=function(t,e,n){return(e-t)*n+t},S="uint8",M="uint16",U="uint32",$="int8",F="int16",z="int32",C="float32",B="float64";function V(t){switch(Object.getPrototypeOf(t).constructor){case Uint8Array:case Uint8ClampedArray:return S;case Uint16Array:return M;case Uint32Array:return U;case Int8Array:return $;case Int16Array:return F;case Int32Array:return z;case Float32Array:return C;case Float64Array:return B;default:throw new Error("unsupported constructor type")}}const q={[S]:Uint8Array,[M]:Uint16Array,[U]:Uint32Array,[$]:Int8Array,[F]:Int16Array,[z]:Int32Array,float16:Uint16Array,[C]:Float32Array,[B]:Float64Array},L=[],T=[],I="undefined"!=typeof Uint8Array?Uint8Array:Array,N="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(let t=0,e=64;t<e;++t)L[t]=N[t],T[N.charCodeAt(t)]=t;function k(t,e,n){const i=[];for(let s=e;s<n;s+=3){const e=(t[s]<<16&16711680)+(t[s+1]<<8&65280)+(255&t[s+2]);i.push(L[(r=e)>>18&63]+L[r>>12&63]+L[r>>6&63]+L[63&r])}var r;return i.join("")}T["-".charCodeAt(0)]=62,T["_".charCodeAt(0)]=63;class O{static encode(t){return function(t){let e;const n=t.length,i=n%3,r=[],s=16383,o=n-i;for(let e=0;e<o;e+=s){const n=k(t,e,e+s>o?o:e+s);r.push(n)}return 1===i?(e=t[n-1],r.push(L[e>>2]+L[e<<4&63]+"==")):2===i&&(e=(t[n-2]<<8)+t[n-1],r.push(L[e>>10]+L[e>>4&63]+L[e<<2&63]+"=")),r.join("")}(new Uint8Array(t))}static decode(t){return function(t){var e,n,i=function(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var n=t.indexOf("=");return-1===n&&(n=e),[n,n===e?0:4-n%4]}(t),r=i[0],s=i[1],o=new I(function(t,e,n){return 3*(e+n)/4-n}(0,r,s)),a=0,h=s>0?r-4:r;for(n=0;n<h;n+=4)e=T[t.charCodeAt(n)]<<18|T[t.charCodeAt(n+1)]<<12|T[t.charCodeAt(n+2)]<<6|T[t.charCodeAt(n+3)],o[a++]=e>>16&255,o[a++]=e>>8&255,o[a++]=255&e;return 2===s&&(e=T[t.charCodeAt(n)]<<2|T[t.charCodeAt(n+1)]>>4,o[a++]=255&e),1===s&&(e=T[t.charCodeAt(n)]<<10|T[t.charCodeAt(n+1)]<<4|T[t.charCodeAt(n+2)]>>2,o[a++]=e>>8&255,o[a++]=255&e),o}(t).buffer}}class D{constructor(t=[],e=1,n=0,i=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(i)||n<0)throw new Error(`height must be a non-negative integer, instead was ${i}`);if(void 0===t)throw new Error("data was undefined");if(t.length<n*i*e)throw new Error(`Buffer underflow, data.length(=${t.length}) is too small. Expected at least ${n*i*e}`);this.width=n,this.height=i,this.itemSize=e,this.data=t,this.version=0}computeMax(t=0){throw new Error("deprecated, use sampler2d_channel_compute_max")}computeMinIndices(t,e=0,n=0){throw new Error("deprecated, use sampler2d_channel_compute_min_indices")}computeMin(t=0){throw new Error("deprecated, use sampler2d_channel_compute_min")}get(t,e,n){const i=[];return this.sampleBilinear(t,e,i,0),void 0!==n?(n.readFromArray(i,0),n):i[0]}sampleCatmullRomUV(t,e,n){const i=this.itemSize;for(let r=0;r<i;r++)n[r]=this.sampleChannelCatmullRomUV(t,e,r)}sampleChannelCatmullRomUV(t,e,n){const i=t*this.width-.5,r=e*this.height-.5;return this.sampleChannelCatmullRom(i,r,n)}sampleChannelCatmullRom(t,e,n){const i=Math.floor(t),r=Math.floor(e),s=t-i,o=e-r,a=s*(s*(1-.5*s)-.5),h=o*(o*(1-.5*o)-.5),c=s*(.5+s*(2-1.5*s)),d=o*(.5+o*(2-1.5*o)),u=s*s*(.5*s-.5),l=o*o*(.5*o-.5),f=1+s*s*(1.5*s-2.5)+c,g=1+o*o*(1.5*o-2.5)+d,_=i-1,p=r-1,m=i+2,w=r+2,y=i+c/f,v=r+d/g;let x=0;return x+=this.sampleChannelBilinear(_,p,n)*a*h,x+=this.sampleChannelBilinear(y,p,n)*f*h,x+=this.sampleChannelBilinear(m,p,n)*u*h,x+=this.sampleChannelBilinear(_,v,n)*a*g,x+=this.sampleChannelBilinear(y,v,n)*f*g,x+=this.sampleChannelBilinear(m,v,n)*u*g,x+=this.sampleChannelBilinear(_,w,n)*a*l,x+=this.sampleChannelBilinear(y,w,n)*f*l,x+=this.sampleChannelBilinear(m,w,n)*u*l,x}sampleBicubicUV(t,e,n){const i=this.itemSize;for(let r=0;r<i;r++)n[r]=this.sampleChannelBicubicUV(t,e,r)}sampleChannelBicubicUV(t,e,n){const i=t*this.width,r=e*this.height;return this.sampleChannelBicubic(i-.5,r-.5,n)}sampleChannelBicubic(t,e,n){const i=this.itemSize,r=this.width,s=this.height,o=this.data,a=r*i,h=r-1,c=s-1,l=A(t,0,h),f=A(e,0,c),g=0|l,_=0|f,p=l-g,m=f-_,w=d(0,g-1),y=d(0,_-1),v=u(h,g+1),x=u(c,_+1),b=u(h,v+1),E=y*a+n,S=_*a+n,M=x*a+n,U=u(c,x+1)*a+n,$=w*i,F=g*i,z=v*i,C=b*i,B=o[E+$],V=o[E+F],q=o[E+z],L=o[E+C],T=o[S+$],I=o[S+F],N=o[S+z],k=o[S+C],O=o[M+$],D=o[M+F],R=o[M+z],J=o[M+C],P=o[U+$],W=o[U+F],H=o[U+z],G=o[U+C],Y=j(p,B,V,q,L),K=j(p,T,I,N,k),Q=j(p,O,D,R,J),X=j(p,P,W,H,G);return j(m,Y,K,Q,X)}sampleBilinearUV(t,e,n,i=0){const r=this.itemSize;for(let s=0;s<r;s++)n[s+i]=this.sampleChannelBilinearUV(t,e,s)}sampleBilinear(t,e,n,i=0){const r=this.itemSize;for(let s=0;s<r;s++)n[s+i]=this.sampleChannelBilinear(t,e,s)}sampleChannelBilinearUV(t,e,n){const i=t*this.width-.5,r=e*this.height-.5;return this.sampleChannelBilinear(i,r,n)}sampleChannelBilinear(t,e,n){const i=this.itemSize,r=this.width,s=r*i,o=this.height-1,a=A(t,0,r-1),h=A(e,0,o),c=0|a,d=0|h,u=d*s,l=c*i+n,f=u+l;let g,_;g=a===c?c:c+1,_=h===d?d:d+1;const p=this.data,m=p[f];if(c===g&&d===_)return m;const w=a-c,y=h-d,v=g*i+n,x=_*s,b=x+l,S=x+v,M=p[u+v],U=p[b],$=p[S],F=E(m,M,w),z=E(U,$,w);return E(F,z,y)}sampleNearestUV(t,e,n){const i=this.width,r=this.height,s=Math.round(t*i-.5),o=Math.round(e*r-.5);this.read(A(s,0,i-1),A(o,0,r-1),n)}readChannel(t,e,n){const i=(e*this.width+t)*this.itemSize+n;return this.data[i]}read(t,e,n){const i=this.width,r=this.itemSize,s=(e*i+t)*r;for(let t=0;t<r;t++){const e=this.data[s+t];n[t]=e}}sample(t,e,n){const i=[];return this.sampleBilinear(t*(this.width-1),e*(this.height-1),i,0),n.readFromArray(i),i[0]}point2index(t,e){return t+e*this.width}index2point(t,e){const n=this.width,i=t%n,r=t/n|0;e.set(i,r)}copyWithMargin(t,e,n,i,r,s,o,a,h,c,d){const u=this.itemSize,l=t.itemSize,f=Math.min(u,l),g=u*this.width,_=l*t.width,p=t.data,m=this.data;let w,y,v,x,b,A,E,S,M;for(M=n*_+e*u,y=Math.max(0,r-c),b=r;y<b;y++)for(A=y*g,w=Math.max(0,i-a),x=i;w<x;w++)for(S=A+w*u,v=0;v<f;v++)m[S+v]=p[M+v];for(E=n*_,y=Math.max(0,r-c),b=r;y<b;y++)for(A=y*g,w=0;w<s;w++)for(S=A+(w+i)*u,M=E+(w+e)*u,v=0;v<f;v++)m[S+v]=p[M+v];for(M=n*_+(e+s-1)*u,y=Math.max(0,r-c),b=r;y<b;y++)for(A=y*g,w=i+s,x=Math.min(this.width,w+h);w<x;w++)for(S=A+w*u,v=0;v<f;v++)m[S+v]=p[M+v];for(y=0;y<o;y++)for(A=(y+r)*g,E=(y+n)*_,M=E+e*u,w=Math.max(0,i-a),x=i;w<x;w++)for(S=A+w*u,v=0;v<f;v++)m[S+v]=p[M+v];for(this.copy(t,e,n,i,r,s,o),y=0;y<o;y++)for(A=(y+r)*g,E=(y+n)*_,M=E+(e+s-1)*u,w=i+s,x=Math.min(this.width,w+h);w<x;w++)for(S=A+w*u,v=0;v<f;v++)m[S+v]=p[M+v];for(M=(n+o-1)*_+e*u,y=r+s,b=Math.min(this.height,y+d);y<b;y++)for(A=y*g,w=Math.max(0,i-a),x=i;w<x;w++)for(S=A+w*u,v=0;v<f;v++)m[S+v]=p[M+v];for(E=(n+o-1)*_,y=r+s,b=Math.min(this.height,y+d);y<b;y++)for(A=y*g,w=0;w<s;w++)for(S=A+(w+i)*u,M=E+(w+e)*u,v=0;v<f;v++)m[S+v]=p[M+v];for(M=(n+o-1)*_+(e+s-1)*u,y=r+s,b=Math.min(this.height,y+d);y<b;y++)for(A=y*g,w=i+s,x=Math.min(this.width,w+h);w<x;w++)for(S=A+w*u,v=0;v<f;v++)m[S+v]=p[M+v];this.version++}copy(t,e,n,i,r,s,o){const a=Math.min(s,t.width-e,this.width-i),h=Math.min(o,t.height-n,this.height-r),c=this.itemSize,d=t.itemSize,u=Math.min(c,d),l=c*this.width,f=d*t.width,g=t.data,_=this.data;let p,m,w;for(m=0;m<h;m++){const t=(m+r)*l,s=(m+n)*f;for(p=0;p<a;p++){const n=t+(p+i)*c,r=s+(p+e)*d;for(w=0;w<u;w++)_[n+w]=g[r+w]}}this.version++}copy_sameItemSize(t,e,n,i,r,s,o){const a=this.itemSize;t.itemSize;const h=Math.min(s,t.width-e,this.width-i),c=Math.min(o,t.height-n,this.height-r),d=a*this.width,u=a*t.width,l=t.data,f=this.data,g=h*a;let _,p;for(_=0;_<c;_++){const t=(_+r)*d+i*a,s=(_+n)*u+e*a;for(p=0;p<g;p++)f[t+p]=l[s+p]}this.version++}paint(t,e,n,i,r,s,o,a=0){let h;if(0!==a)throw new Error(`Unsupported blendType(=${a})`);h=R;const c=Math.min(s,t.width-e,this.width-i),d=Math.min(o,t.height-n,this.height-r),u=Math.max(0,-i),l=[0,0,0,255],f=[0,0,0,255],g=[];let _,p;for(p=Math.max(0,-r);p<d;p++)for(_=u;_<c;_++){const e=Math.round(_+i),s=Math.round(p+r);this.read(e,s,l);const o=Math.round(_+n),a=Math.round(p+n);t.read(o,a,f),h(f,l,g),this.set(e,s,g)}}zeroFill(t,e,n,i){const r=A(t,0,this.width),s=A(e,0,this.height),o=A(t+n,0,this.width),a=A(e+i,0,this.height),h=this.data,c=this.itemSize,d=c*this.width,u=r*c,l=o*c;let f;for(f=s;f<a;f++){const t=f*d;h.fill(0,t+u,t+l)}this.version++}fill_channel(t,e){const n=this.itemSize,i=this.data,r=i.length;for(let s=t;s<r;s+=n)i[s]=e;this.version++}fill(t,e,n,i,r){const s=this.width,o=this.height,a=A(t,0,s),h=A(e,0,o),c=A(t+n,0,s),d=A(e+i,0,o),u=this.data,l=this.itemSize,f=l*s;let g,_,p;for(g=h;g<d;g++){const t=g*f;for(_=a;_<c;_++){const e=t+_*l;for(p=0;p<l;p++)u[e+p]=r[p]}}this.version++}writeChannel(t,e,n,i){const r=(e*this.width+t)*this.itemSize+n;this.data[r]=i,this.version++}set(t,e,n){const i=this.data,r=this.itemSize,s=r*this.width*e+t*r;for(let t=0;t<r;t++)i[s+t]=n[t];this.version++}traverseCircle(t,e,n,i){let r,s;const o=0|t,a=0|e,h=n*n,c=Math.ceil(n);for(s=-c;s<=c;s++){const t=s*s;for(r=-c;r<=c;r++)r*r+t<=h&&i(o+r,a+s,this)}}resize(t,e,n=!0){const i=this.width,r=this.height;if(i===t&&r===e)return;const s=this.itemSize,o=t*e*s,a=this.data,h=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===i)h.set(a.subarray(0,Math.min(a.length,o)));else{const n=u(e,r),o=u(t,i);for(let e=0;e<n;e++)for(let n=0;n<o;n++){const r=(e*t+n)*s,o=(e*i+n)*s;for(let t=0;t<s;t++)h[r+t]=a[o+t]}}this.width=t,this.height=e,this.data=h,this.version++}computeByteSize(){let t;return t=Array.isArray(this.data)?8*this.data.length:this.data.buffer.byteLength,t+280}toBinaryBuffer(t){throw new Error("Deprecated, use Sampler2DSerializationAdapter instead")}fromBinaryBuffer(t){throw new Error("Deprecated, use Sampler2DSerializationAdapter instead")}equals(e){return this.width===e.width&&this.height===e.height&&this.itemSize===e.itemSize&&function(e,n){if(e===n)return!0;const i=e.length;if(i!==n.length)return!1;if(i<128)return t(e,n);const r=e.byteLength;if(r!==n.byteLength)return!1;const s=e.constructor;if(s!==n.constructor)return!1;const o=e.buffer,a=n.buffer;if(o===a&&e.byteOffset===n.byteOffset)return!0;let h=e,c=n;const d=s.BYTES_PER_ELEMENT;return d<4&&r%4==0?(h=new Uint32Array(o,e.byteOffset,r/4),c=new Uint32Array(a,n.byteOffset,r/4)):d<2&&r%2==0&&(h=new Uint16Array(o,e.byteOffset,r/2),c=new Uint16Array(a,n.byteOffset,r/2)),t(h,c)}(this.data,e.data)}hash(){let t=((65535&this.width)<<16|65535&this.height)^this.itemSize;const e=this.data.length,n=Math.max(1,Math.ceil(e/509));return t^=function(t,e,n,i){let r=n;for(let e=0;e<n;e+=i)r=31*r+t[e]|0;return r}(this.data,0,e,n),t}clone(){let t;return t=Array.isArray(this.data)?this.data.slice():new(0,this.data.constructor)(this.data),new D(t,this.itemSize,this.width,this.height)}toJSON(){const t=O.encode(this.data.buffer);return{height:this.height,width:this.width,itemSize:this.itemSize,type:V(this.data),data:t}}fromJSON({height:t,width:e,itemSize:n,type:i,data:r}){const s=function(t){const e=q[t];if(void 0===e)throw new Error(`Unsupported data type '${t}'`);return e}(i);if("string"==typeof r){const t=O.decode(r);this.data=new s(t)}else{if(!Array.isArray(r))throw new Error("Unsupported data format");this.data=new s(r)}this.height=t,this.width=e,this.itemSize=n}static uint8clamped(t,e,n){const i=new Uint8ClampedArray(e*n*t);return new D(i,t,e,n)}static uint8(t,e,n){const i=new Uint8Array(e*n*t);return new D(i,t,e,n)}static uint16(t,e,n){const i=new Uint16Array(e*n*t);return new D(i,t,e,n)}static uint32(t,e,n){const i=new Uint32Array(e*n*t);return new D(i,t,e,n)}static int8(t,e,n){const i=new Int8Array(e*n*t);return new D(i,t,e,n)}static int16(t,e,n){const i=new Int16Array(e*n*t);return new D(i,t,e,n)}static int32(t,e,n){const i=new Int32Array(e*n*t);return new D(i,t,e,n)}static float32(t,e,n){const i=new Float32Array(e*n*t);return new D(i,t,e,n)}static float64(t,e,n){const i=new Float64Array(e*n*t);return new D(i,t,e,n)}}function j(t,e,n,i,r){return.5*(i-e+(2*e-5*n+4*i-r+(3*(n-i)+r-e)*t)*t)*t+n}function R(t,e,n){const i=t[3]/255,r=e[3]/255;n[0]=t[0]*i+e[0]*(1-i),n[1]=t[1]*i+e[1]*(1-i),n[2]=t[2]*i+e[2]*(1-i),n[3]=255*(i+r*(1-i))}D.prototype.isSampler2D=!0,D.typeName="Sampler2D";const J={build:function(t,e,n,i,r,s){const o=n.x*s,a=n.y*s,h=o-1,c=a-1;let d=0,u=0;const l=o*a,f=new Float32Array(3*l),g=new Float32Array(3*l),_=new Float32Array(2*l);let p,m;const w=n.y/r.y/c,y=n.x/r.x/h,v=e.y/r.y,x=e.x/r.x,b=r.x*i.x,A=r.y*i.y;let E,S,M;for(p=0;p<a;p++){const e=p*w+v;for(M=e*A,m=0;m<o;m++){const n=m*y+x;E=n*b,S=t.sampleChannelBicubicUV(n,e,0),f[d]=E,f[d+1]=S,f[d+2]=M,_[u]=n,_[u+1]=e,d+=3,u+=2}}d=0;const U=new(f.length/3>65535?Uint32Array:Uint16Array)(h*c*6);for(p=0;p<c;p++)for(m=0;m<h;m++){const t=m+o*p,e=m+o*(p+1),n=m+1+o*(p+1),i=m+1+o*p;U[d]=t,U[d+1]=e,U[d+2]=i,U[d+3]=e,U[d+4]=n,U[d+5]=i,d+=6}return function(t,e,n){let i,r,s,o,a,h,c,d,u,l,f,g,_,p,m,w,y,v,x,b,A,E=0;const S=n.length;for(;E<S;E+=3)i=3*n[E],r=3*n[E+1],s=3*n[E+2],o=t[i],a=t[i+1],h=t[i+2],c=t[r],d=t[r+1],u=t[r+2],l=t[s],f=t[s+1],g=t[s+2],_=l-c,p=f-d,m=g-u,w=o-c,y=a-d,v=h-u,x=p*v-m*y,b=m*w-_*v,A=_*y-p*w,e[i]+=x,e[i+1]+=b,e[i+2]+=A,e[r]+=x,e[r+1]+=b,e[r+2]+=A,e[s]+=x,e[s+1]+=b,e[s+2]+=A;!function(t){let e,n,i,r,s=0;const o=t.length;for(;s<o;s+=3)e=t[s],n=t[s+1],i=t[s+2],r=1/Math.sqrt(e*e+n*n+i*i),t[s]*=r,t[s+1]*=r,t[s+2]*=r}(e)}(f,g,U),{indices:U,vertices:f,normals:g,uvs:_}}};function P(t,e,n=0,i=t.length){const r=n+i;for(let i=n;i<r;i++)if(t[i]===e)return t.splice(i,1),!0;return!1}function W(t,e){return-1===t.indexOf(e)&&(t.push(e),!0)}function H(t,e){return t.v0===e?t.v1:t.v1===e?t.v0:null}let G=0;class Y{constructor(){this.index=G++,this.v0=null,this.v1=null,this.faces=[],this.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 Y;return t.copy(this),t}validate(t){let e=!0;const n=this.faces,i=n.length;for(let r=0;r<i;r++)n[r].containsEdge(this)||(t(`Missing back-link from face[${r}]`),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,i=n.length;for(let t=0;t<i;t++)n[t].removeEdge(this)}isDegenerateEdge(){return this.v0===this.v1}isTopologyBorder(){return 1===this.faces.length}get length(){return this.lengthSqr<0&&this.computeSquaredLength(),Math.sqrt(this.lengthSqr)}computeSquaredLength(){const t=this.v0,e=this.v1,n=t.x,i=t.y,r=t.z,s=n-e.x,o=i-e.y,a=r-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,i=e.length;for(let r=0;r<i;r++){const i=e[r];i.removeEdge(t),-1===n.indexOf(i)&&(n.push(i),i.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){W(this.faces,t)}removeFace(t){P(this.faces,t)}getOtherVertex(t){return H(this,t)}containsVertex(t){return e=t,this.v0===e||this.v1===e;var e}containsBothVertices(t,e){return function(t,e,n){const i=t.v0,r=t.v1;return!(i!==e&&i!==n||r!==e&&r!==n)}(this,t,e)}containsSameVerticesAs(t){return this.containsBothVertices(t.v0,t.v1)}}function K(t,e,n){const i=t.length;for(let r=0;r<i;r++)t[r]===e&&(t[r]=n)}Y.prototype.isTopoEdge=!0;var Q,X="undefined"!=typeof Float32Array?Float32Array:Array;function Z(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t}Math.hypot||(Math.hypot=function(){for(var t=0,e=arguments.length;e--;)t+=arguments[e]*arguments[e];return Math.sqrt(t)}),Q=new X(3),X!=Float32Array&&(Q[0]=0,Q[1]=0,Q[2]=0);let tt=0;class et{constructor(){this.index=tt++,this.vertices=[],this.edges=[],this.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(),Z(this.normal,t.normal)}clone(){const t=new et;return t.copy(this),t}validate(t){let e=!0;const n=this.vertices,i=n.length;3!==i&&(t(`Expected number of vertices is 3, instead got ${i}`),e=!1);for(let r=0;r<i;r++)n[r].containsFace(this)||(t(`Missing back-link from vertex[${r}]`),e=!1);const r=this.edges,s=r.length;3!==s&&(t(`Expected number of edges is 3, instead got ${s}`),e=!1);for(let n=0;n<s;n++)r[n].containsFace(this)||(t(`Missing back-link from edge[${n}]`),e=!1);return e}isLinked(){return this.vertices[0].containsFace(this)}replaceEdge(t,e){K(this.edges,t,e)}replaceVertex(t,e){K(this.vertices,t,e)}isDegenerateTopology(){const t=this.vertices,e=t[0],n=t[1],i=t[2];return e===n||e===i||n===i}unlink(){const t=this.vertices,e=t.length;for(let n=0;n<e;n++)t[n].removeFace(this);const n=this.edges,i=n.length;for(let t=0;t<i;t++)n[t].removeFace(this)}addEdge(t){this.edges.push(t)}addUniqueEdge(t){return W(this.edges,t)}removeEdge(t){P(this.edges,t)}containsEdge(t){return-1!==this.edges.indexOf(t)}computeNormal(){const t=this.vertices,e=t[0],n=t[1],i=t[2];!function(t,e,n,i){!function(t,e,n,i,r,s,o,a,h,c,d){const u=h-s,l=c-o,f=d-a,g=n-s,_=i-o,p=r-a,m=l*p-f*_,w=f*g-u*p,y=u*_-l*g,v=function(t,e,n){return t*t+e*e+n*n}(m,w,y);if(0===v)return t[0]=0,t[1]=1,void(t[2]=0);const x=1/Math.sqrt(v),b=m*x,A=w*x,E=y*x;t[0]=b,t[1]=A,t[2]=E}(t,0,e[0],e[1],e[2],n[0],n[1],n[2],i[0],i[1],i[2])}(this.normal,e,n,i)}setVertexAt(t,e){this.vertices[t]=e}containsVertex(t){return-1!==this.vertices.indexOf(t)}getEdgeNeighbours(t,e){let n=0;const i=this.edges,r=i.length;for(let s=0;s<r;s++){const r=i[s].faces,o=r.length;for(let i=0;i<o;i++){const s=r[i];s!==this&&(t[e+n]=s,n++)}}return n}}et.prototype.isTopoFace=!0;class nt{constructor(){this.index=0,this.edges=[],this.faces=[],this.x=0,this.y=0,this.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 nt;return t.copy(this),t}validate(t){let e=!0;const n=this.faces,i=n.length;for(let r=0;r<i;r++)n[r].containsVertex(this)||(t(`Missing back-link from face[${r}]`),e=!1);const r=this.edges,s=r.length;for(let n=0;n<s;n++)r[n].containsVertex(this)||(t(`Missing back-link from edge[${n}]`),e=!1);return e}distanceTo(t){return e=this.x,n=this.y,i=this.z,r=t.x,s=t.y,o=t.z,Math.sqrt(function(t,e,n,i,r,s){const o=t-i,a=e-r,h=n-s;return o*o+a*a+h*h}(e,n,i,r,s,o));var e,n,i,r,s,o}addFace(t){this.faces.push(t)}addUniqueFace(t){return W(this.faces,t)}containsFace(t){return-1!==this.faces.indexOf(t)}removeFace(t){P(this.faces,t)}addEdge(t){this.edges.push(t)}addUniqueEdge(t){return W(this.edges,t)}replaceEdge(t,e){const n=this.edges,i=n.indexOf(t);n[i]=e}containsEdge(t){return-1!==this.edges.indexOf(t)}removeEdge(t){return P(this.edges,t)}replaceAnotherVertex(t){const e=t.faces,n=e.length;let i=0;for(;i<n;i++){const n=e[i];n.replaceVertex(t,this),this.addUniqueFace(n)}const r=t.edges,s=r.length;for(i=0;i<s;i++){const e=r[i];e.replaceVertex(t,this),this.addUniqueEdge(e)}}computeNeighbourVertices(t,e){let n=0;const i=this.edges,r=i.length;for(let s=0;s<r;s++){const r=i[s].getOtherVertex(this);t[e+n]=r,n++}return n}}function it(t,e=","){return t.toString().replace(/\B(?=(\d{3})+(?!\d))/g,e)}nt.prototype.isTopoVertex=!0;class rt{constructor(){this.vertices=[],this.__edges=new Set,this.__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){let e=!0,n="",i=0;function r(r){t(`${n}[${i}]: ${r}`),e=!1}n="Edge",i=0;const s=this.getEdges();for(let t of s){t.validate(r),this.containsVertex(t.v0)||r("Link to off-mesh vertex v0"),this.containsVertex(t.v1)||r("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)||r(`Link to off-mesh face[${t}]`)}i++}const o=this.getFaces();n="Face",i=0;for(let t of o){t.validate(r);const e=t.edges,n=e.length;for(let t=0;t<n;t++){const n=e[t];this.containsEdge(n)||r(`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)||r(`Link to off-mesh vertex[${t}]`)}i++}const a=this.vertices,h=a.length;n="Vertex";for(let t=0;t<h;t++){i=t;const e=a[t];e.validate(r);const n=e.edges,s=n.length;for(let t=0;t<s;t++){const e=n[t];this.containsEdge(e)||r(`Link to off-mesh edge[${t}]`)}const o=e.faces,h=o.length;for(let t=0;t<h;t++){const e=o[t];this.containsFace(e)||r(`Link to off-mesh face[${t}]`)}}return e}clone(){const t=new rt;return t.add(this),t}buildVertexMapping(){const t=new Map,e=this.vertices,n=e.length;for(let i=0;i<n;i++){const n=e[i];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 et;Z(n.normal,t.normal);const i=t.vertices;for(let t=0;t<3;t++){const r=i[t];let s=e.get(r.index);void 0===s&&(s=new nt,s.index=r.index,s.x=r.x,s.y=r.y,s.z=r.z,e.set(r.index,s),this.addVertex(s)),n.setVertexAt(t,s),s.addUniqueFace(n)}this.addFace(n);const r=n.vertices,s=r[0],o=r[1],a=r[2],h=this.ensureEdge(s,o),c=this.ensureEdge(o,a),d=this.ensureEdge(a,s);h.addUniqueFace(n),c.addUniqueFace(n),d.addUniqueFace(n),n.addUniqueEdge(h),n.addUniqueEdge(c),n.addUniqueEdge(d)}add(t){const e=this.buildVertexMapping();this._addWithVertexMap(t,e)}addVertex(t){this.vertices.push(t)}addUniqueVertex(t){W(this.vertices,t)}removeVertex(t){var e;e=t,P(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){var e;e=t,this.__edges.delete(e)}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 i=t.vertices,r=i.length;for(let t=0;t<r;t++){const e=i[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,i=n.length;for(let r=0;r<i;r++){const i=n[r];if(H(i,t)===e)return i}const r=new Y;return r.v0=t,r.v1=e,t.edges.push(r),e.edges.push(r),this.__edges.add(r),r}mergeEdges(){const t=this.getEdges();for(let e of t){const n=e.v0,i=e.v1;for(let r of t){if(e===r)continue;const t=r.v0,s=r.v1;if(n===t){if(i!==s)continue}else{if(n!==s)continue;if(i!==t)continue}this.removeEdge(r),e.merge(r)}}}computeEdgeSquaredLengths(){const t=this.getEdges();for(let e of t)e.computeSquaredLength()}build(t,e){const n=e.length,i=t.length/3,r=this.vertices;for(let e=0;e<i;e++){const n=3*e,i=new nt;i.index=e,i.x=t[n],i.y=t[n+1],i.z=t[n+2],r[e]=i}const s=n/3,o=this.getFaces();for(let t=0;t<s;t++){const n=3*t,i=e[n],s=e[n+1],a=e[n+2],h=r[i],c=r[s],d=r[a],u=new et;u.index=t;const l=this.ensureEdge(h,c),f=this.ensureEdge(c,d),g=this.ensureEdge(d,h);l.faces.push(u),f.faces.push(u),g.faces.push(u),u.vertices.push(h,c,d),u.edges.push(l,f,g),h.faces.push(u),c.faces.push(u),d.faces.push(u),o.add(u)}}toString(){return`TopoMesh{ vertices: ${it(this.vertices.length)}, edges: ${it(this.getEdges().size)}, faces: ${it(this.getFaces().size)} }`}}rt.prototype.isTopoMesh=!0,self.Lib={build_bvh(t,e){const n=new x;return function(t,e,n){const i=n.length/3;t.setLeafCount(i),t.initialize_structure();for(let r=0;r<i;r++){const i=3*r;b(t,r,e,n[i],n[i+1],n[i+2])}t.build()}(n,t,e),n},Sampler2D:D,BufferedGeometryArraysBuilder:J,tensionOptimizeUV:function(t,e,n,i){const r=new rt;r.build(t,n),r.computeEdgeSquaredLengths();const s=t.length/3;for(let t=0;t<i;t++)t:for(let t=0;t<s;t++){const n=r.vertices[t],i=n.edges,s=i.length;if(0===s)continue;let o=0,a=0,h=0;for(let t=0;t<s;t++){const r=i[t];if(r.isTopologyBorder())continue t;const s=2*r.getOtherVertex(n).index,c=e[s],d=e[s+1],u=1/r.lengthSqr;o+=c*u,a+=d*u,h+=u}const c=o/h,d=a/h,u=2*n.index;e[u]=c,e[u+1]=d}},sampler2d_channel_compute_min:function(t,e=0){const n=t.itemSize,i=t.data,r=i.length;if(0===r)return;let s=i[e],o=e;for(let t=e+n;t<r;t+=n){const e=i[t];s>e&&(s=e,o=t)}const a=t.width,h=o/n|0;return{index:o,value:s,x:h%a,y:h/a|0}},sampler2d_channel_compute_max:function(t,e=0){const n=t.itemSize,i=t.data,r=i.length;if(0===r)return;let s=i[e],o=e;for(let t=e+n;t<r;t+=n){const e=i[t];s<e&&(s=e,o=t)}const a=t.width,h=o/n|0;return{index:o,value:s,x:h%a,y:h/a|0}}};
|
|
1
|
+
function t(t,e){const n=t.length;if(n!==e.length)return!1;let i=0;for(;i<n;i++)if(t[i]!==e[i])return!1;return!0}class e{appendDescriptionOf(t){throw new Error("Not Implemented")}appendList(t,e,n,i){throw new Error("Not Implemented")}appendText(t){throw new Error("Not Implemented")}appendValue(t){throw new Error("Not Implemented")}appendValueList(t,e,n,i){throw new Error("Not Implemented")}}class n{describeTo(t){throw new Error("Not Implemented")}}class i extends n{value;constructor(t){super(),this.value=t}describeTo(t){t.appendValue(this.value)}}class r{#t;constructor(t){this.#t=t}*[Symbol.iterator](){for(const t of this.#t)yield new i(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,i){return this.appendList(t,e,n,new r(i)),this}appendList(t,e,n,i){let r=!1;this.appendText(t);const s=i[Symbol.iterator]();for(let t=s.next();!0!==t.done;t=s.next())r&&this.appendText(e),this.appendDescriptionOf(t.value),r=!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 h(t,e,n,i,r){let s,o,a;for(a=0;a<r;a++)s=e+a,o=i+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)throw new Error(void 0!==n?n:`${t} !== ${e}`)},a.logicalyEqual=function(t,e,n){},a.ok=a,a.greaterThan=function(t,e,n){if(!(t>e)){let i="";throw void 0!==n&&(i+=n+". "),i+=`Expected ${t} > ${e}.`,new Error(i)}},a.greaterThanOrEqual=function(t,e,n){if(!(t>=e)){let i="";throw void 0!==n&&(i+=n+". "),i+=`Expected ${t} >= ${e}.`,new Error(i)}},a.lessThan=function(t,e,n){if(!(t<e)){let i="";throw void 0!==n&&(i+=n+". "),i+=`Expected ${t} < ${e}.`,new Error(i)}},a.lessThanOrEqual=function(t,e,n){if(!(t<=e)){let i="";throw void 0!==n&&(i+=n+". "),i+=`Expected ${t} <= ${e}.`,new Error(i)}},a.typeOf=function(t,e,n="value"){const i=typeof t;if(i!==e)throw new Error(`expected ${n} to be ${e}, instead was '${i}'(=${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,i="Arrays are not equal"){if(!t(e,n))throw new Error(i)},a.isInstanceOf=function(t,e,n="value",i=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.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)||(n=t,n instanceof Int8Array||n instanceof Uint8Array||n instanceof Uint8ClampedArray||n instanceof Int16Array||n instanceof Uint16Array||n instanceof Int32Array||n instanceof Uint32Array||n instanceof Float32Array||n instanceof Float64Array)))throw new Error(`expected ${e} to be an array-like structure, instead was something else (typeof ='${typeof t}')`);var n},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 i=new o;throw i.appendText(`Expected ${e} to be `),n.describeTo(i),i.appendText(" instead "),n.describeMismatch(t,i),new Error(i.value)};const c=new Uint32Array(781250);function d(t,e){return t<e?e:t}function u(t,e){return t<e?t:e}function l(t,e,n,i,r,s){t[e+0]=u(n[i+0],r[s+0]),t[e+1]=u(n[i+1],r[s+1]),t[e+2]=u(n[i+2],r[s+2]),t[e+3]=d(n[i+3],r[s+3]),t[e+4]=d(n[i+4],r[s+4]),t[e+5]=d(n[i+5],r[s+5])}function f(t,e,n,i,r,s,o,a){t[e+0]=n,t[e+1]=i,t[e+2]=r,t[e+3]=s,t[e+4]=o,t[e+5]=a}function g(t,e,n,i,r,s){const o=i-t,a=s-n;return(r-e)*(o+a)+a*o}function _(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 p(t,e,n){let i=t;return i<e&&(i=e),i<n&&(i=n),i}function m(t,e,n){let i=t;return i>e&&(i=e),i>n&&(i=n),i}function y(t,e,n){const i=t[n],r=t[n+1],s=t[n+2];f(t,e,i,r,s,i,r,s)}function w(t,e,n){const i=t[e],r=t[e+1],s=t[e+2];return function(t,e,n,i){const r=i[0],s=i[1],o=i[2],a=1023*(t-r)/(i[3]-r),h=1023*(e-s)/(i[4]-s),c=1023*(n-o)/(i[5]-o);return function(t,e,n){return _(t)|_(e)<<1|_(n)<<2}(Math.round(a),Math.round(h),Math.round(c))}(.5*(i+t[e+3]),.5*(r+t[e+4]),.5*(s+t[e+5]),n)}c.pointer=0;const v=c;class x{__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}setLeafData(t,e,n,i,r,s,o,a){const h=7*t+6*this.__node_count_binary;f(this.__data_float32,h,n,i,r,s,o,a),this.__data_uint32[h+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 i;i=n<this.__node_count_binary?6*n:7*(n-this.__node_count_binary)+this.getLeafBlockAddress(),this.readBounds(i,e,0),t+=g(e[0],e[1],e[2],e[3],e[4],e[5])}return t}__compute_bounds_area_of_3_boxes(t,e,n){const i=this.__data_float32;return g(m(i[t+0],i[e+0],i[n+0]),m(i[t+1],i[e+1],i[n+1]),m(i[t+2],i[e+2],i[n+2]),p(i[t+3],i[e+3],i[n+3]),p(i[t+4],i[e+4],i[n+4]),p(i[t+5],i[e+5],i[n+5]))}__fitness_function_should_swap_leaves_sah(t,e){const n=d(t-1,0),i=u(t+1,this.__node_count_leaf-1),r=this.getLeafBlockAddress(),s=7*t+r,o=7*n+r,a=7*i+r,h=7*e+r,c=7*d(e-1,0)+r,l=7*u(e+1,this.__node_count_leaf-1)+r;return this.__compute_bounds_area_of_3_boxes(o,s,a)+this.__compute_bounds_area_of_3_boxes(c,h,l)-(this.__compute_bounds_area_of_3_boxes(o,h,a)+this.__compute_bounds_area_of_3_boxes(c,s,l))}sort_bubble_sah(){const t=this.__node_count_leaf;for(let e=0;e<t;e++)for(let n=e+1;n<t;n++)this.__fitness_function_should_swap_leaves_sah(e,n)>0&&this.__swap_leaves(e,n)}sort_morton(t){const e=6*this.__node_count_binary;if(this.__node_count_leaf<2)return;let n,i,r=2;v[0]=0,v[1]=this.__node_count_leaf-1;const s=this.__data_float32;for(;r>0;){r-=2;const o=v[r+1],a=v[r];n=a,i=o;const h=w(s,7*(a+o>>1)+e,t);for(;n<=i;){for(;w(s,7*n+e,t)<h;)n++;for(;w(s,7*i+e,t)>h;)i--;n<=i&&(n!==i&&this.__swap_leaves(n,i),n++,i--)}a<i&&(v[r++]=a,v[r++]=i),n<o&&(v[r++]=n,v[r++]=o)}}__swap_leaves(t,e){const n=this.getLeafBlockAddress(),i=7*t+n,r=7*e+n;!function(t,e,n,i,r){let s,o,a;for(a=0;a<7;a++){s=e+a,o=i+a;const r=n[o];n[o]=t[s],t[s]=r}}(this.__data_float32,i,this.__data_float32,r)}build(){const t=this.__node_count_binary,e=6*t;let n,i,r,s,o=Math.floor(Math.log(t)/Math.log(2));r=Math.pow(2,o),i=6*(r-1);const a=this.__node_count_leaf,c=this.__data_float32;for(n=0;n<r;n++){const t=2*n,r=t+1,s=e+7*t;r<a?l(c,i,c,s,c,e+7*r):t<a?h(c,s,c,i,6):y(this.__data_float32,i,i-6),i+=6}for(o--;o>=0;o--)for(r=Math.pow(2,o),s=r-1,n=0;n<r;n++){const t=1+(s<<1);l(c,6*s,c,6*t,c,6*(t+1)),s++}}}function b(t,e,n,i,r,s){const o=3*i,a=3*r,h=3*s,c=n[o],d=n[o+1],u=n[o+2],l=n[a],f=n[a+1],g=n[a+2],_=n[h],y=n[h+1],w=n[h+2],v=m(c,l,_),x=m(d,f,y),b=m(u,g,w),A=p(c,l,_),E=p(d,f,y),S=p(u,g,w);t.setLeafData(e,e,v,x,b,A,E,S)}function A(t,e,n){return t<e?e:t>n?n:t}const E=function(t,e,n){return(e-t)*n+t},S="uint8",M="uint16",U="uint32",$="int8",F="int16",z="int32",C="float32",B="float64";function V(t){switch(Object.getPrototypeOf(t).constructor){case Uint8Array:case Uint8ClampedArray:return S;case Uint16Array:return M;case Uint32Array:return U;case Int8Array:return $;case Int16Array:return F;case Int32Array:return z;case Float32Array:return C;case Float64Array:return B;default:throw new Error("unsupported constructor type")}}const q={[S]:Uint8Array,[M]:Uint16Array,[U]:Uint32Array,[$]:Int8Array,[F]:Int16Array,[z]:Int32Array,float16:Uint16Array,[C]:Float32Array,[B]:Float64Array},L=[],T=[],I="undefined"!=typeof Uint8Array?Uint8Array:Array,N="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(let t=0,e=64;t<e;++t)L[t]=N[t],T[N.charCodeAt(t)]=t;function k(t,e,n){const i=[];for(let s=e;s<n;s+=3){const e=(t[s]<<16&16711680)+(t[s+1]<<8&65280)+(255&t[s+2]);i.push(L[(r=e)>>18&63]+L[r>>12&63]+L[r>>6&63]+L[63&r])}var r;return i.join("")}T["-".charCodeAt(0)]=62,T["_".charCodeAt(0)]=63;class O{static encode(t){return function(t){let e;const n=t.length,i=n%3,r=[],s=16383,o=n-i;for(let e=0;e<o;e+=s){const n=k(t,e,e+s>o?o:e+s);r.push(n)}return 1===i?(e=t[n-1],r.push(L[e>>2]+L[e<<4&63]+"==")):2===i&&(e=(t[n-2]<<8)+t[n-1],r.push(L[e>>10]+L[e>>4&63]+L[e<<2&63]+"=")),r.join("")}(new Uint8Array(t))}static decode(t){return function(t){var e,n,i=function(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var n=t.indexOf("=");return-1===n&&(n=e),[n,n===e?0:4-n%4]}(t),r=i[0],s=i[1],o=new I(function(t,e,n){return 3*(e+n)/4-n}(0,r,s)),a=0,h=s>0?r-4:r;for(n=0;n<h;n+=4)e=T[t.charCodeAt(n)]<<18|T[t.charCodeAt(n+1)]<<12|T[t.charCodeAt(n+2)]<<6|T[t.charCodeAt(n+3)],o[a++]=e>>16&255,o[a++]=e>>8&255,o[a++]=255&e;return 2===s&&(e=T[t.charCodeAt(n)]<<2|T[t.charCodeAt(n+1)]>>4,o[a++]=255&e),1===s&&(e=T[t.charCodeAt(n)]<<10|T[t.charCodeAt(n+1)]<<4|T[t.charCodeAt(n+2)]>>2,o[a++]=e>>8&255,o[a++]=255&e),o}(t).buffer}}class D{constructor(t=[],e=1,n=0,i=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(i)||n<0)throw new Error(`height must be a non-negative integer, instead was ${i}`);if(void 0===t)throw new Error("data was undefined");if(t.length<n*i*e)throw new Error(`Buffer underflow, data.length(=${t.length}) is too small. Expected at least ${n*i*e}`);this.width=n,this.height=i,this.itemSize=e,this.data=t,this.version=0}computeMax(t=0){throw new Error("deprecated, use sampler2d_channel_compute_max")}computeMinIndices(t,e=0,n=0){throw new Error("deprecated, use sampler2d_channel_compute_min_indices")}computeMin(t=0){throw new Error("deprecated, use sampler2d_channel_compute_min")}get(t,e,n){const i=[];return this.sampleBilinear(t,e,i,0),void 0!==n?(n.readFromArray(i,0),n):i[0]}sampleCatmullRomUV(t,e,n){const i=this.itemSize;for(let r=0;r<i;r++)n[r]=this.sampleChannelCatmullRomUV(t,e,r)}sampleChannelCatmullRomUV(t,e,n){const i=t*this.width-.5,r=e*this.height-.5;return this.sampleChannelCatmullRom(i,r,n)}sampleChannelCatmullRom(t,e,n){const i=Math.floor(t),r=Math.floor(e),s=t-i,o=e-r,a=s*(s*(1-.5*s)-.5),h=o*(o*(1-.5*o)-.5),c=s*(.5+s*(2-1.5*s)),d=o*(.5+o*(2-1.5*o)),u=s*s*(.5*s-.5),l=o*o*(.5*o-.5),f=1+s*s*(1.5*s-2.5)+c,g=1+o*o*(1.5*o-2.5)+d,_=i-1,p=r-1,m=i+2,y=r+2,w=i+c/f,v=r+d/g;let x=0;return x+=this.sampleChannelBilinear(_,p,n)*a*h,x+=this.sampleChannelBilinear(w,p,n)*f*h,x+=this.sampleChannelBilinear(m,p,n)*u*h,x+=this.sampleChannelBilinear(_,v,n)*a*g,x+=this.sampleChannelBilinear(w,v,n)*f*g,x+=this.sampleChannelBilinear(m,v,n)*u*g,x+=this.sampleChannelBilinear(_,y,n)*a*l,x+=this.sampleChannelBilinear(w,y,n)*f*l,x+=this.sampleChannelBilinear(m,y,n)*u*l,x}sampleBicubicUV(t,e,n){const i=this.itemSize;for(let r=0;r<i;r++)n[r]=this.sampleChannelBicubicUV(t,e,r)}sampleChannelBicubicUV(t,e,n){const i=t*this.width,r=e*this.height;return this.sampleChannelBicubic(i-.5,r-.5,n)}sampleChannelBicubic(t,e,n){const i=this.itemSize,r=this.width,s=this.height,o=this.data,a=r*i,h=r-1,c=s-1,l=A(t,0,h),f=A(e,0,c),g=0|l,_=0|f,p=l-g,m=f-_,y=d(0,g-1),w=d(0,_-1),v=u(h,g+1),x=u(c,_+1),b=u(h,v+1),E=w*a+n,S=_*a+n,M=x*a+n,U=u(c,x+1)*a+n,$=y*i,F=g*i,z=v*i,C=b*i,B=o[E+$],V=o[E+F],q=o[E+z],L=o[E+C],T=o[S+$],I=o[S+F],N=o[S+z],k=o[S+C],O=o[M+$],D=o[M+F],R=o[M+z],J=o[M+C],P=o[U+$],W=o[U+F],H=o[U+z],G=o[U+C],Y=j(p,B,V,q,L),K=j(p,T,I,N,k),Q=j(p,O,D,R,J),X=j(p,P,W,H,G);return j(m,Y,K,Q,X)}sampleBilinearUV(t,e,n,i=0){const r=this.itemSize;for(let s=0;s<r;s++)n[s+i]=this.sampleChannelBilinearUV(t,e,s)}sampleBilinear(t,e,n,i=0){const r=this.itemSize;for(let s=0;s<r;s++)n[s+i]=this.sampleChannelBilinear(t,e,s)}sampleChannelBilinearUV(t,e,n){const i=t*this.width-.5,r=e*this.height-.5;return this.sampleChannelBilinear(i,r,n)}sampleChannelBilinear(t,e,n){const i=this.itemSize,r=this.width,s=r*i,o=this.height-1,a=A(t,0,r-1),h=A(e,0,o),c=0|a,d=0|h,u=d*s,l=c*i+n,f=u+l;let g,_;g=a===c?c:c+1,_=h===d?d:d+1;const p=this.data,m=p[f];if(c===g&&d===_)return m;const y=a-c,w=h-d,v=g*i+n,x=_*s,b=x+l,S=x+v,M=p[u+v],U=p[b],$=p[S],F=E(m,M,y),z=E(U,$,y);return E(F,z,w)}sampleNearestUV(t,e,n){const i=this.width,r=this.height,s=Math.round(t*i-.5),o=Math.round(e*r-.5);this.read(A(s,0,i-1),A(o,0,r-1),n)}readChannel(t,e,n){const i=(e*this.width+t)*this.itemSize+n;return this.data[i]}read(t,e,n){const i=this.width,r=this.itemSize,s=(e*i+t)*r;for(let t=0;t<r;t++){const e=this.data[s+t];n[t]=e}}sample(t,e,n){const i=[];return this.sampleBilinear(t*(this.width-1),e*(this.height-1),i,0),n.readFromArray(i),i[0]}point2index(t,e){return t+e*this.width}index2point(t,e){const n=this.width,i=t%n,r=t/n|0;e.set(i,r)}copyWithMargin(t,e,n,i,r,s,o,a,h,c,d){const u=this.itemSize,l=t.itemSize,f=Math.min(u,l),g=u*this.width,_=l*t.width,p=t.data,m=this.data;let y,w,v,x,b,A,E,S,M;for(M=n*_+e*u,w=Math.max(0,r-c),b=r;w<b;w++)for(A=w*g,y=Math.max(0,i-a),x=i;y<x;y++)for(S=A+y*u,v=0;v<f;v++)m[S+v]=p[M+v];for(E=n*_,w=Math.max(0,r-c),b=r;w<b;w++)for(A=w*g,y=0;y<s;y++)for(S=A+(y+i)*u,M=E+(y+e)*u,v=0;v<f;v++)m[S+v]=p[M+v];for(M=n*_+(e+s-1)*u,w=Math.max(0,r-c),b=r;w<b;w++)for(A=w*g,y=i+s,x=Math.min(this.width,y+h);y<x;y++)for(S=A+y*u,v=0;v<f;v++)m[S+v]=p[M+v];for(w=0;w<o;w++)for(A=(w+r)*g,E=(w+n)*_,M=E+e*u,y=Math.max(0,i-a),x=i;y<x;y++)for(S=A+y*u,v=0;v<f;v++)m[S+v]=p[M+v];for(this.copy(t,e,n,i,r,s,o),w=0;w<o;w++)for(A=(w+r)*g,E=(w+n)*_,M=E+(e+s-1)*u,y=i+s,x=Math.min(this.width,y+h);y<x;y++)for(S=A+y*u,v=0;v<f;v++)m[S+v]=p[M+v];for(M=(n+o-1)*_+e*u,w=r+s,b=Math.min(this.height,w+d);w<b;w++)for(A=w*g,y=Math.max(0,i-a),x=i;y<x;y++)for(S=A+y*u,v=0;v<f;v++)m[S+v]=p[M+v];for(E=(n+o-1)*_,w=r+s,b=Math.min(this.height,w+d);w<b;w++)for(A=w*g,y=0;y<s;y++)for(S=A+(y+i)*u,M=E+(y+e)*u,v=0;v<f;v++)m[S+v]=p[M+v];for(M=(n+o-1)*_+(e+s-1)*u,w=r+s,b=Math.min(this.height,w+d);w<b;w++)for(A=w*g,y=i+s,x=Math.min(this.width,y+h);y<x;y++)for(S=A+y*u,v=0;v<f;v++)m[S+v]=p[M+v];this.version++}copy(t,e,n,i,r,s,o){const a=Math.min(s,t.width-e,this.width-i),h=Math.min(o,t.height-n,this.height-r),c=this.itemSize,d=t.itemSize,u=Math.min(c,d),l=c*this.width,f=d*t.width,g=t.data,_=this.data;let p,m,y;for(m=0;m<h;m++){const t=(m+r)*l,s=(m+n)*f;for(p=0;p<a;p++){const n=t+(p+i)*c,r=s+(p+e)*d;for(y=0;y<u;y++)_[n+y]=g[r+y]}}this.version++}copy_sameItemSize(t,e,n,i,r,s,o){const a=this.itemSize;t.itemSize;const h=Math.min(s,t.width-e,this.width-i),c=Math.min(o,t.height-n,this.height-r),d=a*this.width,u=a*t.width,l=t.data,f=this.data,g=h*a;let _,p;for(_=0;_<c;_++){const t=(_+r)*d+i*a,s=(_+n)*u+e*a;for(p=0;p<g;p++)f[t+p]=l[s+p]}this.version++}paint(t,e,n,i,r,s,o,a=0){let h;if(0!==a)throw new Error(`Unsupported blendType(=${a})`);h=R;const c=Math.min(s,t.width-e,this.width-i),d=Math.min(o,t.height-n,this.height-r),u=Math.max(0,-i),l=[0,0,0,255],f=[0,0,0,255],g=[];let _,p;for(p=Math.max(0,-r);p<d;p++)for(_=u;_<c;_++){const e=Math.round(_+i),s=Math.round(p+r);this.read(e,s,l);const o=Math.round(_+n),a=Math.round(p+n);t.read(o,a,f),h(f,l,g),this.set(e,s,g)}}zeroFill(t,e,n,i){const r=A(t,0,this.width),s=A(e,0,this.height),o=A(t+n,0,this.width),a=A(e+i,0,this.height),h=this.data,c=this.itemSize,d=c*this.width,u=r*c,l=o*c;let f;for(f=s;f<a;f++){const t=f*d;h.fill(0,t+u,t+l)}this.version++}fill_channel(t,e){const n=this.itemSize,i=this.data,r=i.length;for(let s=t;s<r;s+=n)i[s]=e;this.version++}fill(t,e,n,i,r){const s=this.width,o=this.height,a=A(t,0,s),h=A(e,0,o),c=A(t+n,0,s),d=A(e+i,0,o),u=this.data,l=this.itemSize,f=l*s;let g,_,p;for(g=h;g<d;g++){const t=g*f;for(_=a;_<c;_++){const e=t+_*l;for(p=0;p<l;p++)u[e+p]=r[p]}}this.version++}writeChannel(t,e,n,i){const r=(e*this.width+t)*this.itemSize+n;this.data[r]=i,this.version++}set(t,e,n){const i=this.data,r=this.itemSize,s=r*this.width*e+t*r;for(let t=0;t<r;t++)i[s+t]=n[t];this.version++}traverseCircle(t,e,n,i){let r,s;const o=0|t,a=0|e,h=n*n,c=Math.ceil(n);for(s=-c;s<=c;s++){const t=s*s;for(r=-c;r<=c;r++)r*r+t<=h&&i(o+r,a+s,this)}}resize(t,e,n=!0){const i=this.width,r=this.height;if(i===t&&r===e)return;const s=this.itemSize,o=t*e*s,a=this.data,h=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===i)h.set(a.subarray(0,Math.min(a.length,o)));else{const n=u(e,r),o=u(t,i);for(let e=0;e<n;e++)for(let n=0;n<o;n++){const r=(e*t+n)*s,o=(e*i+n)*s;for(let t=0;t<s;t++)h[r+t]=a[o+t]}}this.width=t,this.height=e,this.data=h,this.version++}computeByteSize(){let t;return t=Array.isArray(this.data)?8*this.data.length:this.data.buffer.byteLength,t+280}toBinaryBuffer(t){throw new Error("Deprecated, use Sampler2DSerializationAdapter instead")}fromBinaryBuffer(t){throw new Error("Deprecated, use Sampler2DSerializationAdapter instead")}equals(e){return this.width===e.width&&this.height===e.height&&this.itemSize===e.itemSize&&function(e,n){if(e===n)return!0;const i=e.length;if(i!==n.length)return!1;if(i<128)return t(e,n);const r=e.byteLength;if(r!==n.byteLength)return!1;const s=e.constructor;if(s!==n.constructor)return!1;const o=e.buffer,a=n.buffer;if(o===a&&e.byteOffset===n.byteOffset)return!0;let h=e,c=n;const d=s.BYTES_PER_ELEMENT;return d<4&&r%4==0?(h=new Uint32Array(o,e.byteOffset,r/4),c=new Uint32Array(a,n.byteOffset,r/4)):d<2&&r%2==0&&(h=new Uint16Array(o,e.byteOffset,r/2),c=new Uint16Array(a,n.byteOffset,r/2)),t(h,c)}(this.data,e.data)}hash(){let t=((65535&this.width)<<16|65535&this.height)^this.itemSize;const e=this.data.length,n=Math.max(1,Math.ceil(e/509));return t^=function(t,e,n,i){let r=n;for(let e=0;e<n;e+=i)r=31*r+t[e]|0;return r}(this.data,0,e,n),t}clone(){let t;return t=Array.isArray(this.data)?this.data.slice():new(0,this.data.constructor)(this.data),new D(t,this.itemSize,this.width,this.height)}toJSON(){const t=O.encode(this.data.buffer);return{height:this.height,width:this.width,itemSize:this.itemSize,type:V(this.data),data:t}}fromJSON({height:t,width:e,itemSize:n,type:i,data:r}){const s=function(t){const e=q[t];if(void 0===e)throw new Error(`Unsupported data type '${t}'`);return e}(i);if("string"==typeof r){const t=O.decode(r);this.data=new s(t)}else{if(!Array.isArray(r))throw new Error("Unsupported data format");this.data=new s(r)}this.height=t,this.width=e,this.itemSize=n}static uint8clamped(t,e,n){const i=new Uint8ClampedArray(e*n*t);return new D(i,t,e,n)}static uint8(t,e,n){const i=new Uint8Array(e*n*t);return new D(i,t,e,n)}static uint16(t,e,n){const i=new Uint16Array(e*n*t);return new D(i,t,e,n)}static uint32(t,e,n){const i=new Uint32Array(e*n*t);return new D(i,t,e,n)}static int8(t,e,n){const i=new Int8Array(e*n*t);return new D(i,t,e,n)}static int16(t,e,n){const i=new Int16Array(e*n*t);return new D(i,t,e,n)}static int32(t,e,n){const i=new Int32Array(e*n*t);return new D(i,t,e,n)}static float32(t,e,n){const i=new Float32Array(e*n*t);return new D(i,t,e,n)}static float64(t,e,n){const i=new Float64Array(e*n*t);return new D(i,t,e,n)}}function j(t,e,n,i,r){return.5*(i-e+(2*e-5*n+4*i-r+(3*(n-i)+r-e)*t)*t)*t+n}function R(t,e,n){const i=t[3]/255,r=e[3]/255;n[0]=t[0]*i+e[0]*(1-i),n[1]=t[1]*i+e[1]*(1-i),n[2]=t[2]*i+e[2]*(1-i),n[3]=255*(i+r*(1-i))}function J(t,e,n,i){const r=t[e],s=t[e+1],o=t[e+2],a=1/Math.hypot(r,s,o);n[i]=r*a,n[i+1]=s*a,n[i+2]=o*a}D.prototype.isSampler2D=!0,D.typeName="Sampler2D";const P={build:function(t,e,n,i,r,s){const o=n.x*s,a=n.y*s,h=o-1,c=a-1;let d=0,u=0;const l=o*a,f=new Float32Array(3*l),g=new Float32Array(3*l),_=new Float32Array(2*l);let p,m;const y=n.y/r.y/c,w=n.x/r.x/h,v=e.y/r.y,x=e.x/r.x,b=r.x*i.x,A=r.y*i.y;let E,S,M;for(p=0;p<a;p++){const e=p*y+v;for(M=e*A,m=0;m<o;m++){const n=m*w+x;E=n*b,S=t.sampleChannelBicubicUV(n,e,0),f[d]=E,f[d+1]=S,f[d+2]=M,_[u]=n,_[u+1]=e,d+=3,u+=2}}d=0;const U=new(f.length/3>65535?Uint32Array:Uint16Array)(h*c*6);for(p=0;p<c;p++)for(m=0;m<h;m++){const t=m+o*p,e=m+o*(p+1),n=m+1+o*(p+1),i=m+1+o*p;U[d]=t,U[d+1]=e,U[d+2]=i,U[d+3]=e,U[d+4]=n,U[d+5]=i,d+=6}return function(t,e,n){let i,r,s,o,a,h,c,d,u,l,f,g,_,p,m,y,w,v,x,b,A,E=0;const S=n.length;for(;E<S;E+=3)i=3*n[E],r=3*n[E+1],s=3*n[E+2],o=t[i],a=t[i+1],h=t[i+2],c=t[r],d=t[r+1],u=t[r+2],l=t[s],f=t[s+1],g=t[s+2],_=l-c,p=f-d,m=g-u,y=o-c,w=a-d,v=h-u,x=p*v-m*w,b=m*y-_*v,A=_*w-p*y,e[i]+=x,e[i+1]+=b,e[i+2]+=A,e[r]+=x,e[r+1]+=b,e[r+2]+=A,e[s]+=x,e[s+1]+=b,e[s+2]+=A;!function(t){const e=t.length;for(let n=0;n<e;n+=3)J(t,n,t,n)}(e)}(f,g,U),{indices:U,vertices:f,normals:g,uvs:_}}};function W(t,e,n=0,i=t.length){const r=n+i;for(let i=n;i<r;i++)if(t[i]===e)return t.splice(i,1),!0;return!1}function H(t,e){return-1===t.indexOf(e)&&(t.push(e),!0)}function G(t,e){return t.v0===e?t.v1:t.v1===e?t.v0:null}let Y=0;class K{constructor(){this.index=Y++,this.v0=null,this.v1=null,this.faces=[],this.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 K;return t.copy(this),t}validate(t){let e=!0;const n=this.faces,i=n.length;for(let r=0;r<i;r++)n[r].containsEdge(this)||(t(`Missing back-link from face[${r}]`),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,i=n.length;for(let t=0;t<i;t++)n[t].removeEdge(this)}isDegenerateEdge(){return this.v0===this.v1}isTopologyBorder(){return 1===this.faces.length}get length(){return this.lengthSqr<0&&this.computeSquaredLength(),Math.sqrt(this.lengthSqr)}computeSquaredLength(){const t=this.v0,e=this.v1,n=t.x,i=t.y,r=t.z,s=n-e.x,o=i-e.y,a=r-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,i=e.length;for(let r=0;r<i;r++){const i=e[r];i.removeEdge(t),-1===n.indexOf(i)&&(n.push(i),i.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){H(this.faces,t)}removeFace(t){W(this.faces,t)}getOtherVertex(t){return G(this,t)}containsVertex(t){return e=t,this.v0===e||this.v1===e;var e}containsBothVertices(t,e){return function(t,e,n){const i=t.v0,r=t.v1;return!(i!==e&&i!==n||r!==e&&r!==n)}(this,t,e)}containsSameVerticesAs(t){return this.containsBothVertices(t.v0,t.v1)}}function Q(t,e,n){const i=t.length;for(let r=0;r<i;r++)t[r]===e&&(t[r]=n)}K.prototype.isTopoEdge=!0;var X,Z="undefined"!=typeof Float32Array?Float32Array:Array;function tt(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t}Math.hypot||(Math.hypot=function(){for(var t=0,e=arguments.length;e--;)t+=arguments[e]*arguments[e];return Math.sqrt(t)}),X=new Z(3),Z!=Float32Array&&(X[0]=0,X[1]=0,X[2]=0);let et=0;class nt{constructor(){this.index=et++,this.vertices=[],this.edges=[],this.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(),tt(this.normal,t.normal)}clone(){const t=new nt;return t.copy(this),t}validate(t){let e=!0;const n=this.vertices,i=n.length;3!==i&&(t(`Expected number of vertices is 3, instead got ${i}`),e=!1);for(let r=0;r<i;r++)n[r].containsFace(this)||(t(`Missing back-link from vertex[${r}]`),e=!1);const r=this.edges,s=r.length;3!==s&&(t(`Expected number of edges is 3, instead got ${s}`),e=!1);for(let n=0;n<s;n++)r[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],i=t[2];return e===n||e===i||n===i}unlink(){const t=this.vertices,e=t.length;for(let n=0;n<e;n++)t[n].removeFace(this);const n=this.edges,i=n.length;for(let t=0;t<i;t++)n[t].removeFace(this)}addEdge(t){this.edges.push(t)}addUniqueEdge(t){return H(this.edges,t)}removeEdge(t){W(this.edges,t)}containsEdge(t){return-1!==this.edges.indexOf(t)}computeNormal(){const t=this.vertices,e=t[0],n=t[1],i=t[2];!function(t,e,n,i){!function(t,e,n,i,r,s,o,a,h,c,d){const u=h-s,l=c-o,f=d-a,g=n-s,_=i-o,p=r-a,m=l*p-f*_,y=f*g-u*p,w=u*_-l*g,v=function(t,e,n){return t*t+e*e+n*n}(m,y,w);if(0===v)return t[0]=0,t[1]=1,void(t[2]=0);const x=1/Math.sqrt(v),b=m*x,A=y*x,E=w*x;t[0]=b,t[1]=A,t[2]=E}(t,0,e[0],e[1],e[2],n[0],n[1],n[2],i[0],i[1],i[2])}(this.normal,e,n,i)}setVertexAt(t,e){this.vertices[t]=e}containsVertex(t){return-1!==this.vertices.indexOf(t)}getEdgeNeighbours(t,e){let n=0;const i=this.edges,r=i.length;for(let s=0;s<r;s++){const r=i[s].faces,o=r.length;for(let i=0;i<o;i++){const s=r[i];s!==this&&(t[e+n]=s,n++)}}return n}}nt.prototype.isTopoFace=!0;class it{constructor(){this.index=0,this.edges=[],this.faces=[],this.x=0,this.y=0,this.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 it;return t.copy(this),t}validate(t){let e=!0;const n=this.faces,i=n.length;for(let r=0;r<i;r++)n[r].containsVertex(this)||(t(`Missing back-link from face[${r}]`),e=!1);const r=this.edges,s=r.length;for(let n=0;n<s;n++)r[n].containsVertex(this)||(t(`Missing back-link from edge[${n}]`),e=!1);return e}distanceTo(t){return e=this.x,n=this.y,i=this.z,r=t.x,s=t.y,o=t.z,Math.sqrt(function(t,e,n,i,r,s){const o=t-i,a=e-r,h=n-s;return o*o+a*a+h*h}(e,n,i,r,s,o));var e,n,i,r,s,o}addFace(t){this.faces.push(t)}addUniqueFace(t){return H(this.faces,t)}containsFace(t){return-1!==this.faces.indexOf(t)}removeFace(t){W(this.faces,t)}addEdge(t){this.edges.push(t)}addUniqueEdge(t){return H(this.edges,t)}replaceEdge(t,e){const n=this.edges,i=n.indexOf(t);n[i]=e}containsEdge(t){return-1!==this.edges.indexOf(t)}removeEdge(t){return W(this.edges,t)}replaceAnotherVertex(t){const e=t.faces,n=e.length;let i=0;for(;i<n;i++){const n=e[i];n.replaceVertex(t,this),this.addUniqueFace(n)}const r=t.edges,s=r.length;for(i=0;i<s;i++){const e=r[i];e.replaceVertex(t,this),this.addUniqueEdge(e)}}computeNeighbourVertices(t,e){let n=0;const i=this.edges,r=i.length;for(let s=0;s<r;s++){const r=i[s].getOtherVertex(this);t[e+n]=r,n++}return n}}function rt(t,e=","){return t.toString().replace(/\B(?=(\d{3})+(?!\d))/g,e)}it.prototype.isTopoVertex=!0;class st{constructor(){this.vertices=[],this.__edges=new Set,this.__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){let e=!0,n="",i=0;function r(r){t(`${n}[${i}]: ${r}`),e=!1}n="Edge",i=0;const s=this.getEdges();for(let t of s){t.validate(r),this.containsVertex(t.v0)||r("Link to off-mesh vertex v0"),this.containsVertex(t.v1)||r("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)||r(`Link to off-mesh face[${t}]`)}i++}const o=this.getFaces();n="Face",i=0;for(let t of o){t.validate(r);const e=t.edges,n=e.length;for(let t=0;t<n;t++){const n=e[t];this.containsEdge(n)||r(`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)||r(`Link to off-mesh vertex[${t}]`)}i++}const a=this.vertices,h=a.length;n="Vertex";for(let t=0;t<h;t++){i=t;const e=a[t];e.validate(r);const n=e.edges,s=n.length;for(let t=0;t<s;t++){const e=n[t];this.containsEdge(e)||r(`Link to off-mesh edge[${t}]`)}const o=e.faces,h=o.length;for(let t=0;t<h;t++){const e=o[t];this.containsFace(e)||r(`Link to off-mesh face[${t}]`)}}return e}clone(){const t=new st;return t.add(this),t}buildVertexMapping(){const t=new Map,e=this.vertices,n=e.length;for(let i=0;i<n;i++){const n=e[i];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 nt;tt(n.normal,t.normal);const i=t.vertices;for(let t=0;t<3;t++){const r=i[t];let s=e.get(r.index);void 0===s&&(s=new it,s.index=r.index,s.x=r.x,s.y=r.y,s.z=r.z,e.set(r.index,s),this.addVertex(s)),n.setVertexAt(t,s),s.addUniqueFace(n)}this.addFace(n);const r=n.vertices,s=r[0],o=r[1],a=r[2],h=this.ensureEdge(s,o),c=this.ensureEdge(o,a),d=this.ensureEdge(a,s);h.addUniqueFace(n),c.addUniqueFace(n),d.addUniqueFace(n),n.addUniqueEdge(h),n.addUniqueEdge(c),n.addUniqueEdge(d)}add(t){const e=this.buildVertexMapping();this._addWithVertexMap(t,e)}addVertex(t){this.vertices.push(t)}addUniqueVertex(t){H(this.vertices,t)}removeVertex(t){var e;e=t,W(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){var e;e=t,this.__edges.delete(e)}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 i=t.vertices,r=i.length;for(let t=0;t<r;t++){const e=i[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,i=n.length;for(let r=0;r<i;r++){const i=n[r];if(G(i,t)===e)return i}const r=new K;return r.v0=t,r.v1=e,t.edges.push(r),e.edges.push(r),this.__edges.add(r),r}mergeEdges(){const t=this.getEdges();for(let e of t){const n=e.v0,i=e.v1;for(let r of t){if(e===r)continue;const t=r.v0,s=r.v1;if(n===t){if(i!==s)continue}else{if(n!==s)continue;if(i!==t)continue}this.removeEdge(r),e.merge(r)}}}computeEdgeSquaredLengths(){const t=this.getEdges();for(let e of t)e.computeSquaredLength()}build(t,e){const n=e.length,i=t.length/3,r=this.vertices;for(let e=0;e<i;e++){const n=3*e,i=new it;i.index=e,i.x=t[n],i.y=t[n+1],i.z=t[n+2],r[e]=i}const s=n/3,o=this.getFaces();for(let t=0;t<s;t++){const n=3*t,i=e[n],s=e[n+1],a=e[n+2],h=r[i],c=r[s],d=r[a],u=new nt;u.index=t;const l=this.ensureEdge(h,c),f=this.ensureEdge(c,d),g=this.ensureEdge(d,h);l.faces.push(u),f.faces.push(u),g.faces.push(u),u.vertices.push(h,c,d),u.edges.push(l,f,g),h.faces.push(u),c.faces.push(u),d.faces.push(u),o.add(u)}}toString(){return`TopoMesh{ vertices: ${rt(this.vertices.length)}, edges: ${rt(this.getEdges().size)}, faces: ${rt(this.getFaces().size)} }`}}st.prototype.isTopoMesh=!0,self.Lib={build_bvh(t,e){const n=new x;return function(t,e,n){const i=n.length/3;t.setLeafCount(i),t.initialize_structure();for(let r=0;r<i;r++){const i=3*r;b(t,r,e,n[i],n[i+1],n[i+2])}t.build()}(n,t,e),n},Sampler2D:D,BufferedGeometryArraysBuilder:P,tensionOptimizeUV:function(t,e,n,i){const r=new st;r.build(t,n),r.computeEdgeSquaredLengths();const s=t.length/3;for(let t=0;t<i;t++)t:for(let t=0;t<s;t++){const n=r.vertices[t],i=n.edges,s=i.length;if(0===s)continue;let o=0,a=0,h=0;for(let t=0;t<s;t++){const r=i[t];if(r.isTopologyBorder())continue t;const s=2*r.getOtherVertex(n).index,c=e[s],d=e[s+1],u=1/r.lengthSqr;o+=c*u,a+=d*u,h+=u}const c=o/h,d=a/h,u=2*n.index;e[u]=c,e[u+1]=d}},sampler2d_channel_compute_min:function(t,e=0){const n=t.itemSize,i=t.data,r=i.length;if(0===r)return;let s=i[e],o=e;for(let t=e+n;t<r;t+=n){const e=i[t];s>e&&(s=e,o=t)}const a=t.width,h=o/n|0;return{index:o,value:s,x:h%a,y:h/a|0}},sampler2d_channel_compute_max:function(t,e=0){const n=t.itemSize,i=t.data,r=i.length;if(0===r)return;let s=i[e],o=e;for(let t=e+n;t<r;t+=n){const e=i[t];s<e&&(s=e,o=t)}const a=t.width,h=o/n|0;return{index:o,value:s,x:h%a,y:h/a|0}}};
|
package/build/meep.cjs
CHANGED
|
@@ -1893,7 +1893,7 @@ function quat_encode_to_uint32(x, y, z, w) {
|
|
|
1893
1893
|
const absZ = Math.abs(z);
|
|
1894
1894
|
const absW = Math.abs(w);
|
|
1895
1895
|
|
|
1896
|
-
let
|
|
1896
|
+
let v0, v1, v2, dropped, max;
|
|
1897
1897
|
|
|
1898
1898
|
//pick max component
|
|
1899
1899
|
if (absY > absX) {
|
|
@@ -1924,7 +1924,6 @@ function quat_encode_to_uint32(x, y, z, w) {
|
|
|
1924
1924
|
max = 3;
|
|
1925
1925
|
}
|
|
1926
1926
|
|
|
1927
|
-
let v0, v1, v2, dropped;
|
|
1928
1927
|
|
|
1929
1928
|
//max will be dropped
|
|
1930
1929
|
if (max === 0) {
|
|
@@ -1964,7 +1963,7 @@ function quat_encode_to_uint32(x, y, z, w) {
|
|
|
1964
1963
|
v2 = -v2;
|
|
1965
1964
|
}
|
|
1966
1965
|
|
|
1967
|
-
const l = Math.
|
|
1966
|
+
const l = Math.hypot(v0, v1, v2, dropped);
|
|
1968
1967
|
const m = 511 / (l * Math.SQRT1_2);
|
|
1969
1968
|
|
|
1970
1969
|
//re-normalize the remaining components to 10 bit UINT value
|
|
@@ -56721,9 +56720,9 @@ function ceilPowerOfTwo(v) {
|
|
|
56721
56720
|
|
|
56722
56721
|
/**
|
|
56723
56722
|
* @template T
|
|
56724
|
-
* @param {T[]|ArrayLike<T>|TypedArray|Uint8ClampedArray|Uint8Array|Float32Array} a
|
|
56723
|
+
* @param {T[]|ArrayLike<T>|TypedArray|Uint8ClampedArray|Uint8Array|Uint32Array|Float32Array} a
|
|
56725
56724
|
* @param {number} a_offset
|
|
56726
|
-
* @param {T[]|ArrayLike<T>|TypedArray|Uint8ClampedArray|Uint8Array|Float32Array} b
|
|
56725
|
+
* @param {T[]|ArrayLike<T>|TypedArray|Uint8ClampedArray|Uint8Array|Uint32Array|Float32Array} b
|
|
56727
56726
|
* @param {number} b_offset
|
|
56728
56727
|
* @param {number} length How many elements should be moved
|
|
56729
56728
|
*/
|
|
@@ -65419,6 +65418,23 @@ const TaskSignal = {
|
|
|
65419
65418
|
Yield: 3
|
|
65420
65419
|
};
|
|
65421
65420
|
|
|
65421
|
+
/**
|
|
65422
|
+
* @template T
|
|
65423
|
+
* @param {T[]} array
|
|
65424
|
+
* @param {T} element
|
|
65425
|
+
* @return {boolean}
|
|
65426
|
+
*/
|
|
65427
|
+
function array_push_if_unique(array, element) {
|
|
65428
|
+
const i = array.indexOf(element);
|
|
65429
|
+
|
|
65430
|
+
if (i === -1) {
|
|
65431
|
+
array.push(element);
|
|
65432
|
+
return true;
|
|
65433
|
+
}
|
|
65434
|
+
|
|
65435
|
+
return false;
|
|
65436
|
+
}
|
|
65437
|
+
|
|
65422
65438
|
/**
|
|
65423
65439
|
* Created by Alex on 22/05/2016.
|
|
65424
65440
|
*/
|
|
@@ -65441,8 +65457,44 @@ const TaskState = {
|
|
|
65441
65457
|
* Created by Alex on 22/05/2016.
|
|
65442
65458
|
*/
|
|
65443
65459
|
|
|
65460
|
+
/**
|
|
65461
|
+
*
|
|
65462
|
+
* @type {number}
|
|
65463
|
+
*/
|
|
65464
|
+
let id_counter$3 = 0;
|
|
65444
65465
|
|
|
65445
65466
|
class Task {
|
|
65467
|
+
/**
|
|
65468
|
+
* @readonly
|
|
65469
|
+
* @type {number}
|
|
65470
|
+
*/
|
|
65471
|
+
id = id_counter$3++;
|
|
65472
|
+
|
|
65473
|
+
on = {
|
|
65474
|
+
started: new Signal(),
|
|
65475
|
+
completed: new Signal(),
|
|
65476
|
+
failed: new Signal()
|
|
65477
|
+
};
|
|
65478
|
+
|
|
65479
|
+
/**
|
|
65480
|
+
*
|
|
65481
|
+
* @type {ObservedInteger}
|
|
65482
|
+
*/
|
|
65483
|
+
state = new ObservedInteger(TaskState.INITIAL);
|
|
65484
|
+
|
|
65485
|
+
/**
|
|
65486
|
+
* amount of time spent running this task in milliseconds
|
|
65487
|
+
* @type {number}
|
|
65488
|
+
* @public
|
|
65489
|
+
*/
|
|
65490
|
+
__executedCpuTime = 0;
|
|
65491
|
+
/**
|
|
65492
|
+
* number of time task's cycle function was executed
|
|
65493
|
+
* @type {number}
|
|
65494
|
+
* @public
|
|
65495
|
+
*/
|
|
65496
|
+
__executedCycleCount = 0;
|
|
65497
|
+
|
|
65446
65498
|
/**
|
|
65447
65499
|
*
|
|
65448
65500
|
* @param {string} [name] useful for identifying the task later on, for various UI and debug purposes
|
|
@@ -65467,9 +65519,16 @@ class Task {
|
|
|
65467
65519
|
assert.isFunction(cycleFunction, 'cycleFunction');
|
|
65468
65520
|
assert.isNumber(estimatedDuration, 'estimatedDuration');
|
|
65469
65521
|
|
|
65470
|
-
|
|
65522
|
+
/**
|
|
65523
|
+
*
|
|
65524
|
+
* @type {Task[]}
|
|
65525
|
+
*/
|
|
65471
65526
|
this.dependencies = dependencies;
|
|
65472
65527
|
|
|
65528
|
+
/**
|
|
65529
|
+
*
|
|
65530
|
+
* @type {number}
|
|
65531
|
+
*/
|
|
65473
65532
|
this.estimatedDuration = estimatedDuration;
|
|
65474
65533
|
|
|
65475
65534
|
/**
|
|
@@ -65497,30 +65556,6 @@ class Task {
|
|
|
65497
65556
|
|
|
65498
65557
|
}
|
|
65499
65558
|
|
|
65500
|
-
this.on = {
|
|
65501
|
-
started: new Signal(),
|
|
65502
|
-
completed: new Signal(),
|
|
65503
|
-
failed: new Signal()
|
|
65504
|
-
};
|
|
65505
|
-
|
|
65506
|
-
/**
|
|
65507
|
-
*
|
|
65508
|
-
* @type {ObservedInteger}
|
|
65509
|
-
*/
|
|
65510
|
-
this.state = new ObservedInteger(TaskState.INITIAL);
|
|
65511
|
-
|
|
65512
|
-
/**
|
|
65513
|
-
* amount of time spent running this task in milliseconds
|
|
65514
|
-
* @type {number}
|
|
65515
|
-
* @public
|
|
65516
|
-
*/
|
|
65517
|
-
this.__executedCpuTime = 0;
|
|
65518
|
-
/**
|
|
65519
|
-
* number of time task's cycle function was executed
|
|
65520
|
-
* @type {number}
|
|
65521
|
-
* @public
|
|
65522
|
-
*/
|
|
65523
|
-
this.__executedCycleCount = 0;
|
|
65524
65559
|
}
|
|
65525
65560
|
|
|
65526
65561
|
computeProgress() {
|
|
@@ -65565,11 +65600,7 @@ class Task {
|
|
|
65565
65600
|
} else if (task.isTask) {
|
|
65566
65601
|
|
|
65567
65602
|
//check that the dependency is not registered yet
|
|
65568
|
-
|
|
65569
|
-
|
|
65570
|
-
this.dependencies.push(task);
|
|
65571
|
-
|
|
65572
|
-
}
|
|
65603
|
+
array_push_if_unique(this.dependencies, task);
|
|
65573
65604
|
|
|
65574
65605
|
} else {
|
|
65575
65606
|
throw new Error('Expected a Task or a TaskGroup, got something else');
|
|
@@ -65583,11 +65614,14 @@ class Task {
|
|
|
65583
65614
|
* @param {Array<(Task|TaskGroup)>} tasks
|
|
65584
65615
|
*/
|
|
65585
65616
|
addDependencies(tasks) {
|
|
65586
|
-
|
|
65587
|
-
|
|
65588
|
-
|
|
65617
|
+
assert.isArray(tasks, 'tasks');
|
|
65618
|
+
|
|
65619
|
+
const task_count = tasks.length;
|
|
65589
65620
|
|
|
65590
|
-
|
|
65621
|
+
for (let i = 0; i < task_count; i++) {
|
|
65622
|
+
const task = tasks[i];
|
|
65623
|
+
this.addDependency(task);
|
|
65624
|
+
}
|
|
65591
65625
|
}
|
|
65592
65626
|
|
|
65593
65627
|
toString() {
|
|
@@ -69927,23 +69961,6 @@ function array_copy_unique(source, source_position, destination, destination_pos
|
|
|
69927
69961
|
return j - destination_position;
|
|
69928
69962
|
}
|
|
69929
69963
|
|
|
69930
|
-
/**
|
|
69931
|
-
* @template T
|
|
69932
|
-
* @param {T[]} array
|
|
69933
|
-
* @param {T} element
|
|
69934
|
-
* @return {boolean}
|
|
69935
|
-
*/
|
|
69936
|
-
function array_push_if_unique(array, element) {
|
|
69937
|
-
const i = array.indexOf(element);
|
|
69938
|
-
|
|
69939
|
-
if (i === -1) {
|
|
69940
|
-
array.push(element);
|
|
69941
|
-
return true;
|
|
69942
|
-
}
|
|
69943
|
-
|
|
69944
|
-
return false;
|
|
69945
|
-
}
|
|
69946
|
-
|
|
69947
69964
|
/**
|
|
69948
69965
|
* Created by Alex on 01/04/2014.
|
|
69949
69966
|
*/
|
|
@@ -87870,7 +87887,7 @@ function computeStatisticalPartialMedian(values, start, end) {
|
|
|
87870
87887
|
|
|
87871
87888
|
const range = end - start;
|
|
87872
87889
|
|
|
87873
|
-
const position = (start + range
|
|
87890
|
+
const position = (start + range) >> 1;
|
|
87874
87891
|
|
|
87875
87892
|
return copy[position];
|
|
87876
87893
|
}
|
|
@@ -98777,13 +98794,6 @@ function playTrackRealTime(track, ecd) {
|
|
|
98777
98794
|
return entity;
|
|
98778
98795
|
}
|
|
98779
98796
|
|
|
98780
|
-
/**
|
|
98781
|
-
* Magic field that can be added to an individual component to control serialization on level of individual components
|
|
98782
|
-
* @readonly
|
|
98783
|
-
* @type {string}
|
|
98784
|
-
*/
|
|
98785
|
-
const COMPONENT_SERIALIZATION_TRANSIENT_FIELD = '@serialization_transient';
|
|
98786
|
-
|
|
98787
98797
|
/**
|
|
98788
98798
|
* @template A,B
|
|
98789
98799
|
* @param {A} a
|
|
@@ -98855,64 +98865,48 @@ const GUIElementFlag = {
|
|
|
98855
98865
|
class GUIElement {
|
|
98856
98866
|
/**
|
|
98857
98867
|
*
|
|
98858
|
-
* @
|
|
98859
|
-
* @constructor
|
|
98868
|
+
* @type {View}
|
|
98860
98869
|
*/
|
|
98861
|
-
|
|
98862
|
-
/**
|
|
98863
|
-
*
|
|
98864
|
-
* @type {View}
|
|
98865
|
-
*/
|
|
98866
|
-
this.view = null;
|
|
98867
|
-
|
|
98868
|
-
/**
|
|
98869
|
-
*
|
|
98870
|
-
* @type {String}
|
|
98871
|
-
*/
|
|
98872
|
-
this.klass = null;
|
|
98873
|
-
|
|
98874
|
-
/**
|
|
98875
|
-
*
|
|
98876
|
-
* @type {Object}
|
|
98877
|
-
*/
|
|
98878
|
-
this.parameters = {};
|
|
98879
|
-
|
|
98880
|
-
/**
|
|
98881
|
-
* ranges from 0..1 in both X and Y, controls anchor point of element positioning
|
|
98882
|
-
* @type {Vector2}
|
|
98883
|
-
*/
|
|
98884
|
-
this.anchor = new Vector2(0, 0);
|
|
98870
|
+
view = null;
|
|
98885
98871
|
|
|
98886
|
-
|
|
98887
|
-
|
|
98888
|
-
|
|
98889
|
-
|
|
98890
|
-
|
|
98891
|
-
this.group = null;
|
|
98872
|
+
/**
|
|
98873
|
+
*
|
|
98874
|
+
* @type {String}
|
|
98875
|
+
*/
|
|
98876
|
+
klass = null;
|
|
98892
98877
|
|
|
98893
|
-
|
|
98894
|
-
|
|
98895
|
-
|
|
98896
|
-
|
|
98897
|
-
|
|
98878
|
+
/**
|
|
98879
|
+
*
|
|
98880
|
+
* @type {Object}
|
|
98881
|
+
*/
|
|
98882
|
+
parameters = {};
|
|
98898
98883
|
|
|
98884
|
+
/**
|
|
98885
|
+
* ranges from 0..1 in both X and Y, controls anchor point of element positioning
|
|
98886
|
+
* @type {Vector2}
|
|
98887
|
+
*/
|
|
98888
|
+
anchor = new Vector2(0, 0);
|
|
98899
98889
|
|
|
98900
|
-
|
|
98901
|
-
|
|
98902
|
-
|
|
98903
|
-
|
|
98904
|
-
|
|
98890
|
+
/**
|
|
98891
|
+
* Used for visual grouping of elements, system will create and manage named containers to group elements together
|
|
98892
|
+
* @readonly
|
|
98893
|
+
* @type {String|null}
|
|
98894
|
+
*/
|
|
98895
|
+
group = null;
|
|
98905
98896
|
|
|
98897
|
+
/**
|
|
98898
|
+
* @private
|
|
98899
|
+
* @type {number}
|
|
98900
|
+
*/
|
|
98901
|
+
flags = GUIElementFlag.Managed;
|
|
98906
98902
|
|
|
98907
|
-
if (view !== undefined) {
|
|
98908
|
-
console.warn('constructor parameters are deprecated');
|
|
98909
|
-
this.view = view;
|
|
98910
98903
|
|
|
98911
|
-
|
|
98912
|
-
|
|
98913
|
-
|
|
98904
|
+
/**
|
|
98905
|
+
*
|
|
98906
|
+
* @type {ObservedBoolean}
|
|
98907
|
+
*/
|
|
98908
|
+
visible = new ObservedBoolean(true);
|
|
98914
98909
|
|
|
98915
|
-
}
|
|
98916
98910
|
|
|
98917
98911
|
/**
|
|
98918
98912
|
*
|
|
@@ -99069,11 +99063,9 @@ GUIElement.serializable = true;
|
|
|
99069
99063
|
class ViewportPosition {
|
|
99070
99064
|
/**
|
|
99071
99065
|
*
|
|
99072
|
-
* @param {Vector2} [position]
|
|
99073
|
-
* @param {Vector2} [offset]
|
|
99074
99066
|
* @constructor
|
|
99075
99067
|
*/
|
|
99076
|
-
constructor(
|
|
99068
|
+
constructor(options) {
|
|
99077
99069
|
/**
|
|
99078
99070
|
* Clip-scale position, on-screen values are in range of 0 to 1
|
|
99079
99071
|
* @type {Vector2}
|
|
@@ -99119,12 +99111,9 @@ class ViewportPosition {
|
|
|
99119
99111
|
*/
|
|
99120
99112
|
this.enabled = new ObservedBoolean(true);
|
|
99121
99113
|
|
|
99122
|
-
if (
|
|
99123
|
-
|
|
99124
|
-
|
|
99125
|
-
|
|
99126
|
-
if (offset !== void 0) {
|
|
99127
|
-
this.offset.copy(offset);
|
|
99114
|
+
if (options !== undefined) {
|
|
99115
|
+
console.warn("ViewportPosition constructor options is deprecated, please use static fromJSON method instead if you need similar functionality");
|
|
99116
|
+
this.fromJSON(options);
|
|
99128
99117
|
}
|
|
99129
99118
|
}
|
|
99130
99119
|
|