@woosh/meep-engine 2.118.13 → 2.119.1
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/package.json +1 -5
- package/src/core/bvh2/bvh3/query/BVHQueryAnd.d.ts +12 -0
- package/src/core/bvh2/bvh3/query/BVHQueryAnd.d.ts.map +1 -0
- package/src/core/bvh2/bvh3/query/BVHQueryAnd.js +29 -0
- package/src/core/bvh2/bvh3/query/BVHQueryIntersectsAABB.d.ts +7 -0
- package/src/core/bvh2/bvh3/query/BVHQueryIntersectsAABB.d.ts.map +1 -0
- package/src/core/bvh2/bvh3/query/BVHQueryIntersectsAABB.js +22 -0
- package/src/core/bvh2/bvh3/query/BVHQueryIntersectsRay.js +1 -1
- package/src/core/geom/3d/compute_triangle_normal.d.ts +16 -4
- package/src/core/geom/3d/compute_triangle_normal.d.ts.map +1 -1
- package/src/core/geom/3d/compute_triangle_normal.js +3 -3
- package/src/core/geom/3d/mat4/m4_multiply.d.ts +4 -4
- package/src/core/geom/3d/mat4/m4_multiply.d.ts.map +1 -1
- package/src/core/geom/3d/mat4/m4_multiply.js +3 -3
- package/src/core/geom/3d/topology/computeTopoMeshVertexDuplicates.d.ts.map +1 -1
- package/src/core/geom/3d/topology/computeTopoMeshVertexDuplicates.js +10 -5
- package/src/core/geom/3d/topology/query/query_edge_is_boundary.d.ts +1 -0
- package/src/core/geom/3d/topology/query/query_edge_is_boundary.d.ts.map +1 -1
- package/src/core/geom/3d/topology/query/query_edge_is_boundary.js +1 -0
- package/src/core/geom/3d/topology/{isVertexConnectedToOutline.d.ts → query/query_vertex_is_boundary.d.ts} +2 -2
- package/src/core/geom/3d/topology/query/query_vertex_is_boundary.d.ts.map +1 -0
- package/src/core/geom/3d/topology/{isVertexConnectedToOutline.js → query/query_vertex_is_boundary.js} +2 -2
- package/src/core/geom/3d/topology/samples/prototypeFloodFill.d.ts +2 -0
- package/src/core/geom/3d/topology/samples/prototypeFloodFill.d.ts.map +1 -0
- package/src/core/geom/3d/topology/samples/{sampleFloodFill.js → prototypeFloodFill.js} +3 -3
- package/src/core/geom/3d/topology/simplify/EdgeCollapseCandidate.d.ts.map +1 -1
- package/src/core/geom/3d/topology/simplify/EdgeCollapseCandidate.js +2 -32
- package/src/core/geom/3d/topology/simplify/computeEdgeCollapseCost.js +3 -3
- package/src/core/geom/3d/topology/simplify/decimate_edge_collapse_snap.d.ts.map +1 -1
- package/src/core/geom/3d/topology/simplify/decimate_edge_collapse_snap.js +9 -15
- package/src/core/geom/3d/topology/simplify/edge_collapse_quadratic.d.ts.map +1 -1
- package/src/core/geom/3d/topology/simplify/edge_collapse_quadratic.js +2 -57
- package/src/core/geom/3d/topology/simplify/prototypeMeshSimplification.js +2 -2
- package/src/core/geom/3d/topology/simplify/quadratic/Quadratic3.d.ts.map +1 -1
- package/src/core/geom/3d/topology/simplify/quadratic/Quadratic3.js +18 -18
- package/src/core/geom/3d/topology/simplify/simplifyTopoMesh.d.ts.map +1 -1
- package/src/core/geom/3d/topology/simplify/simplifyTopoMesh.js +1 -0
- package/src/core/geom/3d/topology/simplify/tm_edge_collapse_is_degenerate_flip.d.ts.map +1 -1
- package/src/core/geom/3d/topology/simplify/tm_edge_collapse_is_degenerate_flip.js +2 -18
- package/src/core/geom/3d/topology/struct/TopoTriangle.d.ts +17 -1
- package/src/core/geom/3d/topology/struct/TopoTriangle.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/TopoTriangle.js +60 -1
- package/src/core/geom/3d/topology/struct/TopoVertex.d.ts +8 -0
- package/src/core/geom/3d/topology/struct/TopoVertex.d.ts.map +1 -1
- package/src/core/geom/3d/topology/struct/TopoVertex.js +22 -1
- package/src/core/geom/3d/topology/{three_buffer_geometry_to_topo_mesh.d.ts → three/three_buffer_geometry_to_topo_mesh.d.ts} +1 -1
- package/src/core/geom/3d/topology/three/three_buffer_geometry_to_topo_mesh.d.ts.map +1 -0
- package/src/core/geom/3d/topology/{three_buffer_geometry_to_topo_mesh.js → three/three_buffer_geometry_to_topo_mesh.js} +1 -1
- package/src/core/geom/3d/topology/three/topo_mesh_to_three_buffer_geometry.d.ts.map +1 -0
- package/src/core/geom/3d/topology/tm_weld_duplicate_vertices.d.ts +9 -0
- package/src/core/geom/3d/topology/tm_weld_duplicate_vertices.d.ts.map +1 -0
- package/src/core/geom/3d/topology/{weld_duplicate_vertices.js → tm_weld_duplicate_vertices.js} +4 -5
- package/src/core/math/GOLDEN_RATIO.d.ts +1 -0
- package/src/core/math/GOLDEN_RATIO.d.ts.map +1 -1
- package/src/core/math/GOLDEN_RATIO.js +1 -0
- package/src/core/math/matrix/mat4x4_transpose_copy_to_mat4x3.d.ts +9 -0
- package/src/core/math/matrix/mat4x4_transpose_copy_to_mat4x3.d.ts.map +1 -0
- package/src/core/math/matrix/mat4x4_transpose_copy_to_mat4x3.js +26 -0
- package/src/engine/graphics/ecs/light/LightContext.d.ts.map +1 -1
- package/src/engine/graphics/ecs/light/LightContext.js +7 -10
- package/src/engine/graphics/ecs/light/binding/three/ThreeLightBinding.d.ts.map +1 -1
- package/src/engine/graphics/ecs/light/binding/three/ThreeLightBinding.js +4 -6
- package/src/engine/graphics/ecs/light/shadow/ShadowManager.d.ts.map +1 -1
- package/src/engine/graphics/ecs/light/shadow/ShadowManager.js +14 -15
- package/src/engine/graphics/geometry/AttributeGroupSpec.d.ts.map +1 -1
- package/src/engine/graphics/geometry/AttributeGroupSpec.js +15 -6
- package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.d.ts.map +1 -1
- package/src/engine/graphics/geometry/skining/computeSkinnedMeshVertices.js +23 -109
- package/src/engine/graphics/geometry/skining/mesh_apply_skeletal_vertex_skinning.d.ts +15 -0
- package/src/engine/graphics/geometry/skining/mesh_apply_skeletal_vertex_skinning.d.ts.map +1 -0
- package/src/engine/graphics/geometry/skining/mesh_apply_skeletal_vertex_skinning.js +85 -0
- package/src/engine/graphics/trail/x/RibbonXPlugin.d.ts +1 -1
- package/src/engine/graphics/trail/x/RibbonXPlugin.d.ts.map +1 -1
- package/src/engine/graphics/trail/x/RibbonXPlugin.js +2 -14
- package/src/engine/intelligence/blackboard/BlackboardValue.d.ts +2 -2
- package/src/engine/intelligence/blackboard/BlackboardValue.d.ts.map +1 -1
- package/build/meep.cjs +0 -118569
- package/build/meep.min.js +0 -1
- package/build/meep.module.js +0 -118534
- package/src/__module.d.ts +0 -3
- package/src/__module.d.ts.map +0 -1
- package/src/__module.js +0 -6
- package/src/core/__module.d.ts +0 -21
- package/src/core/__module.d.ts.map +0 -1
- package/src/core/__module.js +0 -22
- package/src/core/geom/3d/topology/isEdgeConnectedToOutline.d.ts +0 -7
- package/src/core/geom/3d/topology/isEdgeConnectedToOutline.d.ts.map +0 -1
- package/src/core/geom/3d/topology/isEdgeConnectedToOutline.js +0 -13
- package/src/core/geom/3d/topology/isVertexConnectedToOutline.d.ts.map +0 -1
- package/src/core/geom/3d/topology/samples/sampleFloodFill.d.ts +0 -2
- package/src/core/geom/3d/topology/samples/sampleFloodFill.d.ts.map +0 -1
- package/src/core/geom/3d/topology/three_buffer_geometry_to_topo_mesh.d.ts.map +0 -1
- package/src/core/geom/3d/topology/topo_mesh_to_three_buffer_geometry.d.ts.map +0 -1
- package/src/core/geom/3d/topology/weld_duplicate_vertices.d.ts +0 -9
- package/src/core/geom/3d/topology/weld_duplicate_vertices.d.ts.map +0 -1
- package/src/engine/__module.d.ts +0 -18
- package/src/engine/__module.d.ts.map +0 -1
- package/src/engine/__module.js +0 -20
- package/src/engine/intelligence/__module.d.ts +0 -7
- package/src/engine/intelligence/__module.d.ts.map +0 -1
- package/src/engine/intelligence/__module.js +0 -6
- /package/src/core/geom/3d/topology/{topo_mesh_to_three_buffer_geometry.d.ts → three/topo_mesh_to_three_buffer_geometry.d.ts} +0 -0
- /package/src/core/geom/3d/topology/{topo_mesh_to_three_buffer_geometry.js → three/topo_mesh_to_three_buffer_geometry.js} +0 -0
|
@@ -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),x=d(a,p),A=d(c,y),b=u(h,_),E=u(l,w),$=u(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 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 x(t,e,n){let r=t;return r>e&&(r=e),r>n&&(r=n),r}function A(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]=x(h,l,p),t[e+1]=x(u,f,y),t[e+2]=x(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 $,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 U(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 L(t,e){return t.v0===e||t.v1===e}function M(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)}),$=new F(3),F!=Float32Array&&($[0]=0,$[1]=0,$[2]=0);let T=0;class q{index=T++;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 q;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){U(this.faces,t)}removeFace(t){B(this.faces,t)}getOtherVertex(t){return E(this,t)}containsVertex(t){return L(this,t)}containsBothVertices(t,e){return M(this,t,e)}containsSameVerticesAs(t){return M(this,t.v0,t.v1)}}function I(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 x=1/Math.sqrt(v),A=_*x,b=w*x,E=m*x;t[e]=A,t[e+1]=b,t[e+2]=E}q.prototype.isTopoEdge=!0;let k=0;class O{index=k++;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 O;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){I(this.edges,t,e)}replaceVertex(t,e){I(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 U(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}}function j(t,e,n){return Math.sqrt(t*t+e*e+n*n)}O.prototype.isTopoFace=!0;class D{index=0;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++)L(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,j(t.x-e,t.y-n,t.z-r);var e,n,r}addFace(t){this.faces.push(t)}addUniqueFace(t){return U(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 U(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}}D.prototype.isTopoVertex=!0;class R{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 R;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 O;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){U(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 q;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 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 O;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)} }`}}R.prototype.isTopoMesh=!0;const J=[],P=[],H="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(let t=0,e=64;t<e;++t)J[t]=H[t],P[H.charCodeAt(t)]=t;function W(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(J[(i=e)>>18&63]+J[i>>12&63]+J[i>>6&63]+J[63&i])}var i;return r.join("")}P["-".charCodeAt(0)]=62,P["_".charCodeAt(0)]=63;const G=16383;class Y{static encode(t){return function(t){const e=t.length,n=e%3,r=[],i=e-n;for(let e=0;e<i;e+=G){const n=W(t,e,e+G>i?i:e+G);r.push(n)}if(1===n){const n=t[e-1];r.push(J[n>>2]+J[n<<4&63]+"==")}else if(2===n){const n=(t[e-2]<<8)+t[e-1];r.push(J[n>>10]+J[n>>4&63]+J[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=P[n]<<18|P[r]<<12|P[i]<<6|P[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=P[n]<<2|P[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=P[n]<<10|P[r]<<4|P[i]>>2,s[o++]=e>>8&255,s[o++]=255&e}return s}(t).buffer}}const K="uint8",Q="uint16",X="uint32",Z="int8",tt="int16",et="int32",nt="float32",rt="float64",it={[K]:Uint8Array,[Q]:Uint16Array,[X]:Uint32Array,[Z]:Int8Array,[tt]:Int16Array,[et]:Int32Array,float16:Uint16Array,[nt]:Float32Array,[rt]:Float64Array};function st(t){const e=Object.getPrototypeOf(t).constructor;switch(e){case Uint8Array:case Uint8ClampedArray:return K;case Uint16Array:return Q;case Uint32Array:return X;case Int8Array:return Z;case Int16Array:return tt;case Int32Array:return et;case Float32Array:return nt;case Float64Array:return rt;default:throw new Error(`unsupported constructor type ${e.name}`)}}function ot(t){const e=t>>0;return 4294967295*(t-e)^e}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}class ut{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 x=0;return x+=this.sampleChannelBilinear(p,y,n)*a*c,x+=this.sampleChannelBilinear(m,y,n)*f*c,x+=this.sampleChannelBilinear(_,y,n)*d*c,x+=this.sampleChannelBilinear(p,v,n)*a*g,x+=this.sampleChannelBilinear(m,v,n)*f*g,x+=this.sampleChannelBilinear(_,v,n)*d*g,x+=this.sampleChannelBilinear(p,w,n)*a*l,x+=this.sampleChannelBilinear(m,w,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,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),x=d(h,p+1),A=d(c,v+1),b=m*a+n,E=p*a+n,$=x*a+n,F=d(h,x+1)*a+n,S=w*r,U=g*r,z=v*r,C=A*r,V=o[b+S],B=o[b+U],L=o[b+z],M=o[b+C],T=o[E+S],q=o[E+U],I=o[E+z],N=o[E+C],k=o[$+S],O=o[$+U],j=o[$+z],D=o[$+C],R=o[F+S],J=o[F+U],P=o[F+z],H=o[F+C],W=ht(y,V,B,L,M),G=ht(y,T,q,I,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,x=p*s,A=x+l,b=x+v,E=y[d+v],$=y[A],F=y[b],S=ct(_,E,w),U=ct($,F,w);return ct(S,U,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]}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++}set(t,e,n){const r=this.data,i=this.itemSize,s=i*this.width*e+t*i;for(let t=0;t<i;t++)r[s+t]=n[t];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.buffer.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(){let t=((65535&this.width)<<16|65535&this.height)^this.itemSize;const e=this.data.length;return t^=function(t,e,n,r=31){const i=d(n,1024);return function(t,e,n,r,i,s){let o=n;for(let e=0;e<n;e+=r)o=(o<<5)-o+i.call(void 0,t[e]);return o>>>0}(t,0,i,Math.max(1,Math.ceil(i/r)),ot)}(this.data,0,e,509),t}clone(){let t;return t=Array.isArray(this.data)?this.data.slice():new(0,this.data.constructor)(this.data),new ut(t,this.itemSize,this.width,this.height)}toJSON(){const t=Y.encode(this.data.buffer);return{height:this.height,width:this.width,itemSize:this.itemSize,type:st(this.data),data:t}}fromJSON({height:t,width:e,itemSize:n,type:r,data:i}){const s=function(t){const e=it[t];if(void 0===e)throw new Error(`Unsupported data type '${t}'`);return e}(r);if("string"==typeof i){const t=Y.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 ut(r,t,e,n)}static uint8(t,e,n){const r=new Uint8Array(e*n*t);return new ut(r,t,e,n)}static uint16(t,e,n){const r=new Uint16Array(e*n*t);return new ut(r,t,e,n)}static uint32(t,e,n){const r=new Uint32Array(e*n*t);return new ut(r,t,e,n)}static int8(t,e,n){const r=new Int8Array(e*n*t);return new ut(r,t,e,n)}static int16(t,e,n){const r=new Int16Array(e*n*t);return new ut(r,t,e,n)}static int32(t,e,n){const r=new Int32Array(e*n*t);return new ut(r,t,e,n)}static float32(t,e,n){const r=new Float32Array(e*n*t);return new ut(r,t,e,n)}static float64(t,e,n){const r=new Float64Array(e*n*t);return new ut(r,t,e,n)}}function dt(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 lt(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 ft(t,e,n,r){const i=n[r],s=n[r+1],o=n[r+2],a=1/j(i,s,o);t[e]=i*a,t[e+1]=s*a,t[e+2]=o*a}ut.prototype.isSampler2D=!0,ut.typeName="Sampler2D";const gt=new Float64Array(3),pt={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,x=e.x/i.x,A=i.x*r.x,b=i.y*r.y;let E,$,F;for(y=0;y<a;y++){const e=y*w+v;for(F=e*b,_=0;_<o;_++){const n=_*m+x;E=n*A,$=t.sampleChannelBicubicUV(n,e,0),f[u]=E,f[u+1]=$,f[u+2]=F,p[d]=n,p[d+1]=e,u+=3,d+=2}}u=0;const S=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;S[u]=t,S[u+1]=e,S[u+2]=r,S[u+3]=e,S[u+4]=n,S[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];lt(gt,0,r,s,o,t),dt(e,3*r,gt,0),dt(e,3*s,gt,0),dt(e,3*o,gt,0)}!function(t,e=0,n=t.length-e){const r=e+n;for(let n=e;n<r;n+=3)ft(t,n,t,n)}(e)}(f,g,S),{indices:S,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;A(t,i,e,n[r],n[r+1],n[r+2])}t.build()}(n,t,e),n},Sampler2D:ut,BufferedGeometryArraysBuilder:pt,tensionOptimizeUV:function(t,e,n,r=3){const i=new R;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}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),x=d(a,p),A=d(c,y),b=u(h,_),E=u(l,w),$=u(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 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 x(t,e,n){let r=t;return r>e&&(r=e),r>n&&(r=n),r}function A(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]=x(h,l,p),t[e+1]=x(u,f,y),t[e+2]=x(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 $,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 U(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 L(t,e){return t.v0===e||t.v1===e}function M(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)}),$=new F(3),F!=Float32Array&&($[0]=0,$[1]=0,$[2]=0);let T=0;class q{index=T++;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 q;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){U(this.faces,t)}removeFace(t){B(this.faces,t)}getOtherVertex(t){return E(this,t)}containsVertex(t){return L(this,t)}containsBothVertices(t,e){return M(this,t,e)}containsSameVerticesAs(t){return M(this,t.v0,t.v1)}}function I(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 x=1/Math.sqrt(v),A=_*x,b=w*x,E=m*x;t[e]=A,t[e+1]=b,t[e+2]=E}function k(t,e,n){return Math.sqrt(t*t+e*e+n*n)}q.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++)L(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 U(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 U(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(),S(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){I(this.edges,t,e)}replaceVertex(t,e){I(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 U(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 q,f=new q,g=new q;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;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 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){U(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 q;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){const e=t>>0;return 4294967295*(t-e)^e}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}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 x=0;return x+=this.sampleChannelBilinear(p,y,n)*a*c,x+=this.sampleChannelBilinear(m,y,n)*f*c,x+=this.sampleChannelBilinear(_,y,n)*d*c,x+=this.sampleChannelBilinear(p,v,n)*a*g,x+=this.sampleChannelBilinear(m,v,n)*f*g,x+=this.sampleChannelBilinear(_,v,n)*d*g,x+=this.sampleChannelBilinear(p,w,n)*a*l,x+=this.sampleChannelBilinear(m,w,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,l=ct(t,0,c),f=ct(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),x=d(h,p+1),A=d(c,v+1),b=m*a+n,E=p*a+n,$=x*a+n,F=d(h,x+1)*a+n,S=w*r,U=g*r,z=v*r,C=A*r,V=o[b+S],B=o[b+U],L=o[b+z],M=o[b+C],T=o[E+S],q=o[E+U],I=o[E+z],N=o[E+C],k=o[$+S],O=o[$+U],j=o[$+z],D=o[$+C],R=o[F+S],J=o[F+U],P=o[F+z],H=o[F+C],W=ut(y,V,B,L,M),G=ut(y,T,q,I,N),Y=ut(y,k,O,j,D),K=ut(y,R,J,P,H);return ut(_,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,_=y[f];if(h===g&&u===p)return _;const w=a-h,m=c-u,v=g*r+n,x=p*s,A=x+l,b=x+v,E=y[d+v],$=y[A],F=y[b],S=ht(_,E,w),U=ht($,F,w);return ht(S,U,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]}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=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++}set(t,e,n){const r=this.data,i=this.itemSize,s=i*this.width*e+t*i;for(let t=0;t<i;t++)r[s+t]=n[t];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.buffer.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(){let t=((65535&this.width)<<16|65535&this.height)^this.itemSize;const e=this.data.length;return t^=function(t,e,n,r=31){const i=d(n,1024);return function(t,e,n,r,i,s){let o=n;for(let e=0;e<n;e+=r)o=(o<<5)-o+i.call(void 0,t[e]);return o>>>0}(t,0,i,Math.max(1,Math.ceil(i/r)),at)}(this.data,0,e,509),t}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.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,x=e.x/i.x,A=i.x*r.x,b=i.y*r.y;let E,$,F;for(y=0;y<a;y++){const e=y*w+v;for(F=e*b,_=0;_<o;_++){const n=_*m+x;E=n*A,$=t.sampleChannelBicubicUV(n,e,0),f[u]=E,f[u+1]=$,f[u+2]=F,p[d]=n,p[d+1]=e,u+=3,d+=2}}u=0;const S=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;S[u]=t,S[u+1]=e,S[u+2]=r,S[u+3]=e,S[u+4]=n,S[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,S),{indices:S,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;A(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}}};
|
package/package.json
CHANGED
|
@@ -5,14 +5,10 @@
|
|
|
5
5
|
"description": "Fully featured ECS game engine written in JavaScript",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"author": "Alexander Goldring",
|
|
8
|
-
"version": "2.
|
|
8
|
+
"version": "2.119.1",
|
|
9
9
|
"main": "build/meep.module.js",
|
|
10
10
|
"module": "build/meep.module.js",
|
|
11
11
|
"exports": {
|
|
12
|
-
".": {
|
|
13
|
-
"import": "./build/meep.module.js",
|
|
14
|
-
"require": "./build/meep.cjs"
|
|
15
|
-
},
|
|
16
12
|
"./build/*": "./build/*",
|
|
17
13
|
"./src/*": "./src/*",
|
|
18
14
|
"./editor/*": "./editor/*",
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export class BVHQueryAnd extends BVHQuery {
|
|
2
|
+
/**
|
|
3
|
+
*
|
|
4
|
+
* @param {BVHQuery} left
|
|
5
|
+
* @param {BVHQuery} right
|
|
6
|
+
*/
|
|
7
|
+
constructor(left: BVHQuery, right: BVHQuery);
|
|
8
|
+
evaluate(node: any, tree: any): boolean;
|
|
9
|
+
#private;
|
|
10
|
+
}
|
|
11
|
+
import { BVHQuery } from "./BVHQuery.js";
|
|
12
|
+
//# sourceMappingURL=BVHQueryAnd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BVHQueryAnd.d.ts","sourceRoot":"","sources":["../../../../../../src/core/bvh2/bvh3/query/BVHQueryAnd.js"],"names":[],"mappings":"AAEA;IAUI;;;;OAIG;IACH,kBAHW,QAAQ,SACR,QAAQ,EAOlB;IAED,wCAGC;;CACJ;yBA5BwB,eAAe"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { BVHQuery } from "./BVHQuery.js";
|
|
2
|
+
|
|
3
|
+
export class BVHQueryAnd extends BVHQuery {
|
|
4
|
+
/**
|
|
5
|
+
* @type {BVHQuery}
|
|
6
|
+
*/
|
|
7
|
+
#left;
|
|
8
|
+
/**
|
|
9
|
+
* @type {BVHQuery}
|
|
10
|
+
*/
|
|
11
|
+
#right;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
*
|
|
15
|
+
* @param {BVHQuery} left
|
|
16
|
+
* @param {BVHQuery} right
|
|
17
|
+
*/
|
|
18
|
+
constructor(left, right) {
|
|
19
|
+
super();
|
|
20
|
+
|
|
21
|
+
this.#left = left;
|
|
22
|
+
this.#right = right;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
evaluate(node, tree) {
|
|
26
|
+
return this.#left.evaluate(node, tree)
|
|
27
|
+
&& this.#right.evaluate(node, tree);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export class BVHQueryIntersectsAABB extends BVHQuery {
|
|
2
|
+
region: AABB3;
|
|
3
|
+
evaluate(node: any, tree: any): boolean;
|
|
4
|
+
}
|
|
5
|
+
import { BVHQuery } from "./BVHQuery.js";
|
|
6
|
+
import { AABB3 } from "../../../geom/3d/aabb/AABB3.js";
|
|
7
|
+
//# sourceMappingURL=BVHQueryIntersectsAABB.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BVHQueryIntersectsAABB.d.ts","sourceRoot":"","sources":["../../../../../../src/core/bvh2/bvh3/query/BVHQueryIntersectsAABB.js"],"names":[],"mappings":"AAMA;IAEI,cAAqB;IAErB,wCAUC;CACJ;yBAnBwB,eAAe;sBAFlB,gCAAgC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { AABB3 } from "../../../geom/3d/aabb/AABB3.js";
|
|
2
|
+
import { aabb3_intersects_aabb3 } from "../../../geom/3d/aabb/aabb3_intersects_aabb3.js";
|
|
3
|
+
import { BVHQuery } from "./BVHQuery.js";
|
|
4
|
+
|
|
5
|
+
const scratch_aabb = new Float32Array(6);
|
|
6
|
+
|
|
7
|
+
export class BVHQueryIntersectsAABB extends BVHQuery {
|
|
8
|
+
|
|
9
|
+
region = new AABB3();
|
|
10
|
+
|
|
11
|
+
evaluate(node, tree) {
|
|
12
|
+
|
|
13
|
+
tree.node_get_aabb(node, scratch_aabb);
|
|
14
|
+
|
|
15
|
+
return aabb3_intersects_aabb3(
|
|
16
|
+
this.region.x0, this.region.y0, this.region.z0,
|
|
17
|
+
this.region.x1, this.region.y1, this.region.z1,
|
|
18
|
+
...scratch_aabb
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -1,9 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
*
|
|
3
3
|
* @param {number[]|vec3|Float32Array|Float64Array} result
|
|
4
|
-
* @param {number[]|vec3|Float32Array|Float64Array} vA
|
|
5
|
-
* @param {number[]|vec3|Float32Array|Float64Array} vB
|
|
6
|
-
* @param {number[]|vec3|Float32Array|Float64Array} vC
|
|
4
|
+
* @param {number[]|vec3|Float32Array|Float64Array|{0:number, 1:number, 2:number}} vA
|
|
5
|
+
* @param {number[]|vec3|Float32Array|Float64Array|{0:number, 1:number, 2:number}} vB
|
|
6
|
+
* @param {number[]|vec3|Float32Array|Float64Array|{0:number, 1:number, 2:number}} vC
|
|
7
7
|
*/
|
|
8
|
-
export function compute_triangle_normal(result: number[] | vec3 | Float32Array | Float64Array, vA: number[] | vec3 | Float32Array | Float64Array
|
|
8
|
+
export function compute_triangle_normal(result: number[] | vec3 | Float32Array | Float64Array, vA: number[] | vec3 | Float32Array | Float64Array | {
|
|
9
|
+
0: number;
|
|
10
|
+
1: number;
|
|
11
|
+
2: number;
|
|
12
|
+
}, vB: number[] | vec3 | Float32Array | Float64Array | {
|
|
13
|
+
0: number;
|
|
14
|
+
1: number;
|
|
15
|
+
2: number;
|
|
16
|
+
}, vC: number[] | vec3 | Float32Array | Float64Array | {
|
|
17
|
+
0: number;
|
|
18
|
+
1: number;
|
|
19
|
+
2: number;
|
|
20
|
+
}): void;
|
|
9
21
|
//# sourceMappingURL=compute_triangle_normal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compute_triangle_normal.d.ts","sourceRoot":"","sources":["../../../../../src/core/geom/3d/compute_triangle_normal.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,gDALW,MAAM,EAAE,UAAM,YAAY,GAAC,YAAY,MACvC,MAAM,EAAE,UAAM,YAAY,GAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"compute_triangle_normal.d.ts","sourceRoot":"","sources":["../../../../../src/core/geom/3d/compute_triangle_normal.js"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,gDALW,MAAM,EAAE,UAAM,YAAY,GAAC,YAAY,MACvC,MAAM,EAAE,UAAM,YAAY,GAAC,YAAY,GAAC;IAAC,CAAC,EAAC,MAAM,CAAC;IAAC,CAAC,EAAC,MAAM,CAAC;IAAC,CAAC,EAAC,MAAM,CAAA;CAAC,MACtE,MAAM,EAAE,UAAM,YAAY,GAAC,YAAY,GAAC;IAAC,CAAC,EAAC,MAAM,CAAC;IAAC,CAAC,EAAC,MAAM,CAAC;IAAC,CAAC,EAAC,MAAM,CAAA;CAAC,MACtE,MAAM,EAAE,UAAM,YAAY,GAAC,YAAY,GAAC;IAAC,CAAC,EAAC,MAAM,CAAC;IAAC,CAAC,EAAC,MAAM,CAAC;IAAC,CAAC,EAAC,MAAM,CAAA;CAAC,QAiBhF"}
|
|
@@ -3,9 +3,9 @@ import { v3_compute_triangle_normal } from "./v3_compute_triangle_normal.js";
|
|
|
3
3
|
/**
|
|
4
4
|
*
|
|
5
5
|
* @param {number[]|vec3|Float32Array|Float64Array} result
|
|
6
|
-
* @param {number[]|vec3|Float32Array|Float64Array} vA
|
|
7
|
-
* @param {number[]|vec3|Float32Array|Float64Array} vB
|
|
8
|
-
* @param {number[]|vec3|Float32Array|Float64Array} vC
|
|
6
|
+
* @param {number[]|vec3|Float32Array|Float64Array|{0:number, 1:number, 2:number}} vA
|
|
7
|
+
* @param {number[]|vec3|Float32Array|Float64Array|{0:number, 1:number, 2:number}} vB
|
|
8
|
+
* @param {number[]|vec3|Float32Array|Float64Array|{0:number, 1:number, 2:number}} vC
|
|
9
9
|
*/
|
|
10
10
|
export function compute_triangle_normal(result, vA, vB, vC) {
|
|
11
11
|
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Multiplies two 4x4 matrices
|
|
3
3
|
* Adapted from gl-matrix
|
|
4
4
|
*
|
|
5
|
-
* @param {ArrayLike<number>|Float32Array} out the receiving matrix
|
|
6
|
-
* @param {ArrayLike<number>|Float32Array} a the first operand
|
|
7
|
-
* @param {ArrayLike<number>|Float32Array} b the second operand
|
|
5
|
+
* @param {number[]|ArrayLike<number>|Float32Array} out the receiving matrix
|
|
6
|
+
* @param {number[]|ArrayLike<number>|Float32Array} a the first operand
|
|
7
|
+
* @param {number[]|ArrayLike<number>|Float32Array} b the second operand
|
|
8
8
|
*/
|
|
9
|
-
export function m4_multiply(out: ArrayLike<number> | Float32Array, a: ArrayLike<number> | Float32Array, b: ArrayLike<number> | Float32Array): void;
|
|
9
|
+
export function m4_multiply(out: number[] | ArrayLike<number> | Float32Array, a: number[] | ArrayLike<number> | Float32Array, b: number[] | ArrayLike<number> | Float32Array): void;
|
|
10
10
|
//# sourceMappingURL=m4_multiply.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"m4_multiply.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/mat4/m4_multiply.js"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,iCAJW,UAAU,MAAM,CAAC,GAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"m4_multiply.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/mat4/m4_multiply.js"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,iCAJW,MAAM,EAAE,GAAC,UAAU,MAAM,CAAC,GAAC,YAAY,KACvC,MAAM,EAAE,GAAC,UAAU,MAAM,CAAC,GAAC,YAAY,KACvC,MAAM,EAAE,GAAC,UAAU,MAAM,CAAC,GAAC,YAAY,QA4DjD"}
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Multiplies two 4x4 matrices
|
|
3
3
|
* Adapted from gl-matrix
|
|
4
4
|
*
|
|
5
|
-
* @param {ArrayLike<number>|Float32Array} out the receiving matrix
|
|
6
|
-
* @param {ArrayLike<number>|Float32Array} a the first operand
|
|
7
|
-
* @param {ArrayLike<number>|Float32Array} b the second operand
|
|
5
|
+
* @param {number[]|ArrayLike<number>|Float32Array} out the receiving matrix
|
|
6
|
+
* @param {number[]|ArrayLike<number>|Float32Array} a the first operand
|
|
7
|
+
* @param {number[]|ArrayLike<number>|Float32Array} b the second operand
|
|
8
8
|
*/
|
|
9
9
|
export function m4_multiply(out, a, b) {
|
|
10
10
|
const a00 = a[0],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computeTopoMeshVertexDuplicates.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/topology/computeTopoMeshVertexDuplicates.js"],"names":[],"mappings":"AAmCA;;;;;;GAMG;AACH,yFAHW,MAAM,GACJ,gBAAgB,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"computeTopoMeshVertexDuplicates.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/topology/computeTopoMeshVertexDuplicates.js"],"names":[],"mappings":"AAmCA;;;;;;GAMG;AACH,yFAHW,MAAM,GACJ,gBAAgB,YAAY,CAAC,CAmEzC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { mortonEncode_magicbits } from "../morton/mortonEncode_magicbits.js";
|
|
2
|
-
import { epsilonEquals } from "../../../math/epsilonEquals.js";
|
|
3
1
|
import { EPSILON } from "../../../math/EPSILON.js";
|
|
2
|
+
import { epsilonEquals } from "../../../math/epsilonEquals.js";
|
|
3
|
+
import v3_morton_encode from "../morton/v3_morton_encode.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
*
|
|
@@ -69,19 +69,24 @@ export function computeTopoMeshVertexDuplicates(mesh, aabb, tolerance = EPSILON)
|
|
|
69
69
|
for (i = 0; i < n; i++) {
|
|
70
70
|
const vertex_a = vertices[i];
|
|
71
71
|
|
|
72
|
-
const
|
|
72
|
+
const morton_code = v3_morton_encode(
|
|
73
73
|
Math.round((vertex_a.x - x0) * e_x),
|
|
74
74
|
Math.round((vertex_a.y - y0) * e_y),
|
|
75
75
|
Math.round((vertex_a.z - z0) * e_z)
|
|
76
76
|
);
|
|
77
77
|
|
|
78
|
-
let spatial_bucket = spatial_hash[
|
|
78
|
+
let spatial_bucket = spatial_hash[morton_code];
|
|
79
|
+
|
|
79
80
|
if (spatial_bucket === undefined) {
|
|
81
|
+
|
|
80
82
|
spatial_bucket = [];
|
|
81
|
-
spatial_hash[
|
|
83
|
+
spatial_hash[morton_code] = spatial_bucket;
|
|
84
|
+
|
|
82
85
|
} else {
|
|
86
|
+
|
|
83
87
|
// look at others in the bucket
|
|
84
88
|
const bucket_size = spatial_bucket.length;
|
|
89
|
+
|
|
85
90
|
for (j = 0; j < bucket_size; j++) {
|
|
86
91
|
/**
|
|
87
92
|
* @type {TopoVertex}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query_edge_is_boundary.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/topology/query/query_edge_is_boundary.js"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"query_edge_is_boundary.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/topology/query/query_edge_is_boundary.js"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wDAFa,OAAO,CAInB"}
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
* @param {TopoVertex} vertex
|
|
4
4
|
* @returns {boolean}
|
|
5
5
|
*/
|
|
6
|
-
export function
|
|
7
|
-
//# sourceMappingURL=
|
|
6
|
+
export function query_vertex_is_boundary(vertex: TopoVertex): boolean;
|
|
7
|
+
//# sourceMappingURL=query_vertex_is_boundary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query_vertex_is_boundary.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/topology/query/query_vertex_is_boundary.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,8DAFa,OAAO,CAenB"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { query_edge_is_boundary } from "./
|
|
1
|
+
import { query_edge_is_boundary } from "./query_edge_is_boundary.js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Determines whether vertex is part of the topology outline (outer edge)
|
|
5
5
|
* @param {TopoVertex} vertex
|
|
6
6
|
* @returns {boolean}
|
|
7
7
|
*/
|
|
8
|
-
export function
|
|
8
|
+
export function query_vertex_is_boundary(vertex) {
|
|
9
9
|
const edges = vertex.edges;
|
|
10
10
|
|
|
11
11
|
const n = edges.length;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prototypeFloodFill.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/topology/samples/prototypeFloodFill.js"],"names":[],"mappings":""}
|
|
@@ -16,16 +16,16 @@ import { makeGeometryIndexed } from "../../../../../engine/graphics/geometry/buf
|
|
|
16
16
|
import { load_and_set_cubemap_v0 } from "../../../../../engine/graphics/load_and_set_cubemap_v0.js";
|
|
17
17
|
import { make_ray_from_viewport_position } from "../../../../../engine/graphics/make_ray_from_viewport_position.js";
|
|
18
18
|
import { Color } from "../../../../color/Color.js";
|
|
19
|
-
import { AABB3 } from "../../../../geom/3d/aabb/AABB3.js";
|
|
20
19
|
import { seededRandom } from "../../../../math/random/seededRandom.js";
|
|
21
20
|
import { v3_dot } from "../../../vec3/v3_dot.js";
|
|
21
|
+
import { AABB3 } from "../../aabb/AABB3.js";
|
|
22
22
|
import { compute_aabb_from_points } from "../../aabb/compute_aabb_from_points.js";
|
|
23
23
|
import { SurfacePoint3 } from "../../SurfacePoint3.js";
|
|
24
24
|
import { compute_triangle_area_3d } from "../../triangle/compute_triangle_area_3d.js";
|
|
25
25
|
import { expandConnectivityByLocality } from "../expandConnectivityByLocality.js";
|
|
26
26
|
import { TopoMesh } from "../struct/TopoMesh.js";
|
|
27
|
-
import { three_buffer_geometry_to_topo_mesh } from "../three_buffer_geometry_to_topo_mesh.js";
|
|
28
|
-
import { topo_mesh_to_three_buffer_geometry } from "../topo_mesh_to_three_buffer_geometry.js";
|
|
27
|
+
import { three_buffer_geometry_to_topo_mesh } from "../three/three_buffer_geometry_to_topo_mesh.js";
|
|
28
|
+
import { topo_mesh_to_three_buffer_geometry } from "../three/topo_mesh_to_three_buffer_geometry.js";
|
|
29
29
|
import { mesh_flood_fill } from "../util/mesh_flood_fill.js";
|
|
30
30
|
|
|
31
31
|
const harness = new EngineHarness();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EdgeCollapseCandidate.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/topology/simplify/EdgeCollapseCandidate.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EdgeCollapseCandidate.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/topology/simplify/EdgeCollapseCandidate.js"],"names":[],"mappings":"AAIA;IAEQ;;;OAGG;IACH,MAFU,WAAS,IAAI,CAEP;IAChB;;;OAGG;IACH,eAFU,aAAW,IAAI,CAEA;IACzB;;;OAGG;IACH,eAFU,aAAW,IAAI,CAEA;IAEzB;;;OAGG;IACH,MAFU,MAAM,CAEH;IAEb;;;OAGG;IACH,SAFU,MAAM,CAEA;IAEhB;;;;OAIG;IACH,0BAA8B;IAGlC;;;OAGG;IACH,oBAFa,OAAO,CAInB;IAGD,oBAMC;IAED;;;;OAIG;IACH,4CAFW,IAAI,MAAM,aAAa,QA2BjC;IAED;;;;;OAKG;IACH,0BAJW,IAAI,MAAM,aAAa,uBACvB,IAAI,MAAM,CAAC,GACT,OAAO,CAkDnB;CACJ"}
|
|
@@ -1,36 +1,6 @@
|
|
|
1
|
+
import { query_vertex_is_boundary } from "../query/query_vertex_is_boundary.js";
|
|
1
2
|
import { collapseEdge, partialEdgeCollapse } from "./collapseEdge.js";
|
|
2
3
|
import { computeEdgeCollapseCost } from "./computeEdgeCollapseCost.js";
|
|
3
|
-
import { isVertexConnectedToOutline } from "../isVertexConnectedToOutline.js";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
*
|
|
7
|
-
* @param {TopoVertex} v0
|
|
8
|
-
* @param {TopoVertex} v1
|
|
9
|
-
* @param {TopoEdge} edge
|
|
10
|
-
* @returns {number}
|
|
11
|
-
*/
|
|
12
|
-
function validated_cost_compute(v0, v1, edge) {
|
|
13
|
-
if (v0.index === 101 && v1.index === 0) {
|
|
14
|
-
debugger;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const tv0 = v0.clone();
|
|
18
|
-
const tv1 = v1.clone();
|
|
19
|
-
const te = edge.clone();
|
|
20
|
-
|
|
21
|
-
const t_v0_faces = v0.faces.map(f => f.clone());
|
|
22
|
-
const t_v1_faces = v1.faces.map(f => f.clone());
|
|
23
|
-
|
|
24
|
-
const a = computeEdgeCollapseCost(v0, v1, edge);
|
|
25
|
-
const b = computeEdgeCollapseCost(v0, v1, edge);
|
|
26
|
-
const c = computeEdgeCollapseCost(v0, v1, edge);
|
|
27
|
-
|
|
28
|
-
if (a !== b || b !== c) {
|
|
29
|
-
debugger;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return a;
|
|
33
|
-
}
|
|
34
4
|
|
|
35
5
|
export class EdgeCollapseCandidate {
|
|
36
6
|
constructor() {
|
|
@@ -105,7 +75,7 @@ export class EdgeCollapseCandidate {
|
|
|
105
75
|
partialEdgeCollapse(mesh, this.edge, v_from, v_to);
|
|
106
76
|
} else {
|
|
107
77
|
|
|
108
|
-
if (
|
|
78
|
+
if (query_vertex_is_boundary(v_from)) {
|
|
109
79
|
this.__border_collapse = true;
|
|
110
80
|
}
|
|
111
81
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { compute_edge_collapse_cost_quadratic } from "./quadratic/compute_edge_collapse_cost_quadratic.js";
|
|
1
|
+
import { query_vertex_is_boundary } from "../query/query_vertex_is_boundary.js";
|
|
3
2
|
import { compute_face_normal_change_dot_product } from "./compute_face_normal_change_dot_product.js";
|
|
3
|
+
import { compute_edge_collapse_cost_quadratic } from "./quadratic/compute_edge_collapse_cost_quadratic.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Value to be used when collapse would flip normal of one or more adjacent faces
|
|
@@ -64,7 +64,7 @@ export function computeEdgeCollapseCost(victim, target, victim_edge, vertex_quad
|
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
|
|
67
|
-
if (
|
|
67
|
+
if (query_vertex_is_boundary(victim)) {
|
|
68
68
|
// prefer not to erase border vertices to preserve shape
|
|
69
69
|
curvature += 1;
|
|
70
70
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decimate_edge_collapse_snap.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/topology/simplify/decimate_edge_collapse_snap.js"],"names":[],"mappings":"AAgDA;;;;GAIG;AACH,
|
|
1
|
+
{"version":3,"file":"decimate_edge_collapse_snap.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/topology/simplify/decimate_edge_collapse_snap.js"],"names":[],"mappings":"AAgDA;;;;GAIG;AACH,kFASC;AAED;;;;;GAKG;AACH,sFAHW,IAAI,MAAM,CAAC,GACT,aAAW,SAAS,CA0ChC;AAqBD;;;;;GAKG;AACH,uEAHW,IAAI,MAAM,aAAY,uBACtB,IAAI,MAAM,CAAC,UAsBrB;AAsBD;;;;;;;;;GASG;AACH,4GALW,IAAI,MAAM,aAAY,yCAEtB,IAAI,MAAM,CAAC,GACT,OAAO,CAmFnB"}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { query_edge_other_vertex } from "../query/query_edge_other_vertex.js";
|
|
1
|
+
import { vec3 } from "gl-matrix";
|
|
3
2
|
import { array_get_index_in_range } from "../../../../collection/array/array_get_index_in_range.js";
|
|
4
|
-
import {
|
|
5
|
-
import { tm_vertex_compute_normal } from "../tm_vertex_compute_normal.js";
|
|
3
|
+
import { EPSILON } from "../../../../math/EPSILON.js";
|
|
6
4
|
import { min2 } from "../../../../math/min2.js";
|
|
7
|
-
import { vec3 } from "gl-matrix";
|
|
8
|
-
import { tm_edge_collapse_is_degenerate_flip } from "./tm_edge_collapse_is_degenerate_flip.js";
|
|
9
5
|
import { query_edge_is_boundary } from "../query/query_edge_is_boundary.js";
|
|
6
|
+
import { query_edge_other_vertex } from "../query/query_edge_other_vertex.js";
|
|
10
7
|
import { tm_edge_kill } from "../tm_edge_kill.js";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
8
|
+
import { tm_vertex_compute_normal } from "../tm_vertex_compute_normal.js";
|
|
9
|
+
import { tm_edge_collapse } from "./edge_collapse_quadratic.js";
|
|
10
|
+
import { compute_edge_collapse_cost_quadratic } from "./quadratic/compute_edge_collapse_cost_quadratic.js";
|
|
11
|
+
import { tm_edge_collapse_is_degenerate_flip } from "./tm_edge_collapse_is_degenerate_flip.js";
|
|
13
12
|
|
|
14
13
|
/**
|
|
15
14
|
*
|
|
@@ -36,6 +35,7 @@ function edge_collapse_vertex_removal_cost(v) {
|
|
|
36
35
|
const edge = edges[i];
|
|
37
36
|
|
|
38
37
|
if (query_edge_is_boundary(edge)) {
|
|
38
|
+
// prefer to preserve boundary
|
|
39
39
|
result += 100;
|
|
40
40
|
} else {
|
|
41
41
|
// prefer not to remove vertices that have lots of faces attached. This is to prevent cases where more and more faces are aggregated around a single vertex
|
|
@@ -55,12 +55,6 @@ export function pick_lowest_cost_edge_collapse_vertex(edge) {
|
|
|
55
55
|
const v0 = edge.v0;
|
|
56
56
|
const v1 = edge.v1;
|
|
57
57
|
|
|
58
|
-
if (squirrel3(v0.index) > squirrel3(v1.index)) {
|
|
59
|
-
return v0;
|
|
60
|
-
} else {
|
|
61
|
-
return v1;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
58
|
if (edge_collapse_vertex_removal_cost(v0) > edge_collapse_vertex_removal_cost(v1)) {
|
|
65
59
|
return v0;
|
|
66
60
|
} else {
|
|
@@ -154,7 +148,7 @@ export function compute_edge_collapse_cost(edge, quadratics, restricted_vertices
|
|
|
154
148
|
|
|
155
149
|
let cost = compute_edge_collapse_cost_quadratic(v0, v1, expected_target, quadratics);
|
|
156
150
|
|
|
157
|
-
// fallback to topology
|
|
151
|
+
// fallback to topology if quadratics are noise
|
|
158
152
|
if (cost < 1e-5) {
|
|
159
153
|
// subtracting cost to introduce minor possible variation in cost, to produce stable order
|
|
160
154
|
cost = build_edge_cost_squared_topology(edge) - cost;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edge_collapse_quadratic.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/topology/simplify/edge_collapse_quadratic.js"],"names":[],"mappings":"AAaA;;;;;;GAMG;AACH,qFAFa,OAAO,
|
|
1
|
+
{"version":3,"file":"edge_collapse_quadratic.d.ts","sourceRoot":"","sources":["../../../../../../../src/core/geom/3d/topology/simplify/edge_collapse_quadratic.js"],"names":[],"mappings":"AAaA;;;;;;GAMG;AACH,qFAFa,OAAO,CAoDnB"}
|