@threepipe/plugin-gltf-transform 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/GLTFDracoExportPlugin.d.ts +2 -0
- package/dist/GLTFDracoExportPlugin.d.ts.map +1 -1
- package/dist/GLTFDracoExporter.d.ts +13 -4
- package/dist/GLTFDracoExporter.d.ts.map +1 -1
- package/dist/GLTFSpecGlossinessConverterPlugin.d.ts +43 -0
- package/dist/GLTFSpecGlossinessConverterPlugin.d.ts.map +1 -0
- package/dist/dependencies.txt +288 -8
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10378 -3823
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +10380 -3825
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -2
- package/src/GLTFDracoExportPlugin.ts +12 -5
- package/src/GLTFDracoExporter.ts +45 -38
- package/src/GLTFSpecGlossinessConverterPlugin.ts +126 -0
- package/src/index.ts +2 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../node_modules/property-graph/dist/property-graph.modern.js","../node_modules/@gltf-transform/core/dist/core.modern.js","../node_modules/ktx-parse/dist/ktx-parse.modern.js","../node_modules/@gltf-transform/extensions/dist/extensions.modern.js","../src/GLTFDracoExporter.ts","../src/GLTFDracoExportPlugin.ts"],"sourcesContent":["class EventDispatcher {\n constructor() {\n this._listeners = {};\n }\n\n addEventListener(type, listener) {\n const listeners = this._listeners;\n\n if (listeners[type] === undefined) {\n listeners[type] = [];\n }\n\n if (listeners[type].indexOf(listener) === -1) {\n listeners[type].push(listener);\n }\n\n return this;\n }\n\n removeEventListener(type, listener) {\n if (this._listeners === undefined) return this;\n const listeners = this._listeners;\n const listenerArray = listeners[type];\n\n if (listenerArray !== undefined) {\n const index = listenerArray.indexOf(listener);\n\n if (index !== -1) {\n listenerArray.splice(index, 1);\n }\n }\n\n return this;\n }\n\n dispatchEvent(event) {\n if (this._listeners === undefined) return this;\n const listeners = this._listeners;\n const listenerArray = listeners[event.type];\n\n if (listenerArray !== undefined) {\n // Make a copy, in case listeners are removed while iterating.\n const array = listenerArray.slice(0);\n\n for (let i = 0, l = array.length; i < l; i++) {\n array[i].call(this, event);\n }\n }\n\n return this;\n }\n\n dispose() {\n for (const key in this._listeners) {\n delete this._listeners[key];\n }\n }\n\n}\n\n/**\n * Represents a connection between two {@link GraphNode} resources in a {@link Graph}.\n *\n * The left node is considered the owner, and the right node the resource. The\n * owner is responsible for being able find and remove a reference to a resource, given\n * that link. The resource does not hold a reference to the link or to the owner,\n * although that reverse lookup can be done on the graph.\n */\n\nclass GraphEdge extends EventDispatcher {\n constructor(_name, _parent, _child, _attributes = {}) {\n super();\n this._name = void 0;\n this._parent = void 0;\n this._child = void 0;\n this._attributes = void 0;\n this._disposed = false;\n this._name = _name;\n this._parent = _parent;\n this._child = _child;\n this._attributes = _attributes;\n\n if (!_parent.isOnGraph(_child)) {\n throw new Error('Cannot connect disconnected graphs.');\n }\n }\n /** Name. */\n\n\n getName() {\n return this._name;\n }\n /** Owner node. */\n\n\n getParent() {\n return this._parent;\n }\n /** Resource node. */\n\n\n getChild() {\n return this._child;\n }\n /**\n * Sets the child node.\n *\n * @internal Only {@link Graph} implementations may safely call this method directly. Use\n * \t{@link Property.swap} or {@link Graph.swapChild} instead.\n */\n\n\n setChild(child) {\n this._child = child;\n return this;\n }\n /** Attributes of the graph node relationship. */\n\n\n getAttributes() {\n return this._attributes;\n }\n /** Destroys a (currently intact) edge, updating both the graph and the owner. */\n\n\n dispose() {\n if (this._disposed) return;\n this._disposed = true;\n this.dispatchEvent({\n type: 'dispose',\n target: this\n });\n super.dispose();\n }\n /** Whether this link has been destroyed. */\n\n\n isDisposed() {\n return this._disposed;\n }\n\n}\n\n/**\n * A graph manages a network of {@link GraphNode} nodes, connected\n * by {@link @Link} edges.\n */\n\nclass Graph extends EventDispatcher {\n constructor(...args) {\n super(...args);\n this._emptySet = new Set();\n this._edges = new Set();\n this._parentEdges = new Map();\n this._childEdges = new Map();\n }\n\n /** Returns a list of all parent->child edges on this graph. */\n listEdges() {\n return Array.from(this._edges);\n }\n /** Returns a list of all edges on the graph having the given node as their child. */\n\n\n listParentEdges(node) {\n return Array.from(this._childEdges.get(node) || this._emptySet);\n }\n /** Returns a list of parent nodes for the given child node. */\n\n\n listParents(node) {\n return this.listParentEdges(node).map(edge => edge.getParent());\n }\n /** Returns a list of all edges on the graph having the given node as their parent. */\n\n\n listChildEdges(node) {\n return Array.from(this._parentEdges.get(node) || this._emptySet);\n }\n /** Returns a list of child nodes for the given parent node. */\n\n\n listChildren(node) {\n return this.listChildEdges(node).map(edge => edge.getChild());\n }\n\n disconnectParents(node, filter) {\n let edges = this.listParentEdges(node);\n\n if (filter) {\n edges = edges.filter(edge => filter(edge.getParent()));\n }\n\n edges.forEach(edge => edge.dispose());\n return this;\n }\n /**\n * Creates a {@link GraphEdge} connecting two {@link GraphNode} instances. Edge is returned\n * for the caller to store.\n * @param a Owner\n * @param b Resource\n */\n\n\n createEdge(name, a, b, attributes) {\n return this._registerEdge(new GraphEdge(name, a, b, attributes));\n }\n /**********************************************************************************************\n * Internal.\n */\n\n /** @hidden */\n\n\n _registerEdge(edge) {\n this._edges.add(edge);\n\n const parent = edge.getParent();\n if (!this._parentEdges.has(parent)) this._parentEdges.set(parent, new Set());\n\n this._parentEdges.get(parent).add(edge);\n\n const child = edge.getChild();\n if (!this._childEdges.has(child)) this._childEdges.set(child, new Set());\n\n this._childEdges.get(child).add(edge);\n\n edge.addEventListener('dispose', () => this._removeEdge(edge));\n return edge;\n }\n /**\n * Removes the {@link GraphEdge} from the {@link Graph}. This method should only\n * be invoked by the onDispose() listener created in {@link _registerEdge()}. The\n * public method of removing an edge is {@link GraphEdge.dispose}.\n */\n\n\n _removeEdge(edge) {\n this._edges.delete(edge);\n\n this._parentEdges.get(edge.getParent()).delete(edge);\n\n this._childEdges.get(edge.getChild()).delete(edge);\n\n return this;\n }\n\n}\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nfunction isRef(value) {\n return value instanceof GraphEdge;\n}\nfunction isRefList(value) {\n return Array.isArray(value) && value[0] instanceof GraphEdge;\n}\nfunction isRefMap(value) {\n return !!(isPlainObject(value) && getFirstValue(value) instanceof GraphEdge);\n}\n\nfunction getFirstValue(value) {\n for (const key in value) {\n return value[key];\n }\n}\n\nfunction isPlainObject(value) {\n return Boolean(value) && Object.getPrototypeOf(value) === Object.prototype;\n}\n\nconst $attributes = Symbol('attributes');\nconst $immutableKeys = Symbol('immutableKeys');\n/**\n * Represents a node in a {@link Graph}.\n */\n\nclass GraphNode extends EventDispatcher {\n /**\n * Internal graph used to search and maintain references.\n * @hidden\n */\n\n /**\n * Attributes (literal values and GraphNode references) associated with this instance. For each\n * GraphNode reference, the attributes stores a {@link GraphEdge}. List and Map references are\n * stored as arrays and dictionaries of edges.\n * @internal\n */\n\n /**\n * Attributes included with `getDefaultAttributes` are considered immutable, and cannot be\n * modifed by `.setRef()`, `.copy()`, or other GraphNode methods. Both the edges and the\n * properties will be disposed with the parent GraphNode.\n *\n * Currently, only single-edge references (getRef/setRef) are supported as immutables.\n *\n * @internal\n */\n constructor(graph) {\n super();\n this._disposed = false;\n this.graph = void 0;\n this[$attributes] = void 0;\n this[$immutableKeys] = void 0;\n this.graph = graph;\n this[$immutableKeys] = new Set();\n this[$attributes] = this._createAttributes();\n }\n /**\n * Returns default attributes for the graph node. Subclasses having any attributes (either\n * literal values or references to other graph nodes) must override this method. Literal\n * attributes should be given their default values, if any. References should generally be\n * initialized as empty (Ref → null, RefList → [], RefMap → {}) and then modified by setters.\n *\n * Any single-edge references (setRef) returned by this method will be considered immutable,\n * to be owned by and disposed with the parent node. Multi-edge references (addRef, removeRef,\n * setRefMap) cannot be returned as default attributes.\n */\n\n\n getDefaults() {\n return {};\n }\n /**\n * Constructs and returns an object used to store a graph nodes attributes. Compared to the\n * default Attributes interface, this has two distinctions:\n *\n * 1. Slots for GraphNode<T> objects are replaced with slots for GraphEdge<this, GraphNode<T>>\n * 2. GraphNode<T> objects provided as defaults are considered immutable\n *\n * @internal\n */\n\n\n _createAttributes() {\n const defaultAttributes = this.getDefaults();\n const attributes = {};\n\n for (const key in defaultAttributes) {\n const value = defaultAttributes[key];\n\n if (value instanceof GraphNode) {\n const ref = this.graph.createEdge(key, this, value);\n ref.addEventListener('dispose', () => value.dispose());\n this[$immutableKeys].add(key);\n attributes[key] = ref;\n } else {\n attributes[key] = value;\n }\n }\n\n return attributes;\n }\n /** @internal Returns true if two nodes are on the same {@link Graph}. */\n\n\n isOnGraph(other) {\n return this.graph === other.graph;\n }\n /** Returns true if the node has been permanently removed from the graph. */\n\n\n isDisposed() {\n return this._disposed;\n }\n /**\n * Removes both inbound references to and outbound references from this object. At the end\n * of the process the object holds no references, and nothing holds references to it. A\n * disposed object is not reusable.\n */\n\n\n dispose() {\n if (this._disposed) return;\n this.graph.listChildEdges(this).forEach(edge => edge.dispose());\n this.graph.disconnectParents(this);\n this._disposed = true;\n this.dispatchEvent({\n type: 'dispose'\n });\n }\n /**\n * Removes all inbound references to this object. At the end of the process the object is\n * considered 'detached': it may hold references to child resources, but nothing holds\n * references to it. A detached object may be re-attached.\n */\n\n\n detach() {\n this.graph.disconnectParents(this);\n return this;\n }\n /**\n * Transfers this object's references from the old node to the new one. The old node is fully\n * detached from this parent at the end of the process.\n *\n * @hidden\n */\n\n\n swap(old, replacement) {\n for (const attribute in this[$attributes]) {\n const value = this[$attributes][attribute];\n\n if (isRef(value)) {\n const ref = value;\n\n if (ref.getChild() === old) {\n this.setRef(attribute, replacement, ref.getAttributes());\n }\n } else if (isRefList(value)) {\n const refs = value;\n const ref = refs.find(ref => ref.getChild() === old);\n\n if (ref) {\n const refAttributes = ref.getAttributes();\n this.removeRef(attribute, old).addRef(attribute, replacement, refAttributes);\n }\n } else if (isRefMap(value)) {\n const refMap = value;\n\n for (const key in refMap) {\n const ref = refMap[key];\n\n if (ref.getChild() === old) {\n this.setRefMap(attribute, key, replacement, ref.getAttributes());\n }\n }\n }\n }\n\n return this;\n }\n /**********************************************************************************************\n * Literal attributes.\n */\n\n /** @hidden */\n\n\n get(attribute) {\n return this[$attributes][attribute];\n }\n /** @hidden */\n\n\n set(attribute, value) {\n this[$attributes][attribute] = value;\n return this.dispatchEvent({\n type: 'change',\n attribute\n });\n }\n /**********************************************************************************************\n * Ref: 1:1 graph node references.\n */\n\n /** @hidden */\n\n\n getRef(attribute) {\n const ref = this[$attributes][attribute];\n return ref ? ref.getChild() : null;\n }\n /** @hidden */\n\n\n setRef(attribute, value, attributes) {\n if (this[$immutableKeys].has(attribute)) {\n throw new Error(`Cannot overwrite immutable attribute, \"${attribute}\".`);\n }\n\n const prevRef = this[$attributes][attribute];\n if (prevRef) prevRef.dispose(); // TODO(cleanup): Possible duplicate event.\n\n if (!value) return this;\n const ref = this.graph.createEdge(attribute, this, value, attributes);\n ref.addEventListener('dispose', () => {\n delete this[$attributes][attribute];\n this.dispatchEvent({\n type: 'change',\n attribute\n });\n });\n this[$attributes][attribute] = ref;\n return this.dispatchEvent({\n type: 'change',\n attribute\n });\n }\n /**********************************************************************************************\n * RefList: 1:many graph node references.\n */\n\n /** @hidden */\n\n\n listRefs(attribute) {\n const refs = this[$attributes][attribute];\n return refs.map(ref => ref.getChild());\n }\n /** @hidden */\n\n\n addRef(attribute, value, attributes) {\n const ref = this.graph.createEdge(attribute, this, value, attributes);\n const refs = this[$attributes][attribute];\n refs.push(ref);\n ref.addEventListener('dispose', () => {\n let index;\n\n while ((index = refs.indexOf(ref)) !== -1) {\n refs.splice(index, 1);\n }\n\n this.dispatchEvent({\n type: 'change',\n attribute\n });\n });\n return this.dispatchEvent({\n type: 'change',\n attribute\n });\n }\n /** @hidden */\n\n\n removeRef(attribute, value) {\n const refs = this[$attributes][attribute];\n const pruned = refs.filter(ref => ref.getChild() === value);\n pruned.forEach(ref => ref.dispose()); // TODO(cleanup): Possible duplicate event.\n\n return this;\n }\n /**********************************************************************************************\n * RefMap: Named 1:many (map) graph node references.\n */\n\n /** @hidden */\n\n\n listRefMapKeys(key) {\n return Object.keys(this[$attributes][key]);\n }\n /** @hidden */\n\n\n listRefMapValues(key) {\n return Object.values(this[$attributes][key]).map(ref => ref.getChild());\n }\n /** @hidden */\n\n\n getRefMap(attribute, key) {\n const refMap = this[$attributes][attribute];\n return refMap[key] ? refMap[key].getChild() : null;\n }\n /** @hidden */\n\n\n setRefMap(attribute, key, value, metadata) {\n const refMap = this[$attributes][attribute];\n const prevRef = refMap[key];\n if (prevRef) prevRef.dispose(); // TODO(cleanup): Possible duplicate event.\n\n if (!value) return this;\n metadata = Object.assign(metadata || {}, {\n key: key\n });\n const ref = this.graph.createEdge(attribute, this, value, _extends({}, metadata, {\n key\n }));\n ref.addEventListener('dispose', () => {\n delete refMap[key];\n this.dispatchEvent({\n type: 'change',\n attribute,\n key\n });\n });\n refMap[key] = ref;\n return this.dispatchEvent({\n type: 'change',\n attribute,\n key\n });\n }\n /**********************************************************************************************\n * Events.\n */\n\n /**\n * Dispatches an event on the GraphNode, and on the associated\n * Graph. Event types on the graph are prefixed, `\"node:[type]\"`.\n */\n\n\n dispatchEvent(event) {\n super.dispatchEvent(_extends({}, event, {\n target: this\n }));\n this.graph.dispatchEvent(_extends({}, event, {\n target: this,\n type: `node:${event.type}`\n }));\n return this;\n }\n\n}\n\nexport { $attributes, $immutableKeys, EventDispatcher, Graph, GraphEdge, GraphNode, isRef, isRefList, isRefMap };\n//# sourceMappingURL=property-graph.modern.js.map\n","import{GraphNode as t,$attributes as e,GraphEdge as r,$immutableKeys as s,isRefList as n,isRefMap as i,isRef as o,Graph as a}from\"property-graph\";export{Graph,GraphEdge}from\"property-graph\";const u=\"v3.2.1\",c=\"@glb.bin\";var h,f,l,d,g;!function(t){t.ACCESSOR=\"Accessor\",t.ANIMATION=\"Animation\",t.ANIMATION_CHANNEL=\"AnimationChannel\",t.ANIMATION_SAMPLER=\"AnimationSampler\",t.BUFFER=\"Buffer\",t.CAMERA=\"Camera\",t.MATERIAL=\"Material\",t.MESH=\"Mesh\",t.PRIMITIVE=\"Primitive\",t.PRIMITIVE_TARGET=\"PrimitiveTarget\",t.NODE=\"Node\",t.ROOT=\"Root\",t.SCENE=\"Scene\",t.SKIN=\"Skin\",t.TEXTURE=\"Texture\",t.TEXTURE_INFO=\"TextureInfo\"}(h||(h={})),function(t){t.INTERLEAVED=\"interleaved\",t.SEPARATE=\"separate\"}(f||(f={})),function(t){t.ARRAY_BUFFER=\"ARRAY_BUFFER\",t.ELEMENT_ARRAY_BUFFER=\"ELEMENT_ARRAY_BUFFER\",t.INVERSE_BIND_MATRICES=\"INVERSE_BIND_MATRICES\",t.OTHER=\"OTHER\",t.SPARSE=\"SPARSE\"}(l||(l={})),function(t){t[t.R=4096]=\"R\",t[t.G=256]=\"G\",t[t.B=16]=\"B\",t[t.A=1]=\"A\"}(d||(d={})),function(t){t.GLTF=\"GLTF\",t.GLB=\"GLB\"}(g||(g={}));const p={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array};var m,w=\"undefined\"!=typeof Float32Array?Float32Array:Array;function y(t){return Math.hypot(t[0],t[1],t[2])}function v(t,e,r){var s=e[0],n=e[1],i=e[2],o=r[3]*s+r[7]*n+r[11]*i+r[15];return t[0]=(r[0]*s+r[4]*n+r[8]*i+r[12])/(o=o||1),t[1]=(r[1]*s+r[5]*n+r[9]*i+r[13])/o,t[2]=(r[2]*s+r[6]*n+r[10]*i+r[14])/o,t}function T(t){const e={min:[Infinity,Infinity,Infinity],max:[-Infinity,-Infinity,-Infinity]},r=t.propertyType===h.NODE?[t]:t.listChildren();for(const t of r)t.traverse(t=>{const r=t.getMesh();if(!r)return;const s=x(r,t.getWorldMatrix());A(s.min,e),A(s.max,e)});return e}Math.hypot||(Math.hypot=function(){for(var t=0,e=arguments.length;e--;)t+=arguments[e]*arguments[e];return Math.sqrt(t)}),m=new w(3),w!=Float32Array&&(m[0]=0,m[1]=0,m[2]=0);const b=T;function x(t,e){const r={min:[Infinity,Infinity,Infinity],max:[-Infinity,-Infinity,-Infinity]};for(const s of t.listPrimitives()){const t=s.getAttribute(\"POSITION\");if(!t)continue;let n=[0,0,0],i=[0,0,0];for(let s=0;s<t.getCount();s++)n=t.getElement(s,n),i=v(i,n,e),A(i,r)}return r}function A(t,e){for(let r=0;r<3;r++)e.min[r]=Math.min(t[r],e.min[r]),e.max[r]=Math.max(t[r],e.max[r])}class E{static createBufferFromDataURI(t){if(\"undefined\"==typeof Buffer){const e=atob(t.split(\",\")[1]),r=new Uint8Array(e.length);for(let t=0;t<e.length;t++)r[t]=e.charCodeAt(t);return r}{const e=t.split(\",\")[1],r=t.indexOf(\"base64\")>=0;return Buffer.from(e,r?\"base64\":\"utf8\")}}static encodeText(t){return\"undefined\"!=typeof TextEncoder?(new TextEncoder).encode(t):Buffer.from(t)}static decodeText(t){return\"undefined\"!=typeof TextDecoder?(new TextDecoder).decode(t):Buffer.from(t).toString(\"utf8\")}static concat(t){let e=0;for(const r of t)e+=r.byteLength;const r=new Uint8Array(e);let s=0;for(const e of t)r.set(e,s),s+=e.byteLength;return r}static pad(t,e=0){const r=this.padNumber(t.byteLength);if(r===t.byteLength)return t;const s=new Uint8Array(r);if(s.set(t),0!==e)for(let n=t.byteLength;n<r;n++)s[n]=e;return s}static padNumber(t){return 4*Math.ceil(t/4)}static equals(t,e){if(t===e)return!0;if(t.byteLength!==e.byteLength)return!1;let r=t.byteLength;for(;r--;)if(t[r]!==e[r])return!1;return!0}static toView(t,e=0,r=Infinity){return new Uint8Array(t.buffer,t.byteOffset+e,Math.min(t.byteLength,r))}static assertView(t){if(t&&!ArrayBuffer.isView(t))throw new Error(`Method requires Uint8Array parameter; received \"${typeof t}\".`);return t}}class M{static hexToFactor(t,e){t=Math.floor(t);const r=e;return r[0]=(t>>16&255)/255,r[1]=(t>>8&255)/255,r[2]=(255&t)/255,this.convertSRGBToLinear(e,e)}static factorToHex(t){const e=[...t],[r,s,n]=this.convertLinearToSRGB(t,e);return 255*r<<16^255*s<<8^255*n<<0}static convertSRGBToLinear(t,e){const r=t,s=e;for(let t=0;t<3;t++)s[t]=r[t]<.04045?.0773993808*r[t]:Math.pow(.9478672986*r[t]+.0521327014,2.4);return e}static convertLinearToSRGB(t,e){const r=t,s=e;for(let t=0;t<3;t++)s[t]=r[t]<.0031308?12.92*r[t]:1.055*Math.pow(r[t],.41666)-.055;return e}}class S{match(t){return t.length>=8&&137===t[0]&&80===t[1]&&78===t[2]&&71===t[3]&&13===t[4]&&10===t[5]&&26===t[6]&&10===t[7]}getSize(t){const e=new DataView(t.buffer,t.byteOffset);return E.decodeText(t.slice(12,16))===S.PNG_FRIED_CHUNK_NAME?[e.getUint32(32,!1),e.getUint32(36,!1)]:[e.getUint32(16,!1),e.getUint32(20,!1)]}getChannels(t){return 4}}S.PNG_FRIED_CHUNK_NAME=\"CgBI\";class I{static registerFormat(t,e){this.impls[t]=e}static getMimeType(t){for(const e in this.impls)if(this.impls[e].match(t))return e;return null}static getSize(t,e){return this.impls[e]?this.impls[e].getSize(t):null}static getChannels(t,e){return this.impls[e]?this.impls[e].getChannels(t):null}static getVRAMByteLength(t,e){if(!this.impls[e])return null;if(this.impls[e].getVRAMByteLength)return this.impls[e].getVRAMByteLength(t);let r=0;const s=this.getSize(t,e);if(!s)return null;for(;s[0]>1||s[1]>1;)r+=s[0]*s[1]*4,s[0]=Math.max(Math.floor(s[0]/2),1),s[1]=Math.max(Math.floor(s[1]/2),1);return r+=4,r}static mimeTypeToExtension(t){return\"image/jpeg\"===t?\"jpg\":t.split(\"/\").pop()}static extensionToMimeType(t){return\"jpg\"===t?\"image/jpeg\":t?`image/${t}`:\"\"}}function R(t,e){if(e>t.byteLength)throw new TypeError(\"Corrupt JPG, exceeded buffer limits\");if(255!==t.getUint8(e))throw new TypeError(\"Invalid JPG, marker table corrupted\");return t}I.impls={\"image/jpeg\":new class{match(t){return t.length>=3&&255===t[0]&&216===t[1]&&255===t[2]}getSize(t){let e,r,s=new DataView(t.buffer,t.byteOffset+4);for(;s.byteLength;){if(e=s.getUint16(0,!1),R(s,e),r=s.getUint8(e+1),192===r||193===r||194===r)return[s.getUint16(e+7,!1),s.getUint16(e+5,!1)];s=new DataView(t.buffer,s.byteOffset+e+2)}throw new TypeError(\"Invalid JPG, no size found\")}getChannels(t){return 3}},\"image/png\":new S};class N{static basename(t){const e=t.split(/[\\\\/]/).pop();return e.substring(0,e.lastIndexOf(\".\"))}static extension(t){if(t.startsWith(\"data:image/\")){const e=t.match(/data:(image\\/\\w+)/)[1];return I.mimeTypeToExtension(e)}return t.startsWith(\"data:model/gltf+json\")?\"gltf\":t.startsWith(\"data:model/gltf-binary\")?\"glb\":t.startsWith(\"data:application/\")?\"bin\":t.split(/[\\\\/]/).pop().split(/[.]/).pop()}}function O(t){return\"[object Object]\"===Object.prototype.toString.call(t)}function C(t){if(!1===O(t))return!1;const e=t.constructor;if(void 0===e)return!0;const r=e.prototype;return!1!==O(r)&&!1!==Object.prototype.hasOwnProperty.call(r,\"isPrototypeOf\")}var F;!function(t){t[t.SILENT=4]=\"SILENT\",t[t.ERROR=3]=\"ERROR\",t[t.WARN=2]=\"WARN\",t[t.INFO=1]=\"INFO\",t[t.DEBUG=0]=\"DEBUG\"}(F||(F={}));class U{constructor(t){this.verbosity=void 0,this.verbosity=t}debug(t){this.verbosity<=U.Verbosity.DEBUG&&console.debug(t)}info(t){this.verbosity<=U.Verbosity.INFO&&console.info(t)}warn(t){this.verbosity<=U.Verbosity.WARN&&console.warn(t)}error(t){this.verbosity<=U.Verbosity.ERROR&&console.error(t)}}function B(t,e,r){var s=e[0],n=e[1],i=e[2],o=e[3],a=e[4],u=e[5],c=e[6],h=e[7],f=e[8],l=e[9],d=e[10],g=e[11],p=e[12],m=e[13],w=e[14],y=e[15],v=r[0],T=r[1],b=r[2],x=r[3];return t[0]=v*s+T*a+b*f+x*p,t[1]=v*n+T*u+b*l+x*m,t[2]=v*i+T*c+b*d+x*w,t[3]=v*o+T*h+b*g+x*y,t[4]=(v=r[4])*s+(T=r[5])*a+(b=r[6])*f+(x=r[7])*p,t[5]=v*n+T*u+b*l+x*m,t[6]=v*i+T*c+b*d+x*w,t[7]=v*o+T*h+b*g+x*y,t[8]=(v=r[8])*s+(T=r[9])*a+(b=r[10])*f+(x=r[11])*p,t[9]=v*n+T*u+b*l+x*m,t[10]=v*i+T*c+b*d+x*w,t[11]=v*o+T*h+b*g+x*y,t[12]=(v=r[12])*s+(T=r[13])*a+(b=r[14])*f+(x=r[15])*p,t[13]=v*n+T*u+b*l+x*m,t[14]=v*i+T*c+b*d+x*w,t[15]=v*o+T*h+b*g+x*y,t}U.Verbosity=F,U.DEFAULT_INSTANCE=new U(U.Verbosity.INFO);class P{static identity(t){return t}static eq(t,e,r=1e-5){if(t.length!==e.length)return!1;for(let s=0;s<t.length;s++)if(Math.abs(t[s]-e[s])>r)return!1;return!0}static decodeNormalizedInt(t,e){switch(e){case 5126:return t;case 5123:return t/65535;case 5121:return t/255;case 5122:return Math.max(t/32767,-1);case 5120:return Math.max(t/127,-1);default:throw new Error(\"Invalid component type.\")}}static denormalize(t,e){return P.decodeNormalizedInt(t,e)}static encodeNormalizedInt(t,e){switch(e){case 5126:return t;case 5123:return Math.round(65535*t);case 5121:return Math.round(255*t);case 5122:return Math.round(32767*t);case 5120:return Math.round(127*t);default:throw new Error(\"Invalid component type.\")}}static normalize(t,e){return P.encodeNormalizedInt(t,e)}static decompose(t,e,r,s){let n=y([t[0],t[1],t[2]]);const i=y([t[4],t[5],t[6]]),o=y([t[8],t[9],t[10]]);var a,u,c,h,f,l,d,g,p,m,v,T,b,x,A,E,M;((u=(a=t)[0])*(d=a[5])-(c=a[1])*(l=a[4]))*((T=a[10])*(M=a[15])-(b=a[11])*(E=a[14]))-(u*(g=a[6])-(h=a[2])*l)*((v=a[9])*M-b*(A=a[13]))+(u*(p=a[7])-(f=a[3])*l)*(v*E-T*A)+(c*g-h*d)*((m=a[8])*M-b*(x=a[12]))-(c*p-f*d)*(m*E-T*x)+(h*p-f*g)*(m*A-v*x)<0&&(n=-n),e[0]=t[12],e[1]=t[13],e[2]=t[14];const S=t.slice(),I=1/n,R=1/i,N=1/o;S[0]*=I,S[1]*=I,S[2]*=I,S[4]*=R,S[5]*=R,S[6]*=R,S[8]*=N,S[9]*=N,S[10]*=N,function(t,e){var r=new w(3);!function(t,e){var r=e[4],s=e[5],n=e[6],i=e[8],o=e[9],a=e[10];t[0]=Math.hypot(e[0],e[1],e[2]),t[1]=Math.hypot(r,s,n),t[2]=Math.hypot(i,o,a)}(r,e);var s=1/r[0],n=1/r[1],i=1/r[2],o=e[0]*s,a=e[1]*n,u=e[2]*i,c=e[4]*s,h=e[5]*n,f=e[6]*i,l=e[8]*s,d=e[9]*n,g=e[10]*i,p=o+h+g,m=0;p>0?(m=2*Math.sqrt(p+1),t[3]=.25*m,t[0]=(f-d)/m,t[1]=(l-u)/m,t[2]=(a-c)/m):o>h&&o>g?(m=2*Math.sqrt(1+o-h-g),t[3]=(f-d)/m,t[0]=.25*m,t[1]=(a+c)/m,t[2]=(l+u)/m):h>g?(m=2*Math.sqrt(1+h-o-g),t[3]=(l-u)/m,t[0]=(a+c)/m,t[1]=.25*m,t[2]=(f+d)/m):(m=2*Math.sqrt(1+g-o-h),t[3]=(a-c)/m,t[0]=(l+u)/m,t[1]=(f+d)/m,t[2]=.25*m)}(r,S),s[0]=n,s[1]=i,s[2]=o}static compose(t,e,r,s){const n=s,i=e[0],o=e[1],a=e[2],u=e[3],c=i+i,h=o+o,f=a+a,l=i*c,d=i*h,g=i*f,p=o*h,m=o*f,w=a*f,y=u*c,v=u*h,T=u*f,b=r[0],x=r[1],A=r[2];return n[0]=(1-(p+w))*b,n[1]=(d+T)*b,n[2]=(g-v)*b,n[3]=0,n[4]=(d-T)*x,n[5]=(1-(l+w))*x,n[6]=(m+y)*x,n[7]=0,n[8]=(g+v)*A,n[9]=(m-y)*A,n[10]=(1-(l+p))*A,n[11]=0,n[12]=t[0],n[13]=t[1],n[14]=t[2],n[15]=1,n}}function L(t,e){if(!!t!=!!e)return!1;const r=t.getChild(),s=e.getChild();return r===s||r.equals(s)}function j(t,e){if(!!t!=!!e)return!1;if(t.length!==e.length)return!1;for(let r=0;r<t.length;r++){const s=t[r],n=e[r];if(s.getChild()!==n.getChild()&&!s.getChild().equals(n.getChild()))return!1}return!0}function D(t,e){if(!!t!=!!e)return!1;const r=Object.keys(t),s=Object.keys(e);if(r.length!==s.length)return!1;for(const r in t){const s=t[r],n=e[r];if(!!s!=!!n)return!1;const i=s.getChild(),o=n.getChild();if(i!==o&&!i.equals(o))return!1}return!0}function _(t,e){if(t===e)return!0;if(!!t!=!!e||!t||!e)return!1;if(t.length!==e.length)return!1;for(let r=0;r<t.length;r++)if(t[r]!==e[r])return!1;return!0}function k(t,e){if(t===e)return!0;if(!!t!=!!e)return!1;if(!C(t)||!C(e))return t===e;const r=t,s=e;let n,i=0,o=0;for(n in r)i++;for(n in s)o++;if(i!==o)return!1;for(n in r){const t=r[n],e=s[n];if(z(t)&&z(e)){if(!_(t,e))return!1}else if(C(t)&&C(e)){if(!k(t,e))return!1}else if(t!==e)return!1}return!0}function z(t){return Array.isArray(t)||ArrayBuffer.isView(t)}const G=\"23456789abdegjkmnpqrvwxyzABDEGJKMNPQRVWXYZ\",J=new Set,$=function(){let t=\"\";for(let e=0;e<6;e++)t+=G.charAt(Math.floor(Math.random()*G.length));return t},V=function(){for(let t=0;t<999;t++){const t=$();if(!J.has(t))return J.add(t),t}return\"\"};class W{static dirname(t){const e=t.lastIndexOf(\"/\");return-1===e?\"./\":t.substring(0,e+1)}static basename(t){return N.basename(new URL(t,\"https://null.example\").pathname)}static extension(t){return N.extension(new URL(t,\"https://null.example\").pathname)}static resolve(t,e){if(!this.isRelativePath(e))return e;const r=t.split(\"/\"),s=e.split(\"/\");r.pop();for(let t=0;t<s.length;t++)\".\"!==s[t]&&(\"..\"===s[t]?r.pop():r.push(s[t]));return r.join(\"/\")}static isAbsoluteURL(t){return this.PROTOCOL_REGEXP.test(t)}static isRelativePath(t){return!/^(?:[a-zA-Z]+:)?\\//.test(t)}}W.DEFAULT_INIT={},W.PROTOCOL_REGEXP=/^[a-zA-Z]+:\\/\\//;const q=t=>t,H=new Set;class Y extends t{constructor(t,r=\"\"){super(t),this[e].name=r,this.init(),this.dispatchEvent({type:\"create\"})}getGraph(){return this.graph}getDefaults(){return Object.assign(super.getDefaults(),{name:\"\",extras:{}})}set(t,e){return Array.isArray(e)&&(e=e.slice()),super.set(t,e)}getName(){return this.get(\"name\")}setName(t){return this.set(\"name\",t)}getExtras(){return this.get(\"extras\")}setExtras(t){return this.set(\"extras\",t)}clone(){return new(0,this.constructor)(this.graph).copy(this,q)}copy(t,o=q){for(const t in this[e]){const o=this[e][t];if(o instanceof r)this[s].has(t)||o.dispose();else if(n(o))for(const t of o)t.dispose();else if(i(o))for(const t in o)o[t].dispose()}for(const a in t[e]){const u=this[e][a],c=t[e][a];if(c instanceof r)this[s].has(a)?u.getChild().copy(o(c.getChild()),o):this.setRef(a,o(c.getChild()),c.getAttributes());else if(n(c))for(const t of c)this.addRef(a,o(t.getChild()),t.getAttributes());else if(i(c))for(const t in c){const e=c[t];this.setRefMap(a,t,o(e.getChild()),e.getAttributes())}else this[e][a]=C(c)?JSON.parse(JSON.stringify(c)):Array.isArray(c)||c instanceof ArrayBuffer||ArrayBuffer.isView(c)?c.slice():c}return this}equals(t,r=H){if(this===t)return!0;if(this.propertyType!==t.propertyType)return!1;for(const s in this[e]){if(r.has(s))continue;const a=this[e][s],u=t[e][s];if(o(a)||o(u)){if(!L(a,u))return!1}else if(n(a)||n(u)){if(!j(a,u))return!1}else if(i(a)||i(u)){if(!D(a,u))return!1}else if(C(a)||C(u)){if(!k(a,u))return!1}else if(z(a)||z(u)){if(!_(a,u))return!1}else if(a!==u)return!1}return!0}detach(){return this.graph.disconnectParents(this,t=>\"Root\"!==t.propertyType),this}listParents(){return this.graph.listParents(this)}}class Z extends Y{getDefaults(){return Object.assign(super.getDefaults(),{extensions:{}})}getExtension(t){return this.getRefMap(\"extensions\",t)}setExtension(t,e){return e&&e.t(this),this.setRefMap(\"extensions\",t,e)}listExtensions(){return this.listRefMapValues(\"extensions\")}}class K extends Z{constructor(...t){super(...t),this.i=P.identity,this.o=P.identity}init(){this.propertyType=h.ACCESSOR}getDefaults(){return Object.assign(super.getDefaults(),{array:null,type:K.Type.SCALAR,componentType:K.ComponentType.FLOAT,normalized:!1,sparse:!1,buffer:null})}copy(t,e=q){return super.copy(t,e),this.i=t.i,this.o=t.o,this}static getElementSize(t){switch(t){case K.Type.SCALAR:return 1;case K.Type.VEC2:return 2;case K.Type.VEC3:return 3;case K.Type.VEC4:case K.Type.MAT2:return 4;case K.Type.MAT3:return 9;case K.Type.MAT4:return 16;default:throw new Error(\"Unexpected type: \"+t)}}static getComponentSize(t){switch(t){case K.ComponentType.BYTE:case K.ComponentType.UNSIGNED_BYTE:return 1;case K.ComponentType.SHORT:case K.ComponentType.UNSIGNED_SHORT:return 2;case K.ComponentType.UNSIGNED_INT:case K.ComponentType.FLOAT:return 4;default:throw new Error(\"Unexpected component type: \"+t)}}getMinNormalized(t){const e=this.getElementSize();this.getMin(t);for(let r=0;r<e;r++)t[r]=this.o(t[r]);return t}getMin(t){const e=this.get(\"array\"),r=this.getCount(),s=this.getElementSize();for(let e=0;e<s;e++)t[e]=Infinity;for(let n=0;n<r*s;n+=s)for(let r=0;r<s;r++){const s=e[n+r];Number.isFinite(s)&&(t[r]=Math.min(t[r],s))}return t}getMaxNormalized(t){const e=this.getElementSize();this.getMax(t);for(let r=0;r<e;r++)t[r]=this.o(t[r]);return t}getMax(t){const e=this.get(\"array\"),r=this.getCount(),s=this.getElementSize();for(let e=0;e<s;e++)t[e]=-Infinity;for(let n=0;n<r*s;n+=s)for(let r=0;r<s;r++){const s=e[n+r];Number.isFinite(s)&&(t[r]=Math.max(t[r],s))}return t}getCount(){const t=this.get(\"array\");return t?t.length/this.getElementSize():0}getType(){return this.get(\"type\")}setType(t){return this.set(\"type\",t)}getElementSize(){return K.getElementSize(this.get(\"type\"))}getComponentSize(){return this.get(\"array\").BYTES_PER_ELEMENT}getComponentType(){return this.get(\"componentType\")}getNormalized(){return this.get(\"normalized\")}setNormalized(t){return this.set(\"normalized\",t),t?(this.o=t=>P.decodeNormalizedInt(t,this.get(\"componentType\")),this.i=t=>P.encodeNormalizedInt(t,this.get(\"componentType\"))):(this.o=P.identity,this.i=P.identity),this}getScalar(t){const e=this.getElementSize();return this.o(this.get(\"array\")[t*e])}setScalar(t,e){return this.get(\"array\")[t*this.getElementSize()]=this.i(e),this}getElement(t,e){const r=this.getElementSize(),s=this.get(\"array\");for(let n=0;n<r;n++)e[n]=this.o(s[t*r+n]);return e}setElement(t,e){const r=this.getElementSize(),s=this.get(\"array\");for(let n=0;n<r;n++)s[t*r+n]=this.i(e[n]);return this}getSparse(){return this.get(\"sparse\")}setSparse(t){return this.set(\"sparse\",t)}getBuffer(){return this.getRef(\"buffer\")}setBuffer(t){return this.setRef(\"buffer\",t)}getArray(){return this.get(\"array\")}setArray(t){return this.set(\"componentType\",t?function(t){switch(t.constructor){case Float32Array:return K.ComponentType.FLOAT;case Uint32Array:return K.ComponentType.UNSIGNED_INT;case Uint16Array:return K.ComponentType.UNSIGNED_SHORT;case Uint8Array:return K.ComponentType.UNSIGNED_BYTE;case Int16Array:return K.ComponentType.SHORT;case Int8Array:return K.ComponentType.BYTE;default:throw new Error(\"Unknown accessor componentType.\")}}(t):K.ComponentType.FLOAT),this.set(\"array\",t),this}getByteLength(){const t=this.get(\"array\");return t?t.byteLength:0}}K.Type={SCALAR:\"SCALAR\",VEC2:\"VEC2\",VEC3:\"VEC3\",VEC4:\"VEC4\",MAT2:\"MAT2\",MAT3:\"MAT3\",MAT4:\"MAT4\"},K.ComponentType={BYTE:5120,UNSIGNED_BYTE:5121,SHORT:5122,UNSIGNED_SHORT:5123,UNSIGNED_INT:5125,FLOAT:5126};class Q extends Z{init(){this.propertyType=h.ANIMATION}getDefaults(){return Object.assign(super.getDefaults(),{channels:[],samplers:[]})}addChannel(t){return this.addRef(\"channels\",t)}removeChannel(t){return this.removeRef(\"channels\",t)}listChannels(){return this.listRefs(\"channels\")}addSampler(t){return this.addRef(\"samplers\",t)}removeSampler(t){return this.removeRef(\"samplers\",t)}listSamplers(){return this.listRefs(\"samplers\")}}class X extends Z{init(){this.propertyType=h.ANIMATION_CHANNEL}getDefaults(){return Object.assign(super.getDefaults(),{targetPath:null,targetNode:null,sampler:null})}getTargetPath(){return this.get(\"targetPath\")}setTargetPath(t){return this.set(\"targetPath\",t)}getTargetNode(){return this.getRef(\"targetNode\")}setTargetNode(t){return this.setRef(\"targetNode\",t)}getSampler(){return this.getRef(\"sampler\")}setSampler(t){return this.setRef(\"sampler\",t)}}X.TargetPath={TRANSLATION:\"translation\",ROTATION:\"rotation\",SCALE:\"scale\",WEIGHTS:\"weights\"};class tt extends Z{init(){this.propertyType=h.ANIMATION_SAMPLER}getDefaultAttributes(){return Object.assign(super.getDefaults(),{interpolation:tt.Interpolation.LINEAR,input:null,output:null})}getInterpolation(){return this.get(\"interpolation\")}setInterpolation(t){return this.set(\"interpolation\",t)}getInput(){return this.getRef(\"input\")}setInput(t){return this.setRef(\"input\",t,{usage:l.OTHER})}getOutput(){return this.getRef(\"output\")}setOutput(t){return this.setRef(\"output\",t,{usage:l.OTHER})}}tt.Interpolation={LINEAR:\"LINEAR\",STEP:\"STEP\",CUBICSPLINE:\"CUBICSPLINE\"};class et extends Z{init(){this.propertyType=h.BUFFER}getDefaults(){return Object.assign(super.getDefaults(),{uri:\"\"})}getURI(){return this.get(\"uri\")}setURI(t){return this.set(\"uri\",t)}}class rt extends Z{init(){this.propertyType=h.CAMERA}getDefaults(){return Object.assign(super.getDefaults(),{type:rt.Type.PERSPECTIVE,znear:.1,zfar:100,aspectRatio:null,yfov:2*Math.PI*50/360,xmag:1,ymag:1})}getType(){return this.get(\"type\")}setType(t){return this.set(\"type\",t)}getZNear(){return this.get(\"znear\")}setZNear(t){return this.set(\"znear\",t)}getZFar(){return this.get(\"zfar\")}setZFar(t){return this.set(\"zfar\",t)}getAspectRatio(){return this.get(\"aspectRatio\")}setAspectRatio(t){return this.set(\"aspectRatio\",t)}getYFov(){return this.get(\"yfov\")}setYFov(t){return this.set(\"yfov\",t)}getXMag(){return this.get(\"xmag\")}setXMag(t){return this.set(\"xmag\",t)}getYMag(){return this.get(\"ymag\")}setYMag(t){return this.set(\"ymag\",t)}}rt.Type={PERSPECTIVE:\"perspective\",ORTHOGRAPHIC:\"orthographic\"};class st extends Y{t(t){if(!this.parentTypes.includes(t.propertyType))throw new Error(`Parent \"${t.propertyType}\" invalid for child \"${this.propertyType}\".`)}}st.EXTENSION_NAME=void 0;class nt extends Z{init(){this.propertyType=h.TEXTURE_INFO}getDefaults(){return Object.assign(super.getDefaults(),{texCoord:0,magFilter:null,minFilter:null,wrapS:nt.WrapMode.REPEAT,wrapT:nt.WrapMode.REPEAT})}getTexCoord(){return this.get(\"texCoord\")}setTexCoord(t){return this.set(\"texCoord\",t)}getMagFilter(){return this.get(\"magFilter\")}setMagFilter(t){return this.set(\"magFilter\",t)}getMinFilter(){return this.get(\"minFilter\")}setMinFilter(t){return this.set(\"minFilter\",t)}getWrapS(){return this.get(\"wrapS\")}setWrapS(t){return this.set(\"wrapS\",t)}getWrapT(){return this.get(\"wrapT\")}setWrapT(t){return this.set(\"wrapT\",t)}}nt.WrapMode={CLAMP_TO_EDGE:33071,MIRRORED_REPEAT:33648,REPEAT:10497},nt.MagFilter={NEAREST:9728,LINEAR:9729},nt.MinFilter={NEAREST:9728,LINEAR:9729,NEAREST_MIPMAP_NEAREST:9984,LINEAR_MIPMAP_NEAREST:9985,NEAREST_MIPMAP_LINEAR:9986,LINEAR_MIPMAP_LINEAR:9987};const{R:it,G:ot,B:at,A:ut}=d;class ct extends Z{init(){this.propertyType=h.MATERIAL}getDefaults(){return Object.assign(super.getDefaults(),{alphaMode:ct.AlphaMode.OPAQUE,alphaCutoff:.5,doubleSided:!1,baseColorFactor:[1,1,1,1],baseColorTexture:null,baseColorTextureInfo:new nt(this.graph,\"baseColorTextureInfo\"),emissiveFactor:[0,0,0],emissiveTexture:null,emissiveTextureInfo:new nt(this.graph,\"emissiveTextureInfo\"),normalScale:1,normalTexture:null,normalTextureInfo:new nt(this.graph,\"normalTextureInfo\"),occlusionStrength:1,occlusionTexture:null,occlusionTextureInfo:new nt(this.graph,\"occlusionTextureInfo\"),roughnessFactor:1,metallicFactor:1,metallicRoughnessTexture:null,metallicRoughnessTextureInfo:new nt(this.graph,\"metallicRoughnessTextureInfo\")})}getDoubleSided(){return this.get(\"doubleSided\")}setDoubleSided(t){return this.set(\"doubleSided\",t)}getAlpha(){return this.get(\"baseColorFactor\")[3]}setAlpha(t){const e=this.get(\"baseColorFactor\").slice();return e[3]=t,this.set(\"baseColorFactor\",e)}getAlphaMode(){return this.get(\"alphaMode\")}setAlphaMode(t){return this.set(\"alphaMode\",t)}getAlphaCutoff(){return this.get(\"alphaCutoff\")}setAlphaCutoff(t){return this.set(\"alphaCutoff\",t)}getBaseColorFactor(){return this.get(\"baseColorFactor\")}setBaseColorFactor(t){return this.set(\"baseColorFactor\",t)}getBaseColorHex(){return M.factorToHex(this.get(\"baseColorFactor\"))}setBaseColorHex(t){const e=this.get(\"baseColorFactor\").slice();return this.set(\"baseColorFactor\",M.hexToFactor(t,e))}getBaseColorTexture(){return this.getRef(\"baseColorTexture\")}getBaseColorTextureInfo(){return this.getRef(\"baseColorTexture\")?this.getRef(\"baseColorTextureInfo\"):null}setBaseColorTexture(t){return this.setRef(\"baseColorTexture\",t,{channels:it|ot|at|ut})}getEmissiveFactor(){return this.get(\"emissiveFactor\")}setEmissiveFactor(t){return this.set(\"emissiveFactor\",t)}getEmissiveHex(){return M.factorToHex(this.get(\"emissiveFactor\"))}setEmissiveHex(t){const e=this.get(\"emissiveFactor\").slice();return this.set(\"emissiveFactor\",M.hexToFactor(t,e))}getEmissiveTexture(){return this.getRef(\"emissiveTexture\")}getEmissiveTextureInfo(){return this.getRef(\"emissiveTexture\")?this.getRef(\"emissiveTextureInfo\"):null}setEmissiveTexture(t){return this.setRef(\"emissiveTexture\",t,{channels:it|ot|at})}getNormalScale(){return this.get(\"normalScale\")}setNormalScale(t){return this.set(\"normalScale\",t)}getNormalTexture(){return this.getRef(\"normalTexture\")}getNormalTextureInfo(){return this.getRef(\"normalTexture\")?this.getRef(\"normalTextureInfo\"):null}setNormalTexture(t){return this.setRef(\"normalTexture\",t,{channels:it|ot|at})}getOcclusionStrength(){return this.get(\"occlusionStrength\")}setOcclusionStrength(t){return this.set(\"occlusionStrength\",t)}getOcclusionTexture(){return this.getRef(\"occlusionTexture\")}getOcclusionTextureInfo(){return this.getRef(\"occlusionTexture\")?this.getRef(\"occlusionTextureInfo\"):null}setOcclusionTexture(t){return this.setRef(\"occlusionTexture\",t,{channels:it})}getRoughnessFactor(){return this.get(\"roughnessFactor\")}setRoughnessFactor(t){return this.set(\"roughnessFactor\",t)}getMetallicFactor(){return this.get(\"metallicFactor\")}setMetallicFactor(t){return this.set(\"metallicFactor\",t)}getMetallicRoughnessTexture(){return this.getRef(\"metallicRoughnessTexture\")}getMetallicRoughnessTextureInfo(){return this.getRef(\"metallicRoughnessTexture\")?this.getRef(\"metallicRoughnessTextureInfo\"):null}setMetallicRoughnessTexture(t){return this.setRef(\"metallicRoughnessTexture\",t,{channels:ot|at})}}ct.AlphaMode={OPAQUE:\"OPAQUE\",MASK:\"MASK\",BLEND:\"BLEND\"};class ht extends Z{init(){this.propertyType=h.MESH}getDefaults(){return Object.assign(super.getDefaults(),{weights:[],primitives:[]})}addPrimitive(t){return this.addRef(\"primitives\",t)}removePrimitive(t){return this.removeRef(\"primitives\",t)}listPrimitives(){return this.listRefs(\"primitives\")}getWeights(){return this.get(\"weights\")}setWeights(t){return this.set(\"weights\",t)}}class ft extends Z{constructor(...t){super(...t),this.u=null}init(){this.propertyType=h.NODE}getDefaults(){return Object.assign(super.getDefaults(),{translation:[0,0,0],rotation:[0,0,0,1],scale:[1,1,1],weights:[],camera:null,mesh:null,skin:null,children:[]})}copy(t,e=q){if(e===q)throw new Error(\"Node cannot be copied.\");return super.copy(t,e)}getTranslation(){return this.get(\"translation\")}getRotation(){return this.get(\"rotation\")}getScale(){return this.get(\"scale\")}setTranslation(t){return this.set(\"translation\",t)}setRotation(t){return this.set(\"rotation\",t)}setScale(t){return this.set(\"scale\",t)}getMatrix(){return P.compose(this.get(\"translation\"),this.get(\"rotation\"),this.get(\"scale\"),[])}setMatrix(t){const e=this.get(\"translation\").slice(),r=this.get(\"rotation\").slice(),s=this.get(\"scale\").slice();return P.decompose(t,e,r,s),this.set(\"translation\",e).set(\"rotation\",r).set(\"scale\",s)}getWorldTranslation(){const t=[0,0,0];return P.decompose(this.getWorldMatrix(),t,[0,0,0,1],[1,1,1]),t}getWorldRotation(){const t=[0,0,0,1];return P.decompose(this.getWorldMatrix(),[0,0,0],t,[1,1,1]),t}getWorldScale(){const t=[1,1,1];return P.decompose(this.getWorldMatrix(),[0,0,0],[0,0,0,1],t),t}getWorldMatrix(){const t=[];for(let e=this;null!=e;e=e.u)t.push(e);let e;const r=t.pop().getMatrix();for(;e=t.pop();)B(r,r,e.getMatrix());return r}addChild(t){t.u&&t.u.removeChild(t),this.addRef(\"children\",t),t.u=this;const r=this[e].children;return r[r.length-1].addEventListener(\"dispose\",()=>t.u=null),this}removeChild(t){return this.removeRef(\"children\",t)}listChildren(){return this.listRefs(\"children\")}getParent(){return this.u?this.u:this.listParents().find(t=>t.propertyType===h.SCENE)||null}getParentNode(){return this.u}getMesh(){return this.getRef(\"mesh\")}setMesh(t){return this.setRef(\"mesh\",t)}getCamera(){return this.getRef(\"camera\")}setCamera(t){return this.setRef(\"camera\",t)}getSkin(){return this.getRef(\"skin\")}setSkin(t){return this.setRef(\"skin\",t)}getWeights(){return this.get(\"weights\")}setWeights(t){return this.set(\"weights\",t)}traverse(t){t(this);for(const e of this.listChildren())e.traverse(t);return this}}class lt extends Z{init(){this.propertyType=h.PRIMITIVE}getDefaults(){return Object.assign(super.getDefaults(),{mode:lt.Mode.TRIANGLES,material:null,indices:null,attributes:{},targets:[]})}getIndices(){return this.getRef(\"indices\")}setIndices(t){return this.setRef(\"indices\",t,{usage:l.ELEMENT_ARRAY_BUFFER})}getAttribute(t){return this.getRefMap(\"attributes\",t)}setAttribute(t,e){return this.setRefMap(\"attributes\",t,e,{usage:l.ARRAY_BUFFER})}listAttributes(){return this.listRefMapValues(\"attributes\")}listSemantics(){return this.listRefMapKeys(\"attributes\")}getMaterial(){return this.getRef(\"material\")}setMaterial(t){return this.setRef(\"material\",t)}getMode(){return this.get(\"mode\")}setMode(t){return this.set(\"mode\",t)}listTargets(){return this.listRefs(\"targets\")}addTarget(t){return this.addRef(\"targets\",t)}removeTarget(t){return this.removeRef(\"targets\",t)}}lt.Mode={POINTS:0,LINES:1,LINE_LOOP:2,LINE_STRIP:3,TRIANGLES:4,TRIANGLE_STRIP:5,TRIANGLE_FAN:6};class dt extends Y{init(){this.propertyType=h.PRIMITIVE_TARGET}getDefaults(){return Object.assign(super.getDefaults(),{attributes:{}})}getAttribute(t){return this.getRefMap(\"attributes\",t)}setAttribute(t,e){return this.setRefMap(\"attributes\",t,e,{usage:l.ARRAY_BUFFER})}listAttributes(){return this.listRefMapValues(\"attributes\")}listSemantics(){return this.listRefMapKeys(\"attributes\")}}function gt(){return(gt=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&(t[s]=r[s])}return t}).apply(this,arguments)}class pt extends Z{init(){this.propertyType=h.SCENE}getDefaults(){return Object.assign(super.getDefaults(),{children:[]})}copy(t,e=q){if(e===q)throw new Error(\"Scene cannot be copied.\");return super.copy(t,e)}addChild(t){return this.addRef(\"children\",t)}removeChild(t){return this.removeRef(\"children\",t)}listChildren(){return this.listRefs(\"children\")}traverse(t){for(const e of this.listChildren())e.traverse(t);return this}}class mt extends Z{init(){this.propertyType=h.SKIN}getDefaults(){return Object.assign(super.getDefaults(),{skeleton:null,inverseBindMatrices:null,joints:[]})}getSkeleton(){return this.getRef(\"skeleton\")}setSkeleton(t){return this.setRef(\"skeleton\",t)}getInverseBindMatrices(){return this.getRef(\"inverseBindMatrices\")}setInverseBindMatrices(t){return this.setRef(\"inverseBindMatrices\",t,{usage:l.INVERSE_BIND_MATRICES})}addJoint(t){return this.addRef(\"joints\",t)}removeJoint(t){return this.removeRef(\"joints\",t)}listJoints(){return this.listRefs(\"joints\")}}class wt extends Z{init(){this.propertyType=h.TEXTURE}getDefaults(){return Object.assign(super.getDefaults(),{image:null,mimeType:\"\",uri:\"\"})}getMimeType(){return this.get(\"mimeType\")||I.extensionToMimeType(N.extension(this.get(\"uri\")))}setMimeType(t){return this.set(\"mimeType\",t)}getURI(){return this.get(\"uri\")}setURI(t){this.set(\"uri\",t);const e=I.extensionToMimeType(N.extension(t));return e&&this.set(\"mimeType\",e),this}getImage(){return this.get(\"image\")}setImage(t){return this.set(\"image\",E.assertView(t))}getSize(){const t=this.get(\"image\");return t?I.getSize(t,this.getMimeType()):null}}class yt extends Z{init(){this.propertyType=h.ROOT}getDefaults(){return Object.assign(super.getDefaults(),{asset:{generator:\"glTF-Transform v3.2.1\",version:\"2.0\"},defaultScene:null,accessors:[],animations:[],buffers:[],cameras:[],materials:[],meshes:[],nodes:[],scenes:[],skins:[],textures:[]})}constructor(t){super(t),this.h=new Set,t.addEventListener(\"node:create\",t=>{this.l(t.target)})}clone(){throw new Error(\"Root cannot be cloned.\")}copy(t,e=q){if(e===q)throw new Error(\"Root cannot be copied.\");this.set(\"asset\",gt({},t.get(\"asset\"))),this.setName(t.getName()),this.setExtras(gt({},t.getExtras())),this.setDefaultScene(t.getDefaultScene()?e(t.getDefaultScene()):null);for(const r of t.listRefMapKeys(\"extensions\")){const s=t.getExtension(r);this.setExtension(r,e(s))}return this}l(t){return t instanceof pt?this.addRef(\"scenes\",t):t instanceof ft?this.addRef(\"nodes\",t):t instanceof rt?this.addRef(\"cameras\",t):t instanceof mt?this.addRef(\"skins\",t):t instanceof ht?this.addRef(\"meshes\",t):t instanceof ct?this.addRef(\"materials\",t):t instanceof wt?this.addRef(\"textures\",t):t instanceof Q?this.addRef(\"animations\",t):t instanceof K?this.addRef(\"accessors\",t):t instanceof et&&this.addRef(\"buffers\",t),this}getAsset(){return this.get(\"asset\")}listExtensionsUsed(){return Array.from(this.h)}listExtensionsRequired(){return this.listExtensionsUsed().filter(t=>t.isRequired())}g(t){return this.h.add(t),this}p(t){return this.h.delete(t),this}listScenes(){return this.listRefs(\"scenes\")}setDefaultScene(t){return this.setRef(\"defaultScene\",t)}getDefaultScene(){return this.getRef(\"defaultScene\")}listNodes(){return this.listRefs(\"nodes\")}listCameras(){return this.listRefs(\"cameras\")}listSkins(){return this.listRefs(\"skins\")}listMeshes(){return this.listRefs(\"meshes\")}listMaterials(){return this.listRefs(\"materials\")}listTextures(){return this.listRefs(\"textures\")}listAnimations(){return this.listRefs(\"animations\")}listAccessors(){return this.listRefs(\"accessors\")}listBuffers(){return this.listRefs(\"buffers\")}}class vt{static fromGraph(t){return vt.m.get(t)||null}constructor(){this.v=new a,this.T=new yt(this.v),this.M=U.DEFAULT_INSTANCE,vt.m.set(this.v,this)}getRoot(){return this.T}getGraph(){return this.v}getLogger(){return this.M}setLogger(t){return this.M=t,this}clone(){return(new vt).setLogger(this.M).merge(this)}merge(t){for(const e of t.getRoot().listExtensionsUsed()){const t=this.createExtension(e.constructor);e.isRequired()&&t.setRequired(!0)}const e=new Set,r=new Map;e.add(t.T),r.set(t.T,this.T);for(const s of t.v.listEdges())for(const t of[s.getParent(),s.getChild()]){if(e.has(t))continue;let s;s=t.propertyType===h.TEXTURE_INFO?t:new(0,t.constructor)(this.v),r.set(t,s),e.add(t)}const s=t=>{const e=r.get(t);if(!e)throw new Error(\"Could resolve property.\");return e};for(const t of e){const e=r.get(t);if(!e)throw new Error(\"Could resolve property.\");e.propertyType!==h.TEXTURE_INFO&&e.copy(t,s)}return this}async transform(...t){const e=t.map(t=>t.name);for(const r of t)await r(this,{stack:e});return this}createExtension(t){const e=t.EXTENSION_NAME;return this.getRoot().listExtensionsUsed().find(t=>t.extensionName===e)||new t(this)}createScene(t=\"\"){return new pt(this.v,t)}createNode(t=\"\"){return new ft(this.v,t)}createCamera(t=\"\"){return new rt(this.v,t)}createSkin(t=\"\"){return new mt(this.v,t)}createMesh(t=\"\"){return new ht(this.v,t)}createPrimitive(){return new lt(this.v)}createPrimitiveTarget(t=\"\"){return new dt(this.v,t)}createMaterial(t=\"\"){return new ct(this.v,t)}createTexture(t=\"\"){return new wt(this.v,t)}createAnimation(t=\"\"){return new Q(this.v,t)}createAnimationChannel(t=\"\"){return new X(this.v,t)}createAnimationSampler(t=\"\"){return new tt(this.v,t)}createAccessor(t=\"\",e=null){return e||(e=this.getRoot().listBuffers()[0]),new K(this.v,t).setBuffer(e)}createBuffer(t=\"\"){return new et(this.v,t)}}vt.m=new WeakMap;class Tt{constructor(t){this.extensionName=\"\",this.prereadTypes=[],this.prewriteTypes=[],this.readDependencies=[],this.writeDependencies=[],this.document=void 0,this.required=!1,this.properties=new Set,this.S=void 0,this.document=t,t.getRoot().g(this),this.S=t=>{const e=t,r=e.target;r instanceof st&&r.extensionName===this.extensionName&&(\"node:create\"===e.type&&this.I(r),\"node:dispose\"===e.type&&this.N(r))};const e=t.getGraph();e.addEventListener(\"node:create\",this.S),e.addEventListener(\"node:dispose\",this.S)}dispose(){this.document.getRoot().p(this);const t=this.document.getGraph();t.removeEventListener(\"node:create\",this.S),t.removeEventListener(\"node:dispose\",this.S);for(const t of this.properties)t.dispose()}static register(){}isRequired(){return this.required}setRequired(t){return this.required=t,this}listProperties(){return Array.from(this.properties)}I(t){return this.properties.add(t),this}N(t){return this.properties.delete(t),this}install(t,e){return this}preread(t,e){return this}prewrite(t,e){return this}}Tt.EXTENSION_NAME=void 0;class bt{constructor(t){this.jsonDoc=void 0,this.buffers=[],this.bufferViews=[],this.bufferViewBuffers=[],this.accessors=[],this.textures=[],this.textureInfos=new Map,this.materials=[],this.meshes=[],this.cameras=[],this.nodes=[],this.skins=[],this.animations=[],this.scenes=[],this.jsonDoc=t}setTextureInfo(t,e){this.textureInfos.set(t,e),void 0!==e.texCoord&&t.setTexCoord(e.texCoord),void 0!==e.extras&&t.setExtras(e.extras);const r=this.jsonDoc.json.textures[e.index];if(void 0===r.sampler)return;const s=this.jsonDoc.json.samplers[r.sampler];void 0!==s.magFilter&&t.setMagFilter(s.magFilter),void 0!==s.minFilter&&t.setMinFilter(s.minFilter),void 0!==s.wrapS&&t.setWrapS(s.wrapS),void 0!==s.wrapT&&t.setWrapT(s.wrapT)}}const xt={logger:U.DEFAULT_INSTANCE,extensions:[],dependencies:{}};function At(t,e){const r=e.bufferViews[t.bufferView],s=e.jsonDoc.json.bufferViews[t.bufferView],n=p[t.componentType],i=K.getElementSize(t.type),o=n.BYTES_PER_ELEMENT;if(void 0!==s.byteStride&&s.byteStride!==i*o)return function(t,e){const r=e.bufferViews[t.bufferView],s=e.jsonDoc.json.bufferViews[t.bufferView],n=p[t.componentType],i=K.getElementSize(t.type),o=n.BYTES_PER_ELEMENT,a=t.byteOffset||0,u=new n(t.count*i),c=new DataView(r.buffer,r.byteOffset,r.byteLength),h=s.byteStride;for(let e=0;e<t.count;e++)for(let r=0;r<i;r++){const s=a+e*h+r*o;let n;switch(t.componentType){case K.ComponentType.FLOAT:n=c.getFloat32(s,!0);break;case K.ComponentType.UNSIGNED_INT:n=c.getUint32(s,!0);break;case K.ComponentType.UNSIGNED_SHORT:n=c.getUint16(s,!0);break;case K.ComponentType.UNSIGNED_BYTE:n=c.getUint8(s);break;case K.ComponentType.SHORT:n=c.getInt16(s,!0);break;case K.ComponentType.BYTE:n=c.getInt8(s);break;default:throw new Error(`Unexpected componentType \"${t.componentType}\".`)}u[e*i+r]=n}return u}(t,e);const a=r.byteOffset+(t.byteOffset||0);return new n(r.buffer.slice(a,a+t.count*i*o))}var Et;!function(t){t[t.ARRAY_BUFFER=34962]=\"ARRAY_BUFFER\",t[t.ELEMENT_ARRAY_BUFFER=34963]=\"ELEMENT_ARRAY_BUFFER\"}(Et||(Et={}));class Mt{constructor(t,e,r){this.O=void 0,this.jsonDoc=void 0,this.options=void 0,this.accessorIndexMap=new Map,this.animationIndexMap=new Map,this.bufferIndexMap=new Map,this.cameraIndexMap=new Map,this.skinIndexMap=new Map,this.materialIndexMap=new Map,this.meshIndexMap=new Map,this.nodeIndexMap=new Map,this.imageIndexMap=new Map,this.textureDefIndexMap=new Map,this.textureInfoDefMap=new Map,this.samplerDefIndexMap=new Map,this.sceneIndexMap=new Map,this.imageBufferViews=[],this.otherBufferViews=new Map,this.otherBufferViewsIndexMap=new Map,this.extensionData={},this.bufferURIGenerator=void 0,this.imageURIGenerator=void 0,this.logger=void 0,this.C=new Map,this.accessorUsageGroupedByParent=new Set([\"ARRAY_BUFFER\"]),this.accessorParents=new Map,this.O=t,this.jsonDoc=e,this.options=r;const s=t.getRoot(),n=s.listBuffers().length,i=s.listTextures().length;this.bufferURIGenerator=new St(n>1,()=>r.basename||\"buffer\"),this.imageURIGenerator=new St(i>1,e=>function(t,e){const r=t.getGraph().listParentEdges(e).find(e=>e.getParent()!==t.getRoot());return r?r.getName().replace(/texture$/i,\"\"):\"\"}(t,e)||r.basename||\"texture\"),this.logger=t.getLogger()}createTextureInfoDef(t,e){const r={magFilter:e.getMagFilter()||void 0,minFilter:e.getMinFilter()||void 0,wrapS:e.getWrapS(),wrapT:e.getWrapT()},s=JSON.stringify(r);this.samplerDefIndexMap.has(s)||(this.samplerDefIndexMap.set(s,this.jsonDoc.json.samplers.length),this.jsonDoc.json.samplers.push(r));const n={source:this.imageIndexMap.get(t),sampler:this.samplerDefIndexMap.get(s)},i=JSON.stringify(n);this.textureDefIndexMap.has(i)||(this.textureDefIndexMap.set(i,this.jsonDoc.json.textures.length),this.jsonDoc.json.textures.push(n));const o={index:this.textureDefIndexMap.get(i)};return 0!==e.getTexCoord()&&(o.texCoord=e.getTexCoord()),Object.keys(e.getExtras()).length>0&&(o.extras=e.getExtras()),this.textureInfoDefMap.set(e,o),o}createPropertyDef(t){const e={};return t.getName()&&(e.name=t.getName()),Object.keys(t.getExtras()).length>0&&(e.extras=t.getExtras()),e}createAccessorDef(t){const e=this.createPropertyDef(t);return e.type=t.getType(),e.componentType=t.getComponentType(),e.count=t.getCount(),this.O.getGraph().listParentEdges(t).some(t=>\"attributes\"===t.getName()&&\"POSITION\"===t.getAttributes().key||\"input\"===t.getName())&&(e.max=t.getMax([]).map(Math.fround),e.min=t.getMin([]).map(Math.fround)),t.getNormalized()&&(e.normalized=t.getNormalized()),e}createImageData(t,e,r){if(this.options.format===g.GLB)this.imageBufferViews.push(e),t.bufferView=this.jsonDoc.json.bufferViews.length,this.jsonDoc.json.bufferViews.push({buffer:0,byteOffset:-1,byteLength:e.byteLength});else{const s=I.mimeTypeToExtension(r.getMimeType());t.uri=this.imageURIGenerator.createURI(r,s),this.jsonDoc.resources[t.uri]=e}}getAccessorUsage(t){const e=this.C.get(t);if(e)return e;if(t.getSparse())return l.SPARSE;for(const e of this.O.getGraph().listParentEdges(t)){const{usage:t}=e.getAttributes();if(t)return t;e.getParent().propertyType!==h.ROOT&&this.logger.warn(`Missing attribute \".usage\" on edge, \"${e.getName()}\".`)}return l.OTHER}addAccessorToUsageGroup(t,e){const r=this.C.get(t);if(r&&r!==e)throw new Error(`Accessor with usage \"${r}\" cannot be reused as \"${e}\".`);return this.C.set(t,e),this}listAccessorUsageGroups(){const t={};for(const[e,r]of Array.from(this.C.entries()))t[r]=t[r]||[],t[r].push(e);return t}}Mt.BufferViewTarget=Et,Mt.BufferViewUsage=l,Mt.USAGE_TO_TARGET={[l.ARRAY_BUFFER]:Et.ARRAY_BUFFER,[l.ELEMENT_ARRAY_BUFFER]:Et.ELEMENT_ARRAY_BUFFER};class St{constructor(t,e){this.multiple=void 0,this.basename=void 0,this.counter={},this.multiple=t,this.basename=e}createURI(t,e){if(t.getURI())return t.getURI();if(this.multiple){const r=this.basename(t);return this.counter[r]=this.counter[r]||1,`${r}_${this.counter[r]++}.${e}`}return`${this.basename(t)}.${e}`}}const{BufferViewUsage:It}=Mt,{UNSIGNED_INT:Rt,UNSIGNED_SHORT:Nt,UNSIGNED_BYTE:Ot}=K.ComponentType;var Ct;!function(t){t[t.JSON=1313821514]=\"JSON\",t[t.BIN=5130562]=\"BIN\"}(Ct||(Ct={}));class Ft{constructor(){this.M=U.DEFAULT_INSTANCE,this.h=new Set,this.F={},this.U=f.INTERLEAVED,this.lastReadBytes=0,this.lastWriteBytes=0}setLogger(t){return this.M=t,this}registerExtensions(t){for(const e of t)this.h.add(e),e.register();return this}registerDependencies(t){return Object.assign(this.F,t),this}setVertexLayout(t){return this.U=t,this}async read(t){return await this.readJSON(await this.readAsJSON(t))}async readAsJSON(t){const e=await this.readURI(t,\"view\");this.lastReadBytes=e.byteLength;const r=Ut(e)?this.P(e):{json:JSON.parse(E.decodeText(e)),resources:{}};return await this.L(r,this.dirname(t)),this.j(r),r}async readJSON(t){return t=this.D(t),this.j(t),class{static read(t,e=xt){const r=gt({},xt,e),{json:s}=t,n=(new vt).setLogger(r.logger);this.validate(t,r);const i=new bt(t),o=s.asset,a=n.getRoot().getAsset();o.copyright&&(a.copyright=o.copyright),o.extras&&(a.extras=o.extras),void 0!==s.extras&&n.getRoot().setExtras(gt({},s.extras));const u=s.extensionsUsed||[],c=s.extensionsRequired||[];for(const t of r.extensions)if(u.includes(t.EXTENSION_NAME)){const e=n.createExtension(t).setRequired(c.includes(t.EXTENSION_NAME));for(const t of e.readDependencies)e.install(t,r.dependencies[t])}const f=s.buffers||[];n.getRoot().listExtensionsUsed().filter(t=>t.prereadTypes.includes(h.BUFFER)).forEach(t=>t.preread(i,h.BUFFER)),i.buffers=f.map(t=>{const e=n.createBuffer(t.name);return t.extras&&e.setExtras(t.extras),t.uri&&0!==t.uri.indexOf(\"__\")&&e.setURI(t.uri),e}),i.bufferViewBuffers=(s.bufferViews||[]).map((e,r)=>{if(!i.bufferViews[r]){const s=t.json.buffers[e.buffer];i.bufferViews[r]=E.toView(s.uri?t.resources[s.uri]:t.resources[\"@glb.bin\"],e.byteOffset||0,e.byteLength)}return i.buffers[e.buffer]});const l=s.accessors||[];i.accessors=l.map(t=>{const e=n.createAccessor(t.name,i.bufferViewBuffers[t.bufferView]).setType(t.type);return t.extras&&e.setExtras(t.extras),void 0!==t.normalized&&e.setNormalized(t.normalized),void 0===t.bufferView||e.setArray(At(t,i)),e});const d=s.images||[],g=s.textures||[];n.getRoot().listExtensionsUsed().filter(t=>t.prereadTypes.includes(h.TEXTURE)).forEach(t=>t.preread(i,h.TEXTURE)),i.textures=d.map(e=>{const r=n.createTexture(e.name);if(e.extras&&r.setExtras(e.extras),void 0!==e.bufferView){const n=s.bufferViews[e.bufferView],i=t.json.buffers[n.buffer],o=n.byteOffset||0,a=(i.uri?t.resources[i.uri]:t.resources[\"@glb.bin\"]).slice(o,o+n.byteLength);r.setImage(a)}else void 0!==e.uri&&(r.setImage(t.resources[e.uri]),0!==e.uri.indexOf(\"__\")&&r.setURI(e.uri));if(void 0!==e.mimeType)r.setMimeType(e.mimeType);else if(e.uri){const t=N.extension(e.uri);r.setMimeType(I.extensionToMimeType(t))}return r}),i.materials=(s.materials||[]).map(t=>{const e=n.createMaterial(t.name);t.extras&&e.setExtras(t.extras),void 0!==t.alphaMode&&e.setAlphaMode(t.alphaMode),void 0!==t.alphaCutoff&&e.setAlphaCutoff(t.alphaCutoff),void 0!==t.doubleSided&&e.setDoubleSided(t.doubleSided);const r=t.pbrMetallicRoughness||{};if(void 0!==r.baseColorFactor&&e.setBaseColorFactor(r.baseColorFactor),void 0!==t.emissiveFactor&&e.setEmissiveFactor(t.emissiveFactor),void 0!==r.metallicFactor&&e.setMetallicFactor(r.metallicFactor),void 0!==r.roughnessFactor&&e.setRoughnessFactor(r.roughnessFactor),void 0!==r.baseColorTexture){const t=r.baseColorTexture;e.setBaseColorTexture(i.textures[g[t.index].source]),i.setTextureInfo(e.getBaseColorTextureInfo(),t)}if(void 0!==t.emissiveTexture){const r=t.emissiveTexture;e.setEmissiveTexture(i.textures[g[r.index].source]),i.setTextureInfo(e.getEmissiveTextureInfo(),r)}if(void 0!==t.normalTexture){const r=t.normalTexture;e.setNormalTexture(i.textures[g[r.index].source]),i.setTextureInfo(e.getNormalTextureInfo(),r),void 0!==t.normalTexture.scale&&e.setNormalScale(t.normalTexture.scale)}if(void 0!==t.occlusionTexture){const r=t.occlusionTexture;e.setOcclusionTexture(i.textures[g[r.index].source]),i.setTextureInfo(e.getOcclusionTextureInfo(),r),void 0!==t.occlusionTexture.strength&&e.setOcclusionStrength(t.occlusionTexture.strength)}if(void 0!==r.metallicRoughnessTexture){const t=r.metallicRoughnessTexture;e.setMetallicRoughnessTexture(i.textures[g[t.index].source]),i.setTextureInfo(e.getMetallicRoughnessTextureInfo(),t)}return e});const m=s.meshes||[];n.getRoot().listExtensionsUsed().filter(t=>t.prereadTypes.includes(h.PRIMITIVE)).forEach(t=>t.preread(i,h.PRIMITIVE)),i.meshes=m.map(t=>{const e=n.createMesh(t.name);return t.extras&&e.setExtras(t.extras),void 0!==t.weights&&e.setWeights(t.weights),(t.primitives||[]).forEach(r=>{const s=n.createPrimitive();r.extras&&s.setExtras(r.extras),void 0!==r.material&&s.setMaterial(i.materials[r.material]),void 0!==r.mode&&s.setMode(r.mode);for(const[t,e]of Object.entries(r.attributes||{}))s.setAttribute(t,i.accessors[e]);void 0!==r.indices&&s.setIndices(i.accessors[r.indices]);const o=t.extras&&t.extras.targetNames||[];(r.targets||[]).forEach((t,e)=>{const r=o[e]||e.toString(),a=n.createPrimitiveTarget(r);for(const[e,r]of Object.entries(t))a.setAttribute(e,i.accessors[r]);s.addTarget(a)}),e.addPrimitive(s)}),e}),i.cameras=(s.cameras||[]).map(t=>{const e=n.createCamera(t.name).setType(t.type);if(t.extras&&e.setExtras(t.extras),t.type===rt.Type.PERSPECTIVE){const r=t.perspective;e.setYFov(r.yfov),e.setZNear(r.znear),void 0!==r.zfar&&e.setZFar(r.zfar),void 0!==r.aspectRatio&&e.setAspectRatio(r.aspectRatio)}else{const r=t.orthographic;e.setZNear(r.znear).setZFar(r.zfar).setXMag(r.xmag).setYMag(r.ymag)}return e});const w=s.nodes||[];n.getRoot().listExtensionsUsed().filter(t=>t.prereadTypes.includes(h.NODE)).forEach(t=>t.preread(i,h.NODE)),i.nodes=w.map(t=>{const e=n.createNode(t.name);if(t.extras&&e.setExtras(t.extras),void 0!==t.translation&&e.setTranslation(t.translation),void 0!==t.rotation&&e.setRotation(t.rotation),void 0!==t.scale&&e.setScale(t.scale),void 0!==t.matrix){const r=[0,0,0],s=[0,0,0,1],n=[1,1,1];P.decompose(t.matrix,r,s,n),e.setTranslation(r),e.setRotation(s),e.setScale(n)}return void 0!==t.weights&&e.setWeights(t.weights),e}),i.skins=(s.skins||[]).map(t=>{const e=n.createSkin(t.name);t.extras&&e.setExtras(t.extras),void 0!==t.inverseBindMatrices&&e.setInverseBindMatrices(i.accessors[t.inverseBindMatrices]),void 0!==t.skeleton&&e.setSkeleton(i.nodes[t.skeleton]);for(const r of t.joints)e.addJoint(i.nodes[r]);return e}),w.map((t,e)=>{const r=i.nodes[e];(t.children||[]).forEach(t=>r.addChild(i.nodes[t])),void 0!==t.mesh&&r.setMesh(i.meshes[t.mesh]),void 0!==t.camera&&r.setCamera(i.cameras[t.camera]),void 0!==t.skin&&r.setSkin(i.skins[t.skin])}),i.animations=(s.animations||[]).map(t=>{const e=n.createAnimation(t.name);t.extras&&e.setExtras(t.extras);const r=(t.samplers||[]).map(t=>{const r=n.createAnimationSampler().setInput(i.accessors[t.input]).setOutput(i.accessors[t.output]).setInterpolation(t.interpolation||tt.Interpolation.LINEAR);return t.extras&&r.setExtras(t.extras),e.addSampler(r),r});return(t.channels||[]).forEach(t=>{const s=n.createAnimationChannel().setSampler(r[t.sampler]).setTargetPath(t.target.path);void 0!==t.target.node&&s.setTargetNode(i.nodes[t.target.node]),t.extras&&s.setExtras(t.extras),e.addChannel(s)}),e});const y=s.scenes||[];return n.getRoot().listExtensionsUsed().filter(t=>t.prereadTypes.includes(h.SCENE)).forEach(t=>t.preread(i,h.SCENE)),i.scenes=y.map(t=>{const e=n.createScene(t.name);return t.extras&&e.setExtras(t.extras),(t.nodes||[]).map(t=>i.nodes[t]).forEach(t=>e.addChild(t)),e}),void 0!==s.scene&&n.getRoot().setDefaultScene(i.scenes[s.scene]),n.getRoot().listExtensionsUsed().forEach(t=>t.read(i)),l.forEach((t,e)=>{const r=i.accessors[e],s=!!t.sparse,n=!t.bufferView&&!r.getArray();(s||n)&&r.setSparse(!0).setArray(function(t,e){const r=p[t.componentType],s=K.getElementSize(t.type);let n;n=void 0!==t.bufferView?At(t,e):new r(t.count*s);const i=t.sparse;if(!i)return n;const o=i.count,a=gt({},t,i.indices,{count:o,type:\"SCALAR\"}),u=gt({},t,i.values,{count:o}),c=At(a,e),h=At(u,e);for(let t=0;t<a.count;t++)for(let e=0;e<s;e++)n[c[t]*s+e]=h[t*s+e];return n}(t,i))}),n}static validate(t,e){const r=t.json;if(\"2.0\"!==r.asset.version)throw new Error(`Unsupported glTF version, \"${r.asset.version}\".`);if(r.extensionsRequired)for(const t of r.extensionsRequired)if(!e.extensions.find(e=>e.EXTENSION_NAME===t))throw new Error(`Missing required extension, \"${t}\".`);if(r.extensionsUsed)for(const t of r.extensionsUsed)e.extensions.find(e=>e.EXTENSION_NAME===t)||e.logger.warn(`Missing optional extension, \"${t}\".`)}}.read(t,{extensions:Array.from(this.h),dependencies:this.F,logger:this.M})}async binaryToJSON(t){const e=this.P(E.assertView(t));this.j(e);const r=e.json;if(r.buffers&&r.buffers.some(t=>function(t,e){return void 0!==e.uri&&!(e.uri in t.resources)}(e,t)))throw new Error(\"Cannot resolve external buffers with binaryToJSON().\");if(r.images&&r.images.some(t=>function(t,e){return void 0!==e.uri&&!(e.uri in t.resources)&&void 0===e.bufferView}(e,t)))throw new Error(\"Cannot resolve external images with binaryToJSON().\");return e}async readBinary(t){return this.readJSON(await this.binaryToJSON(E.assertView(t)))}async writeJSON(t,e={}){if(e.format===g.GLB&&t.getRoot().listBuffers().length>1)throw new Error(\"GLB must have 0–1 buffers.\");return class{static write(t,e){const r=t.getRoot(),s={asset:gt({generator:\"glTF-Transform v3.2.1\"},r.getAsset()),extras:gt({},r.getExtras())},n={json:s,resources:{}},i=new Mt(t,n,e),o=e.logger||U.DEFAULT_INSTANCE,a=new Set(e.extensions.map(t=>t.EXTENSION_NAME)),u=t.getRoot().listExtensionsUsed().filter(t=>a.has(t.extensionName)),c=t.getRoot().listExtensionsRequired().filter(t=>a.has(t.extensionName));u.length<t.getRoot().listExtensionsUsed().length&&o.warn(\"Some extensions were not registered for I/O, and will not be written.\");for(const t of u)for(const r of t.writeDependencies)t.install(r,e.dependencies[r]);function l(t,e,r,n){const o=[];let a=0;for(const e of t){const t=i.createAccessorDef(e);t.bufferView=s.bufferViews.length;const r=e.getArray(),n=E.pad(E.toView(r));t.byteOffset=a,a+=n.byteLength,o.push(n),i.accessorIndexMap.set(e,s.accessors.length),s.accessors.push(t)}const u={buffer:e,byteOffset:r,byteLength:E.concat(o).byteLength};return n&&(u.target=n),s.bufferViews.push(u),{buffers:o,byteLength:a}}function d(t,e,r){const n=t[0].getCount();let o=0;for(const e of t){const t=i.createAccessorDef(e);t.bufferView=s.bufferViews.length,t.byteOffset=o;const r=e.getElementSize(),n=e.getComponentSize();o+=E.padNumber(r*n),i.accessorIndexMap.set(e,s.accessors.length),s.accessors.push(t)}const a=n*o,u=new ArrayBuffer(a),c=new DataView(u);for(let e=0;e<n;e++){let r=0;for(const s of t){const t=s.getElementSize(),n=s.getComponentSize(),i=s.getComponentType(),a=s.getArray();for(let s=0;s<t;s++){const u=e*o+r+s*n,h=a[e*t+s];switch(i){case K.ComponentType.FLOAT:c.setFloat32(u,h,!0);break;case K.ComponentType.BYTE:c.setInt8(u,h);break;case K.ComponentType.SHORT:c.setInt16(u,h,!0);break;case K.ComponentType.UNSIGNED_BYTE:c.setUint8(u,h);break;case K.ComponentType.UNSIGNED_SHORT:c.setUint16(u,h,!0);break;case K.ComponentType.UNSIGNED_INT:c.setUint32(u,h,!0);break;default:throw new Error(\"Unexpected component type: \"+i)}}r+=E.padNumber(t*n)}}return s.bufferViews.push({buffer:e,byteOffset:r,byteLength:a,byteStride:o,target:Mt.BufferViewTarget.ARRAY_BUFFER}),{byteLength:a,buffers:[new Uint8Array(u)]}}function m(t,e,r){const n=[];let a=0;const u=new Map;let c=-Infinity;for(const e of t){const t=i.createAccessorDef(e);s.accessors.push(t),i.accessorIndexMap.set(e,s.accessors.length-1);const r=[],n=[],a=[],h=new Array(e.getElementSize()).fill(0);for(let t=0,s=e.getCount();t<s;t++)if(e.getElement(t,a),!P.eq(a,h,0)){c=Math.max(t,c),r.push(t);for(let t=0;t<a.length;t++)n.push(a[t])}const f=r.length,l={accessorDef:t,count:f};if(u.set(e,l),0===f)continue;if(f>e.getCount()/3){const t=(100*r.length/e.getCount()).toFixed(1);o.warn(`Sparse accessor with many non-zero elements (${t}%) may increase file size.`)}const d=p[e.getComponentType()];l.indices=r,l.values=new d(n)}if(!Number.isFinite(c))return{buffers:n,byteLength:a};const h=c<255?Uint8Array:c<65535?Uint16Array:Uint32Array,f=c<255?Ot:c<65535?Nt:Rt,l={buffer:e,byteOffset:r+a,byteLength:0};for(const e of t){const t=u.get(e);if(0===t.count)continue;t.indicesByteOffset=l.byteLength;const r=E.pad(E.toView(new h(t.indices)));n.push(r),a+=r.byteLength,l.byteLength+=r.byteLength}s.bufferViews.push(l);const d=s.bufferViews.length-1,g={buffer:e,byteOffset:r+a,byteLength:0};for(const e of t){const t=u.get(e);if(0===t.count)continue;t.valuesByteOffset=g.byteLength;const r=E.pad(E.toView(t.values));n.push(r),a+=r.byteLength,g.byteLength+=r.byteLength}s.bufferViews.push(g);const m=s.bufferViews.length-1;for(const e of t){const t=u.get(e);0!==t.count&&(t.accessorDef.sparse={count:t.count,indices:{bufferView:d,byteOffset:t.indicesByteOffset,componentType:f},values:{bufferView:m,byteOffset:t.valuesByteOffset}})}return{buffers:n,byteLength:a}}const w=new Map;for(const e of t.getGraph().listEdges()){if(e.getParent()===r)continue;const t=e.getChild();if(t instanceof K){const r=w.get(t)||[];r.push(e),w.set(t,r)}}if(s.accessors=[],s.bufferViews=[],s.samplers=[],s.textures=[],s.images=r.listTextures().map((t,e)=>{const r=i.createPropertyDef(t);t.getMimeType()&&(r.mimeType=t.getMimeType());const s=t.getImage();return s&&i.createImageData(r,s,t),i.imageIndexMap.set(t,e),r}),u.filter(t=>t.prewriteTypes.includes(h.ACCESSOR)).forEach(t=>t.prewrite(i,h.ACCESSOR)),r.listAccessors().forEach(t=>{const e=i.accessorUsageGroupedByParent,r=i.accessorParents;if(i.accessorIndexMap.has(t))return;const s=w.get(t)||[],n=i.getAccessorUsage(t);if(i.addAccessorToUsageGroup(t,n),e.has(n)){const e=s[0].getParent(),n=r.get(e)||new Set;n.add(t),r.set(e,n)}}),u.filter(t=>t.prewriteTypes.includes(h.BUFFER)).forEach(t=>t.prewrite(i,h.BUFFER)),(r.listAccessors().length>0||r.listTextures().length>0||i.otherBufferViews.size>0)&&0===r.listBuffers().length)throw new Error(\"Buffer required for Document resources, but none was found.\");s.buffers=[],r.listBuffers().forEach((t,r)=>{const o=i.createPropertyDef(t),a=i.accessorUsageGroupedByParent,u=i.accessorParents,c=t.listParents().filter(t=>t instanceof K),h=new Set(c),p=[],w=s.buffers.length;let y=0;const v=i.listAccessorUsageGroups();for(const t in v)if(a.has(t))for(const r of Array.from(u.values())){const s=Array.from(r).filter(t=>h.has(t)).filter(e=>i.getAccessorUsage(e)===t);if(s.length)if(t!==It.ARRAY_BUFFER||e.vertexLayout===f.INTERLEAVED){const e=t===It.ARRAY_BUFFER?d(s,w,y):l(s,w,y);y+=e.byteLength,p.push(...e.buffers)}else for(const t of s){const e=d([t],w,y);y+=e.byteLength,p.push(...e.buffers)}}else{const e=v[t].filter(t=>h.has(t));if(!e.length)continue;const r=t===It.ELEMENT_ARRAY_BUFFER?Mt.BufferViewTarget.ELEMENT_ARRAY_BUFFER:void 0,s=t===It.SPARSE?m(e,w,y):l(e,w,y,r);y+=s.byteLength,p.push(...s.buffers)}if(i.imageBufferViews.length&&0===r)for(let t=0;t<i.imageBufferViews.length;t++)if(s.bufferViews[s.images[t].bufferView].byteOffset=y,y+=i.imageBufferViews[t].byteLength,p.push(i.imageBufferViews[t]),y%8){const t=8-y%8;y+=t,p.push(new Uint8Array(t))}if(i.otherBufferViews.has(t))for(const e of i.otherBufferViews.get(t))s.bufferViews.push({buffer:w,byteOffset:y,byteLength:e.byteLength}),i.otherBufferViewsIndexMap.set(e,s.bufferViews.length-1),y+=e.byteLength,p.push(e);if(y){let r;e.format===g.GLB?r=\"@glb.bin\":(r=i.bufferURIGenerator.createURI(t,\"bin\"),o.uri=r),o.byteLength=y,n.resources[r]=E.concat(p)}s.buffers.push(o),i.bufferIndexMap.set(t,r)}),r.listAccessors().find(t=>!t.getBuffer())&&o.warn(\"Skipped writing one or more Accessors: no Buffer assigned.\"),s.materials=r.listMaterials().map((t,e)=>{const r=i.createPropertyDef(t);if(t.getAlphaMode()!==ct.AlphaMode.OPAQUE&&(r.alphaMode=t.getAlphaMode()),t.getAlphaMode()===ct.AlphaMode.MASK&&(r.alphaCutoff=t.getAlphaCutoff()),t.getDoubleSided()&&(r.doubleSided=!0),r.pbrMetallicRoughness={},P.eq(t.getBaseColorFactor(),[1,1,1,1])||(r.pbrMetallicRoughness.baseColorFactor=t.getBaseColorFactor()),P.eq(t.getEmissiveFactor(),[0,0,0])||(r.emissiveFactor=t.getEmissiveFactor()),1!==t.getRoughnessFactor()&&(r.pbrMetallicRoughness.roughnessFactor=t.getRoughnessFactor()),1!==t.getMetallicFactor()&&(r.pbrMetallicRoughness.metallicFactor=t.getMetallicFactor()),t.getBaseColorTexture()){const e=t.getBaseColorTexture(),s=t.getBaseColorTextureInfo();r.pbrMetallicRoughness.baseColorTexture=i.createTextureInfoDef(e,s)}if(t.getEmissiveTexture()){const e=t.getEmissiveTexture(),s=t.getEmissiveTextureInfo();r.emissiveTexture=i.createTextureInfoDef(e,s)}if(t.getNormalTexture()){const e=t.getNormalTexture(),s=t.getNormalTextureInfo(),n=i.createTextureInfoDef(e,s);1!==t.getNormalScale()&&(n.scale=t.getNormalScale()),r.normalTexture=n}if(t.getOcclusionTexture()){const e=t.getOcclusionTexture(),s=t.getOcclusionTextureInfo(),n=i.createTextureInfoDef(e,s);1!==t.getOcclusionStrength()&&(n.strength=t.getOcclusionStrength()),r.occlusionTexture=n}if(t.getMetallicRoughnessTexture()){const e=t.getMetallicRoughnessTexture(),s=t.getMetallicRoughnessTextureInfo();r.pbrMetallicRoughness.metallicRoughnessTexture=i.createTextureInfoDef(e,s)}return i.materialIndexMap.set(t,e),r}),s.meshes=r.listMeshes().map((t,e)=>{const r=i.createPropertyDef(t);let s=null;return r.primitives=t.listPrimitives().map(t=>{const e={attributes:{}};e.mode=t.getMode();const r=t.getMaterial();r&&(e.material=i.materialIndexMap.get(r)),Object.keys(t.getExtras()).length&&(e.extras=t.getExtras());const n=t.getIndices();n&&(e.indices=i.accessorIndexMap.get(n));for(const r of t.listSemantics())e.attributes[r]=i.accessorIndexMap.get(t.getAttribute(r));for(const r of t.listTargets()){const t={};for(const e of r.listSemantics())t[e]=i.accessorIndexMap.get(r.getAttribute(e));e.targets=e.targets||[],e.targets.push(t)}return t.listTargets().length&&!s&&(s=t.listTargets().map(t=>t.getName())),e}),t.getWeights().length&&(r.weights=t.getWeights()),s&&(r.extras=r.extras||{},r.extras.targetNames=s),i.meshIndexMap.set(t,e),r}),s.cameras=r.listCameras().map((t,e)=>{const r=i.createPropertyDef(t);if(r.type=t.getType(),r.type===rt.Type.PERSPECTIVE){r.perspective={znear:t.getZNear(),zfar:t.getZFar(),yfov:t.getYFov()};const e=t.getAspectRatio();null!==e&&(r.perspective.aspectRatio=e)}else r.orthographic={znear:t.getZNear(),zfar:t.getZFar(),xmag:t.getXMag(),ymag:t.getYMag()};return i.cameraIndexMap.set(t,e),r}),s.nodes=r.listNodes().map((t,e)=>{const r=i.createPropertyDef(t);return P.eq(t.getTranslation(),[0,0,0])||(r.translation=t.getTranslation()),P.eq(t.getRotation(),[0,0,0,1])||(r.rotation=t.getRotation()),P.eq(t.getScale(),[1,1,1])||(r.scale=t.getScale()),t.getWeights().length&&(r.weights=t.getWeights()),i.nodeIndexMap.set(t,e),r}),s.skins=r.listSkins().map((t,e)=>{const r=i.createPropertyDef(t),s=t.getInverseBindMatrices();s&&(r.inverseBindMatrices=i.accessorIndexMap.get(s));const n=t.getSkeleton();return n&&(r.skeleton=i.nodeIndexMap.get(n)),r.joints=t.listJoints().map(t=>i.nodeIndexMap.get(t)),i.skinIndexMap.set(t,e),r}),r.listNodes().forEach((t,e)=>{const r=s.nodes[e],n=t.getMesh();n&&(r.mesh=i.meshIndexMap.get(n));const o=t.getCamera();o&&(r.camera=i.cameraIndexMap.get(o));const a=t.getSkin();a&&(r.skin=i.skinIndexMap.get(a)),t.listChildren().length>0&&(r.children=t.listChildren().map(t=>i.nodeIndexMap.get(t)))}),s.animations=r.listAnimations().map((t,e)=>{const r=i.createPropertyDef(t),s=new Map;return r.samplers=t.listSamplers().map((t,e)=>{const r=i.createPropertyDef(t);return r.input=i.accessorIndexMap.get(t.getInput()),r.output=i.accessorIndexMap.get(t.getOutput()),r.interpolation=t.getInterpolation(),s.set(t,e),r}),r.channels=t.listChannels().map(t=>{const e=i.createPropertyDef(t);return e.sampler=s.get(t.getSampler()),e.target={node:i.nodeIndexMap.get(t.getTargetNode()),path:t.getTargetPath()},e}),i.animationIndexMap.set(t,e),r}),s.scenes=r.listScenes().map((t,e)=>{const r=i.createPropertyDef(t);return r.nodes=t.listChildren().map(t=>i.nodeIndexMap.get(t)),i.sceneIndexMap.set(t,e),r});const y=r.getDefaultScene();return y&&(s.scene=r.listScenes().indexOf(y)),s.extensionsUsed=u.map(t=>t.extensionName),s.extensionsRequired=c.map(t=>t.extensionName),u.forEach(t=>t.write(i)),function(t){const e=[];for(const r in t){const s=t[r];(Array.isArray(s)&&0===s.length||null===s||\"\"===s||s&&\"object\"==typeof s&&0===Object.keys(s).length)&&e.push(r)}for(const r of e)delete t[r]}(s),n}}.write(t,{format:e.format||g.GLTF,basename:e.basename||\"\",logger:this.M,vertexLayout:this.U,dependencies:gt({},this.F),extensions:Array.from(this.h)})}async writeBinary(t){const{json:e,resources:r}=await this.writeJSON(t,{format:g.GLB}),s=new Uint32Array([1179937895,2,12]),n=JSON.stringify(e),i=E.pad(E.encodeText(n),32),o=E.toView(new Uint32Array([i.byteLength,1313821514])),a=E.concat([o,i]);s[s.length-1]+=a.byteLength;const u=Object.values(r)[0];if(!u||!u.byteLength)return E.concat([E.toView(s),a]);const c=E.pad(u,0),h=E.toView(new Uint32Array([c.byteLength,5130562])),f=E.concat([h,c]);return s[s.length-1]+=f.byteLength,E.concat([E.toView(s),a,f])}async L(t,e){var r=this;const s=[...t.json.images||[],...t.json.buffers||[]].map(async function(s){const n=s.uri;if(!n||n.match(/data:/))return Promise.resolve();t.resources[n]=await r.readURI(r.resolve(e,n),\"view\"),r.lastReadBytes+=t.resources[n].byteLength});await Promise.all(s)}j(t){function e(e){if(e.uri)if(e.uri in t.resources)E.assertView(t.resources[e.uri]);else if(e.uri.match(/data:/)){const r=`__${V()}.${N.extension(e.uri)}`;t.resources[r]=E.createBufferFromDataURI(e.uri),e.uri=r}}(t.json.images||[]).forEach(t=>{if(void 0===t.bufferView&&void 0===t.uri)throw new Error(\"Missing resource URI or buffer view.\");e(t)}),(t.json.buffers||[]).forEach(e)}D(t){const{images:e,buffers:r}=t.json;return t={json:gt({},t.json),resources:gt({},t.resources)},e&&(t.json.images=e.map(t=>gt({},t))),r&&(t.json.buffers=r.map(t=>gt({},t))),t}P(t){if(!Ut(t))throw new Error(\"Invalid glTF 2.0 binary.\");const e=new Uint32Array(t.buffer,t.byteOffset+12,2);if(e[1]!==Ct.JSON)throw new Error(\"Missing required GLB JSON chunk.\");const r=e[0],s=E.decodeText(E.toView(t,20,r)),n=JSON.parse(s),i=20+r;if(t.byteLength<=i)return{json:n,resources:{}};const o=new Uint32Array(t.buffer,t.byteOffset+i,2);if(o[1]!==Ct.BIN)throw new Error(\"Expected GLB BIN in second chunk.\");return{json:n,resources:{\"@glb.bin\":E.toView(t,i+8,o[0])}}}}function Ut(t){if(t.byteLength<3*Uint32Array.BYTES_PER_ELEMENT)return!1;const e=new Uint32Array(t.buffer,t.byteOffset,3);return 1179937895===e[0]&&2===e[1]}class Bt extends Ft{constructor(t=null,e=W.DEFAULT_INIT){super(),this._=void 0,this.k=void 0,this.J=void 0,this.$=!1,this._=t,this.k=e,this.J=this.init()}async init(){return this.J?this.J:Promise.all([import(\"fs\"),import(\"path\")]).then(([t,e])=>{this.V=t.promises,this.W=e})}setAllowHTTP(t){if(t&&!this._)throw new Error(\"NodeIO requires a Fetch API implementation for HTTP requests.\");return this.$=t,this}async readURI(t,e){if(await this.init(),W.isAbsoluteURL(t)){if(!this.$||!this._)throw new Error(\"Network request blocked. Allow HTTP requests explicitly, if needed.\");const r=await this._(t,this.k);switch(e){case\"view\":return new Uint8Array(await r.arrayBuffer());case\"text\":return r.text()}}else switch(e){case\"view\":return this.V.readFile(t);case\"text\":return this.V.readFile(t,\"utf8\")}}resolve(t,e){return W.isAbsoluteURL(t)||W.isAbsoluteURL(e)?W.resolve(t,e):this.W.resolve(t,e)}dirname(t){return W.isAbsoluteURL(t)?W.dirname(t):this.W.dirname(t)}async write(t,e){await this.init();const r=!!t.match(/\\.glb$/);await(r?this.q(t,e):this.H(t,e))}async H(t,e){var r=this;this.lastWriteBytes=0;const{json:s,resources:n}=await this.writeJSON(e,{format:g.GLTF,basename:N.basename(t)}),{V:i,W:o}=this,a=o.dirname(t),u=JSON.stringify(s,null,2);this.lastWriteBytes+=u.length,await i.writeFile(t,u);const c=Object.keys(n).map(async function(t){if(W.isAbsoluteURL(t)){if(\"bin\"===W.extension(t))throw new Error(`Cannot write buffer to path \"${t}\".`);return}const e=Buffer.from(n[t]),s=o.join(a,t);await i.mkdir(o.dirname(s),{recursive:!0}),await i.writeFile(s,e),r.lastWriteBytes+=e.byteLength});await Promise.all(c)}async q(t,e){const r=Buffer.from(await this.writeBinary(e));await this.V.writeFile(t,r),this.lastWriteBytes=r.byteLength}}class Pt extends Ft{constructor(t){super(),this.W=void 0,this.W=t}async readURI(t,e){switch(e){case\"view\":return Deno.readFile(t);case\"text\":return Deno.readTextFile(t)}}resolve(t,e){return this.W.resolve(t,e)}dirname(t){return this.W.dirname(t)}}class Lt extends Ft{constructor(t=W.DEFAULT_INIT){super(),this.k=void 0,this.k=t}async readURI(t,e){const r=await fetch(t,this.k);switch(e){case\"view\":return new Uint8Array(await r.arrayBuffer());case\"text\":return r.text()}}resolve(t,e){return W.resolve(t,e)}dirname(t){return W.dirname(t)}}export{K as Accessor,Q as Animation,X as AnimationChannel,tt as AnimationSampler,et as Buffer,E as BufferUtils,q as COPY_IDENTITY,rt as Camera,M as ColorUtils,p as ComponentTypeToTypedArray,Pt as DenoIO,vt as Document,Z as ExtensibleProperty,Tt as Extension,st as ExtensionProperty,N as FileUtils,g as Format,c as GLB_BUFFER,W as HTTPUtils,I as ImageUtils,U as Logger,ct as Material,P as MathUtils,ht as Mesh,ft as Node,Bt as NodeIO,Ft as PlatformIO,lt as Primitive,dt as PrimitiveTarget,Y as Property,h as PropertyType,bt as ReaderContext,yt as Root,pt as Scene,mt as Skin,wt as Texture,d as TextureChannel,nt as TextureInfo,u as VERSION,F as Verbosity,f as VertexLayout,Lt as WebIO,Mt as WriterContext,b as bounds,T as getBounds,V as uuid};\n//# sourceMappingURL=core.modern.js.map\n","///////////////////////////////////////////////////\n// KTX2 Header.\n///////////////////////////////////////////////////\nconst KHR_SUPERCOMPRESSION_NONE = 0;\nconst KHR_SUPERCOMPRESSION_BASISLZ = 1;\nconst KHR_SUPERCOMPRESSION_ZSTD = 2;\nconst KHR_SUPERCOMPRESSION_ZLIB = 3; ///////////////////////////////////////////////////\n// Data Format Descriptor (DFD).\n///////////////////////////////////////////////////\n\nconst KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT = 0;\nconst KHR_DF_VENDORID_KHRONOS = 0;\nconst KHR_DF_VERSION = 2;\nconst KHR_DF_MODEL_UNSPECIFIED = 0;\nconst KHR_DF_MODEL_RGBSDA = 1; // ...\n\nconst KHR_DF_MODEL_ETC1 = 160;\nconst KHR_DF_MODEL_ETC2 = 161;\nconst KHR_DF_MODEL_ASTC = 162;\nconst KHR_DF_MODEL_ETC1S = 163;\nconst KHR_DF_MODEL_UASTC = 166;\nconst KHR_DF_FLAG_ALPHA_STRAIGHT = 0;\nconst KHR_DF_FLAG_ALPHA_PREMULTIPLIED = 1;\nconst KHR_DF_TRANSFER_UNSPECIFIED = 0;\nconst KHR_DF_TRANSFER_LINEAR = 1;\nconst KHR_DF_TRANSFER_SRGB = 2;\nconst KHR_DF_TRANSFER_ITU = 3;\nconst KHR_DF_TRANSFER_NTSC = 4;\nconst KHR_DF_TRANSFER_SLOG = 5;\nconst KHR_DF_TRANSFER_SLOG2 = 6;\nconst KHR_DF_TRANSFER_BT1886 = 7;\nconst KHR_DF_TRANSFER_HLG_OETF = 8;\nconst KHR_DF_TRANSFER_HLG_EOTF = 9;\nconst KHR_DF_TRANSFER_PQ_EOTF = 10;\nconst KHR_DF_TRANSFER_PQ_OETF = 11;\nconst KHR_DF_TRANSFER_DCIP3 = 12;\nconst KHR_DF_TRANSFER_PAL_OETF = 13;\nconst KHR_DF_TRANSFER_PAL625_EOTF = 14;\nconst KHR_DF_TRANSFER_ST240 = 15;\nconst KHR_DF_TRANSFER_ACESCC = 16;\nconst KHR_DF_TRANSFER_ACESCCT = 17;\nconst KHR_DF_TRANSFER_ADOBERGB = 18;\nconst KHR_DF_PRIMARIES_UNSPECIFIED = 0;\nconst KHR_DF_PRIMARIES_BT709 = 1;\nconst KHR_DF_PRIMARIES_BT601_EBU = 2;\nconst KHR_DF_PRIMARIES_BT601_SMPTE = 3;\nconst KHR_DF_PRIMARIES_BT2020 = 4;\nconst KHR_DF_PRIMARIES_CIEXYZ = 5;\nconst KHR_DF_PRIMARIES_ACES = 6;\nconst KHR_DF_PRIMARIES_ACESCC = 7;\nconst KHR_DF_PRIMARIES_NTSC1953 = 8;\nconst KHR_DF_PRIMARIES_PAL525 = 9;\nconst KHR_DF_PRIMARIES_DISPLAYP3 = 10;\nconst KHR_DF_PRIMARIES_ADOBERGB = 11;\nconst KHR_DF_CHANNEL_RGBSDA_RED = 0;\nconst KHR_DF_CHANNEL_RGBSDA_GREEN = 1;\nconst KHR_DF_CHANNEL_RGBSDA_BLUE = 2;\nconst KHR_DF_CHANNEL_RGBSDA_STENCIL = 13;\nconst KHR_DF_CHANNEL_RGBSDA_DEPTH = 14;\nconst KHR_DF_CHANNEL_RGBSDA_ALPHA = 15;\nconst KHR_DF_SAMPLE_DATATYPE_FLOAT = 0x80;\nconst KHR_DF_SAMPLE_DATATYPE_SIGNED = 0x40;\nconst KHR_DF_SAMPLE_DATATYPE_EXPONENT = 0x20;\nconst KHR_DF_SAMPLE_DATATYPE_LINEAR = 0x10; ///////////////////////////////////////////////////\n// VK FORMAT.\n///////////////////////////////////////////////////\n\nconst VK_FORMAT_UNDEFINED = 0;\nconst VK_FORMAT_R4G4_UNORM_PACK8 = 1;\nconst VK_FORMAT_R4G4B4A4_UNORM_PACK16 = 2;\nconst VK_FORMAT_B4G4R4A4_UNORM_PACK16 = 3;\nconst VK_FORMAT_R5G6B5_UNORM_PACK16 = 4;\nconst VK_FORMAT_B5G6R5_UNORM_PACK16 = 5;\nconst VK_FORMAT_R5G5B5A1_UNORM_PACK16 = 6;\nconst VK_FORMAT_B5G5R5A1_UNORM_PACK16 = 7;\nconst VK_FORMAT_A1R5G5B5_UNORM_PACK16 = 8;\nconst VK_FORMAT_R8_UNORM = 9;\nconst VK_FORMAT_R8_SNORM = 10;\nconst VK_FORMAT_R8_UINT = 13;\nconst VK_FORMAT_R8_SINT = 14;\nconst VK_FORMAT_R8_SRGB = 15;\nconst VK_FORMAT_R8G8_UNORM = 16;\nconst VK_FORMAT_R8G8_SNORM = 17;\nconst VK_FORMAT_R8G8_UINT = 20;\nconst VK_FORMAT_R8G8_SINT = 21;\nconst VK_FORMAT_R8G8_SRGB = 22;\nconst VK_FORMAT_R8G8B8_UNORM = 23;\nconst VK_FORMAT_R8G8B8_SNORM = 24;\nconst VK_FORMAT_R8G8B8_UINT = 27;\nconst VK_FORMAT_R8G8B8_SINT = 28;\nconst VK_FORMAT_R8G8B8_SRGB = 29;\nconst VK_FORMAT_B8G8R8_UNORM = 30;\nconst VK_FORMAT_B8G8R8_SNORM = 31;\nconst VK_FORMAT_B8G8R8_UINT = 34;\nconst VK_FORMAT_B8G8R8_SINT = 35;\nconst VK_FORMAT_B8G8R8_SRGB = 36;\nconst VK_FORMAT_R8G8B8A8_UNORM = 37;\nconst VK_FORMAT_R8G8B8A8_SNORM = 38;\nconst VK_FORMAT_R8G8B8A8_UINT = 41;\nconst VK_FORMAT_R8G8B8A8_SINT = 42;\nconst VK_FORMAT_R8G8B8A8_SRGB = 43;\nconst VK_FORMAT_B8G8R8A8_UNORM = 44;\nconst VK_FORMAT_B8G8R8A8_SNORM = 45;\nconst VK_FORMAT_B8G8R8A8_UINT = 48;\nconst VK_FORMAT_B8G8R8A8_SINT = 49;\nconst VK_FORMAT_B8G8R8A8_SRGB = 50;\nconst VK_FORMAT_A2R10G10B10_UNORM_PACK32 = 58;\nconst VK_FORMAT_A2R10G10B10_SNORM_PACK32 = 59;\nconst VK_FORMAT_A2R10G10B10_UINT_PACK32 = 62;\nconst VK_FORMAT_A2R10G10B10_SINT_PACK32 = 63;\nconst VK_FORMAT_A2B10G10R10_UNORM_PACK32 = 64;\nconst VK_FORMAT_A2B10G10R10_SNORM_PACK32 = 65;\nconst VK_FORMAT_A2B10G10R10_UINT_PACK32 = 68;\nconst VK_FORMAT_A2B10G10R10_SINT_PACK32 = 69;\nconst VK_FORMAT_R16_UNORM = 70;\nconst VK_FORMAT_R16_SNORM = 71;\nconst VK_FORMAT_R16_UINT = 74;\nconst VK_FORMAT_R16_SINT = 75;\nconst VK_FORMAT_R16_SFLOAT = 76;\nconst VK_FORMAT_R16G16_UNORM = 77;\nconst VK_FORMAT_R16G16_SNORM = 78;\nconst VK_FORMAT_R16G16_UINT = 81;\nconst VK_FORMAT_R16G16_SINT = 82;\nconst VK_FORMAT_R16G16_SFLOAT = 83;\nconst VK_FORMAT_R16G16B16_UNORM = 84;\nconst VK_FORMAT_R16G16B16_SNORM = 85;\nconst VK_FORMAT_R16G16B16_UINT = 88;\nconst VK_FORMAT_R16G16B16_SINT = 89;\nconst VK_FORMAT_R16G16B16_SFLOAT = 90;\nconst VK_FORMAT_R16G16B16A16_UNORM = 91;\nconst VK_FORMAT_R16G16B16A16_SNORM = 92;\nconst VK_FORMAT_R16G16B16A16_UINT = 95;\nconst VK_FORMAT_R16G16B16A16_SINT = 96;\nconst VK_FORMAT_R16G16B16A16_SFLOAT = 97;\nconst VK_FORMAT_R32_UINT = 98;\nconst VK_FORMAT_R32_SINT = 99;\nconst VK_FORMAT_R32_SFLOAT = 100;\nconst VK_FORMAT_R32G32_UINT = 101;\nconst VK_FORMAT_R32G32_SINT = 102;\nconst VK_FORMAT_R32G32_SFLOAT = 103;\nconst VK_FORMAT_R32G32B32_UINT = 104;\nconst VK_FORMAT_R32G32B32_SINT = 105;\nconst VK_FORMAT_R32G32B32_SFLOAT = 106;\nconst VK_FORMAT_R32G32B32A32_UINT = 107;\nconst VK_FORMAT_R32G32B32A32_SINT = 108;\nconst VK_FORMAT_R32G32B32A32_SFLOAT = 109;\nconst VK_FORMAT_R64_UINT = 110;\nconst VK_FORMAT_R64_SINT = 111;\nconst VK_FORMAT_R64_SFLOAT = 112;\nconst VK_FORMAT_R64G64_UINT = 113;\nconst VK_FORMAT_R64G64_SINT = 114;\nconst VK_FORMAT_R64G64_SFLOAT = 115;\nconst VK_FORMAT_R64G64B64_UINT = 116;\nconst VK_FORMAT_R64G64B64_SINT = 117;\nconst VK_FORMAT_R64G64B64_SFLOAT = 118;\nconst VK_FORMAT_R64G64B64A64_UINT = 119;\nconst VK_FORMAT_R64G64B64A64_SINT = 120;\nconst VK_FORMAT_R64G64B64A64_SFLOAT = 121;\nconst VK_FORMAT_B10G11R11_UFLOAT_PACK32 = 122;\nconst VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 = 123;\nconst VK_FORMAT_D16_UNORM = 124;\nconst VK_FORMAT_X8_D24_UNORM_PACK32 = 125;\nconst VK_FORMAT_D32_SFLOAT = 126;\nconst VK_FORMAT_S8_UINT = 127;\nconst VK_FORMAT_D16_UNORM_S8_UINT = 128;\nconst VK_FORMAT_D24_UNORM_S8_UINT = 129;\nconst VK_FORMAT_D32_SFLOAT_S8_UINT = 130;\nconst VK_FORMAT_BC1_RGB_UNORM_BLOCK = 131;\nconst VK_FORMAT_BC1_RGB_SRGB_BLOCK = 132;\nconst VK_FORMAT_BC1_RGBA_UNORM_BLOCK = 133;\nconst VK_FORMAT_BC1_RGBA_SRGB_BLOCK = 134;\nconst VK_FORMAT_BC2_UNORM_BLOCK = 135;\nconst VK_FORMAT_BC2_SRGB_BLOCK = 136;\nconst VK_FORMAT_BC3_UNORM_BLOCK = 137;\nconst VK_FORMAT_BC3_SRGB_BLOCK = 138;\nconst VK_FORMAT_BC4_UNORM_BLOCK = 139;\nconst VK_FORMAT_BC4_SNORM_BLOCK = 140;\nconst VK_FORMAT_BC5_UNORM_BLOCK = 141;\nconst VK_FORMAT_BC5_SNORM_BLOCK = 142;\nconst VK_FORMAT_BC6H_UFLOAT_BLOCK = 143;\nconst VK_FORMAT_BC6H_SFLOAT_BLOCK = 144;\nconst VK_FORMAT_BC7_UNORM_BLOCK = 145;\nconst VK_FORMAT_BC7_SRGB_BLOCK = 146;\nconst VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK = 147;\nconst VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK = 148;\nconst VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK = 149;\nconst VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK = 150;\nconst VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK = 151;\nconst VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK = 152;\nconst VK_FORMAT_EAC_R11_UNORM_BLOCK = 153;\nconst VK_FORMAT_EAC_R11_SNORM_BLOCK = 154;\nconst VK_FORMAT_EAC_R11G11_UNORM_BLOCK = 155;\nconst VK_FORMAT_EAC_R11G11_SNORM_BLOCK = 156;\nconst VK_FORMAT_ASTC_4x4_UNORM_BLOCK = 157;\nconst VK_FORMAT_ASTC_4x4_SRGB_BLOCK = 158;\nconst VK_FORMAT_ASTC_5x4_UNORM_BLOCK = 159;\nconst VK_FORMAT_ASTC_5x4_SRGB_BLOCK = 160;\nconst VK_FORMAT_ASTC_5x5_UNORM_BLOCK = 161;\nconst VK_FORMAT_ASTC_5x5_SRGB_BLOCK = 162;\nconst VK_FORMAT_ASTC_6x5_UNORM_BLOCK = 163;\nconst VK_FORMAT_ASTC_6x5_SRGB_BLOCK = 164;\nconst VK_FORMAT_ASTC_6x6_UNORM_BLOCK = 165;\nconst VK_FORMAT_ASTC_6x6_SRGB_BLOCK = 166;\nconst VK_FORMAT_ASTC_8x5_UNORM_BLOCK = 167;\nconst VK_FORMAT_ASTC_8x5_SRGB_BLOCK = 168;\nconst VK_FORMAT_ASTC_8x6_UNORM_BLOCK = 169;\nconst VK_FORMAT_ASTC_8x6_SRGB_BLOCK = 170;\nconst VK_FORMAT_ASTC_8x8_UNORM_BLOCK = 171;\nconst VK_FORMAT_ASTC_8x8_SRGB_BLOCK = 172;\nconst VK_FORMAT_ASTC_10x5_UNORM_BLOCK = 173;\nconst VK_FORMAT_ASTC_10x5_SRGB_BLOCK = 174;\nconst VK_FORMAT_ASTC_10x6_UNORM_BLOCK = 175;\nconst VK_FORMAT_ASTC_10x6_SRGB_BLOCK = 176;\nconst VK_FORMAT_ASTC_10x8_UNORM_BLOCK = 177;\nconst VK_FORMAT_ASTC_10x8_SRGB_BLOCK = 178;\nconst VK_FORMAT_ASTC_10x10_UNORM_BLOCK = 179;\nconst VK_FORMAT_ASTC_10x10_SRGB_BLOCK = 180;\nconst VK_FORMAT_ASTC_12x10_UNORM_BLOCK = 181;\nconst VK_FORMAT_ASTC_12x10_SRGB_BLOCK = 182;\nconst VK_FORMAT_ASTC_12x12_UNORM_BLOCK = 183;\nconst VK_FORMAT_ASTC_12x12_SRGB_BLOCK = 184;\nconst VK_FORMAT_R10X6_UNORM_PACK16 = 1000156007;\nconst VK_FORMAT_R10X6G10X6_UNORM_2PACK16 = 1000156008;\nconst VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16 = 1000156009;\nconst VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16 = 1000156010;\nconst VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16 = 1000156011;\nconst VK_FORMAT_R12X4_UNORM_PACK16 = 1000156017;\nconst VK_FORMAT_R12X4G12X4_UNORM_2PACK16 = 1000156018;\nconst VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16 = 1000156019;\nconst VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16 = 1000156020;\nconst VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16 = 1000156021;\nconst VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG = 1000054000;\nconst VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG = 1000054001;\nconst VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG = 1000054002;\nconst VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG = 1000054003;\nconst VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG = 1000054004;\nconst VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG = 1000054005;\nconst VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG = 1000054006;\nconst VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG = 1000054007;\nconst VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT = 1000066000;\nconst VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT = 1000066001;\nconst VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT = 1000066002;\nconst VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT = 1000066003;\nconst VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT = 1000066004;\nconst VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT = 1000066005;\nconst VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT = 1000066006;\nconst VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT = 1000066007;\nconst VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT = 1000066008;\nconst VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT = 1000066009;\nconst VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT = 1000066010;\nconst VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT = 1000066011;\nconst VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT = 1000066012;\nconst VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT = 1000066013;\nconst VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT = 1000340000;\nconst VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT = 1000340001;\n\n/**\r\n * Represents an unpacked KTX 2.0 texture container. Data for individual mip levels are stored in\r\n * the `.levels` array, typically compressed in Basis Universal formats. Additional properties\r\n * provide metadata required to process, transcode, and upload these textures.\r\n */\n\nclass KTX2Container {\n constructor() {\n this.vkFormat = VK_FORMAT_UNDEFINED;\n this.typeSize = 1;\n this.pixelWidth = 0;\n this.pixelHeight = 0;\n this.pixelDepth = 0;\n this.layerCount = 0;\n this.faceCount = 1;\n this.supercompressionScheme = KHR_SUPERCOMPRESSION_NONE;\n this.levels = [];\n this.dataFormatDescriptor = [{\n vendorId: KHR_DF_VENDORID_KHRONOS,\n descriptorType: KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,\n descriptorBlockSize: 0,\n versionNumber: KHR_DF_VERSION,\n colorModel: KHR_DF_MODEL_UNSPECIFIED,\n colorPrimaries: KHR_DF_PRIMARIES_BT709,\n transferFunction: KHR_DF_TRANSFER_SRGB,\n flags: KHR_DF_FLAG_ALPHA_STRAIGHT,\n texelBlockDimension: [0, 0, 0, 0],\n bytesPlane: [0, 0, 0, 0, 0, 0, 0, 0],\n samples: []\n }];\n this.keyValue = {};\n this.globalData = null;\n }\n\n}\n\nclass BufferReader {\n constructor(data, byteOffset, byteLength, littleEndian) {\n this._dataView = void 0;\n this._littleEndian = void 0;\n this._offset = void 0;\n this._dataView = new DataView(data.buffer, data.byteOffset + byteOffset, byteLength);\n this._littleEndian = littleEndian;\n this._offset = 0;\n }\n\n _nextUint8() {\n const value = this._dataView.getUint8(this._offset);\n\n this._offset += 1;\n return value;\n }\n\n _nextUint16() {\n const value = this._dataView.getUint16(this._offset, this._littleEndian);\n\n this._offset += 2;\n return value;\n }\n\n _nextUint32() {\n const value = this._dataView.getUint32(this._offset, this._littleEndian);\n\n this._offset += 4;\n return value;\n }\n\n _nextUint64() {\n const left = this._dataView.getUint32(this._offset, this._littleEndian);\n\n const right = this._dataView.getUint32(this._offset + 4, this._littleEndian); // TODO(cleanup): Just test this...\n // const value = this._littleEndian ? left + (2 ** 32 * right) : (2 ** 32 * left) + right;\n\n\n const value = left + 2 ** 32 * right;\n this._offset += 8;\n return value;\n }\n\n _nextInt32() {\n const value = this._dataView.getInt32(this._offset, this._littleEndian);\n\n this._offset += 4;\n return value;\n }\n\n _skip(bytes) {\n this._offset += bytes;\n return this;\n }\n\n _scan(maxByteLength, term = 0x00) {\n const byteOffset = this._offset;\n let byteLength = 0;\n\n while (this._dataView.getUint8(this._offset) !== term && byteLength < maxByteLength) {\n byteLength++;\n this._offset++;\n }\n\n if (byteLength < maxByteLength) this._offset++;\n return new Uint8Array(this._dataView.buffer, this._dataView.byteOffset + byteOffset, byteLength);\n }\n\n}\n\n///////////////////////////////////////////////////\n// Common.\n///////////////////////////////////////////////////\nconst KTX_WRITER = `KTX-Parse v${\"0.5.0\"}`;\nconst NUL = new Uint8Array([0x00]); ///////////////////////////////////////////////////\n// KTX2 Header.\n///////////////////////////////////////////////////\n\nconst KTX2_ID = [// '´', 'K', 'T', 'X', '2', '0', 'ª', '\\r', '\\n', '\\x1A', '\\n'\n0xab, 0x4b, 0x54, 0x58, 0x20, 0x32, 0x30, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a];\nconst HEADER_BYTE_LENGTH = 68; // 13 * 4 + 2 * 8\n\n/** Encodes text to an ArrayBuffer. */\nfunction encodeText(text) {\n if (typeof TextEncoder !== 'undefined') {\n return new TextEncoder().encode(text);\n }\n\n return Buffer.from(text);\n}\n/** Decodes an ArrayBuffer to text. */\n\nfunction decodeText(buffer) {\n if (typeof TextDecoder !== 'undefined') {\n return new TextDecoder().decode(buffer);\n }\n\n return Buffer.from(buffer).toString('utf8');\n}\n/** Concatenates N ArrayBuffers. */\n\nfunction concat(buffers) {\n let totalByteLength = 0;\n\n for (const buffer of buffers) {\n totalByteLength += buffer.byteLength;\n }\n\n const result = new Uint8Array(totalByteLength);\n let byteOffset = 0;\n\n for (const buffer of buffers) {\n result.set(new Uint8Array(buffer), byteOffset);\n byteOffset += buffer.byteLength;\n }\n\n return result;\n}\n\n/**\r\n * Parses a KTX 2.0 file, returning an unpacked {@link KTX2Container} instance with all associated\r\n * data. The container's mip levels and other binary data are pointers into the original file, not\r\n * copies, so the original file should not be overwritten after reading.\r\n *\r\n * @param data Bytes of KTX 2.0 file, as Uint8Array or Buffer.\r\n */\n\nfunction read(data) {\n ///////////////////////////////////////////////////\n // KTX 2.0 Identifier.\n ///////////////////////////////////////////////////\n const id = new Uint8Array(data.buffer, data.byteOffset, KTX2_ID.length);\n\n if (id[0] !== KTX2_ID[0] || // '´'\n id[1] !== KTX2_ID[1] || // 'K'\n id[2] !== KTX2_ID[2] || // 'T'\n id[3] !== KTX2_ID[3] || // 'X'\n id[4] !== KTX2_ID[4] || // ' '\n id[5] !== KTX2_ID[5] || // '2'\n id[6] !== KTX2_ID[6] || // '0'\n id[7] !== KTX2_ID[7] || // 'ª'\n id[8] !== KTX2_ID[8] || // '\\r'\n id[9] !== KTX2_ID[9] || // '\\n'\n id[10] !== KTX2_ID[10] || // '\\x1A'\n id[11] !== KTX2_ID[11] // '\\n'\n ) {\n throw new Error('Missing KTX 2.0 identifier.');\n }\n\n const container = new KTX2Container(); ///////////////////////////////////////////////////\n // Header.\n ///////////////////////////////////////////////////\n\n const headerByteLength = 17 * Uint32Array.BYTES_PER_ELEMENT;\n const headerReader = new BufferReader(data, KTX2_ID.length, headerByteLength, true);\n container.vkFormat = headerReader._nextUint32();\n container.typeSize = headerReader._nextUint32();\n container.pixelWidth = headerReader._nextUint32();\n container.pixelHeight = headerReader._nextUint32();\n container.pixelDepth = headerReader._nextUint32();\n container.layerCount = headerReader._nextUint32();\n container.faceCount = headerReader._nextUint32();\n\n const levelCount = headerReader._nextUint32();\n\n container.supercompressionScheme = headerReader._nextUint32();\n\n const dfdByteOffset = headerReader._nextUint32();\n\n const dfdByteLength = headerReader._nextUint32();\n\n const kvdByteOffset = headerReader._nextUint32();\n\n const kvdByteLength = headerReader._nextUint32();\n\n const sgdByteOffset = headerReader._nextUint64();\n\n const sgdByteLength = headerReader._nextUint64(); ///////////////////////////////////////////////////\n // Level Index.\n ///////////////////////////////////////////////////\n\n\n const levelByteLength = levelCount * 3 * 8;\n const levelReader = new BufferReader(data, KTX2_ID.length + headerByteLength, levelByteLength, true);\n\n for (let i = 0; i < levelCount; i++) {\n container.levels.push({\n levelData: new Uint8Array(data.buffer, data.byteOffset + levelReader._nextUint64(), levelReader._nextUint64()),\n uncompressedByteLength: levelReader._nextUint64()\n });\n } ///////////////////////////////////////////////////\n // Data Format Descriptor (DFD).\n ///////////////////////////////////////////////////\n\n\n const dfdReader = new BufferReader(data, dfdByteOffset, dfdByteLength, true);\n const dfd = {\n vendorId: dfdReader._skip(4\n /* totalSize */\n )._nextUint16(),\n descriptorType: dfdReader._nextUint16(),\n versionNumber: dfdReader._nextUint16(),\n descriptorBlockSize: dfdReader._nextUint16(),\n colorModel: dfdReader._nextUint8(),\n colorPrimaries: dfdReader._nextUint8(),\n transferFunction: dfdReader._nextUint8(),\n flags: dfdReader._nextUint8(),\n texelBlockDimension: [dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8()],\n bytesPlane: [dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8()],\n samples: []\n };\n const sampleStart = 6;\n const sampleWords = 4;\n const numSamples = (dfd.descriptorBlockSize / 4 - sampleStart) / sampleWords;\n\n for (let i = 0; i < numSamples; i++) {\n const sample = {\n bitOffset: dfdReader._nextUint16(),\n bitLength: dfdReader._nextUint8(),\n channelType: dfdReader._nextUint8(),\n samplePosition: [dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8()],\n sampleLower: -Infinity,\n sampleUpper: Infinity\n };\n\n if (sample.channelType & KHR_DF_SAMPLE_DATATYPE_SIGNED) {\n sample.sampleLower = dfdReader._nextInt32();\n sample.sampleUpper = dfdReader._nextInt32();\n } else {\n sample.sampleLower = dfdReader._nextUint32();\n sample.sampleUpper = dfdReader._nextUint32();\n }\n\n dfd.samples[i] = sample;\n }\n\n container.dataFormatDescriptor.length = 0;\n container.dataFormatDescriptor.push(dfd); ///////////////////////////////////////////////////\n // Key/Value Data (KVD).\n ///////////////////////////////////////////////////\n\n const kvdReader = new BufferReader(data, kvdByteOffset, kvdByteLength, true);\n\n while (kvdReader._offset < kvdByteLength) {\n const keyValueByteLength = kvdReader._nextUint32();\n\n const keyData = kvdReader._scan(keyValueByteLength);\n\n const key = decodeText(keyData);\n\n const valueData = kvdReader._scan(keyValueByteLength - keyData.byteLength);\n\n container.keyValue[key] = key.match(/^ktx/i) ? decodeText(valueData) : valueData; // 4-byte alignment.\n\n if (kvdReader._offset % 4) kvdReader._skip(4 - kvdReader._offset % 4);\n } ///////////////////////////////////////////////////\n // Supercompression Global Data (SGD).\n ///////////////////////////////////////////////////\n\n\n if (sgdByteLength <= 0) return container;\n const sgdReader = new BufferReader(data, sgdByteOffset, sgdByteLength, true);\n\n const endpointCount = sgdReader._nextUint16();\n\n const selectorCount = sgdReader._nextUint16();\n\n const endpointsByteLength = sgdReader._nextUint32();\n\n const selectorsByteLength = sgdReader._nextUint32();\n\n const tablesByteLength = sgdReader._nextUint32();\n\n const extendedByteLength = sgdReader._nextUint32();\n\n const imageDescs = [];\n\n for (let i = 0; i < levelCount; i++) {\n imageDescs.push({\n imageFlags: sgdReader._nextUint32(),\n rgbSliceByteOffset: sgdReader._nextUint32(),\n rgbSliceByteLength: sgdReader._nextUint32(),\n alphaSliceByteOffset: sgdReader._nextUint32(),\n alphaSliceByteLength: sgdReader._nextUint32()\n });\n }\n\n const endpointsByteOffset = sgdByteOffset + sgdReader._offset;\n const selectorsByteOffset = endpointsByteOffset + endpointsByteLength;\n const tablesByteOffset = selectorsByteOffset + selectorsByteLength;\n const extendedByteOffset = tablesByteOffset + tablesByteLength;\n const endpointsData = new Uint8Array(data.buffer, data.byteOffset + endpointsByteOffset, endpointsByteLength);\n const selectorsData = new Uint8Array(data.buffer, data.byteOffset + selectorsByteOffset, selectorsByteLength);\n const tablesData = new Uint8Array(data.buffer, data.byteOffset + tablesByteOffset, tablesByteLength);\n const extendedData = new Uint8Array(data.buffer, data.byteOffset + extendedByteOffset, extendedByteLength);\n container.globalData = {\n endpointCount,\n selectorCount,\n imageDescs,\n endpointsData,\n selectorsData,\n tablesData,\n extendedData\n };\n return container;\n}\n\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\nconst DEFAULT_OPTIONS = {\n keepWriter: false\n};\n/**\r\n * Serializes a {@link KTX2Container} instance to a KTX 2.0 file. Mip levels and other binary data\r\n * are copied into the resulting Uint8Array, so the original container can safely be edited or\r\n * destroyed after it is serialized.\r\n *\r\n * Options:\r\n * - keepWriter: If true, 'KTXWriter' key/value field is written as provided by the container.\r\n * \t\tOtherwise, a string for the current ktx-parse version is generated. Default: false.\r\n *\r\n * @param container\r\n * @param options\r\n */\n\nfunction write(container, options = {}) {\n options = _extends({}, DEFAULT_OPTIONS, options); ///////////////////////////////////////////////////\n // Supercompression Global Data (SGD).\n ///////////////////////////////////////////////////\n\n let sgdBuffer = new ArrayBuffer(0);\n\n if (container.globalData) {\n const sgdHeaderBuffer = new ArrayBuffer(20 + container.globalData.imageDescs.length * 5 * 4);\n const sgdHeaderView = new DataView(sgdHeaderBuffer);\n sgdHeaderView.setUint16(0, container.globalData.endpointCount, true);\n sgdHeaderView.setUint16(2, container.globalData.selectorCount, true);\n sgdHeaderView.setUint32(4, container.globalData.endpointsData.byteLength, true);\n sgdHeaderView.setUint32(8, container.globalData.selectorsData.byteLength, true);\n sgdHeaderView.setUint32(12, container.globalData.tablesData.byteLength, true);\n sgdHeaderView.setUint32(16, container.globalData.extendedData.byteLength, true);\n\n for (let i = 0; i < container.globalData.imageDescs.length; i++) {\n const imageDesc = container.globalData.imageDescs[i];\n sgdHeaderView.setUint32(20 + i * 5 * 4 + 0, imageDesc.imageFlags, true);\n sgdHeaderView.setUint32(20 + i * 5 * 4 + 4, imageDesc.rgbSliceByteOffset, true);\n sgdHeaderView.setUint32(20 + i * 5 * 4 + 8, imageDesc.rgbSliceByteLength, true);\n sgdHeaderView.setUint32(20 + i * 5 * 4 + 12, imageDesc.alphaSliceByteOffset, true);\n sgdHeaderView.setUint32(20 + i * 5 * 4 + 16, imageDesc.alphaSliceByteLength, true);\n }\n\n sgdBuffer = concat([sgdHeaderBuffer, container.globalData.endpointsData, container.globalData.selectorsData, container.globalData.tablesData, container.globalData.extendedData]);\n } ///////////////////////////////////////////////////\n // Key/Value Data (KVD).\n ///////////////////////////////////////////////////\n\n\n const keyValueData = [];\n let keyValue = container.keyValue;\n\n if (!options.keepWriter) {\n keyValue = _extends({}, container.keyValue, {\n KTXwriter: KTX_WRITER\n });\n }\n\n for (const key in keyValue) {\n const value = keyValue[key];\n const keyData = encodeText(key);\n const valueData = typeof value === 'string' ? encodeText(value) : value;\n const kvByteLength = keyData.byteLength + 1 + valueData.byteLength + 1;\n const kvPadding = kvByteLength % 4 ? 4 - kvByteLength % 4 : 0; // align(4)\n\n keyValueData.push(concat([new Uint32Array([kvByteLength]), keyData, NUL, valueData, NUL, new Uint8Array(kvPadding).fill(0x00) // align(4)\n ]));\n }\n\n const kvdBuffer = concat(keyValueData); ///////////////////////////////////////////////////\n // Data Format Descriptor (DFD).\n ///////////////////////////////////////////////////\n\n if (container.dataFormatDescriptor.length !== 1 || container.dataFormatDescriptor[0].descriptorType !== KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT) {\n throw new Error('Only BASICFORMAT Data Format Descriptor output supported.');\n }\n\n const dfd = container.dataFormatDescriptor[0];\n const dfdBuffer = new ArrayBuffer(28 + dfd.samples.length * 16);\n const dfdView = new DataView(dfdBuffer);\n const descriptorBlockSize = 24 + dfd.samples.length * 16;\n dfdView.setUint32(0, dfdBuffer.byteLength, true);\n dfdView.setUint16(4, dfd.vendorId, true);\n dfdView.setUint16(6, dfd.descriptorType, true);\n dfdView.setUint16(8, dfd.versionNumber, true);\n dfdView.setUint16(10, descriptorBlockSize, true);\n dfdView.setUint8(12, dfd.colorModel);\n dfdView.setUint8(13, dfd.colorPrimaries);\n dfdView.setUint8(14, dfd.transferFunction);\n dfdView.setUint8(15, dfd.flags);\n\n if (!Array.isArray(dfd.texelBlockDimension)) {\n throw new Error('texelBlockDimension is now an array. For dimensionality `d`, set `d - 1`.');\n }\n\n dfdView.setUint8(16, dfd.texelBlockDimension[0]);\n dfdView.setUint8(17, dfd.texelBlockDimension[1]);\n dfdView.setUint8(18, dfd.texelBlockDimension[2]);\n dfdView.setUint8(19, dfd.texelBlockDimension[3]);\n\n for (let i = 0; i < 8; i++) dfdView.setUint8(20 + i, dfd.bytesPlane[i]);\n\n for (let i = 0; i < dfd.samples.length; i++) {\n const sample = dfd.samples[i];\n const sampleByteOffset = 28 + i * 16;\n\n if (sample.channelID) {\n throw new Error('channelID has been renamed to channelType.');\n }\n\n dfdView.setUint16(sampleByteOffset + 0, sample.bitOffset, true);\n dfdView.setUint8(sampleByteOffset + 2, sample.bitLength);\n dfdView.setUint8(sampleByteOffset + 3, sample.channelType);\n dfdView.setUint8(sampleByteOffset + 4, sample.samplePosition[0]);\n dfdView.setUint8(sampleByteOffset + 5, sample.samplePosition[1]);\n dfdView.setUint8(sampleByteOffset + 6, sample.samplePosition[2]);\n dfdView.setUint8(sampleByteOffset + 7, sample.samplePosition[3]);\n\n if (sample.channelType & KHR_DF_SAMPLE_DATATYPE_SIGNED) {\n dfdView.setInt32(sampleByteOffset + 8, sample.sampleLower, true);\n dfdView.setInt32(sampleByteOffset + 12, sample.sampleUpper, true);\n } else {\n dfdView.setUint32(sampleByteOffset + 8, sample.sampleLower, true);\n dfdView.setUint32(sampleByteOffset + 12, sample.sampleUpper, true);\n }\n } ///////////////////////////////////////////////////\n // Data alignment.\n ///////////////////////////////////////////////////\n\n\n const dfdByteOffset = KTX2_ID.length + HEADER_BYTE_LENGTH + container.levels.length * 3 * 8;\n const kvdByteOffset = dfdByteOffset + dfdBuffer.byteLength;\n let sgdByteOffset = sgdBuffer.byteLength > 0 ? kvdByteOffset + kvdBuffer.byteLength : 0;\n if (sgdByteOffset % 8) sgdByteOffset += 8 - sgdByteOffset % 8; // align(8)\n ///////////////////////////////////////////////////\n // Level Index.\n ///////////////////////////////////////////////////\n\n const levelData = [];\n const levelIndex = new DataView(new ArrayBuffer(container.levels.length * 3 * 8));\n let levelDataByteOffset = (sgdByteOffset || kvdByteOffset + kvdBuffer.byteLength) + sgdBuffer.byteLength;\n\n for (let i = 0; i < container.levels.length; i++) {\n const level = container.levels[i];\n levelData.push(level.levelData);\n levelIndex.setBigUint64(i * 24 + 0, BigInt(levelDataByteOffset), true);\n levelIndex.setBigUint64(i * 24 + 8, BigInt(level.levelData.byteLength), true);\n levelIndex.setBigUint64(i * 24 + 16, BigInt(level.uncompressedByteLength), true);\n levelDataByteOffset += level.levelData.byteLength;\n } ///////////////////////////////////////////////////\n // Header.\n ///////////////////////////////////////////////////\n\n\n const headerBuffer = new ArrayBuffer(HEADER_BYTE_LENGTH);\n const headerView = new DataView(headerBuffer);\n headerView.setUint32(0, container.vkFormat, true);\n headerView.setUint32(4, container.typeSize, true);\n headerView.setUint32(8, container.pixelWidth, true);\n headerView.setUint32(12, container.pixelHeight, true);\n headerView.setUint32(16, container.pixelDepth, true);\n headerView.setUint32(20, container.layerCount, true);\n headerView.setUint32(24, container.faceCount, true);\n headerView.setUint32(28, container.levels.length, true);\n headerView.setUint32(32, container.supercompressionScheme, true);\n headerView.setUint32(36, dfdByteOffset, true);\n headerView.setUint32(40, dfdBuffer.byteLength, true);\n headerView.setUint32(44, kvdByteOffset, true);\n headerView.setUint32(48, kvdBuffer.byteLength, true);\n headerView.setBigUint64(52, BigInt(sgdBuffer.byteLength > 0 ? sgdByteOffset : 0), true);\n headerView.setBigUint64(60, BigInt(sgdBuffer.byteLength), true); ///////////////////////////////////////////////////\n // Compose.\n ///////////////////////////////////////////////////\n\n return new Uint8Array(concat([new Uint8Array(KTX2_ID).buffer, headerBuffer, levelIndex.buffer, dfdBuffer, kvdBuffer, sgdByteOffset > 0 ? new ArrayBuffer(sgdByteOffset - (kvdByteOffset + kvdBuffer.byteLength)) // align(8)\n : new ArrayBuffer(0), sgdBuffer, ...levelData]));\n}\n\nexport { KHR_DF_CHANNEL_RGBSDA_ALPHA, KHR_DF_CHANNEL_RGBSDA_BLUE, KHR_DF_CHANNEL_RGBSDA_DEPTH, KHR_DF_CHANNEL_RGBSDA_GREEN, KHR_DF_CHANNEL_RGBSDA_RED, KHR_DF_CHANNEL_RGBSDA_STENCIL, KHR_DF_FLAG_ALPHA_PREMULTIPLIED, KHR_DF_FLAG_ALPHA_STRAIGHT, KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT, KHR_DF_MODEL_ASTC, KHR_DF_MODEL_ETC1, KHR_DF_MODEL_ETC1S, KHR_DF_MODEL_ETC2, KHR_DF_MODEL_RGBSDA, KHR_DF_MODEL_UASTC, KHR_DF_MODEL_UNSPECIFIED, KHR_DF_PRIMARIES_ACES, KHR_DF_PRIMARIES_ACESCC, KHR_DF_PRIMARIES_ADOBERGB, KHR_DF_PRIMARIES_BT2020, KHR_DF_PRIMARIES_BT601_EBU, KHR_DF_PRIMARIES_BT601_SMPTE, KHR_DF_PRIMARIES_BT709, KHR_DF_PRIMARIES_CIEXYZ, KHR_DF_PRIMARIES_DISPLAYP3, KHR_DF_PRIMARIES_NTSC1953, KHR_DF_PRIMARIES_PAL525, KHR_DF_PRIMARIES_UNSPECIFIED, KHR_DF_SAMPLE_DATATYPE_EXPONENT, KHR_DF_SAMPLE_DATATYPE_FLOAT, KHR_DF_SAMPLE_DATATYPE_LINEAR, KHR_DF_SAMPLE_DATATYPE_SIGNED, KHR_DF_TRANSFER_ACESCC, KHR_DF_TRANSFER_ACESCCT, KHR_DF_TRANSFER_ADOBERGB, KHR_DF_TRANSFER_BT1886, KHR_DF_TRANSFER_DCIP3, KHR_DF_TRANSFER_HLG_EOTF, KHR_DF_TRANSFER_HLG_OETF, KHR_DF_TRANSFER_ITU, KHR_DF_TRANSFER_LINEAR, KHR_DF_TRANSFER_NTSC, KHR_DF_TRANSFER_PAL625_EOTF, KHR_DF_TRANSFER_PAL_OETF, KHR_DF_TRANSFER_PQ_EOTF, KHR_DF_TRANSFER_PQ_OETF, KHR_DF_TRANSFER_SLOG, KHR_DF_TRANSFER_SLOG2, KHR_DF_TRANSFER_SRGB, KHR_DF_TRANSFER_ST240, KHR_DF_TRANSFER_UNSPECIFIED, KHR_DF_VENDORID_KHRONOS, KHR_DF_VERSION, KHR_SUPERCOMPRESSION_BASISLZ, KHR_SUPERCOMPRESSION_NONE, KHR_SUPERCOMPRESSION_ZLIB, KHR_SUPERCOMPRESSION_ZSTD, KTX2Container, VK_FORMAT_A1R5G5B5_UNORM_PACK16, VK_FORMAT_A2B10G10R10_SINT_PACK32, VK_FORMAT_A2B10G10R10_SNORM_PACK32, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_FORMAT_A2B10G10R10_UNORM_PACK32, VK_FORMAT_A2R10G10B10_SINT_PACK32, VK_FORMAT_A2R10G10B10_SNORM_PACK32, VK_FORMAT_A2R10G10B10_UINT_PACK32, VK_FORMAT_A2R10G10B10_UNORM_PACK32, VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT, VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT, VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_10x10_SRGB_BLOCK, VK_FORMAT_ASTC_10x10_UNORM_BLOCK, VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_10x5_SRGB_BLOCK, VK_FORMAT_ASTC_10x5_UNORM_BLOCK, VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_10x6_SRGB_BLOCK, VK_FORMAT_ASTC_10x6_UNORM_BLOCK, VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_10x8_SRGB_BLOCK, VK_FORMAT_ASTC_10x8_UNORM_BLOCK, VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_12x10_SRGB_BLOCK, VK_FORMAT_ASTC_12x10_UNORM_BLOCK, VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_12x12_SRGB_BLOCK, VK_FORMAT_ASTC_12x12_UNORM_BLOCK, VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_4x4_SRGB_BLOCK, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_5x4_SRGB_BLOCK, VK_FORMAT_ASTC_5x4_UNORM_BLOCK, VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_5x5_SRGB_BLOCK, VK_FORMAT_ASTC_5x5_UNORM_BLOCK, VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_6x5_SRGB_BLOCK, VK_FORMAT_ASTC_6x5_UNORM_BLOCK, VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_6x6_SRGB_BLOCK, VK_FORMAT_ASTC_6x6_UNORM_BLOCK, VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_8x5_SRGB_BLOCK, VK_FORMAT_ASTC_8x5_UNORM_BLOCK, VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_8x6_SRGB_BLOCK, VK_FORMAT_ASTC_8x6_UNORM_BLOCK, VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_8x8_SRGB_BLOCK, VK_FORMAT_ASTC_8x8_UNORM_BLOCK, VK_FORMAT_B10G11R11_UFLOAT_PACK32, VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16, VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16, VK_FORMAT_B4G4R4A4_UNORM_PACK16, VK_FORMAT_B5G5R5A1_UNORM_PACK16, VK_FORMAT_B5G6R5_UNORM_PACK16, VK_FORMAT_B8G8R8A8_SINT, VK_FORMAT_B8G8R8A8_SNORM, VK_FORMAT_B8G8R8A8_SRGB, VK_FORMAT_B8G8R8A8_UINT, VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_B8G8R8_SINT, VK_FORMAT_B8G8R8_SNORM, VK_FORMAT_B8G8R8_SRGB, VK_FORMAT_B8G8R8_UINT, VK_FORMAT_B8G8R8_UNORM, VK_FORMAT_BC1_RGBA_SRGB_BLOCK, VK_FORMAT_BC1_RGBA_UNORM_BLOCK, VK_FORMAT_BC1_RGB_SRGB_BLOCK, VK_FORMAT_BC1_RGB_UNORM_BLOCK, VK_FORMAT_BC2_SRGB_BLOCK, VK_FORMAT_BC2_UNORM_BLOCK, VK_FORMAT_BC3_SRGB_BLOCK, VK_FORMAT_BC3_UNORM_BLOCK, VK_FORMAT_BC4_SNORM_BLOCK, VK_FORMAT_BC4_UNORM_BLOCK, VK_FORMAT_BC5_SNORM_BLOCK, VK_FORMAT_BC5_UNORM_BLOCK, VK_FORMAT_BC6H_SFLOAT_BLOCK, VK_FORMAT_BC6H_UFLOAT_BLOCK, VK_FORMAT_BC7_SRGB_BLOCK, VK_FORMAT_BC7_UNORM_BLOCK, VK_FORMAT_D16_UNORM, VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, VK_FORMAT_EAC_R11G11_SNORM_BLOCK, VK_FORMAT_EAC_R11G11_UNORM_BLOCK, VK_FORMAT_EAC_R11_SNORM_BLOCK, VK_FORMAT_EAC_R11_UNORM_BLOCK, VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK, VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK, VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16, VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16, VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG, VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG, VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG, VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG, VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG, VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG, VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG, VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG, VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16, VK_FORMAT_R10X6G10X6_UNORM_2PACK16, VK_FORMAT_R10X6_UNORM_PACK16, VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16, VK_FORMAT_R12X4G12X4_UNORM_2PACK16, VK_FORMAT_R12X4_UNORM_PACK16, VK_FORMAT_R16G16B16A16_SFLOAT, VK_FORMAT_R16G16B16A16_SINT, VK_FORMAT_R16G16B16A16_SNORM, VK_FORMAT_R16G16B16A16_UINT, VK_FORMAT_R16G16B16A16_UNORM, VK_FORMAT_R16G16B16_SFLOAT, VK_FORMAT_R16G16B16_SINT, VK_FORMAT_R16G16B16_SNORM, VK_FORMAT_R16G16B16_UINT, VK_FORMAT_R16G16B16_UNORM, VK_FORMAT_R16G16_SFLOAT, VK_FORMAT_R16G16_SINT, VK_FORMAT_R16G16_SNORM, VK_FORMAT_R16G16_UINT, VK_FORMAT_R16G16_UNORM, VK_FORMAT_R16_SFLOAT, VK_FORMAT_R16_SINT, VK_FORMAT_R16_SNORM, VK_FORMAT_R16_UINT, VK_FORMAT_R16_UNORM, VK_FORMAT_R32G32B32A32_SFLOAT, VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32G32B32A32_UINT, VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32B32_SINT, VK_FORMAT_R32G32B32_UINT, VK_FORMAT_R32G32_SFLOAT, VK_FORMAT_R32G32_SINT, VK_FORMAT_R32G32_UINT, VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32_SINT, VK_FORMAT_R32_UINT, VK_FORMAT_R4G4B4A4_UNORM_PACK16, VK_FORMAT_R4G4_UNORM_PACK8, VK_FORMAT_R5G5B5A1_UNORM_PACK16, VK_FORMAT_R5G6B5_UNORM_PACK16, VK_FORMAT_R64G64B64A64_SFLOAT, VK_FORMAT_R64G64B64A64_SINT, VK_FORMAT_R64G64B64A64_UINT, VK_FORMAT_R64G64B64_SFLOAT, VK_FORMAT_R64G64B64_SINT, VK_FORMAT_R64G64B64_UINT, VK_FORMAT_R64G64_SFLOAT, VK_FORMAT_R64G64_SINT, VK_FORMAT_R64G64_UINT, VK_FORMAT_R64_SFLOAT, VK_FORMAT_R64_SINT, VK_FORMAT_R64_UINT, VK_FORMAT_R8G8B8A8_SINT, VK_FORMAT_R8G8B8A8_SNORM, VK_FORMAT_R8G8B8A8_SRGB, VK_FORMAT_R8G8B8A8_UINT, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_R8G8B8_SINT, VK_FORMAT_R8G8B8_SNORM, VK_FORMAT_R8G8B8_SRGB, VK_FORMAT_R8G8B8_UINT, VK_FORMAT_R8G8B8_UNORM, VK_FORMAT_R8G8_SINT, VK_FORMAT_R8G8_SNORM, VK_FORMAT_R8G8_SRGB, VK_FORMAT_R8G8_UINT, VK_FORMAT_R8G8_UNORM, VK_FORMAT_R8_SINT, VK_FORMAT_R8_SNORM, VK_FORMAT_R8_SRGB, VK_FORMAT_R8_UINT, VK_FORMAT_R8_UNORM, VK_FORMAT_S8_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_X8_D24_UNORM_PACK32, read, write };\n//# sourceMappingURL=ktx-parse.modern.js.map\n","import{ExtensionProperty as e,PropertyType as t,Extension as s,BufferUtils as n,WriterContext as r,Primitive as o,Root as i,AnimationSampler as a,AnimationChannel as c,Accessor as u,MathUtils as l,GLB_BUFFER as h,ImageUtils as f,getBounds as g,ColorUtils as p,TextureInfo as x,TextureChannel as d}from\"@gltf-transform/core\";import{read as T,KHR_DF_MODEL_ETC1S as m,KHR_DF_MODEL_UASTC as E}from\"ktx-parse\";const I=\"INSTANCE_ATTRIBUTE\";class R extends e{init(){this.extensionName=\"EXT_mesh_gpu_instancing\",this.propertyType=\"InstancedMesh\",this.parentTypes=[t.NODE]}getDefaults(){return Object.assign(super.getDefaults(),{attributes:{}})}getAttribute(e){return this.getRefMap(\"attributes\",e)}setAttribute(e,t){return this.setRefMap(\"attributes\",e,t,{usage:\"INSTANCE_ATTRIBUTE\"})}listAttributes(){return this.listRefMapValues(\"attributes\")}listSemantics(){return this.listRefMapKeys(\"attributes\")}}R.EXTENSION_NAME=\"EXT_mesh_gpu_instancing\";const N=\"EXT_mesh_gpu_instancing\";class y extends s{constructor(...e){super(...e),this.extensionName=N,this.provideTypes=[t.NODE],this.prewriteTypes=[t.ACCESSOR]}createInstancedMesh(){return new R(this.document.getGraph())}read(e){return(e.jsonDoc.json.nodes||[]).forEach((t,s)=>{if(!t.extensions||!t.extensions[N])return;const n=t.extensions[N],r=this.createInstancedMesh();for(const t in n.attributes)r.setAttribute(t,e.accessors[n.attributes[t]]);e.nodes[s].setExtension(N,r)}),this}prewrite(e){e.accessorUsageGroupedByParent.add(\"INSTANCE_ATTRIBUTE\");for(const t of this.properties)for(const s of t.listAttributes())e.addAccessorToUsageGroup(s,\"INSTANCE_ATTRIBUTE\");return this}write(e){const t=e.jsonDoc;return this.document.getRoot().listNodes().forEach(s=>{const n=s.getExtension(N);if(n){const r=e.nodeIndexMap.get(s),o=t.json.nodes[r],i={attributes:{}};n.listSemantics().forEach(t=>{const s=n.getAttribute(t);i.attributes[t]=e.accessorIndexMap.get(s)}),o.extensions=o.extensions||{},o.extensions[N]=i}}),this}}function _(){return(_=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var s=arguments[t];for(var n in s)Object.prototype.hasOwnProperty.call(s,n)&&(e[n]=s[n])}return e}).apply(this,arguments)}var A,S,C;y.EXTENSION_NAME=N,function(e){e.QUANTIZE=\"quantize\",e.FILTER=\"filter\"}(A||(A={})),function(e){e.ATTRIBUTES=\"ATTRIBUTES\",e.TRIANGLES=\"TRIANGLES\",e.INDICES=\"INDICES\"}(S||(S={})),function(e){e.NONE=\"NONE\",e.OCTAHEDRAL=\"OCTAHEDRAL\",e.QUATERNION=\"QUATERNION\",e.EXPONENTIAL=\"EXPONENTIAL\"}(C||(C={}));const{BYTE:M,SHORT:O,FLOAT:w}=u.ComponentType,{encodeNormalizedInt:D,decodeNormalizedInt:b}=l;function F(e,t,s,r){const{filter:o,bits:i}=r,a={array:e.getArray(),byteStride:e.getElementSize()*e.getComponentSize(),componentType:e.getComponentType(),normalized:e.getNormalized()};if(s!==S.ATTRIBUTES)return a;if(o!==C.NONE){let s=e.getNormalized()?function(e){const t=e.getComponentType(),s=e.getArray(),n=new Float32Array(s.length);for(let e=0;e<s.length;e++)n[e]=b(s[e],t);return n}(e):new Float32Array(a.array);switch(o){case C.EXPONENTIAL:a.byteStride=4*e.getElementSize(),a.componentType=w,a.normalized=!1,a.array=t.encodeFilterExp(s,e.getCount(),a.byteStride,i);break;case C.OCTAHEDRAL:a.byteStride=i>8?8:4,a.componentType=i>8?O:M,a.normalized=!0,s=3===e.getElementSize()?function(e){const t=new Float32Array(4*e.length/3);for(let s=0,n=e.length/3;s<n;s++)t[4*s]=e[3*s],t[4*s+1]=e[3*s+1],t[4*s+2]=e[3*s+2];return t}(s):s,a.array=t.encodeFilterOct(s,e.getCount(),a.byteStride,i);break;case C.QUATERNION:a.byteStride=8,a.componentType=O,a.normalized=!0,a.array=t.encodeFilterQuat(s,e.getCount(),a.byteStride,i);break;default:throw new Error(\"Invalid filter.\")}a.min=e.getMin([]),a.max=e.getMax([]),e.getNormalized()&&(a.min=a.min.map(t=>b(t,e.getComponentType())),a.max=a.max.map(t=>b(t,e.getComponentType()))),a.normalized&&(a.min=a.min.map(e=>D(e,a.componentType)),a.max=a.max.map(e=>D(e,a.componentType)))}else a.byteStride%4&&(a.array=function(e,t){const s=n.padNumber(e.BYTES_PER_ELEMENT*t)/e.BYTES_PER_ELEMENT,r=new e.constructor(e.length/t*s);for(let n=0;n*t<e.length;n++)for(let o=0;o<t;o++)r[n*s+o]=e[n*t+o];return r}(a.array,e.getElementSize()),a.byteStride=a.array.byteLength/e.getCount());return a}function j(e,t){return t===r.BufferViewUsage.ELEMENT_ARRAY_BUFFER?e.listParents().some(e=>e instanceof o&&e.getMode()===o.Mode.TRIANGLES)?S.TRIANGLES:S.INDICES:S.ATTRIBUTES}function v(e,t){const s=t.getGraph().listParentEdges(e).filter(e=>!(e.getParent()instanceof i));for(const t of s){const s=t.getName(),n=t.getAttributes().key||\"\";if(\"indices\"===s)return{filter:C.NONE};if(\"attributes\"===s){if(\"POSITION\"===n)return{filter:C.NONE};if(\"TEXCOORD_0\"===n)return{filter:C.NONE};if(\"NORMAL\"===n)return{filter:C.OCTAHEDRAL,bits:8};if(\"TANGENT\"===n)return{filter:C.OCTAHEDRAL,bits:8};if(n.startsWith(\"JOINTS_\"))return{filter:C.NONE};if(n.startsWith(\"WEIGHTS_\"))return{filter:C.NONE}}if(\"output\"===s){const t=k(e);return\"rotation\"===t?{filter:C.QUATERNION,bits:16}:\"translation\"===t||\"scale\"===t?{filter:C.EXPONENTIAL,bits:12}:{filter:C.NONE}}if(\"input\"===s)return{filter:C.NONE};if(\"inverseBindMatrices\"===s)return{filter:C.NONE}}return{filter:C.NONE}}function k(e){for(const t of e.listParents())if(t instanceof a)for(const e of t.listParents())if(e instanceof c)return e.getTargetPath();return null}const B=\"EXT_meshopt_compression\",G={method:A.QUANTIZE};class L extends s{constructor(...e){super(...e),this.extensionName=B,this.prereadTypes=[t.BUFFER,t.PRIMITIVE],this.prewriteTypes=[t.BUFFER,t.ACCESSOR],this.readDependencies=[\"meshopt.decoder\"],this.writeDependencies=[\"meshopt.encoder\"],this._decoder=null,this._decoderFallbackBufferMap=new Map,this._encoder=null,this._encoderOptions=G,this._encoderFallbackBuffer=null,this._encoderBufferViews={},this._encoderBufferViewData={},this._encoderBufferViewAccessors={}}install(e,t){return\"meshopt.decoder\"===e&&(this._decoder=t),\"meshopt.encoder\"===e&&(this._encoder=t),this}setEncoderOptions(e){return this._encoderOptions=_({},G,e),this}preread(e,s){if(!this._decoder){if(!this.isRequired())return this;throw new Error(`[${B}] Please install extension dependency, \"meshopt.decoder\".`)}if(!this._decoder.supported){if(!this.isRequired())return this;throw new Error(`[${B}]: Missing WASM support.`)}return s===t.BUFFER?this._prereadBuffers(e):s===t.PRIMITIVE&&this._prereadPrimitives(e),this}_prereadBuffers(e){const t=e.jsonDoc;(t.json.bufferViews||[]).forEach((s,r)=>{if(!s.extensions||!s.extensions[B])return;const o=s.extensions[B],i=o.byteOffset||0,a=o.byteLength||0,c=o.count,u=o.byteStride,l=new Uint8Array(c*u),f=t.json.buffers[o.buffer],g=n.toView(f.uri?t.resources[f.uri]:t.resources[h],i,a);this._decoder.decodeGltfBuffer(l,c,u,g,o.mode,o.filter),e.bufferViews[r]=l})}_prereadPrimitives(e){const t=e.jsonDoc;(t.json.bufferViews||[]).forEach(s=>{var n;s.extensions&&s.extensions[B]&&(n=t.json.buffers[s.buffer]).extensions&&n.extensions.EXT_meshopt_compression&&n.extensions.EXT_meshopt_compression.fallback&&this._decoderFallbackBufferMap.set(e.buffers[s.buffer],e.buffers[s.extensions[B].buffer])})}read(e){if(!this.isRequired())return this;for(const[e,t]of this._decoderFallbackBufferMap){for(const s of e.listParents())s instanceof u&&s.swap(e,t);e.dispose()}return this}prewrite(e,s){return s===t.ACCESSOR?this._prewriteAccessors(e):s===t.BUFFER&&this._prewriteBuffers(e),this}_prewriteAccessors(e){const t=e.jsonDoc.json,s=this._encoder,n=this._encoderOptions,o=this.document.createBuffer(),i=this.document.getRoot().listBuffers().indexOf(o);this._encoderFallbackBuffer=o,this._encoderBufferViews={},this._encoderBufferViewData={},this._encoderBufferViewAccessors={};for(const o of this.document.getRoot().listAccessors()){if(\"weights\"===k(o))continue;if(o.getSparse())continue;const a=e.getAccessorUsage(o),c=j(o,a),u=n.method===A.FILTER?v(o,this.document):{filter:C.NONE},l=F(o,s,c,u),{array:h,byteStride:f}=l,g=o.getBuffer();if(!g)throw new Error(`${B}: Missing buffer for accessor.`);const p=this.document.getRoot().listBuffers().indexOf(g),x=[a,c,u.filter,f,p].join(\":\");let d=this._encoderBufferViews[x],T=this._encoderBufferViewData[x],m=this._encoderBufferViewAccessors[x];d&&T||(m=this._encoderBufferViewAccessors[x]=[],T=this._encoderBufferViewData[x]=[],d=this._encoderBufferViews[x]={buffer:i,target:r.USAGE_TO_TARGET[a],byteOffset:0,byteLength:0,byteStride:a===r.BufferViewUsage.ARRAY_BUFFER?f:void 0,extensions:{[B]:{buffer:p,byteOffset:0,byteLength:0,mode:c,filter:u.filter!==C.NONE?u.filter:void 0,byteStride:f,count:0}}});const E=e.createAccessorDef(o);E.componentType=l.componentType,E.normalized=l.normalized,E.byteOffset=d.byteLength,E.min&&l.min&&(E.min=l.min),E.max&&l.max&&(E.max=l.max),e.accessorIndexMap.set(o,t.accessors.length),t.accessors.push(E),m.push(E),T.push(new Uint8Array(h.buffer,h.byteOffset,h.byteLength)),d.byteLength+=h.byteLength,d.extensions.EXT_meshopt_compression.count+=o.getCount()}}_prewriteBuffers(e){const t=this._encoder;for(const s in this._encoderBufferViews){const r=this._encoderBufferViews[s],o=this._encoderBufferViewData[s],i=this.document.getRoot().listBuffers()[r.extensions[B].buffer],a=e.otherBufferViews.get(i)||[],{count:c,byteStride:u,mode:l}=r.extensions[B],h=n.concat(o),f=t.encodeGltfBuffer(h,c,u,l),g=n.pad(f);r.extensions[B].byteLength=f.byteLength,o.length=0,o.push(g),a.push(g),e.otherBufferViews.set(i,a)}}write(e){let t=0;for(const s in this._encoderBufferViews){const r=this._encoderBufferViews[s],o=e.otherBufferViewsIndexMap.get(this._encoderBufferViewData[s][0]),i=this._encoderBufferViewAccessors[s];for(const e of i)e.bufferView=o;const a=e.jsonDoc.json.bufferViews[o],c=a.byteOffset||0;Object.assign(a,r),a.byteOffset=t,a.extensions[B].byteOffset=c,t+=n.padNumber(r.byteLength)}const s=this._encoderFallbackBuffer,r=e.bufferIndexMap.get(s),o=e.jsonDoc.json.buffers[r];return o.byteLength=t,o.extensions={[B]:{fallback:!0}},s.dispose(),this}}L.EXTENSION_NAME=B,L.EncoderMethod=A;const H=\"EXT_texture_avif\";class U{match(e){return e.length>=12&&\"ftypavif\"===n.decodeText(e.slice(4,12))}getSize(e){if(!this.match(e))return null;const t=new DataView(e.buffer,e.byteOffset,e.byteLength);let s=P(t,0);if(!s)return null;let n=s.end;for(;s=P(t,n);)if(\"meta\"===s.type)n=s.start+4;else if(\"iprp\"===s.type||\"ipco\"===s.type)n=s.start;else{if(\"ispe\"===s.type)return[t.getUint32(s.start+4),t.getUint32(s.start+8)];if(\"mdat\"===s.type)break;n=s.end}return null}getChannels(e){return 4}}class V extends s{constructor(...e){super(...e),this.extensionName=H,this.prereadTypes=[t.TEXTURE]}static register(){f.registerFormat(\"image/avif\",new U)}preread(e){return(e.jsonDoc.json.textures||[]).forEach(e=>{e.extensions&&e.extensions[H]&&(e.source=e.extensions[H].source)}),this}read(e){return this}write(e){const t=e.jsonDoc;return this.document.getRoot().listTextures().forEach(s=>{if(\"image/avif\"===s.getMimeType()){const n=e.imageIndexMap.get(s);(t.json.textures||[]).forEach(e=>{e.source===n&&(e.extensions=e.extensions||{},e.extensions[H]={source:e.source},delete e.source)})}}),this}}function P(e,t){if(e.byteLength<4+t)return null;const s=e.getUint32(t);return e.byteLength<s+t||s<8?null:{type:n.decodeText(new Uint8Array(e.buffer,e.byteOffset+t+4,4)),start:t+8,end:t+s}}V.EXTENSION_NAME=H;const X=\"EXT_texture_webp\";class K{match(e){return e.length>=12&&87===e[8]&&69===e[9]&&66===e[10]&&80===e[11]}getSize(e){const t=n.decodeText(e.slice(0,4)),s=n.decodeText(e.slice(8,12));if(\"RIFF\"!==t||\"WEBP\"!==s)return null;const r=new DataView(e.buffer,e.byteOffset);let o=12;for(;o<r.byteLength;){const e=n.decodeText(new Uint8Array([r.getUint8(o),r.getUint8(o+1),r.getUint8(o+2),r.getUint8(o+3)])),t=r.getUint32(o+4,!0);if(\"VP8 \"===e)return[16383&r.getInt16(o+14,!0),16383&r.getInt16(o+16,!0)];if(\"VP8L\"===e){const e=r.getUint8(o+9),t=r.getUint8(o+10),s=r.getUint8(o+11);return[1+((63&t)<<8|e),1+((15&r.getUint8(o+12))<<10|s<<2|(192&t)>>6)]}o+=8+t+t%2}return null}getChannels(e){return 4}}class z extends s{constructor(...e){super(...e),this.extensionName=X,this.prereadTypes=[t.TEXTURE]}static register(){f.registerFormat(\"image/webp\",new K)}preread(e){return(e.jsonDoc.json.textures||[]).forEach(e=>{e.extensions&&e.extensions[X]&&(e.source=e.extensions[X].source)}),this}read(e){return this}write(e){const t=e.jsonDoc;return this.document.getRoot().listTextures().forEach(s=>{if(\"image/webp\"===s.getMimeType()){const n=e.imageIndexMap.get(s);(t.json.textures||[]).forEach(e=>{e.source===n&&(e.extensions=e.extensions||{},e.extensions[X]={source:e.source},delete e.source)})}}),this}}z.EXTENSION_NAME=X;const $=\"KHR_draco_mesh_compression\";let q,Y,Q,W;function J(e,t){const s=new q.DecoderBuffer;try{if(s.Init(t,t.length),e.GetEncodedGeometryType(s)!==q.TRIANGULAR_MESH)throw new Error(`[${$}] Unknown geometry type.`);const n=new q.Mesh;if(!e.DecodeBufferToMesh(s,n).ok()||0===n.ptr)throw new Error(`[${$}] Decoding failure.`);return n}finally{q.destroy(s)}}function Z(e,t){const s=3*t.num_faces();let n,r;if(t.num_points()<=65534){const o=s*Uint16Array.BYTES_PER_ELEMENT;n=q._malloc(o),e.GetTrianglesUInt16Array(t,o,n),r=new Uint16Array(q.HEAPU16.buffer,n,s).slice()}else{const o=s*Uint32Array.BYTES_PER_ELEMENT;n=q._malloc(o),e.GetTrianglesUInt32Array(t,o,n),r=new Uint32Array(q.HEAPU32.buffer,n,s).slice()}return q._free(n),r}function ee(e,t,s,n){const r=Q[n.componentType],o=Y[n.componentType],i=s.num_components(),a=t.num_points()*i,c=a*o.BYTES_PER_ELEMENT,u=q._malloc(c);e.GetAttributeDataArrayForAllPoints(t,s,r,c,u);const l=new o(q.HEAPF32.buffer,u,a).slice();return q._free(u),l}var te,se;!function(e){e[e.EDGEBREAKER=1]=\"EDGEBREAKER\",e[e.SEQUENTIAL=0]=\"SEQUENTIAL\"}(te||(te={})),function(e){e.POSITION=\"POSITION\",e.NORMAL=\"NORMAL\",e.COLOR=\"COLOR\",e.TEX_COORD=\"TEX_COORD\",e.GENERIC=\"GENERIC\"}(se||(se={}));const ne={[se.POSITION]:14,[se.NORMAL]:10,[se.COLOR]:8,[se.TEX_COORD]:12,[se.GENERIC]:12},re={decodeSpeed:5,encodeSpeed:5,method:te.EDGEBREAKER,quantizationBits:ne,quantizationVolume:\"mesh\"};function oe(e,t=re){const s=_({},re,t);s.quantizationBits=_({},ne,t.quantizationBits);const n=new W.Encoder,r=new W.MeshBuilder,o=new W.Mesh,i={},a=new W.DracoInt8Array,c=e.listTargets().length>0;let u=!1;for(const t of e.listSemantics()){const a=e.getAttribute(t);if(a.getSparse()){u=!0;continue}const c=ie(t),l=ae(r,a.getComponentType(),o,W[c],a.getCount(),a.getElementSize(),a.getArray());if(-1===l)throw new Error(`Error compressing \"${t}\" attribute.`);if(i[t]=l,\"mesh\"===s.quantizationVolume||\"POSITION\"!==t)n.SetAttributeQuantization(W[c],s.quantizationBits[c]);else{if(\"object\"!=typeof s.quantizationVolume)throw new Error(\"Invalid quantization volume state.\");{const{quantizationVolume:e}=s,t=Math.max(e.max[0]-e.min[0],e.max[1]-e.min[1],e.max[2]-e.min[2]);n.SetAttributeExplicitQuantization(W[c],s.quantizationBits[c],a.getElementSize(),e.min,t)}}}const l=e.getIndices();if(!l)throw new ce(\"Primitive must have indices.\");r.AddFacesToMesh(o,l.getCount()/3,l.getArray()),n.SetSpeedOptions(s.encodeSpeed,s.decodeSpeed),n.SetTrackEncodedProperties(!0),n.SetEncodingMethod(s.method===te.SEQUENTIAL||c||u?W.MESH_SEQUENTIAL_ENCODING:W.MESH_EDGEBREAKER_ENCODING);const h=n.EncodeMeshToDracoBuffer(o,a);if(h<=0)throw new ce(\"Error applying Draco compression.\");const f=new Uint8Array(h);for(let e=0;e<h;++e)f[e]=a.GetValue(e);const g=e.getAttribute(\"POSITION\").getCount(),p=n.GetNumberOfEncodedPoints(),x=3*n.GetNumberOfEncodedFaces();if((c||u)&&p!==g)throw new ce('Compression reduced vertex count unexpectedly, corrupting mesh data. Applying the \"weld\" function before compression may resolve the issue. See: https://github.com/google/draco/issues/929');return W.destroy(a),W.destroy(o),W.destroy(r),W.destroy(n),{numVertices:p,numIndices:x,data:f,attributeIDs:i}}function ie(e){return\"POSITION\"===e?se.POSITION:\"NORMAL\"===e?se.NORMAL:e.startsWith(\"COLOR_\")?se.COLOR:e.startsWith(\"TEXCOORD_\")?se.TEX_COORD:se.GENERIC}function ae(e,t,s,n,r,o,i){switch(t){case u.ComponentType.UNSIGNED_BYTE:return e.AddUInt8Attribute(s,n,r,o,i);case u.ComponentType.BYTE:return e.AddInt8Attribute(s,n,r,o,i);case u.ComponentType.UNSIGNED_SHORT:return e.AddUInt16Attribute(s,n,r,o,i);case u.ComponentType.SHORT:return e.AddInt16Attribute(s,n,r,o,i);case u.ComponentType.UNSIGNED_INT:return e.AddUInt32Attribute(s,n,r,o,i);case u.ComponentType.FLOAT:return e.AddFloatAttribute(s,n,r,o,i);default:throw new Error(`Unexpected component type, \"${t}\".`)}}class ce extends Error{}const ue=\"KHR_draco_mesh_compression\";class le extends s{constructor(...e){super(...e),this.extensionName=ue,this.prereadTypes=[t.PRIMITIVE],this.prewriteTypes=[t.ACCESSOR],this.readDependencies=[\"draco3d.decoder\"],this.writeDependencies=[\"draco3d.encoder\"],this._decoderModule=null,this._encoderModule=null,this._encoderOptions={}}install(e,t){return\"draco3d.decoder\"===e&&(this._decoderModule=t,q=this._decoderModule,Y={[u.ComponentType.FLOAT]:Float32Array,[u.ComponentType.UNSIGNED_INT]:Uint32Array,[u.ComponentType.UNSIGNED_SHORT]:Uint16Array,[u.ComponentType.UNSIGNED_BYTE]:Uint8Array,[u.ComponentType.SHORT]:Int16Array,[u.ComponentType.BYTE]:Int8Array},Q={[u.ComponentType.FLOAT]:q.DT_FLOAT32,[u.ComponentType.UNSIGNED_INT]:q.DT_UINT32,[u.ComponentType.UNSIGNED_SHORT]:q.DT_UINT16,[u.ComponentType.UNSIGNED_BYTE]:q.DT_UINT8,[u.ComponentType.SHORT]:q.DT_INT16,[u.ComponentType.BYTE]:q.DT_INT8}),\"draco3d.encoder\"===e&&(this._encoderModule=t,W=this._encoderModule),this}setEncoderOptions(e){return this._encoderOptions=e,this}preread(e){if(!this._decoderModule)throw new Error(`[${ue}] Please install extension dependency, \"draco3d.decoder\".`);const t=this.document.getLogger(),s=e.jsonDoc,r=new Map;try{const o=s.json.meshes||[];for(const i of o)for(const o of i.primitives){if(!o.extensions||!o.extensions[ue])continue;const i=o.extensions[ue];let[a,c]=r.get(i.bufferView)||[];if(!c||!a){const e=s.json.bufferViews[i.bufferView],o=s.json.buffers[e.buffer],u=n.toView(o.uri?s.resources[o.uri]:s.resources[h],e.byteOffset||0,e.byteLength);a=new this._decoderModule.Decoder,c=J(a,u),r.set(i.bufferView,[a,c]),t.debug(`[${ue}] Decompressed ${u.byteLength} bytes.`)}for(const t in o.attributes){const s=e.jsonDoc.json.accessors[o.attributes[t]],n=a.GetAttributeByUniqueId(c,i.attributes[t]),r=ee(a,c,n,s);e.accessors[o.attributes[t]].setArray(r)}void 0!==o.indices&&e.accessors[o.indices].setArray(Z(a,c))}}finally{for(const[e,t]of Array.from(r.values()))this._decoderModule.destroy(e),this._decoderModule.destroy(t)}return this}read(e){return this}prewrite(e,s){if(!this._encoderModule)throw new Error(`[${ue}] Please install extension dependency, \"draco3d.encoder\".`);const n=this.document.getLogger();n.debug(`[${ue}] Compression options: ${JSON.stringify(this._encoderOptions)}`);const r=function(e){const s=e.getLogger(),n=new Set,r=new Set;for(const t of e.getRoot().listMeshes())for(const e of t.listPrimitives())e.getIndices()?e.getMode()!==o.Mode.TRIANGLES?(r.add(e),s.warn(`[${ue}] Skipping Draco compression on non-TRIANGLES primitive.`)):n.add(e):(r.add(e),s.warn(`[${ue}] Skipping Draco compression on non-indexed primitive.`));const i=e.getRoot().listAccessors(),a=new Map;for(let e=0;e<i.length;e++)a.set(i[e],e);const c=new Map,u=new Set,l=new Map;for(const t of Array.from(n)){let s=he(t,a);if(u.has(s))l.set(t,s);else{if(c.has(t.getIndices())){const s=t.getIndices(),n=s.clone();a.set(n,e.getRoot().listAccessors().length-1),t.swap(s,n)}for(const s of t.listAttributes())if(c.has(s)){const n=s.clone();a.set(n,e.getRoot().listAccessors().length-1),t.swap(s,n)}s=he(t,a),u.add(s),l.set(t,s),c.set(t.getIndices(),s);for(const e of t.listAttributes())c.set(e,s)}}for(const e of Array.from(c.keys())){const s=new Set(e.listParents().map(e=>e.propertyType));if(2!==s.size||!s.has(t.PRIMITIVE)||!s.has(t.ROOT))throw new Error(`[${ue}] Compressed accessors must only be used as indices or vertex attributes.`)}for(const e of Array.from(n)){const t=l.get(e),s=e.getIndices();if(c.get(s)!==t||e.listAttributes().some(e=>c.get(e)!==t))throw new Error(`[${ue}] Draco primitives must share all, or no, accessors.`)}for(const e of Array.from(r)){const t=e.getIndices();if(c.has(t)||e.listAttributes().some(e=>c.has(e)))throw new Error(`[${ue}] Accessor cannot be shared by compressed and uncompressed primitives.`)}return l}(this.document),i=new Map;let a=\"mesh\";\"scene\"===this._encoderOptions.quantizationVolume&&(1!==this.document.getRoot().listScenes().length?n.warn(`[${ue}]: quantizationVolume=scene requires exactly 1 scene.`):a=g(this.document.getRoot().listScenes().pop()));for(const t of Array.from(r.keys())){const s=r.get(t);if(!s)throw new Error(\"Unexpected primitive.\");if(i.has(s)){i.set(s,i.get(s));continue}const o=t.getIndices(),c=e.jsonDoc.json.accessors;let u;try{u=oe(t,_({},this._encoderOptions,{quantizationVolume:a}))}catch(e){if(e instanceof ce){n.warn(`[${ue}]: ${e.message} Skipping primitive compression.`);continue}throw e}i.set(s,u);const l=e.createAccessorDef(o);l.count=u.numIndices,e.accessorIndexMap.set(o,c.length),c.push(l);for(const s of t.listSemantics()){const n=t.getAttribute(s);if(void 0===u.attributeIDs[s])continue;const r=e.createAccessorDef(n);r.count=u.numVertices,e.accessorIndexMap.set(n,c.length),c.push(r)}const h=t.getAttribute(\"POSITION\").getBuffer()||this.document.getRoot().listBuffers()[0];e.otherBufferViews.has(h)||e.otherBufferViews.set(h,[]),e.otherBufferViews.get(h).push(u.data)}return n.debug(`[${ue}] Compressed ${r.size} primitives.`),e.extensionData[ue]={primitiveHashMap:r,primitiveEncodingMap:i},this}write(e){const t=e.extensionData[ue];for(const s of this.document.getRoot().listMeshes()){const n=e.jsonDoc.json.meshes[e.meshIndexMap.get(s)];for(let r=0;r<s.listPrimitives().length;r++){const o=s.listPrimitives()[r],i=n.primitives[r],a=t.primitiveHashMap.get(o);if(!a)continue;const c=t.primitiveEncodingMap.get(a);c&&(i.extensions=i.extensions||{},i.extensions[ue]={bufferView:e.otherBufferViewsIndexMap.get(c.data),attributes:c.attributeIDs})}}if(!t.primitiveHashMap.size){const t=e.jsonDoc.json;t.extensionsUsed=(t.extensionsUsed||[]).filter(e=>e!==ue),t.extensionsRequired=(t.extensionsRequired||[]).filter(e=>e!==ue)}return this}}function he(e,t){const s=[],n=e.getIndices();s.push(t.get(n));for(const n of e.listAttributes())s.push(t.get(n));return s.sort().join(\"|\")}le.EXTENSION_NAME=ue,le.EncoderMethod=te;class fe extends e{init(){this.extensionName=\"KHR_lights_punctual\",this.propertyType=\"Light\",this.parentTypes=[t.NODE]}getDefaults(){return Object.assign(super.getDefaults(),{color:[1,1,1],intensity:1,type:fe.Type.POINT,range:null,innerConeAngle:0,outerConeAngle:Math.PI/4})}getColor(){return this.get(\"color\")}setColor(e){return this.set(\"color\",e)}getColorHex(){return p.factorToHex(this.getColor())}setColorHex(e){const t=this.getColor().slice();return p.hexToFactor(e,t),this.setColor(t)}getIntensity(){return this.get(\"intensity\")}setIntensity(e){return this.set(\"intensity\",e)}getType(){return this.get(\"type\")}setType(e){return this.set(\"type\",e)}getRange(){return this.get(\"range\")}setRange(e){return this.set(\"range\",e)}getInnerConeAngle(){return this.get(\"innerConeAngle\")}setInnerConeAngle(e){return this.set(\"innerConeAngle\",e)}getOuterConeAngle(){return this.get(\"outerConeAngle\")}setOuterConeAngle(e){return this.set(\"outerConeAngle\",e)}}fe.EXTENSION_NAME=\"KHR_lights_punctual\",fe.Type={POINT:\"point\",SPOT:\"spot\",DIRECTIONAL:\"directional\"};const ge=\"KHR_lights_punctual\";class pe extends s{constructor(...e){super(...e),this.extensionName=ge}createLight(e=\"\"){return new fe(this.document.getGraph(),e)}read(e){const t=e.jsonDoc;if(!t.json.extensions||!t.json.extensions[ge])return this;const s=(t.json.extensions[ge].lights||[]).map(e=>{var t,s;const n=this.createLight().setName(e.name||\"\").setType(e.type);return void 0!==e.color&&n.setColor(e.color),void 0!==e.intensity&&n.setIntensity(e.intensity),void 0!==e.range&&n.setRange(e.range),void 0!==(null==(t=e.spot)?void 0:t.innerConeAngle)&&n.setInnerConeAngle(e.spot.innerConeAngle),void 0!==(null==(s=e.spot)?void 0:s.outerConeAngle)&&n.setOuterConeAngle(e.spot.outerConeAngle),n});return t.json.nodes.forEach((t,n)=>{t.extensions&&t.extensions[ge]&&e.nodes[n].setExtension(ge,s[t.extensions[ge].light])}),this}write(e){const t=e.jsonDoc;if(0===this.properties.size)return this;const s=[],n=new Map;for(const e of this.properties){const t=e,r={type:t.getType()};l.eq(t.getColor(),[1,1,1])||(r.color=t.getColor()),1!==t.getIntensity()&&(r.intensity=t.getIntensity()),null!=t.getRange()&&(r.range=t.getRange()),t.getName()&&(r.name=t.getName()),t.getType()===fe.Type.SPOT&&(r.spot={innerConeAngle:t.getInnerConeAngle(),outerConeAngle:t.getOuterConeAngle()}),s.push(r),n.set(t,s.length-1)}return this.document.getRoot().listNodes().forEach(s=>{const r=s.getExtension(ge);if(r){const o=e.nodeIndexMap.get(s),i=t.json.nodes[o];i.extensions=i.extensions||{},i.extensions[ge]={light:n.get(r)}}}),t.json.extensions=t.json.extensions||{},t.json.extensions[ge]={lights:s},this}}pe.EXTENSION_NAME=ge;const{R:xe,G:de}=d;class Te extends e{init(){this.extensionName=\"KHR_materials_anisotropy\",this.propertyType=\"Anisotropy\",this.parentTypes=[t.MATERIAL]}getDefaults(){return Object.assign(super.getDefaults(),{anisotropyStrength:0,anisotropyRotation:0,anisotropyTexture:null,anisotropyTextureInfo:new x(this.graph,\"anisotropyTextureInfo\")})}getAnisotropyStrength(){return this.get(\"anisotropyStrength\")}setAnisotropyStrength(e){return this.set(\"anisotropyStrength\",e)}getAnisotropyRotation(){return this.get(\"anisotropyRotation\")}setAnisotropyRotation(e){return this.set(\"anisotropyRotation\",e)}getAnisotropyTexture(){return this.getRef(\"anisotropyTexture\")}getAnisotropyTextureInfo(){return this.getRef(\"anisotropyTexture\")?this.getRef(\"anisotropyTextureInfo\"):null}setAnisotropyTexture(e){return this.setRef(\"anisotropyTexture\",e,{channels:xe|de})}}Te.EXTENSION_NAME=\"KHR_materials_anisotropy\";const me=\"KHR_materials_anisotropy\";class Ee extends s{constructor(...e){super(...e),this.extensionName=me}createAnisotropy(){return new Te(this.document.getGraph())}read(e){const t=e.jsonDoc,s=t.json.textures||[];return(t.json.materials||[]).forEach((t,n)=>{if(t.extensions&&t.extensions[me]){const r=this.createAnisotropy();e.materials[n].setExtension(me,r);const o=t.extensions[me];if(void 0!==o.anisotropyStrength&&r.setAnisotropyStrength(o.anisotropyStrength),void 0!==o.anisotropyRotation&&r.setAnisotropyRotation(o.anisotropyRotation),void 0!==o.anisotropyTexture){const t=o.anisotropyTexture;r.setAnisotropyTexture(e.textures[s[t.index].source]),e.setTextureInfo(r.getAnisotropyTextureInfo(),t)}}}),this}write(e){const t=e.jsonDoc;return this.document.getRoot().listMaterials().forEach(s=>{const n=s.getExtension(me);if(n){const r=e.materialIndexMap.get(s),o=t.json.materials[r];o.extensions=o.extensions||{};const i=o.extensions[me]={};if(n.getAnisotropyStrength()>0&&(i.anisotropyStrength=n.getAnisotropyStrength()),0!==n.getAnisotropyRotation()&&(i.anisotropyRotation=n.getAnisotropyRotation()),n.getAnisotropyTexture()){const t=n.getAnisotropyTexture(),s=n.getAnisotropyTextureInfo();i.anisotropyTexture=e.createTextureInfoDef(t,s)}}}),this}}Ee.EXTENSION_NAME=me;const{R:Ie,G:Re,B:Ne}=d;class ye extends e{init(){this.extensionName=\"KHR_materials_clearcoat\",this.propertyType=\"Clearcoat\",this.parentTypes=[t.MATERIAL]}getDefaults(){return Object.assign(super.getDefaults(),{clearcoatFactor:0,clearcoatTexture:null,clearcoatTextureInfo:new x(this.graph,\"clearcoatTextureInfo\"),clearcoatRoughnessFactor:0,clearcoatRoughnessTexture:null,clearcoatRoughnessTextureInfo:new x(this.graph,\"clearcoatRoughnessTextureInfo\"),clearcoatNormalScale:1,clearcoatNormalTexture:null,clearcoatNormalTextureInfo:new x(this.graph,\"clearcoatNormalTextureInfo\")})}getClearcoatFactor(){return this.get(\"clearcoatFactor\")}setClearcoatFactor(e){return this.set(\"clearcoatFactor\",e)}getClearcoatTexture(){return this.getRef(\"clearcoatTexture\")}getClearcoatTextureInfo(){return this.getRef(\"clearcoatTexture\")?this.getRef(\"clearcoatTextureInfo\"):null}setClearcoatTexture(e){return this.setRef(\"clearcoatTexture\",e,{channels:Ie})}getClearcoatRoughnessFactor(){return this.get(\"clearcoatRoughnessFactor\")}setClearcoatRoughnessFactor(e){return this.set(\"clearcoatRoughnessFactor\",e)}getClearcoatRoughnessTexture(){return this.getRef(\"clearcoatRoughnessTexture\")}getClearcoatRoughnessTextureInfo(){return this.getRef(\"clearcoatRoughnessTexture\")?this.getRef(\"clearcoatRoughnessTextureInfo\"):null}setClearcoatRoughnessTexture(e){return this.setRef(\"clearcoatRoughnessTexture\",e,{channels:Re})}getClearcoatNormalScale(){return this.get(\"clearcoatNormalScale\")}setClearcoatNormalScale(e){return this.set(\"clearcoatNormalScale\",e)}getClearcoatNormalTexture(){return this.getRef(\"clearcoatNormalTexture\")}getClearcoatNormalTextureInfo(){return this.getRef(\"clearcoatNormalTexture\")?this.getRef(\"clearcoatNormalTextureInfo\"):null}setClearcoatNormalTexture(e){return this.setRef(\"clearcoatNormalTexture\",e,{channels:Ie|Re|Ne})}}ye.EXTENSION_NAME=\"KHR_materials_clearcoat\";const _e=\"KHR_materials_clearcoat\";class Ae extends s{constructor(...e){super(...e),this.extensionName=_e}createClearcoat(){return new ye(this.document.getGraph())}read(e){const t=e.jsonDoc,s=t.json.textures||[];return(t.json.materials||[]).forEach((t,n)=>{if(t.extensions&&t.extensions[_e]){const r=this.createClearcoat();e.materials[n].setExtension(_e,r);const o=t.extensions[_e];if(void 0!==o.clearcoatFactor&&r.setClearcoatFactor(o.clearcoatFactor),void 0!==o.clearcoatRoughnessFactor&&r.setClearcoatRoughnessFactor(o.clearcoatRoughnessFactor),void 0!==o.clearcoatTexture){const t=o.clearcoatTexture;r.setClearcoatTexture(e.textures[s[t.index].source]),e.setTextureInfo(r.getClearcoatTextureInfo(),t)}if(void 0!==o.clearcoatRoughnessTexture){const t=o.clearcoatRoughnessTexture;r.setClearcoatRoughnessTexture(e.textures[s[t.index].source]),e.setTextureInfo(r.getClearcoatRoughnessTextureInfo(),t)}if(void 0!==o.clearcoatNormalTexture){const t=o.clearcoatNormalTexture;r.setClearcoatNormalTexture(e.textures[s[t.index].source]),e.setTextureInfo(r.getClearcoatNormalTextureInfo(),t),void 0!==t.scale&&r.setClearcoatNormalScale(t.scale)}}}),this}write(e){const t=e.jsonDoc;return this.document.getRoot().listMaterials().forEach(s=>{const n=s.getExtension(_e);if(n){const r=e.materialIndexMap.get(s),o=t.json.materials[r];o.extensions=o.extensions||{};const i=o.extensions[_e]={clearcoatFactor:n.getClearcoatFactor(),clearcoatRoughnessFactor:n.getClearcoatRoughnessFactor()};if(n.getClearcoatTexture()){const t=n.getClearcoatTexture(),s=n.getClearcoatTextureInfo();i.clearcoatTexture=e.createTextureInfoDef(t,s)}if(n.getClearcoatRoughnessTexture()){const t=n.getClearcoatRoughnessTexture(),s=n.getClearcoatRoughnessTextureInfo();i.clearcoatRoughnessTexture=e.createTextureInfoDef(t,s)}if(n.getClearcoatNormalTexture()){const t=n.getClearcoatNormalTexture(),s=n.getClearcoatNormalTextureInfo();i.clearcoatNormalTexture=e.createTextureInfoDef(t,s),1!==n.getClearcoatNormalScale()&&(i.clearcoatNormalTexture.scale=n.getClearcoatNormalScale())}}}),this}}Ae.EXTENSION_NAME=_e;class Se extends e{init(){this.extensionName=\"KHR_materials_emissive_strength\",this.propertyType=\"EmissiveStrength\",this.parentTypes=[t.MATERIAL]}getDefaults(){return Object.assign(super.getDefaults(),{emissiveStrength:1})}getEmissiveStrength(){return this.get(\"emissiveStrength\")}setEmissiveStrength(e){return this.set(\"emissiveStrength\",e)}}Se.EXTENSION_NAME=\"KHR_materials_emissive_strength\";const Ce=\"KHR_materials_emissive_strength\";class Me extends s{constructor(...e){super(...e),this.extensionName=Ce}createEmissiveStrength(){return new Se(this.document.getGraph())}read(e){return(e.jsonDoc.json.materials||[]).forEach((t,s)=>{if(t.extensions&&t.extensions[Ce]){const n=this.createEmissiveStrength();e.materials[s].setExtension(Ce,n);const r=t.extensions[Ce];void 0!==r.emissiveStrength&&n.setEmissiveStrength(r.emissiveStrength)}}),this}write(e){const t=e.jsonDoc;return this.document.getRoot().listMaterials().forEach(s=>{const n=s.getExtension(Ce);if(n){const r=e.materialIndexMap.get(s),o=t.json.materials[r];o.extensions=o.extensions||{},o.extensions[Ce]={emissiveStrength:n.getEmissiveStrength()}}}),this}}Me.EXTENSION_NAME=Ce;class Oe extends e{init(){this.extensionName=\"KHR_materials_ior\",this.propertyType=\"IOR\",this.parentTypes=[t.MATERIAL]}getDefaults(){return Object.assign(super.getDefaults(),{ior:1.5})}getIOR(){return this.get(\"ior\")}setIOR(e){return this.set(\"ior\",e)}}Oe.EXTENSION_NAME=\"KHR_materials_ior\";const we=\"KHR_materials_ior\";class De extends s{constructor(...e){super(...e),this.extensionName=we}createIOR(){return new Oe(this.document.getGraph())}read(e){return(e.jsonDoc.json.materials||[]).forEach((t,s)=>{if(t.extensions&&t.extensions[we]){const n=this.createIOR();e.materials[s].setExtension(we,n);const r=t.extensions[we];void 0!==r.ior&&n.setIOR(r.ior)}}),this}write(e){const t=e.jsonDoc;return this.document.getRoot().listMaterials().forEach(s=>{const n=s.getExtension(we);if(n){const r=e.materialIndexMap.get(s),o=t.json.materials[r];o.extensions=o.extensions||{},o.extensions[we]={ior:n.getIOR()}}}),this}}De.EXTENSION_NAME=we;const{R:be,G:Fe}=d;class je extends e{init(){this.extensionName=\"KHR_materials_iridescence\",this.propertyType=\"Iridescence\",this.parentTypes=[t.MATERIAL]}getDefaults(){return Object.assign(super.getDefaults(),{iridescenceFactor:0,iridescenceTexture:null,iridescenceTextureInfo:new x(this.graph,\"iridescenceTextureInfo\"),iridescenceIOR:1.3,iridescenceThicknessMinimum:100,iridescenceThicknessMaximum:400,iridescenceThicknessTexture:null,iridescenceThicknessTextureInfo:new x(this.graph,\"iridescenceThicknessTextureInfo\")})}getIridescenceFactor(){return this.get(\"iridescenceFactor\")}setIridescenceFactor(e){return this.set(\"iridescenceFactor\",e)}getIridescenceTexture(){return this.getRef(\"iridescenceTexture\")}getIridescenceTextureInfo(){return this.getRef(\"iridescenceTexture\")?this.getRef(\"iridescenceTextureInfo\"):null}setIridescenceTexture(e){return this.setRef(\"iridescenceTexture\",e,{channels:be})}getIridescenceIOR(){return this.get(\"iridescenceIOR\")}setIridescenceIOR(e){return this.set(\"iridescenceIOR\",e)}getIridescenceThicknessMinimum(){return this.get(\"iridescenceThicknessMinimum\")}setIridescenceThicknessMinimum(e){return this.set(\"iridescenceThicknessMinimum\",e)}getIridescenceThicknessMaximum(){return this.get(\"iridescenceThicknessMaximum\")}setIridescenceThicknessMaximum(e){return this.set(\"iridescenceThicknessMaximum\",e)}getIridescenceThicknessTexture(){return this.getRef(\"iridescenceThicknessTexture\")}getIridescenceThicknessTextureInfo(){return this.getRef(\"iridescenceThicknessTexture\")?this.getRef(\"iridescenceThicknessTextureInfo\"):null}setIridescenceThicknessTexture(e){return this.setRef(\"iridescenceThicknessTexture\",e,{channels:Fe})}}je.EXTENSION_NAME=\"KHR_materials_iridescence\";const ve=\"KHR_materials_iridescence\";class ke extends s{constructor(...e){super(...e),this.extensionName=ve}createIridescence(){return new je(this.document.getGraph())}read(e){const t=e.jsonDoc,s=t.json.textures||[];return(t.json.materials||[]).forEach((t,n)=>{if(t.extensions&&t.extensions[ve]){const r=this.createIridescence();e.materials[n].setExtension(ve,r);const o=t.extensions[ve];if(void 0!==o.iridescenceFactor&&r.setIridescenceFactor(o.iridescenceFactor),void 0!==o.iridescenceIor&&r.setIridescenceIOR(o.iridescenceIor),void 0!==o.iridescenceThicknessMinimum&&r.setIridescenceThicknessMinimum(o.iridescenceThicknessMinimum),void 0!==o.iridescenceThicknessMaximum&&r.setIridescenceThicknessMaximum(o.iridescenceThicknessMaximum),void 0!==o.iridescenceTexture){const t=o.iridescenceTexture;r.setIridescenceTexture(e.textures[s[t.index].source]),e.setTextureInfo(r.getIridescenceTextureInfo(),t)}if(void 0!==o.iridescenceThicknessTexture){const t=o.iridescenceThicknessTexture;r.setIridescenceThicknessTexture(e.textures[s[t.index].source]),e.setTextureInfo(r.getIridescenceThicknessTextureInfo(),t)}}}),this}write(e){const t=e.jsonDoc;return this.document.getRoot().listMaterials().forEach(s=>{const n=s.getExtension(ve);if(n){const r=e.materialIndexMap.get(s),o=t.json.materials[r];o.extensions=o.extensions||{};const i=o.extensions[ve]={};if(n.getIridescenceFactor()>0&&(i.iridescenceFactor=n.getIridescenceFactor()),1.3!==n.getIridescenceIOR()&&(i.iridescenceIor=n.getIridescenceIOR()),100!==n.getIridescenceThicknessMinimum()&&(i.iridescenceThicknessMinimum=n.getIridescenceThicknessMinimum()),400!==n.getIridescenceThicknessMaximum()&&(i.iridescenceThicknessMaximum=n.getIridescenceThicknessMaximum()),n.getIridescenceTexture()){const t=n.getIridescenceTexture(),s=n.getIridescenceTextureInfo();i.iridescenceTexture=e.createTextureInfoDef(t,s)}if(n.getIridescenceThicknessTexture()){const t=n.getIridescenceThicknessTexture(),s=n.getIridescenceThicknessTextureInfo();i.iridescenceThicknessTexture=e.createTextureInfoDef(t,s)}}}),this}}ke.EXTENSION_NAME=ve;const{R:Be,G:Ge,B:Le,A:He}=d;class Ue extends e{init(){this.extensionName=\"KHR_materials_pbrSpecularGlossiness\",this.propertyType=\"PBRSpecularGlossiness\",this.parentTypes=[t.MATERIAL]}getDefaults(){return Object.assign(super.getDefaults(),{diffuseFactor:[1,1,1,1],diffuseTexture:null,diffuseTextureInfo:new x(this.graph,\"diffuseTextureInfo\"),specularFactor:[1,1,1],glossinessFactor:1,specularGlossinessTexture:null,specularGlossinessTextureInfo:new x(this.graph,\"specularGlossinessTextureInfo\")})}getDiffuseFactor(){return this.get(\"diffuseFactor\")}setDiffuseFactor(e){return this.set(\"diffuseFactor\",e)}getDiffuseHex(){return p.factorToHex(this.getDiffuseFactor())}setDiffuseHex(e){const t=this.getDiffuseFactor().slice();return this.setDiffuseFactor(p.hexToFactor(e,t))}getDiffuseTexture(){return this.getRef(\"diffuseTexture\")}getDiffuseTextureInfo(){return this.getRef(\"diffuseTexture\")?this.getRef(\"diffuseTextureInfo\"):null}setDiffuseTexture(e){return this.setRef(\"diffuseTexture\",e,{channels:Be|Ge|Le|He})}getSpecularFactor(){return this.get(\"specularFactor\")}setSpecularFactor(e){return this.set(\"specularFactor\",e)}getGlossinessFactor(){return this.get(\"glossinessFactor\")}setGlossinessFactor(e){return this.set(\"glossinessFactor\",e)}getSpecularGlossinessTexture(){return this.getRef(\"specularGlossinessTexture\")}getSpecularGlossinessTextureInfo(){return this.getRef(\"specularGlossinessTexture\")?this.getRef(\"specularGlossinessTextureInfo\"):null}setSpecularGlossinessTexture(e){return this.setRef(\"specularGlossinessTexture\",e,{channels:Be|Ge|Le|He})}}Ue.EXTENSION_NAME=\"KHR_materials_pbrSpecularGlossiness\";const Ve=\"KHR_materials_pbrSpecularGlossiness\";class Pe extends s{constructor(...e){super(...e),this.extensionName=Ve}createPBRSpecularGlossiness(){return new Ue(this.document.getGraph())}read(e){const t=e.jsonDoc,s=t.json.textures||[];return(t.json.materials||[]).forEach((t,n)=>{if(t.extensions&&t.extensions[Ve]){const r=this.createPBRSpecularGlossiness();e.materials[n].setExtension(Ve,r);const o=t.extensions[Ve];if(void 0!==o.diffuseFactor&&r.setDiffuseFactor(o.diffuseFactor),void 0!==o.specularFactor&&r.setSpecularFactor(o.specularFactor),void 0!==o.glossinessFactor&&r.setGlossinessFactor(o.glossinessFactor),void 0!==o.diffuseTexture){const t=o.diffuseTexture;r.setDiffuseTexture(e.textures[s[t.index].source]),e.setTextureInfo(r.getDiffuseTextureInfo(),t)}if(void 0!==o.specularGlossinessTexture){const t=o.specularGlossinessTexture;r.setSpecularGlossinessTexture(e.textures[s[t.index].source]),e.setTextureInfo(r.getSpecularGlossinessTextureInfo(),t)}}}),this}write(e){const t=e.jsonDoc;return this.document.getRoot().listMaterials().forEach(s=>{const n=s.getExtension(Ve);if(n){const r=e.materialIndexMap.get(s),o=t.json.materials[r];o.extensions=o.extensions||{};const i=o.extensions[Ve]={diffuseFactor:n.getDiffuseFactor(),specularFactor:n.getSpecularFactor(),glossinessFactor:n.getGlossinessFactor()};if(n.getDiffuseTexture()){const t=n.getDiffuseTexture(),s=n.getDiffuseTextureInfo();i.diffuseTexture=e.createTextureInfoDef(t,s)}if(n.getSpecularGlossinessTexture()){const t=n.getSpecularGlossinessTexture(),s=n.getSpecularGlossinessTextureInfo();i.specularGlossinessTexture=e.createTextureInfoDef(t,s)}}}),this}}Pe.EXTENSION_NAME=Ve;const{R:Xe,G:Ke,B:ze,A:$e}=d;class qe extends e{init(){this.extensionName=\"KHR_materials_sheen\",this.propertyType=\"Sheen\",this.parentTypes=[t.MATERIAL]}getDefaults(){return Object.assign(super.getDefaults(),{sheenColorFactor:[0,0,0],sheenColorTexture:null,sheenColorTextureInfo:new x(this.graph,\"sheenColorTextureInfo\"),sheenRoughnessFactor:0,sheenRoughnessTexture:null,sheenRoughnessTextureInfo:new x(this.graph,\"sheenRoughnessTextureInfo\")})}getSheenColorFactor(){return this.get(\"sheenColorFactor\")}getSheenColorHex(){return p.factorToHex(this.getSheenColorFactor())}setSheenColorFactor(e){return this.set(\"sheenColorFactor\",e)}setSheenColorHex(e){const t=this.getSheenColorFactor().slice();return this.set(\"sheenColorFactor\",p.hexToFactor(e,t))}getSheenColorTexture(){return this.getRef(\"sheenColorTexture\")}getSheenColorTextureInfo(){return this.getRef(\"sheenColorTexture\")?this.getRef(\"sheenColorTextureInfo\"):null}setSheenColorTexture(e){return this.setRef(\"sheenColorTexture\",e,{channels:Xe|Ke|ze})}getSheenRoughnessFactor(){return this.get(\"sheenRoughnessFactor\")}setSheenRoughnessFactor(e){return this.set(\"sheenRoughnessFactor\",e)}getSheenRoughnessTexture(){return this.getRef(\"sheenRoughnessTexture\")}getSheenRoughnessTextureInfo(){return this.getRef(\"sheenRoughnessTexture\")?this.getRef(\"sheenRoughnessTextureInfo\"):null}setSheenRoughnessTexture(e){return this.setRef(\"sheenRoughnessTexture\",e,{channels:$e})}}qe.EXTENSION_NAME=\"KHR_materials_sheen\";const Ye=\"KHR_materials_sheen\";class Qe extends s{constructor(...e){super(...e),this.extensionName=Ye}createSheen(){return new qe(this.document.getGraph())}read(e){const t=e.jsonDoc,s=t.json.textures||[];return(t.json.materials||[]).forEach((t,n)=>{if(t.extensions&&t.extensions[Ye]){const r=this.createSheen();e.materials[n].setExtension(Ye,r);const o=t.extensions[Ye];if(void 0!==o.sheenColorFactor&&r.setSheenColorFactor(o.sheenColorFactor),void 0!==o.sheenRoughnessFactor&&r.setSheenRoughnessFactor(o.sheenRoughnessFactor),void 0!==o.sheenColorTexture){const t=o.sheenColorTexture;r.setSheenColorTexture(e.textures[s[t.index].source]),e.setTextureInfo(r.getSheenColorTextureInfo(),t)}if(void 0!==o.sheenRoughnessTexture){const t=o.sheenRoughnessTexture;r.setSheenRoughnessTexture(e.textures[s[t.index].source]),e.setTextureInfo(r.getSheenRoughnessTextureInfo(),t)}}}),this}write(e){const t=e.jsonDoc;return this.document.getRoot().listMaterials().forEach(s=>{const n=s.getExtension(Ye);if(n){const r=e.materialIndexMap.get(s),o=t.json.materials[r];o.extensions=o.extensions||{};const i=o.extensions[Ye]={sheenColorFactor:n.getSheenColorFactor(),sheenRoughnessFactor:n.getSheenRoughnessFactor()};if(n.getSheenColorTexture()){const t=n.getSheenColorTexture(),s=n.getSheenColorTextureInfo();i.sheenColorTexture=e.createTextureInfoDef(t,s)}if(n.getSheenRoughnessTexture()){const t=n.getSheenRoughnessTexture(),s=n.getSheenRoughnessTextureInfo();i.sheenRoughnessTexture=e.createTextureInfoDef(t,s)}}}),this}}Qe.EXTENSION_NAME=Ye;const{R:We,G:Je,B:Ze,A:et}=d;class tt extends e{init(){this.extensionName=\"KHR_materials_specular\",this.propertyType=\"Specular\",this.parentTypes=[t.MATERIAL]}getDefaults(){return Object.assign(super.getDefaults(),{specularFactor:1,specularTexture:null,specularTextureInfo:new x(this.graph,\"specularTextureInfo\"),specularColorFactor:[1,1,1],specularColorTexture:null,specularColorTextureInfo:new x(this.graph,\"specularColorTextureInfo\")})}getSpecularFactor(){return this.get(\"specularFactor\")}setSpecularFactor(e){return this.set(\"specularFactor\",e)}getSpecularColorFactor(){return this.get(\"specularColorFactor\")}setSpecularColorFactor(e){return this.set(\"specularColorFactor\",e)}getSpecularColorHex(){return p.factorToHex(this.getSpecularColorFactor())}setSpecularColorHex(e){const t=this.getSpecularColorFactor().slice();return this.set(\"specularColorFactor\",p.hexToFactor(e,t))}getSpecularTexture(){return this.getRef(\"specularTexture\")}getSpecularTextureInfo(){return this.getRef(\"specularTexture\")?this.getRef(\"specularTextureInfo\"):null}setSpecularTexture(e){return this.setRef(\"specularTexture\",e,{channels:et})}getSpecularColorTexture(){return this.getRef(\"specularColorTexture\")}getSpecularColorTextureInfo(){return this.getRef(\"specularColorTexture\")?this.getRef(\"specularColorTextureInfo\"):null}setSpecularColorTexture(e){return this.setRef(\"specularColorTexture\",e,{channels:We|Je|Ze})}}tt.EXTENSION_NAME=\"KHR_materials_specular\";const st=\"KHR_materials_specular\";class nt extends s{constructor(...e){super(...e),this.extensionName=st}createSpecular(){return new tt(this.document.getGraph())}read(e){const t=e.jsonDoc,s=t.json.textures||[];return(t.json.materials||[]).forEach((t,n)=>{if(t.extensions&&t.extensions[st]){const r=this.createSpecular();e.materials[n].setExtension(st,r);const o=t.extensions[st];if(void 0!==o.specularFactor&&r.setSpecularFactor(o.specularFactor),void 0!==o.specularColorFactor&&r.setSpecularColorFactor(o.specularColorFactor),void 0!==o.specularTexture){const t=o.specularTexture;r.setSpecularTexture(e.textures[s[t.index].source]),e.setTextureInfo(r.getSpecularTextureInfo(),t)}if(void 0!==o.specularColorTexture){const t=o.specularColorTexture;r.setSpecularColorTexture(e.textures[s[t.index].source]),e.setTextureInfo(r.getSpecularColorTextureInfo(),t)}}}),this}write(e){const t=e.jsonDoc;return this.document.getRoot().listMaterials().forEach(s=>{const n=s.getExtension(st);if(n){const r=e.materialIndexMap.get(s),o=t.json.materials[r];o.extensions=o.extensions||{};const i=o.extensions[st]={};if(1!==n.getSpecularFactor()&&(i.specularFactor=n.getSpecularFactor()),l.eq(n.getSpecularColorFactor(),[1,1,1])||(i.specularColorFactor=n.getSpecularColorFactor()),n.getSpecularTexture()){const t=n.getSpecularTexture(),s=n.getSpecularTextureInfo();i.specularTexture=e.createTextureInfoDef(t,s)}if(n.getSpecularColorTexture()){const t=n.getSpecularColorTexture(),s=n.getSpecularColorTextureInfo();i.specularColorTexture=e.createTextureInfoDef(t,s)}}}),this}}nt.EXTENSION_NAME=st;const{R:rt}=d;class ot extends e{init(){this.extensionName=\"KHR_materials_transmission\",this.propertyType=\"Transmission\",this.parentTypes=[t.MATERIAL]}getDefaults(){return Object.assign(super.getDefaults(),{transmissionFactor:0,transmissionTexture:null,transmissionTextureInfo:new x(this.graph,\"transmissionTextureInfo\")})}getTransmissionFactor(){return this.get(\"transmissionFactor\")}setTransmissionFactor(e){return this.set(\"transmissionFactor\",e)}getTransmissionTexture(){return this.getRef(\"transmissionTexture\")}getTransmissionTextureInfo(){return this.getRef(\"transmissionTexture\")?this.getRef(\"transmissionTextureInfo\"):null}setTransmissionTexture(e){return this.setRef(\"transmissionTexture\",e,{channels:rt})}}ot.EXTENSION_NAME=\"KHR_materials_transmission\";const it=\"KHR_materials_transmission\";class at extends s{constructor(...e){super(...e),this.extensionName=it}createTransmission(){return new ot(this.document.getGraph())}read(e){const t=e.jsonDoc,s=t.json.textures||[];return(t.json.materials||[]).forEach((t,n)=>{if(t.extensions&&t.extensions[it]){const r=this.createTransmission();e.materials[n].setExtension(it,r);const o=t.extensions[it];if(void 0!==o.transmissionFactor&&r.setTransmissionFactor(o.transmissionFactor),void 0!==o.transmissionTexture){const t=o.transmissionTexture;r.setTransmissionTexture(e.textures[s[t.index].source]),e.setTextureInfo(r.getTransmissionTextureInfo(),t)}}}),this}write(e){const t=e.jsonDoc;return this.document.getRoot().listMaterials().forEach(s=>{const n=s.getExtension(it);if(n){const r=e.materialIndexMap.get(s),o=t.json.materials[r];o.extensions=o.extensions||{};const i=o.extensions[it]={transmissionFactor:n.getTransmissionFactor()};if(n.getTransmissionTexture()){const t=n.getTransmissionTexture(),s=n.getTransmissionTextureInfo();i.transmissionTexture=e.createTextureInfoDef(t,s)}}}),this}}at.EXTENSION_NAME=it;class ct extends e{init(){this.extensionName=\"KHR_materials_unlit\",this.propertyType=\"Unlit\",this.parentTypes=[t.MATERIAL]}}ct.EXTENSION_NAME=\"KHR_materials_unlit\";const ut=\"KHR_materials_unlit\";class lt extends s{constructor(...e){super(...e),this.extensionName=ut}createUnlit(){return new ct(this.document.getGraph())}read(e){return(e.jsonDoc.json.materials||[]).forEach((t,s)=>{t.extensions&&t.extensions[ut]&&e.materials[s].setExtension(ut,this.createUnlit())}),this}write(e){const t=e.jsonDoc;return this.document.getRoot().listMaterials().forEach(s=>{if(s.getExtension(ut)){const n=e.materialIndexMap.get(s),r=t.json.materials[n];r.extensions=r.extensions||{},r.extensions[ut]={}}}),this}}lt.EXTENSION_NAME=ut;class ht extends e{init(){this.extensionName=\"KHR_materials_variants\",this.propertyType=\"Mapping\",this.parentTypes=[\"MappingList\"]}getDefaults(){return Object.assign(super.getDefaults(),{material:null,variants:[]})}getMaterial(){return this.getRef(\"material\")}setMaterial(e){return this.setRef(\"material\",e)}addVariant(e){return this.addRef(\"variants\",e)}removeVariant(e){return this.removeRef(\"variants\",e)}listVariants(){return this.listRefs(\"variants\")}}ht.EXTENSION_NAME=\"KHR_materials_variants\";class ft extends e{init(){this.extensionName=\"KHR_materials_variants\",this.propertyType=\"MappingList\",this.parentTypes=[t.PRIMITIVE]}getDefaults(){return Object.assign(super.getDefaults(),{mappings:[]})}addMapping(e){return this.addRef(\"mappings\",e)}removeMapping(e){return this.removeRef(\"mappings\",e)}listMappings(){return this.listRefs(\"mappings\")}}ft.EXTENSION_NAME=\"KHR_materials_variants\";class gt extends e{init(){this.extensionName=\"KHR_materials_variants\",this.propertyType=\"Variant\",this.parentTypes=[\"MappingList\"]}}gt.EXTENSION_NAME=\"KHR_materials_variants\";const pt=\"KHR_materials_variants\";class xt extends s{constructor(...e){super(...e),this.extensionName=pt}createMappingList(){return new ft(this.document.getGraph())}createVariant(e=\"\"){return new gt(this.document.getGraph(),e)}createMapping(){return new ht(this.document.getGraph())}listVariants(){return Array.from(this.properties).filter(e=>e instanceof gt)}read(e){const t=e.jsonDoc;if(!t.json.extensions||!t.json.extensions[pt])return this;const s=(t.json.extensions[pt].variants||[]).map(e=>this.createVariant().setName(e.name||\"\"));return(t.json.meshes||[]).forEach((t,n)=>{const r=e.meshes[n];(t.primitives||[]).forEach((t,n)=>{if(!t.extensions||!t.extensions[pt])return;const o=this.createMappingList(),i=t.extensions[pt];for(const t of i.mappings){const n=this.createMapping();void 0!==t.material&&n.setMaterial(e.materials[t.material]);for(const e of t.variants||[])n.addVariant(s[e]);o.addMapping(n)}r.listPrimitives()[n].setExtension(pt,o)})}),this}write(e){const t=e.jsonDoc,s=this.listVariants();if(!s.length)return this;const n=[],r=new Map;for(const t of s)r.set(t,n.length),n.push(e.createPropertyDef(t));for(const t of this.document.getRoot().listMeshes()){const s=e.meshIndexMap.get(t);t.listPrimitives().forEach((t,n)=>{const o=t.getExtension(pt);if(!o)return;const i=e.jsonDoc.json.meshes[s].primitives[n],a=o.listMappings().map(t=>{const s=e.createPropertyDef(t),n=t.getMaterial();return n&&(s.material=e.materialIndexMap.get(n)),s.variants=t.listVariants().map(e=>r.get(e)),s});i.extensions=i.extensions||{},i.extensions[pt]={mappings:a}})}return t.json.extensions=t.json.extensions||{},t.json.extensions[pt]={variants:n},this}}xt.EXTENSION_NAME=pt;const{G:dt}=d;class Tt extends e{init(){this.extensionName=\"KHR_materials_volume\",this.propertyType=\"Volume\",this.parentTypes=[t.MATERIAL]}getDefaults(){return Object.assign(super.getDefaults(),{thicknessFactor:0,thicknessTexture:null,thicknessTextureInfo:new x(this.graph,\"thicknessTexture\"),attenuationDistance:Infinity,attenuationColor:[1,1,1]})}getThicknessFactor(){return this.get(\"thicknessFactor\")}setThicknessFactor(e){return this.set(\"thicknessFactor\",e)}getThicknessTexture(){return this.getRef(\"thicknessTexture\")}getThicknessTextureInfo(){return this.getRef(\"thicknessTexture\")?this.getRef(\"thicknessTextureInfo\"):null}setThicknessTexture(e){return this.setRef(\"thicknessTexture\",e,{channels:dt})}getAttenuationDistance(){return this.get(\"attenuationDistance\")}setAttenuationDistance(e){return this.set(\"attenuationDistance\",e)}getAttenuationColor(){return this.get(\"attenuationColor\")}setAttenuationColor(e){return this.set(\"attenuationColor\",e)}getAttenuationColorHex(){return p.factorToHex(this.getAttenuationColor())}setAttenuationColorHex(e){const t=this.getAttenuationColor().slice();return this.set(\"attenuationColor\",p.hexToFactor(e,t))}}Tt.EXTENSION_NAME=\"KHR_materials_volume\";const mt=\"KHR_materials_volume\";class Et extends s{constructor(...e){super(...e),this.extensionName=mt}createVolume(){return new Tt(this.document.getGraph())}read(e){const t=e.jsonDoc,s=t.json.textures||[];return(t.json.materials||[]).forEach((t,n)=>{if(t.extensions&&t.extensions[mt]){const r=this.createVolume();e.materials[n].setExtension(mt,r);const o=t.extensions[mt];if(void 0!==o.thicknessFactor&&r.setThicknessFactor(o.thicknessFactor),void 0!==o.attenuationDistance&&r.setAttenuationDistance(o.attenuationDistance),void 0!==o.attenuationColor&&r.setAttenuationColor(o.attenuationColor),void 0!==o.thicknessTexture){const t=o.thicknessTexture;r.setThicknessTexture(e.textures[s[t.index].source]),e.setTextureInfo(r.getThicknessTextureInfo(),t)}}}),this}write(e){const t=e.jsonDoc;return this.document.getRoot().listMaterials().forEach(s=>{const n=s.getExtension(mt);if(n){const r=e.materialIndexMap.get(s),o=t.json.materials[r];o.extensions=o.extensions||{};const i=o.extensions[mt]={};if(n.getThicknessFactor()>0&&(i.thicknessFactor=n.getThicknessFactor()),Number.isFinite(n.getAttenuationDistance())&&(i.attenuationDistance=n.getAttenuationDistance()),l.eq(n.getAttenuationColor(),[1,1,1])||(i.attenuationColor=n.getAttenuationColor()),n.getThicknessTexture()){const t=n.getThicknessTexture(),s=n.getThicknessTextureInfo();i.thicknessTexture=e.createTextureInfoDef(t,s)}}}),this}}Et.EXTENSION_NAME=mt;const It=\"KHR_mesh_quantization\";class Rt extends s{constructor(...e){super(...e),this.extensionName=It}read(e){return this}write(e){return this}}Rt.EXTENSION_NAME=It;const Nt=\"KHR_texture_basisu\";class yt{match(e){return 171===e[0]&&75===e[1]&&84===e[2]&&88===e[3]&&32===e[4]&&50===e[5]&&48===e[6]&&187===e[7]&&13===e[8]&&10===e[9]&&26===e[10]&&10===e[11]}getSize(e){const t=T(e);return[t.pixelWidth,t.pixelHeight]}getChannels(e){const t=T(e).dataFormatDescriptor[0];if(t.colorModel===m)return 2===t.samples.length&&15==(15&t.samples[1].channelType)?4:3;if(t.colorModel===E)return 3==(15&t.samples[0].channelType)?4:3;throw new Error(`Unexpected KTX2 colorModel, \"${t.colorModel}\".`)}getVRAMByteLength(e){const t=T(e),s=this.getChannels(e)>3;let n=0;for(let e=0;e<t.levels.length;e++){const r=t.levels[e];n+=r.uncompressedByteLength?r.uncompressedByteLength:Math.max(1,Math.floor(t.pixelWidth/Math.pow(2,e)))/4*(Math.max(1,Math.floor(t.pixelHeight/Math.pow(2,e)))/4)*(s?16:8)}return n}}class _t extends s{constructor(...e){super(...e),this.extensionName=Nt,this.prereadTypes=[t.TEXTURE]}static register(){f.registerFormat(\"image/ktx2\",new yt)}preread(e){return e.jsonDoc.json.textures.forEach(e=>{e.extensions&&e.extensions[Nt]&&(e.source=e.extensions[Nt].source)}),this}read(e){return this}write(e){const t=e.jsonDoc;return this.document.getRoot().listTextures().forEach(s=>{if(\"image/ktx2\"===s.getMimeType()){const n=e.imageIndexMap.get(s);t.json.textures.forEach(e=>{e.source===n&&(e.extensions=e.extensions||{},e.extensions[Nt]={source:e.source},delete e.source)})}}),this}}_t.EXTENSION_NAME=Nt;class At extends e{init(){this.extensionName=\"KHR_texture_transform\",this.propertyType=\"Transform\",this.parentTypes=[t.TEXTURE_INFO]}getDefaults(){return Object.assign(super.getDefaults(),{offset:[0,0],rotation:0,scale:[1,1],texCoord:null})}getOffset(){return this.get(\"offset\")}setOffset(e){return this.set(\"offset\",e)}getRotation(){return this.get(\"rotation\")}setRotation(e){return this.set(\"rotation\",e)}getScale(){return this.get(\"scale\")}setScale(e){return this.set(\"scale\",e)}getTexCoord(){return this.get(\"texCoord\")}setTexCoord(e){return this.set(\"texCoord\",e)}}At.EXTENSION_NAME=\"KHR_texture_transform\";const St=\"KHR_texture_transform\";class Ct extends s{constructor(...e){super(...e),this.extensionName=St}createTransform(){return new At(this.document.getGraph())}read(e){for(const[t,s]of Array.from(e.textureInfos.entries())){if(!s.extensions||!s.extensions[St])continue;const e=this.createTransform(),n=s.extensions[St];void 0!==n.offset&&e.setOffset(n.offset),void 0!==n.rotation&&e.setRotation(n.rotation),void 0!==n.scale&&e.setScale(n.scale),void 0!==n.texCoord&&e.setTexCoord(n.texCoord),t.setExtension(St,e)}return this}write(e){const t=Array.from(e.textureInfoDefMap.entries());for(const[e,s]of t){const t=e.getExtension(St);if(!t)continue;s.extensions=s.extensions||{};const n={},r=l.eq;r(t.getOffset(),[0,0])||(n.offset=t.getOffset()),0!==t.getRotation()&&(n.rotation=t.getRotation()),r(t.getScale(),[1,1])||(n.scale=t.getScale()),null!=t.getTexCoord()&&(n.texCoord=t.getTexCoord()),s.extensions[St]=n}return this}}Ct.EXTENSION_NAME=St;const Mt=[t.ROOT,t.SCENE,t.NODE,t.MESH,t.MATERIAL,t.TEXTURE,t.ANIMATION];class Ot extends e{init(){this.extensionName=\"KHR_xmp_json_ld\",this.propertyType=\"Packet\",this.parentTypes=Mt}getDefaults(){return Object.assign(super.getDefaults(),{context:{},properties:{}})}getContext(){return this.get(\"context\")}setContext(e){return this.set(\"context\",_({},e))}listProperties(){return Object.keys(this.get(\"properties\"))}getProperty(e){const t=this.get(\"properties\");return e in t?t[e]:null}setProperty(e,t){this._assertContext(e);const s=_({},this.get(\"properties\"));return t?s[e]=t:delete s[e],this.set(\"properties\",s)}toJSONLD(){return _({\"@context\":wt(this.get(\"context\"))},wt(this.get(\"properties\")))}fromJSONLD(e){const t=(e=wt(e))[\"@context\"];return t&&this.set(\"context\",t),delete e[\"@context\"],this.set(\"properties\",e)}_assertContext(e){if(!(e.split(\":\")[0]in this.get(\"context\")))throw new Error(`KHR_xmp_json_ld: Missing context for term, \"${e}\".`)}}function wt(e){return JSON.parse(JSON.stringify(e))}Ot.EXTENSION_NAME=\"KHR_xmp_json_ld\";const Dt=\"KHR_xmp_json_ld\";class bt extends s{constructor(...e){super(...e),this.extensionName=Dt}createPacket(){return new Ot(this.document.getGraph())}listPackets(){return Array.from(this.properties)}read(e){var t;const s=null==(t=e.jsonDoc.json.extensions)?void 0:t[Dt];if(!s||!s.packets)return this;const n=e.jsonDoc.json,r=this.document.getRoot(),o=s.packets.map(e=>this.createPacket().fromJSONLD(e)),i=[[n.asset],n.scenes,n.nodes,n.meshes,n.materials,n.images,n.animations],a=[[r],r.listScenes(),r.listNodes(),r.listMeshes(),r.listMaterials(),r.listTextures(),r.listAnimations()];for(let e=0;e<i.length;e++){const t=i[e]||[];for(let s=0;s<t.length;s++){const n=t[s];n.extensions&&n.extensions[Dt]&&a[e][s].setExtension(Dt,o[n.extensions[Dt].packet])}}return this}write(e){const{json:s}=e.jsonDoc,n=[];for(const r of this.properties){n.push(r.toJSONLD());for(const o of r.listParents()){let r;switch(o.propertyType){case t.ROOT:r=s.asset;break;case t.SCENE:r=s.scenes[e.sceneIndexMap.get(o)];break;case t.NODE:r=s.nodes[e.nodeIndexMap.get(o)];break;case t.MESH:r=s.meshes[e.meshIndexMap.get(o)];break;case t.MATERIAL:r=s.materials[e.materialIndexMap.get(o)];break;case t.TEXTURE:r=s.images[e.imageIndexMap.get(o)];break;case t.ANIMATION:r=s.animations[e.animationIndexMap.get(o)];break;default:r=null,this.document.getLogger().warn(`[${Dt}]: Unsupported parent property, \"${o.propertyType}\"`)}r&&(r.extensions=r.extensions||{},r.extensions[Dt]={packet:n.length-1})}}return n.length>0&&(s.extensions=s.extensions||{},s.extensions[Dt]={packets:n}),this}}bt.EXTENSION_NAME=Dt;const Ft=[le,pe,Ee,Ae,Me,De,ke,Pe,nt,Qe,at,lt,xt,Et,Rt,_t,Ct,bt],jt=[y,L,V,z,...Ft];export{jt as ALL_EXTENSIONS,Te as Anisotropy,ye as Clearcoat,y as EXTMeshGPUInstancing,L as EXTMeshoptCompression,V as EXTTextureAVIF,z as EXTTextureWebP,Se as EmissiveStrength,I as INSTANCE_ATTRIBUTE,Oe as IOR,R as InstancedMesh,je as Iridescence,le as KHRDracoMeshCompression,pe as KHRLightsPunctual,Ee as KHRMaterialsAnisotropy,Ae as KHRMaterialsClearcoat,Me as KHRMaterialsEmissiveStrength,De as KHRMaterialsIOR,ke as KHRMaterialsIridescence,Pe as KHRMaterialsPBRSpecularGlossiness,Qe as KHRMaterialsSheen,nt as KHRMaterialsSpecular,at as KHRMaterialsTransmission,lt as KHRMaterialsUnlit,xt as KHRMaterialsVariants,Et as KHRMaterialsVolume,Rt as KHRMeshQuantization,Ft as KHRONOS_EXTENSIONS,_t as KHRTextureBasisu,Ct as KHRTextureTransform,bt as KHRXMP,fe as Light,ht as Mapping,ft as MappingList,Ue as PBRSpecularGlossiness,Ot as Packet,qe as Sheen,tt as Specular,At as Transform,ot as Transmission,ct as Unlit,gt as Variant,Tt as Volume};\n//# sourceMappingURL=extensions.modern.js.map\n","import {\n Extension,\n ExtensionProperty,\n GLTF,\n Graph,\n Property,\n PropertyType,\n ReaderContext,\n Texture,\n TextureChannel,\n TextureInfo,\n WebIO,\n WriterContext,\n} from '@gltf-transform/core'\nimport {EncoderOptions} from '@gltf-transform/extensions/dist/khr-draco-mesh-compression/encoder'\nimport {ALL_EXTENSIONS, KHRDracoMeshCompression} from '@gltf-transform/extensions'\nimport {DRACOLoader2, GLTFExporter2, GLTFExporter2Options, GLTFViewerConfigExtension, IExportParser} from 'threepipe'\n\n/**\n * GLTF Draco Exporter\n *\n * Extension of GLTFExporter2 that runs the output through gltf-transform for draco compression.\n */\nexport class GLTFDracoExporter extends GLTFExporter2 implements IExportParser {\n public loader?: DRACOLoader2 // required for loading draco libs.\n private _io: WebIO\n private _loadedLibs = false\n private _encoderOptions: EncoderOptions\n\n constructor(encoderOptions?: EncoderOptions, loader?: DRACOLoader2) {\n super()\n encoderOptions = encoderOptions || {\n method: KHRDracoMeshCompression.EncoderMethod.EDGEBREAKER,\n encodeSpeed: 5,\n }\n this._io = new WebIO().registerExtensions(ALL_EXTENSIONS)\n .registerExtensions([\n GLTFViewerConfigExtensionGP,\n ])\n this._encoderOptions = encoderOptions\n\n if (loader) {\n this.loader = loader\n this.loader.setDecoderConfig({type: 'js'}) // todo: hack for now.\n this.loader.preload(true, true)\n }\n\n }\n\n preload(): this {\n this._loadLibs()\n return this\n }\n\n private async _loadLibs() {\n if (this._loadedLibs || !this.loader) return\n\n const libs = await Promise.all([\n this.loader.initEncoder(),\n this.loader.initDecoder(),\n ])\n this._io.registerDependencies({\n ['draco3d.encoder']: libs[0],\n ['draco3d.decoder']: libs[1], // only required if we are loading a draco compressed gltf\n })\n this._loadedLibs = true\n\n }\n\n async parseAsync(obj: any, {compress = false, dracoOptions, ...options}: {compress: boolean, dracoOptions?: EncoderOptions} & GLTFExporter2Options): Promise<Blob> {\n if (!this.loader) {\n console.error('GLTFDracoExporter: No DRACOLoader2 instance provided')\n return super.parseAsync(obj, options)\n }\n await this._loadLibs()\n\n const ops = {...options}\n if (compress) {\n // externalImagesInExtras: this is required because gltf-transform doesn't support external images in glb\n // see https://github.com/donmccurdy/glTF-Transform/discussions/644\n ops.externalImagesInExtras = true\n }\n\n const uncompressed = await new Promise((resolve, reject) => this.parse(obj, resolve, reject, ops)) as any\n\n const uncompressedBlob = await super.parseAsync(uncompressed, ops)\n if (!compress) return uncompressedBlob\n\n if (!uncompressed) throw new Error('GLTFDracoExporter: gltf is null')\n\n let gltf = uncompressed\n\n const bytes = (gltf as ArrayBuffer).byteLength || Infinity\n\n const iDocument = await (typeof gltf === 'object' && !(gltf as any).byteLength ? this._io.readJSON({\n json: gltf as GLTF.IGLTF,\n resources: {},\n }) : this._io.readBinary(new Uint8Array(gltf as ArrayBuffer)))\n\n // iDocument.createExtension(GLTFViewerConfigExtensionGP)\n iDocument.createExtension(KHRDracoMeshCompression)\n .setRequired(true)\n .setEncoderOptions({...this._encoderOptions, ...dracoOptions ?? {}})\n\n if (ops.exportExt === 'glb') {\n gltf = await this._io.writeBinary(iDocument)\n if (isFinite(bytes)) {\n console.log('DRACO Compression ratio: ' + ((gltf as ArrayBuffer).byteLength / bytes).toFixed(5))\n }\n } else {\n const jDoc = await this._io.writeJSON(iDocument)\n gltf = jDoc.json\n if (Object.values(jDoc.resources).filter(v => v).length > 0) {\n console.warn('DRACOExporter: extra resources in resources not supported properly')\n ;(gltf as any).resources = jDoc.resources\n }\n }\n\n gltf.__isGLTFOutput = true\n const blob = await super.parseAsync(gltf, ops) as any // this will just convert it to blob because __isGLTFOutput is set (checked in GLTFExporter2)\n if (!blob) throw new Error('GLTFDracoExporter: blob is null')\n blob.ext = 'glb'\n ;(blob as any).__uncompressed = uncompressedBlob\n return blob\n }\n\n addExtension(extension: typeof Extension): this {\n this._io.registerExtensions([extension])\n return this\n }\n createAndAddExtension(name: string, textures?: Record<string, string|number>): this {\n return this.addExtension(createGenericExtensionClass(name, textures))\n }\n}\n\ndeclare module 'threepipe'{\n interface GLTFExporter2Options {\n compress?: boolean\n dracoOptions?: EncoderOptions\n }\n}\n\n// for @gltf-transform/core\nclass ViewerJSONExtensionProperty extends ExtensionProperty {\n readonly extensionName: string = GLTFViewerConfigExtension.ViewerConfigGLTFExtension\n readonly parentTypes: string[] = [PropertyType.SCENE]\n readonly propertyType: string = 'ViewerJSON'\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n protected init(): void {return}\n\n}\nclass GLTFViewerConfigExtensionGP extends Extension {\n public readonly extensionName = GLTFViewerConfigExtension.ViewerConfigGLTFExtension\n public static readonly EXTENSION_NAME = GLTFViewerConfigExtension.ViewerConfigGLTFExtension\n private _viewerConfig: any = {}\n // private _texturesRef: [any, Texture][] = []\n\n read(context: ReaderContext): this {\n this._viewerConfig = {}\n context.jsonDoc.json.scenes?.forEach((sceneDef, sceneIndex)=>{\n if (sceneDef.extensions && sceneDef.extensions[GLTFViewerConfigExtension.ViewerConfigGLTFExtension]) {\n const prop = new ViewerJSONExtensionProperty(this.document.getGraph())\n context.scenes[sceneIndex].setExtension(GLTFViewerConfigExtension.ViewerConfigGLTFExtension, prop)\n this._viewerConfig = sceneDef.extensions[GLTFViewerConfigExtension.ViewerConfigGLTFExtension] as any\n // prop.setExtras()\n\n /*\n const buffers = [] as any[]\n\n Object.values(viewerConfig.resources).forEach((res: any) => {\n Object.values(res).forEach((item: any) => {\n if (!item.url) return\n if (item.url.data?.image !== null) {\n buffers.push(item.url)\n }\n })\n })\n const jsonDoc = context.jsonDoc\n console.log(buffers)\n for (const buffer of buffers) {\n const img = buffer.data.image as number\n const imageDef = jsonDoc.json.images![img]\n const bufferViewDef = jsonDoc.json.bufferViews![imageDef.bufferView!]\n const bufferDef = jsonDoc.json.buffers![bufferViewDef.buffer]\n const bufferData = bufferDef.uri ? jsonDoc.resources[bufferDef.uri] : jsonDoc.resources[GLB_BUFFER]\n const byteOffset = bufferViewDef.byteOffset || 0\n const byteLength = bufferViewDef.byteLength\n const imageData = bufferData.slice(byteOffset, byteOffset + byteLength)\n const texture = this.document.createTexture(imageDef.name)\n texture.setImage(imageData)\n this._texturesRef.push([buffer, texture])\n }\n */\n\n\n }\n })\n return this\n }\n\n write(context: WriterContext): this {\n this.document.getRoot().listScenes().forEach((scene)=>{\n const prop = scene.getExtension(GLTFViewerConfigExtension.ViewerConfigGLTFExtension)\n if (prop) {\n const sceneDef = context.jsonDoc.json.scenes?.[context.jsonDoc.json.scene || 0] // todo: get proper scene index, if working with multiple scenes\n if (sceneDef && Object.keys(this._viewerConfig).length > 0) {\n sceneDef.extensions = sceneDef.extensions || {}\n\n /*\n console.log(context.jsonDoc.json.images)\n for (const [buffer, texture] of this._texturesRef) {\n const imageDef = context.createPropertyDef(texture) as GLTF.IImage\n context.createImageData(imageDef, texture.getImage()!, texture)\n buffer.data.image = context.jsonDoc.json.images!.push(imageDef) - 1\n context.imageIndexMap.set(texture, buffer.data.image)\n }\n console.log(context.jsonDoc.json)\n */\n\n sceneDef.extensions[GLTFViewerConfigExtension.ViewerConfigGLTFExtension] = this._viewerConfig\n\n // this._texturesRef = []\n this._viewerConfig = {}\n\n }\n }\n })\n\n return this\n }\n\n required = true\n}\n\nclass GenericExtensionProperty extends ExtensionProperty<any> {\n readonly extensionName: string\n readonly parentTypes: string[] = [PropertyType.MATERIAL, PropertyType.MESH, PropertyType.NODE, PropertyType.SCENE]\n readonly propertyType: string = 'GenericExtension'\n textures: Record<string, [TextureInfo, Texture|null]> = {}\n\n addTexture(key: string, texInfo: TextureInfo, texture: Texture | null, channels = 0x1111) {\n this.setRef(key, texture, {channels})\n this.textures[key] = [texInfo, texture]\n }\n\n constructor(graph: Graph<Property>, name: string, extensionName: string) {\n super(graph, name)\n this.extensionName = extensionName\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n protected init(): void {return}\n}\n\n// see transmission extension for reference\nabstract class GenericExtension extends Extension {\n abstract readonly extensionName: string\n\n textureChannels: Record<string, number> = {}\n\n read(context: ReaderContext): this {\n const jsonDoc = context.jsonDoc\n // console.log(jsonDoc)\n const materialDefs = jsonDoc.json.materials || []\n const textureDefs = jsonDoc.json.textures || []\n materialDefs.forEach((materialDef, materialIndex) => {\n if (materialDef.extensions && materialDef.extensions[this.extensionName]) {\n const paramsExt = new GenericExtensionProperty(this.document.getGraph(), '', this.extensionName)\n context.materials[materialIndex].setExtension(this.extensionName, paramsExt)\n const paramsExtDef = materialDef.extensions[this.extensionName] as Record<string, any>\n const paramsExtDef2 = {...paramsExtDef}\n\n for (const [key, value] of Object.entries(paramsExtDef2)) {\n if (typeof value?.index === 'number') { // this is a texture...\n const textureInfoDef = value\n const source = textureDefs[textureInfoDef.index]?.source\n if (typeof source !== 'number') {\n console.warn('GLTF Pipeline: source texture not found for texture info', textureInfoDef)\n continue\n }\n const texture = context.textures[source]\n const texInfo = new TextureInfo(this.document.getGraph())\n const channels = this.textureChannels[key] ?? 0x1111\n paramsExt.addTexture(key, texInfo, texture, channels)\n context.setTextureInfo(texInfo, textureInfoDef)\n delete paramsExtDef2[key]\n }\n }\n\n paramsExt.setExtras(paramsExtDef2)\n // console.log({...paramsExtDef})\n }\n })\n const meshDefs = jsonDoc.json.meshes || []\n meshDefs.forEach((meshDef, meshIndex) => {\n if (meshDef.extensions && meshDef.extensions[this.extensionName]) {\n const paramsExt = new GenericExtensionProperty(this.document.getGraph(), '', this.extensionName)\n context.meshes[meshIndex].setExtension(this.extensionName, paramsExt)\n const paramsExtDef = meshDef.extensions[this.extensionName] as Record<string, any>\n paramsExt.setExtras(paramsExtDef)\n }\n })\n const nodeDefs = jsonDoc.json.nodes || []\n nodeDefs.forEach((nodeDef, nodeIndex) => {\n if (nodeDef.extensions && nodeDef.extensions[this.extensionName]) {\n const paramsExt = new GenericExtensionProperty(this.document.getGraph(), '', this.extensionName)\n context.nodes[nodeIndex].setExtension(this.extensionName, paramsExt)\n const paramsExtDef = nodeDef.extensions[this.extensionName] as Record<string, any>\n paramsExt.setExtras(paramsExtDef)\n // console.log(paramsExtDef)\n }\n })\n const sceneDefs = jsonDoc.json.scenes || []\n sceneDefs.forEach((sceneDef, sceneIndex) => {\n if (sceneDef.extensions && sceneDef.extensions[this.extensionName]) {\n const paramsExt = new GenericExtensionProperty(this.document.getGraph(), '', this.extensionName)\n context.scenes[sceneIndex].setExtension(this.extensionName, paramsExt)\n const paramsExtDef = sceneDef.extensions[this.extensionName] as Record<string, any>\n paramsExt.setExtras(paramsExtDef)\n // console.log(paramsExtDef)\n }\n })\n\n return this\n }\n\n write(context: WriterContext): this {\n const jsonDoc = context.jsonDoc\n this.document.getRoot()\n .listMaterials()\n .forEach((material) => {\n const paramsExt = material.getExtension<GenericExtensionProperty>(this.extensionName)\n // console.log(paramsExt)\n if (paramsExt) {\n const materialIndex = context.materialIndexMap.get(material)!\n const materialDef = jsonDoc.json.materials![materialIndex]\n materialDef.extensions = materialDef.extensions || {}\n const extensionDef = paramsExt.getExtras()\n const extensionDef2 = {...extensionDef}\n\n // console.log(paramsExt.textures)\n for (const [key, value] of Object.entries(paramsExt.textures)) {\n const textureInfo = value[0]\n const textureLink = value[1]\n const texture = textureLink\n\n if (texture)\n extensionDef2[key] = context.createTextureInfoDef(texture, textureInfo)\n\n // console.log(texture)\n\n }\n // console.log(extensionDef2)\n\n materialDef.extensions[this.extensionName] = extensionDef2\n }\n })\n this.document.getRoot()\n .listMeshes()\n .forEach((mesh) => {\n const paramsExt = mesh.getExtension<GenericExtensionProperty>(this.extensionName)\n if (paramsExt) {\n const meshIndex = context.meshIndexMap.get(mesh)!\n const meshDef = jsonDoc.json.meshes![meshIndex]\n meshDef.extensions = meshDef.extensions || {}\n meshDef.extensions[this.extensionName] = paramsExt.getExtras()\n }\n })\n this.document.getRoot()\n .listNodes()\n .forEach((node) => {\n const paramsExt = node.getExtension<GenericExtensionProperty>(this.extensionName)\n if (paramsExt) {\n const nodeIndex = context.nodeIndexMap.get(node)!\n const nodeDef = jsonDoc.json.nodes![nodeIndex]\n nodeDef.extensions = nodeDef.extensions || {}\n nodeDef.extensions[this.extensionName] = paramsExt.getExtras()\n }\n })\n this.document.getRoot()\n .listScenes()\n .forEach((scene) => {\n const paramsExt = scene.getExtension<GenericExtensionProperty>(this.extensionName)\n if (paramsExt) {\n const sceneIndex = context.jsonDoc.json.scene || 0 // todo: get proper scene index, if working with multiple scenes, this will do the default one.\n const sceneDef = jsonDoc.json.scenes![sceneIndex]\n if (!sceneDef) return\n sceneDef.extensions = sceneDef.extensions || {}\n sceneDef.extensions[this.extensionName] = paramsExt.getExtras()\n }\n })\n\n return this\n }\n\n}\n\nfunction stringToChannel(s: string) {\n let r = 0\n if (s.includes('R')) r |= TextureChannel.R\n if (s.includes('G')) r |= TextureChannel.G\n if (s.includes('B')) r |= TextureChannel.B\n if (s.includes('A')) r |= TextureChannel.A\n return r\n}\n\nexport function createGenericExtensionClass(name: string, textures?: Record<string, string|number>): typeof GenericExtension {\n return class extends GenericExtension {\n public static readonly EXTENSION_NAME = name\n readonly extensionName = name\n textureChannels: Record<string, number> = !textures ? {} : Object.fromEntries(\n Object.entries(textures)\n .map(([k, v])=>\n [k, typeof v === 'number' ? v : stringToChannel(v)])\n )\n }\n}\n","import {\n AssetExporterPlugin,\n AViewerPluginSync,\n DRACOLoader2,\n generateUUID,\n GLTFLightExtrasExtension,\n GLTFMaterialExtrasExtension,\n GLTFMaterialsAlphaMapExtension,\n GLTFMaterialsBumpMapExtension,\n GLTFMaterialsDisplacementMapExtension,\n GLTFMaterialsLightMapExtension,\n GLTFObject3DExtrasExtension,\n IExporter,\n ThreeViewer,\n clearCoatTintGLTFExtension,\n customBumpMapGLTFExtension,\n noiseBumpMaterialGLTFExtension,\n fragmentClippingGLTFExtension,\n} from 'threepipe'\nimport {GLTFDracoExporter} from './GLTFDracoExporter'\nimport {UiObjectConfig} from 'uiconfig.js'\nimport {EncoderOptions} from '@gltf-transform/extensions/dist/khr-draco-mesh-compression/encoder'\n\nexport enum EncoderMethod {\n EDGEBREAKER = 1,\n SEQUENTIAL = 0\n}\n\n/**\n * GLTF Draco Export Plugin\n *\n * Overloads the default gltf exporter in the asset manager with GLTFDracoExporter. When exporting with compress = true, the output will be compressed.\n * Note - Only `glb` supported right now.\n *\n * @category Plugins\n */\nexport class GLTFDracoExportPlugin extends AViewerPluginSync {\n public static readonly PluginType = 'GLTFDracoExportPlugin'\n enabled = true\n\n /**\n * These are added here, but also added as plugins. Added here by default so that the data is not lost if some plugin is not added in an app.\n * To explicitly remove the data, use `removeExtension` with the name of the extension\n */\n extraExtensions = [\n [GLTFMaterialsBumpMapExtension.WebGiMaterialsBumpMapExtension, GLTFMaterialsBumpMapExtension.Textures],\n [GLTFMaterialsLightMapExtension.WebGiMaterialsLightMapExtension, GLTFMaterialsLightMapExtension.Textures],\n [GLTFMaterialsAlphaMapExtension.WebGiMaterialsAlphaMapExtension, GLTFMaterialsAlphaMapExtension.Textures],\n [GLTFMaterialsDisplacementMapExtension.WebGiMaterialsDisplacementMapExtension, GLTFMaterialsDisplacementMapExtension.Textures],\n [customBumpMapGLTFExtension.name, customBumpMapGLTFExtension.textures],\n [GLTFLightExtrasExtension.WebGiLightExtrasExtension, GLTFLightExtrasExtension.Textures],\n [GLTFObject3DExtrasExtension.WebGiObject3DExtrasExtension, GLTFObject3DExtrasExtension.Textures],\n [GLTFMaterialExtrasExtension.WebGiMaterialExtrasExtension, GLTFMaterialExtrasExtension.Textures],\n [clearCoatTintGLTFExtension.name, clearCoatTintGLTFExtension.textures],\n [noiseBumpMaterialGLTFExtension.name, noiseBumpMaterialGLTFExtension.textures],\n [fragmentClippingGLTFExtension.name, fragmentClippingGLTFExtension.textures],\n\n // extenal plugins\n\n // AnisotropyMaterialExtension\n ['WEBGI_materials_anisotropy', {\n anisotropyDirection: 'RGB',\n }],\n // todo port\n // DiamondMaterialExtension\n // AnimationMarkersExtension\n // ThinFilmLayerMaterialExtension\n // TriplanarMappingMaterialExtension\n // SSBevelMaterialExtension\n ] as [string, Record<string, string|number>|undefined][]\n\n addExtension(name: string, textures?: Record<string, string|number>) {\n const ext = this.extraExtensions.findIndex(e => e[0] === name)\n if (ext >= 0) this.extraExtensions[ext] = [name, textures]\n else this.extraExtensions.push([name, textures])\n }\n\n /**\n * Note - don't remove an extension when removing a plugin.\n *\n * extensions can be removed if you don't want to save the data of some plugin when transforming glb. But since this is not desirable in most cases, it is not recommended.\n * @param name\n */\n removeExtension(name: string) {\n const ext = this.extraExtensions.findIndex(e => e[0] === name)\n if (ext >= 0) this.extraExtensions.splice(ext, 1)\n }\n\n private _lastExporter?: IExporter['ctor'] = undefined\n\n protected _ctor: IExporter['ctor'] = (_, _exporter) => {\n if (!this._viewer) throw new Error('Viewer not set')\n const tempFile = generateUUID() + '.drc' // dummy\n const ex = new GLTFDracoExporter({},\n // todo unregister on dispose\n this._viewer.assetManager.importer.registerFile(tempFile) as DRACOLoader2)\n ex.setup(this._viewer, _exporter.extensions)\n for (const [ext, config] of this.extraExtensions) {\n ex.createAndAddExtension(ext, config)\n }\n return ex\n }\n\n onAdded(viewer: ThreeViewer): void {\n super.onAdded(viewer)\n const exporter = viewer.assetManager.exporter\n\n let glbExporter = exporter.getExporter('glb')\n this._lastExporter = glbExporter?.ctor\n if (!glbExporter) {\n console.error('GLTFDracoExportPlugin: GLB exporter not found in AssetManager.exporter, creating a new one.')\n glbExporter = {\n ext: ['glb', 'gltf'],\n extensions: [],\n ctor: this._ctor,\n }\n exporter.addExporter(glbExporter)\n } else {\n glbExporter.ctor = this._ctor\n }\n\n // for ui. todo use viewer.forPlugin\n const exportPlugin = viewer.getPlugin(AssetExporterPlugin)\n if (exportPlugin) {\n Object.assign(exportPlugin.exportOptions, {\n compress: false,\n dracoOptions: {\n encodeSpeed: 5,\n method: EncoderMethod.EDGEBREAKER,\n quantizationVolume: 'mesh',\n quantizationBits: {\n ['POSITION']: 14,\n ['NORMAL']: 10,\n ['COLOR']: 8,\n ['TEX_COORD']: 12,\n ['GENERIC']: 12,\n },\n } as EncoderOptions,\n })\n const exportOptions = exportPlugin.uiConfig.children?.find(c => (c as UiObjectConfig).label === 'GLB Export') as UiObjectConfig\n if (exportOptions) {\n exportOptions.children = [this._makeUi(exportPlugin), ...exportOptions.children || []]\n } else {\n console.warn('GLTFDracoExportPlugin: Unable to setup UI')\n }\n }\n }\n\n onRemove(viewer: ThreeViewer) {\n const exporter = viewer.assetManager.exporter\n const glbExporter = exporter.getExporter('glb')\n if (glbExporter && this._lastExporter) {\n glbExporter.ctor = this._lastExporter\n }\n super.onRemove(viewer)\n }\n\n protected _makeUi = (exporter: AssetExporterPlugin)=>[\n {\n type: 'checkbox',\n label: 'DRACO Compress',\n property: [exporter.exportOptions, 'compress'],\n onChange: ()=>exporter.uiConfig.uiRefresh?.(true),\n },\n {\n type: 'folder',\n hidden: ()=>!exporter.exportOptions.compress,\n label: 'DRACO Options',\n children: [\n {\n type: 'slider',\n label: 'Encode Speed',\n bounds: [1, 10],\n property: [exporter.exportOptions.dracoOptions, 'encodeSpeed'],\n },\n {\n type: 'dropdown',\n label: 'Encoder Method',\n property: [exporter.exportOptions.dracoOptions, 'method'],\n children: Object.entries(EncoderMethod).map(([k, v]) => ({label: k, value: v})),\n },\n {\n type: 'dropdown',\n label: 'Quantization Volume',\n property: [exporter.exportOptions.dracoOptions, 'quantizationVolume'],\n children: ['mesh', 'scene', 'bbox'].map(v => ({label: v})),\n },\n {\n type: 'folder',\n label: 'Quantization Bits',\n children: Object.keys(exporter.exportOptions.dracoOptions?.quantizationBits || {}).map(k => ({\n type: 'slider',\n label: k,\n bounds: [1, 16],\n stepSize: 1,\n property: [exporter.exportOptions.dracoOptions?.quantizationBits, k],\n })),\n },\n ],\n },\n ]\n}\n"],"names":["l","b","ref","w","y","v","t","r","A","s","e","S","R","O","C","F","U","B","c","h","f","d","g","p","m","T","x","P","E","M","I","N","n","i","o","a","u","L","j","D","_","k","z","G","J","$","V","W","q","H","Y","K","Z","X","tt","rt","st","nt","it","ot","at","ut","ct","lt","gt","pt","ft","mt","ht","wt","Q","et","yt","dt","Tt","xt","At","Et","St","Mt","It","Rt","Nt","Ot","Ct","bt","Ft","GLTFExporter2","KHRDracoMeshCompression","WebIO","ALL_EXTENSIONS","ExtensionProperty","GLTFViewerConfigExtension","PropertyType","Extension","TextureInfo","TextureChannel","EncoderMethod","AViewerPluginSync","GLTFMaterialsBumpMapExtension","GLTFMaterialsLightMapExtension","GLTFMaterialsAlphaMapExtension","GLTFMaterialsDisplacementMapExtension","customBumpMapGLTFExtension","GLTFLightExtrasExtension","GLTFObject3DExtrasExtension","GLTFMaterialExtrasExtension","clearCoatTintGLTFExtension","noiseBumpMaterialGLTFExtension","fragmentClippingGLTFExtension","generateUUID","_a","AssetExporterPlugin"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../node_modules/property-graph/dist/property-graph.modern.js","../node_modules/@gltf-transform/core/dist/index.modern.js","../node_modules/ktx-parse/dist/ktx-parse.modern.js","../node_modules/@gltf-transform/extensions/dist/index.modern.js","../src/GLTFDracoExporter.ts","../src/GLTFDracoExportPlugin.ts","../node_modules/iota-array/iota.js","../node_modules/is-buffer/index.js","../node_modules/ndarray/ndarray.js","../node_modules/uniq/uniq.js","../node_modules/cwise-compiler/lib/compile.js","../node_modules/cwise-compiler/lib/thunk.js","../node_modules/cwise-compiler/compiler.js","../node_modules/ndarray-ops/ndarray-ops.js","../node_modules/ndarray-pixels/dist/ndarray-pixels-browser.modern.js","../node_modules/@gltf-transform/functions/dist/functions.modern.js","../src/GLTFSpecGlossinessConverterPlugin.ts"],"sourcesContent":["class EventDispatcher {\n constructor() {\n this._listeners = {};\n }\n\n addEventListener(type, listener) {\n const listeners = this._listeners;\n\n if (listeners[type] === undefined) {\n listeners[type] = [];\n }\n\n if (listeners[type].indexOf(listener) === -1) {\n listeners[type].push(listener);\n }\n\n return this;\n }\n\n removeEventListener(type, listener) {\n const listeners = this._listeners;\n const listenerArray = listeners[type];\n\n if (listenerArray !== undefined) {\n const index = listenerArray.indexOf(listener);\n\n if (index !== -1) {\n listenerArray.splice(index, 1);\n }\n }\n\n return this;\n }\n\n dispatchEvent(event) {\n const listeners = this._listeners;\n const listenerArray = listeners[event.type];\n\n if (listenerArray !== undefined) {\n // Make a copy, in case listeners are removed while iterating.\n const array = listenerArray.slice(0);\n\n for (let i = 0, l = array.length; i < l; i++) {\n array[i].call(this, event);\n }\n }\n\n return this;\n }\n\n dispose() {\n for (const key in this._listeners) {\n delete this._listeners[key];\n }\n }\n\n}\n\n/**\n * Represents a connection between two {@link GraphNode} resources in a {@link Graph}.\n *\n * The left node is considered the owner, and the right node the resource. The\n * owner is responsible for being able find and remove a reference to a resource, given\n * that link. The resource does not hold a reference to the link or to the owner,\n * although that reverse lookup can be done on the graph.\n */\nclass GraphEdge {\n constructor(_name, _parent, _child, _attributes = {}) {\n this._name = void 0;\n this._parent = void 0;\n this._child = void 0;\n this._attributes = void 0;\n this._disposed = false;\n this._name = _name;\n this._parent = _parent;\n this._child = _child;\n this._attributes = _attributes;\n\n if (!_parent.isOnGraph(_child)) {\n throw new Error('Cannot connect disconnected graphs.');\n }\n }\n /** Name (attribute name from parent {@link GraphNode}). */\n\n\n getName() {\n return this._name;\n }\n /** Owner node. */\n\n\n getParent() {\n return this._parent;\n }\n /** Resource node. */\n\n\n getChild() {\n return this._child;\n }\n /**\n * Sets the child node.\n *\n * @internal Only {@link Graph} implementations may safely call this method directly. Use\n * \t{@link Property.swap} or {@link Graph.swapChild} instead.\n */\n\n\n setChild(child) {\n this._child = child;\n return this;\n }\n /** Attributes of the graph node relationship. */\n\n\n getAttributes() {\n return this._attributes;\n }\n /** Destroys a (currently intact) edge, updating both the graph and the owner. */\n\n\n dispose() {\n if (this._disposed) return; // @ts-expect-error GraphEdge doesn't know types of parent GraphNode.\n\n this._parent._destroyRef(this);\n\n this._disposed = true;\n }\n /** Whether this link has been destroyed. */\n\n\n isDisposed() {\n return this._disposed;\n }\n\n}\n\n/**\n * A graph manages a network of {@link GraphNode} nodes, connected\n * by {@link @Link} edges.\n */\n\nclass Graph extends EventDispatcher {\n constructor(...args) {\n super(...args);\n this._emptySet = new Set();\n this._edges = new Set();\n this._parentEdges = new Map();\n this._childEdges = new Map();\n }\n\n /** Returns a list of all parent->child edges on this graph. */\n listEdges() {\n return Array.from(this._edges);\n }\n /** Returns a list of all edges on the graph having the given node as their child. */\n\n\n listParentEdges(node) {\n return Array.from(this._childEdges.get(node) || this._emptySet);\n }\n /** Returns a list of parent nodes for the given child node. */\n\n\n listParents(node) {\n const parentSet = new Set();\n\n for (const edge of this.listParentEdges(node)) {\n parentSet.add(edge.getParent());\n }\n\n return Array.from(parentSet);\n }\n /** Returns a list of all edges on the graph having the given node as their parent. */\n\n\n listChildEdges(node) {\n return Array.from(this._parentEdges.get(node) || this._emptySet);\n }\n /** Returns a list of child nodes for the given parent node. */\n\n\n listChildren(node) {\n const childSet = new Set();\n\n for (const edge of this.listChildEdges(node)) {\n childSet.add(edge.getChild());\n }\n\n return Array.from(childSet);\n }\n\n disconnectParents(node, filter) {\n for (const edge of this.listParentEdges(node)) {\n if (!filter || filter(edge.getParent())) {\n edge.dispose();\n }\n }\n\n return this;\n }\n /**********************************************************************************************\n * Internal.\n */\n\n /**\n * Creates a {@link GraphEdge} connecting two {@link GraphNode} instances. Edge is returned\n * for the caller to store.\n * @param a Owner\n * @param b Resource\n * @hidden\n * @internal\n */\n\n\n _createEdge(name, a, b, attributes) {\n const edge = new GraphEdge(name, a, b, attributes);\n\n this._edges.add(edge);\n\n const parent = edge.getParent();\n if (!this._parentEdges.has(parent)) this._parentEdges.set(parent, new Set());\n\n this._parentEdges.get(parent).add(edge);\n\n const child = edge.getChild();\n if (!this._childEdges.has(child)) this._childEdges.set(child, new Set());\n\n this._childEdges.get(child).add(edge);\n\n return edge;\n }\n /**\n * Detaches a {@link GraphEdge} from the {@link Graph}. Before calling this\n * method, ensure that the GraphEdge has first been detached from any\n * associated {@link GraphNode} attributes.\n * @hidden\n * @internal\n */\n\n\n _destroyEdge(edge) {\n this._edges.delete(edge);\n\n this._parentEdges.get(edge.getParent()).delete(edge);\n\n this._childEdges.get(edge.getChild()).delete(edge);\n\n return this;\n }\n\n}\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\n/**\n * An ordered collection of {@link Ref Refs}, allowing duplicates. Removing\n * a Ref is an O(n) operation — use {@link RefSet} for faster removal, if\n * duplicates are not required.\n */\nclass RefList {\n constructor(refs) {\n this.list = [];\n\n if (refs) {\n for (const ref of refs) {\n this.list.push(ref);\n }\n }\n }\n\n add(ref) {\n this.list.push(ref);\n }\n\n remove(ref) {\n const index = this.list.indexOf(ref);\n if (index >= 0) this.list.splice(index, 1);\n }\n\n removeChild(child) {\n const refs = [];\n\n for (const ref of this.list) {\n if (ref.getChild() === child) {\n refs.push(ref);\n }\n }\n\n for (const ref of refs) {\n this.remove(ref);\n }\n\n return refs;\n }\n\n listRefsByChild(child) {\n const refs = [];\n\n for (const ref of this.list) {\n if (ref.getChild() === child) {\n refs.push(ref);\n }\n }\n\n return refs;\n }\n\n values() {\n return this.list;\n }\n\n}\n/**\n * An ordered collection of {@link Ref Refs}, without duplicates. Adding or\n * removing a Ref is typically O(1) or O(log(n)), and faster than\n * {@link RefList}. If support for duplicates is required, use {@link RefList}.\n */\n\nclass RefSet {\n constructor(refs) {\n this.set = new Set();\n this.map = new Map();\n\n if (refs) {\n for (const ref of refs) {\n this.add(ref);\n }\n }\n }\n\n add(ref) {\n const child = ref.getChild();\n this.removeChild(child);\n this.set.add(ref);\n this.map.set(child, ref);\n }\n\n remove(ref) {\n this.set.delete(ref);\n this.map.delete(ref.getChild());\n }\n\n removeChild(child) {\n const ref = this.map.get(child) || null;\n if (ref) this.remove(ref);\n return ref;\n }\n\n getRefByChild(child) {\n return this.map.get(child) || null;\n }\n\n values() {\n return Array.from(this.set);\n }\n\n}\n/**\n * Map (or dictionary) from string keys to {@link Ref Refs}.\n */\n\nclass RefMap {\n constructor(map) {\n this.map = {};\n\n if (map) {\n Object.assign(this.map, map);\n }\n }\n\n set(key, child) {\n this.map[key] = child;\n }\n\n delete(key) {\n delete this.map[key];\n }\n\n get(key) {\n return this.map[key] || null;\n }\n\n keys() {\n return Object.keys(this.map);\n }\n\n values() {\n return Object.values(this.map);\n }\n\n}\n\nconst $attributes = Symbol('attributes');\nconst $immutableKeys = Symbol('immutableKeys');\n/**\n * Represents a node in a {@link Graph}.\n */\n\nclass GraphNode extends EventDispatcher {\n /**\n * Internal graph used to search and maintain references.\n * @hidden\n */\n\n /**\n * Attributes (literal values and GraphNode references) associated with this instance. For each\n * GraphNode reference, the attributes stores a {@link GraphEdge}. List and Map references are\n * stored as arrays and dictionaries of edges.\n * @internal\n */\n\n /**\n * Attributes included with `getDefaultAttributes` are considered immutable, and cannot be\n * modifed by `.setRef()`, `.copy()`, or other GraphNode methods. Both the edges and the\n * properties will be disposed with the parent GraphNode.\n *\n * Currently, only single-edge references (getRef/setRef) are supported as immutables.\n *\n * @internal\n */\n constructor(graph) {\n super();\n this._disposed = false;\n this.graph = void 0;\n this[$attributes] = void 0;\n this[$immutableKeys] = void 0;\n this.graph = graph;\n this[$immutableKeys] = new Set();\n this[$attributes] = this._createAttributes();\n }\n /**\n * Returns default attributes for the graph node. Subclasses having any attributes (either\n * literal values or references to other graph nodes) must override this method. Literal\n * attributes should be given their default values, if any. References should generally be\n * initialized as empty (Ref → null, RefList → [], RefMap → {}) and then modified by setters.\n *\n * Any single-edge references (setRef) returned by this method will be considered immutable,\n * to be owned by and disposed with the parent node. Multi-edge references (addRef, removeRef,\n * setRefMap) cannot be returned as default attributes.\n */\n\n\n getDefaults() {\n return {};\n }\n /**\n * Constructs and returns an object used to store a graph nodes attributes. Compared to the\n * default Attributes interface, this has two distinctions:\n *\n * 1. Slots for GraphNode<T> objects are replaced with slots for GraphEdge<this, GraphNode<T>>\n * 2. GraphNode<T> objects provided as defaults are considered immutable\n *\n * @internal\n */\n\n\n _createAttributes() {\n const defaultAttributes = this.getDefaults();\n const attributes = {};\n\n for (const key in defaultAttributes) {\n const value = defaultAttributes[key]; // TODO(design): With Ref, RefList, and RefMap types, should users\n // be able to pass them all here? Listeners must be added.\n\n if (value instanceof GraphNode) {\n const ref = this.graph._createEdge(key, this, value);\n\n this[$immutableKeys].add(key);\n attributes[key] = ref;\n } else {\n attributes[key] = value;\n }\n }\n\n return attributes;\n }\n /** @internal Returns true if two nodes are on the same {@link Graph}. */\n\n\n isOnGraph(other) {\n return this.graph === other.graph;\n }\n /** Returns true if the node has been permanently removed from the graph. */\n\n\n isDisposed() {\n return this._disposed;\n }\n /**\n * Removes both inbound references to and outbound references from this object. At the end\n * of the process the object holds no references, and nothing holds references to it. A\n * disposed object is not reusable.\n */\n\n\n dispose() {\n if (this._disposed) return;\n this.graph.listChildEdges(this).forEach(edge => edge.dispose());\n this.graph.disconnectParents(this);\n this._disposed = true;\n this.dispatchEvent({\n type: 'dispose'\n });\n }\n /**\n * Removes all inbound references to this object. At the end of the process the object is\n * considered 'detached': it may hold references to child resources, but nothing holds\n * references to it. A detached object may be re-attached.\n */\n\n\n detach() {\n this.graph.disconnectParents(this);\n return this;\n }\n /**\n * Transfers this object's references from the old node to the new one. The old node is fully\n * detached from this parent at the end of the process.\n *\n * @hidden\n */\n\n\n swap(prevValue, nextValue) {\n for (const attribute in this[$attributes]) {\n const value = this[$attributes][attribute];\n\n if (value instanceof GraphEdge) {\n const ref = value;\n\n if (ref.getChild() === prevValue) {\n this.setRef(attribute, nextValue, ref.getAttributes());\n }\n } else if (value instanceof RefList) {\n for (const ref of value.listRefsByChild(prevValue)) {\n const refAttributes = ref.getAttributes();\n this.removeRef(attribute, prevValue);\n this.addRef(attribute, nextValue, refAttributes);\n }\n } else if (value instanceof RefSet) {\n const ref = value.getRefByChild(prevValue);\n\n if (ref) {\n const refAttributes = ref.getAttributes();\n this.removeRef(attribute, prevValue);\n this.addRef(attribute, nextValue, refAttributes);\n }\n } else if (value instanceof RefMap) {\n for (const key of value.keys()) {\n const ref = value.get(key);\n\n if (ref.getChild() === prevValue) {\n this.setRefMap(attribute, key, nextValue, ref.getAttributes());\n }\n }\n }\n }\n\n return this;\n }\n /**********************************************************************************************\n * Literal attributes.\n */\n\n /** @hidden */\n\n\n get(attribute) {\n return this[$attributes][attribute];\n }\n /** @hidden */\n\n\n set(attribute, value) {\n this[$attributes][attribute] = value;\n return this.dispatchEvent({\n type: 'change',\n attribute\n });\n }\n /**********************************************************************************************\n * Ref: 1:1 graph node references.\n */\n\n /** @hidden */\n\n\n getRef(attribute) {\n const ref = this[$attributes][attribute];\n return ref ? ref.getChild() : null;\n }\n /** @hidden */\n\n\n setRef(attribute, value, attributes) {\n if (this[$immutableKeys].has(attribute)) {\n throw new Error(`Cannot overwrite immutable attribute, \"${attribute}\".`);\n }\n\n const prevRef = this[$attributes][attribute];\n if (prevRef) prevRef.dispose(); // TODO(cleanup): Possible duplicate event.\n\n if (!value) return this;\n\n const ref = this.graph._createEdge(attribute, this, value, attributes);\n\n this[$attributes][attribute] = ref;\n return this.dispatchEvent({\n type: 'change',\n attribute\n });\n }\n /**********************************************************************************************\n * RefList: 1:many graph node references.\n */\n\n /** @hidden */\n\n\n listRefs(attribute) {\n const refs = this.assertRefList(attribute);\n return refs.values().map(ref => ref.getChild());\n }\n /** @hidden */\n\n\n addRef(attribute, value, attributes) {\n const ref = this.graph._createEdge(attribute, this, value, attributes);\n\n const refs = this.assertRefList(attribute);\n refs.add(ref);\n return this.dispatchEvent({\n type: 'change',\n attribute\n });\n }\n /** @hidden */\n\n\n removeRef(attribute, value) {\n const refs = this.assertRefList(attribute);\n\n if (refs instanceof RefList) {\n for (const ref of refs.listRefsByChild(value)) {\n ref.dispose();\n }\n } else {\n const ref = refs.getRefByChild(value);\n if (ref) ref.dispose();\n }\n\n return this;\n }\n /** @hidden */\n\n\n assertRefList(attribute) {\n const refs = this[$attributes][attribute];\n\n if (refs instanceof RefList || refs instanceof RefSet) {\n return refs;\n } // TODO(v3) Remove warning.\n\n\n throw new Error(`Expected RefList or RefSet for attribute \"${attribute}\"`);\n }\n /**********************************************************************************************\n * RefMap: Named 1:many (map) graph node references.\n */\n\n /** @hidden */\n\n\n listRefMapKeys(attribute) {\n return this.assertRefMap(attribute).keys();\n }\n /** @hidden */\n\n\n listRefMapValues(attribute) {\n return this.assertRefMap(attribute).values().map(ref => ref.getChild());\n }\n /** @hidden */\n\n\n getRefMap(attribute, key) {\n const refMap = this.assertRefMap(attribute);\n const ref = refMap.get(key);\n return ref ? ref.getChild() : null;\n }\n /** @hidden */\n\n\n setRefMap(attribute, key, value, metadata) {\n const refMap = this.assertRefMap(attribute);\n const prevRef = refMap.get(key);\n if (prevRef) prevRef.dispose(); // TODO(cleanup): Possible duplicate event.\n\n if (!value) return this;\n metadata = Object.assign(metadata || {}, {\n key: key\n });\n\n const ref = this.graph._createEdge(attribute, this, value, _extends({}, metadata, {\n key\n }));\n\n refMap.set(key, ref);\n return this.dispatchEvent({\n type: 'change',\n attribute,\n key\n });\n }\n /** @hidden */\n\n\n assertRefMap(attribute) {\n const map = this[$attributes][attribute];\n\n if (map instanceof RefMap) {\n return map;\n } // TODO(v3) Remove warning.\n\n\n throw new Error(`Expected RefMap for attribute \"${attribute}\"`);\n }\n /**********************************************************************************************\n * Events.\n */\n\n /**\n * Dispatches an event on the GraphNode, and on the associated\n * Graph. Event types on the graph are prefixed, `\"node:[type]\"`.\n */\n\n\n dispatchEvent(event) {\n super.dispatchEvent(_extends({}, event, {\n target: this\n }));\n this.graph.dispatchEvent(_extends({}, event, {\n target: this,\n type: `node:${event.type}`\n }));\n return this;\n }\n /**********************************************************************************************\n * Internal.\n */\n\n /** @hidden */\n\n\n _destroyRef(ref) {\n const attribute = ref.getName();\n\n if (this[$attributes][attribute] === ref) {\n this[$attributes][attribute] = null; // TODO(design): See _createAttributes().\n\n if (this[$immutableKeys].has(attribute)) ref.getChild().dispose();\n } else if (this[$attributes][attribute] instanceof RefList) {\n this[$attributes][attribute].remove(ref);\n } else if (this[$attributes][attribute] instanceof RefSet) {\n this[$attributes][attribute].remove(ref);\n } else if (this[$attributes][attribute] instanceof RefMap) {\n const refMap = this[$attributes][attribute];\n\n for (const key of refMap.keys()) {\n if (refMap.get(key) === ref) {\n refMap.delete(key);\n }\n }\n } else {\n return;\n }\n\n this.graph._destroyEdge(ref);\n\n this.dispatchEvent({\n type: 'change',\n attribute\n });\n }\n\n}\n\nexport { $attributes, $immutableKeys, EventDispatcher, Graph, GraphEdge, GraphNode, RefList, RefMap, RefSet };\n//# sourceMappingURL=property-graph.modern.js.map\n","import { GraphNode, $attributes, GraphEdge, $immutableKeys, RefList, RefSet, RefMap, Graph } from 'property-graph';\nexport { Graph, GraphEdge, RefList, RefMap, RefSet } from 'property-graph';\n\n/**\n * Current version of the package.\n * @hidden\n */\nconst VERSION = `v${\"4.2.0\"}`;\n/** @hidden */\nconst GLB_BUFFER = '@glb.bin';\n/** String IDs for core {@link Property} types. */\nvar PropertyType;\n(function (PropertyType) {\n PropertyType[\"ACCESSOR\"] = \"Accessor\";\n PropertyType[\"ANIMATION\"] = \"Animation\";\n PropertyType[\"ANIMATION_CHANNEL\"] = \"AnimationChannel\";\n PropertyType[\"ANIMATION_SAMPLER\"] = \"AnimationSampler\";\n PropertyType[\"BUFFER\"] = \"Buffer\";\n PropertyType[\"CAMERA\"] = \"Camera\";\n PropertyType[\"MATERIAL\"] = \"Material\";\n PropertyType[\"MESH\"] = \"Mesh\";\n PropertyType[\"PRIMITIVE\"] = \"Primitive\";\n PropertyType[\"PRIMITIVE_TARGET\"] = \"PrimitiveTarget\";\n PropertyType[\"NODE\"] = \"Node\";\n PropertyType[\"ROOT\"] = \"Root\";\n PropertyType[\"SCENE\"] = \"Scene\";\n PropertyType[\"SKIN\"] = \"Skin\";\n PropertyType[\"TEXTURE\"] = \"Texture\";\n PropertyType[\"TEXTURE_INFO\"] = \"TextureInfo\";\n})(PropertyType || (PropertyType = {}));\n/** Vertex layout method. */\nvar VertexLayout;\n(function (VertexLayout) {\n /**\n * Stores vertex attributes in a single buffer view per mesh primitive. Interleaving vertex\n * data may improve performance by reducing page-thrashing in GPU memory.\n */\n VertexLayout[\"INTERLEAVED\"] = \"interleaved\";\n /**\n * Stores each vertex attribute in a separate buffer view. May decrease performance by causing\n * page-thrashing in GPU memory. Some 3D engines may prefer this layout, e.g. for simplicity.\n */\n VertexLayout[\"SEPARATE\"] = \"separate\";\n})(VertexLayout || (VertexLayout = {}));\n/** Accessor usage. */\nvar BufferViewUsage$1;\n(function (BufferViewUsage) {\n BufferViewUsage[\"ARRAY_BUFFER\"] = \"ARRAY_BUFFER\";\n BufferViewUsage[\"ELEMENT_ARRAY_BUFFER\"] = \"ELEMENT_ARRAY_BUFFER\";\n BufferViewUsage[\"INVERSE_BIND_MATRICES\"] = \"INVERSE_BIND_MATRICES\";\n BufferViewUsage[\"OTHER\"] = \"OTHER\";\n BufferViewUsage[\"SPARSE\"] = \"SPARSE\";\n})(BufferViewUsage$1 || (BufferViewUsage$1 = {}));\n/** Texture channels. */\nvar TextureChannel;\n(function (TextureChannel) {\n TextureChannel[TextureChannel[\"R\"] = 4096] = \"R\";\n TextureChannel[TextureChannel[\"G\"] = 256] = \"G\";\n TextureChannel[TextureChannel[\"B\"] = 16] = \"B\";\n TextureChannel[TextureChannel[\"A\"] = 1] = \"A\";\n})(TextureChannel || (TextureChannel = {}));\nvar Format;\n(function (Format) {\n Format[\"GLTF\"] = \"GLTF\";\n Format[\"GLB\"] = \"GLB\";\n})(Format || (Format = {}));\nconst ComponentTypeToTypedArray = {\n '5120': Int8Array,\n '5121': Uint8Array,\n '5122': Int16Array,\n '5123': Uint16Array,\n '5125': Uint32Array,\n '5126': Float32Array\n};\n\n/**\n * Common utilities\n * @module glMatrix\n */\nvar ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};\n\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\n\nfunction create() {\n var out = new ARRAY_TYPE(3);\n\n if (ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nfunction length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.hypot(x, y, z);\n}\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\n\nfunction transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\n(function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n})();\n\n/** @hidden Implemented in /core for use by /extensions, publicly exported from /functions. */\nfunction getBounds(node) {\n const resultBounds = createBounds();\n const parents = node.propertyType === PropertyType.NODE ? [node] : node.listChildren();\n for (const parent of parents) {\n parent.traverse(node => {\n const mesh = node.getMesh();\n if (!mesh) return;\n // Compute mesh bounds and update result.\n const meshBounds = getMeshBounds(mesh, node.getWorldMatrix());\n if (meshBounds.min.every(isFinite) && meshBounds.max.every(isFinite)) {\n expandBounds(meshBounds.min, resultBounds);\n expandBounds(meshBounds.max, resultBounds);\n }\n });\n }\n return resultBounds;\n}\n/** Computes mesh bounds in world space. */\nfunction getMeshBounds(mesh, worldMatrix) {\n const meshBounds = createBounds();\n // We can't transform a local AABB into world space and still have a tight AABB in world space,\n // so we need to compute the world AABB vertex by vertex here.\n for (const prim of mesh.listPrimitives()) {\n const position = prim.getAttribute('POSITION');\n const indices = prim.getIndices();\n if (!position) continue;\n let localPos = [0, 0, 0];\n let worldPos = [0, 0, 0];\n for (let i = 0, il = indices ? indices.getCount() : position.getCount(); i < il; i++) {\n const index = indices ? indices.getScalar(i) : i;\n localPos = position.getElement(index, localPos);\n worldPos = transformMat4(worldPos, localPos, worldMatrix);\n expandBounds(worldPos, meshBounds);\n }\n }\n return meshBounds;\n}\n/** Expands bounds of target by given source. */\nfunction expandBounds(point, target) {\n for (let i = 0; i < 3; i++) {\n target.min[i] = Math.min(point[i], target.min[i]);\n target.max[i] = Math.max(point[i], target.max[i]);\n }\n}\n/** Creates new bounds with min=Infinity, max=-Infinity. */\nfunction createBounds() {\n return {\n min: [Infinity, Infinity, Infinity],\n max: [-Infinity, -Infinity, -Infinity]\n };\n}\n\n/**\n * *Common utilities for working with Uint8Array and Buffer objects.*\n *\n * @category Utilities\n */\nclass BufferUtils {\n /** Creates a byte array from a Data URI. */\n static createBufferFromDataURI(dataURI) {\n if (typeof Buffer === 'undefined') {\n // Browser.\n const byteString = atob(dataURI.split(',')[1]);\n const ia = new Uint8Array(byteString.length);\n for (let i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n return ia;\n } else {\n // Node.js.\n const data = dataURI.split(',')[1];\n const isBase64 = dataURI.indexOf('base64') >= 0;\n return Buffer.from(data, isBase64 ? 'base64' : 'utf8');\n }\n }\n /** Encodes text to a byte array. */\n static encodeText(text) {\n return new TextEncoder().encode(text);\n }\n /** Decodes a byte array to text. */\n static decodeText(array) {\n return new TextDecoder().decode(array);\n }\n /**\n * Concatenates N byte arrays.\n */\n static concat(arrays) {\n let totalByteLength = 0;\n for (const array of arrays) {\n totalByteLength += array.byteLength;\n }\n const result = new Uint8Array(totalByteLength);\n let byteOffset = 0;\n for (const array of arrays) {\n result.set(array, byteOffset);\n byteOffset += array.byteLength;\n }\n return result;\n }\n /**\n * Pads a Uint8Array to the next 4-byte boundary.\n *\n * Reference: [glTF → Data Alignment](https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data-alignment)\n */\n static pad(srcArray, paddingByte = 0) {\n const paddedLength = this.padNumber(srcArray.byteLength);\n if (paddedLength === srcArray.byteLength) return srcArray;\n const dstArray = new Uint8Array(paddedLength);\n dstArray.set(srcArray);\n if (paddingByte !== 0) {\n for (let i = srcArray.byteLength; i < paddedLength; i++) {\n dstArray[i] = paddingByte;\n }\n }\n return dstArray;\n }\n /** Pads a number to 4-byte boundaries. */\n static padNumber(v) {\n return Math.ceil(v / 4) * 4;\n }\n /** Returns true if given byte array instances are equal. */\n static equals(a, b) {\n if (a === b) return true;\n if (a.byteLength !== b.byteLength) return false;\n let i = a.byteLength;\n while (i--) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n }\n /**\n * Returns a Uint8Array view of a typed array, with the same underlying ArrayBuffer.\n *\n * A shorthand for:\n *\n * ```js\n * const buffer = new Uint8Array(\n * \tarray.buffer,\n * \tarray.byteOffset + byteOffset,\n * \tMath.min(array.byteLength, byteLength)\n * );\n * ```\n *\n */\n static toView(a, byteOffset = 0, byteLength = Infinity) {\n return new Uint8Array(a.buffer, a.byteOffset + byteOffset, Math.min(a.byteLength, byteLength));\n }\n static assertView(view) {\n if (view && !ArrayBuffer.isView(view)) {\n throw new Error(`Method requires Uint8Array parameter; received \"${typeof view}\".`);\n }\n return view;\n }\n}\n\n/**\n * *Common utilities for working with colors in vec3, vec4, or hexadecimal form.*\n *\n * Provides methods to convert linear components (vec3, vec4) to sRGB hex values. All colors in\n * the glTF specification, excluding color textures, are linear. Hexadecimal values, in sRGB\n * colorspace, are accessible through helper functions in the API as a convenience.\n *\n * ```typescript\n * // Hex (sRGB) to factor (linear).\n * const factor = ColorUtils.hexToFactor(0xFFCCCC, []);\n *\n * // Factor (linear) to hex (sRGB).\n * const hex = ColorUtils.factorToHex([1, .25, .25])\n * ```\n *\n * @category Utilities\n */\nclass ColorUtils {\n /**\n * Converts sRGB hexadecimal to linear components.\n * @typeParam T vec3 or vec4 linear components.\n */\n static hexToFactor(hex, target) {\n hex = Math.floor(hex);\n const _target = target;\n _target[0] = (hex >> 16 & 255) / 255;\n _target[1] = (hex >> 8 & 255) / 255;\n _target[2] = (hex & 255) / 255;\n return this.convertSRGBToLinear(target, target);\n }\n /**\n * Converts linear components to sRGB hexadecimal.\n * @typeParam T vec3 or vec4 linear components.\n */\n static factorToHex(factor) {\n const target = [...factor];\n const [r, g, b] = this.convertLinearToSRGB(factor, target);\n return r * 255 << 16 ^ g * 255 << 8 ^ b * 255 << 0;\n }\n /**\n * Converts sRGB components to linear components.\n * @typeParam T vec3 or vec4 linear components.\n */\n static convertSRGBToLinear(source, target) {\n const _source = source;\n const _target = target;\n for (let i = 0; i < 3; i++) {\n _target[i] = _source[i] < 0.04045 ? _source[i] * 0.0773993808 : Math.pow(_source[i] * 0.9478672986 + 0.0521327014, 2.4);\n }\n return target;\n }\n /**\n * Converts linear components to sRGB components.\n * @typeParam T vec3 or vec4 linear components.\n */\n static convertLinearToSRGB(source, target) {\n const _source = source;\n const _target = target;\n for (let i = 0; i < 3; i++) {\n _target[i] = _source[i] < 0.0031308 ? _source[i] * 12.92 : 1.055 * Math.pow(_source[i], 0.41666) - 0.055;\n }\n return target;\n }\n}\n\n/** JPEG image support. */\nclass JPEGImageUtils {\n match(array) {\n return array.length >= 3 && array[0] === 255 && array[1] === 216 && array[2] === 255;\n }\n getSize(array) {\n // Skip 4 chars, they are for signature\n let view = new DataView(array.buffer, array.byteOffset + 4);\n let i, next;\n while (view.byteLength) {\n // read length of the next block\n i = view.getUint16(0, false);\n // i = buffer.readUInt16BE(0);\n // ensure correct format\n validateJPEGBuffer(view, i);\n // 0xFFC0 is baseline standard(SOF)\n // 0xFFC1 is baseline optimized(SOF)\n // 0xFFC2 is progressive(SOF2)\n next = view.getUint8(i + 1);\n if (next === 0xc0 || next === 0xc1 || next === 0xc2) {\n return [view.getUint16(i + 7, false), view.getUint16(i + 5, false)];\n }\n // move to the next block\n view = new DataView(array.buffer, view.byteOffset + i + 2);\n }\n throw new TypeError('Invalid JPG, no size found');\n }\n getChannels(_buffer) {\n return 3;\n }\n}\n/**\n * PNG image support.\n *\n * PNG signature: 'PNG\\r\\n\\x1a\\n'\n * PNG image header chunk name: 'IHDR'\n */\nclass PNGImageUtils {\n match(array) {\n return array.length >= 8 && array[0] === 0x89 && array[1] === 0x50 && array[2] === 0x4e && array[3] === 0x47 && array[4] === 0x0d && array[5] === 0x0a && array[6] === 0x1a && array[7] === 0x0a;\n }\n getSize(array) {\n const view = new DataView(array.buffer, array.byteOffset);\n const magic = BufferUtils.decodeText(array.slice(12, 16));\n if (magic === PNGImageUtils.PNG_FRIED_CHUNK_NAME) {\n return [view.getUint32(32, false), view.getUint32(36, false)];\n }\n return [view.getUint32(16, false), view.getUint32(20, false)];\n }\n getChannels(_buffer) {\n return 4;\n }\n}\n/**\n * *Common utilities for working with image data.*\n *\n * @category Utilities\n */\n// Used to detect \"fried\" png's: http://www.jongware.com/pngdefry.html\nPNGImageUtils.PNG_FRIED_CHUNK_NAME = 'CgBI';\nclass ImageUtils {\n /** Registers support for a new image format; useful for certain extensions. */\n static registerFormat(mimeType, impl) {\n this.impls[mimeType] = impl;\n }\n /**\n * Returns detected MIME type of the given image buffer. Note that for image\n * formats with support provided by extensions, the extension must be\n * registered with an I/O class before it can be detected by ImageUtils.\n */\n static getMimeType(buffer) {\n for (const mimeType in this.impls) {\n if (this.impls[mimeType].match(buffer)) {\n return mimeType;\n }\n }\n return null;\n }\n /** Returns the dimensions of the image. */\n static getSize(buffer, mimeType) {\n if (!this.impls[mimeType]) return null;\n return this.impls[mimeType].getSize(buffer);\n }\n /**\n * Returns a conservative estimate of the number of channels in the image. For some image\n * formats, the method may return 4 indicating the possibility of an alpha channel, without\n * the ability to guarantee that an alpha channel is present.\n */\n static getChannels(buffer, mimeType) {\n if (!this.impls[mimeType]) return null;\n return this.impls[mimeType].getChannels(buffer);\n }\n /** Returns a conservative estimate of the GPU memory required by this image. */\n static getVRAMByteLength(buffer, mimeType) {\n if (!this.impls[mimeType]) return null;\n if (this.impls[mimeType].getVRAMByteLength) {\n return this.impls[mimeType].getVRAMByteLength(buffer);\n }\n let uncompressedBytes = 0;\n const channels = 4; // See https://github.com/donmccurdy/glTF-Transform/issues/151.\n const resolution = this.getSize(buffer, mimeType);\n if (!resolution) return null;\n while (resolution[0] > 1 || resolution[1] > 1) {\n uncompressedBytes += resolution[0] * resolution[1] * channels;\n resolution[0] = Math.max(Math.floor(resolution[0] / 2), 1);\n resolution[1] = Math.max(Math.floor(resolution[1] / 2), 1);\n }\n uncompressedBytes += 1 * 1 * channels;\n return uncompressedBytes;\n }\n /** Returns the preferred file extension for the given MIME type. */\n static mimeTypeToExtension(mimeType) {\n if (mimeType === 'image/jpeg') return 'jpg';\n return mimeType.split('/').pop();\n }\n /** Returns the MIME type for the given file extension. */\n static extensionToMimeType(extension) {\n if (extension === 'jpg') return 'image/jpeg';\n if (!extension) return '';\n return `image/${extension}`;\n }\n}\nImageUtils.impls = {\n 'image/jpeg': new JPEGImageUtils(),\n 'image/png': new PNGImageUtils()\n};\nfunction validateJPEGBuffer(view, i) {\n // index should be within buffer limits\n if (i > view.byteLength) {\n throw new TypeError('Corrupt JPG, exceeded buffer limits');\n }\n // Every JPEG block must begin with a 0xFF\n if (view.getUint8(i) !== 0xff) {\n throw new TypeError('Invalid JPG, marker table corrupted');\n }\n return view;\n}\n\n/**\n * *Utility class for working with file systems and URI paths.*\n *\n * @category Utilities\n */\nclass FileUtils {\n /**\n * Extracts the basename from a file path, e.g. \"folder/model.glb\" -> \"model\".\n * See: {@link HTTPUtils.basename}\n */\n static basename(uri) {\n const fileName = uri.split(/[\\\\/]/).pop();\n return fileName.substring(0, fileName.lastIndexOf('.'));\n }\n /**\n * Extracts the extension from a file path, e.g. \"folder/model.glb\" -> \"glb\".\n * See: {@link HTTPUtils.extension}\n */\n static extension(uri) {\n if (uri.startsWith('data:image/')) {\n const mimeType = uri.match(/data:(image\\/\\w+)/)[1];\n return ImageUtils.mimeTypeToExtension(mimeType);\n } else if (uri.startsWith('data:model/gltf+json')) {\n return 'gltf';\n } else if (uri.startsWith('data:model/gltf-binary')) {\n return 'glb';\n } else if (uri.startsWith('data:application/')) {\n return 'bin';\n }\n return uri.split(/[\\\\/]/).pop().split(/[.]/).pop();\n }\n}\n\n// Reference: https://github.com/jonschlinkert/is-plain-object\nfunction isObject(o) {\n return Object.prototype.toString.call(o) === '[object Object]';\n}\nfunction isPlainObject(o) {\n if (isObject(o) === false) return false;\n // If has modified constructor\n const ctor = o.constructor;\n if (ctor === undefined) return true;\n // If has modified prototype\n const prot = ctor.prototype;\n if (isObject(prot) === false) return false;\n // If constructor does not have an Object-specific method\n if (Object.prototype.hasOwnProperty.call(prot, 'isPrototypeOf') === false) {\n return false;\n }\n // Most likely a plain Object\n return true;\n}\n\nvar _Logger;\n/** Logger verbosity thresholds. */\nvar Verbosity;\n(function (Verbosity) {\n /** No events are logged. */\n Verbosity[Verbosity[\"SILENT\"] = 4] = \"SILENT\";\n /** Only error events are logged. */\n Verbosity[Verbosity[\"ERROR\"] = 3] = \"ERROR\";\n /** Only error and warn events are logged. */\n Verbosity[Verbosity[\"WARN\"] = 2] = \"WARN\";\n /** Only error, warn, and info events are logged. (DEFAULT) */\n Verbosity[Verbosity[\"INFO\"] = 1] = \"INFO\";\n /** All events are logged. */\n Verbosity[Verbosity[\"DEBUG\"] = 0] = \"DEBUG\";\n})(Verbosity || (Verbosity = {}));\n/**\n * *Logger utility class.*\n *\n * @category Utilities\n */\nclass Logger {\n /** Constructs a new Logger instance. */\n constructor(verbosity) {\n this.verbosity = void 0;\n this.verbosity = verbosity;\n }\n /** Logs an event at level {@link Logger.Verbosity.DEBUG}. */\n debug(text) {\n if (this.verbosity <= Logger.Verbosity.DEBUG) {\n console.debug(text);\n }\n }\n /** Logs an event at level {@link Logger.Verbosity.INFO}. */\n info(text) {\n if (this.verbosity <= Logger.Verbosity.INFO) {\n console.info(text);\n }\n }\n /** Logs an event at level {@link Logger.Verbosity.WARN}. */\n warn(text) {\n if (this.verbosity <= Logger.Verbosity.WARN) {\n console.warn(text);\n }\n }\n /** Logs an event at level {@link Logger.Verbosity.ERROR}. */\n error(text) {\n if (this.verbosity <= Logger.Verbosity.ERROR) {\n console.error(text);\n }\n }\n}\n_Logger = Logger;\n/** Logger verbosity thresholds. */\nLogger.Verbosity = Verbosity;\n/** Default logger instance. */\nLogger.DEFAULT_INSTANCE = new _Logger(_Logger.Verbosity.INFO);\n\n/**\n * Calculates the determinant of a mat4\n *\n * @param {ReadonlyMat4} a the source matrix\n * @returns {Number} determinant of a\n */\n\nfunction determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nfunction multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\n * Returns the scaling factor component of a transformation\n * matrix. If a matrix is built with fromRotationTranslationScale\n * with a normalized Quaternion paramter, the returned vector will be\n * the same as the scaling vector\n * originally supplied.\n * @param {vec3} out Vector to receive scaling factor component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\n\nfunction getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.hypot(m11, m12, m13);\n out[1] = Math.hypot(m21, m22, m23);\n out[2] = Math.hypot(m31, m32, m33);\n return out;\n}\n/**\n * Returns a quaternion representing the rotational component\n * of a transformation matrix. If a matrix is built with\n * fromRotationTranslation, the returned quaternion will be the\n * same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\n\nfunction getRotation(out, mat) {\n var scaling = new ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n\n return out;\n}\n\n/** @hidden */\nclass MathUtils {\n static identity(v) {\n return v;\n }\n static eq(a, b, tolerance = 10e-6) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (Math.abs(a[i] - b[i]) > tolerance) return false;\n }\n return true;\n }\n static clamp(value, min, max) {\n if (value < min) return min;\n if (value > max) return max;\n return value;\n }\n // TODO(perf): Compare performance if we replace the switch with individual functions.\n static decodeNormalizedInt(i, componentType) {\n // Hardcode enums from accessor.ts to avoid a circular dependency.\n switch (componentType) {\n case 5126:\n // FLOAT\n return i;\n case 5123:\n // UNSIGNED_SHORT\n return i / 65535.0;\n case 5121:\n // UNSIGNED_BYTE\n return i / 255.0;\n case 5122:\n // SHORT\n return Math.max(i / 32767.0, -1.0);\n case 5120:\n // BYTE\n return Math.max(i / 127.0, -1.0);\n default:\n throw new Error('Invalid component type.');\n }\n }\n // TODO(perf): Compare performance if we replace the switch with individual functions.\n static encodeNormalizedInt(f, componentType) {\n // Hardcode enums from accessor.ts to avoid a circular dependency.\n switch (componentType) {\n case 5126:\n // FLOAT\n return f;\n case 5123:\n // UNSIGNED_SHORT\n return Math.round(MathUtils.clamp(f, 0, 1) * 65535.0);\n case 5121:\n // UNSIGNED_BYTE\n return Math.round(MathUtils.clamp(f, 0, 1) * 255.0);\n case 5122:\n // SHORT\n return Math.round(MathUtils.clamp(f, -1, 1) * 32767.0);\n case 5120:\n // BYTE\n return Math.round(MathUtils.clamp(f, -1, 1) * 127.0);\n default:\n throw new Error('Invalid component type.');\n }\n }\n /**\n * Decompose a mat4 to TRS properties.\n *\n * Equivalent to the Matrix4 decompose() method in three.js, and intentionally not using the\n * gl-matrix version. See: https://github.com/toji/gl-matrix/issues/408\n *\n * @param srcMat Matrix element, to be decomposed to TRS properties.\n * @param dstTranslation Translation element, to be overwritten.\n * @param dstRotation Rotation element, to be overwritten.\n * @param dstScale Scale element, to be overwritten.\n */\n static decompose(srcMat, dstTranslation, dstRotation, dstScale) {\n let sx = length([srcMat[0], srcMat[1], srcMat[2]]);\n const sy = length([srcMat[4], srcMat[5], srcMat[6]]);\n const sz = length([srcMat[8], srcMat[9], srcMat[10]]);\n // if determine is negative, we need to invert one scale\n const det = determinant(srcMat);\n if (det < 0) sx = -sx;\n dstTranslation[0] = srcMat[12];\n dstTranslation[1] = srcMat[13];\n dstTranslation[2] = srcMat[14];\n // scale the rotation part\n const _m1 = srcMat.slice();\n const invSX = 1 / sx;\n const invSY = 1 / sy;\n const invSZ = 1 / sz;\n _m1[0] *= invSX;\n _m1[1] *= invSX;\n _m1[2] *= invSX;\n _m1[4] *= invSY;\n _m1[5] *= invSY;\n _m1[6] *= invSY;\n _m1[8] *= invSZ;\n _m1[9] *= invSZ;\n _m1[10] *= invSZ;\n getRotation(dstRotation, _m1);\n dstScale[0] = sx;\n dstScale[1] = sy;\n dstScale[2] = sz;\n }\n /**\n * Compose TRS properties to a mat4.\n *\n * Equivalent to the Matrix4 compose() method in three.js, and intentionally not using the\n * gl-matrix version. See: https://github.com/toji/gl-matrix/issues/408\n *\n * @param srcTranslation Translation element of matrix.\n * @param srcRotation Rotation element of matrix.\n * @param srcScale Scale element of matrix.\n * @param dstMat Matrix element, to be modified and returned.\n * @returns dstMat, overwritten to mat4 equivalent of given TRS properties.\n */\n static compose(srcTranslation, srcRotation, srcScale, dstMat) {\n const te = dstMat;\n const x = srcRotation[0],\n y = srcRotation[1],\n z = srcRotation[2],\n w = srcRotation[3];\n const x2 = x + x,\n y2 = y + y,\n z2 = z + z;\n const xx = x * x2,\n xy = x * y2,\n xz = x * z2;\n const yy = y * y2,\n yz = y * z2,\n zz = z * z2;\n const wx = w * x2,\n wy = w * y2,\n wz = w * z2;\n const sx = srcScale[0],\n sy = srcScale[1],\n sz = srcScale[2];\n te[0] = (1 - (yy + zz)) * sx;\n te[1] = (xy + wz) * sx;\n te[2] = (xz - wy) * sx;\n te[3] = 0;\n te[4] = (xy - wz) * sy;\n te[5] = (1 - (xx + zz)) * sy;\n te[6] = (yz + wx) * sy;\n te[7] = 0;\n te[8] = (xz + wy) * sz;\n te[9] = (yz - wx) * sz;\n te[10] = (1 - (xx + yy)) * sz;\n te[11] = 0;\n te[12] = srcTranslation[0];\n te[13] = srcTranslation[1];\n te[14] = srcTranslation[2];\n te[15] = 1;\n return te;\n }\n}\n\nfunction equalsRef(refA, refB) {\n if (!!refA !== !!refB) return false;\n const a = refA.getChild();\n const b = refB.getChild();\n return a === b || a.equals(b);\n}\nfunction equalsRefSet(refSetA, refSetB) {\n if (!!refSetA !== !!refSetB) return false;\n const refValuesA = refSetA.values();\n const refValuesB = refSetB.values();\n if (refValuesA.length !== refValuesB.length) return false;\n for (let i = 0; i < refValuesA.length; i++) {\n const a = refValuesA[i];\n const b = refValuesB[i];\n if (a.getChild() === b.getChild()) continue;\n if (!a.getChild().equals(b.getChild())) return false;\n }\n return true;\n}\nfunction equalsRefMap(refMapA, refMapB) {\n if (!!refMapA !== !!refMapB) return false;\n const keysA = refMapA.keys();\n const keysB = refMapB.keys();\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n const refA = refMapA.get(key);\n const refB = refMapB.get(key);\n if (!!refA !== !!refB) return false;\n const a = refA.getChild();\n const b = refB.getChild();\n if (a === b) continue;\n if (!a.equals(b)) return false;\n }\n return true;\n}\nfunction equalsArray(a, b) {\n if (a === b) return true;\n if (!!a !== !!b || !a || !b) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\nfunction equalsObject(_a, _b) {\n if (_a === _b) return true;\n if (!!_a !== !!_b) return false;\n if (!isPlainObject(_a) || !isPlainObject(_b)) {\n return _a === _b;\n }\n const a = _a;\n const b = _b;\n let numKeysA = 0;\n let numKeysB = 0;\n let key;\n for (key in a) numKeysA++;\n for (key in b) numKeysB++;\n if (numKeysA !== numKeysB) return false;\n for (key in a) {\n const valueA = a[key];\n const valueB = b[key];\n if (isArray(valueA) && isArray(valueB)) {\n if (!equalsArray(valueA, valueB)) return false;\n } else if (isPlainObject(valueA) && isPlainObject(valueB)) {\n if (!equalsObject(valueA, valueB)) return false;\n } else {\n if (valueA !== valueB) return false;\n }\n }\n return true;\n}\nfunction isArray(value) {\n return Array.isArray(value) || ArrayBuffer.isView(value);\n}\n\nconst ALPHABET = '23456789abdegjkmnpqrvwxyzABDEGJKMNPQRVWXYZ';\nconst UNIQUE_RETRIES = 999;\nconst ID_LENGTH = 6;\nconst previousIDs = new Set();\nconst generateOne = function generateOne() {\n let rtn = '';\n for (let i = 0; i < ID_LENGTH; i++) {\n rtn += ALPHABET.charAt(Math.floor(Math.random() * ALPHABET.length));\n }\n return rtn;\n};\n/**\n * Short ID generator.\n *\n * Generated IDs are short, easy to type, and unique for the duration of the program's execution.\n * Uniqueness across multiple program executions, or on other devices, is not guaranteed. Based on\n * [Short ID Generation in JavaScript](https://tomspencer.dev/blog/2014/11/16/short-id-generation-in-javascript/),\n * with alterations.\n *\n * @category Utilities\n * @hidden\n */\nconst uuid = function uuid() {\n for (let retries = 0; retries < UNIQUE_RETRIES; retries++) {\n const id = generateOne();\n if (!previousIDs.has(id)) {\n previousIDs.add(id);\n return id;\n }\n }\n return '';\n};\n\n// Need a placeholder domain to construct a URL from a relative path. We only\n// access `url.pathname`, so the domain doesn't matter.\nconst NULL_DOMAIN = 'https://null.example';\n/**\n * *Utility class for working with URLs.*\n *\n * @category Utilities\n */\nclass HTTPUtils {\n static dirname(path) {\n const index = path.lastIndexOf('/');\n if (index === -1) return './';\n return path.substring(0, index + 1);\n }\n /**\n * Extracts the basename from a URL, e.g. \"folder/model.glb\" -> \"model\".\n * See: {@link FileUtils.basename}\n */\n static basename(uri) {\n return FileUtils.basename(new URL(uri, NULL_DOMAIN).pathname);\n }\n /**\n * Extracts the extension from a URL, e.g. \"folder/model.glb\" -> \"glb\".\n * See: {@link FileUtils.extension}\n */\n static extension(uri) {\n return FileUtils.extension(new URL(uri, NULL_DOMAIN).pathname);\n }\n static resolve(base, path) {\n if (!this.isRelativePath(path)) return path;\n const stack = base.split('/');\n const parts = path.split('/');\n stack.pop();\n for (let i = 0; i < parts.length; i++) {\n if (parts[i] === '.') continue;\n if (parts[i] === '..') {\n stack.pop();\n } else {\n stack.push(parts[i]);\n }\n }\n return stack.join('/');\n }\n /**\n * Returns true for URLs containing a protocol, and false for both\n * absolute and relative paths.\n */\n static isAbsoluteURL(path) {\n return this.PROTOCOL_REGEXP.test(path);\n }\n /**\n * Returns true for paths that are declared relative to some unknown base\n * path. For example, \"foo/bar/\" is relative both \"/foo/bar/\" is not.\n */\n static isRelativePath(path) {\n return !/^(?:[a-zA-Z]+:)?\\//.test(path);\n }\n}\nHTTPUtils.DEFAULT_INIT = {};\nHTTPUtils.PROTOCOL_REGEXP = /^[a-zA-Z]+:\\/\\//;\n\nconst COPY_IDENTITY = t => t;\nconst EMPTY_SET = new Set();\n/**\n * *Properties represent distinct resources in a glTF asset, referenced by other properties.*\n *\n * For example, each material and texture is a property, with material properties holding\n * references to the textures. All properties are created with factory methods on the\n * {@link Document} in which they should be constructed. Properties are destroyed by calling\n * {@link Property.dispose}().\n *\n * Usage:\n *\n * ```ts\n * const texture = doc.createTexture('myTexture');\n * doc.listTextures(); // → [texture x 1]\n *\n * // Attach a texture to a material.\n * material.setBaseColorTexture(texture);\n * material.getBaseColortexture(); // → texture\n *\n * // Detaching a texture removes any references to it, except from the doc.\n * texture.detach();\n * material.getBaseColorTexture(); // → null\n * doc.listTextures(); // → [texture x 1]\n *\n * // Disposing a texture removes all references to it, and its own references.\n * texture.dispose();\n * doc.listTextures(); // → []\n * ```\n *\n * Reference:\n * - [glTF → Concepts](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#concepts)\n *\n * @category Properties\n */\nclass Property extends GraphNode {\n /** @hidden */\n constructor(graph, name = '') {\n super(graph);\n this[$attributes]['name'] = name;\n this.init();\n this.dispatchEvent({\n type: 'create'\n });\n }\n /**\n * Returns the Graph associated with this Property. For internal use.\n * @hidden\n * @experimental\n */\n getGraph() {\n return this.graph;\n }\n /**\n * Returns default attributes for the property. Empty lists and maps should be initialized\n * to empty arrays and objects. Always invoke `super.getDefaults()` and extend the result.\n */\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n name: '',\n extras: {}\n });\n }\n /** @hidden */\n set(attribute, value) {\n if (Array.isArray(value)) value = value.slice(); // copy vector, quat, color …\n return super.set(attribute, value);\n }\n /**********************************************************************************************\n * Name.\n */\n /**\n * Returns the name of this property. While names are not required to be unique, this is\n * encouraged, and non-unique names will be overwritten in some tools. For custom data about\n * a property, prefer to use Extras.\n */\n getName() {\n return this.get('name');\n }\n /**\n * Sets the name of this property. While names are not required to be unique, this is\n * encouraged, and non-unique names will be overwritten in some tools. For custom data about\n * a property, prefer to use Extras.\n */\n setName(name) {\n return this.set('name', name);\n }\n /**********************************************************************************************\n * Extras.\n */\n /**\n * Returns a reference to the Extras object, containing application-specific data for this\n * Property. Extras should be an Object, not a primitive value, for best portability.\n */\n getExtras() {\n return this.get('extras');\n }\n /**\n * Updates the Extras object, containing application-specific data for this Property. Extras\n * should be an Object, not a primitive value, for best portability.\n */\n setExtras(extras) {\n return this.set('extras', extras);\n }\n /**********************************************************************************************\n * Graph state.\n */\n /**\n * Makes a copy of this property, with the same resources (by reference) as the original.\n */\n clone() {\n const PropertyClass = this.constructor;\n return new PropertyClass(this.graph).copy(this, COPY_IDENTITY);\n }\n /**\n * Copies all data from another property to this one. Child properties are copied by reference,\n * unless a 'resolve' function is given to override that.\n * @param other Property to copy references from.\n * @param resolve Function to resolve each Property being transferred. Default is identity.\n */\n copy(other, resolve = COPY_IDENTITY) {\n // Remove previous references.\n for (const key in this[$attributes]) {\n const value = this[$attributes][key];\n if (value instanceof GraphEdge) {\n if (!this[$immutableKeys].has(key)) {\n value.dispose();\n }\n } else if (value instanceof RefList || value instanceof RefSet) {\n for (const ref of value.values()) {\n ref.dispose();\n }\n } else if (value instanceof RefMap) {\n for (const ref of value.values()) {\n ref.dispose();\n }\n }\n }\n // Add new references.\n for (const key in other[$attributes]) {\n const thisValue = this[$attributes][key];\n const otherValue = other[$attributes][key];\n if (otherValue instanceof GraphEdge) {\n if (this[$immutableKeys].has(key)) {\n const ref = thisValue;\n ref.getChild().copy(resolve(otherValue.getChild()), resolve);\n } else {\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n this.setRef(key, resolve(otherValue.getChild()), otherValue.getAttributes());\n }\n } else if (otherValue instanceof RefSet || otherValue instanceof RefList) {\n for (const ref of otherValue.values()) {\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n this.addRef(key, resolve(ref.getChild()), ref.getAttributes());\n }\n } else if (otherValue instanceof RefMap) {\n for (const subkey of otherValue.keys()) {\n const ref = otherValue.get(subkey);\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n this.setRefMap(key, subkey, resolve(ref.getChild()), ref.getAttributes());\n }\n } else if (isPlainObject(otherValue)) {\n this[$attributes][key] = JSON.parse(JSON.stringify(otherValue));\n } else if (Array.isArray(otherValue) || otherValue instanceof ArrayBuffer || ArrayBuffer.isView(otherValue)) {\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n this[$attributes][key] = otherValue.slice();\n } else {\n this[$attributes][key] = otherValue;\n }\n }\n return this;\n }\n /**\n * Returns true if two properties are deeply equivalent, recursively comparing the attributes\n * of the properties. Optionally, a 'skip' set may be included, specifying attributes whose\n * values should not be considered in the comparison.\n *\n * Example: Two {@link Primitive Primitives} are equivalent if they have accessors and\n * materials with equivalent content — but not necessarily the same specific accessors\n * and materials.\n */\n equals(other, skip = EMPTY_SET) {\n if (this === other) return true;\n if (this.propertyType !== other.propertyType) return false;\n for (const key in this[$attributes]) {\n if (skip.has(key)) continue;\n const a = this[$attributes][key];\n const b = other[$attributes][key];\n if (a instanceof GraphEdge || b instanceof GraphEdge) {\n if (!equalsRef(a, b)) {\n return false;\n }\n } else if (a instanceof RefSet || b instanceof RefSet || a instanceof RefList || b instanceof RefList) {\n if (!equalsRefSet(a, b)) {\n return false;\n }\n } else if (a instanceof RefMap || b instanceof RefMap) {\n if (!equalsRefMap(a, b)) {\n return false;\n }\n } else if (isPlainObject(a) || isPlainObject(b)) {\n if (!equalsObject(a, b)) return false;\n } else if (isArray(a) || isArray(b)) {\n if (!equalsArray(a, b)) return false;\n } else {\n // Literal.\n if (a !== b) return false;\n }\n }\n return true;\n }\n detach() {\n // Detaching should keep properties in the same Document, and attached to its root.\n this.graph.disconnectParents(this, n => n.propertyType !== 'Root');\n return this;\n }\n /**\n * Returns a list of all properties that hold a reference to this property. For example, a\n * material may hold references to various textures, but a texture does not hold references\n * to the materials that use it.\n *\n * It is often necessary to filter the results for a particular type: some resources, like\n * {@link Accessor}s, may be referenced by different types of properties. Most properties\n * include the {@link Root} as a parent, which is usually not of interest.\n *\n * Usage:\n *\n * ```ts\n * const materials = texture\n * \t.listParents()\n * \t.filter((p) => p instanceof Material)\n * ```\n */\n listParents() {\n return this.graph.listParents(this);\n }\n}\n\n/**\n * *A {@link Property} that can have {@link ExtensionProperty} instances attached.*\n *\n * Most properties are extensible. See the {@link Extension} documentation for information about\n * how to use extensions.\n *\n * @category Properties\n */\nclass ExtensibleProperty extends Property {\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n extensions: new RefMap()\n });\n }\n /** Returns an {@link ExtensionProperty} attached to this Property, if any. */\n getExtension(name) {\n return this.getRefMap('extensions', name);\n }\n /**\n * Attaches the given {@link ExtensionProperty} to this Property. For a given extension, only\n * one ExtensionProperty may be attached to any one Property at a time.\n */\n setExtension(name, extensionProperty) {\n if (extensionProperty) extensionProperty._validateParent(this);\n return this.setRefMap('extensions', name, extensionProperty);\n }\n /** Lists all {@link ExtensionProperty} instances attached to this Property. */\n listExtensions() {\n return this.listRefMapValues('extensions');\n }\n}\n\n/**\n * *Accessors store lists of numeric, vector, or matrix elements in a typed array.*\n *\n * All large data for {@link Mesh}, {@link Skin}, and {@link Animation} properties is stored in\n * {@link Accessor}s, organized into one or more {@link Buffer}s. Each accessor provides data in\n * typed arrays, with two abstractions:\n *\n * *Elements* are the logical divisions of the data into useful types: `\"SCALAR\"`, `\"VEC2\"`,\n * `\"VEC3\"`, `\"VEC4\"`, `\"MAT3\"`, or `\"MAT4\"`. The element type can be determined with the\n * {@link Accessor.getType getType}() method, and the number of elements in the accessor determine its\n * {@link Accessor.getCount getCount}(). The number of components in an element — e.g. 9 for `\"MAT3\"` — are its\n * {@link Accessor.getElementSize getElementSize}(). See {@link Accessor.Type}.\n *\n * *Components* are the numeric values within an element — e.g. `.x` and `.y` for `\"VEC2\"`. Various\n * component types are available: `BYTE`, `UNSIGNED_BYTE`, `SHORT`, `UNSIGNED_SHORT`,\n * `UNSIGNED_INT`, and `FLOAT`. The component type can be determined with the\n * {@link Accessor.getComponentType getComponentType} method, and the number of bytes in each component determine its\n * {@link Accessor.getComponentSize getComponentSize}. See {@link Accessor.ComponentType}.\n *\n * Usage:\n *\n * ```typescript\n * const accessor = doc.createAccessor('myData')\n * \t.setArray(new Float32Array([1,2,3,4,5,6,7,8,9,10,11,12]))\n * \t.setType(Accessor.Type.VEC3)\n * \t.setBuffer(doc.getRoot().listBuffers()[0]);\n *\n * accessor.getCount(); // → 4\n * accessor.getElementSize(); // → 3\n * accessor.getByteLength(); // → 48\n * accessor.getElement(1, []); // → [4, 5, 6]\n *\n * accessor.setElement(0, [10, 20, 30]);\n * ```\n *\n * Data access through the {@link Accessor.getElement getElement} and {@link Accessor.setElement setElement}\n * methods reads or overwrites the content of the underlying typed array. These methods use\n * element arrays intended to be compatible with the [gl-matrix](https://github.com/toji/gl-matrix)\n * library, or with the `toArray`/`fromArray` methods of libraries like three.js and babylon.js.\n *\n * Each Accessor must be assigned to a {@link Buffer}, which determines where the accessor's data\n * is stored in the final file. Assigning Accessors to different Buffers allows the data to be\n * written to different `.bin` files.\n *\n * glTF Transform does not expose many details of sparse, normalized, or interleaved accessors\n * through its API. It reads files using those techniques, presents a simplified view of the data\n * for editing, and attempts to write data back out with optimizations. For example, vertex\n * attributes will typically be interleaved by default, regardless of the input file.\n *\n * References:\n * - [glTF → Accessors](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#accessors)\n *\n * @category Properties\n */\nclass Accessor extends ExtensibleProperty {\n /**********************************************************************************************\n * Instance.\n */\n init() {\n this.propertyType = PropertyType.ACCESSOR;\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n array: null,\n type: Accessor.Type.SCALAR,\n componentType: Accessor.ComponentType.FLOAT,\n normalized: false,\n sparse: false,\n buffer: null\n });\n }\n /**********************************************************************************************\n * Static.\n */\n /** Returns size of a given element type, in components. */\n static getElementSize(type) {\n switch (type) {\n case Accessor.Type.SCALAR:\n return 1;\n case Accessor.Type.VEC2:\n return 2;\n case Accessor.Type.VEC3:\n return 3;\n case Accessor.Type.VEC4:\n return 4;\n case Accessor.Type.MAT2:\n return 4;\n case Accessor.Type.MAT3:\n return 9;\n case Accessor.Type.MAT4:\n return 16;\n default:\n throw new Error('Unexpected type: ' + type);\n }\n }\n /** Returns size of a given component type, in bytes. */\n static getComponentSize(componentType) {\n switch (componentType) {\n case Accessor.ComponentType.BYTE:\n return 1;\n case Accessor.ComponentType.UNSIGNED_BYTE:\n return 1;\n case Accessor.ComponentType.SHORT:\n return 2;\n case Accessor.ComponentType.UNSIGNED_SHORT:\n return 2;\n case Accessor.ComponentType.UNSIGNED_INT:\n return 4;\n case Accessor.ComponentType.FLOAT:\n return 4;\n default:\n throw new Error('Unexpected component type: ' + componentType);\n }\n }\n /**********************************************************************************************\n * Min/max bounds.\n */\n /**\n * Minimum value of each component in this attribute. Unlike in a final glTF file, values\n * returned by this method will reflect the minimum accounting for {@link .normalized}\n * state.\n */\n getMinNormalized(target) {\n const normalized = this.getNormalized();\n const elementSize = this.getElementSize();\n const componentType = this.getComponentType();\n this.getMin(target);\n if (normalized) {\n for (let j = 0; j < elementSize; j++) {\n target[j] = MathUtils.decodeNormalizedInt(target[j], componentType);\n }\n }\n return target;\n }\n /**\n * Minimum value of each component in this attribute. Values returned by this method do not\n * reflect normalization: use {@link .getMinNormalized} in that case.\n */\n getMin(target) {\n const array = this.getArray();\n const count = this.getCount();\n const elementSize = this.getElementSize();\n for (let j = 0; j < elementSize; j++) target[j] = Infinity;\n for (let i = 0; i < count * elementSize; i += elementSize) {\n for (let j = 0; j < elementSize; j++) {\n const value = array[i + j];\n if (Number.isFinite(value)) {\n target[j] = Math.min(target[j], value);\n }\n }\n }\n return target;\n }\n /**\n * Maximum value of each component in this attribute. Unlike in a final glTF file, values\n * returned by this method will reflect the minimum accounting for {@link .normalized}\n * state.\n */\n getMaxNormalized(target) {\n const normalized = this.getNormalized();\n const elementSize = this.getElementSize();\n const componentType = this.getComponentType();\n this.getMax(target);\n if (normalized) {\n for (let j = 0; j < elementSize; j++) {\n target[j] = MathUtils.decodeNormalizedInt(target[j], componentType);\n }\n }\n return target;\n }\n /**\n * Maximum value of each component in this attribute. Values returned by this method do not\n * reflect normalization: use {@link .getMinNormalized} in that case.\n */\n getMax(target) {\n const array = this.get('array');\n const count = this.getCount();\n const elementSize = this.getElementSize();\n for (let j = 0; j < elementSize; j++) target[j] = -Infinity;\n for (let i = 0; i < count * elementSize; i += elementSize) {\n for (let j = 0; j < elementSize; j++) {\n const value = array[i + j];\n if (Number.isFinite(value)) {\n target[j] = Math.max(target[j], value);\n }\n }\n }\n return target;\n }\n /**********************************************************************************************\n * Layout.\n */\n /**\n * Number of elements in the accessor. An array of length 30, containing 10 `VEC3` elements,\n * will have a count of 10.\n */\n getCount() {\n const array = this.get('array');\n return array ? array.length / this.getElementSize() : 0;\n }\n /** Type of element stored in the accessor. `VEC2`, `VEC3`, etc. */\n getType() {\n return this.get('type');\n }\n /**\n * Sets type of element stored in the accessor. `VEC2`, `VEC3`, etc. Array length must be a\n * multiple of the component size (`VEC2` = 2, `VEC3` = 3, ...) for the selected type.\n */\n setType(type) {\n return this.set('type', type);\n }\n /**\n * Number of components in each element of the accessor. For example, the element size of a\n * `VEC2` accessor is 2. This value is determined automatically based on array length and\n * accessor type, specified with {@link Accessor.setType setType()}.\n */\n getElementSize() {\n return Accessor.getElementSize(this.get('type'));\n }\n /**\n * Size of each component (a value in the raw array), in bytes. For example, the\n * `componentSize` of data backed by a `float32` array is 4 bytes.\n */\n getComponentSize() {\n return this.get('array').BYTES_PER_ELEMENT;\n }\n /**\n * Component type (float32, uint16, etc.). This value is determined automatically, and can only\n * be modified by replacing the underlying array.\n */\n getComponentType() {\n return this.get('componentType');\n }\n /**********************************************************************************************\n * Normalization.\n */\n /**\n * Specifies whether integer data values should be normalized (true) to [0, 1] (for unsigned\n * types) or [-1, 1] (for signed types), or converted directly (false) when they are accessed.\n * This property is defined only for accessors that contain vertex attributes or animation\n * output data.\n */\n getNormalized() {\n return this.get('normalized');\n }\n /**\n * Specifies whether integer data values should be normalized (true) to [0, 1] (for unsigned\n * types) or [-1, 1] (for signed types), or converted directly (false) when they are accessed.\n * This property is defined only for accessors that contain vertex attributes or animation\n * output data.\n */\n setNormalized(normalized) {\n return this.set('normalized', normalized);\n }\n /**********************************************************************************************\n * Data access.\n */\n /**\n * Returns the scalar element value at the given index. For\n * {@link Accessor.getNormalized normalized} integer accessors, values are\n * decoded and returned in floating-point form.\n */\n getScalar(index) {\n const elementSize = this.getElementSize();\n const componentType = this.getComponentType();\n const array = this.getArray();\n if (this.getNormalized()) {\n return MathUtils.decodeNormalizedInt(array[index * elementSize], componentType);\n }\n return array[index * elementSize];\n }\n /**\n * Assigns the scalar element value at the given index. For\n * {@link Accessor.getNormalized normalized} integer accessors, \"value\" should be\n * given in floating-point form — it will be integer-encoded before writing\n * to the underlying array.\n */\n setScalar(index, x) {\n const elementSize = this.getElementSize();\n const componentType = this.getComponentType();\n const array = this.getArray();\n if (this.getNormalized()) {\n array[index * elementSize] = MathUtils.encodeNormalizedInt(x, componentType);\n } else {\n array[index * elementSize] = x;\n }\n return this;\n }\n /**\n * Returns the vector or matrix element value at the given index. For\n * {@link Accessor.getNormalized normalized} integer accessors, values are\n * decoded and returned in floating-point form.\n *\n * Example:\n *\n * ```javascript\n * import { add } from 'gl-matrix/add';\n *\n * const element = [];\n * const offset = [1, 1, 1];\n *\n * for (let i = 0; i < accessor.getCount(); i++) {\n * \taccessor.getElement(i, element);\n * \tadd(element, element, offset);\n * \taccessor.setElement(i, element);\n * }\n * ```\n */\n getElement(index, target) {\n const normalized = this.getNormalized();\n const elementSize = this.getElementSize();\n const componentType = this.getComponentType();\n const array = this.getArray();\n for (let i = 0; i < elementSize; i++) {\n if (normalized) {\n target[i] = MathUtils.decodeNormalizedInt(array[index * elementSize + i], componentType);\n } else {\n target[i] = array[index * elementSize + i];\n }\n }\n return target;\n }\n /**\n * Assigns the vector or matrix element value at the given index. For\n * {@link Accessor.getNormalized normalized} integer accessors, \"value\" should be\n * given in floating-point form — it will be integer-encoded before writing\n * to the underlying array.\n *\n * Example:\n *\n * ```javascript\n * import { add } from 'gl-matrix/add';\n *\n * const element = [];\n * const offset = [1, 1, 1];\n *\n * for (let i = 0; i < accessor.getCount(); i++) {\n * \taccessor.getElement(i, element);\n * \tadd(element, element, offset);\n * \taccessor.setElement(i, element);\n * }\n * ```\n */\n setElement(index, value) {\n const normalized = this.getNormalized();\n const elementSize = this.getElementSize();\n const componentType = this.getComponentType();\n const array = this.getArray();\n for (let i = 0; i < elementSize; i++) {\n if (normalized) {\n array[index * elementSize + i] = MathUtils.encodeNormalizedInt(value[i], componentType);\n } else {\n array[index * elementSize + i] = value[i];\n }\n }\n return this;\n }\n /**********************************************************************************************\n * Raw data storage.\n */\n /**\n * Specifies whether the accessor should be stored sparsely. When written to a glTF file, sparse\n * accessors store only values that differ from base values. When loaded in glTF Transform (or most\n * runtimes) a sparse accessor can be treated like any other accessor. Currently, glTF Transform always\n * uses zeroes for the base values when writing files.\n * @experimental\n */\n getSparse() {\n return this.get('sparse');\n }\n /**\n * Specifies whether the accessor should be stored sparsely. When written to a glTF file, sparse\n * accessors store only values that differ from base values. When loaded in glTF Transform (or most\n * runtimes) a sparse accessor can be treated like any other accessor. Currently, glTF Transform always\n * uses zeroes for the base values when writing files.\n * @experimental\n */\n setSparse(sparse) {\n return this.set('sparse', sparse);\n }\n /** Returns the {@link Buffer} into which this accessor will be organized. */\n getBuffer() {\n return this.getRef('buffer');\n }\n /** Assigns the {@link Buffer} into which this accessor will be organized. */\n setBuffer(buffer) {\n return this.setRef('buffer', buffer);\n }\n /** Returns the raw typed array underlying this accessor. */\n getArray() {\n return this.get('array');\n }\n /** Assigns the raw typed array underlying this accessor. */\n setArray(array) {\n this.set('componentType', array ? arrayToComponentType(array) : Accessor.ComponentType.FLOAT);\n this.set('array', array);\n return this;\n }\n /** Returns the total bytelength of this accessor, exclusive of padding. */\n getByteLength() {\n const array = this.get('array');\n return array ? array.byteLength : 0;\n }\n}\n/**************************************************************************************************\n * Accessor utilities.\n */\n/** @internal */\n/**********************************************************************************************\n * Constants.\n */\n/** Element type contained by the accessor (SCALAR, VEC2, ...). */\nAccessor.Type = {\n /** Scalar, having 1 value per element. */\n SCALAR: 'SCALAR',\n /** 2-component vector, having 2 components per element. */\n VEC2: 'VEC2',\n /** 3-component vector, having 3 components per element. */\n VEC3: 'VEC3',\n /** 4-component vector, having 4 components per element. */\n VEC4: 'VEC4',\n /** 2x2 matrix, having 4 components per element. */\n MAT2: 'MAT2',\n /** 3x3 matrix, having 9 components per element. */\n MAT3: 'MAT3',\n /** 4x3 matrix, having 16 components per element. */\n MAT4: 'MAT4'\n};\n/** Data type of the values composing each element in the accessor. */\nAccessor.ComponentType = {\n /**\n * 1-byte signed integer, stored as\n * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int8Array Int8Array}.\n */\n BYTE: 5120,\n /**\n * 1-byte unsigned integer, stored as\n * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array Uint8Array}.\n */\n UNSIGNED_BYTE: 5121,\n /**\n * 2-byte signed integer, stored as\n * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Int16Array Int16Array}.\n */\n SHORT: 5122,\n /**\n * 2-byte unsigned integer, stored as\n * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint16Array Uint16Array}.\n */\n UNSIGNED_SHORT: 5123,\n /**\n * 4-byte unsigned integer, stored as\n * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint32Array Uint32Array}.\n */\n UNSIGNED_INT: 5125,\n /**\n * 4-byte floating point number, stored as\n * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Float32Array Float32Array}.\n */\n FLOAT: 5126\n};\nfunction arrayToComponentType(array) {\n switch (array.constructor) {\n case Float32Array:\n return Accessor.ComponentType.FLOAT;\n case Uint32Array:\n return Accessor.ComponentType.UNSIGNED_INT;\n case Uint16Array:\n return Accessor.ComponentType.UNSIGNED_SHORT;\n case Uint8Array:\n return Accessor.ComponentType.UNSIGNED_BYTE;\n case Int16Array:\n return Accessor.ComponentType.SHORT;\n case Int8Array:\n return Accessor.ComponentType.BYTE;\n default:\n throw new Error('Unknown accessor componentType.');\n }\n}\n\n/**\n * *Reusable collections of {@link AnimationChannel}s, together representing a discrete animation\n * clip.*\n *\n * One Animation represents one playable unit in an animation system. Each may contain channels\n * affecting multiple paths (`translation`, `rotation`, `scale`, or `weights`) on multiple\n * {@link Node}s. An Animation's channels must be played together, and do not have any meaning in\n * isolation.\n *\n * Multiple Animations _may_ be played together: for example, one character's _Walk_ animation\n * might play while another character's _Run_ animation plays. Or a single character might have\n * both an _Idle_ and a _Talk_ animation playing at the same time. However, glTF does not define\n * any particular relationship between top-level Animations, or any particular playback behavior\n * like looping or sequences of Animations. General-purpose viewers typically autoplay the first\n * animation and provide UI controls for choosing another. Game engines may have significantly\n * more advanced methods of playing and blending animations.\n *\n * For example, a very simple skinned {@link Mesh} might have two Animations, _Idle_ and _Walk_.\n * Each of those Animations might affect the rotations of two bones, _LegL_ and _LegR_, where the\n * keyframes for each target-path pair are stored in {@link AnimationChannel} instances. In total,\n * this model would contain two Animations and Four {@link AnimationChannel}s.\n *\n * Usage:\n *\n * ```ts\n * const animation = doc.createAnimation('machineRun')\n * \t.addChannel(rotateCog1)\n * \t.addChannel(rotateCog2)\n * \t.addChannel(rotateCog3);\n * ```\n *\n * Reference\n * - [glTF → Animations](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#animations)\n *\n * @category Properties\n */\nclass Animation extends ExtensibleProperty {\n init() {\n this.propertyType = PropertyType.ANIMATION;\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n channels: new RefSet(),\n samplers: new RefSet()\n });\n }\n /** Adds an {@link AnimationChannel} to this Animation. */\n addChannel(channel) {\n return this.addRef('channels', channel);\n }\n /** Removes an {@link AnimationChannel} from this Animation. */\n removeChannel(channel) {\n return this.removeRef('channels', channel);\n }\n /** Lists {@link AnimationChannel}s in this Animation. */\n listChannels() {\n return this.listRefs('channels');\n }\n /** Adds an {@link AnimationSampler} to this Animation. */\n addSampler(sampler) {\n return this.addRef('samplers', sampler);\n }\n /** Removes an {@link AnimationSampler} from this Animation. */\n removeSampler(sampler) {\n return this.removeRef('samplers', sampler);\n }\n /** Lists {@link AnimationSampler}s in this Animation. */\n listSamplers() {\n return this.listRefs('samplers');\n }\n}\n\n/**\n * *A target-path pair within a larger {@link Animation}, which refers to an\n * {@link AnimationSampler} storing the keyframe data for that pair.*\n *\n * A _target_ is always a {@link Node}, in the core glTF spec. A _path_ is any property of that\n * Node that can be affected by animation: `translation`, `rotation`, `scale`, or `weights`. An\n * {@link Animation} affecting the positions and rotations of several {@link Node}s would contain\n * one channel for each Node-position or Node-rotation pair. The keyframe data for an\n * AnimationChannel is stored in an {@link AnimationSampler}, which must be attached to the same\n * {@link Animation}.\n *\n * Usage:\n *\n * ```ts\n * const node = doc.getRoot()\n * \t.listNodes()\n * \t.find((node) => node.getName() === 'Cog');\n *\n * const channel = doc.createAnimationChannel('cogRotation')\n * \t.setTargetPath('rotation')\n * \t.setTargetNode(node)\n * \t.setSampler(rotateSampler);\n * ```\n *\n * Reference\n * - [glTF → Animations](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#animations)\n *\n * @category Properties\n */\nclass AnimationChannel extends ExtensibleProperty {\n /**********************************************************************************************\n * Instance.\n */\n init() {\n this.propertyType = PropertyType.ANIMATION_CHANNEL;\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n targetPath: null,\n targetNode: null,\n sampler: null\n });\n }\n /**********************************************************************************************\n * Properties.\n */\n /**\n * Path (property) animated on the target {@link Node}. Supported values include:\n * `translation`, `rotation`, `scale`, or `weights`.\n */\n getTargetPath() {\n return this.get('targetPath');\n }\n /**\n * Path (property) animated on the target {@link Node}. Supported values include:\n * `translation`, `rotation`, `scale`, or `weights`.\n */\n setTargetPath(targetPath) {\n return this.set('targetPath', targetPath);\n }\n /** Target {@link Node} animated by the channel. */\n getTargetNode() {\n return this.getRef('targetNode');\n }\n /** Target {@link Node} animated by the channel. */\n setTargetNode(targetNode) {\n return this.setRef('targetNode', targetNode);\n }\n /**\n * Keyframe data input/output values for the channel. Must be attached to the same\n * {@link Animation}.\n */\n getSampler() {\n return this.getRef('sampler');\n }\n /**\n * Keyframe data input/output values for the channel. Must be attached to the same\n * {@link Animation}.\n */\n setSampler(sampler) {\n return this.setRef('sampler', sampler);\n }\n}\n/**********************************************************************************************\n * Constants.\n */\n/** Name of the property to be modified by an animation channel. */\nAnimationChannel.TargetPath = {\n /** Channel targets {@link Node.setTranslation}. */\n TRANSLATION: 'translation',\n /** Channel targets {@link Node.setRotation}. */\n ROTATION: 'rotation',\n /** Channel targets {@link Node.setScale}. */\n SCALE: 'scale',\n /** Channel targets {@link Node.setWeights}, affecting {@link PrimitiveTarget} weights. */\n WEIGHTS: 'weights'\n};\n\n/**\n * *Reusable collection of keyframes affecting particular property of an object.*\n *\n * Each AnimationSampler refers to an input and an output {@link Accessor}. Input contains times\n * (in seconds) for each keyframe. Output contains values (of any {@link Accessor.Type}) for the\n * animated property at each keyframe. Samplers using `CUBICSPLINE` interpolation will also contain\n * in/out tangents in the output, with the layout:\n *\n * in<sub>1</sub>, value<sub>1</sub>, out<sub>1</sub>,\n * in<sub>2</sub>, value<sub>2</sub>, out<sub>2</sub>,\n * in<sub>3</sub>, value<sub>3</sub>, out<sub>3</sub>, ...\n *\n * Usage:\n *\n * ```ts\n * // Create accessor containing input times, in seconds.\n * const input = doc.createAccessor('bounceTimes')\n * \t.setArray(new Float32Array([0, 1, 2]))\n * \t.setType(Accessor.Type.SCALAR);\n *\n * // Create accessor containing output values, in local units.\n * const output = doc.createAccessor('bounceValues')\n * \t.setArray(new Float32Array([\n * \t\t0, 0, 0, // y = 0\n * \t\t0, 1, 0, // y = 1\n * \t\t0, 0, 0, // y = 0\n * \t]))\n * \t.setType(Accessor.Type.VEC3);\n *\n * // Create sampler.\n * const sampler = doc.createAnimationSampler('bounce')\n * \t.setInput(input)\n * \t.setOutput(output)\n * \t.setInterpolation('LINEAR');\n * ```\n *\n * Reference\n * - [glTF → Animations](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#animations)\n *\n * @category Properties\n */\nclass AnimationSampler extends ExtensibleProperty {\n /**********************************************************************************************\n * Instance.\n */\n init() {\n this.propertyType = PropertyType.ANIMATION_SAMPLER;\n }\n getDefaultAttributes() {\n return Object.assign(super.getDefaults(), {\n interpolation: AnimationSampler.Interpolation.LINEAR,\n input: null,\n output: null\n });\n }\n /**********************************************************************************************\n * Static.\n */\n /** Interpolation mode: `STEP`, `LINEAR`, or `CUBICSPLINE`. */\n getInterpolation() {\n return this.get('interpolation');\n }\n /** Interpolation mode: `STEP`, `LINEAR`, or `CUBICSPLINE`. */\n setInterpolation(interpolation) {\n return this.set('interpolation', interpolation);\n }\n /** Times for each keyframe, in seconds. */\n getInput() {\n return this.getRef('input');\n }\n /** Times for each keyframe, in seconds. */\n setInput(input) {\n return this.setRef('input', input, {\n usage: BufferViewUsage$1.OTHER\n });\n }\n /**\n * Values for each keyframe. For `CUBICSPLINE` interpolation, output also contains in/out\n * tangents.\n */\n getOutput() {\n return this.getRef('output');\n }\n /**\n * Values for each keyframe. For `CUBICSPLINE` interpolation, output also contains in/out\n * tangents.\n */\n setOutput(output) {\n return this.setRef('output', output, {\n usage: BufferViewUsage$1.OTHER\n });\n }\n}\n/**********************************************************************************************\n * Constants.\n */\n/** Interpolation method. */\nAnimationSampler.Interpolation = {\n /** Animated values are linearly interpolated between keyframes. */\n LINEAR: 'LINEAR',\n /** Animated values remain constant from one keyframe until the next keyframe. */\n STEP: 'STEP',\n /** Animated values are interpolated according to given cubic spline tangents. */\n CUBICSPLINE: 'CUBICSPLINE'\n};\n\n/**\n * *Buffers are low-level storage units for binary data.*\n *\n * glTF 2.0 has three concepts relevant to binary storage: accessors, buffer views, and buffers.\n * In glTF Transform, an {@link Accessor} is referenced by any property that requires numeric typed\n * array data. Meshes, Primitives, and Animations all reference Accessors. Buffers define how that\n * data is organized into transmitted file(s). A `.glb` file has only a single Buffer, and when\n * exporting to `.glb` your resources should be grouped accordingly. A `.gltf` file may reference\n * one or more `.bin` files — each `.bin` is a Buffer — and grouping Accessors under different\n * Buffers allow you to specify that structure.\n *\n * For engines that can dynamically load portions of a glTF file, splitting data into separate\n * buffers can allow you to avoid loading data until it is needed. For example, you might put\n * binary data for specific meshes into a different `.bin` buffer, or put each animation's binary\n * payload into its own `.bin`.\n *\n * Buffer Views define how Accessors are organized within a given Buffer. glTF Transform creates an\n * efficient Buffer View layout automatically at export: there is no Buffer View property exposed\n * by the glTF Transform API, simplifying data management.\n *\n * Usage:\n *\n * ```ts\n * // Create two buffers with custom filenames.\n * const buffer1 = doc.createBuffer('buffer1')\n * \t.setURI('part1.bin');\n * const buffer2 = doc.createBuffer('buffer2')\n * \t.setURI('part2.bin');\n *\n * // Assign the attributes of two meshes to different buffers. If the meshes\n * // had indices or morph target attributes, you would also want to relocate\n * // those accessors.\n * mesh1\n * \t.listPrimitives()\n * \t.forEach((primitive) => primitive.listAttributes()\n * \t\t.forEach((attribute) => attribute.setBuffer(buffer1)));\n * mesh2\n * \t.listPrimitives()\n * \t.forEach((primitive) => primitive.listAttributes()\n * \t\t.forEach((attribute) => attribute.setBuffer(buffer2)));\n *\n * // Write to disk. Each mesh's binary data will be in a separate binary file;\n * // any remaining accessors will be in a third (default) buffer.\n * await new NodeIO().write('scene.gltf', doc);\n * // → scene.gltf, part1.bin, part2.bin\n * ```\n *\n * References:\n * - [glTF → Buffers and Buffer Views](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#buffers-and-buffer-views)\n * - [glTF → Accessors](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#accessors)\n *\n * @category Properties\n */\nclass Buffer$1 extends ExtensibleProperty {\n init() {\n this.propertyType = PropertyType.BUFFER;\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n uri: ''\n });\n }\n /**\n * Returns the URI (or filename) of this buffer (e.g. 'myBuffer.bin'). URIs are strongly\n * encouraged to be relative paths, rather than absolute. Use of a protocol (like `file://`)\n * is possible for custom applications, but will limit the compatibility of the asset with most\n * tools.\n *\n * Buffers commonly use the extension `.bin`, though this is not required.\n */\n getURI() {\n return this.get('uri');\n }\n /**\n * Sets the URI (or filename) of this buffer (e.g. 'myBuffer.bin'). URIs are strongly\n * encouraged to be relative paths, rather than absolute. Use of a protocol (like `file://`)\n * is possible for custom applications, but will limit the compatibility of the asset with most\n * tools.\n *\n * Buffers commonly use the extension `.bin`, though this is not required.\n */\n setURI(uri) {\n return this.set('uri', uri);\n }\n}\n\n/**\n * *Cameras are perspectives through which the {@link Scene} may be viewed.*\n *\n * Projection can be perspective or orthographic. Cameras are contained in nodes and thus can be\n * transformed. The camera is defined such that the local +X axis is to the right, the lens looks\n * towards the local -Z axis, and the top of the camera is aligned with the local +Y axis. If no\n * transformation is specified, the location of the camera is at the origin.\n *\n * Usage:\n *\n * ```typescript\n * const camera = doc.createCamera('myCamera')\n * \t.setType(GLTF.CameraType.PERSPECTIVE)\n * \t.setZNear(0.1)\n * \t.setZFar(100)\n * \t.setYFov(Math.PI / 4)\n * \t.setAspectRatio(1.5);\n *\n * node.setCamera(camera);\n * ```\n *\n * References:\n * - [glTF → Cameras](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#cameras)\n *\n * @category Properties\n */\nclass Camera extends ExtensibleProperty {\n /**********************************************************************************************\n * Instance.\n */\n init() {\n this.propertyType = PropertyType.CAMERA;\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n // Common.\n type: Camera.Type.PERSPECTIVE,\n znear: 0.1,\n zfar: 100,\n // Perspective.\n aspectRatio: null,\n yfov: Math.PI * 2 * 50 / 360,\n // 50º\n // Orthographic.\n xmag: 1,\n ymag: 1\n });\n }\n /**********************************************************************************************\n * Common.\n */\n /** Specifies if the camera uses a perspective or orthographic projection. */\n getType() {\n return this.get('type');\n }\n /** Specifies if the camera uses a perspective or orthographic projection. */\n setType(type) {\n return this.set('type', type);\n }\n /** Floating-point distance to the near clipping plane. */\n getZNear() {\n return this.get('znear');\n }\n /** Floating-point distance to the near clipping plane. */\n setZNear(znear) {\n return this.set('znear', znear);\n }\n /**\n * Floating-point distance to the far clipping plane. When defined, zfar must be greater than\n * znear. If zfar is undefined, runtime must use infinite projection matrix.\n */\n getZFar() {\n return this.get('zfar');\n }\n /**\n * Floating-point distance to the far clipping plane. When defined, zfar must be greater than\n * znear. If zfar is undefined, runtime must use infinite projection matrix.\n */\n setZFar(zfar) {\n return this.set('zfar', zfar);\n }\n /**********************************************************************************************\n * Perspective.\n */\n /**\n * Floating-point aspect ratio of the field of view. When undefined, the aspect ratio of the\n * canvas is used.\n */\n getAspectRatio() {\n return this.get('aspectRatio');\n }\n /**\n * Floating-point aspect ratio of the field of view. When undefined, the aspect ratio of the\n * canvas is used.\n */\n setAspectRatio(aspectRatio) {\n return this.set('aspectRatio', aspectRatio);\n }\n /** Floating-point vertical field of view in radians. */\n getYFov() {\n return this.get('yfov');\n }\n /** Floating-point vertical field of view in radians. */\n setYFov(yfov) {\n return this.set('yfov', yfov);\n }\n /**********************************************************************************************\n * Orthographic.\n */\n /**\n * Floating-point horizontal magnification of the view, and half the view's width\n * in world units.\n */\n getXMag() {\n return this.get('xmag');\n }\n /**\n * Floating-point horizontal magnification of the view, and half the view's width\n * in world units.\n */\n setXMag(xmag) {\n return this.set('xmag', xmag);\n }\n /**\n * Floating-point vertical magnification of the view, and half the view's height\n * in world units.\n */\n getYMag() {\n return this.get('ymag');\n }\n /**\n * Floating-point vertical magnification of the view, and half the view's height\n * in world units.\n */\n setYMag(ymag) {\n return this.set('ymag', ymag);\n }\n}\n/**********************************************************************************************\n * Constants.\n */\nCamera.Type = {\n /** A perspective camera representing a perspective projection matrix. */\n PERSPECTIVE: 'perspective',\n /** An orthographic camera representing an orthographic projection matrix. */\n ORTHOGRAPHIC: 'orthographic'\n};\n\n/**\n * *Base class for all {@link Property} types that can be attached by an {@link Extension}.*\n *\n * After an {@link Extension} is attached to a glTF {@link Document}, the Extension may be used to\n * construct ExtensionProperty instances, to be referenced throughout the document as prescribed by\n * the Extension. For example, the `KHR_materials_clearcoat` Extension defines a `Clearcoat`\n * ExtensionProperty, which is referenced by {@link Material} Properties in the Document, and may\n * contain references to {@link Texture} properties of its own.\n *\n * For more information on available extensions and their usage, see [Extensions](/extensions).\n *\n * Reference:\n * - [glTF → Extensions](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#specifying-extensions)\n *\n * @category Properties\n */\nclass ExtensionProperty extends Property {\n /** @hidden */\n _validateParent(parent) {\n if (!this.parentTypes.includes(parent.propertyType)) {\n throw new Error(`Parent \"${parent.propertyType}\" invalid for child \"${this.propertyType}\".`);\n }\n }\n}\nExtensionProperty.EXTENSION_NAME = void 0;\n\n/**\n * *Settings associated with a particular use of a {@link Texture}.*\n *\n * Different materials may reuse the same texture but with different texture coordinates,\n * minFilter/magFilter, or wrapS/wrapT settings. The TextureInfo class contains settings\n * derived from both the \"TextureInfo\" and \"Sampler\" properties in the glTF specification,\n * consolidated here for simplicity.\n *\n * TextureInfo properties cannot be directly created. For any material texture slot, such as\n * baseColorTexture, there will be a corresponding method to obtain the TextureInfo for that slot.\n * For example, see {@link Material.getBaseColorTextureInfo}.\n *\n * References:\n * - [glTF → Texture Info](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#reference-textureinfo)\n *\n * @category Properties\n */\nclass TextureInfo extends ExtensibleProperty {\n /**********************************************************************************************\n * Instance.\n */\n init() {\n this.propertyType = PropertyType.TEXTURE_INFO;\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n texCoord: 0,\n magFilter: null,\n minFilter: null,\n wrapS: TextureInfo.WrapMode.REPEAT,\n wrapT: TextureInfo.WrapMode.REPEAT\n });\n }\n /**********************************************************************************************\n * Texture coordinates.\n */\n /** Returns the texture coordinate (UV set) index for the texture. */\n getTexCoord() {\n return this.get('texCoord');\n }\n /** Sets the texture coordinate (UV set) index for the texture. */\n setTexCoord(texCoord) {\n return this.set('texCoord', texCoord);\n }\n /**********************************************************************************************\n * Min/mag filter.\n */\n /** Returns the magnification filter applied to the texture. */\n getMagFilter() {\n return this.get('magFilter');\n }\n /** Sets the magnification filter applied to the texture. */\n setMagFilter(magFilter) {\n return this.set('magFilter', magFilter);\n }\n /** Sets the minification filter applied to the texture. */\n getMinFilter() {\n return this.get('minFilter');\n }\n /** Returns the minification filter applied to the texture. */\n setMinFilter(minFilter) {\n return this.set('minFilter', minFilter);\n }\n /**********************************************************************************************\n * UV wrapping.\n */\n /** Returns the S (U) wrapping mode for UVs used by the texture. */\n getWrapS() {\n return this.get('wrapS');\n }\n /** Sets the S (U) wrapping mode for UVs used by the texture. */\n setWrapS(wrapS) {\n return this.set('wrapS', wrapS);\n }\n /** Returns the T (V) wrapping mode for UVs used by the texture. */\n getWrapT() {\n return this.get('wrapT');\n }\n /** Sets the T (V) wrapping mode for UVs used by the texture. */\n setWrapT(wrapT) {\n return this.set('wrapT', wrapT);\n }\n}\n/**********************************************************************************************\n * Constants.\n */\n/** UV wrapping mode. Values correspond to WebGL enums. */\nTextureInfo.WrapMode = {\n /** */\n CLAMP_TO_EDGE: 33071,\n /** */\n MIRRORED_REPEAT: 33648,\n /** */\n REPEAT: 10497\n};\n/** Magnification filter. Values correspond to WebGL enums. */\nTextureInfo.MagFilter = {\n /** */\n NEAREST: 9728,\n /** */\n LINEAR: 9729\n};\n/** Minification filter. Values correspond to WebGL enums. */\nTextureInfo.MinFilter = {\n /** */\n NEAREST: 9728,\n /** */\n LINEAR: 9729,\n /** */\n NEAREST_MIPMAP_NEAREST: 9984,\n /** */\n LINEAR_MIPMAP_NEAREST: 9985,\n /** */\n NEAREST_MIPMAP_LINEAR: 9986,\n /** */\n LINEAR_MIPMAP_LINEAR: 9987\n};\n\nconst {\n R,\n G,\n B,\n A\n} = TextureChannel;\n/**\n * *Materials describe a surface's appearance and response to light.*\n *\n * Each {@link Primitive} within a {@link Mesh} may be assigned a single Material. The number of\n * GPU draw calls typically increases with both the numbers of Primitives and of Materials in an\n * asset; Materials should be reused wherever possible. Techniques like texture atlasing and vertex\n * colors allow objects to have varied appearances while technically sharing a single Material.\n *\n * Material properties are modified by both scalars (like `baseColorFactor`) and textures (like\n * `baseColorTexture`). When both are available, factors are considered linear multipliers against\n * textures of the same name. In the case of base color, vertex colors (`COLOR_0` attributes) are\n * also multiplied.\n *\n * Textures containing color data (`baseColorTexture`, `emissiveTexture`) are sRGB. All other\n * textures are linear. Like other resources, textures should be reused when possible.\n *\n * Usage:\n *\n * ```typescript\n * const material = doc.createMaterial('myMaterial')\n * \t.setBaseColorFactor([1, 0.5, 0.5, 1]) // RGBA\n * \t.setOcclusionTexture(aoTexture)\n * \t.setOcclusionStrength(0.5);\n *\n * mesh.listPrimitives()\n * \t.forEach((prim) => prim.setMaterial(material));\n * ```\n *\n * @category Properties\n */\nclass Material extends ExtensibleProperty {\n /**********************************************************************************************\n * Instance.\n */\n init() {\n this.propertyType = PropertyType.MATERIAL;\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n alphaMode: Material.AlphaMode.OPAQUE,\n alphaCutoff: 0.5,\n doubleSided: false,\n baseColorFactor: [1, 1, 1, 1],\n baseColorTexture: null,\n baseColorTextureInfo: new TextureInfo(this.graph, 'baseColorTextureInfo'),\n emissiveFactor: [0, 0, 0],\n emissiveTexture: null,\n emissiveTextureInfo: new TextureInfo(this.graph, 'emissiveTextureInfo'),\n normalScale: 1,\n normalTexture: null,\n normalTextureInfo: new TextureInfo(this.graph, 'normalTextureInfo'),\n occlusionStrength: 1,\n occlusionTexture: null,\n occlusionTextureInfo: new TextureInfo(this.graph, 'occlusionTextureInfo'),\n roughnessFactor: 1,\n metallicFactor: 1,\n metallicRoughnessTexture: null,\n metallicRoughnessTextureInfo: new TextureInfo(this.graph, 'metallicRoughnessTextureInfo')\n });\n }\n /**********************************************************************************************\n * Double-sided / culling.\n */\n /** Returns true when both sides of triangles should be rendered. May impact performance. */\n getDoubleSided() {\n return this.get('doubleSided');\n }\n /** Sets whether to render both sides of triangles. May impact performance. */\n setDoubleSided(doubleSided) {\n return this.set('doubleSided', doubleSided);\n }\n /**********************************************************************************************\n * Alpha.\n */\n /** Returns material alpha, equivalent to baseColorFactor[3]. */\n getAlpha() {\n return this.get('baseColorFactor')[3];\n }\n /** Sets material alpha, equivalent to baseColorFactor[3]. */\n setAlpha(alpha) {\n const baseColorFactor = this.get('baseColorFactor').slice();\n baseColorFactor[3] = alpha;\n return this.set('baseColorFactor', baseColorFactor);\n }\n /**\n * Returns the mode of the material's alpha channels, which are provided by `baseColorFactor`\n * and `baseColorTexture`.\n *\n * - `OPAQUE`: Alpha value is ignored and the rendered output is fully opaque.\n * - `BLEND`: Alpha value is used to determine the transparency each pixel on a surface, and\n * \tthe fraction of surface vs. background color in the final result. Alpha blending creates\n *\tsignificant edge cases in realtime renderers, and some care when structuring the model is\n * \tnecessary for good results. In particular, transparent geometry should be kept in separate\n * \tmeshes or primitives from opaque geometry. The `depthWrite` or `zWrite` settings in engines\n * \tshould usually be disabled on transparent materials.\n * - `MASK`: Alpha value is compared against `alphaCutoff` threshold for each pixel on a\n * \tsurface, and the pixel is either fully visible or fully discarded based on that cutoff.\n * \tThis technique is useful for things like leafs/foliage, grass, fabric meshes, and other\n * \tsurfaces where no semitransparency is needed. With a good choice of `alphaCutoff`, surfaces\n * \tthat don't require semitransparency can avoid the performance penalties and visual issues\n * \tinvolved with `BLEND` transparency.\n *\n * Reference:\n * - [glTF → material.alphaMode](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#materialalphamode)\n */\n getAlphaMode() {\n return this.get('alphaMode');\n }\n /** Sets the mode of the material's alpha channels. See {@link Material.getAlphaMode getAlphaMode} for details. */\n setAlphaMode(alphaMode) {\n return this.set('alphaMode', alphaMode);\n }\n /** Returns the visibility threshold; applied only when `.alphaMode='MASK'`. */\n getAlphaCutoff() {\n return this.get('alphaCutoff');\n }\n /** Sets the visibility threshold; applied only when `.alphaMode='MASK'`. */\n setAlphaCutoff(alphaCutoff) {\n return this.set('alphaCutoff', alphaCutoff);\n }\n /**********************************************************************************************\n * Base color.\n */\n /**\n * Base color / albedo factor; Linear-sRGB components.\n * See {@link Material.getBaseColorTexture getBaseColorTexture}.\n */\n getBaseColorFactor() {\n return this.get('baseColorFactor');\n }\n /**\n * Base color / albedo factor; Linear-sRGB components.\n * See {@link Material.getBaseColorTexture getBaseColorTexture}.\n */\n setBaseColorFactor(baseColorFactor) {\n return this.set('baseColorFactor', baseColorFactor);\n }\n /**\n * Base color / albedo. The visible color of a non-metallic surface under constant ambient\n * light would be a linear combination (multiplication) of its vertex colors, base color\n * factor, and base color texture. Lighting, and reflections in metallic or smooth surfaces,\n * also effect the final color. The alpha (`.a`) channel of base color factors and textures\n * will have varying effects, based on the setting of {@link Material.getAlphaMode getAlphaMode}.\n *\n * Reference:\n * - [glTF → material.pbrMetallicRoughness.baseColorFactor](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#pbrmetallicroughnessbasecolorfactor)\n */\n getBaseColorTexture() {\n return this.getRef('baseColorTexture');\n }\n /**\n * Settings affecting the material's use of its base color texture. If no texture is attached,\n * {@link TextureInfo} is `null`.\n */\n getBaseColorTextureInfo() {\n return this.getRef('baseColorTexture') ? this.getRef('baseColorTextureInfo') : null;\n }\n /** Sets base color / albedo texture. See {@link Material.getBaseColorTexture getBaseColorTexture}. */\n setBaseColorTexture(texture) {\n return this.setRef('baseColorTexture', texture, {\n channels: R | G | B | A,\n isColor: true\n });\n }\n /**********************************************************************************************\n * Emissive.\n */\n /** Emissive color; Linear-sRGB components. See {@link Material.getEmissiveTexture getEmissiveTexture}. */\n getEmissiveFactor() {\n return this.get('emissiveFactor');\n }\n /** Emissive color; Linear-sRGB components. See {@link Material.getEmissiveTexture getEmissiveTexture}. */\n setEmissiveFactor(emissiveFactor) {\n return this.set('emissiveFactor', emissiveFactor);\n }\n /**\n * Emissive texture. Emissive color is added to any base color of the material, after any\n * lighting/shadowing are applied. An emissive color does not inherently \"glow\", or affect\n * objects around it at all. To create that effect, most viewers must also enable a\n * post-processing effect called \"bloom\".\n *\n * Reference:\n * - [glTF → material.emissiveTexture](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#materialemissivetexture)\n */\n getEmissiveTexture() {\n return this.getRef('emissiveTexture');\n }\n /**\n * Settings affecting the material's use of its emissive texture. If no texture is attached,\n * {@link TextureInfo} is `null`.\n */\n getEmissiveTextureInfo() {\n return this.getRef('emissiveTexture') ? this.getRef('emissiveTextureInfo') : null;\n }\n /** Sets emissive texture. See {@link Material.getEmissiveTexture getEmissiveTexture}. */\n setEmissiveTexture(texture) {\n return this.setRef('emissiveTexture', texture, {\n channels: R | G | B,\n isColor: true\n });\n }\n /**********************************************************************************************\n * Normal.\n */\n /** Normal (surface detail) factor; linear multiplier. Affects `.normalTexture`. */\n getNormalScale() {\n return this.get('normalScale');\n }\n /** Normal (surface detail) factor; linear multiplier. Affects `.normalTexture`. */\n setNormalScale(scale) {\n return this.set('normalScale', scale);\n }\n /**\n * Normal (surface detail) texture.\n *\n * A tangent space normal map. The texture contains RGB components. Each texel represents the\n * XYZ components of a normal vector in tangent space. Red [0 to 255] maps to X [-1 to 1].\n * Green [0 to 255] maps to Y [-1 to 1]. Blue [128 to 255] maps to Z [1/255 to 1]. The normal\n * vectors use OpenGL conventions where +X is right and +Y is up. +Z points toward the viewer.\n *\n * Reference:\n * - [glTF → material.normalTexture](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#materialnormaltexture)\n */\n getNormalTexture() {\n return this.getRef('normalTexture');\n }\n /**\n * Settings affecting the material's use of its normal texture. If no texture is attached,\n * {@link TextureInfo} is `null`.\n */\n getNormalTextureInfo() {\n return this.getRef('normalTexture') ? this.getRef('normalTextureInfo') : null;\n }\n /** Sets normal (surface detail) texture. See {@link Material.getNormalTexture getNormalTexture}. */\n setNormalTexture(texture) {\n return this.setRef('normalTexture', texture, {\n channels: R | G | B\n });\n }\n /**********************************************************************************************\n * Occlusion.\n */\n /** (Ambient) Occlusion factor; linear multiplier. Affects `.occlusionTexture`. */\n getOcclusionStrength() {\n return this.get('occlusionStrength');\n }\n /** Sets (ambient) occlusion factor; linear multiplier. Affects `.occlusionTexture`. */\n setOcclusionStrength(strength) {\n return this.set('occlusionStrength', strength);\n }\n /**\n * (Ambient) Occlusion texture, generally used for subtle 'baked' shadowing effects that are\n * independent of an object's position, such as shading in inset areas and corners. Direct\n * lighting is not affected by occlusion, so at least one indirect light source must be present\n * in the scene for occlusion effects to be visible.\n *\n * The occlusion values are sampled from the R channel. Higher values indicate areas that\n * should receive full indirect lighting and lower values indicate no indirect lighting.\n *\n * Reference:\n * - [glTF → material.occlusionTexture](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#materialocclusiontexture)\n */\n getOcclusionTexture() {\n return this.getRef('occlusionTexture');\n }\n /**\n * Settings affecting the material's use of its occlusion texture. If no texture is attached,\n * {@link TextureInfo} is `null`.\n */\n getOcclusionTextureInfo() {\n return this.getRef('occlusionTexture') ? this.getRef('occlusionTextureInfo') : null;\n }\n /** Sets (ambient) occlusion texture. See {@link Material.getOcclusionTexture getOcclusionTexture}. */\n setOcclusionTexture(texture) {\n return this.setRef('occlusionTexture', texture, {\n channels: R\n });\n }\n /**********************************************************************************************\n * Metallic / roughness.\n */\n /**\n * Roughness factor; linear multiplier. Affects roughness channel of\n * `metallicRoughnessTexture`. See {@link Material.getMetallicRoughnessTexture getMetallicRoughnessTexture}.\n */\n getRoughnessFactor() {\n return this.get('roughnessFactor');\n }\n /**\n * Sets roughness factor; linear multiplier. Affects roughness channel of\n * `metallicRoughnessTexture`. See {@link Material.getMetallicRoughnessTexture getMetallicRoughnessTexture}.\n */\n setRoughnessFactor(factor) {\n return this.set('roughnessFactor', factor);\n }\n /**\n * Metallic factor; linear multiplier. Affects roughness channel of\n * `metallicRoughnessTexture`. See {@link Material.getMetallicRoughnessTexture getMetallicRoughnessTexture}.\n */\n getMetallicFactor() {\n return this.get('metallicFactor');\n }\n /**\n * Sets metallic factor; linear multiplier. Affects roughness channel of\n * `metallicRoughnessTexture`. See {@link Material.getMetallicRoughnessTexture getMetallicRoughnessTexture}.\n */\n setMetallicFactor(factor) {\n return this.set('metallicFactor', factor);\n }\n /**\n * Metallic roughness texture. The metalness values are sampled from the B channel. The\n * roughness values are sampled from the G channel. When a material is fully metallic,\n * or nearly so, it may require image-based lighting (i.e. an environment map) or global\n * illumination to appear well-lit.\n *\n * Reference:\n * - [glTF → material.pbrMetallicRoughness.metallicRoughnessTexture](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#pbrmetallicroughnessmetallicroughnesstexture)\n */\n getMetallicRoughnessTexture() {\n return this.getRef('metallicRoughnessTexture');\n }\n /**\n * Settings affecting the material's use of its metallic/roughness texture. If no texture is\n * attached, {@link TextureInfo} is `null`.\n */\n getMetallicRoughnessTextureInfo() {\n return this.getRef('metallicRoughnessTexture') ? this.getRef('metallicRoughnessTextureInfo') : null;\n }\n /**\n * Sets metallic/roughness texture.\n * See {@link Material.getMetallicRoughnessTexture getMetallicRoughnessTexture}.\n */\n setMetallicRoughnessTexture(texture) {\n return this.setRef('metallicRoughnessTexture', texture, {\n channels: G | B\n });\n }\n}\n/**********************************************************************************************\n * Constants.\n */\nMaterial.AlphaMode = {\n /**\n * The alpha value is ignored and the rendered output is fully opaque\n */\n OPAQUE: 'OPAQUE',\n /**\n * The rendered output is either fully opaque or fully transparent depending on the alpha\n * value and the specified alpha cutoff value\n */\n MASK: 'MASK',\n /**\n * The alpha value is used to composite the source and destination areas. The rendered\n * output is combined with the background using the normal painting operation (i.e. the\n * Porter and Duff over operator)\n */\n BLEND: 'BLEND'\n};\n\n/**\n * *Meshes define reusable geometry (triangles, lines, or points) and are instantiated by\n * {@link Node}s.*\n *\n * Each draw call required to render a mesh is represented as a {@link Primitive}. Meshes typically\n * have only a single {@link Primitive}, but may have more for various reasons. A mesh manages only\n * a list of primitives — materials, morph targets, and other properties are managed on a per-\n * primitive basis.\n *\n * When the same geometry and material should be rendered at multiple places in the scene, reuse\n * the same Mesh instance and attach it to multiple nodes for better efficiency. Where the geometry\n * is shared but the material is not, reusing {@link Accessor}s under different meshes and\n * primitives can similarly improve transmission efficiency, although some rendering efficiency is\n * lost as the number of materials in a scene increases.\n *\n * Usage:\n *\n * ```ts\n * const primitive = doc.createPrimitive()\n * \t.setAttribute('POSITION', positionAccessor)\n * \t.setAttribute('TEXCOORD_0', uvAccessor);\n * const mesh = doc.createMesh('myMesh')\n * \t.addPrimitive(primitive);\n * node.setMesh(mesh);\n * ```\n *\n * References:\n * - [glTF → Geometry](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#geometry)\n *\n * @category Properties\n */\nclass Mesh extends ExtensibleProperty {\n init() {\n this.propertyType = PropertyType.MESH;\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n weights: [],\n primitives: new RefSet()\n });\n }\n /** Adds a {@link Primitive} to the mesh's draw call list. */\n addPrimitive(primitive) {\n return this.addRef('primitives', primitive);\n }\n /** Removes a {@link Primitive} from the mesh's draw call list. */\n removePrimitive(primitive) {\n return this.removeRef('primitives', primitive);\n }\n /** Lists {@link Primitive} draw calls of the mesh. */\n listPrimitives() {\n return this.listRefs('primitives');\n }\n /**\n * Initial weights of each {@link PrimitiveTarget} on this mesh. Each {@link Primitive} must\n * have the same number of targets. Most engines only support 4-8 active morph targets at a\n * time.\n */\n getWeights() {\n return this.get('weights');\n }\n /**\n * Initial weights of each {@link PrimitiveTarget} on this mesh. Each {@link Primitive} must\n * have the same number of targets. Most engines only support 4-8 active morph targets at a\n * time.\n */\n setWeights(weights) {\n return this.set('weights', weights);\n }\n}\n\n/**\n * *Nodes are the objects that comprise a {@link Scene}.*\n *\n * Each Node may have one or more children, and a transform (position, rotation, and scale) that\n * applies to all of its descendants. A Node may also reference (or \"instantiate\") other resources\n * at its location, including {@link Mesh}, Camera, Light, and Skin properties. A Node cannot be\n * part of more than one {@link Scene}.\n *\n * A Node's local transform is represented with array-like objects, intended to be compatible with\n * [gl-matrix](https://github.com/toji/gl-matrix), or with the `toArray`/`fromArray` methods of\n * libraries like three.js and babylon.js.\n *\n * Usage:\n *\n * ```ts\n * const node = doc.createNode('myNode')\n * \t.setMesh(mesh)\n * \t.setTranslation([0, 0, 0])\n * \t.addChild(otherNode);\n * ```\n *\n * References:\n * - [glTF → Nodes and Hierarchy](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#nodes-and-hierarchy)\n *\n * @category Properties\n */\nclass Node extends ExtensibleProperty {\n init() {\n this.propertyType = PropertyType.NODE;\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n translation: [0, 0, 0],\n rotation: [0, 0, 0, 1],\n scale: [1, 1, 1],\n weights: [],\n camera: null,\n mesh: null,\n skin: null,\n children: new RefSet()\n });\n }\n copy(other, resolve = COPY_IDENTITY) {\n // Node cannot be copied, only cloned. Copying is shallow, but Nodes cannot have more than\n // one parent. Rather than leaving one of the two Nodes without children, throw an error here.\n if (resolve === COPY_IDENTITY) throw new Error('Node cannot be copied.');\n return super.copy(other, resolve);\n }\n /**********************************************************************************************\n * Local transform.\n */\n /** Returns the translation (position) of this Node in local space. */\n getTranslation() {\n return this.get('translation');\n }\n /** Returns the rotation (quaternion) of this Node in local space. */\n getRotation() {\n return this.get('rotation');\n }\n /** Returns the scale of this Node in local space. */\n getScale() {\n return this.get('scale');\n }\n /** Sets the translation (position) of this Node in local space. */\n setTranslation(translation) {\n return this.set('translation', translation);\n }\n /** Sets the rotation (quaternion) of this Node in local space. */\n setRotation(rotation) {\n return this.set('rotation', rotation);\n }\n /** Sets the scale of this Node in local space. */\n setScale(scale) {\n return this.set('scale', scale);\n }\n /** Returns the local matrix of this Node. */\n getMatrix() {\n return MathUtils.compose(this.get('translation'), this.get('rotation'), this.get('scale'), []);\n }\n /** Sets the local matrix of this Node. Matrix will be decomposed to TRS properties. */\n setMatrix(matrix) {\n const translation = this.get('translation').slice();\n const rotation = this.get('rotation').slice();\n const scale = this.get('scale').slice();\n MathUtils.decompose(matrix, translation, rotation, scale);\n return this.set('translation', translation).set('rotation', rotation).set('scale', scale);\n }\n /**********************************************************************************************\n * World transform.\n */\n /** Returns the translation (position) of this Node in world space. */\n getWorldTranslation() {\n const t = [0, 0, 0];\n MathUtils.decompose(this.getWorldMatrix(), t, [0, 0, 0, 1], [1, 1, 1]);\n return t;\n }\n /** Returns the rotation (quaternion) of this Node in world space. */\n getWorldRotation() {\n const r = [0, 0, 0, 1];\n MathUtils.decompose(this.getWorldMatrix(), [0, 0, 0], r, [1, 1, 1]);\n return r;\n }\n /** Returns the scale of this Node in world space. */\n getWorldScale() {\n const s = [1, 1, 1];\n MathUtils.decompose(this.getWorldMatrix(), [0, 0, 0], [0, 0, 0, 1], s);\n return s;\n }\n /** Returns the world matrix of this Node. */\n getWorldMatrix() {\n // Build ancestor chain.\n const ancestors = [];\n for (let node = this; node != null; node = node.getParentNode()) {\n ancestors.push(node);\n }\n // Compute world matrix.\n let ancestor;\n const worldMatrix = ancestors.pop().getMatrix();\n while (ancestor = ancestors.pop()) {\n multiply(worldMatrix, worldMatrix, ancestor.getMatrix());\n }\n return worldMatrix;\n }\n /**********************************************************************************************\n * Scene hierarchy.\n */\n /**\n * Adds the given Node as a child of this Node.\n *\n * Requirements:\n *\n * 1. Nodes MAY be root children of multiple {@link Scene Scenes}\n * 2. Nodes MUST NOT be children of >1 Node\n * 3. Nodes MUST NOT be children of both Nodes and {@link Scene Scenes}\n *\n * The `addChild` method enforces these restrictions automatically, and will\n * remove the new child from previous parents where needed. This behavior\n * may change in future major releases of the library.\n */\n addChild(child) {\n // Remove existing parents.\n const parentNode = child.getParentNode();\n if (parentNode) parentNode.removeChild(child);\n for (const parent of child.listParents()) {\n if (parent.propertyType === PropertyType.SCENE) {\n parent.removeChild(child);\n }\n }\n return this.addRef('children', child);\n }\n /** Removes a Node from this Node's child Node list. */\n removeChild(child) {\n return this.removeRef('children', child);\n }\n /** Lists all child Nodes of this Node. */\n listChildren() {\n return this.listRefs('children');\n }\n /**\n * Returns the Node's unique parent Node within the scene graph. If the\n * Node has no parents, or is a direct child of the {@link Scene}\n * (\"root node\"), this method returns null.\n *\n * Unrelated to {@link Property.listParents}, which lists all resource\n * references from properties of any type ({@link Skin}, {@link Root}, ...).\n */\n getParentNode() {\n for (const parent of this.listParents()) {\n if (parent.propertyType === PropertyType.NODE) {\n return parent;\n }\n }\n return null;\n }\n /**********************************************************************************************\n * Attachments.\n */\n /** Returns the {@link Mesh}, if any, instantiated at this Node. */\n getMesh() {\n return this.getRef('mesh');\n }\n /**\n * Sets a {@link Mesh} to be instantiated at this Node. A single mesh may be instantiated by\n * multiple Nodes; reuse of this sort is strongly encouraged.\n */\n setMesh(mesh) {\n return this.setRef('mesh', mesh);\n }\n /** Returns the {@link Camera}, if any, instantiated at this Node. */\n getCamera() {\n return this.getRef('camera');\n }\n /** Sets a {@link Camera} to be instantiated at this Node. */\n setCamera(camera) {\n return this.setRef('camera', camera);\n }\n /** Returns the {@link Skin}, if any, instantiated at this Node. */\n getSkin() {\n return this.getRef('skin');\n }\n /** Sets a {@link Skin} to be instantiated at this Node. */\n setSkin(skin) {\n return this.setRef('skin', skin);\n }\n /**\n * Initial weights of each {@link PrimitiveTarget} for the mesh instance at this Node.\n * Most engines only support 4-8 active morph targets at a time.\n */\n getWeights() {\n return this.get('weights');\n }\n /**\n * Initial weights of each {@link PrimitiveTarget} for the mesh instance at this Node.\n * Most engines only support 4-8 active morph targets at a time.\n */\n setWeights(weights) {\n return this.set('weights', weights);\n }\n /**********************************************************************************************\n * Helpers.\n */\n /** Visits this {@link Node} and its descendants, top-down. */\n traverse(fn) {\n fn(this);\n for (const child of this.listChildren()) child.traverse(fn);\n return this;\n }\n}\n\n/**\n * *Primitives are individual GPU draw calls comprising a {@link Mesh}.*\n *\n * Meshes typically have only a single Primitive, although various cases may require more. Each\n * primitive may be assigned vertex attributes, morph target attributes, and a material. Any of\n * these properties should be reused among multiple primitives where feasible.\n *\n * Primitives cannot be moved independently of other primitives within the same mesh, except\n * through the use of morph targets and skinning. If independent movement or other runtime\n * behavior is necessary (like raycasting or collisions) prefer to assign each primitive to a\n * different mesh. The number of GPU draw calls is typically not affected by grouping or\n * ungrouping primitives to a mesh.\n *\n * Each primitive may optionally be deformed by one or more morph targets, stored in a\n * {@link PrimitiveTarget}.\n *\n * Usage:\n *\n * ```ts\n * const primitive = doc.createPrimitive()\n * \t.setAttribute('POSITION', positionAccessor)\n * \t.setAttribute('TEXCOORD_0', uvAccessor)\n * \t.setMaterial(material);\n * mesh.addPrimitive(primitive);\n * node.setMesh(mesh);\n * ```\n *\n * References:\n * - [glTF → Geometry](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#geometry)\n *\n * @category Properties\n */\nclass Primitive extends ExtensibleProperty {\n /**********************************************************************************************\n * Instance.\n */\n init() {\n this.propertyType = PropertyType.PRIMITIVE;\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n mode: Primitive.Mode.TRIANGLES,\n material: null,\n indices: null,\n attributes: new RefMap(),\n targets: new RefSet()\n });\n }\n /**********************************************************************************************\n * Primitive data.\n */\n /** Returns an {@link Accessor} with indices of vertices to be drawn. */\n getIndices() {\n return this.getRef('indices');\n }\n /**\n * Sets an {@link Accessor} with indices of vertices to be drawn. In `TRIANGLES` draw mode,\n * each set of three indices define a triangle. The front face has a counter-clockwise (CCW)\n * winding order.\n */\n setIndices(indices) {\n return this.setRef('indices', indices, {\n usage: BufferViewUsage$1.ELEMENT_ARRAY_BUFFER\n });\n }\n /** Returns a vertex attribute as an {@link Accessor}. */\n getAttribute(semantic) {\n return this.getRefMap('attributes', semantic);\n }\n /**\n * Sets a vertex attribute to an {@link Accessor}. All attributes must have the same vertex\n * count.\n */\n setAttribute(semantic, accessor) {\n return this.setRefMap('attributes', semantic, accessor, {\n usage: BufferViewUsage$1.ARRAY_BUFFER\n });\n }\n /**\n * Lists all vertex attribute {@link Accessor}s associated with the primitive, excluding any\n * attributes used for morph targets. For example, `[positionAccessor, normalAccessor,\n * uvAccessor]`. Order will be consistent with the order returned by {@link .listSemantics}().\n */\n listAttributes() {\n return this.listRefMapValues('attributes');\n }\n /**\n * Lists all vertex attribute semantics associated with the primitive, excluding any semantics\n * used for morph targets. For example, `['POSITION', 'NORMAL', 'TEXCOORD_0']`. Order will be\n * consistent with the order returned by {@link .listAttributes}().\n */\n listSemantics() {\n return this.listRefMapKeys('attributes');\n }\n /** Returns the material used to render the primitive. */\n getMaterial() {\n return this.getRef('material');\n }\n /** Sets the material used to render the primitive. */\n setMaterial(material) {\n return this.setRef('material', material);\n }\n /**********************************************************************************************\n * Mode.\n */\n /**\n * Returns the GPU draw mode (`TRIANGLES`, `LINES`, `POINTS`...) as a WebGL enum value.\n *\n * Reference:\n * - [glTF → `primitive.mode`](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#primitivemode)\n */\n getMode() {\n return this.get('mode');\n }\n /**\n * Sets the GPU draw mode (`TRIANGLES`, `LINES`, `POINTS`...) as a WebGL enum value.\n *\n * Reference:\n * - [glTF → `primitive.mode`](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#primitivemode)\n */\n setMode(mode) {\n return this.set('mode', mode);\n }\n /**********************************************************************************************\n * Morph targets.\n */\n /** Lists all morph targets associated with the primitive. */\n listTargets() {\n return this.listRefs('targets');\n }\n /**\n * Adds a morph target to the primitive. All primitives in the same mesh must have the same\n * number of targets.\n */\n addTarget(target) {\n return this.addRef('targets', target);\n }\n /**\n * Removes a morph target from the primitive. All primitives in the same mesh must have the same\n * number of targets.\n */\n removeTarget(target) {\n return this.removeRef('targets', target);\n }\n}\n/**********************************************************************************************\n * Constants.\n */\n/** Type of primitives to render. All valid values correspond to WebGL enums. */\nPrimitive.Mode = {\n /** Draw single points. */\n POINTS: 0,\n /** Draw lines. Each vertex connects to the one after it. */\n LINES: 1,\n /**\n * Draw lines. Each set of two vertices is treated as a separate line segment.\n * @deprecated See {@link https://github.com/KhronosGroup/glTF/issues/1883 KhronosGroup/glTF#1883}.\n */\n LINE_LOOP: 2,\n /** Draw a connected group of line segments from the first vertex to the last, */\n LINE_STRIP: 3,\n /** Draw triangles. Each set of three vertices creates a separate triangle. */\n TRIANGLES: 4,\n /** Draw a connected strip of triangles. */\n TRIANGLE_STRIP: 5,\n /**\n * Draw a connected group of triangles. Each vertex connects to the previous and the first\n * vertex in the fan.\n * @deprecated See {@link https://github.com/KhronosGroup/glTF/issues/1883 KhronosGroup/glTF#1883}.\n */\n TRIANGLE_FAN: 6\n};\n\n/**\n * *Morph target or shape key used to deform one {@link Primitive} in a {@link Mesh}.*\n *\n * A PrimitiveTarget contains a `POSITION` attribute (and optionally `NORMAL` and `TANGENT`) that\n * can additively deform the base attributes on a {@link Mesh} {@link Primitive}. Vertex values\n * of `0, 0, 0` in the target will have no effect, whereas a value of `0, 1, 0` would offset that\n * vertex in the base geometry by y+=1. Morph targets can be fully or partially applied: their\n * default state is controlled by {@link Mesh.getWeights}, which can also be overridden for a\n * particular instantiation of a {@link Mesh}, using {@link Node.getWeights}.\n *\n * Reference:\n * - [glTF → Morph Targets](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#morph-targets)\n *\n * @category Properties\n */\nclass PrimitiveTarget extends Property {\n init() {\n this.propertyType = PropertyType.PRIMITIVE_TARGET;\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n attributes: new RefMap()\n });\n }\n /** Returns a morph target vertex attribute as an {@link Accessor}. */\n getAttribute(semantic) {\n return this.getRefMap('attributes', semantic);\n }\n /**\n * Sets a morph target vertex attribute to an {@link Accessor}.\n */\n setAttribute(semantic, accessor) {\n return this.setRefMap('attributes', semantic, accessor, {\n usage: BufferViewUsage$1.ARRAY_BUFFER\n });\n }\n /**\n * Lists all morph target vertex attribute {@link Accessor}s associated. Order will be\n * consistent with the order returned by {@link .listSemantics}().\n */\n listAttributes() {\n return this.listRefMapValues('attributes');\n }\n /**\n * Lists all morph target vertex attribute semantics associated. Order will be\n * consistent with the order returned by {@link .listAttributes}().\n */\n listSemantics() {\n return this.listRefMapKeys('attributes');\n }\n}\n\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\n\n/**\n * *Scenes represent a set of visual objects to render.*\n *\n * Typically a glTF file contains only a single Scene, although more are allowed and useful in some\n * cases. No particular meaning is associated with additional Scenes, except as defined by the\n * application. Scenes reference {@link Node}s, and a single Node cannot be a member of more than\n * one Scene.\n *\n * References:\n * - [glTF → Scenes](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#scenes)\n * - [glTF → Coordinate System and Units](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#coordinate-system-and-units)\n *\n * @category Properties\n */\nclass Scene extends ExtensibleProperty {\n init() {\n this.propertyType = PropertyType.SCENE;\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n children: new RefSet()\n });\n }\n copy(other, resolve = COPY_IDENTITY) {\n // Scene cannot be copied, only cloned. Copying is shallow, but nodes cannot have more than\n // one parent. Rather than leaving one of the two Scenes without children, throw an error here.\n if (resolve === COPY_IDENTITY) throw new Error('Scene cannot be copied.');\n return super.copy(other, resolve);\n }\n /**\n * Adds a {@link Node} to the Scene.\n *\n * Requirements:\n *\n * 1. Nodes MAY be root children of multiple {@link Scene Scenes}\n * 2. Nodes MUST NOT be children of >1 Node\n * 3. Nodes MUST NOT be children of both Nodes and {@link Scene Scenes}\n *\n * The `addChild` method enforces these restrictions automatically, and will\n * remove the new child from previous parents where needed. This behavior\n * may change in future major releases of the library.\n */\n addChild(node) {\n // Remove existing parent.\n const parentNode = node.getParentNode();\n if (parentNode) parentNode.removeChild(node);\n return this.addRef('children', node);\n }\n /** Removes a {@link Node} from the Scene. */\n removeChild(node) {\n return this.removeRef('children', node);\n }\n /**\n * Lists all direct child {@link Node Nodes} in the Scene. Indirect\n * descendants (children of children) are not returned, but may be\n * reached recursively or with {@link Scene.traverse} instead.\n */\n listChildren() {\n return this.listRefs('children');\n }\n /** Visits each {@link Node} in the Scene, including descendants, top-down. */\n traverse(fn) {\n for (const node of this.listChildren()) node.traverse(fn);\n return this;\n }\n}\n\n/**\n * *Collection of {@link Node} joints and inverse bind matrices used with skinned {@link Mesh}\n * instances.*\n *\n * Reference\n * - [glTF → Skins](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#skins)\n *\n * @category Properties\n */\nclass Skin extends ExtensibleProperty {\n init() {\n this.propertyType = PropertyType.SKIN;\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n skeleton: null,\n inverseBindMatrices: null,\n joints: new RefSet()\n });\n }\n /**\n * {@link Node} used as a skeleton root. The node must be the closest common root of the joints\n * hierarchy or a direct or indirect parent node of the closest common root.\n */\n getSkeleton() {\n return this.getRef('skeleton');\n }\n /**\n * {@link Node} used as a skeleton root. The node must be the closest common root of the joints\n * hierarchy or a direct or indirect parent node of the closest common root.\n */\n setSkeleton(skeleton) {\n return this.setRef('skeleton', skeleton);\n }\n /**\n * {@link Accessor} containing the floating-point 4x4 inverse-bind matrices. The default is\n * that each matrix is a 4x4 identity matrix, which implies that inverse-bind matrices were\n * pre-applied.\n */\n getInverseBindMatrices() {\n return this.getRef('inverseBindMatrices');\n }\n /**\n * {@link Accessor} containing the floating-point 4x4 inverse-bind matrices. The default is\n * that each matrix is a 4x4 identity matrix, which implies that inverse-bind matrices were\n * pre-applied.\n */\n setInverseBindMatrices(inverseBindMatrices) {\n return this.setRef('inverseBindMatrices', inverseBindMatrices, {\n usage: BufferViewUsage$1.INVERSE_BIND_MATRICES\n });\n }\n /** Adds a joint {@link Node} to this {@link Skin}. */\n addJoint(joint) {\n return this.addRef('joints', joint);\n }\n /** Removes a joint {@link Node} from this {@link Skin}. */\n removeJoint(joint) {\n return this.removeRef('joints', joint);\n }\n /** Lists joints ({@link Node}s used as joints or bones) in this {@link Skin}. */\n listJoints() {\n return this.listRefs('joints');\n }\n}\n\n/**\n * *Texture, or images, referenced by {@link Material} properties.*\n *\n * Textures in glTF Transform are a combination of glTF's `texture` and `image` properties, and\n * should be unique within a document, such that no other texture contains the same\n * {@link Texture.getImage getImage()} data. Where duplicates may already exist, the `dedup({textures: true})`\n * transform can remove them. A {@link Document} with N texture properties will be exported to a\n * glTF file with N `image` properties, and the minimum number of `texture` properties necessary\n * for the materials that use it.\n *\n * For properties associated with a particular _use_ of a texture, see {@link TextureInfo}.\n *\n * Reference:\n * - [glTF → Textures](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#textures)\n * - [glTF → Images](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#images)\n *\n * @category Properties\n */\nclass Texture extends ExtensibleProperty {\n init() {\n this.propertyType = PropertyType.TEXTURE;\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n image: null,\n mimeType: '',\n uri: ''\n });\n }\n /**********************************************************************************************\n * MIME type / format.\n */\n /** Returns the MIME type for this texture ('image/jpeg' or 'image/png'). */\n getMimeType() {\n return this.get('mimeType') || ImageUtils.extensionToMimeType(FileUtils.extension(this.get('uri')));\n }\n /**\n * Sets the MIME type for this texture ('image/jpeg' or 'image/png'). If the texture does not\n * have a URI, a MIME type is required for correct export.\n */\n setMimeType(mimeType) {\n return this.set('mimeType', mimeType);\n }\n /**********************************************************************************************\n * URI / filename.\n */\n /** Returns the URI (e.g. 'path/to/file.png') for this texture. */\n getURI() {\n return this.get('uri');\n }\n /**\n * Sets the URI (e.g. 'path/to/file.png') for this texture. If the texture does not have a MIME\n * type, a URI is required for correct export.\n */\n setURI(uri) {\n this.set('uri', uri);\n const mimeType = ImageUtils.extensionToMimeType(FileUtils.extension(uri));\n if (mimeType) this.set('mimeType', mimeType);\n return this;\n }\n /**********************************************************************************************\n * Image data.\n */\n /** Returns the raw image data for this texture. */\n getImage() {\n return this.get('image');\n }\n /** Sets the raw image data for this texture. */\n setImage(image) {\n return this.set('image', BufferUtils.assertView(image));\n }\n /** Returns the size, in pixels, of this texture. */\n getSize() {\n const image = this.get('image');\n if (!image) return null;\n return ImageUtils.getSize(image, this.getMimeType());\n }\n}\n\n/**\n * *Root property of a glTF asset.*\n *\n * Any properties to be exported with a particular asset must be referenced (directly or\n * indirectly) by the root. Metadata about the asset's license, generator, and glTF specification\n * version are stored in the asset, accessible with {@link Root.getAsset}.\n *\n * Properties are added to the root with factory methods on its {@link Document}, and removed by\n * calling {@link Property.dispose}() on the resource. Any properties that have been created but\n * not disposed will be included when calling the various `root.list*()` methods.\n *\n * A document's root cannot be removed, and no other root may be created. Unlike other\n * {@link Property} types, the `.dispose()`, `.detach()` methods have no useful function on a\n * Root property.\n *\n * Usage:\n *\n * ```ts\n * const root = document.getRoot();\n * const scene = document.createScene('myScene');\n * const node = document.createNode('myNode');\n * scene.addChild(node);\n *\n * console.log(root.listScenes()); // → [scene x 1]\n * ```\n *\n * Reference: [glTF → Concepts](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#concepts)\n *\n * @category Properties\n */\nclass Root extends ExtensibleProperty {\n init() {\n this.propertyType = PropertyType.ROOT;\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n asset: {\n generator: `glTF-Transform ${VERSION}`,\n version: '2.0'\n },\n defaultScene: null,\n accessors: new RefSet(),\n animations: new RefSet(),\n buffers: new RefSet(),\n cameras: new RefSet(),\n materials: new RefSet(),\n meshes: new RefSet(),\n nodes: new RefSet(),\n scenes: new RefSet(),\n skins: new RefSet(),\n textures: new RefSet()\n });\n }\n /** @internal */\n constructor(graph) {\n super(graph);\n this._extensions = new Set();\n graph.addEventListener('node:create', event => {\n this._addChildOfRoot(event.target);\n });\n }\n clone() {\n throw new Error('Root cannot be cloned.');\n }\n copy(other, resolve = COPY_IDENTITY) {\n // Root cannot be cloned in isolation: only with its Document. Extensions are managed by\n // the Document during cloning. The Root, and only the Root, should keep existing\n // references while copying to avoid overwriting during a merge.\n if (resolve === COPY_IDENTITY) throw new Error('Root cannot be copied.');\n // IMPORTANT: Root cannot call super.copy(), which removes existing references.\n this.set('asset', _extends({}, other.get('asset')));\n this.setName(other.getName());\n this.setExtras(_extends({}, other.getExtras()));\n this.setDefaultScene(other.getDefaultScene() ? resolve(other.getDefaultScene()) : null);\n for (const extensionName of other.listRefMapKeys('extensions')) {\n const otherExtension = other.getExtension(extensionName);\n this.setExtension(extensionName, resolve(otherExtension));\n }\n return this;\n }\n _addChildOfRoot(child) {\n if (child instanceof Scene) {\n this.addRef('scenes', child);\n } else if (child instanceof Node) {\n this.addRef('nodes', child);\n } else if (child instanceof Camera) {\n this.addRef('cameras', child);\n } else if (child instanceof Skin) {\n this.addRef('skins', child);\n } else if (child instanceof Mesh) {\n this.addRef('meshes', child);\n } else if (child instanceof Material) {\n this.addRef('materials', child);\n } else if (child instanceof Texture) {\n this.addRef('textures', child);\n } else if (child instanceof Animation) {\n this.addRef('animations', child);\n } else if (child instanceof Accessor) {\n this.addRef('accessors', child);\n } else if (child instanceof Buffer$1) {\n this.addRef('buffers', child);\n }\n // No error for untracked property types.\n return this;\n }\n /**\n * Returns the `asset` object, which specifies the target glTF version of the asset. Additional\n * metadata can be stored in optional properties such as `generator` or `copyright`.\n *\n * Reference: [glTF → Asset](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#asset)\n */\n getAsset() {\n return this.get('asset');\n }\n /**********************************************************************************************\n * Extensions.\n */\n /** Lists all {@link Extension Extensions} enabled for this root. */\n listExtensionsUsed() {\n return Array.from(this._extensions);\n }\n /** Lists all {@link Extension Extensions} enabled and required for this root. */\n listExtensionsRequired() {\n return this.listExtensionsUsed().filter(extension => extension.isRequired());\n }\n /** @internal */\n _enableExtension(extension) {\n this._extensions.add(extension);\n return this;\n }\n /** @internal */\n _disableExtension(extension) {\n this._extensions.delete(extension);\n return this;\n }\n /**********************************************************************************************\n * Properties.\n */\n /** Lists all {@link Scene} properties associated with this root. */\n listScenes() {\n return this.listRefs('scenes');\n }\n /** Default {@link Scene} associated with this root. */\n setDefaultScene(defaultScene) {\n return this.setRef('defaultScene', defaultScene);\n }\n /** Default {@link Scene} associated with this root. */\n getDefaultScene() {\n return this.getRef('defaultScene');\n }\n /** Lists all {@link Node} properties associated with this root. */\n listNodes() {\n return this.listRefs('nodes');\n }\n /** Lists all {@link Camera} properties associated with this root. */\n listCameras() {\n return this.listRefs('cameras');\n }\n /** Lists all {@link Skin} properties associated with this root. */\n listSkins() {\n return this.listRefs('skins');\n }\n /** Lists all {@link Mesh} properties associated with this root. */\n listMeshes() {\n return this.listRefs('meshes');\n }\n /** Lists all {@link Material} properties associated with this root. */\n listMaterials() {\n return this.listRefs('materials');\n }\n /** Lists all {@link Texture} properties associated with this root. */\n listTextures() {\n return this.listRefs('textures');\n }\n /** Lists all {@link Animation} properties associated with this root. */\n listAnimations() {\n return this.listRefs('animations');\n }\n /** Lists all {@link Accessor} properties associated with this root. */\n listAccessors() {\n return this.listRefs('accessors');\n }\n /** Lists all {@link Buffer} properties associated with this root. */\n listBuffers() {\n return this.listRefs('buffers');\n }\n}\n\n/**\n * *Wraps a glTF asset and its resources for easier modification.*\n *\n * Documents manage glTF assets and the relationships among dependencies. The document wrapper\n * allow tools to read and write changes without dealing with array indices or byte offsets, which\n * would otherwise require careful management over the course of a file modification. An internal\n * graph structure allows any property in the glTF file to maintain references to its dependencies,\n * and makes it easy to determine where a particular property dependency is being used. For\n * example, finding a list of materials that use a particular texture is as simple as calling\n * {@link Texture.listParents}().\n *\n * A new resource {@link Property} (e.g. a {@link Mesh} or {@link Material}) is created by calling\n * 'create' methods on the document. Resources are destroyed by calling {@link Property.dispose}().\n *\n * ```ts\n * import fs from 'fs/promises';\n * import { Document } from '@gltf-transform/core';\n * import { dedup } from '@gltf-transform/functions';\n *\n * const document = new Document();\n *\n * const texture1 = document.createTexture('myTexture')\n * \t.setImage(await fs.readFile('path/to/image.png'))\n * \t.setMimeType('image/png');\n * const texture2 = document.createTexture('myTexture2')\n * \t.setImage(await fs.readFile('path/to/image2.png'))\n * \t.setMimeType('image/png');\n *\n * // Document containing duplicate copies of the same texture.\n * document.getRoot().listTextures(); // → [texture x 2]\n *\n * await document.transform(\n * \tdedup({textures: true}),\n * \t// ...\n * );\n *\n * // Document with duplicate textures removed.\n * document.getRoot().listTextures(); // → [texture x 1]\n * ```\n *\n * Reference:\n * - [glTF → Basics](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#gltf-basics)\n * - [glTF → Concepts](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#concepts)\n *\n * @category Documents\n */\nclass Document {\n /**\n * Returns the Document associated with a given Graph, if any.\n * @hidden\n * @experimental\n */\n static fromGraph(graph) {\n return Document._GRAPH_DOCUMENTS.get(graph) || null;\n }\n /** Creates a new Document, representing an empty glTF asset. */\n constructor() {\n this._graph = new Graph();\n this._root = new Root(this._graph);\n this._logger = Logger.DEFAULT_INSTANCE;\n Document._GRAPH_DOCUMENTS.set(this._graph, this);\n }\n /** Returns the glTF {@link Root} property. */\n getRoot() {\n return this._root;\n }\n /**\n * Returns the {@link Graph} representing connectivity of resources within this document.\n * @hidden\n */\n getGraph() {\n return this._graph;\n }\n /** Returns the {@link Logger} instance used for any operations performed on this document. */\n getLogger() {\n return this._logger;\n }\n /**\n * Overrides the {@link Logger} instance used for any operations performed on this document.\n *\n * Usage:\n *\n * ```ts\n * doc\n * \t.setLogger(new Logger(Logger.Verbosity.SILENT))\n * \t.transform(dedup(), weld());\n * ```\n */\n setLogger(logger) {\n this._logger = logger;\n return this;\n }\n /**\n * Clones this Document, copying all resources within it.\n * @deprecated Use 'cloneDocument(document)' from '@gltf-transform/functions'.\n * @hidden\n * @internal\n */\n clone() {\n throw new Error(`Use 'cloneDocument(source)' from '@gltf-transform/functions'.`);\n }\n /**\n * Merges the content of another Document into this one, without affecting the original.\n * @deprecated Use 'mergeDocuments(target, source)' from '@gltf-transform/functions'.\n * @hidden\n * @internal\n */\n merge(_other) {\n throw new Error(`Use 'mergeDocuments(target, source)' from '@gltf-transform/functions'.`);\n }\n /**\n * Applies a series of modifications to this document. Each transformation is asynchronous,\n * takes the {@link Document} as input, and returns nothing. Transforms are applied in the\n * order given, which may affect the final result.\n *\n * Usage:\n *\n * ```ts\n * await doc.transform(\n * \tdedup(),\n * \tprune()\n * );\n * ```\n *\n * @param transforms List of synchronous transformation functions to apply.\n */\n async transform(...transforms) {\n const stack = transforms.map(fn => fn.name);\n for (const transform of transforms) {\n await transform(this, {\n stack\n });\n }\n return this;\n }\n /**********************************************************************************************\n * Extension factory method.\n */\n /**\n * Creates a new {@link Extension}, for the extension type of the given constructor. If the\n * extension is already enabled for this Document, the previous Extension reference is reused.\n */\n createExtension(ctor) {\n const extensionName = ctor.EXTENSION_NAME;\n const prevExtension = this.getRoot().listExtensionsUsed().find(ext => ext.extensionName === extensionName);\n return prevExtension || new ctor(this);\n }\n /**********************************************************************************************\n * Property factory methods.\n */\n /** Creates a new {@link Scene} attached to this document's {@link Root}. */\n createScene(name = '') {\n return new Scene(this._graph, name);\n }\n /** Creates a new {@link Node} attached to this document's {@link Root}. */\n createNode(name = '') {\n return new Node(this._graph, name);\n }\n /** Creates a new {@link Camera} attached to this document's {@link Root}. */\n createCamera(name = '') {\n return new Camera(this._graph, name);\n }\n /** Creates a new {@link Skin} attached to this document's {@link Root}. */\n createSkin(name = '') {\n return new Skin(this._graph, name);\n }\n /** Creates a new {@link Mesh} attached to this document's {@link Root}. */\n createMesh(name = '') {\n return new Mesh(this._graph, name);\n }\n /**\n * Creates a new {@link Primitive}. Primitives must be attached to a {@link Mesh}\n * for use and export; they are not otherwise associated with a {@link Root}.\n */\n createPrimitive() {\n return new Primitive(this._graph);\n }\n /**\n * Creates a new {@link PrimitiveTarget}, or morph target. Targets must be attached to a\n * {@link Primitive} for use and export; they are not otherwise associated with a {@link Root}.\n */\n createPrimitiveTarget(name = '') {\n return new PrimitiveTarget(this._graph, name);\n }\n /** Creates a new {@link Material} attached to this document's {@link Root}. */\n createMaterial(name = '') {\n return new Material(this._graph, name);\n }\n /** Creates a new {@link Texture} attached to this document's {@link Root}. */\n createTexture(name = '') {\n return new Texture(this._graph, name);\n }\n /** Creates a new {@link Animation} attached to this document's {@link Root}. */\n createAnimation(name = '') {\n return new Animation(this._graph, name);\n }\n /**\n * Creates a new {@link AnimationChannel}. Channels must be attached to an {@link Animation}\n * for use and export; they are not otherwise associated with a {@link Root}.\n */\n createAnimationChannel(name = '') {\n return new AnimationChannel(this._graph, name);\n }\n /**\n * Creates a new {@link AnimationSampler}. Samplers must be attached to an {@link Animation}\n * for use and export; they are not otherwise associated with a {@link Root}.\n */\n createAnimationSampler(name = '') {\n return new AnimationSampler(this._graph, name);\n }\n /** Creates a new {@link Accessor} attached to this document's {@link Root}. */\n createAccessor(name = '', buffer = null) {\n if (!buffer) {\n buffer = this.getRoot().listBuffers()[0];\n }\n return new Accessor(this._graph, name).setBuffer(buffer);\n }\n /** Creates a new {@link Buffer} attached to this document's {@link Root}. */\n createBuffer(name = '') {\n return new Buffer$1(this._graph, name);\n }\n}\n/**\n * Enables lookup of a Document from its Graph. For internal use, only.\n * @internal\n * @experimental\n */\nDocument._GRAPH_DOCUMENTS = new WeakMap();\n\n/**\n * *Base class for all Extensions.*\n *\n * Extensions enhance a glTF {@link Document} with additional features and schema, beyond the core\n * glTF specification. Common extensions may be imported from the `@gltf-transform/extensions`\n * package, or custom extensions may be created by extending this base class.\n *\n * An extension is added to a Document by calling {@link Document.createExtension} with the\n * extension constructor. The extension object may then be used to construct\n * {@link ExtensionProperty} instances, which are attached to properties throughout the Document\n * as prescribed by the extension itself.\n *\n * For more information on available extensions and their usage, see [Extensions](/extensions).\n *\n * Reference:\n * - [glTF → Extensions](https://github.com/KhronosGroup/gltf/blob/main/specification/2.0/README.md#specifying-extensions)\n * - [glTF Extension Registry](https://github.com/KhronosGroup/gltf/blob/main/extensions)\n *\n * @category Extensions\n */\nclass Extension {\n /** @hidden */\n constructor(document) {\n /** Official name of the extension. */\n this.extensionName = '';\n /**\n * Before reading, extension should be called for these {@link Property} types. *Most\n * extensions don't need to implement this.*\n * @hidden\n */\n this.prereadTypes = [];\n /**\n * Before writing, extension should be called for these {@link Property} types. *Most\n * extensions don't need to implement this.*\n * @hidden\n */\n this.prewriteTypes = [];\n /** @hidden Dependency IDs needed to read this extension, to be installed before I/O. */\n this.readDependencies = [];\n /** @hidden Dependency IDs needed to write this extension, to be installed before I/O. */\n this.writeDependencies = [];\n /** @hidden */\n this.document = void 0;\n /** @hidden */\n this.required = false;\n /** @hidden */\n this.properties = new Set();\n /** @hidden */\n this._listener = void 0;\n this.document = document;\n document.getRoot()._enableExtension(this);\n this._listener = _event => {\n const event = _event;\n const target = event.target;\n if (target instanceof ExtensionProperty && target.extensionName === this.extensionName) {\n if (event.type === 'node:create') this._addExtensionProperty(target);\n if (event.type === 'node:dispose') this._removeExtensionProperty(target);\n }\n };\n const graph = document.getGraph();\n graph.addEventListener('node:create', this._listener);\n graph.addEventListener('node:dispose', this._listener);\n }\n /** Disables and removes the extension from the Document. */\n dispose() {\n this.document.getRoot()._disableExtension(this);\n const graph = this.document.getGraph();\n graph.removeEventListener('node:create', this._listener);\n graph.removeEventListener('node:dispose', this._listener);\n for (const property of this.properties) {\n property.dispose();\n }\n }\n /** @hidden Performs first-time setup for the extension. Must be idempotent. */\n static register() {}\n /**\n * Indicates to the client whether it is OK to load the asset when this extension is not\n * recognized. Optional extensions are generally preferred, if there is not a good reason\n * to require a client to completely fail when an extension isn't known.\n */\n isRequired() {\n return this.required;\n }\n /**\n * Indicates to the client whether it is OK to load the asset when this extension is not\n * recognized. Optional extensions are generally preferred, if there is not a good reason\n * to require a client to completely fail when an extension isn't known.\n */\n setRequired(required) {\n this.required = required;\n return this;\n }\n /**\n * Lists all {@link ExtensionProperty} instances associated with, or created by, this\n * extension. Includes only instances that are attached to the Document's graph; detached\n * instances will be excluded.\n */\n listProperties() {\n return Array.from(this.properties);\n }\n /**********************************************************************************************\n * ExtensionProperty management.\n */\n /** @internal */\n _addExtensionProperty(property) {\n this.properties.add(property);\n return this;\n }\n /** @internal */\n _removeExtensionProperty(property) {\n this.properties.delete(property);\n return this;\n }\n /**********************************************************************************************\n * I/O implementation.\n */\n /** @hidden Installs dependencies required by the extension. */\n install(key, dependency) {\n return this;\n }\n /**\n * Used by the {@link PlatformIO} utilities when reading a glTF asset. This method may\n * optionally be implemented by an extension, and should then support any property type\n * declared by the Extension's {@link Extension.prereadTypes} list. The Extension will\n * be given a ReaderContext instance, and is expected to update either the context or its\n * {@link JSONDocument} with resources known to the Extension. *Most extensions don't need to\n * implement this.*\n * @hidden\n */\n preread(_readerContext, _propertyType) {\n return this;\n }\n /**\n * Used by the {@link PlatformIO} utilities when writing a glTF asset. This method may\n * optionally be implemented by an extension, and should then support any property type\n * declared by the Extension's {@link Extension.prewriteTypes} list. The Extension will\n * be given a WriterContext instance, and is expected to update either the context or its\n * {@link JSONDocument} with resources known to the Extension. *Most extensions don't need to\n * implement this.*\n * @hidden\n */\n prewrite(_writerContext, _propertyType) {\n return this;\n }\n}\n/** Official name of the extension. */\nExtension.EXTENSION_NAME = void 0;\n\n/**\n * Model class providing glTF Transform objects representing each definition in the glTF file, used\n * by a {@link GLTFReader} and its {@link Extension} implementations. Indices of all properties will be\n * consistent with the glTF file.\n *\n * @hidden\n */\nclass ReaderContext {\n constructor(jsonDoc) {\n this.jsonDoc = void 0;\n this.buffers = [];\n this.bufferViews = [];\n this.bufferViewBuffers = [];\n this.accessors = [];\n this.textures = [];\n this.textureInfos = new Map();\n this.materials = [];\n this.meshes = [];\n this.cameras = [];\n this.nodes = [];\n this.skins = [];\n this.animations = [];\n this.scenes = [];\n this.jsonDoc = jsonDoc;\n }\n setTextureInfo(textureInfo, textureInfoDef) {\n this.textureInfos.set(textureInfo, textureInfoDef);\n if (textureInfoDef.texCoord !== undefined) {\n textureInfo.setTexCoord(textureInfoDef.texCoord);\n }\n if (textureInfoDef.extras !== undefined) {\n textureInfo.setExtras(textureInfoDef.extras);\n }\n const textureDef = this.jsonDoc.json.textures[textureInfoDef.index];\n if (textureDef.sampler === undefined) return;\n const samplerDef = this.jsonDoc.json.samplers[textureDef.sampler];\n if (samplerDef.magFilter !== undefined) {\n textureInfo.setMagFilter(samplerDef.magFilter);\n }\n if (samplerDef.minFilter !== undefined) {\n textureInfo.setMinFilter(samplerDef.minFilter);\n }\n if (samplerDef.wrapS !== undefined) {\n textureInfo.setWrapS(samplerDef.wrapS);\n }\n if (samplerDef.wrapT !== undefined) {\n textureInfo.setWrapT(samplerDef.wrapT);\n }\n }\n}\n\nconst DEFAULT_OPTIONS = {\n logger: Logger.DEFAULT_INSTANCE,\n extensions: [],\n dependencies: {}\n};\nconst SUPPORTED_PREREAD_TYPES = new Set([PropertyType.BUFFER, PropertyType.TEXTURE, PropertyType.MATERIAL, PropertyType.MESH, PropertyType.PRIMITIVE, PropertyType.NODE, PropertyType.SCENE]);\n/** @internal */\nclass GLTFReader {\n static read(jsonDoc, _options = DEFAULT_OPTIONS) {\n const options = _extends({}, DEFAULT_OPTIONS, _options);\n const {\n json\n } = jsonDoc;\n const document = new Document().setLogger(options.logger);\n this.validate(jsonDoc, options);\n /* Reader context. */\n const context = new ReaderContext(jsonDoc);\n /** Asset. */\n const assetDef = json.asset;\n const asset = document.getRoot().getAsset();\n if (assetDef.copyright) asset.copyright = assetDef.copyright;\n if (assetDef.extras) asset.extras = assetDef.extras;\n if (json.extras !== undefined) {\n document.getRoot().setExtras(_extends({}, json.extras));\n }\n /** Extensions (1/2). */\n const extensionsUsed = json.extensionsUsed || [];\n const extensionsRequired = json.extensionsRequired || [];\n options.extensions.sort((a, b) => a.EXTENSION_NAME > b.EXTENSION_NAME ? 1 : -1);\n for (const Extension of options.extensions) {\n if (extensionsUsed.includes(Extension.EXTENSION_NAME)) {\n // Create extension.\n const extension = document.createExtension(Extension).setRequired(extensionsRequired.includes(Extension.EXTENSION_NAME));\n // Warn on unsupported preread hooks.\n const unsupportedHooks = extension.prereadTypes.filter(type => !SUPPORTED_PREREAD_TYPES.has(type));\n if (unsupportedHooks.length) {\n options.logger.warn(`Preread hooks for some types (${unsupportedHooks.join()}), requested by extension ` + `${extension.extensionName}, are unsupported. Please file an issue or a PR.`);\n }\n // Install dependencies.\n for (const key of extension.readDependencies) {\n extension.install(key, options.dependencies[key]);\n }\n }\n }\n /** Buffers. */\n const bufferDefs = json.buffers || [];\n document.getRoot().listExtensionsUsed().filter(extension => extension.prereadTypes.includes(PropertyType.BUFFER)).forEach(extension => extension.preread(context, PropertyType.BUFFER));\n context.buffers = bufferDefs.map(bufferDef => {\n const buffer = document.createBuffer(bufferDef.name);\n if (bufferDef.extras) buffer.setExtras(bufferDef.extras);\n if (bufferDef.uri && bufferDef.uri.indexOf('__') !== 0) {\n buffer.setURI(bufferDef.uri);\n }\n return buffer;\n });\n /** Buffer views. */\n const bufferViewDefs = json.bufferViews || [];\n context.bufferViewBuffers = bufferViewDefs.map((bufferViewDef, index) => {\n if (!context.bufferViews[index]) {\n const bufferDef = jsonDoc.json.buffers[bufferViewDef.buffer];\n const resource = bufferDef.uri ? jsonDoc.resources[bufferDef.uri] : jsonDoc.resources[GLB_BUFFER];\n const byteOffset = bufferViewDef.byteOffset || 0;\n context.bufferViews[index] = BufferUtils.toView(resource, byteOffset, bufferViewDef.byteLength);\n }\n return context.buffers[bufferViewDef.buffer];\n });\n /** Accessors. */\n // Accessor .count and .componentType properties are inferred dynamically.\n const accessorDefs = json.accessors || [];\n context.accessors = accessorDefs.map(accessorDef => {\n const buffer = context.bufferViewBuffers[accessorDef.bufferView];\n const accessor = document.createAccessor(accessorDef.name, buffer).setType(accessorDef.type);\n if (accessorDef.extras) accessor.setExtras(accessorDef.extras);\n if (accessorDef.normalized !== undefined) {\n accessor.setNormalized(accessorDef.normalized);\n }\n // Sparse accessors, KHR_draco_mesh_compression, and EXT_meshopt_compression.\n if (accessorDef.bufferView === undefined) return accessor;\n // NOTICE: We mark sparse accessors at the end of the I/O reading process. Consider an\n // accessor to be 'sparse' if it (A) includes sparse value overrides, or (B) does not\n // define .bufferView _and_ no extension provides that data.\n accessor.setArray(getAccessorArray(accessorDef, context));\n return accessor;\n });\n /** Textures. */\n // glTF Transform's \"Texture\" properties correspond 1:1 with glTF \"Image\" properties, and\n // with image files. The glTF file may contain more one texture per image, where images\n // are reused with different sampler properties.\n const imageDefs = json.images || [];\n const textureDefs = json.textures || [];\n document.getRoot().listExtensionsUsed().filter(extension => extension.prereadTypes.includes(PropertyType.TEXTURE)).forEach(extension => extension.preread(context, PropertyType.TEXTURE));\n context.textures = imageDefs.map(imageDef => {\n const texture = document.createTexture(imageDef.name);\n // glTF Image corresponds 1:1 with glTF Transform Texture. See `writer.ts`.\n if (imageDef.extras) texture.setExtras(imageDef.extras);\n if (imageDef.bufferView !== undefined) {\n const bufferViewDef = json.bufferViews[imageDef.bufferView];\n const bufferDef = jsonDoc.json.buffers[bufferViewDef.buffer];\n const bufferData = bufferDef.uri ? jsonDoc.resources[bufferDef.uri] : jsonDoc.resources[GLB_BUFFER];\n const byteOffset = bufferViewDef.byteOffset || 0;\n const byteLength = bufferViewDef.byteLength;\n const imageData = bufferData.slice(byteOffset, byteOffset + byteLength);\n texture.setImage(imageData);\n } else if (imageDef.uri !== undefined) {\n texture.setImage(jsonDoc.resources[imageDef.uri]);\n if (imageDef.uri.indexOf('__') !== 0) {\n texture.setURI(imageDef.uri);\n }\n }\n if (imageDef.mimeType !== undefined) {\n texture.setMimeType(imageDef.mimeType);\n } else if (imageDef.uri) {\n const extension = FileUtils.extension(imageDef.uri);\n texture.setMimeType(ImageUtils.extensionToMimeType(extension));\n }\n return texture;\n });\n /** Materials. */\n document.getRoot().listExtensionsUsed().filter(extension => extension.prereadTypes.includes(PropertyType.MATERIAL)).forEach(extension => extension.preread(context, PropertyType.MATERIAL));\n const materialDefs = json.materials || [];\n context.materials = materialDefs.map(materialDef => {\n const material = document.createMaterial(materialDef.name);\n if (materialDef.extras) material.setExtras(materialDef.extras);\n // Program state & blending.\n if (materialDef.alphaMode !== undefined) {\n material.setAlphaMode(materialDef.alphaMode);\n }\n if (materialDef.alphaCutoff !== undefined) {\n material.setAlphaCutoff(materialDef.alphaCutoff);\n }\n if (materialDef.doubleSided !== undefined) {\n material.setDoubleSided(materialDef.doubleSided);\n }\n // Factors.\n const pbrDef = materialDef.pbrMetallicRoughness || {};\n if (pbrDef.baseColorFactor !== undefined) {\n material.setBaseColorFactor(pbrDef.baseColorFactor);\n }\n if (materialDef.emissiveFactor !== undefined) {\n material.setEmissiveFactor(materialDef.emissiveFactor);\n }\n if (pbrDef.metallicFactor !== undefined) {\n material.setMetallicFactor(pbrDef.metallicFactor);\n }\n if (pbrDef.roughnessFactor !== undefined) {\n material.setRoughnessFactor(pbrDef.roughnessFactor);\n }\n // Textures.\n if (pbrDef.baseColorTexture !== undefined) {\n const textureInfoDef = pbrDef.baseColorTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n material.setBaseColorTexture(texture);\n context.setTextureInfo(material.getBaseColorTextureInfo(), textureInfoDef);\n }\n if (materialDef.emissiveTexture !== undefined) {\n const textureInfoDef = materialDef.emissiveTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n material.setEmissiveTexture(texture);\n context.setTextureInfo(material.getEmissiveTextureInfo(), textureInfoDef);\n }\n if (materialDef.normalTexture !== undefined) {\n const textureInfoDef = materialDef.normalTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n material.setNormalTexture(texture);\n context.setTextureInfo(material.getNormalTextureInfo(), textureInfoDef);\n if (materialDef.normalTexture.scale !== undefined) {\n material.setNormalScale(materialDef.normalTexture.scale);\n }\n }\n if (materialDef.occlusionTexture !== undefined) {\n const textureInfoDef = materialDef.occlusionTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n material.setOcclusionTexture(texture);\n context.setTextureInfo(material.getOcclusionTextureInfo(), textureInfoDef);\n if (materialDef.occlusionTexture.strength !== undefined) {\n material.setOcclusionStrength(materialDef.occlusionTexture.strength);\n }\n }\n if (pbrDef.metallicRoughnessTexture !== undefined) {\n const textureInfoDef = pbrDef.metallicRoughnessTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n material.setMetallicRoughnessTexture(texture);\n context.setTextureInfo(material.getMetallicRoughnessTextureInfo(), textureInfoDef);\n }\n return material;\n });\n /** Meshes. */\n document.getRoot().listExtensionsUsed().filter(extension => extension.prereadTypes.includes(PropertyType.MESH)).forEach(extension => extension.preread(context, PropertyType.MESH));\n const meshDefs = json.meshes || [];\n document.getRoot().listExtensionsUsed().filter(extension => extension.prereadTypes.includes(PropertyType.PRIMITIVE)).forEach(extension => extension.preread(context, PropertyType.PRIMITIVE));\n context.meshes = meshDefs.map(meshDef => {\n const mesh = document.createMesh(meshDef.name);\n if (meshDef.extras) mesh.setExtras(meshDef.extras);\n if (meshDef.weights !== undefined) {\n mesh.setWeights(meshDef.weights);\n }\n const primitiveDefs = meshDef.primitives || [];\n primitiveDefs.forEach(primitiveDef => {\n const primitive = document.createPrimitive();\n if (primitiveDef.extras) primitive.setExtras(primitiveDef.extras);\n if (primitiveDef.material !== undefined) {\n primitive.setMaterial(context.materials[primitiveDef.material]);\n }\n if (primitiveDef.mode !== undefined) {\n primitive.setMode(primitiveDef.mode);\n }\n for (const [semantic, index] of Object.entries(primitiveDef.attributes || {})) {\n primitive.setAttribute(semantic, context.accessors[index]);\n }\n if (primitiveDef.indices !== undefined) {\n primitive.setIndices(context.accessors[primitiveDef.indices]);\n }\n const targetNames = meshDef.extras && meshDef.extras.targetNames || [];\n const targetDefs = primitiveDef.targets || [];\n targetDefs.forEach((targetDef, targetIndex) => {\n const targetName = targetNames[targetIndex] || targetIndex.toString();\n const target = document.createPrimitiveTarget(targetName);\n for (const [semantic, accessorIndex] of Object.entries(targetDef)) {\n target.setAttribute(semantic, context.accessors[accessorIndex]);\n }\n primitive.addTarget(target);\n });\n mesh.addPrimitive(primitive);\n });\n return mesh;\n });\n /** Cameras. */\n const cameraDefs = json.cameras || [];\n context.cameras = cameraDefs.map(cameraDef => {\n const camera = document.createCamera(cameraDef.name).setType(cameraDef.type);\n if (cameraDef.extras) camera.setExtras(cameraDef.extras);\n if (cameraDef.type === Camera.Type.PERSPECTIVE) {\n const perspectiveDef = cameraDef.perspective;\n camera.setYFov(perspectiveDef.yfov);\n camera.setZNear(perspectiveDef.znear);\n if (perspectiveDef.zfar !== undefined) {\n camera.setZFar(perspectiveDef.zfar);\n }\n if (perspectiveDef.aspectRatio !== undefined) {\n camera.setAspectRatio(perspectiveDef.aspectRatio);\n }\n } else {\n const orthoDef = cameraDef.orthographic;\n camera.setZNear(orthoDef.znear).setZFar(orthoDef.zfar).setXMag(orthoDef.xmag).setYMag(orthoDef.ymag);\n }\n return camera;\n });\n /** Nodes. */\n const nodeDefs = json.nodes || [];\n document.getRoot().listExtensionsUsed().filter(extension => extension.prereadTypes.includes(PropertyType.NODE)).forEach(extension => extension.preread(context, PropertyType.NODE));\n context.nodes = nodeDefs.map(nodeDef => {\n const node = document.createNode(nodeDef.name);\n if (nodeDef.extras) node.setExtras(nodeDef.extras);\n if (nodeDef.translation !== undefined) {\n node.setTranslation(nodeDef.translation);\n }\n if (nodeDef.rotation !== undefined) {\n node.setRotation(nodeDef.rotation);\n }\n if (nodeDef.scale !== undefined) {\n node.setScale(nodeDef.scale);\n }\n if (nodeDef.matrix !== undefined) {\n const translation = [0, 0, 0];\n const rotation = [0, 0, 0, 1];\n const scale = [1, 1, 1];\n MathUtils.decompose(nodeDef.matrix, translation, rotation, scale);\n node.setTranslation(translation);\n node.setRotation(rotation);\n node.setScale(scale);\n }\n if (nodeDef.weights !== undefined) {\n node.setWeights(nodeDef.weights);\n }\n // Attachments (mesh, camera, skin) defined later in reading process.\n return node;\n });\n /** Skins. */\n const skinDefs = json.skins || [];\n context.skins = skinDefs.map(skinDef => {\n const skin = document.createSkin(skinDef.name);\n if (skinDef.extras) skin.setExtras(skinDef.extras);\n if (skinDef.inverseBindMatrices !== undefined) {\n skin.setInverseBindMatrices(context.accessors[skinDef.inverseBindMatrices]);\n }\n if (skinDef.skeleton !== undefined) {\n skin.setSkeleton(context.nodes[skinDef.skeleton]);\n }\n for (const nodeIndex of skinDef.joints) {\n skin.addJoint(context.nodes[nodeIndex]);\n }\n return skin;\n });\n /** Node attachments. */\n nodeDefs.map((nodeDef, nodeIndex) => {\n const node = context.nodes[nodeIndex];\n const children = nodeDef.children || [];\n children.forEach(childIndex => node.addChild(context.nodes[childIndex]));\n if (nodeDef.mesh !== undefined) node.setMesh(context.meshes[nodeDef.mesh]);\n if (nodeDef.camera !== undefined) node.setCamera(context.cameras[nodeDef.camera]);\n if (nodeDef.skin !== undefined) node.setSkin(context.skins[nodeDef.skin]);\n });\n /** Animations. */\n const animationDefs = json.animations || [];\n context.animations = animationDefs.map(animationDef => {\n const animation = document.createAnimation(animationDef.name);\n if (animationDef.extras) animation.setExtras(animationDef.extras);\n const samplerDefs = animationDef.samplers || [];\n const samplers = samplerDefs.map(samplerDef => {\n const sampler = document.createAnimationSampler().setInput(context.accessors[samplerDef.input]).setOutput(context.accessors[samplerDef.output]).setInterpolation(samplerDef.interpolation || AnimationSampler.Interpolation.LINEAR);\n if (samplerDef.extras) sampler.setExtras(samplerDef.extras);\n animation.addSampler(sampler);\n return sampler;\n });\n const channels = animationDef.channels || [];\n channels.forEach(channelDef => {\n const channel = document.createAnimationChannel().setSampler(samplers[channelDef.sampler]).setTargetPath(channelDef.target.path);\n if (channelDef.target.node !== undefined) channel.setTargetNode(context.nodes[channelDef.target.node]);\n if (channelDef.extras) channel.setExtras(channelDef.extras);\n animation.addChannel(channel);\n });\n return animation;\n });\n /** Scenes. */\n const sceneDefs = json.scenes || [];\n document.getRoot().listExtensionsUsed().filter(extension => extension.prereadTypes.includes(PropertyType.SCENE)).forEach(extension => extension.preread(context, PropertyType.SCENE));\n context.scenes = sceneDefs.map(sceneDef => {\n const scene = document.createScene(sceneDef.name);\n if (sceneDef.extras) scene.setExtras(sceneDef.extras);\n const children = sceneDef.nodes || [];\n children.map(nodeIndex => context.nodes[nodeIndex]).forEach(node => scene.addChild(node));\n return scene;\n });\n if (json.scene !== undefined) {\n document.getRoot().setDefaultScene(context.scenes[json.scene]);\n }\n /** Extensions (2/2). */\n document.getRoot().listExtensionsUsed().forEach(extension => extension.read(context));\n /** Post-processing. */\n // Consider an accessor to be 'sparse' if it (A) includes sparse value overrides,\n // or (B) does not define .bufferView _and_ no extension provides that data. Case\n // (B) represents a zero-filled accessor.\n accessorDefs.forEach((accessorDef, index) => {\n const accessor = context.accessors[index];\n const hasSparseValues = !!accessorDef.sparse;\n const isZeroFilled = !accessorDef.bufferView && !accessor.getArray();\n if (hasSparseValues || isZeroFilled) {\n accessor.setSparse(true).setArray(getSparseArray(accessorDef, context));\n }\n });\n return document;\n }\n static validate(jsonDoc, options) {\n const json = jsonDoc.json;\n if (json.asset.version !== '2.0') {\n throw new Error(`Unsupported glTF version, \"${json.asset.version}\".`);\n }\n if (json.extensionsRequired) {\n for (const extensionName of json.extensionsRequired) {\n if (!options.extensions.find(extension => extension.EXTENSION_NAME === extensionName)) {\n throw new Error(`Missing required extension, \"${extensionName}\".`);\n }\n }\n }\n if (json.extensionsUsed) {\n for (const extensionName of json.extensionsUsed) {\n if (!options.extensions.find(extension => extension.EXTENSION_NAME === extensionName)) {\n options.logger.warn(`Missing optional extension, \"${extensionName}\".`);\n }\n }\n }\n }\n}\n/**\n * Returns the contents of an interleaved accessor, as a typed array.\n * @internal\n */\nfunction getInterleavedArray(accessorDef, context) {\n const jsonDoc = context.jsonDoc;\n const bufferView = context.bufferViews[accessorDef.bufferView];\n const bufferViewDef = jsonDoc.json.bufferViews[accessorDef.bufferView];\n const TypedArray = ComponentTypeToTypedArray[accessorDef.componentType];\n const elementSize = Accessor.getElementSize(accessorDef.type);\n const componentSize = TypedArray.BYTES_PER_ELEMENT;\n const accessorByteOffset = accessorDef.byteOffset || 0;\n const array = new TypedArray(accessorDef.count * elementSize);\n const view = new DataView(bufferView.buffer, bufferView.byteOffset, bufferView.byteLength);\n const byteStride = bufferViewDef.byteStride;\n for (let i = 0; i < accessorDef.count; i++) {\n for (let j = 0; j < elementSize; j++) {\n const byteOffset = accessorByteOffset + i * byteStride + j * componentSize;\n let value;\n switch (accessorDef.componentType) {\n case Accessor.ComponentType.FLOAT:\n value = view.getFloat32(byteOffset, true);\n break;\n case Accessor.ComponentType.UNSIGNED_INT:\n value = view.getUint32(byteOffset, true);\n break;\n case Accessor.ComponentType.UNSIGNED_SHORT:\n value = view.getUint16(byteOffset, true);\n break;\n case Accessor.ComponentType.UNSIGNED_BYTE:\n value = view.getUint8(byteOffset);\n break;\n case Accessor.ComponentType.SHORT:\n value = view.getInt16(byteOffset, true);\n break;\n case Accessor.ComponentType.BYTE:\n value = view.getInt8(byteOffset);\n break;\n default:\n throw new Error(`Unexpected componentType \"${accessorDef.componentType}\".`);\n }\n array[i * elementSize + j] = value;\n }\n }\n return array;\n}\n/**\n * Returns the contents of an accessor, as a typed array.\n * @internal\n */\nfunction getAccessorArray(accessorDef, context) {\n const jsonDoc = context.jsonDoc;\n const bufferView = context.bufferViews[accessorDef.bufferView];\n const bufferViewDef = jsonDoc.json.bufferViews[accessorDef.bufferView];\n const TypedArray = ComponentTypeToTypedArray[accessorDef.componentType];\n const elementSize = Accessor.getElementSize(accessorDef.type);\n const componentSize = TypedArray.BYTES_PER_ELEMENT;\n const elementStride = elementSize * componentSize;\n // Interleaved buffer view.\n if (bufferViewDef.byteStride !== undefined && bufferViewDef.byteStride !== elementStride) {\n return getInterleavedArray(accessorDef, context);\n }\n const byteOffset = bufferView.byteOffset + (accessorDef.byteOffset || 0);\n const byteLength = accessorDef.count * elementSize * componentSize;\n // Might optimize this to avoid deep copy later, but it's useful for now and not a known\n // bottleneck. See https://github.com/donmccurdy/glTF-Transform/issues/256.\n return new TypedArray(bufferView.buffer.slice(byteOffset, byteOffset + byteLength));\n}\n/**\n * Returns the contents of a sparse accessor, as a typed array.\n * @internal\n */\nfunction getSparseArray(accessorDef, context) {\n const TypedArray = ComponentTypeToTypedArray[accessorDef.componentType];\n const elementSize = Accessor.getElementSize(accessorDef.type);\n let array;\n if (accessorDef.bufferView !== undefined) {\n array = getAccessorArray(accessorDef, context);\n } else {\n array = new TypedArray(accessorDef.count * elementSize);\n }\n const sparseDef = accessorDef.sparse;\n if (!sparseDef) return array; // Zero-filled accessor.\n const count = sparseDef.count;\n const indicesDef = _extends({}, accessorDef, sparseDef.indices, {\n count,\n type: 'SCALAR'\n });\n const valuesDef = _extends({}, accessorDef, sparseDef.values, {\n count\n });\n const indices = getAccessorArray(indicesDef, context);\n const values = getAccessorArray(valuesDef, context);\n // Override indices given in the sparse data.\n for (let i = 0; i < indicesDef.count; i++) {\n for (let j = 0; j < elementSize; j++) {\n array[indices[i] * elementSize + j] = values[i * elementSize + j];\n }\n }\n return array;\n}\n\nvar BufferViewTarget;\n(function (BufferViewTarget) {\n BufferViewTarget[BufferViewTarget[\"ARRAY_BUFFER\"] = 34962] = \"ARRAY_BUFFER\";\n BufferViewTarget[BufferViewTarget[\"ELEMENT_ARRAY_BUFFER\"] = 34963] = \"ELEMENT_ARRAY_BUFFER\";\n})(BufferViewTarget || (BufferViewTarget = {}));\n/**\n * Model class providing writing state to a {@link GLTFWriter} and its {@link Extension}\n * implementations.\n *\n * @hidden\n */\nclass WriterContext {\n constructor(_doc, jsonDoc, options) {\n this._doc = void 0;\n this.jsonDoc = void 0;\n this.options = void 0;\n this.accessorIndexMap = new Map();\n this.animationIndexMap = new Map();\n this.bufferIndexMap = new Map();\n this.cameraIndexMap = new Map();\n this.skinIndexMap = new Map();\n this.materialIndexMap = new Map();\n this.meshIndexMap = new Map();\n this.nodeIndexMap = new Map();\n this.imageIndexMap = new Map();\n this.textureDefIndexMap = new Map();\n // textureDef JSON -> index\n this.textureInfoDefMap = new Map();\n this.samplerDefIndexMap = new Map();\n // samplerDef JSON -> index\n this.sceneIndexMap = new Map();\n this.imageBufferViews = [];\n this.otherBufferViews = new Map();\n this.otherBufferViewsIndexMap = new Map();\n this.extensionData = {};\n this.bufferURIGenerator = void 0;\n this.imageURIGenerator = void 0;\n this.logger = void 0;\n this._accessorUsageMap = new Map();\n this.accessorUsageGroupedByParent = new Set(['ARRAY_BUFFER']);\n this.accessorParents = new Map();\n this._doc = _doc;\n this.jsonDoc = jsonDoc;\n this.options = options;\n const root = _doc.getRoot();\n const numBuffers = root.listBuffers().length;\n const numImages = root.listTextures().length;\n this.bufferURIGenerator = new UniqueURIGenerator(numBuffers > 1, () => options.basename || 'buffer');\n this.imageURIGenerator = new UniqueURIGenerator(numImages > 1, texture => getSlot(_doc, texture) || options.basename || 'texture');\n this.logger = _doc.getLogger();\n }\n /**\n * Creates a TextureInfo definition, and any Texture or Sampler definitions it requires. If\n * possible, Texture and Sampler definitions are shared.\n */\n createTextureInfoDef(texture, textureInfo) {\n const samplerDef = {\n magFilter: textureInfo.getMagFilter() || undefined,\n minFilter: textureInfo.getMinFilter() || undefined,\n wrapS: textureInfo.getWrapS(),\n wrapT: textureInfo.getWrapT()\n };\n const samplerKey = JSON.stringify(samplerDef);\n if (!this.samplerDefIndexMap.has(samplerKey)) {\n this.samplerDefIndexMap.set(samplerKey, this.jsonDoc.json.samplers.length);\n this.jsonDoc.json.samplers.push(samplerDef);\n }\n const textureDef = {\n source: this.imageIndexMap.get(texture),\n sampler: this.samplerDefIndexMap.get(samplerKey)\n };\n const textureKey = JSON.stringify(textureDef);\n if (!this.textureDefIndexMap.has(textureKey)) {\n this.textureDefIndexMap.set(textureKey, this.jsonDoc.json.textures.length);\n this.jsonDoc.json.textures.push(textureDef);\n }\n const textureInfoDef = {\n index: this.textureDefIndexMap.get(textureKey)\n };\n if (textureInfo.getTexCoord() !== 0) {\n textureInfoDef.texCoord = textureInfo.getTexCoord();\n }\n if (Object.keys(textureInfo.getExtras()).length > 0) {\n textureInfoDef.extras = textureInfo.getExtras();\n }\n this.textureInfoDefMap.set(textureInfo, textureInfoDef);\n return textureInfoDef;\n }\n createPropertyDef(property) {\n const def = {};\n if (property.getName()) {\n def.name = property.getName();\n }\n if (Object.keys(property.getExtras()).length > 0) {\n def.extras = property.getExtras();\n }\n return def;\n }\n createAccessorDef(accessor) {\n const accessorDef = this.createPropertyDef(accessor);\n accessorDef.type = accessor.getType();\n accessorDef.componentType = accessor.getComponentType();\n accessorDef.count = accessor.getCount();\n const needsBounds = this._doc.getGraph().listParentEdges(accessor).some(edge => edge.getName() === 'attributes' && edge.getAttributes().key === 'POSITION' || edge.getName() === 'input');\n if (needsBounds) {\n accessorDef.max = accessor.getMax([]).map(Math.fround);\n accessorDef.min = accessor.getMin([]).map(Math.fround);\n }\n if (accessor.getNormalized()) {\n accessorDef.normalized = accessor.getNormalized();\n }\n return accessorDef;\n }\n createImageData(imageDef, data, texture) {\n if (this.options.format === Format.GLB) {\n this.imageBufferViews.push(data);\n imageDef.bufferView = this.jsonDoc.json.bufferViews.length;\n this.jsonDoc.json.bufferViews.push({\n buffer: 0,\n byteOffset: -1,\n // determined while iterating buffers, in Writer.ts.\n byteLength: data.byteLength\n });\n } else {\n const extension = ImageUtils.mimeTypeToExtension(texture.getMimeType());\n imageDef.uri = this.imageURIGenerator.createURI(texture, extension);\n this.assignResourceURI(imageDef.uri, data, false);\n }\n }\n assignResourceURI(uri, data, throwOnConflict) {\n const resources = this.jsonDoc.resources;\n // https://github.com/KhronosGroup/glTF/issues/2446\n if (!(uri in resources)) {\n resources[uri] = data;\n return;\n }\n if (data === resources[uri]) {\n this.logger.warn(`Duplicate resource URI, \"${uri}\".`);\n return;\n }\n const conflictMessage = `Resource URI \"${uri}\" already assigned to different data.`;\n if (!throwOnConflict) {\n this.logger.warn(conflictMessage);\n return;\n }\n throw new Error(conflictMessage);\n }\n /**\n * Returns implicit usage type of the given accessor, related to grouping accessors into\n * buffer views. Usage is a superset of buffer view target, including ARRAY_BUFFER and\n * ELEMENT_ARRAY_BUFFER, but also usages that do not match GPU buffer view targets such as\n * IBMs. Additional usages are defined by extensions, like `EXT_mesh_gpu_instancing`.\n */\n getAccessorUsage(accessor) {\n const cachedUsage = this._accessorUsageMap.get(accessor);\n if (cachedUsage) return cachedUsage;\n if (accessor.getSparse()) return BufferViewUsage$1.SPARSE;\n for (const edge of this._doc.getGraph().listParentEdges(accessor)) {\n const {\n usage\n } = edge.getAttributes();\n if (usage) return usage;\n if (edge.getParent().propertyType !== PropertyType.ROOT) {\n this.logger.warn(`Missing attribute \".usage\" on edge, \"${edge.getName()}\".`);\n }\n }\n // Group accessors with no specified usage into a miscellaneous buffer view.\n return BufferViewUsage$1.OTHER;\n }\n /**\n * Sets usage for the given accessor. Some accessor types must be grouped into\n * buffer views with like accessors. This includes the specified buffer view \"targets\", but\n * also implicit usage like IBMs or instanced mesh attributes. If unspecified, an accessor\n * will be grouped with other accessors of unspecified usage.\n */\n addAccessorToUsageGroup(accessor, usage) {\n const prevUsage = this._accessorUsageMap.get(accessor);\n if (prevUsage && prevUsage !== usage) {\n throw new Error(`Accessor with usage \"${prevUsage}\" cannot be reused as \"${usage}\".`);\n }\n this._accessorUsageMap.set(accessor, usage);\n return this;\n }\n}\n/** Explicit buffer view targets defined by glTF specification. */\nWriterContext.BufferViewTarget = BufferViewTarget;\n/**\n * Implicit buffer view usage, not required by glTF specification, but nonetheless useful for\n * proper grouping of accessors into buffer views. Additional usages are defined by extensions,\n * like `EXT_mesh_gpu_instancing`.\n */\nWriterContext.BufferViewUsage = BufferViewUsage$1;\n/** Maps usage type to buffer view target. Usages not mapped have undefined targets. */\nWriterContext.USAGE_TO_TARGET = {\n [BufferViewUsage$1.ARRAY_BUFFER]: BufferViewTarget.ARRAY_BUFFER,\n [BufferViewUsage$1.ELEMENT_ARRAY_BUFFER]: BufferViewTarget.ELEMENT_ARRAY_BUFFER\n};\nclass UniqueURIGenerator {\n constructor(multiple, basename) {\n this.multiple = void 0;\n this.basename = void 0;\n this.counter = {};\n this.multiple = multiple;\n this.basename = basename;\n }\n createURI(object, extension) {\n if (object.getURI()) {\n return object.getURI();\n } else if (!this.multiple) {\n return `${this.basename(object)}.${extension}`;\n } else {\n const basename = this.basename(object);\n this.counter[basename] = this.counter[basename] || 1;\n return `${basename}_${this.counter[basename]++}.${extension}`;\n }\n }\n}\n/** Returns the first slot (by name) to which the texture is assigned. */\nfunction getSlot(document, texture) {\n const edge = document.getGraph().listParentEdges(texture).find(edge => edge.getParent() !== document.getRoot());\n return edge ? edge.getName().replace(/texture$/i, '') : '';\n}\n\nconst {\n BufferViewUsage\n} = WriterContext;\nconst {\n UNSIGNED_INT,\n UNSIGNED_SHORT,\n UNSIGNED_BYTE\n} = Accessor.ComponentType;\nconst SUPPORTED_PREWRITE_TYPES = new Set([PropertyType.ACCESSOR, PropertyType.BUFFER, PropertyType.MATERIAL, PropertyType.MESH]);\n/**\n * @internal\n * @hidden\n */\nclass GLTFWriter {\n static write(doc, options) {\n const graph = doc.getGraph();\n const root = doc.getRoot();\n const json = {\n asset: _extends({\n generator: `glTF-Transform ${VERSION}`\n }, root.getAsset()),\n extras: _extends({}, root.getExtras())\n };\n const jsonDoc = {\n json,\n resources: {}\n };\n const context = new WriterContext(doc, jsonDoc, options);\n const logger = options.logger || Logger.DEFAULT_INSTANCE;\n /* Extensions (1/2). */\n // Extensions present on the Document are not written unless they are also registered with\n // the I/O class. This ensures that setup in `extension.register()` is completed, and\n // allows a Document to be written with specific extensions disabled.\n const extensionsRegistered = new Set(options.extensions.map(ext => ext.EXTENSION_NAME));\n const extensionsUsed = doc.getRoot().listExtensionsUsed().filter(ext => extensionsRegistered.has(ext.extensionName)).sort((a, b) => a.extensionName > b.extensionName ? 1 : -1);\n const extensionsRequired = doc.getRoot().listExtensionsRequired().filter(ext => extensionsRegistered.has(ext.extensionName)).sort((a, b) => a.extensionName > b.extensionName ? 1 : -1);\n if (extensionsUsed.length < doc.getRoot().listExtensionsUsed().length) {\n logger.warn('Some extensions were not registered for I/O, and will not be written.');\n }\n for (const extension of extensionsUsed) {\n // Warn on unsupported prewrite hooks.\n const unsupportedHooks = extension.prewriteTypes.filter(type => !SUPPORTED_PREWRITE_TYPES.has(type));\n if (unsupportedHooks.length) {\n logger.warn(`Prewrite hooks for some types (${unsupportedHooks.join()}), requested by extension ` + `${extension.extensionName}, are unsupported. Please file an issue or a PR.`);\n }\n // Install dependencies.\n for (const key of extension.writeDependencies) {\n extension.install(key, options.dependencies[key]);\n }\n }\n /**\n * Pack a group of accessors into a sequential buffer view. Appends accessor and buffer view\n * definitions to the root JSON lists.\n *\n * @param accessors Accessors to be included.\n * @param bufferIndex Buffer to write to.\n * @param bufferByteOffset Current offset into the buffer, accounting for other buffer views.\n * @param bufferViewTarget (Optional) target use of the buffer view.\n */\n function concatAccessors(accessors, bufferIndex, bufferByteOffset, bufferViewTarget) {\n const buffers = [];\n let byteLength = 0;\n // Create accessor definitions, determining size of final buffer view.\n for (const accessor of accessors) {\n const accessorDef = context.createAccessorDef(accessor);\n accessorDef.bufferView = json.bufferViews.length;\n const accessorArray = accessor.getArray();\n const data = BufferUtils.pad(BufferUtils.toView(accessorArray));\n accessorDef.byteOffset = byteLength;\n byteLength += data.byteLength;\n buffers.push(data);\n context.accessorIndexMap.set(accessor, json.accessors.length);\n json.accessors.push(accessorDef);\n }\n // Create buffer view definition.\n const bufferViewData = BufferUtils.concat(buffers);\n const bufferViewDef = {\n buffer: bufferIndex,\n byteOffset: bufferByteOffset,\n byteLength: bufferViewData.byteLength\n };\n if (bufferViewTarget) bufferViewDef.target = bufferViewTarget;\n json.bufferViews.push(bufferViewDef);\n return {\n buffers,\n byteLength\n };\n }\n /**\n * Pack a group of accessors into an interleaved buffer view. Appends accessor and buffer\n * view definitions to the root JSON lists. Buffer view target is implicitly attribute data.\n *\n * References:\n * - [Apple • Best Practices for Working with Vertex Data](https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html)\n * - [Khronos • Vertex Specification Best Practices](https://www.khronos.org/opengl/wiki/Vertex_Specification_Best_Practices)\n *\n * @param accessors Accessors to be included.\n * @param bufferIndex Buffer to write to.\n * @param bufferByteOffset Offset into the buffer, accounting for other buffer views.\n */\n function interleaveAccessors(accessors, bufferIndex, bufferByteOffset) {\n const vertexCount = accessors[0].getCount();\n let byteStride = 0;\n // Create accessor definitions, determining size and stride of final buffer view.\n for (const accessor of accessors) {\n const accessorDef = context.createAccessorDef(accessor);\n accessorDef.bufferView = json.bufferViews.length;\n accessorDef.byteOffset = byteStride;\n const elementSize = accessor.getElementSize();\n const componentSize = accessor.getComponentSize();\n byteStride += BufferUtils.padNumber(elementSize * componentSize);\n context.accessorIndexMap.set(accessor, json.accessors.length);\n json.accessors.push(accessorDef);\n }\n // Allocate interleaved buffer view.\n const byteLength = vertexCount * byteStride;\n const buffer = new ArrayBuffer(byteLength);\n const view = new DataView(buffer);\n // Write interleaved accessor data to the buffer view.\n for (let i = 0; i < vertexCount; i++) {\n let vertexByteOffset = 0;\n for (const accessor of accessors) {\n const elementSize = accessor.getElementSize();\n const componentSize = accessor.getComponentSize();\n const componentType = accessor.getComponentType();\n const array = accessor.getArray();\n for (let j = 0; j < elementSize; j++) {\n const viewByteOffset = i * byteStride + vertexByteOffset + j * componentSize;\n const value = array[i * elementSize + j];\n switch (componentType) {\n case Accessor.ComponentType.FLOAT:\n view.setFloat32(viewByteOffset, value, true);\n break;\n case Accessor.ComponentType.BYTE:\n view.setInt8(viewByteOffset, value);\n break;\n case Accessor.ComponentType.SHORT:\n view.setInt16(viewByteOffset, value, true);\n break;\n case Accessor.ComponentType.UNSIGNED_BYTE:\n view.setUint8(viewByteOffset, value);\n break;\n case Accessor.ComponentType.UNSIGNED_SHORT:\n view.setUint16(viewByteOffset, value, true);\n break;\n case Accessor.ComponentType.UNSIGNED_INT:\n view.setUint32(viewByteOffset, value, true);\n break;\n default:\n throw new Error('Unexpected component type: ' + componentType);\n }\n }\n vertexByteOffset += BufferUtils.padNumber(elementSize * componentSize);\n }\n }\n // Create buffer view definition.\n const bufferViewDef = {\n buffer: bufferIndex,\n byteOffset: bufferByteOffset,\n byteLength: byteLength,\n byteStride: byteStride,\n target: WriterContext.BufferViewTarget.ARRAY_BUFFER\n };\n json.bufferViews.push(bufferViewDef);\n return {\n byteLength,\n buffers: [new Uint8Array(buffer)]\n };\n }\n /**\n * Pack a group of sparse accessors. Appends accessor and buffer view\n * definitions to the root JSON lists.\n *\n * @param accessors Accessors to be included.\n * @param bufferIndex Buffer to write to.\n * @param bufferByteOffset Current offset into the buffer, accounting for other buffer views.\n */\n function concatSparseAccessors(accessors, bufferIndex, bufferByteOffset) {\n const buffers = [];\n let byteLength = 0;\n const sparseData = new Map();\n let maxIndex = -Infinity;\n let needSparseWarning = false;\n // (1) Write accessor definitions, gathering indices and values.\n for (const accessor of accessors) {\n const accessorDef = context.createAccessorDef(accessor);\n json.accessors.push(accessorDef);\n context.accessorIndexMap.set(accessor, json.accessors.length - 1);\n const indices = [];\n const values = [];\n const el = [];\n const base = new Array(accessor.getElementSize()).fill(0);\n for (let i = 0, il = accessor.getCount(); i < il; i++) {\n accessor.getElement(i, el);\n if (MathUtils.eq(el, base, 0)) continue;\n maxIndex = Math.max(i, maxIndex);\n indices.push(i);\n for (let j = 0; j < el.length; j++) values.push(el[j]);\n }\n const count = indices.length;\n const data = {\n accessorDef,\n count\n };\n sparseData.set(accessor, data);\n if (count === 0) continue;\n if (count > accessor.getCount() / 2) {\n needSparseWarning = true;\n }\n const ValueArray = ComponentTypeToTypedArray[accessor.getComponentType()];\n data.indices = indices;\n data.values = new ValueArray(values);\n }\n // (2) Early exit if all sparse accessors are just zero-filled arrays.\n if (!Number.isFinite(maxIndex)) {\n return {\n buffers,\n byteLength\n };\n }\n if (needSparseWarning) {\n logger.warn(`Some sparse accessors have >50% non-zero elements, which may increase file size.`);\n }\n // (3) Write index buffer view.\n const IndexArray = maxIndex < 255 ? Uint8Array : maxIndex < 65535 ? Uint16Array : Uint32Array;\n const IndexComponentType = maxIndex < 255 ? UNSIGNED_BYTE : maxIndex < 65535 ? UNSIGNED_SHORT : UNSIGNED_INT;\n const indicesBufferViewDef = {\n buffer: bufferIndex,\n byteOffset: bufferByteOffset + byteLength,\n byteLength: 0\n };\n for (const accessor of accessors) {\n const data = sparseData.get(accessor);\n if (data.count === 0) continue;\n data.indicesByteOffset = indicesBufferViewDef.byteLength;\n const buffer = BufferUtils.pad(BufferUtils.toView(new IndexArray(data.indices)));\n buffers.push(buffer);\n byteLength += buffer.byteLength;\n indicesBufferViewDef.byteLength += buffer.byteLength;\n }\n json.bufferViews.push(indicesBufferViewDef);\n const indicesBufferViewIndex = json.bufferViews.length - 1;\n // (4) Write value buffer view.\n const valuesBufferViewDef = {\n buffer: bufferIndex,\n byteOffset: bufferByteOffset + byteLength,\n byteLength: 0\n };\n for (const accessor of accessors) {\n const data = sparseData.get(accessor);\n if (data.count === 0) continue;\n data.valuesByteOffset = valuesBufferViewDef.byteLength;\n const buffer = BufferUtils.pad(BufferUtils.toView(data.values));\n buffers.push(buffer);\n byteLength += buffer.byteLength;\n valuesBufferViewDef.byteLength += buffer.byteLength;\n }\n json.bufferViews.push(valuesBufferViewDef);\n const valuesBufferViewIndex = json.bufferViews.length - 1;\n // (5) Write accessor sparse entries.\n for (const accessor of accessors) {\n const data = sparseData.get(accessor);\n if (data.count === 0) continue;\n data.accessorDef.sparse = {\n count: data.count,\n indices: {\n bufferView: indicesBufferViewIndex,\n byteOffset: data.indicesByteOffset,\n componentType: IndexComponentType\n },\n values: {\n bufferView: valuesBufferViewIndex,\n byteOffset: data.valuesByteOffset\n }\n };\n }\n return {\n buffers,\n byteLength\n };\n }\n json.accessors = [];\n json.bufferViews = [];\n /* Textures. */\n // glTF Transform's \"Texture\" properties correspond 1:1 with glTF \"Image\" properties, and\n // with image files. The glTF file may contain more one texture per image, where images\n // are reused with different sampler properties.\n json.samplers = [];\n json.textures = [];\n json.images = root.listTextures().map((texture, textureIndex) => {\n const imageDef = context.createPropertyDef(texture);\n if (texture.getMimeType()) {\n imageDef.mimeType = texture.getMimeType();\n }\n const image = texture.getImage();\n if (image) {\n context.createImageData(imageDef, image, texture);\n }\n context.imageIndexMap.set(texture, textureIndex);\n return imageDef;\n });\n /* Accessors. */\n extensionsUsed.filter(extension => extension.prewriteTypes.includes(PropertyType.ACCESSOR)).forEach(extension => extension.prewrite(context, PropertyType.ACCESSOR));\n root.listAccessors().forEach(accessor => {\n // Attributes are grouped and interleaved in one buffer view per mesh primitive.\n // Indices for all primitives are grouped into a single buffer view. IBMs are grouped\n // into a single buffer view. Other usage (if specified by extensions) also goes into\n // a dedicated buffer view. Everything else goes into a miscellaneous buffer view.\n // Certain accessor usage should group data into buffer views by the accessor parent.\n // The `accessorParents` map uses the first parent of each accessor for this purpose.\n const groupByParent = context.accessorUsageGroupedByParent;\n const accessorParents = context.accessorParents;\n // Skip if already written by an extension.\n if (context.accessorIndexMap.has(accessor)) return;\n // Assign usage for core accessor usage types (explicit targets and implicit usage).\n const usage = context.getAccessorUsage(accessor);\n context.addAccessorToUsageGroup(accessor, usage);\n // For accessor usage that requires grouping by parent (vertex and instance\n // attributes) organize buffer views accordingly.\n if (groupByParent.has(usage)) {\n const parent = graph.listParents(accessor).find(parent => parent.propertyType !== PropertyType.ROOT);\n accessorParents.set(accessor, parent);\n }\n });\n /* Buffers, buffer views. */\n extensionsUsed.filter(extension => extension.prewriteTypes.includes(PropertyType.BUFFER)).forEach(extension => extension.prewrite(context, PropertyType.BUFFER));\n const needsBuffer = root.listAccessors().length > 0 || context.otherBufferViews.size > 0 || root.listTextures().length > 0 && options.format === Format.GLB;\n if (needsBuffer && root.listBuffers().length === 0) {\n throw new Error('Buffer required for Document resources, but none was found.');\n }\n json.buffers = [];\n root.listBuffers().forEach((buffer, index) => {\n const bufferDef = context.createPropertyDef(buffer);\n const groupByParent = context.accessorUsageGroupedByParent;\n const accessors = buffer.listParents().filter(property => property instanceof Accessor);\n const uniqueParents = new Set(accessors.map(accessor => context.accessorParents.get(accessor)));\n const parentToIndex = new Map(Array.from(uniqueParents).map((parent, index) => [parent, index]));\n const accessorGroups = {};\n for (const accessor of accessors) {\n var _key;\n // Skip if already written by an extension.\n if (context.accessorIndexMap.has(accessor)) continue;\n const usage = context.getAccessorUsage(accessor);\n let key = usage;\n if (groupByParent.has(usage)) {\n const parent = context.accessorParents.get(accessor);\n key += `:${parentToIndex.get(parent)}`;\n }\n accessorGroups[_key = key] || (accessorGroups[_key] = {\n usage,\n accessors: []\n });\n accessorGroups[key].accessors.push(accessor);\n }\n // Write accessor groups to buffer views.\n const buffers = [];\n const bufferIndex = json.buffers.length;\n let bufferByteLength = 0;\n for (const {\n usage,\n accessors: groupAccessors\n } of Object.values(accessorGroups)) {\n if (usage === BufferViewUsage.ARRAY_BUFFER && options.vertexLayout === VertexLayout.INTERLEAVED) {\n // (1) Interleaved vertex attributes.\n const result = interleaveAccessors(groupAccessors, bufferIndex, bufferByteLength);\n bufferByteLength += result.byteLength;\n for (const _buffer of result.buffers) {\n buffers.push(_buffer);\n }\n } else if (usage === BufferViewUsage.ARRAY_BUFFER) {\n // (2) Non-interleaved vertex attributes.\n for (const accessor of groupAccessors) {\n // We 'interleave' a single accessor because the method pads to\n // 4-byte boundaries, which concatAccessors() does not.\n const result = interleaveAccessors([accessor], bufferIndex, bufferByteLength);\n bufferByteLength += result.byteLength;\n for (const _buffer2 of result.buffers) {\n buffers.push(_buffer2);\n }\n }\n } else if (usage === BufferViewUsage.SPARSE) {\n // (3) Sparse accessors.\n const result = concatSparseAccessors(groupAccessors, bufferIndex, bufferByteLength);\n bufferByteLength += result.byteLength;\n for (const _buffer3 of result.buffers) {\n buffers.push(_buffer3);\n }\n } else if (usage === BufferViewUsage.ELEMENT_ARRAY_BUFFER) {\n // (4) Indices.\n const target = WriterContext.BufferViewTarget.ELEMENT_ARRAY_BUFFER;\n const result = concatAccessors(groupAccessors, bufferIndex, bufferByteLength, target);\n bufferByteLength += result.byteLength;\n for (const _buffer4 of result.buffers) {\n buffers.push(_buffer4);\n }\n } else {\n // (5) Other.\n const result = concatAccessors(groupAccessors, bufferIndex, bufferByteLength);\n bufferByteLength += result.byteLength;\n for (const _buffer5 of result.buffers) {\n buffers.push(_buffer5);\n }\n }\n }\n // We only support embedded images in GLB, where the embedded buffer must be the first.\n // Additional buffers are currently left empty (see EXT_meshopt_compression fallback).\n if (context.imageBufferViews.length && index === 0) {\n for (let i = 0; i < context.imageBufferViews.length; i++) {\n json.bufferViews[json.images[i].bufferView].byteOffset = bufferByteLength;\n bufferByteLength += context.imageBufferViews[i].byteLength;\n buffers.push(context.imageBufferViews[i]);\n if (bufferByteLength % 8) {\n // See: https://github.com/KhronosGroup/glTF/issues/1935\n const imagePadding = 8 - bufferByteLength % 8;\n bufferByteLength += imagePadding;\n buffers.push(new Uint8Array(imagePadding));\n }\n }\n }\n if (context.otherBufferViews.has(buffer)) {\n for (const data of context.otherBufferViews.get(buffer)) {\n json.bufferViews.push({\n buffer: bufferIndex,\n byteOffset: bufferByteLength,\n byteLength: data.byteLength\n });\n context.otherBufferViewsIndexMap.set(data, json.bufferViews.length - 1);\n bufferByteLength += data.byteLength;\n buffers.push(data);\n }\n }\n if (bufferByteLength) {\n // Assign buffer URI.\n let uri;\n if (options.format === Format.GLB) {\n uri = GLB_BUFFER;\n } else {\n uri = context.bufferURIGenerator.createURI(buffer, 'bin');\n bufferDef.uri = uri;\n }\n // Write buffer views to buffer.\n bufferDef.byteLength = bufferByteLength;\n context.assignResourceURI(uri, BufferUtils.concat(buffers), true);\n }\n json.buffers.push(bufferDef);\n context.bufferIndexMap.set(buffer, index);\n });\n if (root.listAccessors().find(a => !a.getBuffer())) {\n logger.warn('Skipped writing one or more Accessors: no Buffer assigned.');\n }\n /* Materials. */\n extensionsUsed.filter(extension => extension.prewriteTypes.includes(PropertyType.MATERIAL)).forEach(extension => extension.prewrite(context, PropertyType.MATERIAL));\n json.materials = root.listMaterials().map((material, index) => {\n const materialDef = context.createPropertyDef(material);\n // Program state & blending.\n if (material.getAlphaMode() !== Material.AlphaMode.OPAQUE) {\n materialDef.alphaMode = material.getAlphaMode();\n }\n if (material.getAlphaMode() === Material.AlphaMode.MASK) {\n materialDef.alphaCutoff = material.getAlphaCutoff();\n }\n if (material.getDoubleSided()) materialDef.doubleSided = true;\n // Factors.\n materialDef.pbrMetallicRoughness = {};\n if (!MathUtils.eq(material.getBaseColorFactor(), [1, 1, 1, 1])) {\n materialDef.pbrMetallicRoughness.baseColorFactor = material.getBaseColorFactor();\n }\n if (!MathUtils.eq(material.getEmissiveFactor(), [0, 0, 0])) {\n materialDef.emissiveFactor = material.getEmissiveFactor();\n }\n if (material.getRoughnessFactor() !== 1) {\n materialDef.pbrMetallicRoughness.roughnessFactor = material.getRoughnessFactor();\n }\n if (material.getMetallicFactor() !== 1) {\n materialDef.pbrMetallicRoughness.metallicFactor = material.getMetallicFactor();\n }\n // Textures.\n if (material.getBaseColorTexture()) {\n const texture = material.getBaseColorTexture();\n const textureInfo = material.getBaseColorTextureInfo();\n materialDef.pbrMetallicRoughness.baseColorTexture = context.createTextureInfoDef(texture, textureInfo);\n }\n if (material.getEmissiveTexture()) {\n const texture = material.getEmissiveTexture();\n const textureInfo = material.getEmissiveTextureInfo();\n materialDef.emissiveTexture = context.createTextureInfoDef(texture, textureInfo);\n }\n if (material.getNormalTexture()) {\n const texture = material.getNormalTexture();\n const textureInfo = material.getNormalTextureInfo();\n const textureInfoDef = context.createTextureInfoDef(texture, textureInfo);\n if (material.getNormalScale() !== 1) {\n textureInfoDef.scale = material.getNormalScale();\n }\n materialDef.normalTexture = textureInfoDef;\n }\n if (material.getOcclusionTexture()) {\n const texture = material.getOcclusionTexture();\n const textureInfo = material.getOcclusionTextureInfo();\n const textureInfoDef = context.createTextureInfoDef(texture, textureInfo);\n if (material.getOcclusionStrength() !== 1) {\n textureInfoDef.strength = material.getOcclusionStrength();\n }\n materialDef.occlusionTexture = textureInfoDef;\n }\n if (material.getMetallicRoughnessTexture()) {\n const texture = material.getMetallicRoughnessTexture();\n const textureInfo = material.getMetallicRoughnessTextureInfo();\n materialDef.pbrMetallicRoughness.metallicRoughnessTexture = context.createTextureInfoDef(texture, textureInfo);\n }\n context.materialIndexMap.set(material, index);\n return materialDef;\n });\n /* Meshes. */\n extensionsUsed.filter(extension => extension.prewriteTypes.includes(PropertyType.MESH)).forEach(extension => extension.prewrite(context, PropertyType.MESH));\n json.meshes = root.listMeshes().map((mesh, index) => {\n const meshDef = context.createPropertyDef(mesh);\n let targetNames = null;\n meshDef.primitives = mesh.listPrimitives().map(primitive => {\n const primitiveDef = {\n attributes: {}\n };\n primitiveDef.mode = primitive.getMode();\n const material = primitive.getMaterial();\n if (material) {\n primitiveDef.material = context.materialIndexMap.get(material);\n }\n if (Object.keys(primitive.getExtras()).length) {\n primitiveDef.extras = primitive.getExtras();\n }\n const indices = primitive.getIndices();\n if (indices) {\n primitiveDef.indices = context.accessorIndexMap.get(indices);\n }\n for (const semantic of primitive.listSemantics()) {\n primitiveDef.attributes[semantic] = context.accessorIndexMap.get(primitive.getAttribute(semantic));\n }\n for (const target of primitive.listTargets()) {\n const targetDef = {};\n for (const semantic of target.listSemantics()) {\n targetDef[semantic] = context.accessorIndexMap.get(target.getAttribute(semantic));\n }\n primitiveDef.targets = primitiveDef.targets || [];\n primitiveDef.targets.push(targetDef);\n }\n if (primitive.listTargets().length && !targetNames) {\n targetNames = primitive.listTargets().map(target => target.getName());\n }\n return primitiveDef;\n });\n if (mesh.getWeights().length) {\n meshDef.weights = mesh.getWeights();\n }\n if (targetNames) {\n meshDef.extras = meshDef.extras || {};\n meshDef.extras['targetNames'] = targetNames;\n }\n context.meshIndexMap.set(mesh, index);\n return meshDef;\n });\n /** Cameras. */\n json.cameras = root.listCameras().map((camera, index) => {\n const cameraDef = context.createPropertyDef(camera);\n cameraDef.type = camera.getType();\n if (cameraDef.type === Camera.Type.PERSPECTIVE) {\n cameraDef.perspective = {\n znear: camera.getZNear(),\n zfar: camera.getZFar(),\n yfov: camera.getYFov()\n };\n const aspectRatio = camera.getAspectRatio();\n if (aspectRatio !== null) {\n cameraDef.perspective.aspectRatio = aspectRatio;\n }\n } else {\n cameraDef.orthographic = {\n znear: camera.getZNear(),\n zfar: camera.getZFar(),\n xmag: camera.getXMag(),\n ymag: camera.getYMag()\n };\n }\n context.cameraIndexMap.set(camera, index);\n return cameraDef;\n });\n /* Nodes. */\n json.nodes = root.listNodes().map((node, index) => {\n const nodeDef = context.createPropertyDef(node);\n if (!MathUtils.eq(node.getTranslation(), [0, 0, 0])) {\n nodeDef.translation = node.getTranslation();\n }\n if (!MathUtils.eq(node.getRotation(), [0, 0, 0, 1])) {\n nodeDef.rotation = node.getRotation();\n }\n if (!MathUtils.eq(node.getScale(), [1, 1, 1])) {\n nodeDef.scale = node.getScale();\n }\n if (node.getWeights().length) {\n nodeDef.weights = node.getWeights();\n }\n // Attachments (mesh, camera, skin) defined later in writing process.\n context.nodeIndexMap.set(node, index);\n return nodeDef;\n });\n /** Skins. */\n json.skins = root.listSkins().map((skin, index) => {\n const skinDef = context.createPropertyDef(skin);\n const inverseBindMatrices = skin.getInverseBindMatrices();\n if (inverseBindMatrices) {\n skinDef.inverseBindMatrices = context.accessorIndexMap.get(inverseBindMatrices);\n }\n const skeleton = skin.getSkeleton();\n if (skeleton) {\n skinDef.skeleton = context.nodeIndexMap.get(skeleton);\n }\n skinDef.joints = skin.listJoints().map(joint => context.nodeIndexMap.get(joint));\n context.skinIndexMap.set(skin, index);\n return skinDef;\n });\n /** Node attachments. */\n root.listNodes().forEach((node, index) => {\n const nodeDef = json.nodes[index];\n const mesh = node.getMesh();\n if (mesh) {\n nodeDef.mesh = context.meshIndexMap.get(mesh);\n }\n const camera = node.getCamera();\n if (camera) {\n nodeDef.camera = context.cameraIndexMap.get(camera);\n }\n const skin = node.getSkin();\n if (skin) {\n nodeDef.skin = context.skinIndexMap.get(skin);\n }\n if (node.listChildren().length > 0) {\n nodeDef.children = node.listChildren().map(node => context.nodeIndexMap.get(node));\n }\n });\n /** Animations. */\n json.animations = root.listAnimations().map((animation, index) => {\n const animationDef = context.createPropertyDef(animation);\n const samplerIndexMap = new Map();\n animationDef.samplers = animation.listSamplers().map((sampler, samplerIndex) => {\n const samplerDef = context.createPropertyDef(sampler);\n samplerDef.input = context.accessorIndexMap.get(sampler.getInput());\n samplerDef.output = context.accessorIndexMap.get(sampler.getOutput());\n samplerDef.interpolation = sampler.getInterpolation();\n samplerIndexMap.set(sampler, samplerIndex);\n return samplerDef;\n });\n animationDef.channels = animation.listChannels().map(channel => {\n const channelDef = context.createPropertyDef(channel);\n channelDef.sampler = samplerIndexMap.get(channel.getSampler());\n channelDef.target = {\n node: context.nodeIndexMap.get(channel.getTargetNode()),\n path: channel.getTargetPath()\n };\n return channelDef;\n });\n context.animationIndexMap.set(animation, index);\n return animationDef;\n });\n /* Scenes. */\n json.scenes = root.listScenes().map((scene, index) => {\n const sceneDef = context.createPropertyDef(scene);\n sceneDef.nodes = scene.listChildren().map(node => context.nodeIndexMap.get(node));\n context.sceneIndexMap.set(scene, index);\n return sceneDef;\n });\n const defaultScene = root.getDefaultScene();\n if (defaultScene) {\n json.scene = root.listScenes().indexOf(defaultScene);\n }\n /* Extensions (2/2). */\n json.extensionsUsed = extensionsUsed.map(ext => ext.extensionName);\n json.extensionsRequired = extensionsRequired.map(ext => ext.extensionName);\n extensionsUsed.forEach(extension => extension.write(context));\n //\n clean(json);\n return jsonDoc;\n }\n}\n/**\n * Removes empty and null values from an object.\n * @param object\n * @internal\n */\nfunction clean(object) {\n const unused = [];\n for (const key in object) {\n const value = object[key];\n if (Array.isArray(value) && value.length === 0) {\n unused.push(key);\n } else if (value === null || value === '') {\n unused.push(key);\n } else if (value && typeof value === 'object' && Object.keys(value).length === 0) {\n unused.push(key);\n }\n }\n for (const key of unused) {\n delete object[key];\n }\n}\n\nvar ChunkType;\n(function (ChunkType) {\n ChunkType[ChunkType[\"JSON\"] = 1313821514] = \"JSON\";\n ChunkType[ChunkType[\"BIN\"] = 5130562] = \"BIN\";\n})(ChunkType || (ChunkType = {}));\n/**\n * *Abstract I/O service.*\n *\n * The most common use of the I/O service is to read/write a {@link Document} with a given path.\n * Methods are also available for converting in-memory representations of raw glTF files, both\n * binary (*Uint8Array*) and JSON ({@link JSONDocument}).\n *\n * For platform-specific implementations, see {@link NodeIO}, {@link WebIO}, and {@link DenoIO}.\n *\n * @category I/O\n */\nclass PlatformIO {\n constructor() {\n this._logger = Logger.DEFAULT_INSTANCE;\n this._extensions = new Set();\n this._dependencies = {};\n this._vertexLayout = VertexLayout.INTERLEAVED;\n /** @hidden */\n this.lastReadBytes = 0;\n /** @hidden */\n this.lastWriteBytes = 0;\n }\n /** Sets the {@link Logger} used by this I/O instance. Defaults to Logger.DEFAULT_INSTANCE. */\n setLogger(logger) {\n this._logger = logger;\n return this;\n }\n /** Registers extensions, enabling I/O class to read and write glTF assets requiring them. */\n registerExtensions(extensions) {\n for (const extension of extensions) {\n this._extensions.add(extension);\n extension.register();\n }\n return this;\n }\n /** Registers dependencies used (e.g. by extensions) in the I/O process. */\n registerDependencies(dependencies) {\n Object.assign(this._dependencies, dependencies);\n return this;\n }\n /**\n * Sets the vertex layout method used by this I/O instance. Defaults to\n * VertexLayout.INTERLEAVED.\n */\n setVertexLayout(layout) {\n this._vertexLayout = layout;\n return this;\n }\n /**********************************************************************************************\n * Public Read API.\n */\n /** Reads a {@link Document} from the given URI. */\n async read(uri) {\n return await this.readJSON(await this.readAsJSON(uri));\n }\n /** Loads a URI and returns a {@link JSONDocument} struct, without parsing. */\n async readAsJSON(uri) {\n const view = await this.readURI(uri, 'view');\n this.lastReadBytes = view.byteLength;\n const jsonDoc = isGLB(view) ? this._binaryToJSON(view) : {\n json: JSON.parse(BufferUtils.decodeText(view)),\n resources: {}\n };\n // Read external resources first, before Data URIs are replaced.\n await this._readResourcesExternal(jsonDoc, this.dirname(uri));\n this._readResourcesInternal(jsonDoc);\n return jsonDoc;\n }\n /** Converts glTF-formatted JSON and a resource map to a {@link Document}. */\n async readJSON(jsonDoc) {\n jsonDoc = this._copyJSON(jsonDoc);\n this._readResourcesInternal(jsonDoc);\n return GLTFReader.read(jsonDoc, {\n extensions: Array.from(this._extensions),\n dependencies: this._dependencies,\n logger: this._logger\n });\n }\n /** Converts a GLB-formatted Uint8Array to a {@link JSONDocument}. */\n async binaryToJSON(glb) {\n const jsonDoc = this._binaryToJSON(BufferUtils.assertView(glb));\n this._readResourcesInternal(jsonDoc);\n const json = jsonDoc.json;\n // Check for external references, which can't be resolved by this method.\n if (json.buffers && json.buffers.some(bufferDef => isExternalBuffer(jsonDoc, bufferDef))) {\n throw new Error('Cannot resolve external buffers with binaryToJSON().');\n } else if (json.images && json.images.some(imageDef => isExternalImage(jsonDoc, imageDef))) {\n throw new Error('Cannot resolve external images with binaryToJSON().');\n }\n return jsonDoc;\n }\n /** Converts a GLB-formatted Uint8Array to a {@link Document}. */\n async readBinary(glb) {\n return this.readJSON(await this.binaryToJSON(BufferUtils.assertView(glb)));\n }\n /**********************************************************************************************\n * Public Write API.\n */\n /** Converts a {@link Document} to glTF-formatted JSON and a resource map. */\n async writeJSON(doc, _options = {}) {\n if (_options.format === Format.GLB && doc.getRoot().listBuffers().length > 1) {\n throw new Error('GLB must have 0–1 buffers.');\n }\n return GLTFWriter.write(doc, {\n format: _options.format || Format.GLTF,\n basename: _options.basename || '',\n logger: this._logger,\n vertexLayout: this._vertexLayout,\n dependencies: _extends({}, this._dependencies),\n extensions: Array.from(this._extensions)\n });\n }\n /** Converts a {@link Document} to a GLB-formatted Uint8Array. */\n async writeBinary(doc) {\n const {\n json,\n resources\n } = await this.writeJSON(doc, {\n format: Format.GLB\n });\n const header = new Uint32Array([0x46546c67, 2, 12]);\n const jsonText = JSON.stringify(json);\n const jsonChunkData = BufferUtils.pad(BufferUtils.encodeText(jsonText), 0x20);\n const jsonChunkHeader = BufferUtils.toView(new Uint32Array([jsonChunkData.byteLength, 0x4e4f534a]));\n const jsonChunk = BufferUtils.concat([jsonChunkHeader, jsonChunkData]);\n header[header.length - 1] += jsonChunk.byteLength;\n const binBuffer = Object.values(resources)[0];\n if (!binBuffer || !binBuffer.byteLength) {\n return BufferUtils.concat([BufferUtils.toView(header), jsonChunk]);\n }\n const binChunkData = BufferUtils.pad(binBuffer, 0x00);\n const binChunkHeader = BufferUtils.toView(new Uint32Array([binChunkData.byteLength, 0x004e4942]));\n const binChunk = BufferUtils.concat([binChunkHeader, binChunkData]);\n header[header.length - 1] += binChunk.byteLength;\n return BufferUtils.concat([BufferUtils.toView(header), jsonChunk, binChunk]);\n }\n /**********************************************************************************************\n * Internal.\n */\n async _readResourcesExternal(jsonDoc, base) {\n var _this = this;\n const images = jsonDoc.json.images || [];\n const buffers = jsonDoc.json.buffers || [];\n const pendingResources = [...images, ...buffers].map(async function (resource) {\n const uri = resource.uri;\n if (!uri || uri.match(/data:/)) return Promise.resolve();\n jsonDoc.resources[uri] = await _this.readURI(_this.resolve(base, uri), 'view');\n _this.lastReadBytes += jsonDoc.resources[uri].byteLength;\n });\n await Promise.all(pendingResources);\n }\n _readResourcesInternal(jsonDoc) {\n // NOTICE: This method may be called more than once during the loading\n // process (e.g. WebIO.read) and should handle that safely.\n function resolveResource(resource) {\n if (!resource.uri) return;\n if (resource.uri in jsonDoc.resources) {\n BufferUtils.assertView(jsonDoc.resources[resource.uri]);\n return;\n }\n if (resource.uri.match(/data:/)) {\n // Rewrite Data URIs to something short and unique.\n const resourceUUID = `__${uuid()}.${FileUtils.extension(resource.uri)}`;\n jsonDoc.resources[resourceUUID] = BufferUtils.createBufferFromDataURI(resource.uri);\n resource.uri = resourceUUID;\n }\n }\n // Unpack images.\n const images = jsonDoc.json.images || [];\n images.forEach(image => {\n if (image.bufferView === undefined && image.uri === undefined) {\n throw new Error('Missing resource URI or buffer view.');\n }\n resolveResource(image);\n });\n // Unpack buffers.\n const buffers = jsonDoc.json.buffers || [];\n buffers.forEach(resolveResource);\n }\n /**\n * Creates a shallow copy of glTF-formatted {@link JSONDocument}.\n *\n * Images, Buffers, and Resources objects are deep copies so that PlatformIO can safely\n * modify them during the parsing process. Other properties are shallow copies, and buffers\n * are passed by reference.\n */\n _copyJSON(jsonDoc) {\n const {\n images,\n buffers\n } = jsonDoc.json;\n jsonDoc = {\n json: _extends({}, jsonDoc.json),\n resources: _extends({}, jsonDoc.resources)\n };\n if (images) {\n jsonDoc.json.images = images.map(image => _extends({}, image));\n }\n if (buffers) {\n jsonDoc.json.buffers = buffers.map(buffer => _extends({}, buffer));\n }\n return jsonDoc;\n }\n /** Internal version of binaryToJSON; does not warn about external resources. */\n _binaryToJSON(glb) {\n // Decode and verify GLB header.\n if (!isGLB(glb)) {\n throw new Error('Invalid glTF 2.0 binary.');\n }\n // Decode JSON chunk.\n const jsonChunkHeader = new Uint32Array(glb.buffer, glb.byteOffset + 12, 2);\n if (jsonChunkHeader[1] !== ChunkType.JSON) {\n throw new Error('Missing required GLB JSON chunk.');\n }\n const jsonByteOffset = 20;\n const jsonByteLength = jsonChunkHeader[0];\n const jsonText = BufferUtils.decodeText(BufferUtils.toView(glb, jsonByteOffset, jsonByteLength));\n const json = JSON.parse(jsonText);\n // Decode BIN chunk.\n const binByteOffset = jsonByteOffset + jsonByteLength;\n if (glb.byteLength <= binByteOffset) {\n return {\n json,\n resources: {}\n };\n }\n const binChunkHeader = new Uint32Array(glb.buffer, glb.byteOffset + binByteOffset, 2);\n if (binChunkHeader[1] !== ChunkType.BIN) {\n // Allow GLB files without BIN chunk, but with unknown chunk\n // Spec: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#chunks-overview\n return {\n json,\n resources: {}\n };\n }\n const binByteLength = binChunkHeader[0];\n const binBuffer = BufferUtils.toView(glb, binByteOffset + 8, binByteLength);\n return {\n json,\n resources: {\n [GLB_BUFFER]: binBuffer\n }\n };\n }\n}\nfunction isExternalBuffer(jsonDocument, bufferDef) {\n return bufferDef.uri !== undefined && !(bufferDef.uri in jsonDocument.resources);\n}\nfunction isExternalImage(jsonDocument, imageDef) {\n return imageDef.uri !== undefined && !(imageDef.uri in jsonDocument.resources) && imageDef.bufferView === undefined;\n}\nfunction isGLB(view) {\n if (view.byteLength < 3 * Uint32Array.BYTES_PER_ELEMENT) return false;\n const header = new Uint32Array(view.buffer, view.byteOffset, 3);\n return header[0] === 0x46546c67 && header[1] === 2;\n}\n\n/**\n * *I/O service for Node.js.*\n *\n * The most common use of the I/O service is to read/write a {@link Document} with a given path.\n * Methods are also available for converting in-memory representations of raw glTF files, both\n * binary (*Uint8Array*) and JSON ({@link JSONDocument}).\n *\n * Usage:\n *\n * ```typescript\n * import { NodeIO } from '@gltf-transform/core';\n *\n * const io = new NodeIO();\n *\n * // Read.\n * let document;\n * document = await io.read('model.glb'); // → Document\n * document = await io.readBinary(glb); // Uint8Array → Document\n *\n * // Write.\n * await io.write('model.glb', document); // → void\n * const glb = await io.writeBinary(document); // Document → Uint8Array\n * ```\n *\n * By default, NodeIO can only read/write paths on disk. To enable network requests, provide a Fetch\n * API implementation (global [`fetch()`](https://nodejs.org/api/globals.html#fetch) is stable in\n * Node.js v21+, or [`node-fetch`](https://www.npmjs.com/package/node-fetch) may be installed) and enable\n * {@link NodeIO.setAllowNetwork setAllowNetwork}. Network requests may optionally be configured with\n * [RequestInit](https://developer.mozilla.org/en-US/docs/Web/API/fetch#parameters) parameters.\n *\n * ```typescript\n * const io = new NodeIO(fetch, {headers: {...}}).setAllowNetwork(true);\n *\n * const document = await io.read('https://example.com/path/to/model.glb');\n * ```\n *\n * @category I/O\n */\nclass NodeIO extends PlatformIO {\n /**\n * Constructs a new NodeIO service. Instances are reusable. By default, only NodeIO can only\n * read/write paths on disk. To enable HTTP requests, provide a Fetch API implementation and\n * enable {@link NodeIO.setAllowNetwork setAllowNetwork}.\n *\n * @param fetch Implementation of Fetch API.\n * @param fetchConfig Configuration object for Fetch API.\n */\n constructor(_fetch = null, _fetchConfig = HTTPUtils.DEFAULT_INIT) {\n super();\n this._fetch = void 0;\n this._fetchConfig = void 0;\n this._init = void 0;\n this._fetchEnabled = false;\n this._fetch = _fetch;\n this._fetchConfig = _fetchConfig;\n this._init = this.init();\n }\n async init() {\n if (this._init) return this._init;\n return Promise.all([import('fs'), import('path')]).then(([fs, path]) => {\n this._fs = fs.promises;\n this._path = path;\n });\n }\n setAllowNetwork(allow) {\n if (allow && !this._fetch) {\n throw new Error('NodeIO requires a Fetch API implementation for HTTP requests.');\n }\n this._fetchEnabled = allow;\n return this;\n }\n async readURI(uri, type) {\n await this.init();\n if (HTTPUtils.isAbsoluteURL(uri)) {\n if (!this._fetchEnabled || !this._fetch) {\n throw new Error('Network request blocked. Allow HTTP requests explicitly, if needed.');\n }\n const response = await this._fetch(uri, this._fetchConfig);\n switch (type) {\n case 'view':\n return new Uint8Array(await response.arrayBuffer());\n case 'text':\n return response.text();\n }\n } else {\n switch (type) {\n case 'view':\n return this._fs.readFile(uri);\n case 'text':\n return this._fs.readFile(uri, 'utf8');\n }\n }\n }\n resolve(base, path) {\n if (HTTPUtils.isAbsoluteURL(base) || HTTPUtils.isAbsoluteURL(path)) {\n return HTTPUtils.resolve(base, path);\n }\n // https://github.com/KhronosGroup/glTF/issues/1449\n // https://stackoverflow.com/a/27278490/1314762\n return this._path.resolve(base, decodeURIComponent(path));\n }\n dirname(uri) {\n if (HTTPUtils.isAbsoluteURL(uri)) {\n return HTTPUtils.dirname(uri);\n }\n return this._path.dirname(uri);\n }\n /**********************************************************************************************\n * Public.\n */\n /** Writes a {@link Document} instance to a local path. */\n async write(uri, doc) {\n await this.init();\n const isGLB = !!uri.match(/\\.glb$/);\n await (isGLB ? this._writeGLB(uri, doc) : this._writeGLTF(uri, doc));\n }\n /**********************************************************************************************\n * Private.\n */\n /** @internal */\n async _writeGLTF(uri, doc) {\n var _this = this;\n this.lastWriteBytes = 0;\n const {\n json,\n resources\n } = await this.writeJSON(doc, {\n format: Format.GLTF,\n basename: FileUtils.basename(uri)\n });\n const {\n _fs: fs,\n _path: path\n } = this;\n const dir = path.dirname(uri);\n // write json\n const jsonContent = JSON.stringify(json, null, 2);\n await fs.writeFile(uri, jsonContent);\n this.lastWriteBytes += jsonContent.length;\n // write resources\n for (const batch of listBatches(Object.keys(resources), 10)) {\n await Promise.all(batch.map(async function (resourceURI) {\n if (HTTPUtils.isAbsoluteURL(resourceURI)) {\n if (HTTPUtils.extension(resourceURI) === 'bin') {\n throw new Error(`Cannot write buffer to path \"${resourceURI}\".`);\n }\n return;\n }\n const resourcePath = path.join(dir, decodeURIComponent(resourceURI));\n await fs.mkdir(path.dirname(resourcePath), {\n recursive: true\n });\n await fs.writeFile(resourcePath, resources[resourceURI]);\n _this.lastWriteBytes += resources[resourceURI].byteLength;\n }));\n }\n }\n /** @internal */\n async _writeGLB(uri, doc) {\n const buffer = await this.writeBinary(doc);\n await this._fs.writeFile(uri, buffer);\n this.lastWriteBytes = buffer.byteLength;\n }\n}\n/** Divides a flat input array into batches of size `batchSize`. */\nfunction listBatches(array, batchSize) {\n const batches = [];\n for (let i = 0, il = array.length; i < il; i += batchSize) {\n const batch = [];\n for (let j = 0; j < batchSize && i + j < il; j++) {\n batch.push(array[i + j]);\n }\n batches.push(batch);\n }\n return batches;\n}\n\n/**\n * *I/O service for [Deno](https://deno.land/).*\n *\n * The most common use of the I/O service is to read/write a {@link Document} with a given path.\n * Methods are also available for converting in-memory representations of raw glTF files, both\n * binary (*Uint8Array*) and JSON ({@link JSONDocument}).\n *\n * _*NOTICE:* Support for the Deno environment is currently experimental. See\n * [glTF-Transform#457](https://github.com/donmccurdy/glTF-Transform/issues/457)._\n *\n * Usage:\n *\n * ```typescript\n * import { DenoIO } from 'https://esm.sh/@gltf-transform/core';\n * import * as path from 'https://deno.land/std/path/mod.ts';\n *\n * const io = new DenoIO(path);\n *\n * // Read.\n * let document;\n * document = io.read('model.glb'); // → Document\n * document = io.readBinary(glb); // Uint8Array → Document\n *\n * // Write.\n * const glb = io.writeBinary(document); // Document → Uint8Array\n * ```\n *\n * @category I/O\n */\nclass DenoIO extends PlatformIO {\n constructor(path) {\n super();\n this._path = void 0;\n this._path = path;\n }\n async readURI(uri, type) {\n switch (type) {\n case 'view':\n return Deno.readFile(uri);\n case 'text':\n return Deno.readTextFile(uri);\n }\n }\n resolve(base, path) {\n // https://github.com/KhronosGroup/glTF/issues/1449\n // https://stackoverflow.com/a/27278490/1314762\n return this._path.resolve(base, decodeURIComponent(path));\n }\n dirname(uri) {\n return this._path.dirname(uri);\n }\n}\n\n/**\n * *I/O service for Web.*\n *\n * The most common use of the I/O service is to read/write a {@link Document} with a given path.\n * Methods are also available for converting in-memory representations of raw glTF files, both\n * binary (*Uint8Array*) and JSON ({@link JSONDocument}).\n *\n * Usage:\n *\n * ```typescript\n * import { WebIO } from '@gltf-transform/core';\n *\n * const io = new WebIO({credentials: 'include'});\n *\n * // Read.\n * let document;\n * document = await io.read('model.glb'); // → Document\n * document = await io.readBinary(glb); // Uint8Array → Document\n *\n * // Write.\n * const glb = await io.writeBinary(document); // Document → Uint8Array\n * ```\n *\n * @category I/O\n */\nclass WebIO extends PlatformIO {\n /**\n * Constructs a new WebIO service. Instances are reusable.\n * @param fetchConfig Configuration object for Fetch API.\n */\n constructor(fetchConfig = HTTPUtils.DEFAULT_INIT) {\n super();\n this._fetchConfig = void 0;\n this._fetchConfig = fetchConfig;\n }\n async readURI(uri, type) {\n const response = await fetch(uri, this._fetchConfig);\n switch (type) {\n case 'view':\n return new Uint8Array(await response.arrayBuffer());\n case 'text':\n return response.text();\n }\n }\n resolve(base, path) {\n return HTTPUtils.resolve(base, path);\n }\n dirname(uri) {\n return HTTPUtils.dirname(uri);\n }\n}\n\nexport { Accessor, Animation, AnimationChannel, AnimationSampler, Buffer$1 as Buffer, BufferUtils, COPY_IDENTITY, Camera, ColorUtils, ComponentTypeToTypedArray, DenoIO, Document, ExtensibleProperty, Extension, ExtensionProperty, FileUtils, Format, GLB_BUFFER, HTTPUtils, ImageUtils, Logger, Material, MathUtils, Mesh, Node, NodeIO, PlatformIO, Primitive, PrimitiveTarget, Property, PropertyType, ReaderContext, Root, Scene, Skin, Texture, TextureChannel, TextureInfo, VERSION, Verbosity, VertexLayout, WebIO, WriterContext, getBounds, uuid };\n//# sourceMappingURL=index.modern.js.map\n","///////////////////////////////////////////////////\n// KTX2 Header.\n///////////////////////////////////////////////////\nconst KHR_SUPERCOMPRESSION_NONE = 0;\nconst KHR_SUPERCOMPRESSION_BASISLZ = 1;\nconst KHR_SUPERCOMPRESSION_ZSTD = 2;\nconst KHR_SUPERCOMPRESSION_ZLIB = 3;\n///////////////////////////////////////////////////\n// Data Format Descriptor (DFD).\n///////////////////////////////////////////////////\nconst KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT = 0;\nconst KHR_DF_VENDORID_KHRONOS = 0;\nconst KHR_DF_VERSION = 2;\nconst KHR_DF_MODEL_UNSPECIFIED = 0;\nconst KHR_DF_MODEL_RGBSDA = 1;\n// ...\nconst KHR_DF_MODEL_ETC1 = 160;\nconst KHR_DF_MODEL_ETC2 = 161;\nconst KHR_DF_MODEL_ASTC = 162;\nconst KHR_DF_MODEL_ETC1S = 163;\nconst KHR_DF_MODEL_UASTC = 166;\nconst KHR_DF_FLAG_ALPHA_STRAIGHT = 0;\nconst KHR_DF_FLAG_ALPHA_PREMULTIPLIED = 1;\nconst KHR_DF_TRANSFER_UNSPECIFIED = 0;\nconst KHR_DF_TRANSFER_LINEAR = 1;\nconst KHR_DF_TRANSFER_SRGB = 2;\nconst KHR_DF_TRANSFER_ITU = 3;\nconst KHR_DF_TRANSFER_NTSC = 4;\nconst KHR_DF_TRANSFER_SLOG = 5;\nconst KHR_DF_TRANSFER_SLOG2 = 6;\nconst KHR_DF_TRANSFER_BT1886 = 7;\nconst KHR_DF_TRANSFER_HLG_OETF = 8;\nconst KHR_DF_TRANSFER_HLG_EOTF = 9;\nconst KHR_DF_TRANSFER_PQ_EOTF = 10;\nconst KHR_DF_TRANSFER_PQ_OETF = 11;\nconst KHR_DF_TRANSFER_DCIP3 = 12;\nconst KHR_DF_TRANSFER_PAL_OETF = 13;\nconst KHR_DF_TRANSFER_PAL625_EOTF = 14;\nconst KHR_DF_TRANSFER_ST240 = 15;\nconst KHR_DF_TRANSFER_ACESCC = 16;\nconst KHR_DF_TRANSFER_ACESCCT = 17;\nconst KHR_DF_TRANSFER_ADOBERGB = 18;\nconst KHR_DF_PRIMARIES_UNSPECIFIED = 0;\nconst KHR_DF_PRIMARIES_BT709 = 1;\nconst KHR_DF_PRIMARIES_BT601_EBU = 2;\nconst KHR_DF_PRIMARIES_BT601_SMPTE = 3;\nconst KHR_DF_PRIMARIES_BT2020 = 4;\nconst KHR_DF_PRIMARIES_CIEXYZ = 5;\nconst KHR_DF_PRIMARIES_ACES = 6;\nconst KHR_DF_PRIMARIES_ACESCC = 7;\nconst KHR_DF_PRIMARIES_NTSC1953 = 8;\nconst KHR_DF_PRIMARIES_PAL525 = 9;\nconst KHR_DF_PRIMARIES_DISPLAYP3 = 10;\nconst KHR_DF_PRIMARIES_ADOBERGB = 11;\nconst KHR_DF_CHANNEL_RGBSDA_RED = 0;\nconst KHR_DF_CHANNEL_RGBSDA_GREEN = 1;\nconst KHR_DF_CHANNEL_RGBSDA_BLUE = 2;\nconst KHR_DF_CHANNEL_RGBSDA_STENCIL = 13;\nconst KHR_DF_CHANNEL_RGBSDA_DEPTH = 14;\nconst KHR_DF_CHANNEL_RGBSDA_ALPHA = 15;\nconst KHR_DF_SAMPLE_DATATYPE_FLOAT = 0x80;\nconst KHR_DF_SAMPLE_DATATYPE_SIGNED = 0x40;\nconst KHR_DF_SAMPLE_DATATYPE_EXPONENT = 0x20;\nconst KHR_DF_SAMPLE_DATATYPE_LINEAR = 0x10;\n///////////////////////////////////////////////////\n// VK FORMAT.\n///////////////////////////////////////////////////\nconst VK_FORMAT_UNDEFINED = 0;\nconst VK_FORMAT_R4G4_UNORM_PACK8 = 1;\nconst VK_FORMAT_R4G4B4A4_UNORM_PACK16 = 2;\nconst VK_FORMAT_B4G4R4A4_UNORM_PACK16 = 3;\nconst VK_FORMAT_R5G6B5_UNORM_PACK16 = 4;\nconst VK_FORMAT_B5G6R5_UNORM_PACK16 = 5;\nconst VK_FORMAT_R5G5B5A1_UNORM_PACK16 = 6;\nconst VK_FORMAT_B5G5R5A1_UNORM_PACK16 = 7;\nconst VK_FORMAT_A1R5G5B5_UNORM_PACK16 = 8;\nconst VK_FORMAT_R8_UNORM = 9;\nconst VK_FORMAT_R8_SNORM = 10;\nconst VK_FORMAT_R8_UINT = 13;\nconst VK_FORMAT_R8_SINT = 14;\nconst VK_FORMAT_R8_SRGB = 15;\nconst VK_FORMAT_R8G8_UNORM = 16;\nconst VK_FORMAT_R8G8_SNORM = 17;\nconst VK_FORMAT_R8G8_UINT = 20;\nconst VK_FORMAT_R8G8_SINT = 21;\nconst VK_FORMAT_R8G8_SRGB = 22;\nconst VK_FORMAT_R8G8B8_UNORM = 23;\nconst VK_FORMAT_R8G8B8_SNORM = 24;\nconst VK_FORMAT_R8G8B8_UINT = 27;\nconst VK_FORMAT_R8G8B8_SINT = 28;\nconst VK_FORMAT_R8G8B8_SRGB = 29;\nconst VK_FORMAT_B8G8R8_UNORM = 30;\nconst VK_FORMAT_B8G8R8_SNORM = 31;\nconst VK_FORMAT_B8G8R8_UINT = 34;\nconst VK_FORMAT_B8G8R8_SINT = 35;\nconst VK_FORMAT_B8G8R8_SRGB = 36;\nconst VK_FORMAT_R8G8B8A8_UNORM = 37;\nconst VK_FORMAT_R8G8B8A8_SNORM = 38;\nconst VK_FORMAT_R8G8B8A8_UINT = 41;\nconst VK_FORMAT_R8G8B8A8_SINT = 42;\nconst VK_FORMAT_R8G8B8A8_SRGB = 43;\nconst VK_FORMAT_B8G8R8A8_UNORM = 44;\nconst VK_FORMAT_B8G8R8A8_SNORM = 45;\nconst VK_FORMAT_B8G8R8A8_UINT = 48;\nconst VK_FORMAT_B8G8R8A8_SINT = 49;\nconst VK_FORMAT_B8G8R8A8_SRGB = 50;\nconst VK_FORMAT_A2R10G10B10_UNORM_PACK32 = 58;\nconst VK_FORMAT_A2R10G10B10_SNORM_PACK32 = 59;\nconst VK_FORMAT_A2R10G10B10_UINT_PACK32 = 62;\nconst VK_FORMAT_A2R10G10B10_SINT_PACK32 = 63;\nconst VK_FORMAT_A2B10G10R10_UNORM_PACK32 = 64;\nconst VK_FORMAT_A2B10G10R10_SNORM_PACK32 = 65;\nconst VK_FORMAT_A2B10G10R10_UINT_PACK32 = 68;\nconst VK_FORMAT_A2B10G10R10_SINT_PACK32 = 69;\nconst VK_FORMAT_R16_UNORM = 70;\nconst VK_FORMAT_R16_SNORM = 71;\nconst VK_FORMAT_R16_UINT = 74;\nconst VK_FORMAT_R16_SINT = 75;\nconst VK_FORMAT_R16_SFLOAT = 76;\nconst VK_FORMAT_R16G16_UNORM = 77;\nconst VK_FORMAT_R16G16_SNORM = 78;\nconst VK_FORMAT_R16G16_UINT = 81;\nconst VK_FORMAT_R16G16_SINT = 82;\nconst VK_FORMAT_R16G16_SFLOAT = 83;\nconst VK_FORMAT_R16G16B16_UNORM = 84;\nconst VK_FORMAT_R16G16B16_SNORM = 85;\nconst VK_FORMAT_R16G16B16_UINT = 88;\nconst VK_FORMAT_R16G16B16_SINT = 89;\nconst VK_FORMAT_R16G16B16_SFLOAT = 90;\nconst VK_FORMAT_R16G16B16A16_UNORM = 91;\nconst VK_FORMAT_R16G16B16A16_SNORM = 92;\nconst VK_FORMAT_R16G16B16A16_UINT = 95;\nconst VK_FORMAT_R16G16B16A16_SINT = 96;\nconst VK_FORMAT_R16G16B16A16_SFLOAT = 97;\nconst VK_FORMAT_R32_UINT = 98;\nconst VK_FORMAT_R32_SINT = 99;\nconst VK_FORMAT_R32_SFLOAT = 100;\nconst VK_FORMAT_R32G32_UINT = 101;\nconst VK_FORMAT_R32G32_SINT = 102;\nconst VK_FORMAT_R32G32_SFLOAT = 103;\nconst VK_FORMAT_R32G32B32_UINT = 104;\nconst VK_FORMAT_R32G32B32_SINT = 105;\nconst VK_FORMAT_R32G32B32_SFLOAT = 106;\nconst VK_FORMAT_R32G32B32A32_UINT = 107;\nconst VK_FORMAT_R32G32B32A32_SINT = 108;\nconst VK_FORMAT_R32G32B32A32_SFLOAT = 109;\nconst VK_FORMAT_R64_UINT = 110;\nconst VK_FORMAT_R64_SINT = 111;\nconst VK_FORMAT_R64_SFLOAT = 112;\nconst VK_FORMAT_R64G64_UINT = 113;\nconst VK_FORMAT_R64G64_SINT = 114;\nconst VK_FORMAT_R64G64_SFLOAT = 115;\nconst VK_FORMAT_R64G64B64_UINT = 116;\nconst VK_FORMAT_R64G64B64_SINT = 117;\nconst VK_FORMAT_R64G64B64_SFLOAT = 118;\nconst VK_FORMAT_R64G64B64A64_UINT = 119;\nconst VK_FORMAT_R64G64B64A64_SINT = 120;\nconst VK_FORMAT_R64G64B64A64_SFLOAT = 121;\nconst VK_FORMAT_B10G11R11_UFLOAT_PACK32 = 122;\nconst VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 = 123;\nconst VK_FORMAT_D16_UNORM = 124;\nconst VK_FORMAT_X8_D24_UNORM_PACK32 = 125;\nconst VK_FORMAT_D32_SFLOAT = 126;\nconst VK_FORMAT_S8_UINT = 127;\nconst VK_FORMAT_D16_UNORM_S8_UINT = 128;\nconst VK_FORMAT_D24_UNORM_S8_UINT = 129;\nconst VK_FORMAT_D32_SFLOAT_S8_UINT = 130;\nconst VK_FORMAT_BC1_RGB_UNORM_BLOCK = 131;\nconst VK_FORMAT_BC1_RGB_SRGB_BLOCK = 132;\nconst VK_FORMAT_BC1_RGBA_UNORM_BLOCK = 133;\nconst VK_FORMAT_BC1_RGBA_SRGB_BLOCK = 134;\nconst VK_FORMAT_BC2_UNORM_BLOCK = 135;\nconst VK_FORMAT_BC2_SRGB_BLOCK = 136;\nconst VK_FORMAT_BC3_UNORM_BLOCK = 137;\nconst VK_FORMAT_BC3_SRGB_BLOCK = 138;\nconst VK_FORMAT_BC4_UNORM_BLOCK = 139;\nconst VK_FORMAT_BC4_SNORM_BLOCK = 140;\nconst VK_FORMAT_BC5_UNORM_BLOCK = 141;\nconst VK_FORMAT_BC5_SNORM_BLOCK = 142;\nconst VK_FORMAT_BC6H_UFLOAT_BLOCK = 143;\nconst VK_FORMAT_BC6H_SFLOAT_BLOCK = 144;\nconst VK_FORMAT_BC7_UNORM_BLOCK = 145;\nconst VK_FORMAT_BC7_SRGB_BLOCK = 146;\nconst VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK = 147;\nconst VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK = 148;\nconst VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK = 149;\nconst VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK = 150;\nconst VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK = 151;\nconst VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK = 152;\nconst VK_FORMAT_EAC_R11_UNORM_BLOCK = 153;\nconst VK_FORMAT_EAC_R11_SNORM_BLOCK = 154;\nconst VK_FORMAT_EAC_R11G11_UNORM_BLOCK = 155;\nconst VK_FORMAT_EAC_R11G11_SNORM_BLOCK = 156;\nconst VK_FORMAT_ASTC_4x4_UNORM_BLOCK = 157;\nconst VK_FORMAT_ASTC_4x4_SRGB_BLOCK = 158;\nconst VK_FORMAT_ASTC_5x4_UNORM_BLOCK = 159;\nconst VK_FORMAT_ASTC_5x4_SRGB_BLOCK = 160;\nconst VK_FORMAT_ASTC_5x5_UNORM_BLOCK = 161;\nconst VK_FORMAT_ASTC_5x5_SRGB_BLOCK = 162;\nconst VK_FORMAT_ASTC_6x5_UNORM_BLOCK = 163;\nconst VK_FORMAT_ASTC_6x5_SRGB_BLOCK = 164;\nconst VK_FORMAT_ASTC_6x6_UNORM_BLOCK = 165;\nconst VK_FORMAT_ASTC_6x6_SRGB_BLOCK = 166;\nconst VK_FORMAT_ASTC_8x5_UNORM_BLOCK = 167;\nconst VK_FORMAT_ASTC_8x5_SRGB_BLOCK = 168;\nconst VK_FORMAT_ASTC_8x6_UNORM_BLOCK = 169;\nconst VK_FORMAT_ASTC_8x6_SRGB_BLOCK = 170;\nconst VK_FORMAT_ASTC_8x8_UNORM_BLOCK = 171;\nconst VK_FORMAT_ASTC_8x8_SRGB_BLOCK = 172;\nconst VK_FORMAT_ASTC_10x5_UNORM_BLOCK = 173;\nconst VK_FORMAT_ASTC_10x5_SRGB_BLOCK = 174;\nconst VK_FORMAT_ASTC_10x6_UNORM_BLOCK = 175;\nconst VK_FORMAT_ASTC_10x6_SRGB_BLOCK = 176;\nconst VK_FORMAT_ASTC_10x8_UNORM_BLOCK = 177;\nconst VK_FORMAT_ASTC_10x8_SRGB_BLOCK = 178;\nconst VK_FORMAT_ASTC_10x10_UNORM_BLOCK = 179;\nconst VK_FORMAT_ASTC_10x10_SRGB_BLOCK = 180;\nconst VK_FORMAT_ASTC_12x10_UNORM_BLOCK = 181;\nconst VK_FORMAT_ASTC_12x10_SRGB_BLOCK = 182;\nconst VK_FORMAT_ASTC_12x12_UNORM_BLOCK = 183;\nconst VK_FORMAT_ASTC_12x12_SRGB_BLOCK = 184;\nconst VK_FORMAT_R10X6_UNORM_PACK16 = 1000156007;\nconst VK_FORMAT_R10X6G10X6_UNORM_2PACK16 = 1000156008;\nconst VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16 = 1000156009;\nconst VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16 = 1000156010;\nconst VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16 = 1000156011;\nconst VK_FORMAT_R12X4_UNORM_PACK16 = 1000156017;\nconst VK_FORMAT_R12X4G12X4_UNORM_2PACK16 = 1000156018;\nconst VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16 = 1000156019;\nconst VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16 = 1000156020;\nconst VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16 = 1000156021;\nconst VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG = 1000054000;\nconst VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG = 1000054001;\nconst VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG = 1000054002;\nconst VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG = 1000054003;\nconst VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG = 1000054004;\nconst VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG = 1000054005;\nconst VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG = 1000054006;\nconst VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG = 1000054007;\nconst VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT = 1000066000;\nconst VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT = 1000066001;\nconst VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT = 1000066002;\nconst VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT = 1000066003;\nconst VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT = 1000066004;\nconst VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT = 1000066005;\nconst VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT = 1000066006;\nconst VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT = 1000066007;\nconst VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT = 1000066008;\nconst VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT = 1000066009;\nconst VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT = 1000066010;\nconst VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT = 1000066011;\nconst VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT = 1000066012;\nconst VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT = 1000066013;\nconst VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT = 1000340000;\nconst VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT = 1000340001;\n\n/**\n * Creates a 'default' {@link KTX2Container} object, initialized with common\n * configuration wfor BT709 primaries and sRGB transfer, without pixel data.\n * There's nothing particularly special about the 'default' container; creating\n * the KTX2Container object explicitly is also fine.\n */\nfunction createDefaultContainer() {\n return {\n vkFormat: VK_FORMAT_UNDEFINED,\n typeSize: 1,\n pixelWidth: 0,\n pixelHeight: 0,\n pixelDepth: 0,\n layerCount: 0,\n faceCount: 1,\n supercompressionScheme: KHR_SUPERCOMPRESSION_NONE,\n levels: [],\n dataFormatDescriptor: [{\n vendorId: KHR_DF_VENDORID_KHRONOS,\n descriptorType: KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,\n versionNumber: KHR_DF_VERSION,\n colorModel: KHR_DF_MODEL_UNSPECIFIED,\n colorPrimaries: KHR_DF_PRIMARIES_BT709,\n transferFunction: KHR_DF_TRANSFER_SRGB,\n flags: KHR_DF_FLAG_ALPHA_STRAIGHT,\n texelBlockDimension: [0, 0, 0, 0],\n bytesPlane: [0, 0, 0, 0, 0, 0, 0, 0],\n samples: []\n }],\n keyValue: {},\n globalData: null\n };\n}\n\nclass BufferReader {\n constructor(data, byteOffset, byteLength, littleEndian) {\n this._dataView = void 0;\n this._littleEndian = void 0;\n this._offset = void 0;\n this._dataView = new DataView(data.buffer, data.byteOffset + byteOffset, byteLength);\n this._littleEndian = littleEndian;\n this._offset = 0;\n }\n _nextUint8() {\n const value = this._dataView.getUint8(this._offset);\n this._offset += 1;\n return value;\n }\n _nextUint16() {\n const value = this._dataView.getUint16(this._offset, this._littleEndian);\n this._offset += 2;\n return value;\n }\n _nextUint32() {\n const value = this._dataView.getUint32(this._offset, this._littleEndian);\n this._offset += 4;\n return value;\n }\n _nextUint64() {\n const left = this._dataView.getUint32(this._offset, this._littleEndian);\n const right = this._dataView.getUint32(this._offset + 4, this._littleEndian);\n // TODO(cleanup): Just test this...\n // const value = this._littleEndian ? left + (2 ** 32 * right) : (2 ** 32 * left) + right;\n const value = left + 2 ** 32 * right;\n this._offset += 8;\n return value;\n }\n _nextInt32() {\n const value = this._dataView.getInt32(this._offset, this._littleEndian);\n this._offset += 4;\n return value;\n }\n _nextUint8Array(len) {\n const value = new Uint8Array(this._dataView.buffer, this._dataView.byteOffset + this._offset, len);\n this._offset += len;\n return value;\n }\n _skip(bytes) {\n this._offset += bytes;\n return this;\n }\n _scan(maxByteLength, term = 0x00) {\n const byteOffset = this._offset;\n let byteLength = 0;\n while (this._dataView.getUint8(this._offset) !== term && byteLength < maxByteLength) {\n byteLength++;\n this._offset++;\n }\n if (byteLength < maxByteLength) this._offset++;\n return new Uint8Array(this._dataView.buffer, this._dataView.byteOffset + byteOffset, byteLength);\n }\n}\n\n///////////////////////////////////////////////////\n// Common.\n///////////////////////////////////////////////////\nconst KTX_WRITER = `KTX-Parse v${\"1.0.1\"}`;\nconst NUL = new Uint8Array([0x00]);\n///////////////////////////////////////////////////\n// KTX2 Header.\n///////////////////////////////////////////////////\nconst KTX2_ID = [\n// '´', 'K', 'T', 'X', '2', '0', 'ª', '\\r', '\\n', '\\x1A', '\\n'\n0xab, 0x4b, 0x54, 0x58, 0x20, 0x32, 0x30, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a];\nconst HEADER_BYTE_LENGTH = 68; // 13 * 4 + 2 * 8\n\n/** Encodes text to an ArrayBuffer. */\nfunction encodeText(text) {\n return new TextEncoder().encode(text);\n}\n/** Decodes an ArrayBuffer to text. */\nfunction decodeText(buffer) {\n return new TextDecoder().decode(buffer);\n}\n/** Concatenates N ArrayBuffers. */\nfunction concat(buffers) {\n let totalByteLength = 0;\n for (const buffer of buffers) {\n totalByteLength += buffer.byteLength;\n }\n const result = new Uint8Array(totalByteLength);\n let byteOffset = 0;\n for (const buffer of buffers) {\n result.set(new Uint8Array(buffer), byteOffset);\n byteOffset += buffer.byteLength;\n }\n return result;\n}\n/** Returns the least common multiple (LCM) for two positive integers. */\nfunction leastCommonMultiple(a, b) {\n const max = Math.max(a, b);\n const min = Math.min(a, b);\n let lcm = max;\n while (lcm % min !== 0) {\n lcm += max;\n }\n return lcm;\n}\n/**\n * Returns amount of padding, in bytes, required to pad a value V to N-byte\n * boundaries. Both V and N must be positive integers.\n */\nfunction getPadding(v, n = 4) {\n return Math.ceil(v / n) * n - v;\n}\n/** Returns byte length per texel block. */\nfunction getBlockByteLength(container) {\n return container.levels[0].levelData.byteLength / getBlockCount(container, 0);\n}\n/**\n * Returns total number of blocks for given level. For VK_FORMAT_UNDEFINED, DFD is required.\n *\n * References:\n * - https://github.khronos.org/KTX-Specification/ktxspec.v2.html#levelImages\n */\nfunction getBlockCount(container, levelIndex) {\n let blockCount = 1;\n const pixelDimensions = [container.pixelWidth, container.pixelHeight, container.pixelDepth];\n const blockDimensions = getBlockDimensions(container);\n for (let i = 0; i < 3; i++) {\n if (pixelDimensions[i] > 0) {\n const dimBlockCount = Math.ceil(Math.floor(pixelDimensions[i] * 2 ** -levelIndex) / blockDimensions[i]);\n blockCount *= Math.max(1, dimBlockCount);\n }\n }\n if (container.layerCount > 0) {\n blockCount *= container.layerCount;\n }\n if (container.faceCount > 0) {\n blockCount *= container.faceCount;\n }\n return blockCount;\n}\n/**\n * Given a KTX2 container, returns block dimensions as [width, height, depth]. Requires valid DFD.\n */\nfunction getBlockDimensions(container) {\n const [x, y, z] = container.dataFormatDescriptor[0].texelBlockDimension;\n return [x + 1, y + 1, z + 1];\n}\n\n/**\n * Parses a KTX 2.0 file, returning an unpacked {@link KTX2Container} instance with all associated\n * data. The container's mip levels and other binary data are pointers into the original file, not\n * copies, so the original file should not be overwritten after reading.\n *\n * @param data Bytes of KTX 2.0 file, as Uint8Array or Buffer.\n */\nfunction read(data) {\n ///////////////////////////////////////////////////\n // KTX 2.0 Identifier.\n ///////////////////////////////////////////////////\n const id = new Uint8Array(data.buffer, data.byteOffset, KTX2_ID.length);\n if (id[0] !== KTX2_ID[0] ||\n // '´'\n id[1] !== KTX2_ID[1] ||\n // 'K'\n id[2] !== KTX2_ID[2] ||\n // 'T'\n id[3] !== KTX2_ID[3] ||\n // 'X'\n id[4] !== KTX2_ID[4] ||\n // ' '\n id[5] !== KTX2_ID[5] ||\n // '2'\n id[6] !== KTX2_ID[6] ||\n // '0'\n id[7] !== KTX2_ID[7] ||\n // 'ª'\n id[8] !== KTX2_ID[8] ||\n // '\\r'\n id[9] !== KTX2_ID[9] ||\n // '\\n'\n id[10] !== KTX2_ID[10] ||\n // '\\x1A'\n id[11] !== KTX2_ID[11] // '\\n'\n ) {\n throw new Error('Missing KTX 2.0 identifier.');\n }\n const container = createDefaultContainer();\n ///////////////////////////////////////////////////\n // Header.\n ///////////////////////////////////////////////////\n const headerByteLength = 17 * Uint32Array.BYTES_PER_ELEMENT;\n const headerReader = new BufferReader(data, KTX2_ID.length, headerByteLength, true);\n container.vkFormat = headerReader._nextUint32();\n container.typeSize = headerReader._nextUint32();\n container.pixelWidth = headerReader._nextUint32();\n container.pixelHeight = headerReader._nextUint32();\n container.pixelDepth = headerReader._nextUint32();\n container.layerCount = headerReader._nextUint32();\n container.faceCount = headerReader._nextUint32();\n const levelCount = headerReader._nextUint32();\n container.supercompressionScheme = headerReader._nextUint32();\n const dfdByteOffset = headerReader._nextUint32();\n const dfdByteLength = headerReader._nextUint32();\n const kvdByteOffset = headerReader._nextUint32();\n const kvdByteLength = headerReader._nextUint32();\n const sgdByteOffset = headerReader._nextUint64();\n const sgdByteLength = headerReader._nextUint64();\n ///////////////////////////////////////////////////\n // Level Index.\n ///////////////////////////////////////////////////\n const levelByteLength = levelCount * 3 * 8;\n const levelReader = new BufferReader(data, KTX2_ID.length + headerByteLength, levelByteLength, true);\n for (let i = 0; i < levelCount; i++) {\n container.levels.push({\n levelData: new Uint8Array(data.buffer, data.byteOffset + levelReader._nextUint64(), levelReader._nextUint64()),\n uncompressedByteLength: levelReader._nextUint64()\n });\n }\n ///////////////////////////////////////////////////\n // Data Format Descriptor (DFD).\n ///////////////////////////////////////////////////\n const dfdReader = new BufferReader(data, dfdByteOffset, dfdByteLength, true);\n dfdReader._skip(4); // totalSize\n const vendorId = dfdReader._nextUint16();\n const descriptorType = dfdReader._nextUint16();\n const versionNumber = dfdReader._nextUint16();\n const descriptorBlockSize = dfdReader._nextUint16();\n const colorModel = dfdReader._nextUint8();\n const colorPrimaries = dfdReader._nextUint8();\n const transferFunction = dfdReader._nextUint8();\n const flags = dfdReader._nextUint8();\n const texelBlockDimension = [dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8()];\n const bytesPlane = [dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8()];\n const samples = [];\n const dfd = {\n vendorId,\n descriptorType,\n versionNumber,\n colorModel,\n colorPrimaries,\n transferFunction,\n flags,\n texelBlockDimension,\n bytesPlane,\n samples\n };\n const sampleStart = 6;\n const sampleWords = 4;\n const numSamples = (descriptorBlockSize / 4 - sampleStart) / sampleWords;\n for (let i = 0; i < numSamples; i++) {\n const sample = {\n bitOffset: dfdReader._nextUint16(),\n bitLength: dfdReader._nextUint8(),\n channelType: dfdReader._nextUint8(),\n samplePosition: [dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8(), dfdReader._nextUint8()],\n sampleLower: Number.NEGATIVE_INFINITY,\n sampleUpper: Number.POSITIVE_INFINITY\n };\n if (sample.channelType & KHR_DF_SAMPLE_DATATYPE_SIGNED) {\n sample.sampleLower = dfdReader._nextInt32();\n sample.sampleUpper = dfdReader._nextInt32();\n } else {\n sample.sampleLower = dfdReader._nextUint32();\n sample.sampleUpper = dfdReader._nextUint32();\n }\n dfd.samples[i] = sample;\n }\n container.dataFormatDescriptor.length = 0;\n container.dataFormatDescriptor.push(dfd);\n ///////////////////////////////////////////////////\n // Key/Value Data (KVD).\n ///////////////////////////////////////////////////\n const kvdReader = new BufferReader(data, kvdByteOffset, kvdByteLength, true);\n while (kvdReader._offset < kvdByteLength) {\n const keyValueByteLength = kvdReader._nextUint32();\n const keyData = kvdReader._scan(keyValueByteLength);\n const key = decodeText(keyData);\n container.keyValue[key] = kvdReader._nextUint8Array(keyValueByteLength - keyData.byteLength - 1);\n if (key.match(/^ktx/i)) {\n const text = decodeText(container.keyValue[key]);\n container.keyValue[key] = text.substring(0, text.lastIndexOf('\\x00'));\n }\n const kvPadding = keyValueByteLength % 4 ? 4 - keyValueByteLength % 4 : 0; // align(4)\n // 4-byte alignment.\n kvdReader._skip(kvPadding);\n }\n ///////////////////////////////////////////////////\n // Supercompression Global Data (SGD).\n ///////////////////////////////////////////////////\n if (sgdByteLength <= 0) return container;\n const sgdReader = new BufferReader(data, sgdByteOffset, sgdByteLength, true);\n const endpointCount = sgdReader._nextUint16();\n const selectorCount = sgdReader._nextUint16();\n const endpointsByteLength = sgdReader._nextUint32();\n const selectorsByteLength = sgdReader._nextUint32();\n const tablesByteLength = sgdReader._nextUint32();\n const extendedByteLength = sgdReader._nextUint32();\n const imageDescs = [];\n for (let i = 0; i < levelCount; i++) {\n imageDescs.push({\n imageFlags: sgdReader._nextUint32(),\n rgbSliceByteOffset: sgdReader._nextUint32(),\n rgbSliceByteLength: sgdReader._nextUint32(),\n alphaSliceByteOffset: sgdReader._nextUint32(),\n alphaSliceByteLength: sgdReader._nextUint32()\n });\n }\n const endpointsByteOffset = sgdByteOffset + sgdReader._offset;\n const selectorsByteOffset = endpointsByteOffset + endpointsByteLength;\n const tablesByteOffset = selectorsByteOffset + selectorsByteLength;\n const extendedByteOffset = tablesByteOffset + tablesByteLength;\n const endpointsData = new Uint8Array(data.buffer, data.byteOffset + endpointsByteOffset, endpointsByteLength);\n const selectorsData = new Uint8Array(data.buffer, data.byteOffset + selectorsByteOffset, selectorsByteLength);\n const tablesData = new Uint8Array(data.buffer, data.byteOffset + tablesByteOffset, tablesByteLength);\n const extendedData = new Uint8Array(data.buffer, data.byteOffset + extendedByteOffset, extendedByteLength);\n container.globalData = {\n endpointCount,\n selectorCount,\n imageDescs,\n endpointsData,\n selectorsData,\n tablesData,\n extendedData\n };\n return container;\n}\n\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\n\nconst DEFAULT_OPTIONS = {\n keepWriter: false\n};\n/**\n * Serializes a {@link KTX2Container} instance to a KTX 2.0 file. Mip levels and other binary data\n * are copied into the resulting Uint8Array, so the original container can safely be edited or\n * destroyed after it is serialized.\n *\n * Options:\n * - keepWriter: If true, 'KTXWriter' key/value field is written as provided by the container.\n * \t\tOtherwise, a string for the current ktx-parse version is generated. Default: false.\n *\n * @param container\n * @param options\n */\nfunction write(container, options = {}) {\n // biome-ignore lint/style/noParameterAssign: Merging defaults only.\n options = _extends({}, DEFAULT_OPTIONS, options);\n ///////////////////////////////////////////////////\n // Supercompression Global Data (SGD).\n ///////////////////////////////////////////////////\n let sgdBuffer = new ArrayBuffer(0);\n if (container.globalData) {\n const sgdHeaderBuffer = new ArrayBuffer(20 + container.globalData.imageDescs.length * 5 * 4);\n const sgdHeaderView = new DataView(sgdHeaderBuffer);\n sgdHeaderView.setUint16(0, container.globalData.endpointCount, true);\n sgdHeaderView.setUint16(2, container.globalData.selectorCount, true);\n sgdHeaderView.setUint32(4, container.globalData.endpointsData.byteLength, true);\n sgdHeaderView.setUint32(8, container.globalData.selectorsData.byteLength, true);\n sgdHeaderView.setUint32(12, container.globalData.tablesData.byteLength, true);\n sgdHeaderView.setUint32(16, container.globalData.extendedData.byteLength, true);\n for (let i = 0; i < container.globalData.imageDescs.length; i++) {\n const imageDesc = container.globalData.imageDescs[i];\n sgdHeaderView.setUint32(20 + i * 5 * 4 + 0, imageDesc.imageFlags, true);\n sgdHeaderView.setUint32(20 + i * 5 * 4 + 4, imageDesc.rgbSliceByteOffset, true);\n sgdHeaderView.setUint32(20 + i * 5 * 4 + 8, imageDesc.rgbSliceByteLength, true);\n sgdHeaderView.setUint32(20 + i * 5 * 4 + 12, imageDesc.alphaSliceByteOffset, true);\n sgdHeaderView.setUint32(20 + i * 5 * 4 + 16, imageDesc.alphaSliceByteLength, true);\n }\n sgdBuffer = concat([sgdHeaderBuffer, container.globalData.endpointsData, container.globalData.selectorsData, container.globalData.tablesData, container.globalData.extendedData]);\n }\n ///////////////////////////////////////////////////\n // Key/Value Data (KVD).\n ///////////////////////////////////////////////////\n const keyValueData = [];\n const keyValueList = Object.entries(_extends({}, container.keyValue, !options.keepWriter && {\n KTXwriter: KTX_WRITER\n }));\n keyValueList.sort((a, b) => a[0] > b[0] ? 1 : -1);\n for (const [key, value] of keyValueList) {\n const keyData = encodeText(key);\n const valueData = typeof value === 'string' ? concat([encodeText(value), NUL]) : value;\n const kvByteLength = keyData.byteLength + 1 + valueData.byteLength;\n const kvPadding = getPadding(kvByteLength, 4); // align(4)\n keyValueData.push(concat([new Uint32Array([kvByteLength]), keyData, NUL, valueData, new Uint8Array(kvPadding).fill(0x00) // align(4)\n ]));\n }\n const kvdBuffer = concat(keyValueData);\n ///////////////////////////////////////////////////\n // Data Format Descriptor (DFD).\n ///////////////////////////////////////////////////\n if (container.dataFormatDescriptor.length !== 1 || container.dataFormatDescriptor[0].descriptorType !== KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT) {\n throw new Error('Only BASICFORMAT Data Format Descriptor output supported.');\n }\n const dfd = container.dataFormatDescriptor[0];\n const dfdBuffer = new ArrayBuffer(28 + dfd.samples.length * 16);\n const dfdView = new DataView(dfdBuffer);\n const descriptorBlockSize = 24 + dfd.samples.length * 16;\n dfdView.setUint32(0, dfdBuffer.byteLength, true);\n dfdView.setUint16(4, dfd.vendorId, true);\n dfdView.setUint16(6, dfd.descriptorType, true);\n dfdView.setUint16(8, dfd.versionNumber, true);\n dfdView.setUint16(10, descriptorBlockSize, true);\n dfdView.setUint8(12, dfd.colorModel);\n dfdView.setUint8(13, dfd.colorPrimaries);\n dfdView.setUint8(14, dfd.transferFunction);\n dfdView.setUint8(15, dfd.flags);\n if (!Array.isArray(dfd.texelBlockDimension)) {\n throw new Error('texelBlockDimension is now an array. For dimensionality `d`, set `d - 1`.');\n }\n dfdView.setUint8(16, dfd.texelBlockDimension[0]);\n dfdView.setUint8(17, dfd.texelBlockDimension[1]);\n dfdView.setUint8(18, dfd.texelBlockDimension[2]);\n dfdView.setUint8(19, dfd.texelBlockDimension[3]);\n for (let i = 0; i < 8; i++) dfdView.setUint8(20 + i, dfd.bytesPlane[i]);\n for (let i = 0; i < dfd.samples.length; i++) {\n const sample = dfd.samples[i];\n const sampleByteOffset = 28 + i * 16;\n dfdView.setUint16(sampleByteOffset + 0, sample.bitOffset, true);\n dfdView.setUint8(sampleByteOffset + 2, sample.bitLength);\n dfdView.setUint8(sampleByteOffset + 3, sample.channelType);\n dfdView.setUint8(sampleByteOffset + 4, sample.samplePosition[0]);\n dfdView.setUint8(sampleByteOffset + 5, sample.samplePosition[1]);\n dfdView.setUint8(sampleByteOffset + 6, sample.samplePosition[2]);\n dfdView.setUint8(sampleByteOffset + 7, sample.samplePosition[3]);\n if (sample.channelType & KHR_DF_SAMPLE_DATATYPE_SIGNED) {\n dfdView.setInt32(sampleByteOffset + 8, sample.sampleLower, true);\n dfdView.setInt32(sampleByteOffset + 12, sample.sampleUpper, true);\n } else {\n dfdView.setUint32(sampleByteOffset + 8, sample.sampleLower, true);\n dfdView.setUint32(sampleByteOffset + 12, sample.sampleUpper, true);\n }\n }\n ///////////////////////////////////////////////////\n // Data alignment.\n ///////////////////////////////////////////////////\n const dfdByteOffset = KTX2_ID.length + HEADER_BYTE_LENGTH + container.levels.length * 3 * 8;\n const kvdByteOffset = dfdByteOffset + dfdBuffer.byteLength;\n let sgdByteOffset = sgdBuffer.byteLength > 0 ? kvdByteOffset + kvdBuffer.byteLength : 0;\n if (sgdByteOffset % 8) sgdByteOffset += 8 - sgdByteOffset % 8; // align(8)\n ///////////////////////////////////////////////////\n // Level Index.\n ///////////////////////////////////////////////////\n const levelData = [];\n const levelIndex = new DataView(new ArrayBuffer(container.levels.length * 3 * 8));\n const levelDataByteOffsets = new Uint32Array(container.levels.length);\n let levelAlign = 0;\n if (container.supercompressionScheme === KHR_SUPERCOMPRESSION_NONE) {\n levelAlign = leastCommonMultiple(getBlockByteLength(container), 4);\n }\n // Level data is ordered small → large.\n let levelDataByteOffset = (sgdByteOffset || kvdByteOffset + kvdBuffer.byteLength) + sgdBuffer.byteLength;\n for (let i = container.levels.length - 1; i >= 0; i--) {\n // Level padding.\n if (levelDataByteOffset % levelAlign) {\n const paddingBytes = getPadding(levelDataByteOffset, levelAlign);\n levelData.push(new Uint8Array(paddingBytes));\n levelDataByteOffset += paddingBytes;\n }\n // Level data.\n const level = container.levels[i];\n levelData.push(level.levelData);\n levelDataByteOffsets[i] = levelDataByteOffset;\n levelDataByteOffset += level.levelData.byteLength;\n }\n // Level index is ordered large → small.\n for (let i = 0; i < container.levels.length; i++) {\n const level = container.levels[i];\n levelIndex.setBigUint64(i * 24 + 0, BigInt(levelDataByteOffsets[i]), true);\n levelIndex.setBigUint64(i * 24 + 8, BigInt(level.levelData.byteLength), true);\n levelIndex.setBigUint64(i * 24 + 16, BigInt(level.uncompressedByteLength), true);\n }\n ///////////////////////////////////////////////////\n // Header.\n ///////////////////////////////////////////////////\n const headerBuffer = new ArrayBuffer(HEADER_BYTE_LENGTH);\n const headerView = new DataView(headerBuffer);\n headerView.setUint32(0, container.vkFormat, true);\n headerView.setUint32(4, container.typeSize, true);\n headerView.setUint32(8, container.pixelWidth, true);\n headerView.setUint32(12, container.pixelHeight, true);\n headerView.setUint32(16, container.pixelDepth, true);\n headerView.setUint32(20, container.layerCount, true);\n headerView.setUint32(24, container.faceCount, true);\n headerView.setUint32(28, container.levels.length, true);\n headerView.setUint32(32, container.supercompressionScheme, true);\n headerView.setUint32(36, dfdByteOffset, true);\n headerView.setUint32(40, dfdBuffer.byteLength, true);\n headerView.setUint32(44, kvdByteOffset, true);\n headerView.setUint32(48, kvdBuffer.byteLength, true);\n headerView.setBigUint64(52, BigInt(sgdBuffer.byteLength > 0 ? sgdByteOffset : 0), true);\n headerView.setBigUint64(60, BigInt(sgdBuffer.byteLength), true);\n ///////////////////////////////////////////////////\n // Compose.\n ///////////////////////////////////////////////////\n return new Uint8Array(concat([new Uint8Array(KTX2_ID).buffer, headerBuffer, levelIndex.buffer, dfdBuffer, kvdBuffer, sgdByteOffset > 0 ? new ArrayBuffer(sgdByteOffset - (kvdByteOffset + kvdBuffer.byteLength)) // align(8)\n : new ArrayBuffer(0), sgdBuffer, ...levelData]));\n}\n\nexport { KHR_DF_CHANNEL_RGBSDA_ALPHA, KHR_DF_CHANNEL_RGBSDA_BLUE, KHR_DF_CHANNEL_RGBSDA_DEPTH, KHR_DF_CHANNEL_RGBSDA_GREEN, KHR_DF_CHANNEL_RGBSDA_RED, KHR_DF_CHANNEL_RGBSDA_STENCIL, KHR_DF_FLAG_ALPHA_PREMULTIPLIED, KHR_DF_FLAG_ALPHA_STRAIGHT, KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT, KHR_DF_MODEL_ASTC, KHR_DF_MODEL_ETC1, KHR_DF_MODEL_ETC1S, KHR_DF_MODEL_ETC2, KHR_DF_MODEL_RGBSDA, KHR_DF_MODEL_UASTC, KHR_DF_MODEL_UNSPECIFIED, KHR_DF_PRIMARIES_ACES, KHR_DF_PRIMARIES_ACESCC, KHR_DF_PRIMARIES_ADOBERGB, KHR_DF_PRIMARIES_BT2020, KHR_DF_PRIMARIES_BT601_EBU, KHR_DF_PRIMARIES_BT601_SMPTE, KHR_DF_PRIMARIES_BT709, KHR_DF_PRIMARIES_CIEXYZ, KHR_DF_PRIMARIES_DISPLAYP3, KHR_DF_PRIMARIES_NTSC1953, KHR_DF_PRIMARIES_PAL525, KHR_DF_PRIMARIES_UNSPECIFIED, KHR_DF_SAMPLE_DATATYPE_EXPONENT, KHR_DF_SAMPLE_DATATYPE_FLOAT, KHR_DF_SAMPLE_DATATYPE_LINEAR, KHR_DF_SAMPLE_DATATYPE_SIGNED, KHR_DF_TRANSFER_ACESCC, KHR_DF_TRANSFER_ACESCCT, KHR_DF_TRANSFER_ADOBERGB, KHR_DF_TRANSFER_BT1886, KHR_DF_TRANSFER_DCIP3, KHR_DF_TRANSFER_HLG_EOTF, KHR_DF_TRANSFER_HLG_OETF, KHR_DF_TRANSFER_ITU, KHR_DF_TRANSFER_LINEAR, KHR_DF_TRANSFER_NTSC, KHR_DF_TRANSFER_PAL625_EOTF, KHR_DF_TRANSFER_PAL_OETF, KHR_DF_TRANSFER_PQ_EOTF, KHR_DF_TRANSFER_PQ_OETF, KHR_DF_TRANSFER_SLOG, KHR_DF_TRANSFER_SLOG2, KHR_DF_TRANSFER_SRGB, KHR_DF_TRANSFER_ST240, KHR_DF_TRANSFER_UNSPECIFIED, KHR_DF_VENDORID_KHRONOS, KHR_DF_VERSION, KHR_SUPERCOMPRESSION_BASISLZ, KHR_SUPERCOMPRESSION_NONE, KHR_SUPERCOMPRESSION_ZLIB, KHR_SUPERCOMPRESSION_ZSTD, VK_FORMAT_A1R5G5B5_UNORM_PACK16, VK_FORMAT_A2B10G10R10_SINT_PACK32, VK_FORMAT_A2B10G10R10_SNORM_PACK32, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_FORMAT_A2B10G10R10_UNORM_PACK32, VK_FORMAT_A2R10G10B10_SINT_PACK32, VK_FORMAT_A2R10G10B10_SNORM_PACK32, VK_FORMAT_A2R10G10B10_UINT_PACK32, VK_FORMAT_A2R10G10B10_UNORM_PACK32, VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT, VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT, VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_10x10_SRGB_BLOCK, VK_FORMAT_ASTC_10x10_UNORM_BLOCK, VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_10x5_SRGB_BLOCK, VK_FORMAT_ASTC_10x5_UNORM_BLOCK, VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_10x6_SRGB_BLOCK, VK_FORMAT_ASTC_10x6_UNORM_BLOCK, VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_10x8_SRGB_BLOCK, VK_FORMAT_ASTC_10x8_UNORM_BLOCK, VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_12x10_SRGB_BLOCK, VK_FORMAT_ASTC_12x10_UNORM_BLOCK, VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_12x12_SRGB_BLOCK, VK_FORMAT_ASTC_12x12_UNORM_BLOCK, VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_4x4_SRGB_BLOCK, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_5x4_SRGB_BLOCK, VK_FORMAT_ASTC_5x4_UNORM_BLOCK, VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_5x5_SRGB_BLOCK, VK_FORMAT_ASTC_5x5_UNORM_BLOCK, VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_6x5_SRGB_BLOCK, VK_FORMAT_ASTC_6x5_UNORM_BLOCK, VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_6x6_SRGB_BLOCK, VK_FORMAT_ASTC_6x6_UNORM_BLOCK, VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_8x5_SRGB_BLOCK, VK_FORMAT_ASTC_8x5_UNORM_BLOCK, VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_8x6_SRGB_BLOCK, VK_FORMAT_ASTC_8x6_UNORM_BLOCK, VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_8x8_SRGB_BLOCK, VK_FORMAT_ASTC_8x8_UNORM_BLOCK, VK_FORMAT_B10G11R11_UFLOAT_PACK32, VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16, VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16, VK_FORMAT_B4G4R4A4_UNORM_PACK16, VK_FORMAT_B5G5R5A1_UNORM_PACK16, VK_FORMAT_B5G6R5_UNORM_PACK16, VK_FORMAT_B8G8R8A8_SINT, VK_FORMAT_B8G8R8A8_SNORM, VK_FORMAT_B8G8R8A8_SRGB, VK_FORMAT_B8G8R8A8_UINT, VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_B8G8R8_SINT, VK_FORMAT_B8G8R8_SNORM, VK_FORMAT_B8G8R8_SRGB, VK_FORMAT_B8G8R8_UINT, VK_FORMAT_B8G8R8_UNORM, VK_FORMAT_BC1_RGBA_SRGB_BLOCK, VK_FORMAT_BC1_RGBA_UNORM_BLOCK, VK_FORMAT_BC1_RGB_SRGB_BLOCK, VK_FORMAT_BC1_RGB_UNORM_BLOCK, VK_FORMAT_BC2_SRGB_BLOCK, VK_FORMAT_BC2_UNORM_BLOCK, VK_FORMAT_BC3_SRGB_BLOCK, VK_FORMAT_BC3_UNORM_BLOCK, VK_FORMAT_BC4_SNORM_BLOCK, VK_FORMAT_BC4_UNORM_BLOCK, VK_FORMAT_BC5_SNORM_BLOCK, VK_FORMAT_BC5_UNORM_BLOCK, VK_FORMAT_BC6H_SFLOAT_BLOCK, VK_FORMAT_BC6H_UFLOAT_BLOCK, VK_FORMAT_BC7_SRGB_BLOCK, VK_FORMAT_BC7_UNORM_BLOCK, VK_FORMAT_D16_UNORM, VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, VK_FORMAT_EAC_R11G11_SNORM_BLOCK, VK_FORMAT_EAC_R11G11_UNORM_BLOCK, VK_FORMAT_EAC_R11_SNORM_BLOCK, VK_FORMAT_EAC_R11_UNORM_BLOCK, VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK, VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK, VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16, VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16, VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG, VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG, VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG, VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG, VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG, VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG, VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG, VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG, VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16, VK_FORMAT_R10X6G10X6_UNORM_2PACK16, VK_FORMAT_R10X6_UNORM_PACK16, VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16, VK_FORMAT_R12X4G12X4_UNORM_2PACK16, VK_FORMAT_R12X4_UNORM_PACK16, VK_FORMAT_R16G16B16A16_SFLOAT, VK_FORMAT_R16G16B16A16_SINT, VK_FORMAT_R16G16B16A16_SNORM, VK_FORMAT_R16G16B16A16_UINT, VK_FORMAT_R16G16B16A16_UNORM, VK_FORMAT_R16G16B16_SFLOAT, VK_FORMAT_R16G16B16_SINT, VK_FORMAT_R16G16B16_SNORM, VK_FORMAT_R16G16B16_UINT, VK_FORMAT_R16G16B16_UNORM, VK_FORMAT_R16G16_SFLOAT, VK_FORMAT_R16G16_SINT, VK_FORMAT_R16G16_SNORM, VK_FORMAT_R16G16_UINT, VK_FORMAT_R16G16_UNORM, VK_FORMAT_R16_SFLOAT, VK_FORMAT_R16_SINT, VK_FORMAT_R16_SNORM, VK_FORMAT_R16_UINT, VK_FORMAT_R16_UNORM, VK_FORMAT_R32G32B32A32_SFLOAT, VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32G32B32A32_UINT, VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32B32_SINT, VK_FORMAT_R32G32B32_UINT, VK_FORMAT_R32G32_SFLOAT, VK_FORMAT_R32G32_SINT, VK_FORMAT_R32G32_UINT, VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32_SINT, VK_FORMAT_R32_UINT, VK_FORMAT_R4G4B4A4_UNORM_PACK16, VK_FORMAT_R4G4_UNORM_PACK8, VK_FORMAT_R5G5B5A1_UNORM_PACK16, VK_FORMAT_R5G6B5_UNORM_PACK16, VK_FORMAT_R64G64B64A64_SFLOAT, VK_FORMAT_R64G64B64A64_SINT, VK_FORMAT_R64G64B64A64_UINT, VK_FORMAT_R64G64B64_SFLOAT, VK_FORMAT_R64G64B64_SINT, VK_FORMAT_R64G64B64_UINT, VK_FORMAT_R64G64_SFLOAT, VK_FORMAT_R64G64_SINT, VK_FORMAT_R64G64_UINT, VK_FORMAT_R64_SFLOAT, VK_FORMAT_R64_SINT, VK_FORMAT_R64_UINT, VK_FORMAT_R8G8B8A8_SINT, VK_FORMAT_R8G8B8A8_SNORM, VK_FORMAT_R8G8B8A8_SRGB, VK_FORMAT_R8G8B8A8_UINT, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_R8G8B8_SINT, VK_FORMAT_R8G8B8_SNORM, VK_FORMAT_R8G8B8_SRGB, VK_FORMAT_R8G8B8_UINT, VK_FORMAT_R8G8B8_UNORM, VK_FORMAT_R8G8_SINT, VK_FORMAT_R8G8_SNORM, VK_FORMAT_R8G8_SRGB, VK_FORMAT_R8G8_UINT, VK_FORMAT_R8G8_UNORM, VK_FORMAT_R8_SINT, VK_FORMAT_R8_SNORM, VK_FORMAT_R8_SRGB, VK_FORMAT_R8_UINT, VK_FORMAT_R8_UNORM, VK_FORMAT_S8_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_X8_D24_UNORM_PACK32, createDefaultContainer, read, write };\n//# sourceMappingURL=ktx-parse.modern.js.map\n","import { ExtensionProperty, PropertyType, RefMap, Extension, BufferUtils, WriterContext, Primitive, Root, AnimationSampler, AnimationChannel, Accessor, MathUtils, GLB_BUFFER, ImageUtils, getBounds, TextureInfo, TextureChannel, RefSet } from '@gltf-transform/core';\nimport { read, KHR_DF_MODEL_ETC1S, KHR_DF_MODEL_UASTC } from 'ktx-parse';\n\nconst EXT_MESH_GPU_INSTANCING = 'EXT_mesh_gpu_instancing';\nconst EXT_MESHOPT_COMPRESSION = 'EXT_meshopt_compression';\nconst EXT_TEXTURE_WEBP = 'EXT_texture_webp';\nconst EXT_TEXTURE_AVIF = 'EXT_texture_avif';\nconst KHR_DRACO_MESH_COMPRESSION = 'KHR_draco_mesh_compression';\nconst KHR_LIGHTS_PUNCTUAL = 'KHR_lights_punctual';\nconst KHR_MATERIALS_ANISOTROPY = 'KHR_materials_anisotropy';\nconst KHR_MATERIALS_CLEARCOAT = 'KHR_materials_clearcoat';\nconst KHR_MATERIALS_DIFFUSE_TRANSMISSION = 'KHR_materials_diffuse_transmission';\nconst KHR_MATERIALS_DISPERSION = 'KHR_materials_dispersion';\nconst KHR_MATERIALS_EMISSIVE_STRENGTH = 'KHR_materials_emissive_strength';\nconst KHR_MATERIALS_IOR = 'KHR_materials_ior';\nconst KHR_MATERIALS_IRIDESCENCE = 'KHR_materials_iridescence';\nconst KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS = 'KHR_materials_pbrSpecularGlossiness';\nconst KHR_MATERIALS_SHEEN = 'KHR_materials_sheen';\nconst KHR_MATERIALS_SPECULAR = 'KHR_materials_specular';\nconst KHR_MATERIALS_TRANSMISSION = 'KHR_materials_transmission';\nconst KHR_MATERIALS_UNLIT = 'KHR_materials_unlit';\nconst KHR_MATERIALS_VOLUME = 'KHR_materials_volume';\nconst KHR_MATERIALS_VARIANTS = 'KHR_materials_variants';\nconst KHR_MESH_QUANTIZATION = 'KHR_mesh_quantization';\nconst KHR_TEXTURE_BASISU = 'KHR_texture_basisu';\nconst KHR_TEXTURE_TRANSFORM = 'KHR_texture_transform';\nconst KHR_XMP_JSON_LD = 'KHR_xmp_json_ld';\n\n// See BufferViewUsage in `writer-context.ts`.\nconst INSTANCE_ATTRIBUTE = 'INSTANCE_ATTRIBUTE';\n/**\n * Defines GPU instances of a {@link Mesh} under one {@link Node}. See {@link EXTMeshGPUInstancing}.\n */\nclass InstancedMesh extends ExtensionProperty {\n init() {\n this.extensionName = EXT_MESH_GPU_INSTANCING;\n this.propertyType = 'InstancedMesh';\n this.parentTypes = [PropertyType.NODE];\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n attributes: new RefMap()\n });\n }\n /** Returns an instance attribute as an {@link Accessor}. */\n getAttribute(semantic) {\n return this.getRefMap('attributes', semantic);\n }\n /**\n * Sets an instance attribute to an {@link Accessor}. All attributes must have the same\n * instance count.\n */\n setAttribute(semantic, accessor) {\n return this.setRefMap('attributes', semantic, accessor, {\n usage: INSTANCE_ATTRIBUTE\n });\n }\n /**\n * Lists all instance attributes {@link Accessor}s associated with the InstancedMesh. Order\n * will be consistent with the order returned by {@link .listSemantics}().\n */\n listAttributes() {\n return this.listRefMapValues('attributes');\n }\n /**\n * Lists all instance attribute semantics associated with the primitive. Order will be\n * consistent with the order returned by {@link .listAttributes}().\n */\n listSemantics() {\n return this.listRefMapKeys('attributes');\n }\n}\nInstancedMesh.EXTENSION_NAME = EXT_MESH_GPU_INSTANCING;\n\nconst NAME$o = EXT_MESH_GPU_INSTANCING;\n/**\n * [`EXT_mesh_gpu_instancing`](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing/)\n * prepares mesh data for efficient GPU instancing.\n *\n * GPU instancing allows engines to render many copies of a single mesh at once using a small number\n * of draw calls. Instancing is particularly useful for things like trees, grass, road signs, etc.\n * Keep in mind that predefined batches, as used in this extension, may prevent frustum culling\n * within a batch. Dividing batches into collocated cells may be preferable to using a single large\n * batch.\n *\n * > _**NOTICE:** While this extension stores mesh data optimized for GPU instancing, it\n * > is important to note that (1) GPU instancing and other optimizations are possible — and\n * > encouraged — even without this extension, and (2) other common meanings of the term\n * > \"instancing\" exist, distinct from this extension. See\n * > [Appendix: Motivation and Purpose](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing#appendix-motivation-and-purpose)\n * > of the `EXT_mesh_gpu_instancing` specification._\n *\n * Properties:\n * - {@link InstancedMesh}\n *\n * ### Example\n *\n * The `EXTMeshGPUInstancing` class provides a single {@link ExtensionProperty} type, `InstancedMesh`,\n * which may be attached to any {@link Node} instance. For example:\n *\n * ```typescript\n * import { EXTMeshGPUInstancing } from '@gltf-transform/extensions';\n *\n * // Create standard mesh, node, and scene hierarchy.\n * // ...\n *\n * // Assign positions for each instance.\n * const batchPositions = doc.createAccessor('instance_positions')\n * \t.setArray(new Float32Array([\n * \t\t0, 0, 0,\n * \t\t1, 0, 0,\n * \t\t2, 0, 0,\n * \t]))\n * \t.setType(Accessor.Type.VEC3)\n * \t.setBuffer(buffer);\n *\n * // Assign IDs for each instance.\n * const batchIDs = doc.createAccessor('instance_ids')\n * \t.setArray(new Uint8Array([0, 1, 2]))\n * \t.setType(Accessor.Type.SCALAR)\n * \t.setBuffer(buffer);\n *\n * // Create an Extension attached to the Document.\n * const batchExtension = document.createExtension(EXTMeshGPUInstancing)\n * \t.setRequired(true);\n * const batch = batchExtension.createInstancedMesh()\n * \t.setAttribute('TRANSLATION', batchPositions)\n * \t.setAttribute('_ID', batchIDs);\n *\n * node\n * \t.setMesh(mesh)\n * \t.setExtension('EXT_mesh_gpu_instancing', batch);\n * ```\n *\n * Standard instance attributes are `TRANSLATION`, `ROTATION`, and `SCALE`, and support the accessor\n * types allowed by the extension specification. Custom instance attributes are allowed, and should\n * be prefixed with an underscore (`_*`).\n */\nclass EXTMeshGPUInstancing extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$o;\n /** @hidden */\n this.provideTypes = [PropertyType.NODE];\n /** @hidden */\n this.prewriteTypes = [PropertyType.ACCESSOR];\n }\n /** Creates a new InstancedMesh property for use on a {@link Node}. */\n createInstancedMesh() {\n return new InstancedMesh(this.document.getGraph());\n }\n /** @hidden */\n read(context) {\n const jsonDoc = context.jsonDoc;\n const nodeDefs = jsonDoc.json.nodes || [];\n nodeDefs.forEach((nodeDef, nodeIndex) => {\n if (!nodeDef.extensions || !nodeDef.extensions[NAME$o]) return;\n const instancedMeshDef = nodeDef.extensions[NAME$o];\n const instancedMesh = this.createInstancedMesh();\n for (const semantic in instancedMeshDef.attributes) {\n instancedMesh.setAttribute(semantic, context.accessors[instancedMeshDef.attributes[semantic]]);\n }\n context.nodes[nodeIndex].setExtension(NAME$o, instancedMesh);\n });\n return this;\n }\n /** @hidden */\n prewrite(context) {\n // Set usage for instance attribute accessors, so they are stored in separate buffer\n // views grouped by parent reference.\n context.accessorUsageGroupedByParent.add(INSTANCE_ATTRIBUTE);\n for (const prop of this.properties) {\n for (const attribute of prop.listAttributes()) {\n context.addAccessorToUsageGroup(attribute, INSTANCE_ATTRIBUTE);\n }\n }\n return this;\n }\n /** @hidden */\n write(context) {\n const jsonDoc = context.jsonDoc;\n this.document.getRoot().listNodes().forEach(node => {\n const instancedMesh = node.getExtension(NAME$o);\n if (instancedMesh) {\n const nodeIndex = context.nodeIndexMap.get(node);\n const nodeDef = jsonDoc.json.nodes[nodeIndex];\n const instancedMeshDef = {\n attributes: {}\n };\n instancedMesh.listSemantics().forEach(semantic => {\n const attribute = instancedMesh.getAttribute(semantic);\n instancedMeshDef.attributes[semantic] = context.accessorIndexMap.get(attribute);\n });\n nodeDef.extensions = nodeDef.extensions || {};\n nodeDef.extensions[NAME$o] = instancedMeshDef;\n }\n });\n return this;\n }\n}\nEXTMeshGPUInstancing.EXTENSION_NAME = NAME$o;\n\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\n\nvar EncoderMethod$1;\n(function (EncoderMethod) {\n EncoderMethod[\"QUANTIZE\"] = \"quantize\";\n EncoderMethod[\"FILTER\"] = \"filter\";\n})(EncoderMethod$1 || (EncoderMethod$1 = {}));\nvar MeshoptMode;\n(function (MeshoptMode) {\n MeshoptMode[\"ATTRIBUTES\"] = \"ATTRIBUTES\";\n MeshoptMode[\"TRIANGLES\"] = \"TRIANGLES\";\n MeshoptMode[\"INDICES\"] = \"INDICES\";\n})(MeshoptMode || (MeshoptMode = {}));\nvar MeshoptFilter;\n(function (MeshoptFilter) {\n /** No filter — quantize only. */\n MeshoptFilter[\"NONE\"] = \"NONE\";\n /** Four 8- or 16-bit normalized values. */\n MeshoptFilter[\"OCTAHEDRAL\"] = \"OCTAHEDRAL\";\n /** Four 16-bit normalized values. */\n MeshoptFilter[\"QUATERNION\"] = \"QUATERNION\";\n /** K single-precision floating point values. */\n MeshoptFilter[\"EXPONENTIAL\"] = \"EXPONENTIAL\";\n})(MeshoptFilter || (MeshoptFilter = {}));\n\nconst {\n BYTE,\n SHORT,\n FLOAT\n} = Accessor.ComponentType;\nconst {\n encodeNormalizedInt,\n decodeNormalizedInt\n} = MathUtils;\n/** Pre-processes array with required filters or padding. */\nfunction prepareAccessor(accessor, encoder, mode, filterOptions) {\n const {\n filter,\n bits\n } = filterOptions;\n const result = {\n array: accessor.getArray(),\n byteStride: accessor.getElementSize() * accessor.getComponentSize(),\n componentType: accessor.getComponentType(),\n normalized: accessor.getNormalized()\n };\n if (mode !== MeshoptMode.ATTRIBUTES) return result;\n if (filter !== MeshoptFilter.NONE) {\n let array = accessor.getNormalized() ? decodeNormalizedIntArray(accessor) : new Float32Array(result.array);\n switch (filter) {\n case MeshoptFilter.EXPONENTIAL:\n // → K single-precision floating point values.\n result.byteStride = accessor.getElementSize() * 4;\n result.componentType = FLOAT;\n result.normalized = false;\n result.array = encoder.encodeFilterExp(array, accessor.getCount(), result.byteStride, bits);\n break;\n case MeshoptFilter.OCTAHEDRAL:\n // → four 8- or 16-bit normalized values.\n result.byteStride = bits > 8 ? 8 : 4;\n result.componentType = bits > 8 ? SHORT : BYTE;\n result.normalized = true;\n array = accessor.getElementSize() === 3 ? padNormals(array) : array;\n result.array = encoder.encodeFilterOct(array, accessor.getCount(), result.byteStride, bits);\n break;\n case MeshoptFilter.QUATERNION:\n // → four 16-bit normalized values.\n result.byteStride = 8;\n result.componentType = SHORT;\n result.normalized = true;\n result.array = encoder.encodeFilterQuat(array, accessor.getCount(), result.byteStride, bits);\n break;\n default:\n throw new Error('Invalid filter.');\n }\n result.min = accessor.getMin([]);\n result.max = accessor.getMax([]);\n if (accessor.getNormalized()) {\n result.min = result.min.map(v => decodeNormalizedInt(v, accessor.getComponentType()));\n result.max = result.max.map(v => decodeNormalizedInt(v, accessor.getComponentType()));\n }\n if (result.normalized) {\n result.min = result.min.map(v => encodeNormalizedInt(v, result.componentType));\n result.max = result.max.map(v => encodeNormalizedInt(v, result.componentType));\n }\n } else if (result.byteStride % 4) {\n result.array = padArrayElements(result.array, accessor.getElementSize());\n result.byteStride = result.array.byteLength / accessor.getCount();\n }\n return result;\n}\nfunction decodeNormalizedIntArray(attribute) {\n const componentType = attribute.getComponentType();\n const srcArray = attribute.getArray();\n const dstArray = new Float32Array(srcArray.length);\n for (let i = 0; i < srcArray.length; i++) {\n dstArray[i] = decodeNormalizedInt(srcArray[i], componentType);\n }\n return dstArray;\n}\n/** Pads array to 4 byte alignment, required for Meshopt ATTRIBUTE buffer views. */\nfunction padArrayElements(srcArray, elementSize) {\n const byteStride = BufferUtils.padNumber(srcArray.BYTES_PER_ELEMENT * elementSize);\n const elementStride = byteStride / srcArray.BYTES_PER_ELEMENT;\n const elementCount = srcArray.length / elementSize;\n const dstArray = new srcArray.constructor(elementCount * elementStride);\n for (let i = 0; i * elementSize < srcArray.length; i++) {\n for (let j = 0; j < elementSize; j++) {\n dstArray[i * elementStride + j] = srcArray[i * elementSize + j];\n }\n }\n return dstArray;\n}\n/** Pad normals with a .w component for octahedral encoding. */\nfunction padNormals(srcArray) {\n const dstArray = new Float32Array(srcArray.length * 4 / 3);\n for (let i = 0, il = srcArray.length / 3; i < il; i++) {\n dstArray[i * 4] = srcArray[i * 3];\n dstArray[i * 4 + 1] = srcArray[i * 3 + 1];\n dstArray[i * 4 + 2] = srcArray[i * 3 + 2];\n }\n return dstArray;\n}\nfunction getMeshoptMode(accessor, usage) {\n if (usage === WriterContext.BufferViewUsage.ELEMENT_ARRAY_BUFFER) {\n const isTriangles = accessor.listParents().some(parent => {\n return parent instanceof Primitive && parent.getMode() === Primitive.Mode.TRIANGLES;\n });\n return isTriangles ? MeshoptMode.TRIANGLES : MeshoptMode.INDICES;\n }\n return MeshoptMode.ATTRIBUTES;\n}\nfunction getMeshoptFilter(accessor, doc) {\n const refs = doc.getGraph().listParentEdges(accessor).filter(edge => !(edge.getParent() instanceof Root));\n for (const ref of refs) {\n const refName = ref.getName();\n const refKey = ref.getAttributes().key || '';\n const isDelta = ref.getParent().propertyType === PropertyType.PRIMITIVE_TARGET;\n // Indices.\n if (refName === 'indices') return {\n filter: MeshoptFilter.NONE\n };\n // Attributes.\n //\n // NOTES:\n // - Vertex attributes should be filtered IFF they are _not_ quantized in\n // 'packages/cli/src/transforms/meshopt.ts'.\n // - POSITION and TEXCOORD_0 could use exponential filtering, but this produces broken\n // output in some cases (e.g. Matilda.glb), for unknown reasons. gltfpack uses manual\n // quantization for these attributes.\n // - NORMAL and TANGENT attributes use Octahedral filters, but deltas in morphs do not.\n // - When specifying bit depth for vertex attributes, check the defaults in `quantize.ts`\n //\t and overrides in `meshopt.ts`. Don't store deltas at higher precision than base.\n if (refName === 'attributes') {\n if (refKey === 'POSITION') return {\n filter: MeshoptFilter.NONE\n };\n if (refKey === 'TEXCOORD_0') return {\n filter: MeshoptFilter.NONE\n };\n if (refKey.startsWith('JOINTS_')) return {\n filter: MeshoptFilter.NONE\n };\n if (refKey.startsWith('WEIGHTS_')) return {\n filter: MeshoptFilter.NONE\n };\n if (refKey === 'NORMAL' || refKey === 'TANGENT') {\n return isDelta ? {\n filter: MeshoptFilter.NONE\n } : {\n filter: MeshoptFilter.OCTAHEDRAL,\n bits: 8\n };\n }\n }\n // Animation.\n if (refName === 'output') {\n const targetPath = getTargetPath(accessor);\n if (targetPath === 'rotation') return {\n filter: MeshoptFilter.QUATERNION,\n bits: 16\n };\n if (targetPath === 'translation') return {\n filter: MeshoptFilter.EXPONENTIAL,\n bits: 12\n };\n if (targetPath === 'scale') return {\n filter: MeshoptFilter.EXPONENTIAL,\n bits: 12\n };\n return {\n filter: MeshoptFilter.NONE\n };\n }\n // See: https://github.com/donmccurdy/glTF-Transform/issues/489\n if (refName === 'input') return {\n filter: MeshoptFilter.NONE\n };\n if (refName === 'inverseBindMatrices') return {\n filter: MeshoptFilter.NONE\n };\n }\n return {\n filter: MeshoptFilter.NONE\n };\n}\nfunction getTargetPath(accessor) {\n for (const sampler of accessor.listParents()) {\n if (!(sampler instanceof AnimationSampler)) continue;\n for (const channel of sampler.listParents()) {\n if (!(channel instanceof AnimationChannel)) continue;\n return channel.getTargetPath();\n }\n }\n return null;\n}\n\n/**\n * Returns true for a fallback buffer, else false.\n *\n * - All references to the fallback buffer must come from bufferViews that\n * have a EXT_meshopt_compression extension specified.\n * - No references to the fallback buffer may come from\n * EXT_meshopt_compression extension JSON.\n */\nfunction isFallbackBuffer(bufferDef) {\n if (!bufferDef.extensions || !bufferDef.extensions[EXT_MESHOPT_COMPRESSION]) return false;\n const fallbackDef = bufferDef.extensions[EXT_MESHOPT_COMPRESSION];\n return !!fallbackDef.fallback;\n}\n\nconst NAME$n = EXT_MESHOPT_COMPRESSION;\nconst DEFAULT_ENCODER_OPTIONS$1 = {\n method: EncoderMethod$1.QUANTIZE\n};\n/**\n * [`EXT_meshopt_compression`](https://github.com/KhronosGroup/gltf/blob/main/extensions/2.0/Vendor/EXT_meshopt_compression/)\n * provides compression and fast decoding for geometry, morph targets, and animations.\n *\n * Meshopt compression (based on the [meshoptimizer](https://github.com/zeux/meshoptimizer)\n * library) offers a lightweight decoder with very fast runtime decompression, and is\n * appropriate for models of any size. Meshopt can reduce the transmission sizes of geometry,\n * morph targets, animation, and other numeric data stored in buffer views. When textures are\n * large, other complementary compression methods should be used as well.\n *\n * For the full benefits of meshopt compression, **apply gzip, brotli, or another lossless\n * compression method** to the resulting .glb, .gltf, or .bin files. Meshopt specifically\n * pre-optimizes assets for this purpose — without this secondary compression, the size\n * reduction is considerably less.\n *\n * Be aware that decompression happens before uploading to the GPU. While Meshopt decoding is\n * considerably faster than Draco decoding, neither compression method will improve runtime\n * performance directly. To improve framerate, you'll need to simplify the geometry by reducing\n * vertex count or draw calls — not just compress it. Finally, be aware that Meshopt compression is\n * lossy: repeatedly compressing and decompressing a model in a pipeline will lose precision, so\n * compression should generally be the last stage of an art workflow, and uncompressed original\n * files should be kept.\n *\n * The meshoptimizer library ([github](https://github.com/zeux/meshoptimizer/tree/master/js),\n * [npm](https://www.npmjs.com/package/meshoptimizer)) is a required dependency for reading or\n * writing files, and must be provided by the application. Compression may alternatively be applied\n * with the [gltfpack](https://github.com/zeux/meshoptimizer/tree/master/gltf) tool.\n *\n * ### Example — Read\n *\n * To read glTF files using Meshopt compression, ensure that the extension\n * and a decoder are registered. Geometry and other data are decompressed\n * while reading the file.\n *\n * ```typescript\n * import { NodeIO } from '@gltf-transform/core';\n * import { EXTMeshoptCompression } from '@gltf-transform/extensions';\n * import { MeshoptDecoder } from 'meshoptimizer';\n *\n * await MeshoptDecoder.ready;\n *\n * const io = new NodeIO()\n * \t.registerExtensions([EXTMeshoptCompression])\n * \t.registerDependencies({ 'meshopt.decoder': MeshoptDecoder });\n *\n * // Read and decode.\n * const document = await io.read('compressed.glb');\n * ```\n *\n * ### Example — Write\n *\n * The simplest way to apply Meshopt compression is with the {@link meshopt}\n * transform. The extension and an encoder must be registered.\n *\n * ```typescript\n * import { NodeIO } from '@gltf-transform/core';\n * import { EXTMeshoptCompression } from '@gltf-transform/extensions';\n * import { meshopt } from '@gltf-transform/functions';\n * import { MeshoptEncoder } from 'meshoptimizer';\n *\n * await MeshoptEncoder.ready;\n *\n * const io = new NodeIO()\n * \t.registerExtensions([EXTMeshoptCompression])\n * \t.registerDependencies({ 'meshopt.encoder': MeshoptEncoder });\n *\n * await document.transform(\n * meshopt({encoder: MeshoptEncoder, level: 'medium'})\n * );\n *\n * await io.write('compressed-medium.glb', document);\n * ```\n *\n * ### Example — Advanced\n *\n * Internally, the {@link meshopt} transform reorders and quantizes vertex data\n * to preparate for compression. If you prefer different pre-processing, the\n * EXTMeshoptCompression extension can be added to the document manually:\n *\n * ```typescript\n * import { reorder, quantize } from '@gltf-transform/functions';\n * import { EXTMeshoptCompression } from '@gltf-transform/extensions';\n * import { MeshoptEncoder } from 'meshoptimizer';\n *\n * await document.transform(\n * \treorder({encoder: MeshoptEncoder}),\n * \tquantize()\n * );\n *\n * document.createExtension(EXTMeshoptCompression)\n * \t.setRequired(true)\n * \t.setEncoderOptions({ method: EXTMeshoptCompression.EncoderMethod.QUANTIZE });\n * ```\n *\n * In either case, compression is deferred until generating output with an I/O\n * class.\n */\nclass EXTMeshoptCompression extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$n;\n /** @hidden */\n this.prereadTypes = [PropertyType.BUFFER, PropertyType.PRIMITIVE];\n /** @hidden */\n this.prewriteTypes = [PropertyType.BUFFER, PropertyType.ACCESSOR];\n /** @hidden */\n this.readDependencies = ['meshopt.decoder'];\n /** @hidden */\n this.writeDependencies = ['meshopt.encoder'];\n this._decoder = null;\n this._decoderFallbackBufferMap = new Map();\n this._encoder = null;\n this._encoderOptions = DEFAULT_ENCODER_OPTIONS$1;\n this._encoderFallbackBuffer = null;\n this._encoderBufferViews = {};\n this._encoderBufferViewData = {};\n this._encoderBufferViewAccessors = {};\n }\n /** @hidden */\n install(key, dependency) {\n if (key === 'meshopt.decoder') {\n this._decoder = dependency;\n }\n if (key === 'meshopt.encoder') {\n this._encoder = dependency;\n }\n return this;\n }\n /**\n * Configures Meshopt options for quality/compression tuning. The two methods rely on different\n * pre-processing before compression, and should be compared on the basis of (a) quality/loss\n * and (b) final asset size after _also_ applying a lossless compression such as gzip or brotli.\n *\n * - QUANTIZE: Default. Pre-process with {@link quantize quantize()} (lossy to specified\n * \tprecision) before applying lossless Meshopt compression. Offers a considerable compression\n * \tratio with or without further supercompression. Equivalent to `gltfpack -c`.\n * - FILTER: Pre-process with lossy filters to improve compression, before applying lossless\n *\tMeshopt compression. While output may initially be larger than with the QUANTIZE method,\n *\tthis method will benefit more from supercompression (e.g. gzip or brotli). Equivalent to\n * \t`gltfpack -cc`.\n *\n * Output with the FILTER method will generally be smaller after supercompression (e.g. gzip or\n * brotli) is applied, but may be larger than QUANTIZE output without it. Decoding is very fast\n * with both methods.\n *\n * Example:\n *\n * ```ts\n * import { EXTMeshoptCompression } from '@gltf-transform/extensions';\n *\n * doc.createExtension(EXTMeshoptCompression)\n * \t.setRequired(true)\n * \t.setEncoderOptions({\n * \t\tmethod: EXTMeshoptCompression.EncoderMethod.QUANTIZE\n * \t});\n * ```\n */\n setEncoderOptions(options) {\n this._encoderOptions = _extends({}, DEFAULT_ENCODER_OPTIONS$1, options);\n return this;\n }\n /**********************************************************************************************\n * Decoding.\n */\n /** @internal Checks preconditions, decodes buffer views, and creates decoded primitives. */\n preread(context, propertyType) {\n if (!this._decoder) {\n if (!this.isRequired()) return this;\n throw new Error(`[${NAME$n}] Please install extension dependency, \"meshopt.decoder\".`);\n }\n if (!this._decoder.supported) {\n if (!this.isRequired()) return this;\n throw new Error(`[${NAME$n}]: Missing WASM support.`);\n }\n if (propertyType === PropertyType.BUFFER) {\n this._prereadBuffers(context);\n } else if (propertyType === PropertyType.PRIMITIVE) {\n this._prereadPrimitives(context);\n }\n return this;\n }\n /** @internal Decode buffer views. */\n _prereadBuffers(context) {\n const jsonDoc = context.jsonDoc;\n const viewDefs = jsonDoc.json.bufferViews || [];\n viewDefs.forEach((viewDef, index) => {\n if (!viewDef.extensions || !viewDef.extensions[NAME$n]) return;\n const meshoptDef = viewDef.extensions[NAME$n];\n const byteOffset = meshoptDef.byteOffset || 0;\n const byteLength = meshoptDef.byteLength || 0;\n const count = meshoptDef.count;\n const stride = meshoptDef.byteStride;\n const result = new Uint8Array(count * stride);\n const bufferDef = jsonDoc.json.buffers[meshoptDef.buffer];\n // TODO(cleanup): Should be encapsulated in writer-context.ts.\n const resource = bufferDef.uri ? jsonDoc.resources[bufferDef.uri] : jsonDoc.resources[GLB_BUFFER];\n const source = BufferUtils.toView(resource, byteOffset, byteLength);\n this._decoder.decodeGltfBuffer(result, count, stride, source, meshoptDef.mode, meshoptDef.filter);\n context.bufferViews[index] = result;\n });\n }\n /**\n * Mark fallback buffers and replacements.\n *\n * Note: Alignment with primitives is arbitrary; this just needs to happen\n * after Buffers have been parsed.\n * @internal\n */\n _prereadPrimitives(context) {\n const jsonDoc = context.jsonDoc;\n const viewDefs = jsonDoc.json.bufferViews || [];\n //\n viewDefs.forEach(viewDef => {\n if (!viewDef.extensions || !viewDef.extensions[NAME$n]) return;\n const meshoptDef = viewDef.extensions[NAME$n];\n const buffer = context.buffers[meshoptDef.buffer];\n const fallbackBuffer = context.buffers[viewDef.buffer];\n const fallbackBufferDef = jsonDoc.json.buffers[viewDef.buffer];\n if (isFallbackBuffer(fallbackBufferDef)) {\n this._decoderFallbackBufferMap.set(fallbackBuffer, buffer);\n }\n });\n }\n /** @hidden Removes Fallback buffers, if extension is required. */\n read(_context) {\n if (!this.isRequired()) return this;\n // Replace fallback buffers.\n for (const [fallbackBuffer, buffer] of this._decoderFallbackBufferMap) {\n for (const parent of fallbackBuffer.listParents()) {\n if (parent instanceof Accessor) {\n parent.swap(fallbackBuffer, buffer);\n }\n }\n fallbackBuffer.dispose();\n }\n return this;\n }\n /**********************************************************************************************\n * Encoding.\n */\n /** @internal Claims accessors that can be compressed and writes compressed buffer views. */\n prewrite(context, propertyType) {\n if (propertyType === PropertyType.ACCESSOR) {\n this._prewriteAccessors(context);\n } else if (propertyType === PropertyType.BUFFER) {\n this._prewriteBuffers(context);\n }\n return this;\n }\n /** @internal Claims accessors that can be compressed. */\n _prewriteAccessors(context) {\n const json = context.jsonDoc.json;\n const encoder = this._encoder;\n const options = this._encoderOptions;\n const graph = this.document.getGraph();\n const fallbackBuffer = this.document.createBuffer(); // Disposed on write.\n const fallbackBufferIndex = this.document.getRoot().listBuffers().indexOf(fallbackBuffer);\n let nextID = 1;\n const parentToID = new Map();\n const getParentID = property => {\n for (const parent of graph.listParents(property)) {\n if (parent.propertyType === PropertyType.ROOT) continue;\n let id = parentToID.get(property);\n if (id === undefined) parentToID.set(property, id = nextID++);\n return id;\n }\n return -1;\n };\n this._encoderFallbackBuffer = fallbackBuffer;\n this._encoderBufferViews = {};\n this._encoderBufferViewData = {};\n this._encoderBufferViewAccessors = {};\n for (const accessor of this.document.getRoot().listAccessors()) {\n // See: https://github.com/donmccurdy/glTF-Transform/pull/323#issuecomment-898791251\n // Example: https://skfb.ly/6qAD8\n if (getTargetPath(accessor) === 'weights') continue;\n // See: https://github.com/donmccurdy/glTF-Transform/issues/289\n if (accessor.getSparse()) continue;\n const usage = context.getAccessorUsage(accessor);\n const parentID = context.accessorUsageGroupedByParent.has(usage) ? getParentID(accessor) : null;\n const mode = getMeshoptMode(accessor, usage);\n const filter = options.method === EncoderMethod$1.FILTER ? getMeshoptFilter(accessor, this.document) : {\n filter: MeshoptFilter.NONE\n };\n const preparedAccessor = prepareAccessor(accessor, encoder, mode, filter);\n const {\n array,\n byteStride\n } = preparedAccessor;\n const buffer = accessor.getBuffer();\n if (!buffer) throw new Error(`${NAME$n}: Missing buffer for accessor.`);\n const bufferIndex = this.document.getRoot().listBuffers().indexOf(buffer);\n // Buffer view grouping key.\n const key = [usage, parentID, mode, filter.filter, byteStride, bufferIndex].join(':');\n let bufferView = this._encoderBufferViews[key];\n let bufferViewData = this._encoderBufferViewData[key];\n let bufferViewAccessors = this._encoderBufferViewAccessors[key];\n // Write new buffer view, if needed.\n if (!bufferView || !bufferViewData) {\n bufferViewAccessors = this._encoderBufferViewAccessors[key] = [];\n bufferViewData = this._encoderBufferViewData[key] = [];\n bufferView = this._encoderBufferViews[key] = {\n buffer: fallbackBufferIndex,\n target: WriterContext.USAGE_TO_TARGET[usage],\n byteOffset: 0,\n byteLength: 0,\n byteStride: usage === WriterContext.BufferViewUsage.ARRAY_BUFFER ? byteStride : undefined,\n extensions: {\n [NAME$n]: {\n buffer: bufferIndex,\n byteOffset: 0,\n byteLength: 0,\n mode: mode,\n filter: filter.filter !== MeshoptFilter.NONE ? filter.filter : undefined,\n byteStride: byteStride,\n count: 0\n }\n }\n };\n }\n // Write accessor.\n const accessorDef = context.createAccessorDef(accessor);\n accessorDef.componentType = preparedAccessor.componentType;\n accessorDef.normalized = preparedAccessor.normalized;\n accessorDef.byteOffset = bufferView.byteLength;\n if (accessorDef.min && preparedAccessor.min) accessorDef.min = preparedAccessor.min;\n if (accessorDef.max && preparedAccessor.max) accessorDef.max = preparedAccessor.max;\n context.accessorIndexMap.set(accessor, json.accessors.length);\n json.accessors.push(accessorDef);\n bufferViewAccessors.push(accessorDef);\n // Update buffer view.\n bufferViewData.push(new Uint8Array(array.buffer, array.byteOffset, array.byteLength));\n bufferView.byteLength += array.byteLength;\n bufferView.extensions.EXT_meshopt_compression.count += accessor.getCount();\n }\n }\n /** @internal Writes compressed buffer views. */\n _prewriteBuffers(context) {\n const encoder = this._encoder;\n for (const key in this._encoderBufferViews) {\n const bufferView = this._encoderBufferViews[key];\n const bufferViewData = this._encoderBufferViewData[key];\n const buffer = this.document.getRoot().listBuffers()[bufferView.extensions[NAME$n].buffer];\n const otherBufferViews = context.otherBufferViews.get(buffer) || [];\n const {\n count,\n byteStride,\n mode\n } = bufferView.extensions[NAME$n];\n const srcArray = BufferUtils.concat(bufferViewData);\n const dstArray = encoder.encodeGltfBuffer(srcArray, count, byteStride, mode);\n const compressedData = BufferUtils.pad(dstArray);\n bufferView.extensions[NAME$n].byteLength = dstArray.byteLength;\n bufferViewData.length = 0;\n bufferViewData.push(compressedData);\n otherBufferViews.push(compressedData);\n context.otherBufferViews.set(buffer, otherBufferViews);\n }\n }\n /** @hidden Puts encoded data into glTF output. */\n write(context) {\n let fallbackBufferByteOffset = 0;\n // Write final encoded buffer view properties.\n for (const key in this._encoderBufferViews) {\n const bufferView = this._encoderBufferViews[key];\n const bufferViewData = this._encoderBufferViewData[key][0];\n const bufferViewIndex = context.otherBufferViewsIndexMap.get(bufferViewData);\n const bufferViewAccessors = this._encoderBufferViewAccessors[key];\n for (const accessorDef of bufferViewAccessors) {\n accessorDef.bufferView = bufferViewIndex;\n }\n const finalBufferViewDef = context.jsonDoc.json.bufferViews[bufferViewIndex];\n const compressedByteOffset = finalBufferViewDef.byteOffset || 0;\n Object.assign(finalBufferViewDef, bufferView);\n finalBufferViewDef.byteOffset = fallbackBufferByteOffset;\n const bufferViewExtensionDef = finalBufferViewDef.extensions[NAME$n];\n bufferViewExtensionDef.byteOffset = compressedByteOffset;\n fallbackBufferByteOffset += BufferUtils.padNumber(bufferView.byteLength);\n }\n // Write final fallback buffer.\n const fallbackBuffer = this._encoderFallbackBuffer;\n const fallbackBufferIndex = context.bufferIndexMap.get(fallbackBuffer);\n const fallbackBufferDef = context.jsonDoc.json.buffers[fallbackBufferIndex];\n fallbackBufferDef.byteLength = fallbackBufferByteOffset;\n fallbackBufferDef.extensions = {\n [NAME$n]: {\n fallback: true\n }\n };\n fallbackBuffer.dispose();\n return this;\n }\n}\nEXTMeshoptCompression.EXTENSION_NAME = NAME$n;\nEXTMeshoptCompression.EncoderMethod = EncoderMethod$1;\n\nconst NAME$m = EXT_TEXTURE_AVIF;\nclass AVIFImageUtils {\n match(array) {\n return array.length >= 12 && BufferUtils.decodeText(array.slice(4, 12)) === 'ftypavif';\n }\n /**\n * Probes size of AVIF or HEIC image. Assumes a single static image, without\n * orientation or other metadata that would affect dimensions.\n */\n getSize(array) {\n if (!this.match(array)) return null;\n // References:\n // - https://stackoverflow.com/questions/66222773/how-to-get-image-dimensions-from-an-avif-file\n // - https://github.com/nodeca/probe-image-size/blob/master/lib/parse_sync/avif.js\n const view = new DataView(array.buffer, array.byteOffset, array.byteLength);\n let box = unbox(view, 0);\n if (!box) return null;\n let offset = box.end;\n while (box = unbox(view, offset)) {\n if (box.type === 'meta') {\n offset = box.start + 4; // version + flags\n } else if (box.type === 'iprp' || box.type === 'ipco') {\n offset = box.start;\n } else if (box.type === 'ispe') {\n return [view.getUint32(box.start + 4), view.getUint32(box.start + 8)];\n } else if (box.type === 'mdat') {\n break; // mdat should be last, unlikely to find metadata past here.\n } else {\n offset = box.end;\n }\n }\n return null;\n }\n getChannels(_buffer) {\n return 4;\n }\n}\n/**\n * [`EXT_texture_avif`](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_avif/)\n * enables AVIF images for any material texture.\n *\n * AVIF offers greatly reduced transmission size, but\n * [requires browser support](https://caniuse.com/avif). Like PNG and JPEG, an AVIF image is\n * *fully decompressed* when uploaded to the GPU, which increases upload time and GPU memory cost.\n * For seamless uploads and minimal GPU memory cost, it is necessary to use a GPU texture format\n * like Basis Universal, with the `KHR_texture_basisu` extension.\n *\n * Defining no {@link ExtensionProperty} types, this {@link Extension} is simply attached to the\n * {@link Document}, and affects the entire Document by allowing use of the `image/avif` MIME type\n * and passing AVIF image data to the {@link Texture.setImage} method. Without the Extension, the\n * same MIME types and image data would yield an invalid glTF document, under the stricter core glTF\n * specification.\n *\n * Properties:\n * - N/A\n *\n * ### Example\n *\n * ```typescript\n * import { TextureAVIF } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const avifExtension = document.createExtension(TextureAVIF)\n * \t.setRequired(true);\n * document.createTexture('MyAVIFTexture')\n * \t.setMimeType('image/avif')\n * \t.setImage(fs.readFileSync('my-texture.avif'));\n * ```\n *\n * AVIF conversion is not done automatically when adding the extension as shown above — you must\n * convert the image data first, then pass the `.avif` payload to {@link Texture.setImage}.\n *\n * When the `EXT_texture_avif` extension is added to a file by glTF-Transform, the extension should\n * always be required. This tool does not support writing assets that \"fall back\" to optional PNG or\n * JPEG image data.\n */\nclass EXTTextureAVIF extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$m;\n /** @hidden */\n this.prereadTypes = [PropertyType.TEXTURE];\n }\n /** @hidden */\n static register() {\n ImageUtils.registerFormat('image/avif', new AVIFImageUtils());\n }\n /** @hidden */\n preread(context) {\n const textureDefs = context.jsonDoc.json.textures || [];\n textureDefs.forEach(textureDef => {\n if (textureDef.extensions && textureDef.extensions[NAME$m]) {\n textureDef.source = textureDef.extensions[NAME$m].source;\n }\n });\n return this;\n }\n /** @hidden */\n read(context) {\n return this;\n }\n /** @hidden */\n write(context) {\n const jsonDoc = context.jsonDoc;\n this.document.getRoot().listTextures().forEach(texture => {\n if (texture.getMimeType() === 'image/avif') {\n const imageIndex = context.imageIndexMap.get(texture);\n const textureDefs = jsonDoc.json.textures || [];\n textureDefs.forEach(textureDef => {\n if (textureDef.source === imageIndex) {\n textureDef.extensions = textureDef.extensions || {};\n textureDef.extensions[NAME$m] = {\n source: textureDef.source\n };\n delete textureDef.source;\n }\n });\n }\n });\n return this;\n }\n}\nEXTTextureAVIF.EXTENSION_NAME = NAME$m;\nfunction unbox(data, offset) {\n if (data.byteLength < 4 + offset) return null;\n // size includes first 4 bytes (length)\n const size = data.getUint32(offset);\n if (data.byteLength < size + offset || size < 8) return null;\n return {\n type: BufferUtils.decodeText(new Uint8Array(data.buffer, data.byteOffset + offset + 4, 4)),\n start: offset + 8,\n end: offset + size\n };\n}\n\nconst NAME$l = EXT_TEXTURE_WEBP;\nclass WEBPImageUtils {\n match(array) {\n return array.length >= 12 && array[8] === 87 && array[9] === 69 && array[10] === 66 && array[11] === 80;\n }\n getSize(array) {\n // Reference: http://tools.ietf.org/html/rfc6386\n const RIFF = BufferUtils.decodeText(array.slice(0, 4));\n const WEBP = BufferUtils.decodeText(array.slice(8, 12));\n if (RIFF !== 'RIFF' || WEBP !== 'WEBP') return null;\n const view = new DataView(array.buffer, array.byteOffset);\n // Reference: https://wiki.tcl-lang.org/page/Reading+WEBP+image+dimensions\n let offset = 12;\n while (offset < view.byteLength) {\n const chunkId = BufferUtils.decodeText(new Uint8Array([view.getUint8(offset), view.getUint8(offset + 1), view.getUint8(offset + 2), view.getUint8(offset + 3)]));\n const chunkByteLength = view.getUint32(offset + 4, true);\n if (chunkId === 'VP8 ') {\n const width = view.getInt16(offset + 14, true) & 0x3fff;\n const height = view.getInt16(offset + 16, true) & 0x3fff;\n return [width, height];\n } else if (chunkId === 'VP8L') {\n const b0 = view.getUint8(offset + 9);\n const b1 = view.getUint8(offset + 10);\n const b2 = view.getUint8(offset + 11);\n const b3 = view.getUint8(offset + 12);\n const width = 1 + ((b1 & 0x3f) << 8 | b0);\n const height = 1 + ((b3 & 0xf) << 10 | b2 << 2 | (b1 & 0xc0) >> 6);\n return [width, height];\n }\n offset += 8 + chunkByteLength + chunkByteLength % 2;\n }\n return null;\n }\n getChannels(_buffer) {\n return 4;\n }\n}\n/**\n * [`EXT_texture_webp`](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp/)\n * enables WebP images for any material texture.\n *\n * WebP offers greatly reduced transmission size, but\n * [requires browser support](https://caniuse.com/webp). Like PNG and JPEG, a WebP image is\n * *fully decompressed* when uploaded to the GPU, which increases upload time and GPU memory cost.\n * For seamless uploads and minimal GPU memory cost, it is necessary to use a GPU texture format\n * like Basis Universal, with the `KHR_texture_basisu` extension.\n *\n * Defining no {@link ExtensionProperty} types, this {@link Extension} is simply attached to the\n * {@link Document}, and affects the entire Document by allowing use of the `image/webp` MIME type\n * and passing WebP image data to the {@link Texture.setImage} method. Without the Extension, the\n * same MIME types and image data would yield an invalid glTF document, under the stricter core glTF\n * specification.\n *\n * Properties:\n * - N/A\n *\n * ### Example\n *\n * ```typescript\n * import { EXTTextureWebP } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const webpExtension = document.createExtension(EXTTextureWebP)\n * \t.setRequired(true);\n * document.createTexture('MyWebPTexture')\n * \t.setMimeType('image/webp')\n * \t.setImage(fs.readFileSync('my-texture.webp'));\n * ```\n *\n * WebP conversion is not done automatically when adding the extension as shown above — you must\n * convert the image data first, then pass the `.webp` payload to {@link Texture.setImage}.\n *\n * When the `EXT_texture_webp` extension is added to a file by glTF-Transform, the extension should\n * always be required. This tool does not support writing assets that \"fall back\" to optional PNG or\n * JPEG image data.\n */\nclass EXTTextureWebP extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$l;\n /** @hidden */\n this.prereadTypes = [PropertyType.TEXTURE];\n }\n /** @hidden */\n static register() {\n ImageUtils.registerFormat('image/webp', new WEBPImageUtils());\n }\n /** @hidden */\n preread(context) {\n const textureDefs = context.jsonDoc.json.textures || [];\n textureDefs.forEach(textureDef => {\n if (textureDef.extensions && textureDef.extensions[NAME$l]) {\n textureDef.source = textureDef.extensions[NAME$l].source;\n }\n });\n return this;\n }\n /** @hidden */\n read(context) {\n return this;\n }\n /** @hidden */\n write(context) {\n const jsonDoc = context.jsonDoc;\n this.document.getRoot().listTextures().forEach(texture => {\n if (texture.getMimeType() === 'image/webp') {\n const imageIndex = context.imageIndexMap.get(texture);\n const textureDefs = jsonDoc.json.textures || [];\n textureDefs.forEach(textureDef => {\n if (textureDef.source === imageIndex) {\n textureDef.extensions = textureDef.extensions || {};\n textureDef.extensions[NAME$l] = {\n source: textureDef.source\n };\n delete textureDef.source;\n }\n });\n }\n });\n return this;\n }\n}\nEXTTextureWebP.EXTENSION_NAME = NAME$l;\n\nconst NAME$k = KHR_DRACO_MESH_COMPRESSION;\nlet decoderModule;\n// Initialized when decoder module loads.\nlet COMPONENT_ARRAY;\nlet DATA_TYPE;\nfunction decodeGeometry(decoder, data) {\n const buffer = new decoderModule.DecoderBuffer();\n try {\n buffer.Init(data, data.length);\n const geometryType = decoder.GetEncodedGeometryType(buffer);\n if (geometryType !== decoderModule.TRIANGULAR_MESH) {\n throw new Error(`[${NAME$k}] Unknown geometry type.`);\n }\n const dracoMesh = new decoderModule.Mesh();\n const status = decoder.DecodeBufferToMesh(buffer, dracoMesh);\n if (!status.ok() || dracoMesh.ptr === 0) {\n throw new Error(`[${NAME$k}] Decoding failure.`);\n }\n return dracoMesh;\n } finally {\n decoderModule.destroy(buffer);\n }\n}\nfunction decodeIndex(decoder, mesh) {\n const numFaces = mesh.num_faces();\n const numIndices = numFaces * 3;\n let ptr;\n let indices;\n if (mesh.num_points() <= 65534) {\n const byteLength = numIndices * Uint16Array.BYTES_PER_ELEMENT;\n ptr = decoderModule._malloc(byteLength);\n decoder.GetTrianglesUInt16Array(mesh, byteLength, ptr);\n indices = new Uint16Array(decoderModule.HEAPU16.buffer, ptr, numIndices).slice();\n } else {\n const byteLength = numIndices * Uint32Array.BYTES_PER_ELEMENT;\n ptr = decoderModule._malloc(byteLength);\n decoder.GetTrianglesUInt32Array(mesh, byteLength, ptr);\n indices = new Uint32Array(decoderModule.HEAPU32.buffer, ptr, numIndices).slice();\n }\n decoderModule._free(ptr);\n return indices;\n}\nfunction decodeAttribute(decoder, mesh, attribute, accessorDef) {\n const dataType = DATA_TYPE[accessorDef.componentType];\n const ArrayCtor = COMPONENT_ARRAY[accessorDef.componentType];\n const numComponents = attribute.num_components();\n const numPoints = mesh.num_points();\n const numValues = numPoints * numComponents;\n const byteLength = numValues * ArrayCtor.BYTES_PER_ELEMENT;\n const ptr = decoderModule._malloc(byteLength);\n decoder.GetAttributeDataArrayForAllPoints(mesh, attribute, dataType, byteLength, ptr);\n // @ts-expect-error Incorrect types.\n const array = new ArrayCtor(decoderModule.HEAPF32.buffer, ptr, numValues).slice();\n decoderModule._free(ptr);\n return array;\n}\nfunction initDecoderModule(_decoderModule) {\n decoderModule = _decoderModule;\n COMPONENT_ARRAY = {\n [Accessor.ComponentType.FLOAT]: Float32Array,\n [Accessor.ComponentType.UNSIGNED_INT]: Uint32Array,\n [Accessor.ComponentType.UNSIGNED_SHORT]: Uint16Array,\n [Accessor.ComponentType.UNSIGNED_BYTE]: Uint8Array,\n [Accessor.ComponentType.SHORT]: Int16Array,\n [Accessor.ComponentType.BYTE]: Int8Array\n };\n DATA_TYPE = {\n [Accessor.ComponentType.FLOAT]: decoderModule.DT_FLOAT32,\n [Accessor.ComponentType.UNSIGNED_INT]: decoderModule.DT_UINT32,\n [Accessor.ComponentType.UNSIGNED_SHORT]: decoderModule.DT_UINT16,\n [Accessor.ComponentType.UNSIGNED_BYTE]: decoderModule.DT_UINT8,\n [Accessor.ComponentType.SHORT]: decoderModule.DT_INT16,\n [Accessor.ComponentType.BYTE]: decoderModule.DT_INT8\n };\n}\n\nlet encoderModule;\nvar EncoderMethod;\n(function (EncoderMethod) {\n EncoderMethod[EncoderMethod[\"EDGEBREAKER\"] = 1] = \"EDGEBREAKER\";\n EncoderMethod[EncoderMethod[\"SEQUENTIAL\"] = 0] = \"SEQUENTIAL\";\n})(EncoderMethod || (EncoderMethod = {}));\nvar AttributeEnum;\n(function (AttributeEnum) {\n AttributeEnum[\"POSITION\"] = \"POSITION\";\n AttributeEnum[\"NORMAL\"] = \"NORMAL\";\n AttributeEnum[\"COLOR\"] = \"COLOR\";\n AttributeEnum[\"TEX_COORD\"] = \"TEX_COORD\";\n AttributeEnum[\"GENERIC\"] = \"GENERIC\";\n})(AttributeEnum || (AttributeEnum = {}));\nconst DEFAULT_QUANTIZATION_BITS = {\n [AttributeEnum.POSITION]: 14,\n [AttributeEnum.NORMAL]: 10,\n [AttributeEnum.COLOR]: 8,\n [AttributeEnum.TEX_COORD]: 12,\n [AttributeEnum.GENERIC]: 12\n};\nconst DEFAULT_ENCODER_OPTIONS = {\n decodeSpeed: 5,\n encodeSpeed: 5,\n method: EncoderMethod.EDGEBREAKER,\n quantizationBits: DEFAULT_QUANTIZATION_BITS,\n quantizationVolume: 'mesh'\n};\nfunction initEncoderModule(_encoderModule) {\n encoderModule = _encoderModule;\n}\n/**\n * References:\n * - https://github.com/mrdoob/three.js/blob/dev/examples/js/exporters/DRACOExporter.js\n * - https://github.com/CesiumGS/gltf-pipeline/blob/master/lib/compressDracoMeshes.js\n */\nfunction encodeGeometry(prim, _options = DEFAULT_ENCODER_OPTIONS) {\n const options = _extends({}, DEFAULT_ENCODER_OPTIONS, _options);\n options.quantizationBits = _extends({}, DEFAULT_QUANTIZATION_BITS, _options.quantizationBits);\n const builder = new encoderModule.MeshBuilder();\n const mesh = new encoderModule.Mesh();\n const encoder = new encoderModule.ExpertEncoder(mesh);\n const attributeIDs = {};\n const dracoBuffer = new encoderModule.DracoInt8Array();\n const hasMorphTargets = prim.listTargets().length > 0;\n let hasSparseAttributes = false;\n for (const semantic of prim.listSemantics()) {\n const attribute = prim.getAttribute(semantic);\n if (attribute.getSparse()) {\n hasSparseAttributes = true;\n continue;\n }\n const attributeEnum = getAttributeEnum(semantic);\n const attributeID = addAttribute(builder, attribute.getComponentType(), mesh, encoderModule[attributeEnum], attribute.getCount(), attribute.getElementSize(), attribute.getArray());\n if (attributeID === -1) throw new Error(`Error compressing \"${semantic}\" attribute.`);\n attributeIDs[semantic] = attributeID;\n if (options.quantizationVolume === 'mesh' || semantic !== 'POSITION') {\n encoder.SetAttributeQuantization(attributeID, options.quantizationBits[attributeEnum]);\n } else if (typeof options.quantizationVolume === 'object') {\n const {\n quantizationVolume\n } = options;\n const range = Math.max(quantizationVolume.max[0] - quantizationVolume.min[0], quantizationVolume.max[1] - quantizationVolume.min[1], quantizationVolume.max[2] - quantizationVolume.min[2]);\n encoder.SetAttributeExplicitQuantization(attributeID, options.quantizationBits[attributeEnum], attribute.getElementSize(), quantizationVolume.min, range);\n } else {\n throw new Error('Invalid quantization volume state.');\n }\n }\n const indices = prim.getIndices();\n if (!indices) throw new EncodingError('Primitive must have indices.');\n builder.AddFacesToMesh(mesh, indices.getCount() / 3, indices.getArray());\n encoder.SetSpeedOptions(options.encodeSpeed, options.decodeSpeed);\n encoder.SetTrackEncodedProperties(true);\n // TODO(cleanup): Use edgebreaker without deduplication if possible.\n // See https://github.com/google/draco/issues/929.\n if (options.method === EncoderMethod.SEQUENTIAL || hasMorphTargets || hasSparseAttributes) {\n encoder.SetEncodingMethod(encoderModule.MESH_SEQUENTIAL_ENCODING);\n } else {\n encoder.SetEncodingMethod(encoderModule.MESH_EDGEBREAKER_ENCODING);\n }\n // Encode, preserving vertex order for primitives with morph targets and sparse accessors.\n const byteLength = encoder.EncodeToDracoBuffer(!(hasMorphTargets || hasSparseAttributes), dracoBuffer);\n if (byteLength <= 0) throw new EncodingError('Error applying Draco compression.');\n const data = new Uint8Array(byteLength);\n for (let i = 0; i < byteLength; ++i) {\n data[i] = dracoBuffer.GetValue(i);\n }\n const numVertices = encoder.GetNumberOfEncodedPoints();\n const numIndices = encoder.GetNumberOfEncodedFaces() * 3;\n encoderModule.destroy(dracoBuffer);\n encoderModule.destroy(mesh);\n encoderModule.destroy(builder);\n encoderModule.destroy(encoder);\n return {\n numVertices,\n numIndices,\n data,\n attributeIDs\n };\n}\nfunction getAttributeEnum(semantic) {\n if (semantic === 'POSITION') {\n return AttributeEnum.POSITION;\n } else if (semantic === 'NORMAL') {\n return AttributeEnum.NORMAL;\n } else if (semantic.startsWith('COLOR_')) {\n return AttributeEnum.COLOR;\n } else if (semantic.startsWith('TEXCOORD_')) {\n return AttributeEnum.TEX_COORD;\n }\n return AttributeEnum.GENERIC;\n}\nfunction addAttribute(builder, componentType, mesh, attribute, count, itemSize, array) {\n switch (componentType) {\n case Accessor.ComponentType.UNSIGNED_BYTE:\n return builder.AddUInt8Attribute(mesh, attribute, count, itemSize, array);\n case Accessor.ComponentType.BYTE:\n return builder.AddInt8Attribute(mesh, attribute, count, itemSize, array);\n case Accessor.ComponentType.UNSIGNED_SHORT:\n return builder.AddUInt16Attribute(mesh, attribute, count, itemSize, array);\n case Accessor.ComponentType.SHORT:\n return builder.AddInt16Attribute(mesh, attribute, count, itemSize, array);\n case Accessor.ComponentType.UNSIGNED_INT:\n return builder.AddUInt32Attribute(mesh, attribute, count, itemSize, array);\n case Accessor.ComponentType.FLOAT:\n return builder.AddFloatAttribute(mesh, attribute, count, itemSize, array);\n default:\n throw new Error(`Unexpected component type, \"${componentType}\".`);\n }\n}\nclass EncodingError extends Error {}\n\nconst NAME$j = KHR_DRACO_MESH_COMPRESSION;\n/**\n * [`KHR_draco_mesh_compression`](https://github.com/KhronosGroup/gltf/blob/main/extensions/2.0/Khronos/KHR_draco_mesh_compression/)\n * provides advanced compression for mesh geometry.\n *\n * For models where geometry is a significant factor (>1 MB), Draco can reduce filesize by ~95%\n * in many cases. When animation or textures are large, other complementary compression methods\n * should be used as well. For geometry <1MB, the size of the WASM decoder library may outweigh\n * size savings.\n *\n * Be aware that decompression happens before uploading to the GPU — this will add some latency to\n * the parsing process, and means that compressing geometry with Draco does _not_ affect runtime\n * performance. To improve framerate, you'll need to simplify the geometry by reducing vertex count\n * or draw calls — not just compress it. Finally, be aware that Draco compression is lossy:\n * repeatedly compressing and decompressing a model in a pipeline will lose precision, so\n * compression should generally be the last stage of an art workflow, and uncompressed original\n * files should be kept.\n *\n * A decoder or encoder from the `draco3dgltf` npm module for Node.js (or\n * [elsewhere for web](https://stackoverflow.com/a/66978236/1314762)) is required for reading and writing,\n * and must be provided by the application.\n *\n * ### Encoding options\n *\n * Two compression methods are available: 'edgebreaker' and 'sequential'. The\n * edgebreaker method will give higher compression in general, but changes the\n * order of the model's vertices. To preserve index order, use sequential\n * compression. When a mesh uses morph targets, or a high decoding speed is\n * selected, sequential compression will automatically be chosen.\n *\n * Both speed options affect the encoder's choice of algorithms. For example, a\n * requirement for fast decoding may prevent the encoder from using the best\n * compression methods even if the encoding speed is set to 0. In general, the\n * faster of the two options limits the choice of features that can be used by the\n * encoder. Setting --decodeSpeed to be faster than the --encodeSpeed may allow\n * the encoder to choose the optimal method out of the available features for the\n * given --decodeSpeed.\n *\n * ### Example — Read\n *\n * To read glTF files using Draco compression, ensure that the extension\n * and a decoder are registered. Geometry is decompressed while reading.\n *\n * ```typescript\n * import { NodeIO } from '@gltf-transform/core';\n * import { KHRDracoMeshCompression } from '@gltf-transform/extensions';\n * import draco3d from 'draco3dgltf';\n *\n * const io = new NodeIO()\n * \t.registerExtensions([KHRDracoMeshCompression])\n * \t.registerDependencies({\n * \t\t'draco3d.decoder': await draco3d.createDecoderModule()\n * \t});\n *\n * // Read and decode.\n * const document = await io.read('compressed.glb');\n * ```\n *\n * ### Example — Write\n *\n * The simplest way to apply Draco compression is with the {@link draco}\n * transform. The extension and an encoder must be registered.\n *\n * ```typescript\n * import { NodeIO } from '@gltf-transform/core';\n * import { KHRDracoMeshCompression } from '@gltf-transform/extensions';\n * import { draco } from '@gltf-transform/functions';\n * import draco3d from 'draco3dgltf';\n *\n * const io = new NodeIO()\n * \t.registerExtensions([KHRDracoMeshCompression])\n * \t.registerDependencies({\n * \t\t'draco3d.encoder': await draco3d.createEncoderModule()\n * \t});\n *\n * await document.transform(\n * draco({method: 'edgebreaker'})\n * );\n *\n * await io.write('compressed.glb', document);\n * ```\n *\n * ### Example\n *\n * Equivalently, the KHRDracoMeshCompression extension can be added manually to a document.\n *\n * ```typescript\n * import { KHRDracoMeshCompression } from '@gltf-transform/extensions';\n *\n * document.createExtension(KHRDracoMeshCompression)\n * \t.setRequired(true)\n * \t.setEncoderOptions({\n * \t\tmethod: KHRDracoMeshCompression.EncoderMethod.EDGEBREAKER,\n * \t\tencodeSpeed: 5,\n * \t\tdecodeSpeed: 5,\n * \t});\n *\n * await io.write('compressed.glb', document);\n * ```\n *\n * In either case, Compression is deferred until generating output with an\n * I/O class.\n */\nclass KHRDracoMeshCompression extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$j;\n /** @hidden */\n this.prereadTypes = [PropertyType.PRIMITIVE];\n /** @hidden */\n this.prewriteTypes = [PropertyType.ACCESSOR];\n /** @hidden */\n this.readDependencies = ['draco3d.decoder'];\n /** @hidden */\n this.writeDependencies = ['draco3d.encoder'];\n this._decoderModule = null;\n this._encoderModule = null;\n this._encoderOptions = {};\n }\n /** @hidden */\n install(key, dependency) {\n if (key === 'draco3d.decoder') {\n this._decoderModule = dependency;\n initDecoderModule(this._decoderModule);\n }\n if (key === 'draco3d.encoder') {\n this._encoderModule = dependency;\n initEncoderModule(this._encoderModule);\n }\n return this;\n }\n /**\n * Sets Draco compression options. Compression does not take effect until the Document is\n * written with an I/O class.\n *\n * Defaults:\n * ```\n * decodeSpeed?: number = 5;\n * encodeSpeed?: number = 5;\n * method?: EncoderMethod = EncoderMethod.EDGEBREAKER;\n * quantizationBits?: {[ATTRIBUTE_NAME]: bits};\n * quantizationVolume?: 'mesh' | 'scene' | bbox = 'mesh';\n * ```\n */\n setEncoderOptions(options) {\n this._encoderOptions = options;\n return this;\n }\n /** @hidden */\n preread(context) {\n if (!this._decoderModule) {\n throw new Error(`[${NAME$j}] Please install extension dependency, \"draco3d.decoder\".`);\n }\n const logger = this.document.getLogger();\n const jsonDoc = context.jsonDoc;\n const dracoMeshes = new Map();\n try {\n const meshDefs = jsonDoc.json.meshes || [];\n for (const meshDef of meshDefs) {\n for (const primDef of meshDef.primitives) {\n if (!primDef.extensions || !primDef.extensions[NAME$j]) continue;\n const dracoDef = primDef.extensions[NAME$j];\n let [decoder, dracoMesh] = dracoMeshes.get(dracoDef.bufferView) || [];\n if (!dracoMesh || !decoder) {\n const bufferViewDef = jsonDoc.json.bufferViews[dracoDef.bufferView];\n const bufferDef = jsonDoc.json.buffers[bufferViewDef.buffer];\n // TODO(cleanup): Should be encapsulated in writer-context.ts.\n const resource = bufferDef.uri ? jsonDoc.resources[bufferDef.uri] : jsonDoc.resources[GLB_BUFFER];\n const byteOffset = bufferViewDef.byteOffset || 0;\n const byteLength = bufferViewDef.byteLength;\n const compressedData = BufferUtils.toView(resource, byteOffset, byteLength);\n decoder = new this._decoderModule.Decoder();\n dracoMesh = decodeGeometry(decoder, compressedData);\n dracoMeshes.set(dracoDef.bufferView, [decoder, dracoMesh]);\n logger.debug(`[${NAME$j}] Decompressed ${compressedData.byteLength} bytes.`);\n }\n // Attributes.\n for (const semantic in dracoDef.attributes) {\n const accessorDef = context.jsonDoc.json.accessors[primDef.attributes[semantic]];\n const dracoAttribute = decoder.GetAttributeByUniqueId(dracoMesh, dracoDef.attributes[semantic]);\n const attributeArray = decodeAttribute(decoder, dracoMesh, dracoAttribute, accessorDef);\n context.accessors[primDef.attributes[semantic]].setArray(attributeArray);\n }\n // Indices. Optional, see https://github.com/google/draco/issues/720.\n if (primDef.indices !== undefined) {\n context.accessors[primDef.indices].setArray(decodeIndex(decoder, dracoMesh));\n }\n }\n }\n } finally {\n for (const [decoder, dracoMesh] of Array.from(dracoMeshes.values())) {\n this._decoderModule.destroy(decoder);\n this._decoderModule.destroy(dracoMesh);\n }\n }\n return this;\n }\n /** @hidden */\n read(_context) {\n return this;\n }\n /** @hidden */\n prewrite(context, _propertyType) {\n if (!this._encoderModule) {\n throw new Error(`[${NAME$j}] Please install extension dependency, \"draco3d.encoder\".`);\n }\n const logger = this.document.getLogger();\n logger.debug(`[${NAME$j}] Compression options: ${JSON.stringify(this._encoderOptions)}`);\n const primitiveHashMap = listDracoPrimitives(this.document);\n const primitiveEncodingMap = new Map();\n let quantizationVolume = 'mesh';\n if (this._encoderOptions.quantizationVolume === 'scene') {\n if (this.document.getRoot().listScenes().length !== 1) {\n logger.warn(`[${NAME$j}]: quantizationVolume=scene requires exactly 1 scene.`);\n } else {\n quantizationVolume = getBounds(this.document.getRoot().listScenes().pop());\n }\n }\n for (const prim of Array.from(primitiveHashMap.keys())) {\n const primHash = primitiveHashMap.get(prim);\n if (!primHash) throw new Error('Unexpected primitive.');\n // Reuse an existing EncodedPrimitive, if possible.\n if (primitiveEncodingMap.has(primHash)) {\n primitiveEncodingMap.set(primHash, primitiveEncodingMap.get(primHash));\n continue;\n }\n const indices = prim.getIndices(); // Condition for listDracoPrimitives().\n const accessorDefs = context.jsonDoc.json.accessors;\n // Create a new EncodedPrimitive.\n let encodedPrim;\n try {\n encodedPrim = encodeGeometry(prim, _extends({}, this._encoderOptions, {\n quantizationVolume\n }));\n } catch (e) {\n if (e instanceof EncodingError) {\n logger.warn(`[${NAME$j}]: ${e.message} Skipping primitive compression.`);\n continue;\n }\n throw e;\n }\n primitiveEncodingMap.set(primHash, encodedPrim);\n // Create indices definition, update count.\n const indicesDef = context.createAccessorDef(indices);\n indicesDef.count = encodedPrim.numIndices;\n context.accessorIndexMap.set(indices, accessorDefs.length);\n accessorDefs.push(indicesDef);\n // In rare cases Draco increases vertex count, requiring a larger index component type.\n // https://github.com/donmccurdy/glTF-Transform/issues/1370\n if (encodedPrim.numVertices > 65534 && Accessor.getComponentSize(indicesDef.componentType) <= 2) {\n indicesDef.componentType = Accessor.ComponentType.UNSIGNED_INT;\n } else if (encodedPrim.numVertices > 254 && Accessor.getComponentSize(indicesDef.componentType) <= 1) {\n indicesDef.componentType = Accessor.ComponentType.UNSIGNED_SHORT;\n }\n // Create attribute definitions, update count.\n for (const semantic of prim.listSemantics()) {\n const attribute = prim.getAttribute(semantic);\n if (encodedPrim.attributeIDs[semantic] === undefined) continue; // sparse\n const attributeDef = context.createAccessorDef(attribute);\n attributeDef.count = encodedPrim.numVertices;\n context.accessorIndexMap.set(attribute, accessorDefs.length);\n accessorDefs.push(attributeDef);\n }\n // Map compressed buffer view to a Buffer.\n const buffer = prim.getAttribute('POSITION').getBuffer() || this.document.getRoot().listBuffers()[0];\n if (!context.otherBufferViews.has(buffer)) context.otherBufferViews.set(buffer, []);\n context.otherBufferViews.get(buffer).push(encodedPrim.data);\n }\n logger.debug(`[${NAME$j}] Compressed ${primitiveHashMap.size} primitives.`);\n context.extensionData[NAME$j] = {\n primitiveHashMap,\n primitiveEncodingMap\n };\n return this;\n }\n /** @hidden */\n write(context) {\n const dracoContext = context.extensionData[NAME$j];\n for (const mesh of this.document.getRoot().listMeshes()) {\n const meshDef = context.jsonDoc.json.meshes[context.meshIndexMap.get(mesh)];\n for (let i = 0; i < mesh.listPrimitives().length; i++) {\n const prim = mesh.listPrimitives()[i];\n const primDef = meshDef.primitives[i];\n const primHash = dracoContext.primitiveHashMap.get(prim);\n if (!primHash) continue;\n const encodedPrim = dracoContext.primitiveEncodingMap.get(primHash);\n if (!encodedPrim) continue;\n primDef.extensions = primDef.extensions || {};\n primDef.extensions[NAME$j] = {\n bufferView: context.otherBufferViewsIndexMap.get(encodedPrim.data),\n attributes: encodedPrim.attributeIDs\n };\n }\n }\n // Omit the extension if nothing was compressed.\n if (!dracoContext.primitiveHashMap.size) {\n const json = context.jsonDoc.json;\n json.extensionsUsed = (json.extensionsUsed || []).filter(name => name !== NAME$j);\n json.extensionsRequired = (json.extensionsRequired || []).filter(name => name !== NAME$j);\n }\n return this;\n }\n}\n/**\n * Returns a list of Primitives compatible with Draco compression. If any required preconditions\n * fail, and would break assumptions required for compression, this function will throw an error.\n */\nKHRDracoMeshCompression.EXTENSION_NAME = NAME$j;\n/**\n * Compression method. `EncoderMethod.EDGEBREAKER` usually provides a higher compression ratio,\n * while `EncoderMethod.SEQUENTIAL` better preserves original vertex order.\n */\nKHRDracoMeshCompression.EncoderMethod = EncoderMethod;\nfunction listDracoPrimitives(doc) {\n const logger = doc.getLogger();\n const included = new Set();\n const excluded = new Set();\n let nonIndexed = 0;\n let nonTriangles = 0;\n // Support compressing only indexed, mode=TRIANGLES primitives.\n for (const mesh of doc.getRoot().listMeshes()) {\n for (const prim of mesh.listPrimitives()) {\n if (!prim.getIndices()) {\n excluded.add(prim);\n nonIndexed++;\n } else if (prim.getMode() !== Primitive.Mode.TRIANGLES) {\n excluded.add(prim);\n nonTriangles++;\n } else {\n included.add(prim);\n }\n }\n }\n if (nonIndexed > 0) {\n logger.warn(`[${NAME$j}] Skipping Draco compression of ${nonIndexed} non-indexed primitives.`);\n }\n if (nonTriangles > 0) {\n logger.warn(`[${NAME$j}] Skipping Draco compression of ${nonTriangles} non-TRIANGLES primitives.`);\n }\n // Create an Accessor->index mapping.\n const accessors = doc.getRoot().listAccessors();\n const accessorIndices = new Map();\n for (let i = 0; i < accessors.length; i++) accessorIndices.set(accessors[i], i);\n // For each compressed Primitive, create a hash key identifying its accessors. Map each\n // compressed Primitive and Accessor to this hash key.\n const includedAccessors = new Map();\n const includedHashKeys = new Set();\n const primToHashKey = new Map();\n for (const prim of Array.from(included)) {\n let hashKey = createHashKey(prim, accessorIndices);\n // If accessors of an identical primitive have already been checked, we're done.\n if (includedHashKeys.has(hashKey)) {\n primToHashKey.set(prim, hashKey);\n continue;\n }\n // If any accessors are already in use, but the same hashKey hasn't been written, then we\n // need to create copies of these accessors for the current encoded primitive. We can't\n // reuse the same compressed accessor for two encoded primitives, because Draco might\n // change the vertex count, change the vertex order, or cause other conflicts.\n if (includedAccessors.has(prim.getIndices())) {\n const indices = prim.getIndices(); // Condition for 'included' list.\n const dstIndices = indices.clone();\n accessorIndices.set(dstIndices, doc.getRoot().listAccessors().length - 1);\n prim.swap(indices, dstIndices); // TODO(cleanup): I/O should not modify Document.\n }\n for (const attribute of prim.listAttributes()) {\n if (includedAccessors.has(attribute)) {\n const dstAttribute = attribute.clone();\n accessorIndices.set(dstAttribute, doc.getRoot().listAccessors().length - 1);\n prim.swap(attribute, dstAttribute); // TODO(cleanup): I/O should not modify Document.\n }\n }\n // With conflicts resolved, compute the hash key again.\n hashKey = createHashKey(prim, accessorIndices);\n // Commit the primitive and its accessors to the hash key.\n includedHashKeys.add(hashKey);\n primToHashKey.set(prim, hashKey);\n includedAccessors.set(prim.getIndices(), hashKey);\n for (const attribute of prim.listAttributes()) {\n includedAccessors.set(attribute, hashKey);\n }\n }\n // For each compressed Accessor, ensure that it isn't used except by a Primitive.\n for (const accessor of Array.from(includedAccessors.keys())) {\n const parentTypes = new Set(accessor.listParents().map(prop => prop.propertyType));\n if (parentTypes.size !== 2 || !parentTypes.has(PropertyType.PRIMITIVE) || !parentTypes.has(PropertyType.ROOT)) {\n throw new Error(`[${NAME$j}] Compressed accessors must only be used as indices or vertex attributes.`);\n }\n }\n // For each compressed Primitive, ensure that Accessors are mapped only to the same hash key.\n for (const prim of Array.from(included)) {\n const hashKey = primToHashKey.get(prim);\n const indices = prim.getIndices(); // Condition for 'included' list.\n if (includedAccessors.get(indices) !== hashKey || prim.listAttributes().some(attr => includedAccessors.get(attr) !== hashKey)) {\n throw new Error(`[${NAME$j}] Draco primitives must share all, or no, accessors.`);\n }\n }\n // For each excluded Primitive, ensure that no Accessors are compressed.\n for (const prim of Array.from(excluded)) {\n const indices = prim.getIndices(); // Condition for 'included' list.\n if (includedAccessors.has(indices) || prim.listAttributes().some(attr => includedAccessors.has(attr))) {\n throw new Error(`[${NAME$j}] Accessor cannot be shared by compressed and uncompressed primitives.`);\n }\n }\n return primToHashKey;\n}\nfunction createHashKey(prim, indexMap) {\n const hashElements = [];\n const indices = prim.getIndices(); // Condition for 'included' list.\n hashElements.push(indexMap.get(indices));\n for (const attribute of prim.listAttributes()) {\n hashElements.push(indexMap.get(attribute));\n }\n return hashElements.sort().join('|');\n}\n\n/**\n * Defines a light attached to a {@link Node}. See {@link KHRLightsPunctual}.\n */\nclass Light extends ExtensionProperty {\n /**********************************************************************************************\n * INSTANCE.\n */\n init() {\n this.extensionName = KHR_LIGHTS_PUNCTUAL;\n this.propertyType = 'Light';\n this.parentTypes = [PropertyType.NODE];\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n color: [1, 1, 1],\n intensity: 1,\n type: Light.Type.POINT,\n range: null,\n innerConeAngle: 0,\n outerConeAngle: Math.PI / 4\n });\n }\n /**********************************************************************************************\n * COLOR.\n */\n /** Light color; Linear-sRGB components. */\n getColor() {\n return this.get('color');\n }\n /** Light color; Linear-sRGB components. */\n setColor(color) {\n return this.set('color', color);\n }\n /**********************************************************************************************\n * INTENSITY.\n */\n /**\n * Brightness of light. Units depend on the type of light: point and spot lights use luminous\n * intensity in candela (lm/sr) while directional lights use illuminance in lux (lm/m2).\n */\n getIntensity() {\n return this.get('intensity');\n }\n /**\n * Brightness of light. Units depend on the type of light: point and spot lights use luminous\n * intensity in candela (lm/sr) while directional lights use illuminance in lux (lm/m2).\n */\n setIntensity(intensity) {\n return this.set('intensity', intensity);\n }\n /**********************************************************************************************\n * TYPE.\n */\n /** Type. */\n getType() {\n return this.get('type');\n }\n /** Type. */\n setType(type) {\n return this.set('type', type);\n }\n /**********************************************************************************************\n * RANGE.\n */\n /**\n * Hint defining a distance cutoff at which the light's intensity may be considered to have\n * reached zero. Supported only for point and spot lights. Must be > 0. When undefined, range\n * is assumed to be infinite.\n */\n getRange() {\n return this.get('range');\n }\n /**\n * Hint defining a distance cutoff at which the light's intensity may be considered to have\n * reached zero. Supported only for point and spot lights. Must be > 0. When undefined, range\n * is assumed to be infinite.\n */\n setRange(range) {\n return this.set('range', range);\n }\n /**********************************************************************************************\n * SPOT LIGHT PROPERTIES\n */\n /**\n * Angle, in radians, from centre of spotlight where falloff begins. Must be >= 0 and\n * < outerConeAngle.\n */\n getInnerConeAngle() {\n return this.get('innerConeAngle');\n }\n /**\n * Angle, in radians, from centre of spotlight where falloff begins. Must be >= 0 and\n * < outerConeAngle.\n */\n setInnerConeAngle(angle) {\n return this.set('innerConeAngle', angle);\n }\n /**\n * Angle, in radians, from centre of spotlight where falloff ends. Must be > innerConeAngle and\n * <= PI / 2.0.\n */\n getOuterConeAngle() {\n return this.get('outerConeAngle');\n }\n /**\n * Angle, in radians, from centre of spotlight where falloff ends. Must be > innerConeAngle and\n * <= PI / 2.0.\n */\n setOuterConeAngle(angle) {\n return this.set('outerConeAngle', angle);\n }\n}\nLight.EXTENSION_NAME = KHR_LIGHTS_PUNCTUAL;\n/**********************************************************************************************\n * CONSTANTS.\n */\nLight.Type = {\n POINT: 'point',\n SPOT: 'spot',\n DIRECTIONAL: 'directional'\n};\n\nconst NAME$i = KHR_LIGHTS_PUNCTUAL;\n/**\n * [`KHR_lights_punctual`](https://github.com/KhronosGroup/gltf/blob/main/extensions/2.0/Khronos/KHR_lights_punctual/) defines three \"punctual\" light types: directional, point and\n * spot.\n *\n * Punctual lights are parameterized, infinitely small points that emit light in\n * well-defined directions and intensities. Lights are referenced by nodes and inherit the transform\n * of that node.\n *\n * Properties:\n * - {@link Light}\n *\n * ### Example\n *\n * ```typescript\n * import { KHRLightsPunctual, Light, LightType } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const lightsExtension = document.createExtension(KHRLightsPunctual);\n *\n * // Create a Light property.\n * const light = lightsExtension.createLight()\n *\t.setType(LightType.POINT)\n *\t.setIntensity(2.0)\n *\t.setColor([1.0, 0.0, 0.0]);\n *\n * // Attach the property to a Material.\n * node.setExtension('KHR_lights_punctual', light);\n * ```\n */\nclass KHRLightsPunctual extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$i;\n }\n /** Creates a new punctual Light property for use on a {@link Node}. */\n createLight(name = '') {\n return new Light(this.document.getGraph(), name);\n }\n /** @hidden */\n read(context) {\n const jsonDoc = context.jsonDoc;\n if (!jsonDoc.json.extensions || !jsonDoc.json.extensions[NAME$i]) return this;\n const rootDef = jsonDoc.json.extensions[NAME$i];\n const lightDefs = rootDef.lights || [];\n const lights = lightDefs.map(lightDef => {\n var _lightDef$spot, _lightDef$spot2;\n const light = this.createLight().setName(lightDef.name || '').setType(lightDef.type);\n if (lightDef.color !== undefined) light.setColor(lightDef.color);\n if (lightDef.intensity !== undefined) light.setIntensity(lightDef.intensity);\n if (lightDef.range !== undefined) light.setRange(lightDef.range);\n if (((_lightDef$spot = lightDef.spot) == null ? void 0 : _lightDef$spot.innerConeAngle) !== undefined) {\n light.setInnerConeAngle(lightDef.spot.innerConeAngle);\n }\n if (((_lightDef$spot2 = lightDef.spot) == null ? void 0 : _lightDef$spot2.outerConeAngle) !== undefined) {\n light.setOuterConeAngle(lightDef.spot.outerConeAngle);\n }\n return light;\n });\n jsonDoc.json.nodes.forEach((nodeDef, nodeIndex) => {\n if (!nodeDef.extensions || !nodeDef.extensions[NAME$i]) return;\n const lightNodeDef = nodeDef.extensions[NAME$i];\n context.nodes[nodeIndex].setExtension(NAME$i, lights[lightNodeDef.light]);\n });\n return this;\n }\n /** @hidden */\n write(context) {\n const jsonDoc = context.jsonDoc;\n if (this.properties.size === 0) return this;\n const lightDefs = [];\n const lightIndexMap = new Map();\n for (const property of this.properties) {\n const light = property;\n const lightDef = {\n type: light.getType()\n };\n if (!MathUtils.eq(light.getColor(), [1, 1, 1])) lightDef.color = light.getColor();\n if (light.getIntensity() !== 1) lightDef.intensity = light.getIntensity();\n if (light.getRange() != null) lightDef.range = light.getRange();\n if (light.getName()) lightDef.name = light.getName();\n if (light.getType() === Light.Type.SPOT) {\n lightDef.spot = {\n innerConeAngle: light.getInnerConeAngle(),\n outerConeAngle: light.getOuterConeAngle()\n };\n }\n lightDefs.push(lightDef);\n lightIndexMap.set(light, lightDefs.length - 1);\n }\n this.document.getRoot().listNodes().forEach(node => {\n const light = node.getExtension(NAME$i);\n if (light) {\n const nodeIndex = context.nodeIndexMap.get(node);\n const nodeDef = jsonDoc.json.nodes[nodeIndex];\n nodeDef.extensions = nodeDef.extensions || {};\n nodeDef.extensions[NAME$i] = {\n light: lightIndexMap.get(light)\n };\n }\n });\n jsonDoc.json.extensions = jsonDoc.json.extensions || {};\n jsonDoc.json.extensions[NAME$i] = {\n lights: lightDefs\n };\n return this;\n }\n}\nKHRLightsPunctual.EXTENSION_NAME = NAME$i;\n\nconst {\n R: R$7,\n G: G$7,\n B: B$5\n} = TextureChannel;\n/**\n * Defines anisotropy (directionally-dependent reflections) on a PBR {@link Material}. See\n * {@link KHRMaterialsAnisotropy}.\n */\nclass Anisotropy extends ExtensionProperty {\n init() {\n this.extensionName = KHR_MATERIALS_ANISOTROPY;\n this.propertyType = 'Anisotropy';\n this.parentTypes = [PropertyType.MATERIAL];\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n anisotropyStrength: 0.0,\n anisotropyRotation: 0.0,\n anisotropyTexture: null,\n anisotropyTextureInfo: new TextureInfo(this.graph, 'anisotropyTextureInfo')\n });\n }\n /**********************************************************************************************\n * Anisotropy strength.\n */\n /** Anisotropy strength. */\n getAnisotropyStrength() {\n return this.get('anisotropyStrength');\n }\n /** Anisotropy strength. */\n setAnisotropyStrength(strength) {\n return this.set('anisotropyStrength', strength);\n }\n /**********************************************************************************************\n * Anisotropy rotation.\n */\n /** Anisotropy rotation; linear multiplier. */\n getAnisotropyRotation() {\n return this.get('anisotropyRotation');\n }\n /** Anisotropy rotation; linear multiplier. */\n setAnisotropyRotation(rotation) {\n return this.set('anisotropyRotation', rotation);\n }\n /**********************************************************************************************\n * Anisotropy texture.\n */\n /**\n * Anisotropy texture. Red and green channels represent the anisotropy\n * direction in [-1, 1] tangent, bitangent space, to be rotated by\n * anisotropyRotation. The blue channel contains strength as [0, 1] to be\n * multiplied by anisotropyStrength.\n */\n getAnisotropyTexture() {\n return this.getRef('anisotropyTexture');\n }\n /**\n * Settings affecting the material's use of its anisotropy texture. If no\n * texture is attached, {@link TextureInfo} is `null`.\n */\n getAnisotropyTextureInfo() {\n return this.getRef('anisotropyTexture') ? this.getRef('anisotropyTextureInfo') : null;\n }\n /** Anisotropy texture. See {@link Anisotropy.getAnisotropyTexture getAnisotropyTexture}. */\n setAnisotropyTexture(texture) {\n return this.setRef('anisotropyTexture', texture, {\n channels: R$7 | G$7 | B$5\n });\n }\n}\nAnisotropy.EXTENSION_NAME = KHR_MATERIALS_ANISOTROPY;\n\nconst NAME$h = KHR_MATERIALS_ANISOTROPY;\n/**\n * [`KHR_materials_anisotropy`](https://github.com/KhronosGroup/gltf/blob/main/extensions/2.0/Khronos/KHR_materials_anisotropy/)\n * defines anisotropy (directionally-dependent reflections) on a PBR material.\n *\n * \n *\n * > _**Figure:** Effect of each color channel in the anisotropyTexture. Left\n * > to right: the full anisotropy texture, filling the red channel with black,\n * > filling the green channel with black, filling the blue channel with black.\n * > Source: [Khronos Group & Wayfair](https://github.com/KhronosGroup/glTF-Sample-Assets/tree/main/Models/AnisotropyBarnLamp)._\n *\n * This extension defines the anisotropic property of a material as observable with brushed metals\n * for instance. An asymmetric specular lobe model is introduced to allow for such phenomena. The\n * visually distinct feature of that lobe is the elongated appearance of the specular reflection.\n * For a single punctual light source, the specular reflection will eventually degenerate into a\n * zero width line in the limit, that is where the material is fully anisotropic, as opposed to be\n * fully isotropic in which case the specular reflection is radially symmetric.\n *\n * Properties:\n * - {@link Anisotropy}\n *\n * ### Example\n *\n * The `KHRMaterialsAnisotropy` class provides a single {@link ExtensionProperty} type, `Anisotropy`,\n * which may be attached to any {@link Material} instance. For example:\n *\n * ```typescript\n * import { KHRMaterialsAnisotropy, Anisotropy } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const anisotropyExtension = document.createExtension(KHRMaterialsAnisotropy);\n *\n * // Create an Anisotropy property.\n * const anisotropy = anisotropyExtension.createAnisotropy()\n * \t.setAnisotropyStrength(1.0)\n * \t.setAnisotropyRotation(Math.PI / 4);\n *\n * // Attach the property to a Material.\n * material.setExtension('KHR_materials_anisotropy', anisotropy);\n * ```\n */\nclass KHRMaterialsAnisotropy extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$h;\n this.prereadTypes = [PropertyType.MESH];\n this.prewriteTypes = [PropertyType.MESH];\n }\n /** Creates a new Anisotropy property for use on a {@link Material}. */\n createAnisotropy() {\n return new Anisotropy(this.document.getGraph());\n }\n /** @hidden */\n read(_context) {\n return this;\n }\n /** @hidden */\n write(_context) {\n return this;\n }\n /** @hidden */\n preread(context) {\n const jsonDoc = context.jsonDoc;\n const materialDefs = jsonDoc.json.materials || [];\n const textureDefs = jsonDoc.json.textures || [];\n materialDefs.forEach((materialDef, materialIndex) => {\n if (materialDef.extensions && materialDef.extensions[NAME$h]) {\n const anisotropy = this.createAnisotropy();\n context.materials[materialIndex].setExtension(NAME$h, anisotropy);\n const anisotropyDef = materialDef.extensions[NAME$h];\n // Factors.\n if (anisotropyDef.anisotropyStrength !== undefined) {\n anisotropy.setAnisotropyStrength(anisotropyDef.anisotropyStrength);\n }\n if (anisotropyDef.anisotropyRotation !== undefined) {\n anisotropy.setAnisotropyRotation(anisotropyDef.anisotropyRotation);\n }\n // Textures.\n if (anisotropyDef.anisotropyTexture !== undefined) {\n const textureInfoDef = anisotropyDef.anisotropyTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n anisotropy.setAnisotropyTexture(texture);\n context.setTextureInfo(anisotropy.getAnisotropyTextureInfo(), textureInfoDef);\n }\n }\n });\n return this;\n }\n /** @hidden */\n prewrite(context) {\n const jsonDoc = context.jsonDoc;\n this.document.getRoot().listMaterials().forEach(material => {\n const anisotropy = material.getExtension(NAME$h);\n if (anisotropy) {\n const materialIndex = context.materialIndexMap.get(material);\n const materialDef = jsonDoc.json.materials[materialIndex];\n materialDef.extensions = materialDef.extensions || {};\n // Factors.\n const anisotropyDef = materialDef.extensions[NAME$h] = {};\n if (anisotropy.getAnisotropyStrength() > 0) {\n anisotropyDef.anisotropyStrength = anisotropy.getAnisotropyStrength();\n }\n if (anisotropy.getAnisotropyRotation() !== 0) {\n anisotropyDef.anisotropyRotation = anisotropy.getAnisotropyRotation();\n }\n // Textures.\n if (anisotropy.getAnisotropyTexture()) {\n const texture = anisotropy.getAnisotropyTexture();\n const textureInfo = anisotropy.getAnisotropyTextureInfo();\n anisotropyDef.anisotropyTexture = context.createTextureInfoDef(texture, textureInfo);\n }\n }\n });\n return this;\n }\n}\nKHRMaterialsAnisotropy.EXTENSION_NAME = NAME$h;\n\nconst {\n R: R$6,\n G: G$6,\n B: B$4\n} = TextureChannel;\n/**\n * Defines clear coat for a PBR material. See {@link KHRMaterialsClearcoat}.\n */\nclass Clearcoat extends ExtensionProperty {\n init() {\n this.extensionName = KHR_MATERIALS_CLEARCOAT;\n this.propertyType = 'Clearcoat';\n this.parentTypes = [PropertyType.MATERIAL];\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n clearcoatFactor: 0,\n clearcoatTexture: null,\n clearcoatTextureInfo: new TextureInfo(this.graph, 'clearcoatTextureInfo'),\n clearcoatRoughnessFactor: 0,\n clearcoatRoughnessTexture: null,\n clearcoatRoughnessTextureInfo: new TextureInfo(this.graph, 'clearcoatRoughnessTextureInfo'),\n clearcoatNormalScale: 1,\n clearcoatNormalTexture: null,\n clearcoatNormalTextureInfo: new TextureInfo(this.graph, 'clearcoatNormalTextureInfo')\n });\n }\n /**********************************************************************************************\n * Clearcoat.\n */\n /** Clearcoat; linear multiplier. See {@link Clearcoat.getClearcoatTexture getClearcoatTexture}. */\n getClearcoatFactor() {\n return this.get('clearcoatFactor');\n }\n /** Clearcoat; linear multiplier. See {@link Clearcoat.getClearcoatTexture getClearcoatTexture}. */\n setClearcoatFactor(factor) {\n return this.set('clearcoatFactor', factor);\n }\n /**\n * Clearcoat texture; linear multiplier. The `r` channel of this texture specifies an amount\n * [0-1] of coating over the surface of the material, which may have its own roughness and\n * normal map properties.\n */\n getClearcoatTexture() {\n return this.getRef('clearcoatTexture');\n }\n /**\n * Settings affecting the material's use of its clearcoat texture. If no texture is attached,\n * {@link TextureInfo} is `null`.\n */\n getClearcoatTextureInfo() {\n return this.getRef('clearcoatTexture') ? this.getRef('clearcoatTextureInfo') : null;\n }\n /** Sets clearcoat texture. See {@link Clearcoat.getClearcoatTexture getClearcoatTexture}. */\n setClearcoatTexture(texture) {\n return this.setRef('clearcoatTexture', texture, {\n channels: R$6\n });\n }\n /**********************************************************************************************\n * Clearcoat roughness.\n */\n /**\n * Clearcoat roughness; linear multiplier.\n * See {@link Clearcoat.getClearcoatRoughnessTexture getClearcoatRoughnessTexture}.\n */\n getClearcoatRoughnessFactor() {\n return this.get('clearcoatRoughnessFactor');\n }\n /**\n * Clearcoat roughness; linear multiplier.\n * See {@link Clearcoat.getClearcoatRoughnessTexture getClearcoatRoughnessTexture}.\n */\n setClearcoatRoughnessFactor(factor) {\n return this.set('clearcoatRoughnessFactor', factor);\n }\n /**\n * Clearcoat roughness texture; linear multiplier. The `g` channel of this texture specifies\n * roughness, independent of the base layer's roughness.\n */\n getClearcoatRoughnessTexture() {\n return this.getRef('clearcoatRoughnessTexture');\n }\n /**\n * Settings affecting the material's use of its clearcoat roughness texture. If no texture is\n * attached, {@link TextureInfo} is `null`.\n */\n getClearcoatRoughnessTextureInfo() {\n return this.getRef('clearcoatRoughnessTexture') ? this.getRef('clearcoatRoughnessTextureInfo') : null;\n }\n /**\n * Sets clearcoat roughness texture.\n * See {@link Clearcoat.getClearcoatRoughnessTexture getClearcoatRoughnessTexture}.\n */\n setClearcoatRoughnessTexture(texture) {\n return this.setRef('clearcoatRoughnessTexture', texture, {\n channels: G$6\n });\n }\n /**********************************************************************************************\n * Clearcoat normals.\n */\n /** Clearcoat normal scale. See {@link Clearcoat.getClearcoatNormalTexture getClearcoatNormalTexture}. */\n getClearcoatNormalScale() {\n return this.get('clearcoatNormalScale');\n }\n /** Clearcoat normal scale. See {@link Clearcoat.getClearcoatNormalTexture getClearcoatNormalTexture}. */\n setClearcoatNormalScale(scale) {\n return this.set('clearcoatNormalScale', scale);\n }\n /**\n * Clearcoat normal map. Independent of the material base layer normal map.\n */\n getClearcoatNormalTexture() {\n return this.getRef('clearcoatNormalTexture');\n }\n /**\n * Settings affecting the material's use of its clearcoat normal texture. If no texture is\n * attached, {@link TextureInfo} is `null`.\n */\n getClearcoatNormalTextureInfo() {\n return this.getRef('clearcoatNormalTexture') ? this.getRef('clearcoatNormalTextureInfo') : null;\n }\n /** Sets clearcoat normal texture. See {@link Clearcoat.getClearcoatNormalTexture getClearcoatNormalTexture}. */\n setClearcoatNormalTexture(texture) {\n return this.setRef('clearcoatNormalTexture', texture, {\n channels: R$6 | G$6 | B$4\n });\n }\n}\nClearcoat.EXTENSION_NAME = KHR_MATERIALS_CLEARCOAT;\n\nconst NAME$g = KHR_MATERIALS_CLEARCOAT;\n/**\n * [KHR_materials_clearcoat](https://github.com/KhronosGroup/gltf/blob/main/extensions/2.0/Khronos/KHR_materials_clearcoat/)\n * defines a clear coating on a glTF PBR material.\n *\n * \n *\n * > _**Figure:** Comparison of a carbon-fiber material without clearcoat (left) and with clearcoat\n * > (right). Source: [Filament](https://google.github.io/filament/Materials.html)._\n *\n * A clear coat is a common technique used in Physically-Based\n * Rendering for a protective layer applied to a base material.\n * Commonly used to represent car paint, carbon fiber, or thin lacquers.\n *\n * Properties:\n * - {@link Clearcoat}\n *\n * ### Example\n *\n * ```typescript\n * import { KHRMaterialsClearcoat, Clearcoat } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const clearcoatExtension = document.createExtension(KHRMaterialsClearcoat);\n *\n * // Create Clearcoat property.\n * const clearcoat = clearcoatExtension.createClearcoat()\n *\t.setClearcoatFactor(1.0);\n *\n * // Assign to a Material.\n * material.setExtension('KHR_materials_clearcoat', clearcoat);\n * ```\n */\nclass KHRMaterialsClearcoat extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$g;\n this.prereadTypes = [PropertyType.MESH];\n this.prewriteTypes = [PropertyType.MESH];\n }\n /** Creates a new Clearcoat property for use on a {@link Material}. */\n createClearcoat() {\n return new Clearcoat(this.document.getGraph());\n }\n /** @hidden */\n read(_context) {\n return this;\n }\n /** @hidden */\n write(_context) {\n return this;\n }\n /** @hidden */\n preread(context) {\n const jsonDoc = context.jsonDoc;\n const materialDefs = jsonDoc.json.materials || [];\n const textureDefs = jsonDoc.json.textures || [];\n materialDefs.forEach((materialDef, materialIndex) => {\n if (materialDef.extensions && materialDef.extensions[NAME$g]) {\n const clearcoat = this.createClearcoat();\n context.materials[materialIndex].setExtension(NAME$g, clearcoat);\n const clearcoatDef = materialDef.extensions[NAME$g];\n // Factors.\n if (clearcoatDef.clearcoatFactor !== undefined) {\n clearcoat.setClearcoatFactor(clearcoatDef.clearcoatFactor);\n }\n if (clearcoatDef.clearcoatRoughnessFactor !== undefined) {\n clearcoat.setClearcoatRoughnessFactor(clearcoatDef.clearcoatRoughnessFactor);\n }\n // Textures.\n if (clearcoatDef.clearcoatTexture !== undefined) {\n const textureInfoDef = clearcoatDef.clearcoatTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n clearcoat.setClearcoatTexture(texture);\n context.setTextureInfo(clearcoat.getClearcoatTextureInfo(), textureInfoDef);\n }\n if (clearcoatDef.clearcoatRoughnessTexture !== undefined) {\n const textureInfoDef = clearcoatDef.clearcoatRoughnessTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n clearcoat.setClearcoatRoughnessTexture(texture);\n context.setTextureInfo(clearcoat.getClearcoatRoughnessTextureInfo(), textureInfoDef);\n }\n if (clearcoatDef.clearcoatNormalTexture !== undefined) {\n const textureInfoDef = clearcoatDef.clearcoatNormalTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n clearcoat.setClearcoatNormalTexture(texture);\n context.setTextureInfo(clearcoat.getClearcoatNormalTextureInfo(), textureInfoDef);\n if (textureInfoDef.scale !== undefined) {\n clearcoat.setClearcoatNormalScale(textureInfoDef.scale);\n }\n }\n }\n });\n return this;\n }\n /** @hidden */\n prewrite(context) {\n const jsonDoc = context.jsonDoc;\n this.document.getRoot().listMaterials().forEach(material => {\n const clearcoat = material.getExtension(NAME$g);\n if (clearcoat) {\n const materialIndex = context.materialIndexMap.get(material);\n const materialDef = jsonDoc.json.materials[materialIndex];\n materialDef.extensions = materialDef.extensions || {};\n // Factors.\n const clearcoatDef = materialDef.extensions[NAME$g] = {\n clearcoatFactor: clearcoat.getClearcoatFactor(),\n clearcoatRoughnessFactor: clearcoat.getClearcoatRoughnessFactor()\n };\n // Textures.\n if (clearcoat.getClearcoatTexture()) {\n const texture = clearcoat.getClearcoatTexture();\n const textureInfo = clearcoat.getClearcoatTextureInfo();\n clearcoatDef.clearcoatTexture = context.createTextureInfoDef(texture, textureInfo);\n }\n if (clearcoat.getClearcoatRoughnessTexture()) {\n const texture = clearcoat.getClearcoatRoughnessTexture();\n const textureInfo = clearcoat.getClearcoatRoughnessTextureInfo();\n clearcoatDef.clearcoatRoughnessTexture = context.createTextureInfoDef(texture, textureInfo);\n }\n if (clearcoat.getClearcoatNormalTexture()) {\n const texture = clearcoat.getClearcoatNormalTexture();\n const textureInfo = clearcoat.getClearcoatNormalTextureInfo();\n clearcoatDef.clearcoatNormalTexture = context.createTextureInfoDef(texture, textureInfo);\n if (clearcoat.getClearcoatNormalScale() !== 1) {\n clearcoatDef.clearcoatNormalTexture.scale = clearcoat.getClearcoatNormalScale();\n }\n }\n }\n });\n return this;\n }\n}\nKHRMaterialsClearcoat.EXTENSION_NAME = NAME$g;\n\nconst {\n R: R$5,\n G: G$5,\n B: B$3,\n A: A$3\n} = TextureChannel;\n/**\n * Defines diffuse transmission on a PBR {@link Material}. See {@link KHRMaterialsDiffuseTransmission}.\n *\n * @experimental KHR_materials_diffuse_transmission is not yet ratified by the Khronos Group.\n */\nclass DiffuseTransmission extends ExtensionProperty {\n init() {\n this.extensionName = KHR_MATERIALS_DIFFUSE_TRANSMISSION;\n this.propertyType = 'DiffuseTransmission';\n this.parentTypes = [PropertyType.MATERIAL];\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n diffuseTransmissionFactor: 0.0,\n diffuseTransmissionTexture: null,\n diffuseTransmissionTextureInfo: new TextureInfo(this.graph, 'diffuseTransmissionTextureInfo'),\n diffuseTransmissionColorFactor: [1.0, 1.0, 1.0],\n diffuseTransmissionColorTexture: null,\n diffuseTransmissionColorTextureInfo: new TextureInfo(this.graph, 'diffuseTransmissionColorTextureInfo')\n });\n }\n /**********************************************************************************************\n * Diffuse transmission.\n */\n /**\n * Percentage of reflected, non-specularly reflected light that is transmitted through the\n * surface via the Lambertian diffuse transmission, i.e., the strength of the diffuse\n * transmission effect.\n */\n getDiffuseTransmissionFactor() {\n return this.get('diffuseTransmissionFactor');\n }\n /**\n * Percentage of reflected, non-specularly reflected light that is transmitted through the\n * surface via the Lambertian diffuse transmission, i.e., the strength of the diffuse\n * transmission effect.\n */\n setDiffuseTransmissionFactor(factor) {\n return this.set('diffuseTransmissionFactor', factor);\n }\n /**\n * Texture that defines the strength of the diffuse transmission effect, stored in the alpha (A)\n * channel. Will be multiplied by the diffuseTransmissionFactor.\n */\n getDiffuseTransmissionTexture() {\n return this.getRef('diffuseTransmissionTexture');\n }\n /**\n * Settings affecting the material's use of its diffuse transmission texture. If no texture is attached,\n * {@link TextureInfo} is `null`.\n */\n getDiffuseTransmissionTextureInfo() {\n return this.getRef('diffuseTransmissionTexture') ? this.getRef('diffuseTransmissionTextureInfo') : null;\n }\n /**\n * Texture that defines the strength of the diffuse transmission effect, stored in the alpha (A)\n * channel. Will be multiplied by the diffuseTransmissionFactor.\n */\n setDiffuseTransmissionTexture(texture) {\n return this.setRef('diffuseTransmissionTexture', texture, {\n channels: A$3\n });\n }\n /**********************************************************************************************\n * Diffuse transmission color.\n */\n /** Color of the transmitted light; Linear-sRGB components. */\n getDiffuseTransmissionColorFactor() {\n return this.get('diffuseTransmissionColorFactor');\n }\n /** Color of the transmitted light; Linear-sRGB components. */\n setDiffuseTransmissionColorFactor(factor) {\n return this.set('diffuseTransmissionColorFactor', factor);\n }\n /**\n * Texture that defines the color of the transmitted light, stored in the RGB channels and\n * encoded in sRGB. This texture will be multiplied by diffuseTransmissionColorFactor.\n */\n getDiffuseTransmissionColorTexture() {\n return this.getRef('diffuseTransmissionColorTexture');\n }\n /**\n * Settings affecting the material's use of its diffuse transmission color texture. If no\n * texture is attached, {@link TextureInfo} is `null`.\n */\n getDiffuseTransmissionColorTextureInfo() {\n return this.getRef('diffuseTransmissionColorTexture') ? this.getRef('diffuseTransmissionColorTextureInfo') : null;\n }\n /**\n * Texture that defines the color of the transmitted light, stored in the RGB channels and\n * encoded in sRGB. This texture will be multiplied by diffuseTransmissionColorFactor.\n */\n setDiffuseTransmissionColorTexture(texture) {\n return this.setRef('diffuseTransmissionColorTexture', texture, {\n channels: R$5 | G$5 | B$3\n });\n }\n}\nDiffuseTransmission.EXTENSION_NAME = KHR_MATERIALS_DIFFUSE_TRANSMISSION;\n\nconst NAME$f = KHR_MATERIALS_DIFFUSE_TRANSMISSION;\n/**\n * [KHR_materials_diffuse_transmission](https://github.com/KhronosGroup/gltf/blob/main/extensions/2.0/Khronos/KHR_materials_diffuse_transmission/)\n * defines diffuse transmission on a glTF PBR material.\n *\n * \n *\n * > _**Figure:** Sphere using `KHR_materials_diffuse_transmission` with varying roughness (0.0, 0.2, 0.4).\n * > Source: Khronos Group._\n *\n * Adds a Lambertian diffuse transmission BSDF to the metallic-roughness\n * material. Thin, dielectric objects like leaves or paper diffusely transmit\n * incoming light to the opposite side of the surface. For optically thick\n * media (volumes) with short scattering distances and therefore dense\n * scattering behavior, a diffuse transmission lobe is a phenomenological\n * plausible and cheap approximation.\n *\n * Properties:\n * - {@link DiffuseTransmission}\n *\n * ### Example\n *\n * ```typescript\n * import { KHRMaterialsDiffuseTransmission, DiffuseTransmission } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const diffuseTransmissionExtension = document.createExtension(KHRMaterialsDiffuseTransmission);\n *\n * // Create DiffuseTransmission property.\n * const diffuseTransmission = diffuseTransmission.createDiffuseTransmission()\n *\t.setDiffuseTransmissionFactor(1.0);\n *\n * // Assign to a Material.\n * material.setExtension('KHR_materials_diffuse_transmission', diffuseTransmission);\n * ```\n *\n * @experimental KHR_materials_diffuse_transmission is not yet ratified by the Khronos Group.\n */\nclass KHRMaterialsDiffuseTransmission extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$f;\n }\n /** Creates a new DiffuseTransmission property for use on a {@link Material}. */\n createDiffuseTransmission() {\n return new DiffuseTransmission(this.document.getGraph());\n }\n /** @hidden */\n read(context) {\n const jsonDoc = context.jsonDoc;\n const materialDefs = jsonDoc.json.materials || [];\n const textureDefs = jsonDoc.json.textures || [];\n materialDefs.forEach((materialDef, materialIndex) => {\n if (materialDef.extensions && materialDef.extensions[NAME$f]) {\n const transmission = this.createDiffuseTransmission();\n context.materials[materialIndex].setExtension(NAME$f, transmission);\n const transmissionDef = materialDef.extensions[NAME$f];\n // Factors.\n if (transmissionDef.diffuseTransmissionFactor !== undefined) {\n transmission.setDiffuseTransmissionFactor(transmissionDef.diffuseTransmissionFactor);\n }\n if (transmissionDef.diffuseTransmissionColorFactor !== undefined) {\n transmission.setDiffuseTransmissionColorFactor(transmissionDef.diffuseTransmissionColorFactor);\n }\n // Textures.\n if (transmissionDef.diffuseTransmissionTexture !== undefined) {\n const textureInfoDef = transmissionDef.diffuseTransmissionTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n transmission.setDiffuseTransmissionTexture(texture);\n context.setTextureInfo(transmission.getDiffuseTransmissionTextureInfo(), textureInfoDef);\n }\n if (transmissionDef.diffuseTransmissionColorTexture !== undefined) {\n const textureInfoDef = transmissionDef.diffuseTransmissionColorTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n transmission.setDiffuseTransmissionColorTexture(texture);\n context.setTextureInfo(transmission.getDiffuseTransmissionColorTextureInfo(), textureInfoDef);\n }\n }\n });\n return this;\n }\n /** @hidden */\n write(context) {\n const jsonDoc = context.jsonDoc;\n for (const material of this.document.getRoot().listMaterials()) {\n const transmission = material.getExtension(NAME$f);\n if (!transmission) continue;\n const materialIndex = context.materialIndexMap.get(material);\n const materialDef = jsonDoc.json.materials[materialIndex];\n materialDef.extensions = materialDef.extensions || {};\n // Factors.\n const transmissionDef = materialDef.extensions[NAME$f] = {\n diffuseTransmissionFactor: transmission.getDiffuseTransmissionFactor(),\n diffuseTransmissionColorFactor: transmission.getDiffuseTransmissionColorFactor()\n };\n // Textures.\n if (transmission.getDiffuseTransmissionTexture()) {\n const texture = transmission.getDiffuseTransmissionTexture();\n const textureInfo = transmission.getDiffuseTransmissionTextureInfo();\n transmissionDef.diffuseTransmissionTexture = context.createTextureInfoDef(texture, textureInfo);\n }\n if (transmission.getDiffuseTransmissionColorTexture()) {\n const texture = transmission.getDiffuseTransmissionColorTexture();\n const textureInfo = transmission.getDiffuseTransmissionColorTextureInfo();\n transmissionDef.diffuseTransmissionColorTexture = context.createTextureInfoDef(texture, textureInfo);\n }\n }\n return this;\n }\n}\nKHRMaterialsDiffuseTransmission.EXTENSION_NAME = NAME$f;\n\n/**\n * Defines dispersion for a PBR {@link Material}. See {@link KHRMaterialsDispersion}.\n */\nclass Dispersion extends ExtensionProperty {\n init() {\n this.extensionName = KHR_MATERIALS_DISPERSION;\n this.propertyType = 'Dispersion';\n this.parentTypes = [PropertyType.MATERIAL];\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n dispersion: 0\n });\n }\n /**********************************************************************************************\n * Dispersion.\n */\n /** Dispersion. */\n getDispersion() {\n return this.get('dispersion');\n }\n /** Dispersion. */\n setDispersion(dispersion) {\n return this.set('dispersion', dispersion);\n }\n}\nDispersion.EXTENSION_NAME = KHR_MATERIALS_DISPERSION;\n\nconst NAME$e = KHR_MATERIALS_DISPERSION;\n/**\n * [KHR_materials_dispersion](https://github.com/KhronosGroup/gltf/blob/main/extensions/2.0/Khronos/KHR_materials_dispersion/)\n * defines dispersion on a glTF PBR material.\n *\n * \n *\n * > _**Figure:** Prisms demonstrating volumetric refraction and dispersion, for varying\n * > values of dispersion and IOR. Source: Khronos Group, rendered in Adobe Stager._\n *\n * Dispersion enables configuring the strength of the angular separation of colors (chromatic\n * aberration) transmitting through a relatively clear volume. It is an enhancement to the\n * default `KHR_materials_volume` transmission model which assumes no dispersion.\n *\n * Properties:\n * - {@link Dispersion}\n *\n * ### Example\n *\n * ```typescript\n * import { KHRMaterialsDispersion, Dispersion } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const dispersionExtension = document.createExtension(KHRMaterialsDispersion);\n *\n * // Create Dispersion property.\n * const dispersion = dispersionExtension.createDispersion().setDispersion(1.0);\n *\n * // Assign to a Material.\n * material.setExtension('KHR_materials_dispersion', dispersion);\n * ```\n */\nclass KHRMaterialsDispersion extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$e;\n this.prereadTypes = [PropertyType.MESH];\n this.prewriteTypes = [PropertyType.MESH];\n }\n /** Creates a new Dispersion property for use on a {@link Material}. */\n createDispersion() {\n return new Dispersion(this.document.getGraph());\n }\n /** @hidden */\n read(_context) {\n return this;\n }\n /** @hidden */\n write(_context) {\n return this;\n }\n /** @hidden */\n preread(context) {\n const jsonDoc = context.jsonDoc;\n const materialDefs = jsonDoc.json.materials || [];\n materialDefs.forEach((materialDef, materialIndex) => {\n if (materialDef.extensions && materialDef.extensions[NAME$e]) {\n const dispersion = this.createDispersion();\n context.materials[materialIndex].setExtension(NAME$e, dispersion);\n const dispersionDef = materialDef.extensions[NAME$e];\n // Factors.\n if (dispersionDef.dispersion !== undefined) {\n dispersion.setDispersion(dispersionDef.dispersion);\n }\n }\n });\n return this;\n }\n /** @hidden */\n prewrite(context) {\n const jsonDoc = context.jsonDoc;\n this.document.getRoot().listMaterials().forEach(material => {\n const dispersion = material.getExtension(NAME$e);\n if (dispersion) {\n const materialIndex = context.materialIndexMap.get(material);\n const materialDef = jsonDoc.json.materials[materialIndex];\n materialDef.extensions = materialDef.extensions || {};\n // Factors.\n materialDef.extensions[NAME$e] = {\n dispersion: dispersion.getDispersion()\n };\n }\n });\n return this;\n }\n}\nKHRMaterialsDispersion.EXTENSION_NAME = NAME$e;\n\n/**\n * Defines emissive strength for a PBR {@link Material}, allowing high-dynamic-range\n * (HDR) emissive materials. See {@link KHRMaterialsEmissiveStrength}.\n */\nclass EmissiveStrength extends ExtensionProperty {\n init() {\n this.extensionName = KHR_MATERIALS_EMISSIVE_STRENGTH;\n this.propertyType = 'EmissiveStrength';\n this.parentTypes = [PropertyType.MATERIAL];\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n emissiveStrength: 1.0\n });\n }\n /**********************************************************************************************\n * EmissiveStrength.\n */\n /** EmissiveStrength. */\n getEmissiveStrength() {\n return this.get('emissiveStrength');\n }\n /** EmissiveStrength. */\n setEmissiveStrength(strength) {\n return this.set('emissiveStrength', strength);\n }\n}\nEmissiveStrength.EXTENSION_NAME = KHR_MATERIALS_EMISSIVE_STRENGTH;\n\nconst NAME$d = KHR_MATERIALS_EMISSIVE_STRENGTH;\n/**\n * [KHR_materials_emissive_strength](https://github.com/KhronosGroup/gltf/blob/main/extensions/2.0/Khronos/KHR_materials_emissive_strength/)\n * defines emissive strength and enables high-dynamic-range (HDR) emissive materials.\n *\n * \n *\n * > _**Figure:** Cubes with emissive color #59BCF3 and emissive strength\n * > increasing from 1 to 256 nits, left to right. Rendered in [three.js](https://threejs.org/),\n * > with independent point lighting and a bloom effect.\n * > Source: [Don McCurdy](https://www.donmccurdy.com/2024/04/27/emission-and-bloom/)._\n *\n * The core glTF 2.0 material model includes {@link Material.setEmissiveFactor `emissiveFactor`}\n * and {@link Material.setEmissiveTexture `emissiveTexture`} to control the color and intensity\n * of the light being emitted by the material, clamped to the range [0.0, 1.0]. However, in\n * PBR environments with HDR reflections and lighting, stronger emission effects may be desirable.\n *\n * In this extension, a new {@link EmissiveStrength.setEmissiveStrength `emissiveStrength`} scalar\n * factor is supplied, which governs the upper limit of emissive strength per material and may be\n * given arbitrarily high values.\n *\n * For implementations where a physical light unit is needed, the units for the multiplicative\n * product of the emissive texture and factor are candela per square meter (cd / m2), sometimes\n * called _nits_. Many realtime rendering engines simplify this calculation by assuming that an\n * emissive factor of 1.0 results in a fully exposed pixel.\n *\n * Properties:\n * - {@link EmissiveStrength}\n *\n * ### Example\n *\n * ```typescript\n * import { KHRMaterialsEmissiveStrength, EmissiveStrength } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const emissiveStrengthExtension = document.createExtension(KHRMaterialsEmissiveStrength);\n *\n * // Create EmissiveStrength property.\n * const emissiveStrength = emissiveStrengthExtension\n * \t.createEmissiveStrength().setEmissiveStrength(5.0);\n *\n * // Assign to a Material.\n * material.setExtension('KHR_materials_emissive_strength', emissiveStrength);\n * ```\n */\nclass KHRMaterialsEmissiveStrength extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$d;\n this.prereadTypes = [PropertyType.MESH];\n this.prewriteTypes = [PropertyType.MESH];\n }\n /** Creates a new EmissiveStrength property for use on a {@link Material}. */\n createEmissiveStrength() {\n return new EmissiveStrength(this.document.getGraph());\n }\n /** @hidden */\n read(_context) {\n return this;\n }\n /** @hidden */\n write(_context) {\n return this;\n }\n /** @hidden */\n preread(context) {\n const jsonDoc = context.jsonDoc;\n const materialDefs = jsonDoc.json.materials || [];\n materialDefs.forEach((materialDef, materialIndex) => {\n if (materialDef.extensions && materialDef.extensions[NAME$d]) {\n const emissiveStrength = this.createEmissiveStrength();\n context.materials[materialIndex].setExtension(NAME$d, emissiveStrength);\n const emissiveStrengthDef = materialDef.extensions[NAME$d];\n // Factors.\n if (emissiveStrengthDef.emissiveStrength !== undefined) {\n emissiveStrength.setEmissiveStrength(emissiveStrengthDef.emissiveStrength);\n }\n }\n });\n return this;\n }\n /** @hidden */\n prewrite(context) {\n const jsonDoc = context.jsonDoc;\n this.document.getRoot().listMaterials().forEach(material => {\n const emissiveStrength = material.getExtension(NAME$d);\n if (emissiveStrength) {\n const materialIndex = context.materialIndexMap.get(material);\n const materialDef = jsonDoc.json.materials[materialIndex];\n materialDef.extensions = materialDef.extensions || {};\n // Factors.\n materialDef.extensions[NAME$d] = {\n emissiveStrength: emissiveStrength.getEmissiveStrength()\n };\n }\n });\n return this;\n }\n}\nKHRMaterialsEmissiveStrength.EXTENSION_NAME = NAME$d;\n\n/**\n * Defines index of refraction for a PBR {@link Material}. See {@link KHRMaterialsIOR}.\n */\nclass IOR extends ExtensionProperty {\n init() {\n this.extensionName = KHR_MATERIALS_IOR;\n this.propertyType = 'IOR';\n this.parentTypes = [PropertyType.MATERIAL];\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n ior: 1.5\n });\n }\n /**********************************************************************************************\n * IOR.\n */\n /** IOR. */\n getIOR() {\n return this.get('ior');\n }\n /** IOR. */\n setIOR(ior) {\n return this.set('ior', ior);\n }\n}\nIOR.EXTENSION_NAME = KHR_MATERIALS_IOR;\n\nconst NAME$c = KHR_MATERIALS_IOR;\n/**\n * [KHR_materials_ior](https://github.com/KhronosGroup/gltf/blob/main/extensions/2.0/Khronos/KHR_materials_ior/)\n * defines index of refraction on a glTF PBR material.\n *\n * The dielectric BRDF of the metallic-roughness material in glTF uses a fixed value of 1.5 for the\n * index of refraction. This is a good fit for many plastics and glass, but not for other materials\n * like water or asphalt, sapphire or diamond. `KHR_materials_ior` allows users to set the index of\n * refraction to a certain value.\n *\n * Properties:\n * - {@link IOR}\n *\n * ### Example\n *\n * ```typescript\n * import { KHRMaterialsIOR, IOR } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const iorExtension = document.createExtension(KHRMaterialsIOR);\n *\n * // Create IOR property.\n * const ior = iorExtension.createIOR().setIOR(1.0);\n *\n * // Assign to a Material.\n * material.setExtension('KHR_materials_ior', ior);\n * ```\n */\nclass KHRMaterialsIOR extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$c;\n this.prereadTypes = [PropertyType.MESH];\n this.prewriteTypes = [PropertyType.MESH];\n }\n /** Creates a new IOR property for use on a {@link Material}. */\n createIOR() {\n return new IOR(this.document.getGraph());\n }\n /** @hidden */\n read(_context) {\n return this;\n }\n /** @hidden */\n write(_context) {\n return this;\n }\n /** @hidden */\n preread(context) {\n const jsonDoc = context.jsonDoc;\n const materialDefs = jsonDoc.json.materials || [];\n materialDefs.forEach((materialDef, materialIndex) => {\n if (materialDef.extensions && materialDef.extensions[NAME$c]) {\n const ior = this.createIOR();\n context.materials[materialIndex].setExtension(NAME$c, ior);\n const iorDef = materialDef.extensions[NAME$c];\n // Factors.\n if (iorDef.ior !== undefined) {\n ior.setIOR(iorDef.ior);\n }\n }\n });\n return this;\n }\n /** @hidden */\n prewrite(context) {\n const jsonDoc = context.jsonDoc;\n this.document.getRoot().listMaterials().forEach(material => {\n const ior = material.getExtension(NAME$c);\n if (ior) {\n const materialIndex = context.materialIndexMap.get(material);\n const materialDef = jsonDoc.json.materials[materialIndex];\n materialDef.extensions = materialDef.extensions || {};\n // Factors.\n materialDef.extensions[NAME$c] = {\n ior: ior.getIOR()\n };\n }\n });\n return this;\n }\n}\nKHRMaterialsIOR.EXTENSION_NAME = NAME$c;\n\nconst {\n R: R$4,\n G: G$4\n} = TextureChannel;\n/**\n * Defines iridescence (thin film interference) on a PBR {@link Material}. See {@link KHRMaterialsIridescence}.\n */\nclass Iridescence extends ExtensionProperty {\n init() {\n this.extensionName = KHR_MATERIALS_IRIDESCENCE;\n this.propertyType = 'Iridescence';\n this.parentTypes = [PropertyType.MATERIAL];\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n iridescenceFactor: 0.0,\n iridescenceTexture: null,\n iridescenceTextureInfo: new TextureInfo(this.graph, 'iridescenceTextureInfo'),\n iridescenceIOR: 1.3,\n iridescenceThicknessMinimum: 100,\n iridescenceThicknessMaximum: 400,\n iridescenceThicknessTexture: null,\n iridescenceThicknessTextureInfo: new TextureInfo(this.graph, 'iridescenceThicknessTextureInfo')\n });\n }\n /**********************************************************************************************\n * Iridescence.\n */\n /** Iridescence; linear multiplier. See {@link Iridescence.getIridescenceTexture getIridescenceTexture}. */\n getIridescenceFactor() {\n return this.get('iridescenceFactor');\n }\n /** Iridescence; linear multiplier. See {@link Iridescence.getIridescenceTexture getIridescenceTexture}. */\n setIridescenceFactor(factor) {\n return this.set('iridescenceFactor', factor);\n }\n /**\n * Iridescence intensity.\n *\n * Only the red (R) channel is used for iridescence intensity, but this texture may optionally\n * be packed with additional data in the other channels.\n */\n getIridescenceTexture() {\n return this.getRef('iridescenceTexture');\n }\n /**\n * Settings affecting the material's use of its iridescence texture. If no texture is attached,\n * {@link TextureInfo} is `null`.\n */\n getIridescenceTextureInfo() {\n return this.getRef('iridescenceTexture') ? this.getRef('iridescenceTextureInfo') : null;\n }\n /** Iridescence intensity. See {@link Iridescence.getIridescenceTexture getIridescenceTexture}. */\n setIridescenceTexture(texture) {\n return this.setRef('iridescenceTexture', texture, {\n channels: R$4\n });\n }\n /**********************************************************************************************\n * Iridescence IOR.\n */\n /** Index of refraction of the dielectric thin-film layer. */\n getIridescenceIOR() {\n return this.get('iridescenceIOR');\n }\n /** Index of refraction of the dielectric thin-film layer. */\n setIridescenceIOR(ior) {\n return this.set('iridescenceIOR', ior);\n }\n /**********************************************************************************************\n * Iridescence thickness.\n */\n /** Minimum thickness of the thin-film layer, in nanometers (nm). */\n getIridescenceThicknessMinimum() {\n return this.get('iridescenceThicknessMinimum');\n }\n /** Minimum thickness of the thin-film layer, in nanometers (nm). */\n setIridescenceThicknessMinimum(thickness) {\n return this.set('iridescenceThicknessMinimum', thickness);\n }\n /** Maximum thickness of the thin-film layer, in nanometers (nm). */\n getIridescenceThicknessMaximum() {\n return this.get('iridescenceThicknessMaximum');\n }\n /** Maximum thickness of the thin-film layer, in nanometers (nm). */\n setIridescenceThicknessMaximum(thickness) {\n return this.set('iridescenceThicknessMaximum', thickness);\n }\n /**\n * The green channel of this texture defines the thickness of the\n * thin-film layer by blending between the minimum and maximum thickness.\n */\n getIridescenceThicknessTexture() {\n return this.getRef('iridescenceThicknessTexture');\n }\n /**\n * Settings affecting the material's use of its iridescence thickness texture.\n * If no texture is attached, {@link TextureInfo} is `null`.\n */\n getIridescenceThicknessTextureInfo() {\n return this.getRef('iridescenceThicknessTexture') ? this.getRef('iridescenceThicknessTextureInfo') : null;\n }\n /**\n * Sets iridescence thickness texture.\n * See {@link Iridescence.getIridescenceThicknessTexture getIridescenceThicknessTexture}.\n */\n setIridescenceThicknessTexture(texture) {\n return this.setRef('iridescenceThicknessTexture', texture, {\n channels: G$4\n });\n }\n}\nIridescence.EXTENSION_NAME = KHR_MATERIALS_IRIDESCENCE;\n\nconst NAME$b = KHR_MATERIALS_IRIDESCENCE;\n/**\n * [`KHR_materials_iridescence`](https://github.com/KhronosGroup/gltf/blob/main/extensions/2.0/Khronos/KHR_materials_iridescence/)\n * defines iridescence (thin film interference) on a PBR material.\n *\n * \n *\n * > _**Figure:** Varying levels of iridescence IOR values.\n * > Source: [Khronos Group](https://github.com/KhronosGroup/gltf/tree/main/extensions/2.0/Khronos/KHR_materials_iridescence)._\n *\n * Iridescence describes an effect where hue varies depending on the viewing\n * angle and illumination angle: A thin-film of a semi-transparent layer\n * results in inter-reflections and due to thin-film interference, certain\n * wavelengths get absorbed or amplified. Iridescence can be seen on soap\n * bubbles, oil films, or on the wings of many insects. With this extension,\n * thickness and index of refraction (IOR) of the thin-film can be specified,\n * enabling iridescent materials.\n *\n * Properties:\n * - {@link Iridescence}\n *\n * ### Example\n *\n * The `KHRMaterialsIridescence` class provides a single {@link ExtensionProperty} type, `Iridescence`,\n * which may be attached to any {@link Material} instance. For example:\n *\n * ```typescript\n * import { KHRMaterialsIridescence, Iridescence } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const iridescenceExtension = document.createExtension(KHRMaterialsIridescence);\n *\n * // Create an Iridescence property.\n * const iridescence = iridescenceExtension.createIridescence()\n * \t.setIridescenceFactor(1.0)\n * \t.setIridescenceIOR(1.8);\n *\n * // Attach the property to a Material.\n * material.setExtension('KHR_materials_iridescence', iridescence);\n * ```\n */\nclass KHRMaterialsIridescence extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$b;\n this.prereadTypes = [PropertyType.MESH];\n this.prewriteTypes = [PropertyType.MESH];\n }\n /** Creates a new Iridescence property for use on a {@link Material}. */\n createIridescence() {\n return new Iridescence(this.document.getGraph());\n }\n /** @hidden */\n read(_context) {\n return this;\n }\n /** @hidden */\n write(_context) {\n return this;\n }\n /** @hidden */\n preread(context) {\n const jsonDoc = context.jsonDoc;\n const materialDefs = jsonDoc.json.materials || [];\n const textureDefs = jsonDoc.json.textures || [];\n materialDefs.forEach((materialDef, materialIndex) => {\n if (materialDef.extensions && materialDef.extensions[NAME$b]) {\n const iridescence = this.createIridescence();\n context.materials[materialIndex].setExtension(NAME$b, iridescence);\n const iridescenceDef = materialDef.extensions[NAME$b];\n // Factors.\n if (iridescenceDef.iridescenceFactor !== undefined) {\n iridescence.setIridescenceFactor(iridescenceDef.iridescenceFactor);\n }\n if (iridescenceDef.iridescenceIor !== undefined) {\n iridescence.setIridescenceIOR(iridescenceDef.iridescenceIor);\n }\n if (iridescenceDef.iridescenceThicknessMinimum !== undefined) {\n iridescence.setIridescenceThicknessMinimum(iridescenceDef.iridescenceThicknessMinimum);\n }\n if (iridescenceDef.iridescenceThicknessMaximum !== undefined) {\n iridescence.setIridescenceThicknessMaximum(iridescenceDef.iridescenceThicknessMaximum);\n }\n // Textures.\n if (iridescenceDef.iridescenceTexture !== undefined) {\n const textureInfoDef = iridescenceDef.iridescenceTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n iridescence.setIridescenceTexture(texture);\n context.setTextureInfo(iridescence.getIridescenceTextureInfo(), textureInfoDef);\n }\n if (iridescenceDef.iridescenceThicknessTexture !== undefined) {\n const textureInfoDef = iridescenceDef.iridescenceThicknessTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n iridescence.setIridescenceThicknessTexture(texture);\n context.setTextureInfo(iridescence.getIridescenceThicknessTextureInfo(), textureInfoDef);\n }\n }\n });\n return this;\n }\n /** @hidden */\n prewrite(context) {\n const jsonDoc = context.jsonDoc;\n this.document.getRoot().listMaterials().forEach(material => {\n const iridescence = material.getExtension(NAME$b);\n if (iridescence) {\n const materialIndex = context.materialIndexMap.get(material);\n const materialDef = jsonDoc.json.materials[materialIndex];\n materialDef.extensions = materialDef.extensions || {};\n // Factors.\n const iridescenceDef = materialDef.extensions[NAME$b] = {};\n if (iridescence.getIridescenceFactor() > 0) {\n iridescenceDef.iridescenceFactor = iridescence.getIridescenceFactor();\n }\n if (iridescence.getIridescenceIOR() !== 1.3) {\n iridescenceDef.iridescenceIor = iridescence.getIridescenceIOR();\n }\n if (iridescence.getIridescenceThicknessMinimum() !== 100) {\n iridescenceDef.iridescenceThicknessMinimum = iridescence.getIridescenceThicknessMinimum();\n }\n if (iridescence.getIridescenceThicknessMaximum() !== 400) {\n iridescenceDef.iridescenceThicknessMaximum = iridescence.getIridescenceThicknessMaximum();\n }\n // Textures.\n if (iridescence.getIridescenceTexture()) {\n const texture = iridescence.getIridescenceTexture();\n const textureInfo = iridescence.getIridescenceTextureInfo();\n iridescenceDef.iridescenceTexture = context.createTextureInfoDef(texture, textureInfo);\n }\n if (iridescence.getIridescenceThicknessTexture()) {\n const texture = iridescence.getIridescenceThicknessTexture();\n const textureInfo = iridescence.getIridescenceThicknessTextureInfo();\n iridescenceDef.iridescenceThicknessTexture = context.createTextureInfoDef(texture, textureInfo);\n }\n }\n });\n return this;\n }\n}\nKHRMaterialsIridescence.EXTENSION_NAME = NAME$b;\n\nconst {\n R: R$3,\n G: G$3,\n B: B$2,\n A: A$2\n} = TextureChannel;\n/**\n * Converts a {@link Material} to a spec/gloss workflow. See {@link KHRMaterialsPBRSpecularGlossiness}.\n */\nclass PBRSpecularGlossiness extends ExtensionProperty {\n init() {\n this.extensionName = KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS;\n this.propertyType = 'PBRSpecularGlossiness';\n this.parentTypes = [PropertyType.MATERIAL];\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n diffuseFactor: [1.0, 1.0, 1.0, 1.0],\n diffuseTexture: null,\n diffuseTextureInfo: new TextureInfo(this.graph, 'diffuseTextureInfo'),\n specularFactor: [1.0, 1.0, 1.0],\n glossinessFactor: 1.0,\n specularGlossinessTexture: null,\n specularGlossinessTextureInfo: new TextureInfo(this.graph, 'specularGlossinessTextureInfo')\n });\n }\n /**********************************************************************************************\n * Diffuse.\n */\n /** Diffuse; Linear-sRGB components. See {@link PBRSpecularGlossiness.getDiffuseTexture getDiffuseTexture}. */\n getDiffuseFactor() {\n return this.get('diffuseFactor');\n }\n /** Diffuse; Linear-sRGB components. See {@link PBRSpecularGlossiness.getDiffuseTexture getDiffuseTexture}. */\n setDiffuseFactor(factor) {\n return this.set('diffuseFactor', factor);\n }\n /**\n * Diffuse texture; sRGB. Alternative to baseColorTexture, used within the\n * spec/gloss PBR workflow.\n */\n getDiffuseTexture() {\n return this.getRef('diffuseTexture');\n }\n /**\n * Settings affecting the material's use of its diffuse texture. If no texture is attached,\n * {@link TextureInfo} is `null`.\n */\n getDiffuseTextureInfo() {\n return this.getRef('diffuseTexture') ? this.getRef('diffuseTextureInfo') : null;\n }\n /** Sets diffuse texture. See {@link PBRSpecularGlossiness.getDiffuseTexture getDiffuseTexture}. */\n setDiffuseTexture(texture) {\n return this.setRef('diffuseTexture', texture, {\n channels: R$3 | G$3 | B$2 | A$2,\n isColor: true\n });\n }\n /**********************************************************************************************\n * Specular.\n */\n /** Specular; linear multiplier. */\n getSpecularFactor() {\n return this.get('specularFactor');\n }\n /** Specular; linear multiplier. */\n setSpecularFactor(factor) {\n return this.set('specularFactor', factor);\n }\n /**********************************************************************************************\n * Glossiness.\n */\n /** Glossiness; linear multiplier. */\n getGlossinessFactor() {\n return this.get('glossinessFactor');\n }\n /** Glossiness; linear multiplier. */\n setGlossinessFactor(factor) {\n return this.set('glossinessFactor', factor);\n }\n /**********************************************************************************************\n * Specular/Glossiness.\n */\n /** Spec/gloss texture; linear multiplier. */\n getSpecularGlossinessTexture() {\n return this.getRef('specularGlossinessTexture');\n }\n /**\n * Settings affecting the material's use of its spec/gloss texture. If no texture is attached,\n * {@link TextureInfo} is `null`.\n */\n getSpecularGlossinessTextureInfo() {\n return this.getRef('specularGlossinessTexture') ? this.getRef('specularGlossinessTextureInfo') : null;\n }\n /** Spec/gloss texture; linear multiplier. */\n setSpecularGlossinessTexture(texture) {\n return this.setRef('specularGlossinessTexture', texture, {\n channels: R$3 | G$3 | B$2 | A$2\n });\n }\n}\nPBRSpecularGlossiness.EXTENSION_NAME = KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS;\n\nconst NAME$a = KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS;\n/**\n * [`KHR_materials_pbrSpecularGlossiness`](https://github.com/KhronosGroup/gltf/blob/main/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness/)\n * converts a PBR material from the default metal/rough workflow to a spec/gloss workflow.\n *\n * > _**NOTICE:** The spec/gloss workflow does _not_ support other PBR extensions such as clearcoat,\n * > transmission, IOR, etc. For the complete PBR feature set and specular data, use the\n * > {@link KHRMaterialsSpecular} extension instead, which provides specular data within a metal/rough\n * > workflow._\n *\n * \n *\n * > _**Figure:** Components of a PBR spec/gloss material. Source: Khronos Group._\n *\n * Properties:\n * - {@link PBRSpecularGlossiness}\n *\n * ### Example\n *\n * ```typescript\n * import { KHRMaterialsPBRSpecularGlossiness } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const specGlossExtension = document.createExtension(KHRMaterialsPBRSpecularGlossiness);\n *\n * // Create a PBRSpecularGlossiness property.\n * const specGloss = specGlossExtension.createPBRSpecularGlossiness()\n * \t.setSpecularFactor(1.0);\n *\n * // // Assign to a Material.\n * material.setExtension('KHR_materials_pbrSpecularGlossiness', specGloss);\n * ```\n */\nclass KHRMaterialsPBRSpecularGlossiness extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$a;\n this.prereadTypes = [PropertyType.MESH];\n this.prewriteTypes = [PropertyType.MESH];\n }\n /** Creates a new PBRSpecularGlossiness property for use on a {@link Material}. */\n createPBRSpecularGlossiness() {\n return new PBRSpecularGlossiness(this.document.getGraph());\n }\n /** @hidden */\n read(_context) {\n return this;\n }\n /** @hidden */\n write(_context) {\n return this;\n }\n /** @hidden */\n preread(context) {\n const jsonDoc = context.jsonDoc;\n const materialDefs = jsonDoc.json.materials || [];\n const textureDefs = jsonDoc.json.textures || [];\n materialDefs.forEach((materialDef, materialIndex) => {\n if (materialDef.extensions && materialDef.extensions[NAME$a]) {\n const specGloss = this.createPBRSpecularGlossiness();\n context.materials[materialIndex].setExtension(NAME$a, specGloss);\n const specGlossDef = materialDef.extensions[NAME$a];\n // Factors.\n if (specGlossDef.diffuseFactor !== undefined) {\n specGloss.setDiffuseFactor(specGlossDef.diffuseFactor);\n }\n if (specGlossDef.specularFactor !== undefined) {\n specGloss.setSpecularFactor(specGlossDef.specularFactor);\n }\n if (specGlossDef.glossinessFactor !== undefined) {\n specGloss.setGlossinessFactor(specGlossDef.glossinessFactor);\n }\n // Textures.\n if (specGlossDef.diffuseTexture !== undefined) {\n const textureInfoDef = specGlossDef.diffuseTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n specGloss.setDiffuseTexture(texture);\n context.setTextureInfo(specGloss.getDiffuseTextureInfo(), textureInfoDef);\n }\n if (specGlossDef.specularGlossinessTexture !== undefined) {\n const textureInfoDef = specGlossDef.specularGlossinessTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n specGloss.setSpecularGlossinessTexture(texture);\n context.setTextureInfo(specGloss.getSpecularGlossinessTextureInfo(), textureInfoDef);\n }\n }\n });\n return this;\n }\n /** @hidden */\n prewrite(context) {\n const jsonDoc = context.jsonDoc;\n this.document.getRoot().listMaterials().forEach(material => {\n const specGloss = material.getExtension(NAME$a);\n if (specGloss) {\n const materialIndex = context.materialIndexMap.get(material);\n const materialDef = jsonDoc.json.materials[materialIndex];\n materialDef.extensions = materialDef.extensions || {};\n // Factors.\n const specGlossDef = materialDef.extensions[NAME$a] = {\n diffuseFactor: specGloss.getDiffuseFactor(),\n specularFactor: specGloss.getSpecularFactor(),\n glossinessFactor: specGloss.getGlossinessFactor()\n };\n // Textures.\n if (specGloss.getDiffuseTexture()) {\n const texture = specGloss.getDiffuseTexture();\n const textureInfo = specGloss.getDiffuseTextureInfo();\n specGlossDef.diffuseTexture = context.createTextureInfoDef(texture, textureInfo);\n }\n if (specGloss.getSpecularGlossinessTexture()) {\n const texture = specGloss.getSpecularGlossinessTexture();\n const textureInfo = specGloss.getSpecularGlossinessTextureInfo();\n specGlossDef.specularGlossinessTexture = context.createTextureInfoDef(texture, textureInfo);\n }\n }\n });\n return this;\n }\n}\nKHRMaterialsPBRSpecularGlossiness.EXTENSION_NAME = NAME$a;\n\nconst {\n R: R$2,\n G: G$2,\n B: B$1,\n A: A$1\n} = TextureChannel;\n/**\n * Defines sheen on a PBR {@link Material}. See {@link KHRMaterialsSheen}.\n */\nclass Sheen extends ExtensionProperty {\n init() {\n this.extensionName = KHR_MATERIALS_SHEEN;\n this.propertyType = 'Sheen';\n this.parentTypes = [PropertyType.MATERIAL];\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n sheenColorFactor: [0.0, 0.0, 0.0],\n sheenColorTexture: null,\n sheenColorTextureInfo: new TextureInfo(this.graph, 'sheenColorTextureInfo'),\n sheenRoughnessFactor: 0.0,\n sheenRoughnessTexture: null,\n sheenRoughnessTextureInfo: new TextureInfo(this.graph, 'sheenRoughnessTextureInfo')\n });\n }\n /**********************************************************************************************\n * Sheen color.\n */\n /** Sheen; linear multiplier. */\n getSheenColorFactor() {\n return this.get('sheenColorFactor');\n }\n /** Sheen; linear multiplier. */\n setSheenColorFactor(factor) {\n return this.set('sheenColorFactor', factor);\n }\n /**\n * Sheen color texture, in sRGB colorspace.\n */\n getSheenColorTexture() {\n return this.getRef('sheenColorTexture');\n }\n /**\n * Settings affecting the material's use of its sheen color texture. If no texture is attached,\n * {@link TextureInfo} is `null`.\n */\n getSheenColorTextureInfo() {\n return this.getRef('sheenColorTexture') ? this.getRef('sheenColorTextureInfo') : null;\n }\n /** Sets sheen color texture. See {@link Sheen.getSheenColorTexture getSheenColorTexture}. */\n setSheenColorTexture(texture) {\n return this.setRef('sheenColorTexture', texture, {\n channels: R$2 | G$2 | B$1,\n isColor: true\n });\n }\n /**********************************************************************************************\n * Sheen roughness.\n */\n /** Sheen roughness; linear multiplier. See {@link Sheen.getSheenRoughnessTexture getSheenRoughnessTexture}. */\n getSheenRoughnessFactor() {\n return this.get('sheenRoughnessFactor');\n }\n /** Sheen roughness; linear multiplier. See {@link Sheen.getSheenRoughnessTexture getSheenRoughnessTexture}. */\n setSheenRoughnessFactor(factor) {\n return this.set('sheenRoughnessFactor', factor);\n }\n /**\n * Sheen roughness texture; linear multiplier. The `a` channel of this texture specifies\n * roughness, independent of the base layer's roughness.\n */\n getSheenRoughnessTexture() {\n return this.getRef('sheenRoughnessTexture');\n }\n /**\n * Settings affecting the material's use of its sheen roughness texture. If no texture is\n * attached, {@link TextureInfo} is `null`.\n */\n getSheenRoughnessTextureInfo() {\n return this.getRef('sheenRoughnessTexture') ? this.getRef('sheenRoughnessTextureInfo') : null;\n }\n /**\n * Sets sheen roughness texture. The `a` channel of this texture specifies\n * roughness, independent of the base layer's roughness.\n */\n setSheenRoughnessTexture(texture) {\n return this.setRef('sheenRoughnessTexture', texture, {\n channels: A$1\n });\n }\n}\nSheen.EXTENSION_NAME = KHR_MATERIALS_SHEEN;\n\nconst NAME$9 = KHR_MATERIALS_SHEEN;\n/**\n * [`KHR_materials_sheen`](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_sheen/)\n * defines a velvet-like sheen layered on a glTF PBR material.\n *\n * \n *\n * > _**Figure:** A cushion, showing high material roughness and low sheen roughness. Soft\n * > highlights at edges of the material show backscattering from microfibers. Source: Khronos\n * > Group._\n *\n * A sheen layer is a common technique used in Physically-Based Rendering to represent\n * cloth and fabric materials.\n *\n * Properties:\n * - {@link Sheen}\n *\n * ### Example\n *\n * The `KHRMaterialsSheen` class provides a single {@link ExtensionProperty} type, `Sheen`,\n * which may be attached to any {@link Material} instance. For example:\n *\n * ```typescript\n * import { KHRMaterialsSheen, Sheen } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const sheenExtension = document.createExtension(KHRMaterialsSheen);\n *\n * // Create a Sheen property.\n * const sheen = sheenExtension.createSheen()\n * \t.setSheenColorFactor([1.0, 1.0, 1.0]);\n *\n * // Attach the property to a Material.\n * material.setExtension('KHR_materials_sheen', sheen);\n * ```\n */\nclass KHRMaterialsSheen extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$9;\n this.prereadTypes = [PropertyType.MESH];\n this.prewriteTypes = [PropertyType.MESH];\n }\n /** Creates a new Sheen property for use on a {@link Material}. */\n createSheen() {\n return new Sheen(this.document.getGraph());\n }\n /** @hidden */\n read(_context) {\n return this;\n }\n /** @hidden */\n write(_context) {\n return this;\n }\n /** @hidden */\n preread(context) {\n const jsonDoc = context.jsonDoc;\n const materialDefs = jsonDoc.json.materials || [];\n const textureDefs = jsonDoc.json.textures || [];\n materialDefs.forEach((materialDef, materialIndex) => {\n if (materialDef.extensions && materialDef.extensions[NAME$9]) {\n const sheen = this.createSheen();\n context.materials[materialIndex].setExtension(NAME$9, sheen);\n const sheenDef = materialDef.extensions[NAME$9];\n // Factors.\n if (sheenDef.sheenColorFactor !== undefined) {\n sheen.setSheenColorFactor(sheenDef.sheenColorFactor);\n }\n if (sheenDef.sheenRoughnessFactor !== undefined) {\n sheen.setSheenRoughnessFactor(sheenDef.sheenRoughnessFactor);\n }\n // Textures.\n if (sheenDef.sheenColorTexture !== undefined) {\n const textureInfoDef = sheenDef.sheenColorTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n sheen.setSheenColorTexture(texture);\n context.setTextureInfo(sheen.getSheenColorTextureInfo(), textureInfoDef);\n }\n if (sheenDef.sheenRoughnessTexture !== undefined) {\n const textureInfoDef = sheenDef.sheenRoughnessTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n sheen.setSheenRoughnessTexture(texture);\n context.setTextureInfo(sheen.getSheenRoughnessTextureInfo(), textureInfoDef);\n }\n }\n });\n return this;\n }\n /** @hidden */\n prewrite(context) {\n const jsonDoc = context.jsonDoc;\n this.document.getRoot().listMaterials().forEach(material => {\n const sheen = material.getExtension(NAME$9);\n if (sheen) {\n const materialIndex = context.materialIndexMap.get(material);\n const materialDef = jsonDoc.json.materials[materialIndex];\n materialDef.extensions = materialDef.extensions || {};\n // Factors.\n const sheenDef = materialDef.extensions[NAME$9] = {\n sheenColorFactor: sheen.getSheenColorFactor(),\n sheenRoughnessFactor: sheen.getSheenRoughnessFactor()\n };\n // Textures.\n if (sheen.getSheenColorTexture()) {\n const texture = sheen.getSheenColorTexture();\n const textureInfo = sheen.getSheenColorTextureInfo();\n sheenDef.sheenColorTexture = context.createTextureInfoDef(texture, textureInfo);\n }\n if (sheen.getSheenRoughnessTexture()) {\n const texture = sheen.getSheenRoughnessTexture();\n const textureInfo = sheen.getSheenRoughnessTextureInfo();\n sheenDef.sheenRoughnessTexture = context.createTextureInfoDef(texture, textureInfo);\n }\n }\n });\n return this;\n }\n}\nKHRMaterialsSheen.EXTENSION_NAME = NAME$9;\n\nconst {\n R: R$1,\n G: G$1,\n B,\n A\n} = TextureChannel;\n/**\n * Defines specular reflectivity on a PBR {@link Material}. See {@link KHRMaterialsSpecular}.\n */\nclass Specular extends ExtensionProperty {\n init() {\n this.extensionName = KHR_MATERIALS_SPECULAR;\n this.propertyType = 'Specular';\n this.parentTypes = [PropertyType.MATERIAL];\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n specularFactor: 1.0,\n specularTexture: null,\n specularTextureInfo: new TextureInfo(this.graph, 'specularTextureInfo'),\n specularColorFactor: [1.0, 1.0, 1.0],\n specularColorTexture: null,\n specularColorTextureInfo: new TextureInfo(this.graph, 'specularColorTextureInfo')\n });\n }\n /**********************************************************************************************\n * Specular.\n */\n /** Specular; linear multiplier. See {@link Specular.getSpecularTexture getSpecularTexture}. */\n getSpecularFactor() {\n return this.get('specularFactor');\n }\n /** Specular; linear multiplier. See {@link Specular.getSpecularTexture getSpecularTexture}. */\n setSpecularFactor(factor) {\n return this.set('specularFactor', factor);\n }\n /** Specular color; Linear-sRGB components. See {@link Specular.getSpecularTexture getSpecularTexture}. */\n getSpecularColorFactor() {\n return this.get('specularColorFactor');\n }\n /** Specular color; Linear-sRGB components. See {@link Specular.getSpecularTexture getSpecularTexture}. */\n setSpecularColorFactor(factor) {\n return this.set('specularColorFactor', factor);\n }\n /**\n * Specular texture; linear multiplier. Configures the strength of the specular reflection in\n * the dielectric BRDF. A value of zero disables the specular reflection, resulting in a pure\n * diffuse material.\n *\n * Only the alpha (A) channel is used for specular strength, but this texture may optionally\n * be packed with specular color (RGB) into a single texture.\n */\n getSpecularTexture() {\n return this.getRef('specularTexture');\n }\n /**\n * Settings affecting the material's use of its specular texture. If no texture is attached,\n * {@link TextureInfo} is `null`.\n */\n getSpecularTextureInfo() {\n return this.getRef('specularTexture') ? this.getRef('specularTextureInfo') : null;\n }\n /** Sets specular texture. See {@link Specular.getSpecularTexture getSpecularTexture}. */\n setSpecularTexture(texture) {\n return this.setRef('specularTexture', texture, {\n channels: A\n });\n }\n /**\n * Specular color texture; linear multiplier. Defines the F0 color of the specular reflection\n * (RGB channels, encoded in sRGB) in the the dielectric BRDF.\n *\n * Only RGB channels are used here, but this texture may optionally be packed with a specular\n * factor (A) into a single texture.\n */\n getSpecularColorTexture() {\n return this.getRef('specularColorTexture');\n }\n /**\n * Settings affecting the material's use of its specular color texture. If no texture is\n * attached, {@link TextureInfo} is `null`.\n */\n getSpecularColorTextureInfo() {\n return this.getRef('specularColorTexture') ? this.getRef('specularColorTextureInfo') : null;\n }\n /** Sets specular color texture. See {@link Specular.getSpecularColorTexture getSpecularColorTexture}. */\n setSpecularColorTexture(texture) {\n return this.setRef('specularColorTexture', texture, {\n channels: R$1 | G$1 | B,\n isColor: true\n });\n }\n}\nSpecular.EXTENSION_NAME = KHR_MATERIALS_SPECULAR;\n\nconst NAME$8 = KHR_MATERIALS_SPECULAR;\n/**\n * [`KHR_materials_specular`](https://github.com/KhronosGroup/gltf/blob/main/extensions/2.0/Khronos/KHR_materials_specular/)\n * adjusts the strength of the specular reflection in the dielectric BRDF.\n *\n * KHRMaterialsSpecular is a better alternative to the older\n * {@link KHRMaterialsPBRSpecularGlossiness KHR_materials_pbrSpecularGlossiness} extension, and\n * provides specular information while remaining within a metal/rough PBR workflow. A\n * value of zero disables the specular reflection, resulting in a pure diffuse material.\n *\n * Properties:\n * - {@link Specular}\n *\n * ### Example\n *\n * The `KHRMaterialsSpecular` class provides a single {@link ExtensionProperty} type, `Specular`,\n * which may be attached to any {@link Material} instance. For example:\n *\n * ```typescript\n * import { KHRMaterialsSpecular, Specular } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const specularExtension = document.createExtension(KHRMaterialsSpecular);\n *\n * // Create a Specular property.\n * const specular = specularExtension.createSpecular()\n * \t.setSpecularFactor(1.0);\n *\n * // Attach the property to a Material.\n * material.setExtension('KHR_materials_specular', specular);\n * ```\n */\nclass KHRMaterialsSpecular extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$8;\n this.prereadTypes = [PropertyType.MESH];\n this.prewriteTypes = [PropertyType.MESH];\n }\n /** Creates a new Specular property for use on a {@link Material}. */\n createSpecular() {\n return new Specular(this.document.getGraph());\n }\n /** @hidden */\n read(_context) {\n return this;\n }\n /** @hidden */\n write(_context) {\n return this;\n }\n /** @hidden */\n preread(context) {\n const jsonDoc = context.jsonDoc;\n const materialDefs = jsonDoc.json.materials || [];\n const textureDefs = jsonDoc.json.textures || [];\n materialDefs.forEach((materialDef, materialIndex) => {\n if (materialDef.extensions && materialDef.extensions[NAME$8]) {\n const specular = this.createSpecular();\n context.materials[materialIndex].setExtension(NAME$8, specular);\n const specularDef = materialDef.extensions[NAME$8];\n // Factors.\n if (specularDef.specularFactor !== undefined) {\n specular.setSpecularFactor(specularDef.specularFactor);\n }\n if (specularDef.specularColorFactor !== undefined) {\n specular.setSpecularColorFactor(specularDef.specularColorFactor);\n }\n // Textures.\n if (specularDef.specularTexture !== undefined) {\n const textureInfoDef = specularDef.specularTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n specular.setSpecularTexture(texture);\n context.setTextureInfo(specular.getSpecularTextureInfo(), textureInfoDef);\n }\n if (specularDef.specularColorTexture !== undefined) {\n const textureInfoDef = specularDef.specularColorTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n specular.setSpecularColorTexture(texture);\n context.setTextureInfo(specular.getSpecularColorTextureInfo(), textureInfoDef);\n }\n }\n });\n return this;\n }\n /** @hidden */\n prewrite(context) {\n const jsonDoc = context.jsonDoc;\n this.document.getRoot().listMaterials().forEach(material => {\n const specular = material.getExtension(NAME$8);\n if (specular) {\n const materialIndex = context.materialIndexMap.get(material);\n const materialDef = jsonDoc.json.materials[materialIndex];\n materialDef.extensions = materialDef.extensions || {};\n // Factors.\n const specularDef = materialDef.extensions[NAME$8] = {};\n if (specular.getSpecularFactor() !== 1) {\n specularDef.specularFactor = specular.getSpecularFactor();\n }\n if (!MathUtils.eq(specular.getSpecularColorFactor(), [1, 1, 1])) {\n specularDef.specularColorFactor = specular.getSpecularColorFactor();\n }\n // Textures.\n if (specular.getSpecularTexture()) {\n const texture = specular.getSpecularTexture();\n const textureInfo = specular.getSpecularTextureInfo();\n specularDef.specularTexture = context.createTextureInfoDef(texture, textureInfo);\n }\n if (specular.getSpecularColorTexture()) {\n const texture = specular.getSpecularColorTexture();\n const textureInfo = specular.getSpecularColorTextureInfo();\n specularDef.specularColorTexture = context.createTextureInfoDef(texture, textureInfo);\n }\n }\n });\n return this;\n }\n}\nKHRMaterialsSpecular.EXTENSION_NAME = NAME$8;\n\nconst {\n R\n} = TextureChannel;\n/**\n * Defines optical transmission on a PBR {@link Material}. See {@link KHRMaterialsTransmission}.\n */\nclass Transmission extends ExtensionProperty {\n init() {\n this.extensionName = KHR_MATERIALS_TRANSMISSION;\n this.propertyType = 'Transmission';\n this.parentTypes = [PropertyType.MATERIAL];\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n transmissionFactor: 0.0,\n transmissionTexture: null,\n transmissionTextureInfo: new TextureInfo(this.graph, 'transmissionTextureInfo')\n });\n }\n /**********************************************************************************************\n * Transmission.\n */\n /** Transmission; linear multiplier. See {@link Transmission.getTransmissionTexture getTransmissionTexture}. */\n getTransmissionFactor() {\n return this.get('transmissionFactor');\n }\n /** Transmission; linear multiplier. See {@link Transmission.getTransmissionTexture getTransmissionTexture}. */\n setTransmissionFactor(factor) {\n return this.set('transmissionFactor', factor);\n }\n /**\n * Transmission texture; linear multiplier. The `r` channel of this texture specifies\n * transmission [0-1] of the material's surface. By default this is a thin transparency\n * effect, but volume effects (refraction, subsurface scattering) may be introduced with the\n * addition of the `KHR_materials_volume` extension.\n */\n getTransmissionTexture() {\n return this.getRef('transmissionTexture');\n }\n /**\n * Settings affecting the material's use of its transmission texture. If no texture is attached,\n * {@link TextureInfo} is `null`.\n */\n getTransmissionTextureInfo() {\n return this.getRef('transmissionTexture') ? this.getRef('transmissionTextureInfo') : null;\n }\n /** Sets transmission texture. See {@link Transmission.getTransmissionTexture getTransmissionTexture}. */\n setTransmissionTexture(texture) {\n return this.setRef('transmissionTexture', texture, {\n channels: R\n });\n }\n}\nTransmission.EXTENSION_NAME = KHR_MATERIALS_TRANSMISSION;\n\nconst NAME$7 = KHR_MATERIALS_TRANSMISSION;\n/**\n * [`KHR_materials_transmission`](https://github.com/KhronosGroup/gltf/blob/main/extensions/2.0/Khronos/KHR_materials_transmission/)\n * provides a common type of optical transparency: infinitely-thin materials with no refraction,\n * scattering, or dispersion.\n *\n * \n *\n * > _**Figure:** Sphere using `KHR_materials_transmission` with varying roughness (0.0, 0.2, 0.4).\n * > Source: Khronos Group._\n *\n * While default PBR materials using alpha blending become invisible as their opacity approaches\n * zero, a transmissive material continues to reflect light in a glass-like manner, even at low\n * transmission values. When combined with {@link KHRMaterialsVolume}, transmission may be used for\n * thicker materials and refractive effects.\n *\n * Properties:\n * - {@link Transmission}\n *\n * ### Example\n *\n * The `KHRMaterialsTransmission` class provides a single {@link ExtensionProperty} type,\n * `Transmission`, which may be attached to any {@link Material} instance. For example:\n *\n * ```typescript\n * import { KHRMaterialsTransmission, Transmission } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const transmissionExtension = document.createExtension(KHRMaterialsTransmission);\n *\n * // Create a Transmission property.\n * const transmission = transmissionExtension.createTransmission()\n * \t.setTransmissionFactor(1.0);\n *\n * // Attach the property to a Material.\n * material.setExtension('KHR_materials_transmission', transmission);\n * ```\n */\nclass KHRMaterialsTransmission extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$7;\n this.prereadTypes = [PropertyType.MESH];\n this.prewriteTypes = [PropertyType.MESH];\n }\n /** Creates a new Transmission property for use on a {@link Material}. */\n createTransmission() {\n return new Transmission(this.document.getGraph());\n }\n /** @hidden */\n read(_context) {\n return this;\n }\n /** @hidden */\n write(_context) {\n return this;\n }\n /** @hidden */\n preread(context) {\n const jsonDoc = context.jsonDoc;\n const materialDefs = jsonDoc.json.materials || [];\n const textureDefs = jsonDoc.json.textures || [];\n materialDefs.forEach((materialDef, materialIndex) => {\n if (materialDef.extensions && materialDef.extensions[NAME$7]) {\n const transmission = this.createTransmission();\n context.materials[materialIndex].setExtension(NAME$7, transmission);\n const transmissionDef = materialDef.extensions[NAME$7];\n // Factors.\n if (transmissionDef.transmissionFactor !== undefined) {\n transmission.setTransmissionFactor(transmissionDef.transmissionFactor);\n }\n // Textures.\n if (transmissionDef.transmissionTexture !== undefined) {\n const textureInfoDef = transmissionDef.transmissionTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n transmission.setTransmissionTexture(texture);\n context.setTextureInfo(transmission.getTransmissionTextureInfo(), textureInfoDef);\n }\n }\n });\n return this;\n }\n /** @hidden */\n prewrite(context) {\n const jsonDoc = context.jsonDoc;\n this.document.getRoot().listMaterials().forEach(material => {\n const transmission = material.getExtension(NAME$7);\n if (transmission) {\n const materialIndex = context.materialIndexMap.get(material);\n const materialDef = jsonDoc.json.materials[materialIndex];\n materialDef.extensions = materialDef.extensions || {};\n // Factors.\n const transmissionDef = materialDef.extensions[NAME$7] = {\n transmissionFactor: transmission.getTransmissionFactor()\n };\n // Textures.\n if (transmission.getTransmissionTexture()) {\n const texture = transmission.getTransmissionTexture();\n const textureInfo = transmission.getTransmissionTextureInfo();\n transmissionDef.transmissionTexture = context.createTextureInfoDef(texture, textureInfo);\n }\n }\n });\n return this;\n }\n}\nKHRMaterialsTransmission.EXTENSION_NAME = NAME$7;\n\n/**\n * Converts a PBR {@link Material} to an unlit shading model. See {@link KHRMaterialsUnlit}.\n */\nclass Unlit extends ExtensionProperty {\n init() {\n this.extensionName = KHR_MATERIALS_UNLIT;\n this.propertyType = 'Unlit';\n this.parentTypes = [PropertyType.MATERIAL];\n }\n}\nUnlit.EXTENSION_NAME = KHR_MATERIALS_UNLIT;\n\nconst NAME$6 = KHR_MATERIALS_UNLIT;\n/**\n * [`KHR_materials_unlit`](https://github.com/KhronosGroup/gltf/blob/main/extensions/2.0/Khronos/KHR_materials_unlit/)\n * defines an unlit shading model for use in glTF 2.0 materials.\n *\n * \n *\n * > _**Figure:** Unlit materials are useful for flat shading, stylized effects, and for improving\n * > performance on mobile devices. Source: [Model by Hayden VanEarden](https://sketchfab.com/3d-models/summertime-kirby-c5711316103a4d67a62c34cfe8710938)._\n *\n * Unlit (also \"Shadeless\" or \"Constant\") materials provide a simple alternative to the Physically\n * Based Rendering (PBR) shading models provided by the core specification. Unlit materials are\n * often useful for cheaper rendering on performance-contrained devices, e.g. mobile phones.\n * Additionally, unlit materials can be very useful in achieving stylized, non-photo-realistic\n * effects like hand painted illustrative styles or baked toon shaders.\n *\n * Properties:\n * - {@link Unlit}\n *\n * ### Example\n *\n * The `KHRMaterialsUnlit` class provides a single {@link ExtensionProperty} type, `Unlit`, which may\n * be attached to any {@link Material} instance. For example:\n *\n * ```typescript\n * import { KHRMaterialsUnlit, Unlit } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const unlitExtension = document.createExtension(KHRMaterialsUnlit);\n *\n * // Create an Unlit property.\n * const unlit = unlitExtension.createUnlit();\n *\n * // Attach the property to a Material.\n * material.setExtension('KHR_materials_unlit', unlit);\n * ```\n */\nclass KHRMaterialsUnlit extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$6;\n this.prereadTypes = [PropertyType.MESH];\n this.prewriteTypes = [PropertyType.MESH];\n }\n /** Creates a new Unlit property for use on a {@link Material}. */\n createUnlit() {\n return new Unlit(this.document.getGraph());\n }\n /** @hidden */\n read(_context) {\n return this;\n }\n /** @hidden */\n write(_context) {\n return this;\n }\n /** @hidden */\n preread(context) {\n const materialDefs = context.jsonDoc.json.materials || [];\n materialDefs.forEach((materialDef, materialIndex) => {\n if (materialDef.extensions && materialDef.extensions[NAME$6]) {\n context.materials[materialIndex].setExtension(NAME$6, this.createUnlit());\n }\n });\n return this;\n }\n /** @hidden */\n prewrite(context) {\n const jsonDoc = context.jsonDoc;\n this.document.getRoot().listMaterials().forEach(material => {\n if (material.getExtension(NAME$6)) {\n const materialIndex = context.materialIndexMap.get(material);\n const materialDef = jsonDoc.json.materials[materialIndex];\n materialDef.extensions = materialDef.extensions || {};\n materialDef.extensions[NAME$6] = {};\n }\n });\n return this;\n }\n}\nKHRMaterialsUnlit.EXTENSION_NAME = NAME$6;\n\n/**\n * Maps {@link Variant}s to {@link Material}s. See {@link KHRMaterialsVariants}.\n */\nclass Mapping extends ExtensionProperty {\n init() {\n this.extensionName = KHR_MATERIALS_VARIANTS;\n this.propertyType = 'Mapping';\n this.parentTypes = ['MappingList'];\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n material: null,\n variants: new RefSet()\n });\n }\n /** The {@link Material} designated for this {@link Primitive}, under the given variants. */\n getMaterial() {\n return this.getRef('material');\n }\n /** The {@link Material} designated for this {@link Primitive}, under the given variants. */\n setMaterial(material) {\n return this.setRef('material', material);\n }\n /** Adds a {@link Variant} to this mapping. */\n addVariant(variant) {\n return this.addRef('variants', variant);\n }\n /** Removes a {@link Variant} from this mapping. */\n removeVariant(variant) {\n return this.removeRef('variants', variant);\n }\n /** Lists {@link Variant}s in this mapping. */\n listVariants() {\n return this.listRefs('variants');\n }\n}\nMapping.EXTENSION_NAME = KHR_MATERIALS_VARIANTS;\n\n/**\n * List of material variant {@link Mapping}s. See {@link KHRMaterialsVariants}.\n */\nclass MappingList extends ExtensionProperty {\n init() {\n this.extensionName = KHR_MATERIALS_VARIANTS;\n this.propertyType = 'MappingList';\n this.parentTypes = [PropertyType.PRIMITIVE];\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n mappings: new RefSet()\n });\n }\n /** Adds a {@link Mapping} to this mapping. */\n addMapping(mapping) {\n return this.addRef('mappings', mapping);\n }\n /** Removes a {@link Mapping} from the list for this {@link Primitive}. */\n removeMapping(mapping) {\n return this.removeRef('mappings', mapping);\n }\n /** Lists {@link Mapping}s in this {@link Primitive}. */\n listMappings() {\n return this.listRefs('mappings');\n }\n}\nMappingList.EXTENSION_NAME = KHR_MATERIALS_VARIANTS;\n\n/**\n * Defines a variant of a {@link Material}. See {@link KHRMaterialsVariants}.\n */\nclass Variant extends ExtensionProperty {\n init() {\n this.extensionName = KHR_MATERIALS_VARIANTS;\n this.propertyType = 'Variant';\n this.parentTypes = ['MappingList'];\n }\n}\nVariant.EXTENSION_NAME = KHR_MATERIALS_VARIANTS;\n\nconst NAME$5 = KHR_MATERIALS_VARIANTS;\n/**\n * [`KHR_materials_variants`](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_variants/)\n * defines alternate {@link Material} states for any {@link Primitive} in the scene.\n *\n * \n *\n * > _**Figure:** A sneaker, in three material variants. Source: Khronos Group._\n *\n * Uses include product configurators, night/day states, healthy/damaged states, etc. The\n * `KHRMaterialsVariants` class provides three {@link ExtensionProperty} types: `Variant`, `Mapping`,\n * and `MappingList`. When attached to {@link Primitive} properties, these offer flexible ways of\n * defining the variants available to an application. Triggering a variant is out of scope of this\n * extension, but could be handled in the application with a UI dropdown, particular game states,\n * and so on.\n *\n * Mesh geometry cannot be changed by this extension, although another extension\n * (tentative: `KHR_mesh_variants`) is under consideration by the Khronos Group, for that purpose.\n *\n * Properties:\n * - {@link Variant}\n * - {@link Mapping}\n * - {@link MappingList}\n *\n * ### Example\n *\n * ```typescript\n * import { KHRMaterialsVariants } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const variantExtension = document.createExtension(KHRMaterialsVariants);\n *\n * // Create some Variant states.\n * const healthyVariant = variantExtension.createVariant('Healthy');\n * const damagedVariant = variantExtension.createVariant('Damaged');\n *\n * // Create mappings from a Variant state to a Material.\n * const healthyMapping = variantExtension.createMapping()\n * \t.addVariant(healthyVariant)\n * \t.setMaterial(healthyMat);\n * const damagedMapping = variantExtension.createMapping()\n * \t.addVariant(damagedVariant)\n * \t.setMaterial(damagedMat);\n *\n * // Attach the mappings to a Primitive.\n * primitive.setExtension(\n * \t'KHR_materials_variants',\n * \tvariantExtension.createMappingList()\n * \t\t.addMapping(healthyMapping)\n * \t\t.addMapping(damagedMapping)\n * );\n * ```\n *\n * A few notes about this extension:\n *\n * 1. Viewers that don't recognized this extension will show the default material for each primitive\n * \t instead, so assign that material accordingly. This material can be — but doesn't have to be —\n * \t associated with one of the available variants.\n * 2. Mappings can list multiple Variants. In that case, the first Mapping containing an active\n * \t Variant will be chosen by the viewer.\n * 3. Variant names are how these states are identified, so choose informative names.\n * 4. When writing the file to an unpacked `.gltf`, instead of an embedded `.glb`, viewers will have\n * \t the option of downloading only textures associated with the default state, and lazy-loading\n * \t any textures for inactive Variants only when they are needed.\n */\nclass KHRMaterialsVariants extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$5;\n }\n /** Creates a new MappingList property. */\n createMappingList() {\n return new MappingList(this.document.getGraph());\n }\n /** Creates a new Variant property. */\n createVariant(name = '') {\n return new Variant(this.document.getGraph(), name);\n }\n /** Creates a new Mapping property. */\n createMapping() {\n return new Mapping(this.document.getGraph());\n }\n /** Lists all Variants on the current Document. */\n listVariants() {\n return Array.from(this.properties).filter(prop => prop instanceof Variant);\n }\n /** @hidden */\n read(context) {\n const jsonDoc = context.jsonDoc;\n if (!jsonDoc.json.extensions || !jsonDoc.json.extensions[NAME$5]) return this;\n // Read all top-level variant names.\n const variantsRootDef = jsonDoc.json.extensions[NAME$5];\n const variantDefs = variantsRootDef.variants || [];\n const variants = variantDefs.map(variantDef => this.createVariant().setName(variantDef.name || ''));\n // For each mesh primitive, read its material/variant mappings.\n const meshDefs = jsonDoc.json.meshes || [];\n meshDefs.forEach((meshDef, meshIndex) => {\n const mesh = context.meshes[meshIndex];\n const primDefs = meshDef.primitives || [];\n primDefs.forEach((primDef, primIndex) => {\n if (!primDef.extensions || !primDef.extensions[NAME$5]) {\n return;\n }\n const mappingList = this.createMappingList();\n const variantPrimDef = primDef.extensions[NAME$5];\n for (const mappingDef of variantPrimDef.mappings) {\n const mapping = this.createMapping();\n if (mappingDef.material !== undefined) {\n mapping.setMaterial(context.materials[mappingDef.material]);\n }\n for (const variantIndex of mappingDef.variants || []) {\n mapping.addVariant(variants[variantIndex]);\n }\n mappingList.addMapping(mapping);\n }\n mesh.listPrimitives()[primIndex].setExtension(NAME$5, mappingList);\n });\n });\n return this;\n }\n /** @hidden */\n write(context) {\n const jsonDoc = context.jsonDoc;\n const variants = this.listVariants();\n if (!variants.length) return this;\n // Write all top-level variant names.\n const variantDefs = [];\n const variantIndexMap = new Map();\n for (const variant of variants) {\n variantIndexMap.set(variant, variantDefs.length);\n variantDefs.push(context.createPropertyDef(variant));\n }\n // For each mesh primitive, write its material/variant mappings.\n for (const mesh of this.document.getRoot().listMeshes()) {\n const meshIndex = context.meshIndexMap.get(mesh);\n mesh.listPrimitives().forEach((prim, primIndex) => {\n const mappingList = prim.getExtension(NAME$5);\n if (!mappingList) return;\n const primDef = context.jsonDoc.json.meshes[meshIndex].primitives[primIndex];\n const mappingDefs = mappingList.listMappings().map(mapping => {\n const mappingDef = context.createPropertyDef(mapping);\n const material = mapping.getMaterial();\n if (material) {\n mappingDef.material = context.materialIndexMap.get(material);\n }\n mappingDef.variants = mapping.listVariants().map(variant => variantIndexMap.get(variant));\n return mappingDef;\n });\n primDef.extensions = primDef.extensions || {};\n primDef.extensions[NAME$5] = {\n mappings: mappingDefs\n };\n });\n }\n jsonDoc.json.extensions = jsonDoc.json.extensions || {};\n jsonDoc.json.extensions[NAME$5] = {\n variants: variantDefs\n };\n return this;\n }\n}\nKHRMaterialsVariants.EXTENSION_NAME = NAME$5;\n\nconst {\n G\n} = TextureChannel;\n/**\n * Defines volume on a PBR {@link Material}. See {@link KHRMaterialsVolume}.\n */\nclass Volume extends ExtensionProperty {\n init() {\n this.extensionName = KHR_MATERIALS_VOLUME;\n this.propertyType = 'Volume';\n this.parentTypes = [PropertyType.MATERIAL];\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n thicknessFactor: 0.0,\n thicknessTexture: null,\n thicknessTextureInfo: new TextureInfo(this.graph, 'thicknessTexture'),\n attenuationDistance: Infinity,\n attenuationColor: [1.0, 1.0, 1.0]\n });\n }\n /**********************************************************************************************\n * Thickness.\n */\n /**\n * Thickness of the volume beneath the surface in meters in the local coordinate system of the\n * node. If the value is 0 the material is thin-walled. Otherwise the material is a volume\n * boundary. The doubleSided property has no effect on volume boundaries.\n */\n getThicknessFactor() {\n return this.get('thicknessFactor');\n }\n /**\n * Thickness of the volume beneath the surface in meters in the local coordinate system of the\n * node. If the value is 0 the material is thin-walled. Otherwise the material is a volume\n * boundary. The doubleSided property has no effect on volume boundaries.\n */\n setThicknessFactor(factor) {\n return this.set('thicknessFactor', factor);\n }\n /**\n * Texture that defines the thickness, stored in the G channel. This will be multiplied by\n * thicknessFactor.\n */\n getThicknessTexture() {\n return this.getRef('thicknessTexture');\n }\n /**\n * Settings affecting the material's use of its thickness texture. If no texture is attached,\n * {@link TextureInfo} is `null`.\n */\n getThicknessTextureInfo() {\n return this.getRef('thicknessTexture') ? this.getRef('thicknessTextureInfo') : null;\n }\n /**\n * Texture that defines the thickness, stored in the G channel. This will be multiplied by\n * thicknessFactor.\n */\n setThicknessTexture(texture) {\n return this.setRef('thicknessTexture', texture, {\n channels: G\n });\n }\n /**********************************************************************************************\n * Attenuation.\n */\n /**\n * Density of the medium given as the average distance in meters that light travels in the\n * medium before interacting with a particle.\n */\n getAttenuationDistance() {\n return this.get('attenuationDistance');\n }\n /**\n * Density of the medium given as the average distance in meters that light travels in the\n * medium before interacting with a particle.\n */\n setAttenuationDistance(distance) {\n return this.set('attenuationDistance', distance);\n }\n /**\n * Color (linear) that white light turns into due to absorption when reaching the attenuation\n * distance.\n */\n getAttenuationColor() {\n return this.get('attenuationColor');\n }\n /**\n * Color (linear) that white light turns into due to absorption when reaching the attenuation\n * distance.\n */\n setAttenuationColor(color) {\n return this.set('attenuationColor', color);\n }\n}\nVolume.EXTENSION_NAME = KHR_MATERIALS_VOLUME;\n\nconst NAME$4 = KHR_MATERIALS_VOLUME;\n/**\n * [KHR_materials_volume](https://github.com/KhronosGroup/gltf/blob/main/extensions/2.0/Khronos/KHR_materials_volume/)\n * adds refraction, absorption, or scattering to a glTF PBR material already using transmission or\n * translucency.\n *\n * \n *\n * > _**Figure:** Base color changes the amount of light passing through the volume boundary\n * > (left). The overall color of the object is the same everywhere, as if the object is covered\n * > with a colored, transparent foil. Absorption changes the amount of light traveling through the\n * > volume (right). The overall color depends on the distance the light traveled through it; at\n * > small distances (tail of the dragon) less light is absorbed and the color is brighter than at\n * > large distances. Source: Khronos Group._\n *\n * By default, a glTF 2.0 material describes the scattering properties of a surface enclosing an\n * infinitely thin volume. The surface defined by the mesh represents a thin wall. The volume\n * extension makes it possible to turn the surface into an interface between volumes. The mesh to\n * which the material is attached defines the boundaries of an homogeneous medium and therefore must\n * be manifold. Volumes provide effects like refraction, absorption and scattering. Scattering\n * effects will require future (TBD) extensions.\n *\n * The volume extension must be combined with {@link KHRMaterialsTransmission} or\n * `KHR_materials_translucency` in order to define entry of light into the volume.\n *\n * Properties:\n * - {@link Volume}\n *\n * ### Example\n *\n * The `KHRMaterialsVolume` class provides a single {@link ExtensionProperty} type, `Volume`, which\n * may be attached to any {@link Material} instance. For example:\n *\n * ```typescript\n * import { KHRMaterialsVolume, Volume } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const volumeExtension = document.createExtension(KHRMaterialsVolume);\n *\n * // Create a Volume property.\n * const volume = volumeExtension.createVolume()\n * \t.setThicknessFactor(1.0)\n * \t.setThicknessTexture(texture)\n * \t.setAttenuationDistance(1.0)\n * \t.setAttenuationColorFactor([1, 0.5, 0.5]);\n *\n * // Attach the property to a Material.\n * material.setExtension('KHR_materials_volume', volume);\n * ```\n *\n * A thickness texture is required in most realtime renderers, and can be baked in software such as\n * Blender or Substance Painter. When `thicknessFactor = 0`, all volumetric effects are disabled.\n */\nclass KHRMaterialsVolume extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$4;\n this.prereadTypes = [PropertyType.MESH];\n this.prewriteTypes = [PropertyType.MESH];\n }\n /** Creates a new Volume property for use on a {@link Material}. */\n createVolume() {\n return new Volume(this.document.getGraph());\n }\n /** @hidden */\n read(_context) {\n return this;\n }\n /** @hidden */\n write(_context) {\n return this;\n }\n /** @hidden */\n preread(context) {\n const jsonDoc = context.jsonDoc;\n const materialDefs = jsonDoc.json.materials || [];\n const textureDefs = jsonDoc.json.textures || [];\n materialDefs.forEach((materialDef, materialIndex) => {\n if (materialDef.extensions && materialDef.extensions[NAME$4]) {\n const volume = this.createVolume();\n context.materials[materialIndex].setExtension(NAME$4, volume);\n const volumeDef = materialDef.extensions[NAME$4];\n // Factors.\n if (volumeDef.thicknessFactor !== undefined) {\n volume.setThicknessFactor(volumeDef.thicknessFactor);\n }\n if (volumeDef.attenuationDistance !== undefined) {\n volume.setAttenuationDistance(volumeDef.attenuationDistance);\n }\n if (volumeDef.attenuationColor !== undefined) {\n volume.setAttenuationColor(volumeDef.attenuationColor);\n }\n // Textures.\n if (volumeDef.thicknessTexture !== undefined) {\n const textureInfoDef = volumeDef.thicknessTexture;\n const texture = context.textures[textureDefs[textureInfoDef.index].source];\n volume.setThicknessTexture(texture);\n context.setTextureInfo(volume.getThicknessTextureInfo(), textureInfoDef);\n }\n }\n });\n return this;\n }\n /** @hidden */\n prewrite(context) {\n const jsonDoc = context.jsonDoc;\n this.document.getRoot().listMaterials().forEach(material => {\n const volume = material.getExtension(NAME$4);\n if (volume) {\n const materialIndex = context.materialIndexMap.get(material);\n const materialDef = jsonDoc.json.materials[materialIndex];\n materialDef.extensions = materialDef.extensions || {};\n // Factors.\n const volumeDef = materialDef.extensions[NAME$4] = {};\n if (volume.getThicknessFactor() > 0) {\n volumeDef.thicknessFactor = volume.getThicknessFactor();\n }\n if (Number.isFinite(volume.getAttenuationDistance())) {\n volumeDef.attenuationDistance = volume.getAttenuationDistance();\n }\n if (!MathUtils.eq(volume.getAttenuationColor(), [1, 1, 1])) {\n volumeDef.attenuationColor = volume.getAttenuationColor();\n }\n // Textures.\n if (volume.getThicknessTexture()) {\n const texture = volume.getThicknessTexture();\n const textureInfo = volume.getThicknessTextureInfo();\n volumeDef.thicknessTexture = context.createTextureInfoDef(texture, textureInfo);\n }\n }\n });\n return this;\n }\n}\nKHRMaterialsVolume.EXTENSION_NAME = NAME$4;\n\nconst NAME$3 = KHR_MESH_QUANTIZATION;\n/**\n * [`KHR_mesh_quantization`](https://github.com/KhronosGroup/gltf/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/)\n * expands allowed component types for vertex attributes to include 16- and 8-bit storage.\n *\n * Quantization provides a memory/precision tradeoff — depending on the application needs, 16-bit or\n * 8-bit storage can be sufficient for mesh geometry, at 1/2 or 1/4 the size. For example, a 10x10\n * mesh might be written to a uint16 {@link Accessor}, with values `0–65536`, normalized to be\n * interpreted as `0–1`. With an additional 10x scale on any node {@link Node} instantiating the\n * quantized {@link Mesh}, the model retains its original scale with a minimal quality loss and\n * up to 50% file size reduction.\n *\n * Defining no {@link ExtensionProperty} types, this {@link Extension} is simply attached to the\n * {@link Document}, and affects the entire Document by allowing more flexible use of\n * {@link Accessor} types for vertex attributes. Without the Extension, the same use of these data\n * types would yield an invalid glTF document, under the stricter core glTF specification.\n *\n * Properties:\n * - N/A\n *\n * ### Example\n *\n * ```typescript\n * import { KHRMeshQuantization } from '@gltf-transform/extensions';\n * import { quantize } from '@gltf-transform/functions';\n *\n * // Create an Extension attached to the Document.\n * const quantizationExtension = document.createExtension(KHRMeshQuantization).setRequired(true);\n *\n * // Use Uint16Array, Uint8Array, Int16Array, and Int8Array in vertex accessors manually,\n * // or apply the provided quantize() function to compute quantized accessors automatically:\n * await document.transform(quantize({\n * \tquantizePosition: 16,\n * \tquantizeNormal: 12,\n * \tquantizeTexcoord: 14\n * }));\n * ```\n *\n * For more documentation about automatic quantization, see the {@link quantize} function.\n */\nclass KHRMeshQuantization extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$3;\n }\n /** @hidden */\n read(_) {\n return this;\n }\n /** @hidden */\n write(_) {\n return this;\n }\n}\nKHRMeshQuantization.EXTENSION_NAME = NAME$3;\n\nconst NAME$2 = KHR_TEXTURE_BASISU;\nclass KTX2ImageUtils {\n match(array) {\n return array[0] === 0xab && array[1] === 0x4b && array[2] === 0x54 && array[3] === 0x58 && array[4] === 0x20 && array[5] === 0x32 && array[6] === 0x30 && array[7] === 0xbb && array[8] === 0x0d && array[9] === 0x0a && array[10] === 0x1a && array[11] === 0x0a;\n }\n getSize(array) {\n const container = read(array);\n return [container.pixelWidth, container.pixelHeight];\n }\n getChannels(array) {\n const container = read(array);\n const dfd = container.dataFormatDescriptor[0];\n if (dfd.colorModel === KHR_DF_MODEL_ETC1S) {\n return dfd.samples.length === 2 && (dfd.samples[1].channelType & 0xf) === 15 ? 4 : 3;\n } else if (dfd.colorModel === KHR_DF_MODEL_UASTC) {\n return (dfd.samples[0].channelType & 0xf) === 3 ? 4 : 3;\n }\n throw new Error(`Unexpected KTX2 colorModel, \"${dfd.colorModel}\".`);\n }\n getVRAMByteLength(array) {\n const container = read(array);\n const hasAlpha = this.getChannels(array) > 3;\n let uncompressedBytes = 0;\n for (let i = 0; i < container.levels.length; i++) {\n const level = container.levels[i];\n // Use level.uncompressedByteLength for UASTC; for ETC1S it's 0.\n if (level.uncompressedByteLength) {\n uncompressedBytes += level.uncompressedByteLength;\n } else {\n const levelWidth = Math.max(1, Math.floor(container.pixelWidth / Math.pow(2, i)));\n const levelHeight = Math.max(1, Math.floor(container.pixelHeight / Math.pow(2, i)));\n const blockSize = hasAlpha ? 16 : 8;\n uncompressedBytes += levelWidth / 4 * (levelHeight / 4) * blockSize;\n }\n }\n return uncompressedBytes;\n }\n}\n/**\n * [`KHR_texture_basisu`](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu)\n * enables KTX2 GPU textures with Basis Universal supercompression for any material texture.\n *\n * GPU texture formats, unlike traditional image formats, remain compressed in GPU memory. As a\n * result, they (1) upload to the GPU much more quickly, and (2) require much less GPU memory. In\n * certain cases they may also have smaller filesizes than PNG or JPEG textures, but this is not\n * guaranteed. GPU textures often require more careful tuning during compression to maintain image\n * quality, but this extra effort is worthwhile for applications that need to maintain a smooth\n * framerate while uploading images, or where GPU memory is limited.\n *\n * Defining no {@link ExtensionProperty} types, this {@link Extension} is simply attached to the\n * {@link Document}, and affects the entire Document by allowing use of the `image/ktx2` MIME type\n * and passing KTX2 image data to the {@link Texture.setImage} method. Without the Extension, the\n * same MIME types and image data would yield an invalid glTF document, under the stricter core glTF\n * specification.\n *\n * Properties:\n * - N/A\n *\n * ### Example\n *\n * ```typescript\n * import { KHRTextureBasisu } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const basisuExtension = document.createExtension(KHRTextureBasisu)\n * \t.setRequired(true);\n * document.createTexture('MyCompressedTexture')\n * \t.setMimeType('image/ktx2')\n * \t.setImage(fs.readFileSync('my-texture.ktx2'));\n * ```\n *\n * Compression is not done automatically when adding the extension as shown above — you must\n * compress the image data first, then pass the `.ktx2` payload to {@link Texture.setImage}. The\n * glTF Transform CLI has functions to help with this, or any similar KTX2-capable\n * utility will work.\n *\n * When the `KHR_texture_basisu` extension is added to a file by glTF Transform, the extension\n * should always be required. This tool does not support writing assets that \"fall back\" to optional\n * PNG or JPEG image data.\n *\n * > _**NOTICE:** Compressing some textures — particularly 3-component (RGB) normal maps, and\n * > occlusion/roughness/metalness maps, may give poor results with the ETC1S compression option.\n * > These issues can often be avoided with the larger UASTC compression option, or by upscaling the\n * > texture before compressing it.\n * >\n * > For best results when authoring new textures, use\n * > [texture dilation](https://docs.substance3d.com/spdoc/padding-134643719.html) and minimize\n * > prominent UV seams._\n */\nclass KHRTextureBasisu extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$2;\n /** @hidden */\n this.prereadTypes = [PropertyType.TEXTURE];\n }\n /** @hidden */\n static register() {\n ImageUtils.registerFormat('image/ktx2', new KTX2ImageUtils());\n }\n /** @hidden */\n preread(context) {\n context.jsonDoc.json.textures.forEach(textureDef => {\n if (textureDef.extensions && textureDef.extensions[NAME$2]) {\n const basisuDef = textureDef.extensions[NAME$2];\n textureDef.source = basisuDef.source;\n }\n });\n return this;\n }\n /** @hidden */\n read(context) {\n return this;\n }\n /** @hidden */\n write(context) {\n const jsonDoc = context.jsonDoc;\n this.document.getRoot().listTextures().forEach(texture => {\n if (texture.getMimeType() === 'image/ktx2') {\n const imageIndex = context.imageIndexMap.get(texture);\n jsonDoc.json.textures.forEach(textureDef => {\n if (textureDef.source === imageIndex) {\n textureDef.extensions = textureDef.extensions || {};\n textureDef.extensions[NAME$2] = {\n source: textureDef.source\n };\n delete textureDef.source;\n }\n });\n }\n });\n return this;\n }\n}\nKHRTextureBasisu.EXTENSION_NAME = NAME$2;\n\n/**\n * Defines UV transform for a {@link TextureInfo}. See {@link KHRTextureTransform}.\n */\nclass Transform extends ExtensionProperty {\n init() {\n this.extensionName = KHR_TEXTURE_TRANSFORM;\n this.propertyType = 'Transform';\n this.parentTypes = [PropertyType.TEXTURE_INFO];\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n offset: [0.0, 0.0],\n rotation: 0,\n scale: [1.0, 1.0],\n texCoord: null\n });\n }\n getOffset() {\n return this.get('offset');\n }\n setOffset(offset) {\n return this.set('offset', offset);\n }\n getRotation() {\n return this.get('rotation');\n }\n setRotation(rotation) {\n return this.set('rotation', rotation);\n }\n getScale() {\n return this.get('scale');\n }\n setScale(scale) {\n return this.set('scale', scale);\n }\n getTexCoord() {\n return this.get('texCoord');\n }\n setTexCoord(texCoord) {\n return this.set('texCoord', texCoord);\n }\n}\nTransform.EXTENSION_NAME = KHR_TEXTURE_TRANSFORM;\n\nconst NAME$1 = KHR_TEXTURE_TRANSFORM;\n/**\n * [`KHR_texture_transform`](https://github.com/KhronosGroup/gltf/blob/main/extensions/2.0/Khronos/KHR_texture_transform/)\n * adds offset, rotation, and scale to {@link TextureInfo} properties.\n *\n * Affine UV transforms are useful for reducing the number of textures the GPU must load, improving\n * performance when used in techniques like texture atlases. UV transforms cannot be animated at\n * this time.\n *\n * Properties:\n * - {@link Transform}\n *\n * ### Example\n *\n * The `KHRTextureTransform` class provides a single {@link ExtensionProperty} type, `Transform`, which\n * may be attached to any {@link TextureInfo} instance. For example:\n *\n * ```typescript\n * import { KHRTextureTransform } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const transformExtension = document.createExtension(KHRTextureTransform)\n * \t.setRequired(true);\n *\n * // Create a reusable Transform.\n * const transform = transformExtension.createTransform()\n * \t.setScale([100, 100]);\n *\n * // Apply the Transform to a Material's baseColorTexture.\n * document.createMaterial()\n * \t.setBaseColorTexture(myTexture)\n * \t.getBaseColorTextureInfo()\n * \t.setExtension('KHR_texture_transform', transform);\n * ```\n */\nclass KHRTextureTransform extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME$1;\n }\n /** Creates a new Transform property for use on a {@link TextureInfo}. */\n createTransform() {\n return new Transform(this.document.getGraph());\n }\n /** @hidden */\n read(context) {\n for (const [textureInfo, textureInfoDef] of Array.from(context.textureInfos.entries())) {\n if (!textureInfoDef.extensions || !textureInfoDef.extensions[NAME$1]) continue;\n const transform = this.createTransform();\n const transformDef = textureInfoDef.extensions[NAME$1];\n if (transformDef.offset !== undefined) transform.setOffset(transformDef.offset);\n if (transformDef.rotation !== undefined) transform.setRotation(transformDef.rotation);\n if (transformDef.scale !== undefined) transform.setScale(transformDef.scale);\n if (transformDef.texCoord !== undefined) transform.setTexCoord(transformDef.texCoord);\n textureInfo.setExtension(NAME$1, transform);\n }\n return this;\n }\n /** @hidden */\n write(context) {\n const textureInfoEntries = Array.from(context.textureInfoDefMap.entries());\n for (const [textureInfo, textureInfoDef] of textureInfoEntries) {\n const transform = textureInfo.getExtension(NAME$1);\n if (!transform) continue;\n textureInfoDef.extensions = textureInfoDef.extensions || {};\n const transformDef = {};\n const eq = MathUtils.eq;\n if (!eq(transform.getOffset(), [0, 0])) transformDef.offset = transform.getOffset();\n if (transform.getRotation() !== 0) transformDef.rotation = transform.getRotation();\n if (!eq(transform.getScale(), [1, 1])) transformDef.scale = transform.getScale();\n if (transform.getTexCoord() != null) transformDef.texCoord = transform.getTexCoord();\n textureInfoDef.extensions[NAME$1] = transformDef;\n }\n return this;\n }\n}\nKHRTextureTransform.EXTENSION_NAME = NAME$1;\n\nconst PARENT_TYPES = [PropertyType.ROOT, PropertyType.SCENE, PropertyType.NODE, PropertyType.MESH, PropertyType.MATERIAL, PropertyType.TEXTURE, PropertyType.ANIMATION];\n/**\n * Defines an XMP packet associated with a Document or Property. See {@link KHRXMP}.\n */\nclass Packet extends ExtensionProperty {\n init() {\n this.extensionName = KHR_XMP_JSON_LD;\n this.propertyType = 'Packet';\n this.parentTypes = PARENT_TYPES;\n }\n getDefaults() {\n return Object.assign(super.getDefaults(), {\n context: {},\n properties: {}\n });\n }\n /**********************************************************************************************\n * Context.\n */\n /**\n * Returns the XMP context definition URL for the given term.\n * See: https://json-ld.org/spec/latest/json-ld/#the-context\n * @param term Case-sensitive term. Usually a concise, lowercase, alphanumeric identifier.\n */\n getContext() {\n return this.get('context');\n }\n /**\n * Sets the XMP context definition URL for the given term.\n * See: https://json-ld.org/spec/latest/json-ld/#the-context\n *\n * Example:\n *\n * ```typescript\n * packet.setContext({\n * dc: 'http://purl.org/dc/elements/1.1/',\n * model3d: 'https://schema.khronos.org/model3d/xsd/1.0/',\n * });\n * ```\n *\n * @param term Case-sensitive term. Usually a concise, lowercase, alphanumeric identifier.\n * @param definition URI for XMP namespace.\n */\n setContext(context) {\n return this.set('context', _extends({}, context));\n }\n /**********************************************************************************************\n * Properties.\n */\n /**\n * Lists properties defined in this packet.\n *\n * Example:\n *\n * ```typescript\n * packet.listProperties(); // → ['dc:Language', 'dc:Creator', 'xmp:CreateDate']\n * ```\n */\n listProperties() {\n return Object.keys(this.get('properties'));\n }\n /**\n * Returns the value of a property, as a literal or JSONLD object.\n *\n * Example:\n *\n * ```typescript\n * packet.getProperty('dc:Creator'); // → {\"@list\": [\"Acme, Inc.\"]}\n * packet.getProperty('dc:Title'); // → {\"@type\": \"rdf:Alt\", \"rdf:_1\": {\"@language\": \"en-US\", \"@value\": \"Lamp\"}}\n * packet.getProperty('xmp:CreateDate'); // → \"2022-01-01\"\n * ```\n */\n getProperty(name) {\n const properties = this.get('properties');\n return name in properties ? properties[name] : null;\n }\n /**\n * Sets the value of a property, as a literal or JSONLD object.\n *\n * Example:\n *\n * ```typescript\n * packet.setProperty('dc:Creator', {'@list': ['Acme, Inc.']});\n * packet.setProperty('dc:Title', {\n * \t'@type': 'rdf:Alt',\n * \t'rdf:_1': {'@language': 'en-US', '@value': 'Lamp'}\n * });\n * packet.setProperty('model3d:preferredSurfaces', {'@list': ['vertical']});\n * ```\n */\n setProperty(name, value) {\n this._assertContext(name);\n const properties = _extends({}, this.get('properties'));\n if (value) {\n properties[name] = value;\n } else {\n delete properties[name];\n }\n return this.set('properties', properties);\n }\n /**********************************************************************************************\n * Serialize / Deserialize.\n */\n /**\n * Serializes the packet context and properties to a JSONLD object.\n */\n toJSONLD() {\n const context = copyJSON(this.get('context'));\n const properties = copyJSON(this.get('properties'));\n return _extends({\n '@context': context\n }, properties);\n }\n /**\n * Deserializes a JSONLD packet, then overwrites existing context and properties with\n * the new values.\n */\n fromJSONLD(jsonld) {\n jsonld = copyJSON(jsonld);\n // Context.\n const context = jsonld['@context'];\n if (context) this.set('context', context);\n delete jsonld['@context'];\n // Properties.\n return this.set('properties', jsonld);\n }\n /**********************************************************************************************\n * Validation.\n */\n /** @hidden */\n _assertContext(name) {\n const prefix = name.split(':')[0];\n if (!(prefix in this.get('context'))) {\n throw new Error(`${KHR_XMP_JSON_LD}: Missing context for term, \"${name}\".`);\n }\n }\n}\nPacket.EXTENSION_NAME = KHR_XMP_JSON_LD;\nfunction copyJSON(object) {\n return JSON.parse(JSON.stringify(object));\n}\n\nconst NAME = KHR_XMP_JSON_LD;\n/**\n * [KHR_xmp_json_ld](https://github.com/KhronosGroup/gltf/blob/main/extensions/2.0/Khronos/KHR_xmp_json_ld/)\n * defines XMP metadata associated with a glTF asset.\n *\n * XMP metadata provides standardized fields describing the content, provenance, usage\n * restrictions, or other attributes of a 3D model. XMP metadata does not generally affect the\n * parsing or runtime behavior of the content — for that, use custom extensions, custom vertex\n * attributes, or extras. Similarly, storage mechanisms other than XMP should be preferred\n * for binary content like mesh data, animations, or textures.\n *\n * Generally XMP metadata is associated with the entire glTF asset by attaching an XMP {@link Packet}\n * to the document {@link Root}. In less common cases where metadata must be associated with\n * specific subsets of a document, XMP Packets may be attached to {@link Scene}, {@link Node},\n * {@link Mesh}, {@link Material}, {@link Texture}, or {@link Animation} properties.\n *\n * Within each packet, XMP properties become available when an\n * [XMP namespace](https://www.adobe.io/xmp/docs/XMPNamespaces/) is registered\n * with {@link Packet.setContext}. Packets cannot use properties whose namespaces are not\n * registered as context. While not all XMP namespaces are relevant to 3D assets, some common\n * namespaces provide useful metadata about authorship and provenance. Additionally, the `model3d`\n * namespace provides certain properties specific to 3D content, such as Augmented Reality (AR)\n * orientation data.\n *\n * Common XMP contexts for 3D models include:\n *\n * | Prefix | URI | Name |\n * |:------------|:--------------------------------------------|:-------------------------------|\n * | `dc` | http://purl.org/dc/elements/1.1/ | Dublin Core |\n * | `model3d` | https://schema.khronos.org/model3d/xsd/1.0/ | Model 3D |\n * | `rdf` | http://www.w3.org/1999/02/22-rdf-syntax-ns# | Resource Description Framework |\n * | `xmp` | http://ns.adobe.com/xap/1.0/ | XMP |\n * | `xmpRights` | http://ns.adobe.com/xap/1.0/rights/ | XMP Rights Management |\n *\n * Only the XMP contexts required for a packet should be assigned, and different packets\n * in the same asset may use different contexts. For greater detail on available XMP\n * contexts and how to use them in glTF assets, see the\n * [3DC Metadata Recommendations](https://github.com/KhronosGroup/3DC-Metadata-Recommendations/blob/main/model3d.md).\n *\n * Properties:\n * - {@link Packet}\n *\n * ### Example\n *\n * ```typescript\n * import { KHRXMP, Packet } from '@gltf-transform/extensions';\n *\n * // Create an Extension attached to the Document.\n * const xmpExtension = document.createExtension(KHRXMP);\n *\n * // Create Packet property.\n * const packet = xmpExtension.createPacket()\n * \t.setContext({\n * \t\tdc: 'http://purl.org/dc/elements/1.1/',\n * \t})\n *\t.setProperty('dc:Creator', {\"@list\": [\"Acme, Inc.\"]});\n *\n * // Option 1: Assign to Document Root.\n * document.getRoot().setExtension('KHR_xmp_json_ld', packet);\n *\n * // Option 2: Assign to a specific Property.\n * texture.setExtension('KHR_xmp_json_ld', packet);\n * ```\n */\nclass KHRXMP extends Extension {\n constructor(...args) {\n super(...args);\n this.extensionName = NAME;\n }\n /** Creates a new XMP packet, to be linked with a {@link Document} or {@link Property Properties}. */\n createPacket() {\n return new Packet(this.document.getGraph());\n }\n /** Lists XMP packets currently defined in a {@link Document}. */\n listPackets() {\n return Array.from(this.properties);\n }\n /** @hidden */\n read(context) {\n var _context$jsonDoc$json;\n const extensionDef = (_context$jsonDoc$json = context.jsonDoc.json.extensions) == null ? void 0 : _context$jsonDoc$json[NAME];\n if (!extensionDef || !extensionDef.packets) return this;\n // Deserialize packets.\n const json = context.jsonDoc.json;\n const root = this.document.getRoot();\n const packets = extensionDef.packets.map(packetDef => this.createPacket().fromJSONLD(packetDef));\n const defLists = [[json.asset], json.scenes, json.nodes, json.meshes, json.materials, json.images, json.animations];\n const propertyLists = [[root], root.listScenes(), root.listNodes(), root.listMeshes(), root.listMaterials(), root.listTextures(), root.listAnimations()];\n // Assign packets.\n for (let i = 0; i < defLists.length; i++) {\n const defs = defLists[i] || [];\n for (let j = 0; j < defs.length; j++) {\n const def = defs[j];\n if (def.extensions && def.extensions[NAME]) {\n const xmpDef = def.extensions[NAME];\n propertyLists[i][j].setExtension(NAME, packets[xmpDef.packet]);\n }\n }\n }\n return this;\n }\n /** @hidden */\n write(context) {\n const {\n json\n } = context.jsonDoc;\n const packetDefs = [];\n for (const packet of this.properties) {\n // Serialize packets.\n packetDefs.push(packet.toJSONLD());\n // Assign packets.\n for (const parent of packet.listParents()) {\n let parentDef;\n switch (parent.propertyType) {\n case PropertyType.ROOT:\n parentDef = json.asset;\n break;\n case PropertyType.SCENE:\n parentDef = json.scenes[context.sceneIndexMap.get(parent)];\n break;\n case PropertyType.NODE:\n parentDef = json.nodes[context.nodeIndexMap.get(parent)];\n break;\n case PropertyType.MESH:\n parentDef = json.meshes[context.meshIndexMap.get(parent)];\n break;\n case PropertyType.MATERIAL:\n parentDef = json.materials[context.materialIndexMap.get(parent)];\n break;\n case PropertyType.TEXTURE:\n parentDef = json.images[context.imageIndexMap.get(parent)];\n break;\n case PropertyType.ANIMATION:\n parentDef = json.animations[context.animationIndexMap.get(parent)];\n break;\n default:\n parentDef = null;\n this.document.getLogger().warn(`[${NAME}]: Unsupported parent property, \"${parent.propertyType}\"`);\n break;\n }\n if (!parentDef) continue;\n parentDef.extensions = parentDef.extensions || {};\n parentDef.extensions[NAME] = {\n packet: packetDefs.length - 1\n };\n }\n }\n if (packetDefs.length > 0) {\n json.extensions = json.extensions || {};\n json.extensions[NAME] = {\n packets: packetDefs\n };\n }\n return this;\n }\n}\nKHRXMP.EXTENSION_NAME = NAME;\n\nconst KHRONOS_EXTENSIONS = [KHRDracoMeshCompression, KHRLightsPunctual, KHRMaterialsAnisotropy, KHRMaterialsClearcoat, KHRMaterialsDiffuseTransmission, KHRMaterialsDispersion, KHRMaterialsEmissiveStrength, KHRMaterialsIOR, KHRMaterialsIridescence, KHRMaterialsPBRSpecularGlossiness, KHRMaterialsSpecular, KHRMaterialsSheen, KHRMaterialsTransmission, KHRMaterialsUnlit, KHRMaterialsVariants, KHRMaterialsVolume, KHRMeshQuantization, KHRTextureBasisu, KHRTextureTransform, KHRXMP];\nconst ALL_EXTENSIONS = [EXTMeshGPUInstancing, EXTMeshoptCompression, EXTTextureAVIF, EXTTextureWebP, ...KHRONOS_EXTENSIONS];\n\nexport { ALL_EXTENSIONS, Anisotropy, Clearcoat, DiffuseTransmission, Dispersion, EXTMeshGPUInstancing, EXTMeshoptCompression, EXTTextureAVIF, EXTTextureWebP, EmissiveStrength, INSTANCE_ATTRIBUTE, IOR, InstancedMesh, Iridescence, KHRDracoMeshCompression, KHRLightsPunctual, KHRMaterialsAnisotropy, KHRMaterialsClearcoat, KHRMaterialsDiffuseTransmission, KHRMaterialsDispersion, KHRMaterialsEmissiveStrength, KHRMaterialsIOR, KHRMaterialsIridescence, KHRMaterialsPBRSpecularGlossiness, KHRMaterialsSheen, KHRMaterialsSpecular, KHRMaterialsTransmission, KHRMaterialsUnlit, KHRMaterialsVariants, KHRMaterialsVolume, KHRMeshQuantization, KHRONOS_EXTENSIONS, KHRTextureBasisu, KHRTextureTransform, KHRXMP, Light, Mapping, MappingList, PBRSpecularGlossiness, Packet, Sheen, Specular, Transform, Transmission, Unlit, Variant, Volume };\n//# sourceMappingURL=index.modern.js.map\n","import {\n Extension,\n ExtensionProperty,\n GLTF,\n Graph,\n Property,\n PropertyType,\n ReaderContext,\n Texture,\n TextureChannel,\n TextureInfo,\n WebIO,\n WriterContext,\n} from '@gltf-transform/core'\nimport {EncoderOptions} from '@gltf-transform/extensions/dist/khr-draco-mesh-compression/encoder'\nimport {ALL_EXTENSIONS, KHRDracoMeshCompression} from '@gltf-transform/extensions'\nimport {DRACOLoader2, GLTFExporter2, GLTFExporter2Options, GLTFViewerConfigExtension, IExportWriter} from 'threepipe'\n\n/**\n * GLTF Draco Exporter\n *\n * Extension of GLTFExporter2 that runs the output through gltf-transform for draco compression.\n */\nexport class GLTFDracoExporter extends GLTFExporter2 implements IExportWriter {\n public loader?: DRACOLoader2 // required for loading draco libs.\n private _io: WebIO\n private _loadedLibs = false\n private _encoderOptions: EncoderOptions\n\n constructor(encoderOptions?: EncoderOptions, loader?: DRACOLoader2) {\n super()\n encoderOptions = encoderOptions || {\n method: KHRDracoMeshCompression.EncoderMethod.EDGEBREAKER,\n encodeSpeed: 5,\n }\n this._io = new WebIO().registerExtensions(ALL_EXTENSIONS)\n this._encoderOptions = encoderOptions\n\n if (loader) {\n this.loader = loader\n this.loader.setDecoderConfig({type: 'js'}) // todo: hack for now.\n this.loader.preload(true, true)\n }\n\n }\n\n preload(): this {\n this._loadLibs()\n return this\n }\n\n private async _loadLibs() {\n if (this._loadedLibs || !this.loader) return\n\n const libs = await Promise.all([\n this.loader.initEncoder(),\n this.loader.initDecoder(),\n ])\n this._io.registerDependencies({\n ['draco3d.encoder']: libs[0],\n ['draco3d.decoder']: libs[1], // only required if we are loading a draco compressed gltf\n })\n this._loadedLibs = true\n\n }\n\n async parseAsync(obj: any, {compress = false, dracoOptions, ...options}: {compress: boolean, dracoOptions?: EncoderOptions} & GLTFExporter2Options, throwOnError = false): Promise<Blob> {\n if (!this.loader) {\n console.error('GLTFDracoExporter: No DRACOLoader2 instance provided')\n return super.parseAsync(obj, options)\n }\n await this._loadLibs()\n\n const ops = {...options}\n if (compress) {\n // externalImagesInExtras: this is required because gltf-transform doesn't support external images in glb\n // see https://github.com/donmccurdy/glTF-Transform/discussions/644\n ops.externalImagesInExtras = true\n }\n\n const uncompressed = await new Promise((resolve, reject) => this.parse(obj, resolve, reject, ops)) as any\n\n const uncompressedBlob = await super.parseAsync(uncompressed, ops)\n if (!compress) return uncompressedBlob\n\n try {\n if (!uncompressed) throw new Error('GLTFDracoExporter: gltf is null')\n\n let gltf = uncompressed\n\n const bytes = (gltf as ArrayBuffer).byteLength || Infinity\n\n const iDocument = await (typeof gltf === 'object' && !(gltf as any).byteLength ? this._io.readJSON({\n json: gltf as GLTF.IGLTF,\n resources: {},\n }) : this._io.readBinary(new Uint8Array(gltf as ArrayBuffer)))\n\n // iDocument.createExtension(GLTFViewerConfigExtensionGP)\n iDocument.createExtension(KHRDracoMeshCompression)\n .setRequired(true)\n .setEncoderOptions({...this._encoderOptions, ...dracoOptions ?? {}})\n\n if (ops.exportExt === 'glb') {\n gltf = await this._io.writeBinary(iDocument)\n if (isFinite(bytes)) {\n console.log('DRACO Compression ratio: ' + ((gltf as ArrayBuffer).byteLength / bytes).toFixed(5))\n }\n } else {\n const jDoc = await this._io.writeJSON(iDocument)\n gltf = jDoc.json\n if (Object.values(jDoc.resources).filter(v => v).length > 0) {\n console.warn('DRACOExporter: extra resources in resources not supported properly')\n ;(gltf as any).resources = jDoc.resources\n }\n }\n\n gltf.__isGLTFOutput = true\n const blob = await super.parseAsync(gltf, ops) as any // this will just convert it to blob because __isGLTFOutput is set (checked in GLTFExporter2)\n if (!blob) throw new Error('GLTFDracoExporter: blob is null')\n blob.ext = 'glb'\n ;(blob as any).__uncompressed = uncompressedBlob\n return blob\n } catch (e) {\n if (throwOnError) throw e\n console.error('Unable to compress glb with DRACO extension, fallback to uncompressed')\n console.error(e)\n return uncompressedBlob\n }\n }\n\n addExtension(...extension: (typeof Extension)[]): this {\n this._io.registerExtensions(extension)\n return this\n }\n createAndAddExtension(name: string, textures?: Record<string, string|number>): this {\n return this.addExtension(createGenericExtensionClass(name, textures))\n }\n createAndAddExtensions(extensions: [string, Record<string, string|number>|undefined][]): this {\n return this.addExtension(...extensions.map(e=> createGenericExtensionClass(e[0], e[1])))\n }\n}\n\ndeclare module 'threepipe'{\n interface GLTFExporter2Options {\n compress?: boolean\n dracoOptions?: EncoderOptions\n }\n}\n\n// for @gltf-transform/core\nclass ViewerJSONExtensionProperty extends ExtensionProperty {\n readonly extensionName: string = GLTFViewerConfigExtension.ViewerConfigGLTFExtension\n readonly parentTypes: string[] = [PropertyType.SCENE]\n readonly propertyType: string = 'ViewerJSON'\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n protected init(): void {return}\n\n}\nexport class GLTFViewerConfigExtensionGP extends Extension {\n public readonly extensionName = GLTFViewerConfigExtension.ViewerConfigGLTFExtension\n public static readonly EXTENSION_NAME = GLTFViewerConfigExtension.ViewerConfigGLTFExtension\n private _viewerConfig: any = {}\n // private _texturesRef: [any, Texture][] = []\n\n read(context: ReaderContext): this {\n this._viewerConfig = {}\n context.jsonDoc.json.scenes?.forEach((sceneDef, sceneIndex)=>{\n if (sceneDef.extensions && sceneDef.extensions[GLTFViewerConfigExtension.ViewerConfigGLTFExtension]) {\n const prop = new ViewerJSONExtensionProperty(this.document.getGraph())\n context.scenes[sceneIndex].setExtension(GLTFViewerConfigExtension.ViewerConfigGLTFExtension, prop)\n this._viewerConfig = sceneDef.extensions[GLTFViewerConfigExtension.ViewerConfigGLTFExtension] as any\n // prop.setExtras()\n\n /*\n const buffers = [] as any[]\n\n Object.values(viewerConfig.resources).forEach((res: any) => {\n Object.values(res).forEach((item: any) => {\n if (!item.url) return\n if (item.url.data?.image !== null) {\n buffers.push(item.url)\n }\n })\n })\n const jsonDoc = context.jsonDoc\n console.log(buffers)\n for (const buffer of buffers) {\n const img = buffer.data.image as number\n const imageDef = jsonDoc.json.images![img]\n const bufferViewDef = jsonDoc.json.bufferViews![imageDef.bufferView!]\n const bufferDef = jsonDoc.json.buffers![bufferViewDef.buffer]\n const bufferData = bufferDef.uri ? jsonDoc.resources[bufferDef.uri] : jsonDoc.resources[GLB_BUFFER]\n const byteOffset = bufferViewDef.byteOffset || 0\n const byteLength = bufferViewDef.byteLength\n const imageData = bufferData.slice(byteOffset, byteOffset + byteLength)\n const texture = this.document.createTexture(imageDef.name)\n texture.setImage(imageData)\n this._texturesRef.push([buffer, texture])\n }\n */\n\n\n }\n })\n return this\n }\n\n write(context: WriterContext): this {\n this.document.getRoot().listScenes().forEach((scene)=>{\n const prop = scene.getExtension(GLTFViewerConfigExtension.ViewerConfigGLTFExtension)\n if (prop) {\n const sceneDef = context.jsonDoc.json.scenes?.[context.jsonDoc.json.scene || 0] // todo: get proper scene index, if working with multiple scenes\n if (sceneDef && Object.keys(this._viewerConfig).length > 0) {\n sceneDef.extensions = sceneDef.extensions || {}\n\n /*\n console.log(context.jsonDoc.json.images)\n for (const [buffer, texture] of this._texturesRef) {\n const imageDef = context.createPropertyDef(texture) as GLTF.IImage\n context.createImageData(imageDef, texture.getImage()!, texture)\n buffer.data.image = context.jsonDoc.json.images!.push(imageDef) - 1\n context.imageIndexMap.set(texture, buffer.data.image)\n }\n console.log(context.jsonDoc.json)\n */\n\n sceneDef.extensions[GLTFViewerConfigExtension.ViewerConfigGLTFExtension] = this._viewerConfig\n\n // this._texturesRef = []\n this._viewerConfig = {}\n\n }\n }\n })\n\n return this\n }\n\n required = true\n}\n\nclass GenericExtensionProperty extends ExtensionProperty<any> {\n readonly extensionName: string\n readonly parentTypes: string[] = [PropertyType.MATERIAL, PropertyType.MESH, PropertyType.NODE, PropertyType.SCENE]\n readonly propertyType: string = 'GenericExtension'\n textures: Record<string, [TextureInfo, Texture|null]> = {}\n\n addTexture(key: string, texInfo: TextureInfo, texture: Texture | null, channels = 0x1111) {\n this.setRef(key, texture, {channels})\n this.textures[key] = [texInfo, texture]\n }\n\n constructor(graph: Graph<Property>, name: string, extensionName: string) {\n super(graph, name)\n this.extensionName = extensionName\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n protected init(): void {return}\n}\n\n// see transmission extension for reference\nabstract class GenericExtension extends Extension {\n abstract readonly extensionName: string\n\n textureChannels: Record<string, number> = {}\n\n read(context: ReaderContext): this {\n const jsonDoc = context.jsonDoc\n // console.log(jsonDoc)\n const materialDefs = jsonDoc.json.materials || []\n const textureDefs = jsonDoc.json.textures || []\n materialDefs.forEach((materialDef, materialIndex) => {\n if (materialDef.extensions && materialDef.extensions[this.extensionName]) {\n const paramsExt = new GenericExtensionProperty(this.document.getGraph(), '', this.extensionName)\n context.materials[materialIndex].setExtension(this.extensionName, paramsExt)\n const paramsExtDef = materialDef.extensions[this.extensionName] as Record<string, any>\n const paramsExtDef2 = {...paramsExtDef}\n\n for (const [key, value] of Object.entries(paramsExtDef2)) {\n if (typeof value?.index === 'number') { // this is a texture...\n const textureInfoDef = value\n const source = textureDefs[textureInfoDef.index]?.source\n if (typeof source !== 'number') {\n console.warn('GLTF Pipeline: source texture not found for texture info', textureInfoDef)\n continue\n }\n const texture = context.textures[source]\n const texInfo = new TextureInfo(this.document.getGraph())\n const channels = this.textureChannels[key] ?? 0x1111\n paramsExt.addTexture(key, texInfo, texture, channels)\n context.setTextureInfo(texInfo, textureInfoDef)\n delete paramsExtDef2[key]\n }\n }\n\n paramsExt.setExtras(paramsExtDef2)\n // console.log({...paramsExtDef})\n }\n })\n const meshDefs = jsonDoc.json.meshes || []\n meshDefs.forEach((meshDef, meshIndex) => {\n if (meshDef.extensions && meshDef.extensions[this.extensionName]) {\n const paramsExt = new GenericExtensionProperty(this.document.getGraph(), '', this.extensionName)\n context.meshes[meshIndex].setExtension(this.extensionName, paramsExt)\n const paramsExtDef = meshDef.extensions[this.extensionName] as Record<string, any>\n paramsExt.setExtras(paramsExtDef)\n }\n })\n const nodeDefs = jsonDoc.json.nodes || []\n nodeDefs.forEach((nodeDef, nodeIndex) => {\n if (nodeDef.extensions && nodeDef.extensions[this.extensionName]) {\n const paramsExt = new GenericExtensionProperty(this.document.getGraph(), '', this.extensionName)\n context.nodes[nodeIndex].setExtension(this.extensionName, paramsExt)\n const paramsExtDef = nodeDef.extensions[this.extensionName] as Record<string, any>\n paramsExt.setExtras(paramsExtDef)\n // console.log(paramsExtDef)\n }\n })\n const sceneDefs = jsonDoc.json.scenes || []\n sceneDefs.forEach((sceneDef, sceneIndex) => {\n if (sceneDef.extensions && sceneDef.extensions[this.extensionName]) {\n const paramsExt = new GenericExtensionProperty(this.document.getGraph(), '', this.extensionName)\n context.scenes[sceneIndex].setExtension(this.extensionName, paramsExt)\n const paramsExtDef = sceneDef.extensions[this.extensionName] as Record<string, any>\n paramsExt.setExtras(paramsExtDef)\n // console.log(paramsExtDef)\n }\n })\n\n return this\n }\n\n write(context: WriterContext): this {\n const jsonDoc = context.jsonDoc\n this.document.getRoot()\n .listMaterials()\n .forEach((material) => {\n const paramsExt = material.getExtension<GenericExtensionProperty>(this.extensionName)\n // console.log(paramsExt)\n if (paramsExt) {\n const materialIndex = context.materialIndexMap.get(material)!\n const materialDef = jsonDoc.json.materials![materialIndex]\n materialDef.extensions = materialDef.extensions || {}\n const extensionDef = paramsExt.getExtras()\n const extensionDef2 = {...extensionDef}\n\n // console.log(paramsExt.textures)\n for (const [key, value] of Object.entries(paramsExt.textures)) {\n const textureInfo = value[0]\n const textureLink = value[1]\n const texture = textureLink\n\n if (texture)\n extensionDef2[key] = context.createTextureInfoDef(texture, textureInfo)\n\n // console.log(texture)\n\n }\n // console.log(extensionDef2)\n\n materialDef.extensions[this.extensionName] = extensionDef2\n }\n })\n this.document.getRoot()\n .listMeshes()\n .forEach((mesh) => {\n const paramsExt = mesh.getExtension<GenericExtensionProperty>(this.extensionName)\n if (paramsExt) {\n const meshIndex = context.meshIndexMap.get(mesh)!\n const meshDef = jsonDoc.json.meshes![meshIndex]\n meshDef.extensions = meshDef.extensions || {}\n meshDef.extensions[this.extensionName] = paramsExt.getExtras()\n }\n })\n this.document.getRoot()\n .listNodes()\n .forEach((node) => {\n const paramsExt = node.getExtension<GenericExtensionProperty>(this.extensionName)\n if (paramsExt) {\n const nodeIndex = context.nodeIndexMap.get(node)!\n const nodeDef = jsonDoc.json.nodes![nodeIndex]\n nodeDef.extensions = nodeDef.extensions || {}\n nodeDef.extensions[this.extensionName] = paramsExt.getExtras()\n }\n })\n this.document.getRoot()\n .listScenes()\n .forEach((scene) => {\n const paramsExt = scene.getExtension<GenericExtensionProperty>(this.extensionName)\n if (paramsExt) {\n const sceneIndex = context.jsonDoc.json.scene || 0 // todo: get proper scene index, if working with multiple scenes, this will do the default one.\n const sceneDef = jsonDoc.json.scenes![sceneIndex]\n if (!sceneDef) return\n sceneDef.extensions = sceneDef.extensions || {}\n sceneDef.extensions[this.extensionName] = paramsExt.getExtras()\n }\n })\n\n return this\n }\n\n}\n\nfunction stringToChannel(s: string) {\n let r = 0\n if (s.includes('R')) r |= TextureChannel.R\n if (s.includes('G')) r |= TextureChannel.G\n if (s.includes('B')) r |= TextureChannel.B\n if (s.includes('A')) r |= TextureChannel.A\n return r\n}\n\nexport function createGenericExtensionClass(name: string, textures?: Record<string, string|number>): typeof GenericExtension {\n return class extends GenericExtension {\n public static readonly EXTENSION_NAME = name\n readonly extensionName = name\n textureChannels: Record<string, number> = !textures ? {} : Object.fromEntries(\n Object.entries(textures)\n .map(([k, v])=>\n [k, typeof v === 'number' ? v : stringToChannel(v)])\n )\n }\n}\n","import {\n AssetExporterPlugin,\n AViewerPluginSync,\n DRACOLoader2,\n generateUUID,\n GLTFLightExtrasExtension,\n GLTFMaterialExtrasExtension,\n GLTFMaterialsAlphaMapExtension,\n GLTFMaterialsBumpMapExtension,\n GLTFMaterialsDisplacementMapExtension,\n GLTFMaterialsLightMapExtension,\n GLTFObject3DExtrasExtension,\n IExporter,\n ThreeViewer,\n clearCoatTintGLTFExtension,\n customBumpMapGLTFExtension,\n noiseBumpMaterialGLTFExtension,\n fragmentClippingGLTFExtension,\n} from 'threepipe'\nimport {\n createGenericExtensionClass,\n GLTFDracoExporter,\n GLTFViewerConfigExtensionGP,\n} from './GLTFDracoExporter'\nimport {UiObjectConfig} from 'uiconfig.js'\nimport {EncoderOptions} from '@gltf-transform/extensions/dist/khr-draco-mesh-compression/encoder'\nimport {Extension} from '@gltf-transform/core'\n\nexport enum EncoderMethod {\n EDGEBREAKER = 1,\n SEQUENTIAL = 0\n}\n\n/**\n * GLTF Draco Export Plugin\n *\n * Overloads the default gltf exporter in the asset manager with GLTFDracoExporter. When exporting with compress = true, the output will be compressed.\n * Note - Only `glb` supported right now.\n *\n * @category Plugins\n */\nexport class GLTFDracoExportPlugin extends AViewerPluginSync {\n public static readonly PluginType = 'GLTFDracoExportPlugin'\n enabled = true\n\n /**\n * These are added here, but also added as plugins. Added here by default so that the data is not lost if some plugin is not added in an app.\n * To explicitly remove the data, use `removeExtension` with the name of the extension\n */\n extraExtensions = [ // its array because we want to keep the order of extensions\n [GLTFMaterialsBumpMapExtension.WebGiMaterialsBumpMapExtension, GLTFMaterialsBumpMapExtension.Textures],\n [GLTFMaterialsLightMapExtension.WebGiMaterialsLightMapExtension, GLTFMaterialsLightMapExtension.Textures],\n [GLTFMaterialsAlphaMapExtension.WebGiMaterialsAlphaMapExtension, GLTFMaterialsAlphaMapExtension.Textures],\n [GLTFMaterialsDisplacementMapExtension.WebGiMaterialsDisplacementMapExtension, GLTFMaterialsDisplacementMapExtension.Textures],\n [customBumpMapGLTFExtension.name, customBumpMapGLTFExtension.textures],\n [GLTFLightExtrasExtension.WebGiLightExtrasExtension, GLTFLightExtrasExtension.Textures],\n [GLTFObject3DExtrasExtension.WebGiObject3DExtrasExtension, GLTFObject3DExtrasExtension.Textures],\n [GLTFMaterialExtrasExtension.WebGiMaterialExtrasExtension, GLTFMaterialExtrasExtension.Textures],\n [clearCoatTintGLTFExtension.name, clearCoatTintGLTFExtension.textures],\n [noiseBumpMaterialGLTFExtension.name, noiseBumpMaterialGLTFExtension.textures],\n [fragmentClippingGLTFExtension.name, fragmentClippingGLTFExtension.textures],\n\n // extenal plugins\n\n // AnisotropyMaterialExtension\n ['WEBGI_materials_anisotropy', {\n anisotropyDirection: 'RGB',\n }],\n // todo port\n // DiamondMaterialExtension\n // AnimationMarkersExtension\n // ThinFilmLayerMaterialExtension\n // TriplanarMappingMaterialExtension\n // SSBevelMaterialExtension\n ] as [string, Record<string, string|number>|undefined][]\n\n get gltfTransformExtensions(): (typeof Extension)[] {\n return [GLTFViewerConfigExtensionGP, ...this.extraExtensions.map(e => createGenericExtensionClass(e[0], e[1]))]\n }\n\n addExtension(name: string, textures?: Record<string, string|number>) {\n const ext = this.extraExtensions.findIndex(e => e[0] === name)\n if (ext >= 0) this.extraExtensions[ext] = [name, textures]\n else this.extraExtensions.push([name, textures])\n }\n\n /**\n * Note - don't remove an extension when removing a plugin.\n *\n * extensions can be removed if you don't want to save the data of some plugin when transforming glb. But since this is not desirable in most cases, it is not recommended.\n * @param name\n */\n removeExtension(name: string) {\n const ext = this.extraExtensions.findIndex(e => e[0] === name)\n if (ext >= 0) this.extraExtensions.splice(ext, 1)\n }\n\n private _lastExporter?: IExporter['ctor'] = undefined\n\n protected _ctor: IExporter['ctor'] = (_, _exporter) => {\n if (!this._viewer) throw new Error('Viewer not set')\n const tempFile = generateUUID() + '.drc' // dummy\n const ex = new GLTFDracoExporter({},\n // todo unregister on dispose\n this._viewer.assetManager.importer.registerFile(tempFile) as DRACOLoader2)\n ex.setup(this._viewer, _exporter.extensions)\n ex.addExtension(...this.gltfTransformExtensions)\n return ex\n }\n\n onAdded(viewer: ThreeViewer): void {\n super.onAdded(viewer)\n const exporter = viewer.assetManager.exporter\n\n let glbExporter = exporter.getExporter('glb')\n this._lastExporter = glbExporter?.ctor\n if (!glbExporter) {\n console.error('GLTFDracoExportPlugin: GLB exporter not found in AssetManager.exporter, creating a new one.')\n glbExporter = {\n ext: ['glb', 'gltf'],\n extensions: [],\n ctor: this._ctor,\n }\n exporter.addExporter(glbExporter)\n } else {\n glbExporter.ctor = this._ctor\n }\n\n // for ui. todo use viewer.forPlugin\n const exportPlugin = viewer.getPlugin(AssetExporterPlugin)\n if (exportPlugin) {\n Object.assign(exportPlugin.exportOptions, {\n compress: false,\n dracoOptions: {\n encodeSpeed: 5,\n method: EncoderMethod.EDGEBREAKER,\n quantizationVolume: 'mesh',\n quantizationBits: {\n ['POSITION']: 14,\n ['NORMAL']: 10,\n ['COLOR']: 8,\n ['TEX_COORD']: 12,\n ['GENERIC']: 12,\n },\n } as EncoderOptions,\n })\n const exportOptions = exportPlugin.uiConfig.children?.find(c => (c as UiObjectConfig).label === 'GLB Export') as UiObjectConfig\n if (exportOptions) {\n exportOptions.children = [this._makeUi(exportPlugin), ...exportOptions.children || []]\n } else {\n console.warn('GLTFDracoExportPlugin: Unable to setup UI')\n }\n }\n }\n\n onRemove(viewer: ThreeViewer) {\n const exporter = viewer.assetManager.exporter\n const glbExporter = exporter.getExporter('glb')\n if (glbExporter && this._lastExporter) {\n glbExporter.ctor = this._lastExporter\n }\n super.onRemove(viewer)\n }\n\n protected _makeUi = (exporter: AssetExporterPlugin)=>[\n {\n type: 'checkbox',\n label: 'DRACO Compress',\n property: [exporter.exportOptions, 'compress'],\n onChange: ()=>exporter.uiConfig.uiRefresh?.(true),\n },\n {\n type: 'folder',\n hidden: ()=>!exporter.exportOptions.compress,\n label: 'DRACO Options',\n children: [\n {\n type: 'slider',\n label: 'Encode Speed',\n bounds: [1, 10],\n property: [exporter.exportOptions.dracoOptions, 'encodeSpeed'],\n },\n {\n type: 'dropdown',\n label: 'Encoder Method',\n property: [exporter.exportOptions.dracoOptions, 'method'],\n children: Object.entries(EncoderMethod).map(([k, v]) => ({label: k, value: v})),\n },\n {\n type: 'dropdown',\n label: 'Quantization Volume',\n property: [exporter.exportOptions.dracoOptions, 'quantizationVolume'],\n children: ['mesh', 'scene', 'bbox'].map(v => ({label: v})),\n },\n {\n type: 'folder',\n label: 'Quantization Bits',\n children: Object.keys(exporter.exportOptions.dracoOptions?.quantizationBits || {}).map(k => ({\n type: 'slider',\n label: k,\n bounds: [1, 16],\n stepSize: 1,\n property: [exporter.exportOptions.dracoOptions?.quantizationBits, k],\n })),\n },\n ],\n },\n ]\n}\n","\"use strict\"\n\nfunction iota(n) {\n var result = new Array(n)\n for(var i=0; i<n; ++i) {\n result[i] = i\n }\n return result\n}\n\nmodule.exports = iota","/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nmodule.exports = function (obj) {\n return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n}\n\nfunction isBuffer (obj) {\n return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n}\n","var iota = require(\"iota-array\")\nvar isBuffer = require(\"is-buffer\")\n\nvar hasTypedArrays = ((typeof Float64Array) !== \"undefined\")\n\nfunction compare1st(a, b) {\n return a[0] - b[0]\n}\n\nfunction order() {\n var stride = this.stride\n var terms = new Array(stride.length)\n var i\n for(i=0; i<terms.length; ++i) {\n terms[i] = [Math.abs(stride[i]), i]\n }\n terms.sort(compare1st)\n var result = new Array(terms.length)\n for(i=0; i<result.length; ++i) {\n result[i] = terms[i][1]\n }\n return result\n}\n\nfunction compileConstructor(dtype, dimension) {\n var className = [\"View\", dimension, \"d\", dtype].join(\"\")\n if(dimension < 0) {\n className = \"View_Nil\" + dtype\n }\n var useGetters = (dtype === \"generic\")\n\n if(dimension === -1) {\n //Special case for trivial arrays\n var code =\n \"function \"+className+\"(a){this.data=a;};\\\nvar proto=\"+className+\".prototype;\\\nproto.dtype='\"+dtype+\"';\\\nproto.index=function(){return -1};\\\nproto.size=0;\\\nproto.dimension=-1;\\\nproto.shape=proto.stride=proto.order=[];\\\nproto.lo=proto.hi=proto.transpose=proto.step=\\\nfunction(){return new \"+className+\"(this.data);};\\\nproto.get=proto.set=function(){};\\\nproto.pick=function(){return null};\\\nreturn function construct_\"+className+\"(a){return new \"+className+\"(a);}\"\n var procedure = new Function(code)\n return procedure()\n } else if(dimension === 0) {\n //Special case for 0d arrays\n var code =\n \"function \"+className+\"(a,d) {\\\nthis.data = a;\\\nthis.offset = d\\\n};\\\nvar proto=\"+className+\".prototype;\\\nproto.dtype='\"+dtype+\"';\\\nproto.index=function(){return this.offset};\\\nproto.dimension=0;\\\nproto.size=1;\\\nproto.shape=\\\nproto.stride=\\\nproto.order=[];\\\nproto.lo=\\\nproto.hi=\\\nproto.transpose=\\\nproto.step=function \"+className+\"_copy() {\\\nreturn new \"+className+\"(this.data,this.offset)\\\n};\\\nproto.pick=function \"+className+\"_pick(){\\\nreturn TrivialArray(this.data);\\\n};\\\nproto.valueOf=proto.get=function \"+className+\"_get(){\\\nreturn \"+(useGetters ? \"this.data.get(this.offset)\" : \"this.data[this.offset]\")+\n\"};\\\nproto.set=function \"+className+\"_set(v){\\\nreturn \"+(useGetters ? \"this.data.set(this.offset,v)\" : \"this.data[this.offset]=v\")+\"\\\n};\\\nreturn function construct_\"+className+\"(a,b,c,d){return new \"+className+\"(a,d)}\"\n var procedure = new Function(\"TrivialArray\", code)\n return procedure(CACHED_CONSTRUCTORS[dtype][0])\n }\n\n var code = [\"'use strict'\"]\n\n //Create constructor for view\n var indices = iota(dimension)\n var args = indices.map(function(i) { return \"i\"+i })\n var index_str = \"this.offset+\" + indices.map(function(i) {\n return \"this.stride[\" + i + \"]*i\" + i\n }).join(\"+\")\n var shapeArg = indices.map(function(i) {\n return \"b\"+i\n }).join(\",\")\n var strideArg = indices.map(function(i) {\n return \"c\"+i\n }).join(\",\")\n code.push(\n \"function \"+className+\"(a,\" + shapeArg + \",\" + strideArg + \",d){this.data=a\",\n \"this.shape=[\" + shapeArg + \"]\",\n \"this.stride=[\" + strideArg + \"]\",\n \"this.offset=d|0}\",\n \"var proto=\"+className+\".prototype\",\n \"proto.dtype='\"+dtype+\"'\",\n \"proto.dimension=\"+dimension)\n\n //view.size:\n code.push(\"Object.defineProperty(proto,'size',{get:function \"+className+\"_size(){\\\nreturn \"+indices.map(function(i) { return \"this.shape[\"+i+\"]\" }).join(\"*\"),\n\"}})\")\n\n //view.order:\n if(dimension === 1) {\n code.push(\"proto.order=[0]\")\n } else {\n code.push(\"Object.defineProperty(proto,'order',{get:\")\n if(dimension < 4) {\n code.push(\"function \"+className+\"_order(){\")\n if(dimension === 2) {\n code.push(\"return (Math.abs(this.stride[0])>Math.abs(this.stride[1]))?[1,0]:[0,1]}})\")\n } else if(dimension === 3) {\n code.push(\n\"var s0=Math.abs(this.stride[0]),s1=Math.abs(this.stride[1]),s2=Math.abs(this.stride[2]);\\\nif(s0>s1){\\\nif(s1>s2){\\\nreturn [2,1,0];\\\n}else if(s0>s2){\\\nreturn [1,2,0];\\\n}else{\\\nreturn [1,0,2];\\\n}\\\n}else if(s0>s2){\\\nreturn [2,0,1];\\\n}else if(s2>s1){\\\nreturn [0,1,2];\\\n}else{\\\nreturn [0,2,1];\\\n}}})\")\n }\n } else {\n code.push(\"ORDER})\")\n }\n }\n\n //view.set(i0, ..., v):\n code.push(\n\"proto.set=function \"+className+\"_set(\"+args.join(\",\")+\",v){\")\n if(useGetters) {\n code.push(\"return this.data.set(\"+index_str+\",v)}\")\n } else {\n code.push(\"return this.data[\"+index_str+\"]=v}\")\n }\n\n //view.get(i0, ...):\n code.push(\"proto.get=function \"+className+\"_get(\"+args.join(\",\")+\"){\")\n if(useGetters) {\n code.push(\"return this.data.get(\"+index_str+\")}\")\n } else {\n code.push(\"return this.data[\"+index_str+\"]}\")\n }\n\n //view.index:\n code.push(\n \"proto.index=function \"+className+\"_index(\", args.join(), \"){return \"+index_str+\"}\")\n\n //view.hi():\n code.push(\"proto.hi=function \"+className+\"_hi(\"+args.join(\",\")+\"){return new \"+className+\"(this.data,\"+\n indices.map(function(i) {\n return [\"(typeof i\",i,\"!=='number'||i\",i,\"<0)?this.shape[\", i, \"]:i\", i,\"|0\"].join(\"\")\n }).join(\",\")+\",\"+\n indices.map(function(i) {\n return \"this.stride[\"+i + \"]\"\n }).join(\",\")+\",this.offset)}\")\n\n //view.lo():\n var a_vars = indices.map(function(i) { return \"a\"+i+\"=this.shape[\"+i+\"]\" })\n var c_vars = indices.map(function(i) { return \"c\"+i+\"=this.stride[\"+i+\"]\" })\n code.push(\"proto.lo=function \"+className+\"_lo(\"+args.join(\",\")+\"){var b=this.offset,d=0,\"+a_vars.join(\",\")+\",\"+c_vars.join(\",\"))\n for(var i=0; i<dimension; ++i) {\n code.push(\n\"if(typeof i\"+i+\"==='number'&&i\"+i+\">=0){\\\nd=i\"+i+\"|0;\\\nb+=c\"+i+\"*d;\\\na\"+i+\"-=d}\")\n }\n code.push(\"return new \"+className+\"(this.data,\"+\n indices.map(function(i) {\n return \"a\"+i\n }).join(\",\")+\",\"+\n indices.map(function(i) {\n return \"c\"+i\n }).join(\",\")+\",b)}\")\n\n //view.step():\n code.push(\"proto.step=function \"+className+\"_step(\"+args.join(\",\")+\"){var \"+\n indices.map(function(i) {\n return \"a\"+i+\"=this.shape[\"+i+\"]\"\n }).join(\",\")+\",\"+\n indices.map(function(i) {\n return \"b\"+i+\"=this.stride[\"+i+\"]\"\n }).join(\",\")+\",c=this.offset,d=0,ceil=Math.ceil\")\n for(var i=0; i<dimension; ++i) {\n code.push(\n\"if(typeof i\"+i+\"==='number'){\\\nd=i\"+i+\"|0;\\\nif(d<0){\\\nc+=b\"+i+\"*(a\"+i+\"-1);\\\na\"+i+\"=ceil(-a\"+i+\"/d)\\\n}else{\\\na\"+i+\"=ceil(a\"+i+\"/d)\\\n}\\\nb\"+i+\"*=d\\\n}\")\n }\n code.push(\"return new \"+className+\"(this.data,\"+\n indices.map(function(i) {\n return \"a\" + i\n }).join(\",\")+\",\"+\n indices.map(function(i) {\n return \"b\" + i\n }).join(\",\")+\",c)}\")\n\n //view.transpose():\n var tShape = new Array(dimension)\n var tStride = new Array(dimension)\n for(var i=0; i<dimension; ++i) {\n tShape[i] = \"a[i\"+i+\"]\"\n tStride[i] = \"b[i\"+i+\"]\"\n }\n code.push(\"proto.transpose=function \"+className+\"_transpose(\"+args+\"){\"+\n args.map(function(n,idx) { return n + \"=(\" + n + \"===undefined?\" + idx + \":\" + n + \"|0)\"}).join(\";\"),\n \"var a=this.shape,b=this.stride;return new \"+className+\"(this.data,\"+tShape.join(\",\")+\",\"+tStride.join(\",\")+\",this.offset)}\")\n\n //view.pick():\n code.push(\"proto.pick=function \"+className+\"_pick(\"+args+\"){var a=[],b=[],c=this.offset\")\n for(var i=0; i<dimension; ++i) {\n code.push(\"if(typeof i\"+i+\"==='number'&&i\"+i+\">=0){c=(c+this.stride[\"+i+\"]*i\"+i+\")|0}else{a.push(this.shape[\"+i+\"]);b.push(this.stride[\"+i+\"])}\")\n }\n code.push(\"var ctor=CTOR_LIST[a.length+1];return ctor(this.data,a,b,c)}\")\n\n //Add return statement\n code.push(\"return function construct_\"+className+\"(data,shape,stride,offset){return new \"+className+\"(data,\"+\n indices.map(function(i) {\n return \"shape[\"+i+\"]\"\n }).join(\",\")+\",\"+\n indices.map(function(i) {\n return \"stride[\"+i+\"]\"\n }).join(\",\")+\",offset)}\")\n\n //Compile procedure\n var procedure = new Function(\"CTOR_LIST\", \"ORDER\", code.join(\"\\n\"))\n return procedure(CACHED_CONSTRUCTORS[dtype], order)\n}\n\nfunction arrayDType(data) {\n if(isBuffer(data)) {\n return \"buffer\"\n }\n if(hasTypedArrays) {\n switch(Object.prototype.toString.call(data)) {\n case \"[object Float64Array]\":\n return \"float64\"\n case \"[object Float32Array]\":\n return \"float32\"\n case \"[object Int8Array]\":\n return \"int8\"\n case \"[object Int16Array]\":\n return \"int16\"\n case \"[object Int32Array]\":\n return \"int32\"\n case \"[object Uint8Array]\":\n return \"uint8\"\n case \"[object Uint16Array]\":\n return \"uint16\"\n case \"[object Uint32Array]\":\n return \"uint32\"\n case \"[object Uint8ClampedArray]\":\n return \"uint8_clamped\"\n case \"[object BigInt64Array]\":\n return \"bigint64\"\n case \"[object BigUint64Array]\":\n return \"biguint64\"\n }\n }\n if(Array.isArray(data)) {\n return \"array\"\n }\n return \"generic\"\n}\n\nvar CACHED_CONSTRUCTORS = {\n \"float32\":[],\n \"float64\":[],\n \"int8\":[],\n \"int16\":[],\n \"int32\":[],\n \"uint8\":[],\n \"uint16\":[],\n \"uint32\":[],\n \"array\":[],\n \"uint8_clamped\":[],\n \"bigint64\": [],\n \"biguint64\": [],\n \"buffer\":[],\n \"generic\":[]\n}\n\n;(function() {\n for(var id in CACHED_CONSTRUCTORS) {\n CACHED_CONSTRUCTORS[id].push(compileConstructor(id, -1))\n }\n});\n\nfunction wrappedNDArrayCtor(data, shape, stride, offset) {\n if(data === undefined) {\n var ctor = CACHED_CONSTRUCTORS.array[0]\n return ctor([])\n } else if(typeof data === \"number\") {\n data = [data]\n }\n if(shape === undefined) {\n shape = [ data.length ]\n }\n var d = shape.length\n if(stride === undefined) {\n stride = new Array(d)\n for(var i=d-1, sz=1; i>=0; --i) {\n stride[i] = sz\n sz *= shape[i]\n }\n }\n if(offset === undefined) {\n offset = 0\n for(var i=0; i<d; ++i) {\n if(stride[i] < 0) {\n offset -= (shape[i]-1)*stride[i]\n }\n }\n }\n var dtype = arrayDType(data)\n var ctor_list = CACHED_CONSTRUCTORS[dtype]\n while(ctor_list.length <= d+1) {\n ctor_list.push(compileConstructor(dtype, ctor_list.length-1))\n }\n var ctor = ctor_list[d+1]\n return ctor(data, shape, stride, offset)\n}\n\nmodule.exports = wrappedNDArrayCtor\n","\"use strict\"\n\nfunction unique_pred(list, compare) {\n var ptr = 1\n , len = list.length\n , a=list[0], b=list[0]\n for(var i=1; i<len; ++i) {\n b = a\n a = list[i]\n if(compare(a, b)) {\n if(i === ptr) {\n ptr++\n continue\n }\n list[ptr++] = a\n }\n }\n list.length = ptr\n return list\n}\n\nfunction unique_eq(list) {\n var ptr = 1\n , len = list.length\n , a=list[0], b = list[0]\n for(var i=1; i<len; ++i, b=a) {\n b = a\n a = list[i]\n if(a !== b) {\n if(i === ptr) {\n ptr++\n continue\n }\n list[ptr++] = a\n }\n }\n list.length = ptr\n return list\n}\n\nfunction unique(list, compare, sorted) {\n if(list.length === 0) {\n return list\n }\n if(compare) {\n if(!sorted) {\n list.sort(compare)\n }\n return unique_pred(list, compare)\n }\n if(!sorted) {\n list.sort()\n }\n return unique_eq(list)\n}\n\nmodule.exports = unique\n","\"use strict\"\n\nvar uniq = require(\"uniq\")\n\n// This function generates very simple loops analogous to how you typically traverse arrays (the outermost loop corresponds to the slowest changing index, the innermost loop to the fastest changing index)\n// TODO: If two arrays have the same strides (and offsets) there is potential for decreasing the number of \"pointers\" and related variables. The drawback is that the type signature would become more specific and that there would thus be less potential for caching, but it might still be worth it, especially when dealing with large numbers of arguments.\nfunction innerFill(order, proc, body) {\n var dimension = order.length\n , nargs = proc.arrayArgs.length\n , has_index = proc.indexArgs.length>0\n , code = []\n , vars = []\n , idx=0, pidx=0, i, j\n for(i=0; i<dimension; ++i) { // Iteration variables\n vars.push([\"i\",i,\"=0\"].join(\"\"))\n }\n //Compute scan deltas\n for(j=0; j<nargs; ++j) {\n for(i=0; i<dimension; ++i) {\n pidx = idx\n idx = order[i]\n if(i === 0) { // The innermost/fastest dimension's delta is simply its stride\n vars.push([\"d\",j,\"s\",i,\"=t\",j,\"p\",idx].join(\"\"))\n } else { // For other dimensions the delta is basically the stride minus something which essentially \"rewinds\" the previous (more inner) dimension\n vars.push([\"d\",j,\"s\",i,\"=(t\",j,\"p\",idx,\"-s\",pidx,\"*t\",j,\"p\",pidx,\")\"].join(\"\"))\n }\n }\n }\n if (vars.length > 0) {\n code.push(\"var \" + vars.join(\",\"))\n } \n //Scan loop\n for(i=dimension-1; i>=0; --i) { // Start at largest stride and work your way inwards\n idx = order[i]\n code.push([\"for(i\",i,\"=0;i\",i,\"<s\",idx,\";++i\",i,\"){\"].join(\"\"))\n }\n //Push body of inner loop\n code.push(body)\n //Advance scan pointers\n for(i=0; i<dimension; ++i) {\n pidx = idx\n idx = order[i]\n for(j=0; j<nargs; ++j) {\n code.push([\"p\",j,\"+=d\",j,\"s\",i].join(\"\"))\n }\n if(has_index) {\n if(i > 0) {\n code.push([\"index[\",pidx,\"]-=s\",pidx].join(\"\"))\n }\n code.push([\"++index[\",idx,\"]\"].join(\"\"))\n }\n code.push(\"}\")\n }\n return code.join(\"\\n\")\n}\n\n// Generate \"outer\" loops that loop over blocks of data, applying \"inner\" loops to the blocks by manipulating the local variables in such a way that the inner loop only \"sees\" the current block.\n// TODO: If this is used, then the previous declaration (done by generateCwiseOp) of s* is essentially unnecessary.\n// I believe the s* are not used elsewhere (in particular, I don't think they're used in the pre/post parts and \"shape\" is defined independently), so it would be possible to make defining the s* dependent on what loop method is being used.\nfunction outerFill(matched, order, proc, body) {\n var dimension = order.length\n , nargs = proc.arrayArgs.length\n , blockSize = proc.blockSize\n , has_index = proc.indexArgs.length > 0\n , code = []\n for(var i=0; i<nargs; ++i) {\n code.push([\"var offset\",i,\"=p\",i].join(\"\"))\n }\n //Generate loops for unmatched dimensions\n // The order in which these dimensions are traversed is fairly arbitrary (from small stride to large stride, for the first argument)\n // TODO: It would be nice if the order in which these loops are placed would also be somehow \"optimal\" (at the very least we should check that it really doesn't hurt us if they're not).\n for(var i=matched; i<dimension; ++i) {\n code.push([\"for(var j\"+i+\"=SS[\", order[i], \"]|0;j\", i, \">0;){\"].join(\"\")) // Iterate back to front\n code.push([\"if(j\",i,\"<\",blockSize,\"){\"].join(\"\")) // Either decrease j by blockSize (s = blockSize), or set it to zero (after setting s = j).\n code.push([\"s\",order[i],\"=j\",i].join(\"\"))\n code.push([\"j\",i,\"=0\"].join(\"\"))\n code.push([\"}else{s\",order[i],\"=\",blockSize].join(\"\"))\n code.push([\"j\",i,\"-=\",blockSize,\"}\"].join(\"\"))\n if(has_index) {\n code.push([\"index[\",order[i],\"]=j\",i].join(\"\"))\n }\n }\n for(var i=0; i<nargs; ++i) {\n var indexStr = [\"offset\"+i]\n for(var j=matched; j<dimension; ++j) {\n indexStr.push([\"j\",j,\"*t\",i,\"p\",order[j]].join(\"\"))\n }\n code.push([\"p\",i,\"=(\",indexStr.join(\"+\"),\")\"].join(\"\"))\n }\n code.push(innerFill(order, proc, body))\n for(var i=matched; i<dimension; ++i) {\n code.push(\"}\")\n }\n return code.join(\"\\n\")\n}\n\n//Count the number of compatible inner orders\n// This is the length of the longest common prefix of the arrays in orders.\n// Each array in orders lists the dimensions of the correspond ndarray in order of increasing stride.\n// This is thus the maximum number of dimensions that can be efficiently traversed by simple nested loops for all arrays.\nfunction countMatches(orders) {\n var matched = 0, dimension = orders[0].length\n while(matched < dimension) {\n for(var j=1; j<orders.length; ++j) {\n if(orders[j][matched] !== orders[0][matched]) {\n return matched\n }\n }\n ++matched\n }\n return matched\n}\n\n//Processes a block according to the given data types\n// Replaces variable names by different ones, either \"local\" ones (that are then ferried in and out of the given array) or ones matching the arguments that the function performing the ultimate loop will accept.\nfunction processBlock(block, proc, dtypes) {\n var code = block.body\n var pre = []\n var post = []\n for(var i=0; i<block.args.length; ++i) {\n var carg = block.args[i]\n if(carg.count <= 0) {\n continue\n }\n var re = new RegExp(carg.name, \"g\")\n var ptrStr = \"\"\n var arrNum = proc.arrayArgs.indexOf(i)\n switch(proc.argTypes[i]) {\n case \"offset\":\n var offArgIndex = proc.offsetArgIndex.indexOf(i)\n var offArg = proc.offsetArgs[offArgIndex]\n arrNum = offArg.array\n ptrStr = \"+q\" + offArgIndex // Adds offset to the \"pointer\" in the array\n case \"array\":\n ptrStr = \"p\" + arrNum + ptrStr\n var localStr = \"l\" + i\n var arrStr = \"a\" + arrNum\n if (proc.arrayBlockIndices[arrNum] === 0) { // Argument to body is just a single value from this array\n if(carg.count === 1) { // Argument/array used only once(?)\n if(dtypes[arrNum] === \"generic\") {\n if(carg.lvalue) {\n pre.push([\"var \", localStr, \"=\", arrStr, \".get(\", ptrStr, \")\"].join(\"\")) // Is this necessary if the argument is ONLY used as an lvalue? (keep in mind that we can have a += something, so we would actually need to check carg.rvalue)\n code = code.replace(re, localStr)\n post.push([arrStr, \".set(\", ptrStr, \",\", localStr,\")\"].join(\"\"))\n } else {\n code = code.replace(re, [arrStr, \".get(\", ptrStr, \")\"].join(\"\"))\n }\n } else {\n code = code.replace(re, [arrStr, \"[\", ptrStr, \"]\"].join(\"\"))\n }\n } else if(dtypes[arrNum] === \"generic\") {\n pre.push([\"var \", localStr, \"=\", arrStr, \".get(\", ptrStr, \")\"].join(\"\")) // TODO: Could we optimize by checking for carg.rvalue?\n code = code.replace(re, localStr)\n if(carg.lvalue) {\n post.push([arrStr, \".set(\", ptrStr, \",\", localStr,\")\"].join(\"\"))\n }\n } else {\n pre.push([\"var \", localStr, \"=\", arrStr, \"[\", ptrStr, \"]\"].join(\"\")) // TODO: Could we optimize by checking for carg.rvalue?\n code = code.replace(re, localStr)\n if(carg.lvalue) {\n post.push([arrStr, \"[\", ptrStr, \"]=\", localStr].join(\"\"))\n }\n }\n } else { // Argument to body is a \"block\"\n var reStrArr = [carg.name], ptrStrArr = [ptrStr]\n for(var j=0; j<Math.abs(proc.arrayBlockIndices[arrNum]); j++) {\n reStrArr.push(\"\\\\s*\\\\[([^\\\\]]+)\\\\]\")\n ptrStrArr.push(\"$\" + (j+1) + \"*t\" + arrNum + \"b\" + j) // Matched index times stride\n }\n re = new RegExp(reStrArr.join(\"\"), \"g\")\n ptrStr = ptrStrArr.join(\"+\")\n if(dtypes[arrNum] === \"generic\") {\n /*if(carg.lvalue) {\n pre.push([\"var \", localStr, \"=\", arrStr, \".get(\", ptrStr, \")\"].join(\"\")) // Is this necessary if the argument is ONLY used as an lvalue? (keep in mind that we can have a += something, so we would actually need to check carg.rvalue)\n code = code.replace(re, localStr)\n post.push([arrStr, \".set(\", ptrStr, \",\", localStr,\")\"].join(\"\"))\n } else {\n code = code.replace(re, [arrStr, \".get(\", ptrStr, \")\"].join(\"\"))\n }*/\n throw new Error(\"cwise: Generic arrays not supported in combination with blocks!\")\n } else {\n // This does not produce any local variables, even if variables are used multiple times. It would be possible to do so, but it would complicate things quite a bit.\n code = code.replace(re, [arrStr, \"[\", ptrStr, \"]\"].join(\"\"))\n }\n }\n break\n case \"scalar\":\n code = code.replace(re, \"Y\" + proc.scalarArgs.indexOf(i))\n break\n case \"index\":\n code = code.replace(re, \"index\")\n break\n case \"shape\":\n code = code.replace(re, \"shape\")\n break\n }\n }\n return [pre.join(\"\\n\"), code, post.join(\"\\n\")].join(\"\\n\").trim()\n}\n\nfunction typeSummary(dtypes) {\n var summary = new Array(dtypes.length)\n var allEqual = true\n for(var i=0; i<dtypes.length; ++i) {\n var t = dtypes[i]\n var digits = t.match(/\\d+/)\n if(!digits) {\n digits = \"\"\n } else {\n digits = digits[0]\n }\n if(t.charAt(0) === 0) {\n summary[i] = \"u\" + t.charAt(1) + digits\n } else {\n summary[i] = t.charAt(0) + digits\n }\n if(i > 0) {\n allEqual = allEqual && summary[i] === summary[i-1]\n }\n }\n if(allEqual) {\n return summary[0]\n }\n return summary.join(\"\")\n}\n\n//Generates a cwise operator\nfunction generateCWiseOp(proc, typesig) {\n\n //Compute dimension\n // Arrays get put first in typesig, and there are two entries per array (dtype and order), so this gets the number of dimensions in the first array arg.\n var dimension = (typesig[1].length - Math.abs(proc.arrayBlockIndices[0]))|0\n var orders = new Array(proc.arrayArgs.length)\n var dtypes = new Array(proc.arrayArgs.length)\n for(var i=0; i<proc.arrayArgs.length; ++i) {\n dtypes[i] = typesig[2*i]\n orders[i] = typesig[2*i+1]\n }\n \n //Determine where block and loop indices start and end\n var blockBegin = [], blockEnd = [] // These indices are exposed as blocks\n var loopBegin = [], loopEnd = [] // These indices are iterated over\n var loopOrders = [] // orders restricted to the loop indices\n for(var i=0; i<proc.arrayArgs.length; ++i) {\n if (proc.arrayBlockIndices[i]<0) {\n loopBegin.push(0)\n loopEnd.push(dimension)\n blockBegin.push(dimension)\n blockEnd.push(dimension+proc.arrayBlockIndices[i])\n } else {\n loopBegin.push(proc.arrayBlockIndices[i]) // Non-negative\n loopEnd.push(proc.arrayBlockIndices[i]+dimension)\n blockBegin.push(0)\n blockEnd.push(proc.arrayBlockIndices[i])\n }\n var newOrder = []\n for(var j=0; j<orders[i].length; j++) {\n if (loopBegin[i]<=orders[i][j] && orders[i][j]<loopEnd[i]) {\n newOrder.push(orders[i][j]-loopBegin[i]) // If this is a loop index, put it in newOrder, subtracting loopBegin, to make sure that all loopOrders are using a common set of indices.\n }\n }\n loopOrders.push(newOrder)\n }\n\n //First create arguments for procedure\n var arglist = [\"SS\"] // SS is the overall shape over which we iterate\n var code = [\"'use strict'\"]\n var vars = []\n \n for(var j=0; j<dimension; ++j) {\n vars.push([\"s\", j, \"=SS[\", j, \"]\"].join(\"\")) // The limits for each dimension.\n }\n for(var i=0; i<proc.arrayArgs.length; ++i) {\n arglist.push(\"a\"+i) // Actual data array\n arglist.push(\"t\"+i) // Strides\n arglist.push(\"p\"+i) // Offset in the array at which the data starts (also used for iterating over the data)\n \n for(var j=0; j<dimension; ++j) { // Unpack the strides into vars for looping\n vars.push([\"t\",i,\"p\",j,\"=t\",i,\"[\",loopBegin[i]+j,\"]\"].join(\"\"))\n }\n \n for(var j=0; j<Math.abs(proc.arrayBlockIndices[i]); ++j) { // Unpack the strides into vars for block iteration\n vars.push([\"t\",i,\"b\",j,\"=t\",i,\"[\",blockBegin[i]+j,\"]\"].join(\"\"))\n }\n }\n for(var i=0; i<proc.scalarArgs.length; ++i) {\n arglist.push(\"Y\" + i)\n }\n if(proc.shapeArgs.length > 0) {\n vars.push(\"shape=SS.slice(0)\") // Makes the shape over which we iterate available to the user defined functions (so you can use width/height for example)\n }\n if(proc.indexArgs.length > 0) {\n // Prepare an array to keep track of the (logical) indices, initialized to dimension zeroes.\n var zeros = new Array(dimension)\n for(var i=0; i<dimension; ++i) {\n zeros[i] = \"0\"\n }\n vars.push([\"index=[\", zeros.join(\",\"), \"]\"].join(\"\"))\n }\n for(var i=0; i<proc.offsetArgs.length; ++i) { // Offset arguments used for stencil operations\n var off_arg = proc.offsetArgs[i]\n var init_string = []\n for(var j=0; j<off_arg.offset.length; ++j) {\n if(off_arg.offset[j] === 0) {\n continue\n } else if(off_arg.offset[j] === 1) {\n init_string.push([\"t\", off_arg.array, \"p\", j].join(\"\")) \n } else {\n init_string.push([off_arg.offset[j], \"*t\", off_arg.array, \"p\", j].join(\"\"))\n }\n }\n if(init_string.length === 0) {\n vars.push(\"q\" + i + \"=0\")\n } else {\n vars.push([\"q\", i, \"=\", init_string.join(\"+\")].join(\"\"))\n }\n }\n\n //Prepare this variables\n var thisVars = uniq([].concat(proc.pre.thisVars)\n .concat(proc.body.thisVars)\n .concat(proc.post.thisVars))\n vars = vars.concat(thisVars)\n if (vars.length > 0) {\n code.push(\"var \" + vars.join(\",\"))\n }\n for(var i=0; i<proc.arrayArgs.length; ++i) {\n code.push(\"p\"+i+\"|=0\")\n }\n \n //Inline prelude\n if(proc.pre.body.length > 3) {\n code.push(processBlock(proc.pre, proc, dtypes))\n }\n\n //Process body\n var body = processBlock(proc.body, proc, dtypes)\n var matched = countMatches(loopOrders)\n if(matched < dimension) {\n code.push(outerFill(matched, loopOrders[0], proc, body)) // TODO: Rather than passing loopOrders[0], it might be interesting to look at passing an order that represents the majority of the arguments for example.\n } else {\n code.push(innerFill(loopOrders[0], proc, body))\n }\n\n //Inline epilog\n if(proc.post.body.length > 3) {\n code.push(processBlock(proc.post, proc, dtypes))\n }\n \n if(proc.debug) {\n console.log(\"-----Generated cwise routine for \", typesig, \":\\n\" + code.join(\"\\n\") + \"\\n----------\")\n }\n \n var loopName = [(proc.funcName||\"unnamed\"), \"_cwise_loop_\", orders[0].join(\"s\"),\"m\",matched,typeSummary(dtypes)].join(\"\")\n var f = new Function([\"function \",loopName,\"(\", arglist.join(\",\"),\"){\", code.join(\"\\n\"),\"} return \", loopName].join(\"\"))\n return f()\n}\nmodule.exports = generateCWiseOp\n","\"use strict\"\n\n// The function below is called when constructing a cwise function object, and does the following:\n// A function object is constructed which accepts as argument a compilation function and returns another function.\n// It is this other function that is eventually returned by createThunk, and this function is the one that actually\n// checks whether a certain pattern of arguments has already been used before and compiles new loops as needed.\n// The compilation passed to the first function object is used for compiling new functions.\n// Once this function object is created, it is called with compile as argument, where the first argument of compile\n// is bound to \"proc\" (essentially containing a preprocessed version of the user arguments to cwise).\n// So createThunk roughly works like this:\n// function createThunk(proc) {\n// var thunk = function(compileBound) {\n// var CACHED = {}\n// return function(arrays and scalars) {\n// if (dtype and order of arrays in CACHED) {\n// var func = CACHED[dtype and order of arrays]\n// } else {\n// var func = CACHED[dtype and order of arrays] = compileBound(dtype and order of arrays)\n// }\n// return func(arrays and scalars)\n// }\n// }\n// return thunk(compile.bind1(proc))\n// }\n\nvar compile = require(\"./compile.js\")\n\nfunction createThunk(proc) {\n var code = [\"'use strict'\", \"var CACHED={}\"]\n var vars = []\n var thunkName = proc.funcName + \"_cwise_thunk\"\n \n //Build thunk\n code.push([\"return function \", thunkName, \"(\", proc.shimArgs.join(\",\"), \"){\"].join(\"\"))\n var typesig = []\n var string_typesig = []\n var proc_args = [[\"array\",proc.arrayArgs[0],\".shape.slice(\", // Slice shape so that we only retain the shape over which we iterate (which gets passed to the cwise operator as SS).\n Math.max(0,proc.arrayBlockIndices[0]),proc.arrayBlockIndices[0]<0?(\",\"+proc.arrayBlockIndices[0]+\")\"):\")\"].join(\"\")]\n var shapeLengthConditions = [], shapeConditions = []\n // Process array arguments\n for(var i=0; i<proc.arrayArgs.length; ++i) {\n var j = proc.arrayArgs[i]\n vars.push([\"t\", j, \"=array\", j, \".dtype,\",\n \"r\", j, \"=array\", j, \".order\"].join(\"\"))\n typesig.push(\"t\" + j)\n typesig.push(\"r\" + j)\n string_typesig.push(\"t\"+j)\n string_typesig.push(\"r\"+j+\".join()\")\n proc_args.push(\"array\" + j + \".data\")\n proc_args.push(\"array\" + j + \".stride\")\n proc_args.push(\"array\" + j + \".offset|0\")\n if (i>0) { // Gather conditions to check for shape equality (ignoring block indices)\n shapeLengthConditions.push(\"array\" + proc.arrayArgs[0] + \".shape.length===array\" + j + \".shape.length+\" + (Math.abs(proc.arrayBlockIndices[0])-Math.abs(proc.arrayBlockIndices[i])))\n shapeConditions.push(\"array\" + proc.arrayArgs[0] + \".shape[shapeIndex+\" + Math.max(0,proc.arrayBlockIndices[0]) + \"]===array\" + j + \".shape[shapeIndex+\" + Math.max(0,proc.arrayBlockIndices[i]) + \"]\")\n }\n }\n // Check for shape equality\n if (proc.arrayArgs.length > 1) {\n code.push(\"if (!(\" + shapeLengthConditions.join(\" && \") + \")) throw new Error('cwise: Arrays do not all have the same dimensionality!')\")\n code.push(\"for(var shapeIndex=array\" + proc.arrayArgs[0] + \".shape.length-\" + Math.abs(proc.arrayBlockIndices[0]) + \"; shapeIndex-->0;) {\")\n code.push(\"if (!(\" + shapeConditions.join(\" && \") + \")) throw new Error('cwise: Arrays do not all have the same shape!')\")\n code.push(\"}\")\n }\n // Process scalar arguments\n for(var i=0; i<proc.scalarArgs.length; ++i) {\n proc_args.push(\"scalar\" + proc.scalarArgs[i])\n }\n // Check for cached function (and if not present, generate it)\n vars.push([\"type=[\", string_typesig.join(\",\"), \"].join()\"].join(\"\"))\n vars.push(\"proc=CACHED[type]\")\n code.push(\"var \" + vars.join(\",\"))\n \n code.push([\"if(!proc){\",\n \"CACHED[type]=proc=compile([\", typesig.join(\",\"), \"])}\",\n \"return proc(\", proc_args.join(\",\"), \")}\"].join(\"\"))\n\n if(proc.debug) {\n console.log(\"-----Generated thunk:\\n\" + code.join(\"\\n\") + \"\\n----------\")\n }\n \n //Compile thunk\n var thunk = new Function(\"compile\", code.join(\"\\n\"))\n return thunk(compile.bind(undefined, proc))\n}\n\nmodule.exports = createThunk\n","\"use strict\"\n\nvar createThunk = require(\"./lib/thunk.js\")\n\nfunction Procedure() {\n this.argTypes = []\n this.shimArgs = []\n this.arrayArgs = []\n this.arrayBlockIndices = []\n this.scalarArgs = []\n this.offsetArgs = []\n this.offsetArgIndex = []\n this.indexArgs = []\n this.shapeArgs = []\n this.funcName = \"\"\n this.pre = null\n this.body = null\n this.post = null\n this.debug = false\n}\n\nfunction compileCwise(user_args) {\n //Create procedure\n var proc = new Procedure()\n \n //Parse blocks\n proc.pre = user_args.pre\n proc.body = user_args.body\n proc.post = user_args.post\n\n //Parse arguments\n var proc_args = user_args.args.slice(0)\n proc.argTypes = proc_args\n for(var i=0; i<proc_args.length; ++i) {\n var arg_type = proc_args[i]\n if(arg_type === \"array\" || (typeof arg_type === \"object\" && arg_type.blockIndices)) {\n proc.argTypes[i] = \"array\"\n proc.arrayArgs.push(i)\n proc.arrayBlockIndices.push(arg_type.blockIndices ? arg_type.blockIndices : 0)\n proc.shimArgs.push(\"array\" + i)\n if(i < proc.pre.args.length && proc.pre.args[i].count>0) {\n throw new Error(\"cwise: pre() block may not reference array args\")\n }\n if(i < proc.post.args.length && proc.post.args[i].count>0) {\n throw new Error(\"cwise: post() block may not reference array args\")\n }\n } else if(arg_type === \"scalar\") {\n proc.scalarArgs.push(i)\n proc.shimArgs.push(\"scalar\" + i)\n } else if(arg_type === \"index\") {\n proc.indexArgs.push(i)\n if(i < proc.pre.args.length && proc.pre.args[i].count > 0) {\n throw new Error(\"cwise: pre() block may not reference array index\")\n }\n if(i < proc.body.args.length && proc.body.args[i].lvalue) {\n throw new Error(\"cwise: body() block may not write to array index\")\n }\n if(i < proc.post.args.length && proc.post.args[i].count > 0) {\n throw new Error(\"cwise: post() block may not reference array index\")\n }\n } else if(arg_type === \"shape\") {\n proc.shapeArgs.push(i)\n if(i < proc.pre.args.length && proc.pre.args[i].lvalue) {\n throw new Error(\"cwise: pre() block may not write to array shape\")\n }\n if(i < proc.body.args.length && proc.body.args[i].lvalue) {\n throw new Error(\"cwise: body() block may not write to array shape\")\n }\n if(i < proc.post.args.length && proc.post.args[i].lvalue) {\n throw new Error(\"cwise: post() block may not write to array shape\")\n }\n } else if(typeof arg_type === \"object\" && arg_type.offset) {\n proc.argTypes[i] = \"offset\"\n proc.offsetArgs.push({ array: arg_type.array, offset:arg_type.offset })\n proc.offsetArgIndex.push(i)\n } else {\n throw new Error(\"cwise: Unknown argument type \" + proc_args[i])\n }\n }\n \n //Make sure at least one array argument was specified\n if(proc.arrayArgs.length <= 0) {\n throw new Error(\"cwise: No array arguments specified\")\n }\n \n //Make sure arguments are correct\n if(proc.pre.args.length > proc_args.length) {\n throw new Error(\"cwise: Too many arguments in pre() block\")\n }\n if(proc.body.args.length > proc_args.length) {\n throw new Error(\"cwise: Too many arguments in body() block\")\n }\n if(proc.post.args.length > proc_args.length) {\n throw new Error(\"cwise: Too many arguments in post() block\")\n }\n\n //Check debug flag\n proc.debug = !!user_args.printCode || !!user_args.debug\n \n //Retrieve name\n proc.funcName = user_args.funcName || \"cwise\"\n \n //Read in block size\n proc.blockSize = user_args.blockSize || 64\n\n return createThunk(proc)\n}\n\nmodule.exports = compileCwise\n","\"use strict\"\n\nvar compile = require(\"cwise-compiler\")\n\nvar EmptyProc = {\n body: \"\",\n args: [],\n thisVars: [],\n localVars: []\n}\n\nfunction fixup(x) {\n if(!x) {\n return EmptyProc\n }\n for(var i=0; i<x.args.length; ++i) {\n var a = x.args[i]\n if(i === 0) {\n x.args[i] = {name: a, lvalue:true, rvalue: !!x.rvalue, count:x.count||1 }\n } else {\n x.args[i] = {name: a, lvalue:false, rvalue:true, count: 1}\n }\n }\n if(!x.thisVars) {\n x.thisVars = []\n }\n if(!x.localVars) {\n x.localVars = []\n }\n return x\n}\n\nfunction pcompile(user_args) {\n return compile({\n args: user_args.args,\n pre: fixup(user_args.pre),\n body: fixup(user_args.body),\n post: fixup(user_args.proc),\n funcName: user_args.funcName\n })\n}\n\nfunction makeOp(user_args) {\n var args = []\n for(var i=0; i<user_args.args.length; ++i) {\n args.push(\"a\"+i)\n }\n var wrapper = new Function(\"P\", [\n \"return function \", user_args.funcName, \"_ndarrayops(\", args.join(\",\"), \") {P(\", args.join(\",\"), \");return a0}\"\n ].join(\"\"))\n return wrapper(pcompile(user_args))\n}\n\nvar assign_ops = {\n add: \"+\",\n sub: \"-\",\n mul: \"*\",\n div: \"/\",\n mod: \"%\",\n band: \"&\",\n bor: \"|\",\n bxor: \"^\",\n lshift: \"<<\",\n rshift: \">>\",\n rrshift: \">>>\"\n}\n;(function(){\n for(var id in assign_ops) {\n var op = assign_ops[id]\n exports[id] = makeOp({\n args: [\"array\",\"array\",\"array\"],\n body: {args:[\"a\",\"b\",\"c\"],\n body: \"a=b\"+op+\"c\"},\n funcName: id\n })\n exports[id+\"eq\"] = makeOp({\n args: [\"array\",\"array\"],\n body: {args:[\"a\",\"b\"],\n body:\"a\"+op+\"=b\"},\n rvalue: true,\n funcName: id+\"eq\"\n })\n exports[id+\"s\"] = makeOp({\n args: [\"array\", \"array\", \"scalar\"],\n body: {args:[\"a\",\"b\",\"s\"],\n body:\"a=b\"+op+\"s\"},\n funcName: id+\"s\"\n })\n exports[id+\"seq\"] = makeOp({\n args: [\"array\",\"scalar\"],\n body: {args:[\"a\",\"s\"],\n body:\"a\"+op+\"=s\"},\n rvalue: true,\n funcName: id+\"seq\"\n })\n }\n})();\n\nvar unary_ops = {\n not: \"!\",\n bnot: \"~\",\n neg: \"-\",\n recip: \"1.0/\"\n}\n;(function(){\n for(var id in unary_ops) {\n var op = unary_ops[id]\n exports[id] = makeOp({\n args: [\"array\", \"array\"],\n body: {args:[\"a\",\"b\"],\n body:\"a=\"+op+\"b\"},\n funcName: id\n })\n exports[id+\"eq\"] = makeOp({\n args: [\"array\"],\n body: {args:[\"a\"],\n body:\"a=\"+op+\"a\"},\n rvalue: true,\n count: 2,\n funcName: id+\"eq\"\n })\n }\n})();\n\nvar binary_ops = {\n and: \"&&\",\n or: \"||\",\n eq: \"===\",\n neq: \"!==\",\n lt: \"<\",\n gt: \">\",\n leq: \"<=\",\n geq: \">=\"\n}\n;(function() {\n for(var id in binary_ops) {\n var op = binary_ops[id]\n exports[id] = makeOp({\n args: [\"array\",\"array\",\"array\"],\n body: {args:[\"a\", \"b\", \"c\"],\n body:\"a=b\"+op+\"c\"},\n funcName: id\n })\n exports[id+\"s\"] = makeOp({\n args: [\"array\",\"array\",\"scalar\"],\n body: {args:[\"a\", \"b\", \"s\"],\n body:\"a=b\"+op+\"s\"},\n funcName: id+\"s\"\n })\n exports[id+\"eq\"] = makeOp({\n args: [\"array\", \"array\"],\n body: {args:[\"a\", \"b\"],\n body:\"a=a\"+op+\"b\"},\n rvalue:true,\n count:2,\n funcName: id+\"eq\"\n })\n exports[id+\"seq\"] = makeOp({\n args: [\"array\", \"scalar\"],\n body: {args:[\"a\",\"s\"],\n body:\"a=a\"+op+\"s\"},\n rvalue:true,\n count:2,\n funcName: id+\"seq\"\n })\n }\n})();\n\nvar math_unary = [\n \"abs\",\n \"acos\",\n \"asin\",\n \"atan\",\n \"ceil\",\n \"cos\",\n \"exp\",\n \"floor\",\n \"log\",\n \"round\",\n \"sin\",\n \"sqrt\",\n \"tan\"\n]\n;(function() {\n for(var i=0; i<math_unary.length; ++i) {\n var f = math_unary[i]\n exports[f] = makeOp({\n args: [\"array\", \"array\"],\n pre: {args:[], body:\"this_f=Math.\"+f, thisVars:[\"this_f\"]},\n body: {args:[\"a\",\"b\"], body:\"a=this_f(b)\", thisVars:[\"this_f\"]},\n funcName: f\n })\n exports[f+\"eq\"] = makeOp({\n args: [\"array\"],\n pre: {args:[], body:\"this_f=Math.\"+f, thisVars:[\"this_f\"]},\n body: {args: [\"a\"], body:\"a=this_f(a)\", thisVars:[\"this_f\"]},\n rvalue: true,\n count: 2,\n funcName: f+\"eq\"\n })\n }\n})();\n\nvar math_comm = [\n \"max\",\n \"min\",\n \"atan2\",\n \"pow\"\n]\n;(function(){\n for(var i=0; i<math_comm.length; ++i) {\n var f= math_comm[i]\n exports[f] = makeOp({\n args:[\"array\", \"array\", \"array\"],\n pre: {args:[], body:\"this_f=Math.\"+f, thisVars:[\"this_f\"]},\n body: {args:[\"a\",\"b\",\"c\"], body:\"a=this_f(b,c)\", thisVars:[\"this_f\"]},\n funcName: f\n })\n exports[f+\"s\"] = makeOp({\n args:[\"array\", \"array\", \"scalar\"],\n pre: {args:[], body:\"this_f=Math.\"+f, thisVars:[\"this_f\"]},\n body: {args:[\"a\",\"b\",\"c\"], body:\"a=this_f(b,c)\", thisVars:[\"this_f\"]},\n funcName: f+\"s\"\n })\n exports[f+\"eq\"] = makeOp({ args:[\"array\", \"array\"],\n pre: {args:[], body:\"this_f=Math.\"+f, thisVars:[\"this_f\"]},\n body: {args:[\"a\",\"b\"], body:\"a=this_f(a,b)\", thisVars:[\"this_f\"]},\n rvalue: true,\n count: 2,\n funcName: f+\"eq\"\n })\n exports[f+\"seq\"] = makeOp({ args:[\"array\", \"scalar\"],\n pre: {args:[], body:\"this_f=Math.\"+f, thisVars:[\"this_f\"]},\n body: {args:[\"a\",\"b\"], body:\"a=this_f(a,b)\", thisVars:[\"this_f\"]},\n rvalue:true,\n count:2,\n funcName: f+\"seq\"\n })\n }\n})();\n\nvar math_noncomm = [\n \"atan2\",\n \"pow\"\n]\n;(function(){\n for(var i=0; i<math_noncomm.length; ++i) {\n var f= math_noncomm[i]\n exports[f+\"op\"] = makeOp({\n args:[\"array\", \"array\", \"array\"],\n pre: {args:[], body:\"this_f=Math.\"+f, thisVars:[\"this_f\"]},\n body: {args:[\"a\",\"b\",\"c\"], body:\"a=this_f(c,b)\", thisVars:[\"this_f\"]},\n funcName: f+\"op\"\n })\n exports[f+\"ops\"] = makeOp({\n args:[\"array\", \"array\", \"scalar\"],\n pre: {args:[], body:\"this_f=Math.\"+f, thisVars:[\"this_f\"]},\n body: {args:[\"a\",\"b\",\"c\"], body:\"a=this_f(c,b)\", thisVars:[\"this_f\"]},\n funcName: f+\"ops\"\n })\n exports[f+\"opeq\"] = makeOp({ args:[\"array\", \"array\"],\n pre: {args:[], body:\"this_f=Math.\"+f, thisVars:[\"this_f\"]},\n body: {args:[\"a\",\"b\"], body:\"a=this_f(b,a)\", thisVars:[\"this_f\"]},\n rvalue: true,\n count: 2,\n funcName: f+\"opeq\"\n })\n exports[f+\"opseq\"] = makeOp({ args:[\"array\", \"scalar\"],\n pre: {args:[], body:\"this_f=Math.\"+f, thisVars:[\"this_f\"]},\n body: {args:[\"a\",\"b\"], body:\"a=this_f(b,a)\", thisVars:[\"this_f\"]},\n rvalue:true,\n count:2,\n funcName: f+\"opseq\"\n })\n }\n})();\n\nexports.any = compile({\n args:[\"array\"],\n pre: EmptyProc,\n body: {args:[{name:\"a\", lvalue:false, rvalue:true, count:1}], body: \"if(a){return true}\", localVars: [], thisVars: []},\n post: {args:[], localVars:[], thisVars:[], body:\"return false\"},\n funcName: \"any\"\n})\n\nexports.all = compile({\n args:[\"array\"],\n pre: EmptyProc,\n body: {args:[{name:\"x\", lvalue:false, rvalue:true, count:1}], body: \"if(!x){return false}\", localVars: [], thisVars: []},\n post: {args:[], localVars:[], thisVars:[], body:\"return true\"},\n funcName: \"all\"\n})\n\nexports.sum = compile({\n args:[\"array\"],\n pre: {args:[], localVars:[], thisVars:[\"this_s\"], body:\"this_s=0\"},\n body: {args:[{name:\"a\", lvalue:false, rvalue:true, count:1}], body: \"this_s+=a\", localVars: [], thisVars: [\"this_s\"]},\n post: {args:[], localVars:[], thisVars:[\"this_s\"], body:\"return this_s\"},\n funcName: \"sum\"\n})\n\nexports.prod = compile({\n args:[\"array\"],\n pre: {args:[], localVars:[], thisVars:[\"this_s\"], body:\"this_s=1\"},\n body: {args:[{name:\"a\", lvalue:false, rvalue:true, count:1}], body: \"this_s*=a\", localVars: [], thisVars: [\"this_s\"]},\n post: {args:[], localVars:[], thisVars:[\"this_s\"], body:\"return this_s\"},\n funcName: \"prod\"\n})\n\nexports.norm2squared = compile({\n args:[\"array\"],\n pre: {args:[], localVars:[], thisVars:[\"this_s\"], body:\"this_s=0\"},\n body: {args:[{name:\"a\", lvalue:false, rvalue:true, count:2}], body: \"this_s+=a*a\", localVars: [], thisVars: [\"this_s\"]},\n post: {args:[], localVars:[], thisVars:[\"this_s\"], body:\"return this_s\"},\n funcName: \"norm2squared\"\n})\n \nexports.norm2 = compile({\n args:[\"array\"],\n pre: {args:[], localVars:[], thisVars:[\"this_s\"], body:\"this_s=0\"},\n body: {args:[{name:\"a\", lvalue:false, rvalue:true, count:2}], body: \"this_s+=a*a\", localVars: [], thisVars: [\"this_s\"]},\n post: {args:[], localVars:[], thisVars:[\"this_s\"], body:\"return Math.sqrt(this_s)\"},\n funcName: \"norm2\"\n})\n \n\nexports.norminf = compile({\n args:[\"array\"],\n pre: {args:[], localVars:[], thisVars:[\"this_s\"], body:\"this_s=0\"},\n body: {args:[{name:\"a\", lvalue:false, rvalue:true, count:4}], body:\"if(-a>this_s){this_s=-a}else if(a>this_s){this_s=a}\", localVars: [], thisVars: [\"this_s\"]},\n post: {args:[], localVars:[], thisVars:[\"this_s\"], body:\"return this_s\"},\n funcName: \"norminf\"\n})\n\nexports.norm1 = compile({\n args:[\"array\"],\n pre: {args:[], localVars:[], thisVars:[\"this_s\"], body:\"this_s=0\"},\n body: {args:[{name:\"a\", lvalue:false, rvalue:true, count:3}], body: \"this_s+=a<0?-a:a\", localVars: [], thisVars: [\"this_s\"]},\n post: {args:[], localVars:[], thisVars:[\"this_s\"], body:\"return this_s\"},\n funcName: \"norm1\"\n})\n\nexports.sup = compile({\n args: [ \"array\" ],\n pre:\n { body: \"this_h=-Infinity\",\n args: [],\n thisVars: [ \"this_h\" ],\n localVars: [] },\n body:\n { body: \"if(_inline_1_arg0_>this_h)this_h=_inline_1_arg0_\",\n args: [{\"name\":\"_inline_1_arg0_\",\"lvalue\":false,\"rvalue\":true,\"count\":2} ],\n thisVars: [ \"this_h\" ],\n localVars: [] },\n post:\n { body: \"return this_h\",\n args: [],\n thisVars: [ \"this_h\" ],\n localVars: [] }\n })\n\nexports.inf = compile({\n args: [ \"array\" ],\n pre:\n { body: \"this_h=Infinity\",\n args: [],\n thisVars: [ \"this_h\" ],\n localVars: [] },\n body:\n { body: \"if(_inline_1_arg0_<this_h)this_h=_inline_1_arg0_\",\n args: [{\"name\":\"_inline_1_arg0_\",\"lvalue\":false,\"rvalue\":true,\"count\":2} ],\n thisVars: [ \"this_h\" ],\n localVars: [] },\n post:\n { body: \"return this_h\",\n args: [],\n thisVars: [ \"this_h\" ],\n localVars: [] }\n })\n\nexports.argmin = compile({\n args:[\"index\",\"array\",\"shape\"],\n pre:{\n body:\"{this_v=Infinity;this_i=_inline_0_arg2_.slice(0)}\",\n args:[\n {name:\"_inline_0_arg0_\",lvalue:false,rvalue:false,count:0},\n {name:\"_inline_0_arg1_\",lvalue:false,rvalue:false,count:0},\n {name:\"_inline_0_arg2_\",lvalue:false,rvalue:true,count:1}\n ],\n thisVars:[\"this_i\",\"this_v\"],\n localVars:[]},\n body:{\n body:\"{if(_inline_1_arg1_<this_v){this_v=_inline_1_arg1_;for(var _inline_1_k=0;_inline_1_k<_inline_1_arg0_.length;++_inline_1_k){this_i[_inline_1_k]=_inline_1_arg0_[_inline_1_k]}}}\",\n args:[\n {name:\"_inline_1_arg0_\",lvalue:false,rvalue:true,count:2},\n {name:\"_inline_1_arg1_\",lvalue:false,rvalue:true,count:2}],\n thisVars:[\"this_i\",\"this_v\"],\n localVars:[\"_inline_1_k\"]},\n post:{\n body:\"{return this_i}\",\n args:[],\n thisVars:[\"this_i\"],\n localVars:[]}\n})\n\nexports.argmax = compile({\n args:[\"index\",\"array\",\"shape\"],\n pre:{\n body:\"{this_v=-Infinity;this_i=_inline_0_arg2_.slice(0)}\",\n args:[\n {name:\"_inline_0_arg0_\",lvalue:false,rvalue:false,count:0},\n {name:\"_inline_0_arg1_\",lvalue:false,rvalue:false,count:0},\n {name:\"_inline_0_arg2_\",lvalue:false,rvalue:true,count:1}\n ],\n thisVars:[\"this_i\",\"this_v\"],\n localVars:[]},\n body:{\n body:\"{if(_inline_1_arg1_>this_v){this_v=_inline_1_arg1_;for(var _inline_1_k=0;_inline_1_k<_inline_1_arg0_.length;++_inline_1_k){this_i[_inline_1_k]=_inline_1_arg0_[_inline_1_k]}}}\",\n args:[\n {name:\"_inline_1_arg0_\",lvalue:false,rvalue:true,count:2},\n {name:\"_inline_1_arg1_\",lvalue:false,rvalue:true,count:2}],\n thisVars:[\"this_i\",\"this_v\"],\n localVars:[\"_inline_1_k\"]},\n post:{\n body:\"{return this_i}\",\n args:[],\n thisVars:[\"this_i\"],\n localVars:[]}\n}) \n\nexports.random = makeOp({\n args: [\"array\"],\n pre: {args:[], body:\"this_f=Math.random\", thisVars:[\"this_f\"]},\n body: {args: [\"a\"], body:\"a=this_f()\", thisVars:[\"this_f\"]},\n funcName: \"random\"\n})\n\nexports.assign = makeOp({\n args:[\"array\", \"array\"],\n body: {args:[\"a\", \"b\"], body:\"a=b\"},\n funcName: \"assign\" })\n\nexports.assigns = makeOp({\n args:[\"array\", \"scalar\"],\n body: {args:[\"a\", \"b\"], body:\"a=b\"},\n funcName: \"assigns\" })\n\n\nexports.equals = compile({\n args:[\"array\", \"array\"],\n pre: EmptyProc,\n body: {args:[{name:\"x\", lvalue:false, rvalue:true, count:1},\n {name:\"y\", lvalue:false, rvalue:true, count:1}], \n body: \"if(x!==y){return false}\", \n localVars: [], \n thisVars: []},\n post: {args:[], localVars:[], thisVars:[], body:\"return true\"},\n funcName: \"equals\"\n})\n\n\n","import ndarray from 'ndarray';\nimport ops from 'ndarray-ops';\n\nfunction getPixelsInternal(buffer, mimeType) {\n // Warn for Data URIs, URLs, and file paths. Support removed in v3.\n if (!(buffer instanceof Uint8Array)) {\n throw new Error('[ndarray-pixels] Input must be Uint8Array or Buffer.');\n }\n const blob = new Blob([buffer], {\n type: mimeType\n });\n const path = URL.createObjectURL(blob);\n // Decode image with Canvas API.\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = function () {\n URL.revokeObjectURL(path);\n const canvas = new OffscreenCanvas(img.width, img.height);\n const context = canvas.getContext('2d');\n context.drawImage(img, 0, 0);\n const pixels = context.getImageData(0, 0, img.width, img.height);\n resolve(ndarray(new Uint8Array(pixels.data), [img.width, img.height, 4], [4, 4 * img.width, 1], 0));\n };\n img.onerror = err => {\n URL.revokeObjectURL(path);\n reject(err);\n };\n img.src = path;\n });\n}\n\nfunction putPixelData(array, data, frame = -1) {\n if (array.shape.length === 4) {\n return putPixelData(array.pick(frame), data, 0);\n } else if (array.shape.length === 3) {\n if (array.shape[2] === 3) {\n ops.assign(ndarray(data, [array.shape[0], array.shape[1], 3], [4, 4 * array.shape[0], 1]), array);\n ops.assigns(ndarray(data, [array.shape[0] * array.shape[1]], [4], 3), 255);\n } else if (array.shape[2] === 4) {\n ops.assign(ndarray(data, [array.shape[0], array.shape[1], 4], [4, array.shape[0] * 4, 1]), array);\n } else if (array.shape[2] === 1) {\n ops.assign(ndarray(data, [array.shape[0], array.shape[1], 3], [4, 4 * array.shape[0], 1]), ndarray(array.data, [array.shape[0], array.shape[1], 3], [array.stride[0], array.stride[1], 0], array.offset));\n ops.assigns(ndarray(data, [array.shape[0] * array.shape[1]], [4], 3), 255);\n } else {\n throw new Error('[ndarray-pixels] Incompatible array shape.');\n }\n } else if (array.shape.length === 2) {\n ops.assign(ndarray(data, [array.shape[0], array.shape[1], 3], [4, 4 * array.shape[0], 1]), ndarray(array.data, [array.shape[0], array.shape[1], 3], [array.stride[0], array.stride[1], 0], array.offset));\n ops.assigns(ndarray(data, [array.shape[0] * array.shape[1]], [4], 3), 255);\n } else {\n throw new Error('[ndarray-pixels] Incompatible array shape.');\n }\n return data;\n}\n\nasync function savePixelsInternal(pixels, options) {\n // Create OffscreenCanvas and write pixel data.\n const canvas = new OffscreenCanvas(pixels.shape[0], pixels.shape[1]);\n const context = canvas.getContext('2d');\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\n putPixelData(pixels, imageData.data);\n context.putImageData(imageData, 0, 0);\n return streamCanvas(canvas, options);\n}\n/** Creates readable stream from given OffscreenCanvas and options. */\nasync function streamCanvas(canvas, options) {\n const blob = await canvas.convertToBlob(options);\n const ab = await blob.arrayBuffer();\n return new Uint8Array(ab);\n}\n\n/**\n * Decodes image data to an `ndarray`.\n *\n * MIME type is optional when given a path or URL, and required when given a Uint8Array.\n *\n * Accepts `image/png` or `image/jpeg` in Node.js, and additional formats on browsers with\n * the necessary support in Canvas 2D.\n *\n * @param data\n * @param mimeType `image/jpeg`, `image/png`, etc.\n * @returns\n */\nasync function getPixels(data, mimeType) {\n return getPixelsInternal(data, mimeType);\n}\n/**\n * Encodes an `ndarray` as image data in the given format.\n *\n * If the source `ndarray` was constructed manually with default stride, use\n * `ndarray.transpose(1, 0)` to reshape it and ensure an identical result from getPixels(). For an\n * ndarray created by getPixels(), this isn't necessary.\n *\n * Accepts `image/png` or `image/jpeg` in Node.js, and additional formats on browsers with\n * the necessary support in Canvas 2D.\n *\n * @param pixels ndarray of shape W x H x 4.\n * @param typeOrOptions object with encoding options or just the type\n * @param typeOrOptions.type target format (`image/jpeg`, `image/png`, `image/webp`, etc.)\n * @param typeOrOptions.quality quality as a number from 0 to 1, inclusive\n * @returns\n */\nasync function savePixels(pixels, typeOrOptions) {\n let options;\n if (typeof typeOrOptions === 'string') {\n options = {\n type: typeOrOptions,\n quality: undefined\n };\n } else {\n options = {\n type: typeOrOptions.type,\n quality: typeOrOptions.quality\n };\n }\n return savePixelsInternal(pixels, options);\n}\n\nexport { getPixels, savePixels };\n//# sourceMappingURL=ndarray-pixels-browser.modern.js.map\n","import { Primitive, PropertyType, Document, getBounds as getBounds$1, Scene, BufferUtils, Root, TextureInfo, Texture, ExtensionProperty, AnimationChannel, Material, ColorUtils, MathUtils, Accessor, Mesh, ComponentTypeToTypedArray, ImageUtils, TextureChannel, Node, PrimitiveTarget, AnimationSampler, FileUtils, uuid } from '@gltf-transform/core';\nimport { getPixels, savePixels } from 'ndarray-pixels';\nimport { KHRMeshQuantization, KHRDracoMeshCompression, EXTMeshGPUInstancing, EXTMeshoptCompression, KHRMaterialsIOR, KHRMaterialsSpecular, KHRMaterialsPBRSpecularGlossiness, EXTTextureWebP, EXTTextureAVIF, KHRMaterialsUnlit } from '@gltf-transform/extensions';\nimport { read, KHR_DF_MODEL_ETC1S, KHR_DF_MODEL_UASTC } from 'ktx-parse';\nimport ndarray from 'ndarray';\nimport { lanczos3, lanczos2 } from 'ndarray-lanczos';\n\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\n\nconst {\n POINTS: POINTS$1,\n LINES: LINES$2,\n LINE_STRIP: LINE_STRIP$3,\n LINE_LOOP: LINE_LOOP$3,\n TRIANGLES: TRIANGLES$2,\n TRIANGLE_STRIP: TRIANGLE_STRIP$3,\n TRIANGLE_FAN: TRIANGLE_FAN$3\n} = Primitive.Mode;\n/**\n * Prepares a function used in an {@link Document#transform} pipeline. Use of this wrapper is\n * optional, and plain functions may be used in transform pipelines just as well. The wrapper is\n * used internally so earlier pipeline stages can detect and optimize based on later stages.\n * @hidden\n */\nfunction createTransform(name, fn) {\n Object.defineProperty(fn, 'name', {\n value: name\n });\n return fn;\n}\n/** @hidden */\nfunction isTransformPending(context, initial, pending) {\n if (!context) return false;\n const initialIndex = context.stack.lastIndexOf(initial);\n const pendingIndex = context.stack.lastIndexOf(pending);\n return initialIndex < pendingIndex;\n}\n/**\n * Performs a shallow merge on an 'options' object and a 'defaults' object.\n * Equivalent to `{...defaults, ...options}` _except_ that `undefined` values\n * in the 'options' object are ignored.\n *\n * @hidden\n */\nfunction assignDefaults(defaults, options) {\n const result = _extends({}, defaults);\n for (const key in options) {\n if (options[key] !== undefined) {\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n result[key] = options[key];\n }\n }\n return result;\n}\n/**\n * Maps pixels from source to target textures, with a per-pixel callback.\n * @hidden\n */\nasync function rewriteTexture(source, target, fn) {\n if (!source) return null;\n const srcImage = source.getImage();\n if (!srcImage) return null;\n const pixels = await getPixels(srcImage, source.getMimeType());\n for (let i = 0; i < pixels.shape[0]; ++i) {\n for (let j = 0; j < pixels.shape[1]; ++j) {\n fn(pixels, i, j);\n }\n }\n const dstImage = await savePixels(pixels, 'image/png');\n return target.setImage(dstImage).setMimeType('image/png');\n}\n/** @hidden */\nfunction getGLPrimitiveCount(prim) {\n const indices = prim.getIndices();\n const position = prim.getAttribute('POSITION');\n // Reference: https://www.khronos.org/opengl/wiki/Primitive\n switch (prim.getMode()) {\n case Primitive.Mode.POINTS:\n return indices ? indices.getCount() : position.getCount();\n case Primitive.Mode.LINES:\n return indices ? indices.getCount() / 2 : position.getCount() / 2;\n case Primitive.Mode.LINE_LOOP:\n return indices ? indices.getCount() : position.getCount();\n case Primitive.Mode.LINE_STRIP:\n return indices ? indices.getCount() - 1 : position.getCount() - 1;\n case Primitive.Mode.TRIANGLES:\n return indices ? indices.getCount() / 3 : position.getCount() / 3;\n case Primitive.Mode.TRIANGLE_STRIP:\n case Primitive.Mode.TRIANGLE_FAN:\n return indices ? indices.getCount() - 2 : position.getCount() - 2;\n default:\n throw new Error('Unexpected mode: ' + prim.getMode());\n }\n}\n/** @hidden */\nclass SetMap {\n constructor() {\n this._map = new Map();\n }\n get size() {\n return this._map.size;\n }\n has(k) {\n return this._map.has(k);\n }\n add(k, v) {\n let entry = this._map.get(k);\n if (!entry) {\n entry = new Set();\n this._map.set(k, entry);\n }\n entry.add(v);\n return this;\n }\n get(k) {\n return this._map.get(k) || new Set();\n }\n keys() {\n return this._map.keys();\n }\n}\n/** @hidden */\nfunction formatBytes(bytes, decimals = 2) {\n if (bytes === 0) return '0 Bytes';\n const k = 1000;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n}\nconst _longFormatter = new Intl.NumberFormat(undefined, {\n maximumFractionDigits: 0\n});\n/** @hidden */\nfunction formatLong(x) {\n return _longFormatter.format(x);\n}\n/** @hidden */\nfunction formatDelta(a, b, decimals = 2) {\n const prefix = a > b ? '–' : '+';\n const suffix = '%';\n return prefix + (Math.abs(a - b) / a * 100).toFixed(decimals) + suffix;\n}\n/** @hidden */\nfunction formatDeltaOp(a, b) {\n return `${formatLong(a)} → ${formatLong(b)} (${formatDelta(a, b)})`;\n}\n/**\n * Returns a list of all unique vertex attributes on the given primitive and\n * its morph targets.\n * @hidden\n */\nfunction deepListAttributes(prim) {\n const accessors = [];\n for (const attribute of prim.listAttributes()) {\n accessors.push(attribute);\n }\n for (const target of prim.listTargets()) {\n for (const attribute of target.listAttributes()) {\n accessors.push(attribute);\n }\n }\n return Array.from(new Set(accessors));\n}\n/** @hidden */\nfunction deepSwapAttribute(prim, src, dst) {\n prim.swap(src, dst);\n for (const target of prim.listTargets()) {\n target.swap(src, dst);\n }\n}\n/** @hidden */\nfunction shallowEqualsArray(a, b) {\n if (a == null && b == null) return true;\n if (a == null || b == null) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n/** Clones an {@link Accessor} without creating a copy of its underlying TypedArray data. */\nfunction shallowCloneAccessor(document, accessor) {\n return document.createAccessor(accessor.getName()).setArray(accessor.getArray()).setType(accessor.getType()).setBuffer(accessor.getBuffer()).setNormalized(accessor.getNormalized()).setSparse(accessor.getSparse());\n}\n/** @hidden */\nfunction createIndices(count, maxIndex = count) {\n const array = createIndicesEmpty(count, maxIndex);\n for (let i = 0; i < array.length; i++) array[i] = i;\n return array;\n}\n/** @hidden */\nfunction createIndicesEmpty(count, maxIndex = count) {\n return maxIndex <= 65534 ? new Uint16Array(count) : new Uint32Array(count);\n}\n/** @hidden */\nfunction isUsed(prop) {\n return prop.listParents().some(parent => parent.propertyType !== PropertyType.ROOT);\n}\n/** @hidden */\nfunction isEmptyObject(object) {\n for (const key in object) return false;\n return true;\n}\n/**\n * Creates a unique key associated with the structure and draw call characteristics of\n * a {@link Primitive}, independent of its vertex content. Helper method, used to\n * identify candidate Primitives for joining.\n * @hidden\n */\nfunction createPrimGroupKey(prim) {\n const document = Document.fromGraph(prim.getGraph());\n const material = prim.getMaterial();\n const materialIndex = document.getRoot().listMaterials().indexOf(material);\n const mode = BASIC_MODE_MAPPING[prim.getMode()];\n const indices = !!prim.getIndices();\n const attributes = prim.listSemantics().sort().map(semantic => {\n const attribute = prim.getAttribute(semantic);\n const elementSize = attribute.getElementSize();\n const componentType = attribute.getComponentType();\n return `${semantic}:${elementSize}:${componentType}`;\n }).join('+');\n const targets = prim.listTargets().map(target => {\n return target.listSemantics().sort().map(semantic => {\n const attribute = prim.getAttribute(semantic);\n const elementSize = attribute.getElementSize();\n const componentType = attribute.getComponentType();\n return `${semantic}:${elementSize}:${componentType}`;\n }).join('+');\n }).join('~');\n return `${materialIndex}|${mode}|${indices}|${attributes}|${targets}`;\n}\n/**\n * Scales `size` NxN dimensions to fit within `limit` NxN dimensions, without\n * changing aspect ratio. If `size` <= `limit` in all dimensions, returns `size`.\n * @hidden\n */\nfunction fitWithin(size, limit) {\n const [maxWidth, maxHeight] = limit;\n const [srcWidth, srcHeight] = size;\n if (srcWidth <= maxWidth && srcHeight <= maxHeight) return size;\n let dstWidth = srcWidth;\n let dstHeight = srcHeight;\n if (dstWidth > maxWidth) {\n dstHeight = Math.floor(dstHeight * (maxWidth / dstWidth));\n dstWidth = maxWidth;\n }\n if (dstHeight > maxHeight) {\n dstWidth = Math.floor(dstWidth * (maxHeight / dstHeight));\n dstHeight = maxHeight;\n }\n return [dstWidth, dstHeight];\n}\n/**\n * Scales `size` NxN dimensions to the specified power of two.\n * @hidden\n */\nfunction fitPowerOfTwo(size, method) {\n if (isPowerOfTwo(size[0]) && isPowerOfTwo(size[1])) {\n return size;\n }\n switch (method) {\n case 'nearest-pot':\n return size.map(nearestPowerOfTwo);\n case 'ceil-pot':\n return size.map(ceilPowerOfTwo$1);\n case 'floor-pot':\n return size.map(floorPowerOfTwo);\n }\n}\nfunction isPowerOfTwo(value) {\n if (value <= 2) return true;\n return (value & value - 1) === 0 && value !== 0;\n}\nfunction nearestPowerOfTwo(value) {\n if (value <= 4) return 4;\n const lo = floorPowerOfTwo(value);\n const hi = ceilPowerOfTwo$1(value);\n if (hi - value > value - lo) return lo;\n return hi;\n}\nfunction floorPowerOfTwo(value) {\n return Math.pow(2, Math.floor(Math.log(value) / Math.LN2));\n}\nfunction ceilPowerOfTwo$1(value) {\n return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2));\n}\n/**\n * Mapping from any glTF primitive mode to its equivalent basic mode, as returned by\n * {@link convertPrimitiveMode}.\n * @hidden\n */\nconst BASIC_MODE_MAPPING = {\n [POINTS$1]: POINTS$1,\n [LINES$2]: LINES$2,\n [LINE_STRIP$3]: LINES$2,\n [LINE_LOOP$3]: LINES$2,\n [TRIANGLES$2]: TRIANGLES$2,\n [TRIANGLE_STRIP$3]: TRIANGLES$2,\n [TRIANGLE_FAN$3]: TRIANGLES$2\n};\n\nconst NAME$q = 'center';\nconst CENTER_DEFAULTS = {\n pivot: 'center'\n};\n/**\n * Centers the {@link Scene} at the origin, or above/below it. Transformations from animation,\n * skinning, and morph targets are not taken into account.\n *\n * Example:\n *\n * ```ts\n * await document.transform(center({pivot: 'below'}));\n * ```\n *\n * @category Transforms\n */\nfunction center(_options = CENTER_DEFAULTS) {\n const options = assignDefaults(CENTER_DEFAULTS, _options);\n return createTransform(NAME$q, doc => {\n const logger = doc.getLogger();\n const root = doc.getRoot();\n const isAnimated = root.listAnimations().length > 0 || root.listSkins().length > 0;\n doc.getRoot().listScenes().forEach((scene, index) => {\n logger.debug(`${NAME$q}: Scene ${index + 1} / ${root.listScenes().length}.`);\n let pivot;\n if (typeof options.pivot === 'string') {\n const bbox = getBounds$1(scene);\n pivot = [(bbox.max[0] - bbox.min[0]) / 2 + bbox.min[0], (bbox.max[1] - bbox.min[1]) / 2 + bbox.min[1], (bbox.max[2] - bbox.min[2]) / 2 + bbox.min[2]];\n if (options.pivot === 'above') pivot[1] = bbox.max[1];\n if (options.pivot === 'below') pivot[1] = bbox.min[1];\n } else {\n pivot = options.pivot;\n }\n logger.debug(`${NAME$q}: Pivot \"${pivot.join(', ')}\".`);\n const offset = [-1 * pivot[0], -1 * pivot[1], -1 * pivot[2]];\n if (isAnimated) {\n logger.debug(`${NAME$q}: Model contains animation or skin. Adding a wrapper node.`);\n const offsetNode = doc.createNode('Pivot').setTranslation(offset);\n scene.listChildren().forEach(child => offsetNode.addChild(child));\n scene.addChild(offsetNode);\n } else {\n logger.debug(`${NAME$q}: Skipping wrapper, offsetting all root nodes.`);\n scene.listChildren().forEach(child => {\n const t = child.getTranslation();\n child.setTranslation([t[0] + offset[0], t[1] + offset[1], t[2] + offset[2]]);\n });\n }\n });\n logger.debug(`${NAME$q}: Complete.`);\n });\n}\n\n/**\n * Finds the parent {@link Scene Scenes} associated with the given {@link Node}.\n * In most cases a Node is associated with only one Scene, but it is possible\n * for a Node to be located in two or more Scenes, or none at all.\n *\n * Example:\n *\n * ```typescript\n * import { listNodeScenes } from '@gltf-transform/functions';\n *\n * const node = document.getRoot().listNodes()\n * .find((node) => node.getName() === 'MyNode');\n *\n * const scenes = listNodeScenes(node);\n * ```\n */\nfunction listNodeScenes(node) {\n const visited = new Set();\n let child = node;\n let parent;\n while (parent = child.getParentNode()) {\n if (visited.has(parent)) {\n throw new Error('Circular dependency in scene graph.');\n }\n visited.add(parent);\n child = parent;\n }\n return child.listParents().filter(parent => parent instanceof Scene);\n}\n\n/**\n * Clears the parent of the given {@link Node}, leaving it attached\n * directly to its {@link Scene}. Inherited transforms will be applied\n * to the Node. This operation changes the Node's local transform,\n * but leaves its world transform unchanged.\n *\n * Example:\n *\n * ```typescript\n * import { clearNodeParent } from '@gltf-transform/functions';\n *\n * scene.traverse((node) => { ... }); // Scene → … → Node\n *\n * clearNodeParent(node);\n *\n * scene.traverse((node) => { ... }); // Scene → Node\n * ```\n *\n * To clear _all_ transforms of a Node, first clear its inherited transforms with\n * {@link clearNodeParent}, then clear the local transform with {@link clearNodeTransform}.\n */\nfunction clearNodeParent(node) {\n const scenes = listNodeScenes(node);\n const parent = node.getParentNode();\n if (!parent) return node;\n // Apply inherited transforms to local matrix. Skinned meshes are not affected\n // by the node parent's transform, and can be ignored. Updates to IBMs and TRS\n // animations are out of scope in this context.\n node.setMatrix(node.getWorldMatrix());\n // Add to Scene roots.\n parent.removeChild(node);\n for (const scene of scenes) scene.addChild(node);\n return node;\n}\n\n/**\n * Common utilities\n * @module glMatrix\n */\nvar ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;\nif (!Math.hypot) Math.hypot = function () {\n var y = 0,\n i = arguments.length;\n\n while (i--) {\n y += arguments[i] * arguments[i];\n }\n\n return Math.sqrt(y);\n};\n\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\n\nfunction invert$1(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n/**\n * Calculates the determinant of a mat4\n *\n * @param {ReadonlyMat4} a the source matrix\n * @returns {Number} determinant of a\n */\n\nfunction determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32; // Calculate the determinant\n\n return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\n\nfunction multiply$2(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15]; // Cache only the current line of the second matrix\n\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Scaling vector\n * @returns {mat4} out\n */\n\nfunction fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, vec);\n * let quatMat = mat4.create();\n * quat4.toMat4(quat, quatMat);\n * mat4.multiply(dest, quatMat);\n * mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @returns {mat4} out\n */\n\nfunction fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n\n/**\n * 3x3 Matrix\n * @module mat3\n */\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\n\nfunction create$2() {\n var out = new ARRAY_TYPE(9);\n\n if (ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[5] = 0;\n out[6] = 0;\n out[7] = 0;\n }\n\n out[0] = 1;\n out[4] = 1;\n out[8] = 1;\n return out;\n}\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {ReadonlyMat4} a the source 4x4 matrix\n * @returns {mat3} out\n */\n\nfunction fromMat4(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[4];\n out[4] = a[5];\n out[5] = a[6];\n out[6] = a[8];\n out[7] = a[9];\n out[8] = a[10];\n return out;\n}\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nfunction transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a12 = a[5];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a01;\n out[5] = a[7];\n out[6] = a02;\n out[7] = a12;\n } else {\n out[0] = a[0];\n out[1] = a[3];\n out[2] = a[6];\n out[3] = a[1];\n out[4] = a[4];\n out[5] = a[7];\n out[6] = a[2];\n out[7] = a[5];\n out[8] = a[8];\n }\n\n return out;\n}\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {ReadonlyMat3} a the source matrix\n * @returns {mat3} out\n */\n\nfunction invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2];\n var a10 = a[3],\n a11 = a[4],\n a12 = a[5];\n var a20 = a[6],\n a21 = a[7],\n a22 = a[8];\n var b01 = a22 * a11 - a12 * a21;\n var b11 = -a22 * a10 + a12 * a20;\n var b21 = a21 * a10 - a11 * a20; // Calculate the determinant\n\n var det = a00 * b01 + a01 * b11 + a02 * b21;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n out[0] = b01 * det;\n out[1] = (-a22 * a01 + a02 * a21) * det;\n out[2] = (a12 * a01 - a02 * a11) * det;\n out[3] = b11 * det;\n out[4] = (a22 * a00 - a02 * a20) * det;\n out[5] = (-a12 * a00 + a02 * a10) * det;\n out[6] = b21 * det;\n out[7] = (-a21 * a00 + a01 * a20) * det;\n out[8] = (a11 * a00 - a01 * a10) * det;\n return out;\n}\n\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\n\nfunction create$1() {\n var out = new ARRAY_TYPE(3);\n\n if (ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n\n return out;\n}\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nfunction multiply$1(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nfunction min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\n\nfunction max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\n\nfunction scale$1(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\n\nfunction normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\n\nfunction transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\n\nfunction transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\n\nvar mul$1 = multiply$1;\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\n(function () {\n var vec = create$1();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 3;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n\n return a;\n };\n})();\n\nconst NAME$p = 'dedup';\nconst DEDUP_DEFAULTS = {\n keepUniqueNames: false,\n propertyTypes: [PropertyType.ACCESSOR, PropertyType.MESH, PropertyType.TEXTURE, PropertyType.MATERIAL, PropertyType.SKIN]\n};\n/**\n * Removes duplicate {@link Accessor}, {@link Mesh}, {@link Texture}, and {@link Material}\n * properties. Partially based on a\n * [gist by mattdesl](https://gist.github.com/mattdesl/aea40285e2d73916b6b9101b36d84da8). Only\n * accessors in mesh primitives, morph targets, and animation samplers are processed.\n *\n * Example:\n *\n * ```ts\n * document.getRoot().listMeshes(); // → [Mesh, Mesh, Mesh]\n *\n * await document.transform(dedup({propertyTypes: [PropertyType.MESH]}));\n *\n * document.getRoot().listMeshes(); // → [Mesh]\n * ```\n *\n * @category Transforms\n */\nfunction dedup(_options = DEDUP_DEFAULTS) {\n const options = assignDefaults(DEDUP_DEFAULTS, _options);\n const propertyTypes = new Set(options.propertyTypes);\n for (const propertyType of options.propertyTypes) {\n if (!DEDUP_DEFAULTS.propertyTypes.includes(propertyType)) {\n throw new Error(`${NAME$p}: Unsupported deduplication on type \"${propertyType}\".`);\n }\n }\n return createTransform(NAME$p, document => {\n const logger = document.getLogger();\n if (propertyTypes.has(PropertyType.ACCESSOR)) dedupAccessors(document);\n if (propertyTypes.has(PropertyType.TEXTURE)) dedupImages(document, options);\n if (propertyTypes.has(PropertyType.MATERIAL)) dedupMaterials(document, options);\n if (propertyTypes.has(PropertyType.MESH)) dedupMeshes(document, options);\n if (propertyTypes.has(PropertyType.SKIN)) dedupSkins(document, options);\n logger.debug(`${NAME$p}: Complete.`);\n });\n}\nfunction dedupAccessors(document) {\n const logger = document.getLogger();\n // Find all accessors used for mesh and animation data.\n const indicesMap = new Map();\n const attributeMap = new Map();\n const inputMap = new Map();\n const outputMap = new Map();\n const meshes = document.getRoot().listMeshes();\n meshes.forEach(mesh => {\n mesh.listPrimitives().forEach(primitive => {\n primitive.listAttributes().forEach(accessor => hashAccessor(accessor, attributeMap));\n hashAccessor(primitive.getIndices(), indicesMap);\n });\n });\n for (const animation of document.getRoot().listAnimations()) {\n for (const sampler of animation.listSamplers()) {\n hashAccessor(sampler.getInput(), inputMap);\n hashAccessor(sampler.getOutput(), outputMap);\n }\n }\n // Add accessor to the appropriate hash group. Hashes are _non-unique_,\n // intended to quickly compare everything accept the underlying array.\n function hashAccessor(accessor, group) {\n if (!accessor) return;\n const hash = [accessor.getCount(), accessor.getType(), accessor.getComponentType(), accessor.getNormalized(), accessor.getSparse()].join(':');\n let hashSet = group.get(hash);\n if (!hashSet) group.set(hash, hashSet = new Set());\n hashSet.add(accessor);\n }\n // Find duplicate accessors of a given type.\n function detectDuplicates(accessors, duplicates) {\n for (let i = 0; i < accessors.length; i++) {\n const a = accessors[i];\n const aData = BufferUtils.toView(a.getArray());\n if (duplicates.has(a)) continue;\n for (let j = i + 1; j < accessors.length; j++) {\n const b = accessors[j];\n if (duplicates.has(b)) continue;\n // Just compare the arrays — everything else was covered by the\n // hash. Comparing uint8 views is faster than comparing the\n // original typed arrays.\n if (BufferUtils.equals(aData, BufferUtils.toView(b.getArray()))) {\n duplicates.set(b, a);\n }\n }\n }\n }\n let total = 0;\n const duplicates = new Map();\n for (const group of [attributeMap, indicesMap, inputMap, outputMap]) {\n for (const hashGroup of group.values()) {\n total += hashGroup.size;\n detectDuplicates(Array.from(hashGroup), duplicates);\n }\n }\n logger.debug(`${NAME$p}: Merged ${duplicates.size} of ${total} accessors.`);\n // Dissolve duplicate vertex attributes and indices.\n meshes.forEach(mesh => {\n mesh.listPrimitives().forEach(primitive => {\n primitive.listAttributes().forEach(accessor => {\n if (duplicates.has(accessor)) {\n primitive.swap(accessor, duplicates.get(accessor));\n }\n });\n const indices = primitive.getIndices();\n if (indices && duplicates.has(indices)) {\n primitive.swap(indices, duplicates.get(indices));\n }\n });\n });\n // Dissolve duplicate animation sampler inputs and outputs.\n for (const animation of document.getRoot().listAnimations()) {\n for (const sampler of animation.listSamplers()) {\n const input = sampler.getInput();\n const output = sampler.getOutput();\n if (input && duplicates.has(input)) {\n sampler.swap(input, duplicates.get(input));\n }\n if (output && duplicates.has(output)) {\n sampler.swap(output, duplicates.get(output));\n }\n }\n }\n Array.from(duplicates.keys()).forEach(accessor => accessor.dispose());\n}\nfunction dedupMeshes(document, options) {\n const logger = document.getLogger();\n const root = document.getRoot();\n // Create Reference -> ID lookup table.\n const refs = new Map();\n root.listAccessors().forEach((accessor, index) => refs.set(accessor, index));\n root.listMaterials().forEach((material, index) => refs.set(material, index));\n // For each mesh, create a hashkey.\n const numMeshes = root.listMeshes().length;\n const uniqueMeshes = new Map();\n for (const src of root.listMeshes()) {\n // For each mesh, create a hashkey.\n const srcKeyItems = [];\n for (const prim of src.listPrimitives()) {\n srcKeyItems.push(createPrimitiveKey(prim, refs));\n }\n // If another mesh exists with the same key, replace all instances with that, and dispose\n // of the duplicate. If not, just cache it.\n let meshKey = '';\n if (options.keepUniqueNames) meshKey += src.getName() + ';';\n meshKey += srcKeyItems.join(';');\n if (uniqueMeshes.has(meshKey)) {\n const targetMesh = uniqueMeshes.get(meshKey);\n src.listParents().forEach(parent => {\n if (parent.propertyType !== PropertyType.ROOT) {\n parent.swap(src, targetMesh);\n }\n });\n src.dispose();\n } else {\n uniqueMeshes.set(meshKey, src);\n }\n }\n logger.debug(`${NAME$p}: Merged ${numMeshes - uniqueMeshes.size} of ${numMeshes} meshes.`);\n}\nfunction dedupImages(document, options) {\n const logger = document.getLogger();\n const root = document.getRoot();\n const textures = root.listTextures();\n const duplicates = new Map();\n // Compare each texture to every other texture — O(n²) — and mark duplicates for replacement.\n for (let i = 0; i < textures.length; i++) {\n const a = textures[i];\n const aData = a.getImage();\n if (duplicates.has(a)) continue;\n for (let j = i + 1; j < textures.length; j++) {\n const b = textures[j];\n const bData = b.getImage();\n if (duplicates.has(b)) continue;\n // URIs are intentionally not compared.\n if (a.getMimeType() !== b.getMimeType()) continue;\n if (options.keepUniqueNames && a.getName() !== b.getName()) continue;\n const aSize = a.getSize();\n const bSize = b.getSize();\n if (!aSize || !bSize) continue;\n if (aSize[0] !== bSize[0]) continue;\n if (aSize[1] !== bSize[1]) continue;\n if (!aData || !bData) continue;\n if (BufferUtils.equals(aData, bData)) {\n duplicates.set(b, a);\n }\n }\n }\n logger.debug(`${NAME$p}: Merged ${duplicates.size} of ${root.listTextures().length} textures.`);\n Array.from(duplicates.entries()).forEach(([src, dst]) => {\n src.listParents().forEach(property => {\n if (!(property instanceof Root)) property.swap(src, dst);\n });\n src.dispose();\n });\n}\nfunction dedupMaterials(document, options) {\n const logger = document.getLogger();\n const root = document.getRoot();\n const materials = root.listMaterials();\n const duplicates = new Map();\n const modifierCache = new Map();\n const skip = new Set();\n if (!options.keepUniqueNames) {\n skip.add('name');\n }\n // Compare each material to every other material — O(n²) — and mark duplicates for replacement.\n for (let i = 0; i < materials.length; i++) {\n const a = materials[i];\n if (duplicates.has(a)) continue;\n if (hasModifier(a, modifierCache)) continue;\n for (let j = i + 1; j < materials.length; j++) {\n const b = materials[j];\n if (duplicates.has(b)) continue;\n if (hasModifier(b, modifierCache)) continue;\n if (a.equals(b, skip)) {\n duplicates.set(b, a);\n }\n }\n }\n logger.debug(`${NAME$p}: Merged ${duplicates.size} of ${materials.length} materials.`);\n Array.from(duplicates.entries()).forEach(([src, dst]) => {\n src.listParents().forEach(property => {\n if (!(property instanceof Root)) property.swap(src, dst);\n });\n src.dispose();\n });\n}\nfunction dedupSkins(document, options) {\n const logger = document.getLogger();\n const root = document.getRoot();\n const skins = root.listSkins();\n const duplicates = new Map();\n const skip = new Set(['joints']);\n if (!options.keepUniqueNames) {\n skip.add('name');\n }\n for (let i = 0; i < skins.length; i++) {\n const a = skins[i];\n if (duplicates.has(a)) continue;\n for (let j = i + 1; j < skins.length; j++) {\n const b = skins[j];\n if (duplicates.has(b)) continue;\n // Check joints with shallow equality, not deep equality.\n // See: https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/RecursiveSkeletons\n if (a.equals(b, skip) && shallowEqualsArray(a.listJoints(), b.listJoints())) {\n duplicates.set(b, a);\n }\n }\n }\n logger.debug(`${NAME$p}: Merged ${duplicates.size} of ${skins.length} skins.`);\n Array.from(duplicates.entries()).forEach(([src, dst]) => {\n src.listParents().forEach(property => {\n if (!(property instanceof Root)) property.swap(src, dst);\n });\n src.dispose();\n });\n}\n/** Generates a key unique to the content of a primitive or target. */\nfunction createPrimitiveKey(prim, refs) {\n const primKeyItems = [];\n for (const semantic of prim.listSemantics()) {\n const attribute = prim.getAttribute(semantic);\n primKeyItems.push(semantic + ':' + refs.get(attribute));\n }\n if (prim instanceof Primitive) {\n const indices = prim.getIndices();\n if (indices) {\n primKeyItems.push('indices:' + refs.get(indices));\n }\n const material = prim.getMaterial();\n if (material) {\n primKeyItems.push('material:' + refs.get(material));\n }\n primKeyItems.push('mode:' + prim.getMode());\n for (const target of prim.listTargets()) {\n primKeyItems.push('target:' + createPrimitiveKey(target, refs));\n }\n }\n return primKeyItems.join(',');\n}\n/**\n * Detects dependencies modified by a parent reference, to conservatively prevent merging. When\n * implementing extensions like KHR_animation_pointer, the 'modifyChild' attribute should be added\n * to graph edges connecting the animation channel to the animated target property.\n *\n * NOTICE: Implementation is conservative, and could prevent merging two materials sharing the\n * same animated \"Clearcoat\" ExtensionProperty. While that scenario is possible for an in-memory\n * glTF Transform graph, valid glTF input files do not have that risk.\n */\nfunction hasModifier(prop, cache) {\n if (cache.has(prop)) return cache.get(prop);\n const graph = prop.getGraph();\n const visitedNodes = new Set();\n const edgeQueue = graph.listParentEdges(prop);\n // Search dependency subtree for 'modifyChild' attribute.\n while (edgeQueue.length > 0) {\n const edge = edgeQueue.pop();\n if (edge.getAttributes().modifyChild === true) {\n cache.set(prop, true);\n return true;\n }\n const child = edge.getChild();\n if (visitedNodes.has(child)) continue;\n for (const childEdge of graph.listChildEdges(child)) {\n edgeQueue.push(childEdge);\n }\n }\n cache.set(prop, false);\n return false;\n}\n\n/**\n * 4 Dimensional Vector\n * @module vec4\n */\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\n\nfunction create() {\n var out = new ARRAY_TYPE(4);\n\n if (ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n }\n\n return out;\n}\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nfunction add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n return out;\n}\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nfunction subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n return out;\n}\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the first operand\n * @param {ReadonlyVec4} b the second operand\n * @returns {vec4} out\n */\n\nfunction multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n out[3] = a[3] * b[3];\n return out;\n}\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {ReadonlyVec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\n\nfunction scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n return out;\n}\n/**\n * Calculates the length of a vec4\n *\n * @param {ReadonlyVec4} a vector to calculate length of\n * @returns {Number} length of a\n */\n\nfunction length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var w = a[3];\n return Math.hypot(x, y, z, w);\n}\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\n\nvar sub = subtract;\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\n\nvar mul = multiply;\n/**\n * Alias for {@link vec4.length}\n * @function\n */\n\nvar len = length;\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\n\n(function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n\n if (!stride) {\n stride = 4;\n }\n\n if (!offset) {\n offset = 0;\n }\n\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n vec[3] = a[i + 3];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n a[i + 3] = vec[3];\n }\n\n return a;\n };\n})();\n\nconst SRGB_PATTERN = /color|emissive|diffuse/i;\n/**\n * Returns the color space (if any) implied by the {@link Material} slots to\n * which a texture is assigned, or null for non-color textures. If the texture\n * is not connected to any {@link Material}, this function will also return\n * null — any metadata in the image file will be ignored.\n *\n * Under current glTF specifications, only 'srgb' and non-color (null) textures\n * are used.\n *\n * Example:\n *\n * ```typescript\n * import { getTextureColorSpace } from '@gltf-transform/functions';\n *\n * const baseColorTexture = material.getBaseColorTexture();\n * const normalTexture = material.getNormalTexture();\n *\n * getTextureColorSpace(baseColorTexture); // → 'srgb'\n * getTextureColorSpace(normalTexture); // → null\n * ```\n */\nfunction getTextureColorSpace(texture) {\n const graph = texture.getGraph();\n const edges = graph.listParentEdges(texture);\n const isSRGB = edges.some(edge => {\n return edge.getAttributes().isColor || SRGB_PATTERN.test(edge.getName());\n });\n return isSRGB ? 'srgb' : null;\n}\n\n/**\n * Lists all {@link TextureInfo} definitions associated with a given\n * {@link Texture}. May be used to determine which UV transforms\n * and texCoord indices are applied to the material, without explicitly\n * checking the material properties and extensions.\n *\n * Example:\n *\n * ```typescript\n * // Find TextureInfo instances associated with the texture.\n * const results = listTextureInfo(texture);\n *\n * // Find which UV sets (TEXCOORD_0, TEXCOORD_1, ...) are required.\n * const texCoords = results.map((info) => info.getTexCoord());\n * // → [0, 1]\n * ```\n */\nfunction listTextureInfo(texture) {\n const graph = texture.getGraph();\n const results = new Set();\n for (const textureEdge of graph.listParentEdges(texture)) {\n const parent = textureEdge.getParent();\n const name = textureEdge.getName() + 'Info';\n for (const edge of graph.listChildEdges(parent)) {\n const child = edge.getChild();\n if (child instanceof TextureInfo && edge.getName() === name) {\n results.add(child);\n }\n }\n }\n return Array.from(results);\n}\n/**\n * Lists all {@link TextureInfo} definitions associated with any {@link Texture}\n * on the given {@link Material}. May be used to determine which UV transforms\n * and texCoord indices are applied to the material, without explicitly\n * checking the material properties and extensions.\n *\n * Example:\n *\n * ```typescript\n * const results = listTextureInfoByMaterial(material);\n *\n * const texCoords = results.map((info) => info.getTexCoord());\n * // → [0, 1]\n * ```\n */\nfunction listTextureInfoByMaterial(material) {\n const graph = material.getGraph();\n const visited = new Set();\n const results = new Set();\n function traverse(prop) {\n const textureInfoNames = new Set();\n for (const edge of graph.listChildEdges(prop)) {\n if (edge.getChild() instanceof Texture) {\n textureInfoNames.add(edge.getName() + 'Info');\n }\n }\n for (const edge of graph.listChildEdges(prop)) {\n const child = edge.getChild();\n if (visited.has(child)) continue;\n visited.add(child);\n if (child instanceof TextureInfo && textureInfoNames.has(edge.getName())) {\n results.add(child);\n } else if (child instanceof ExtensionProperty) {\n traverse(child);\n }\n }\n }\n traverse(material);\n return Array.from(results);\n}\n\n/**\n * Returns names of all texture slots using the given texture.\n *\n * Example:\n *\n * ```js\n * const slots = listTextureSlots(texture);\n * // → ['occlusionTexture', 'metallicRoughnessTexture']\n * ```\n */\nfunction listTextureSlots(texture) {\n const document = Document.fromGraph(texture.getGraph());\n const root = document.getRoot();\n const slots = texture.getGraph().listParentEdges(texture).filter(edge => edge.getParent() !== root).map(edge => edge.getName());\n return Array.from(new Set(slots));\n}\n\nconst NAME$o = 'prune';\nconst EPS = 3 / 255;\nconst PRUNE_DEFAULTS = {\n propertyTypes: [PropertyType.NODE, PropertyType.SKIN, PropertyType.MESH, PropertyType.CAMERA, PropertyType.PRIMITIVE, PropertyType.PRIMITIVE_TARGET, PropertyType.ANIMATION, PropertyType.MATERIAL, PropertyType.TEXTURE, PropertyType.ACCESSOR, PropertyType.BUFFER],\n keepLeaves: false,\n keepAttributes: false,\n keepIndices: false,\n keepSolidTextures: false,\n keepExtras: false\n};\n/**\n * Removes properties from the file if they are not referenced by a {@link Scene}. Commonly helpful\n * for cleaning up after other operations, e.g. allowing a node to be detached and any unused\n * meshes, materials, or other resources to be removed automatically.\n *\n * Example:\n *\n * ```javascript\n * import { PropertyType } from '@gltf-transform/core';\n * import { prune } from '@gltf-transform/functions';\n *\n * document.getRoot().listMaterials(); // → [Material, Material]\n *\n * await document.transform(\n * \tprune({\n * \t\tpropertyTypes: [PropertyType.MATERIAL],\n * \t\tkeepExtras: true\n * \t})\n * );\n *\n * document.getRoot().listMaterials(); // → [Material]\n * ```\n *\n * By default, pruning will aggressively remove most unused resources. Use\n * {@link PruneOptions} to limit what is considered for pruning.\n *\n * @category Transforms\n */\nfunction prune(_options = PRUNE_DEFAULTS) {\n const options = assignDefaults(PRUNE_DEFAULTS, _options);\n const propertyTypes = new Set(options.propertyTypes);\n const keepExtras = options.keepExtras;\n return createTransform(NAME$o, async document => {\n const logger = document.getLogger();\n const root = document.getRoot();\n const graph = document.getGraph();\n const counter = new DisposeCounter();\n const onDispose = event => counter.dispose(event.target);\n // TODO(cleanup): Publish GraphEvent / GraphEventListener types from 'property-graph'.\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n graph.addEventListener('node:dispose', onDispose);\n // Prune top-down, so that low-level properties like accessors can be removed if the\n // properties referencing them are removed.\n // Prune empty Meshes.\n if (propertyTypes.has(PropertyType.MESH)) {\n for (const mesh of root.listMeshes()) {\n if (mesh.listPrimitives().length > 0) continue;\n mesh.dispose();\n }\n }\n if (propertyTypes.has(PropertyType.NODE)) {\n if (!options.keepLeaves) {\n for (const scene of root.listScenes()) {\n nodeTreeShake(graph, scene, keepExtras);\n }\n }\n for (const node of root.listNodes()) {\n treeShake(node, keepExtras);\n }\n }\n if (propertyTypes.has(PropertyType.SKIN)) {\n for (const skin of root.listSkins()) {\n treeShake(skin, keepExtras);\n }\n }\n if (propertyTypes.has(PropertyType.MESH)) {\n for (const mesh of root.listMeshes()) {\n treeShake(mesh, keepExtras);\n }\n }\n if (propertyTypes.has(PropertyType.CAMERA)) {\n for (const camera of root.listCameras()) {\n treeShake(camera, keepExtras);\n }\n }\n if (propertyTypes.has(PropertyType.PRIMITIVE)) {\n indirectTreeShake(graph, PropertyType.PRIMITIVE, keepExtras);\n }\n if (propertyTypes.has(PropertyType.PRIMITIVE_TARGET)) {\n indirectTreeShake(graph, PropertyType.PRIMITIVE_TARGET, keepExtras);\n }\n // Prune unused vertex attributes.\n if (!options.keepAttributes && propertyTypes.has(PropertyType.ACCESSOR)) {\n const materialPrims = new Map();\n for (const mesh of root.listMeshes()) {\n for (const prim of mesh.listPrimitives()) {\n const material = prim.getMaterial();\n if (!material) continue;\n const required = listRequiredSemantics(document, prim, material);\n const unused = listUnusedSemantics(prim, required);\n pruneAttributes(prim, unused);\n prim.listTargets().forEach(target => pruneAttributes(target, unused));\n materialPrims.has(material) ? materialPrims.get(material).add(prim) : materialPrims.set(material, new Set([prim]));\n }\n }\n for (const [material, prims] of materialPrims) {\n shiftTexCoords(material, Array.from(prims));\n }\n }\n // Prune unused mesh indices.\n if (!options.keepIndices && propertyTypes.has(PropertyType.ACCESSOR)) {\n for (const mesh of root.listMeshes()) {\n for (const prim of mesh.listPrimitives()) {\n pruneIndices(prim);\n }\n }\n }\n // Pruning animations is a bit more complicated:\n // (1) Remove channels without target nodes.\n // (2) Remove animations without channels.\n // (3) Remove samplers orphaned in the process.\n if (propertyTypes.has(PropertyType.ANIMATION)) {\n for (const anim of root.listAnimations()) {\n for (const channel of anim.listChannels()) {\n if (!channel.getTargetNode()) {\n channel.dispose();\n }\n }\n if (!anim.listChannels().length) {\n const samplers = anim.listSamplers();\n treeShake(anim, keepExtras);\n samplers.forEach(sampler => treeShake(sampler, keepExtras));\n } else {\n anim.listSamplers().forEach(sampler => treeShake(sampler, keepExtras));\n }\n }\n }\n if (propertyTypes.has(PropertyType.MATERIAL)) {\n root.listMaterials().forEach(material => treeShake(material, keepExtras));\n }\n if (propertyTypes.has(PropertyType.TEXTURE)) {\n root.listTextures().forEach(texture => treeShake(texture, keepExtras));\n if (!options.keepSolidTextures) {\n await pruneSolidTextures(document);\n }\n }\n if (propertyTypes.has(PropertyType.ACCESSOR)) {\n root.listAccessors().forEach(accessor => treeShake(accessor, keepExtras));\n }\n if (propertyTypes.has(PropertyType.BUFFER)) {\n root.listBuffers().forEach(buffer => treeShake(buffer, keepExtras));\n }\n // TODO(bug): This process does not identify unused ExtensionProperty instances. That could\n // be a future enhancement, either tracking unlinked properties as if they were connected\n // to the Graph, or iterating over a property list provided by the Extension. Properties in\n // use by an Extension are correctly preserved, in the meantime.\n // TODO(cleanup): Publish GraphEvent / GraphEventListener types from 'property-graph'.\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n graph.removeEventListener('node:dispose', onDispose);\n if (!counter.empty()) {\n const str = counter.entries().map(([type, count]) => `${type} (${count})`).join(', ');\n logger.info(`${NAME$o}: Removed types... ${str}`);\n } else {\n logger.debug(`${NAME$o}: No unused properties found.`);\n }\n logger.debug(`${NAME$o}: Complete.`);\n });\n}\n/**********************************************************************************************\n * Utility for disposing properties and reporting statistics afterward.\n */\nclass DisposeCounter {\n constructor() {\n this.disposed = {};\n }\n empty() {\n for (const key in this.disposed) return false;\n return true;\n }\n entries() {\n return Object.entries(this.disposed);\n }\n /** Records properties disposed by type. */\n dispose(prop) {\n this.disposed[prop.propertyType] = this.disposed[prop.propertyType] || 0;\n this.disposed[prop.propertyType]++;\n }\n}\n/**********************************************************************************************\n * Helper functions for the {@link prune} transform.\n *\n * IMPORTANT: These functions were previously declared in function scope, but\n * broke in the CommonJS build due to a buggy Babel transform. See:\n * https://github.com/donmccurdy/glTF-Transform/issues/1140\n */\n/** Disposes of the given property if it is unused. */\nfunction treeShake(prop, keepExtras) {\n // Consider a property unused if it has no references from another property, excluding\n // types Root and AnimationChannel.\n const parents = prop.listParents().filter(p => !(p instanceof Root || p instanceof AnimationChannel));\n const needsExtras = keepExtras && !isEmptyObject(prop.getExtras());\n if (!parents.length && !needsExtras) {\n prop.dispose();\n }\n}\n/**\n * For property types the Root does not maintain references to, we'll need to search the\n * graph. It's possible that objects may have been constructed without any outbound links,\n * but since they're not on the graph they don't need to be tree-shaken.\n */\nfunction indirectTreeShake(graph, propertyType, keepExtras) {\n for (const edge of graph.listEdges()) {\n const parent = edge.getParent();\n if (parent.propertyType === propertyType) {\n treeShake(parent, keepExtras);\n }\n }\n}\n/** Iteratively prunes leaf Nodes without contents. */\nfunction nodeTreeShake(graph, prop, keepExtras) {\n prop.listChildren().forEach(child => nodeTreeShake(graph, child, keepExtras));\n if (prop instanceof Scene) return;\n const isUsed = graph.listParentEdges(prop).some(e => {\n const ptype = e.getParent().propertyType;\n return ptype !== PropertyType.ROOT && ptype !== PropertyType.SCENE && ptype !== PropertyType.NODE;\n });\n const isEmpty = graph.listChildren(prop).length === 0;\n const needsExtras = keepExtras && !isEmptyObject(prop.getExtras());\n if (isEmpty && !isUsed && !needsExtras) {\n prop.dispose();\n }\n}\nfunction pruneAttributes(prim, unused) {\n for (const semantic of unused) {\n prim.setAttribute(semantic, null);\n }\n}\nfunction pruneIndices(prim) {\n const indices = prim.getIndices();\n const indicesArray = indices && indices.getArray();\n const attribute = prim.listAttributes()[0];\n if (!indicesArray || !attribute) {\n return;\n }\n if (indices.getCount() !== attribute.getCount()) {\n return;\n }\n for (let i = 0, il = indicesArray.length; i < il; i++) {\n if (i !== indicesArray[i]) {\n return;\n }\n }\n prim.setIndices(null);\n}\n/**\n * Lists vertex attribute semantics that are unused when rendering a given primitive.\n */\nfunction listUnusedSemantics(prim, required) {\n const unused = [];\n for (const semantic of prim.listSemantics()) {\n if (semantic === 'NORMAL' && !required.has(semantic)) {\n unused.push(semantic);\n } else if (semantic === 'TANGENT' && !required.has(semantic)) {\n unused.push(semantic);\n } else if (semantic.startsWith('TEXCOORD_') && !required.has(semantic)) {\n unused.push(semantic);\n } else if (semantic.startsWith('COLOR_') && semantic !== 'COLOR_0') {\n unused.push(semantic);\n }\n }\n return unused;\n}\n/**\n * Lists vertex attribute semantics required by a material. Does not include\n * attributes that would be used unconditionally, like POSITION or NORMAL.\n */\nfunction listRequiredSemantics(document, prim, material, semantics = new Set()) {\n const graph = document.getGraph();\n const edges = graph.listChildEdges(material);\n const textureNames = new Set();\n for (const edge of edges) {\n if (edge.getChild() instanceof Texture) {\n textureNames.add(edge.getName());\n }\n }\n for (const edge of edges) {\n const name = edge.getName();\n const child = edge.getChild();\n if (child instanceof TextureInfo) {\n if (textureNames.has(name.replace(/Info$/, ''))) {\n semantics.add(`TEXCOORD_${child.getTexCoord()}`);\n }\n }\n if (child instanceof Texture && name.match(/normalTexture/i)) {\n semantics.add('TANGENT');\n }\n if (child instanceof ExtensionProperty) {\n listRequiredSemantics(document, prim, child, semantics);\n }\n // TODO(#748): Does KHR_materials_anisotropy imply required vertex attributes?\n }\n const isLit = material instanceof Material && !material.getExtension('KHR_materials_unlit');\n const isPoints = prim.getMode() === Primitive.Mode.POINTS;\n if (isLit && !isPoints) {\n semantics.add('NORMAL');\n }\n return semantics;\n}\n/**\n * Shifts texCoord indices on the given material and primitives assigned to\n * that material, such that indices start at zero and ascend without gaps.\n * Prior to calling this function, the implementation must ensure that:\n * - All TEXCOORD_n attributes on these prims are used by the material.\n * - Material does not require any unavailable TEXCOORD_n attributes.\n *\n * TEXCOORD_n attributes on morph targets are shifted alongside the parent\n * prim, but gaps may remain in their semantic lists.\n */\nfunction shiftTexCoords(material, prims) {\n // Create map from srcTexCoord → dstTexCoord.\n const textureInfoList = listTextureInfoByMaterial(material);\n const texCoordSet = new Set(textureInfoList.map(info => info.getTexCoord()));\n const texCoordList = Array.from(texCoordSet).sort();\n const texCoordMap = new Map(texCoordList.map((texCoord, index) => [texCoord, index]));\n const semanticMap = new Map(texCoordList.map((texCoord, index) => [`TEXCOORD_${texCoord}`, `TEXCOORD_${index}`]));\n // Update material.\n for (const textureInfo of textureInfoList) {\n const texCoord = textureInfo.getTexCoord();\n textureInfo.setTexCoord(texCoordMap.get(texCoord));\n }\n // Update prims.\n for (const prim of prims) {\n const semantics = prim.listSemantics().filter(semantic => semantic.startsWith('TEXCOORD_')).sort();\n updatePrim(prim, semantics);\n prim.listTargets().forEach(target => updatePrim(target, semantics));\n }\n function updatePrim(prim, srcSemantics) {\n for (const srcSemantic of srcSemantics) {\n const uv = prim.getAttribute(srcSemantic);\n if (!uv) continue;\n const dstSemantic = semanticMap.get(srcSemantic);\n if (dstSemantic === srcSemantic) continue;\n prim.setAttribute(dstSemantic, uv);\n prim.setAttribute(srcSemantic, null);\n }\n }\n}\n/**********************************************************************************************\n * Prune solid (single-color) textures.\n */\nasync function pruneSolidTextures(document) {\n const root = document.getRoot();\n const graph = document.getGraph();\n const logger = document.getLogger();\n const textures = root.listTextures();\n const pending = textures.map(async texture => {\n var _texture$getSize;\n const factor = await getTextureFactor(texture);\n if (!factor) return;\n if (getTextureColorSpace(texture) === 'srgb') {\n ColorUtils.convertSRGBToLinear(factor, factor);\n }\n const name = texture.getName() || texture.getURI();\n const size = (_texture$getSize = texture.getSize()) == null ? void 0 : _texture$getSize.join('x');\n const slots = listTextureSlots(texture);\n for (const edge of graph.listParentEdges(texture)) {\n const parent = edge.getParent();\n if (parent !== root && applyMaterialFactor(parent, factor, edge.getName(), logger)) {\n edge.dispose();\n }\n }\n if (texture.listParents().length === 1) {\n texture.dispose();\n logger.debug(`${NAME$o}: Removed solid-color texture \"${name}\" (${size}px ${slots.join(', ')})`);\n }\n });\n await Promise.all(pending);\n}\nfunction applyMaterialFactor(material, factor, slot, logger) {\n if (material instanceof Material) {\n switch (slot) {\n case 'baseColorTexture':\n material.setBaseColorFactor(mul(factor, factor, material.getBaseColorFactor()));\n return true;\n case 'emissiveTexture':\n material.setEmissiveFactor(mul$1([0, 0, 0], factor.slice(0, 3), material.getEmissiveFactor()));\n return true;\n case 'occlusionTexture':\n return Math.abs(factor[0] - 1) <= EPS;\n case 'metallicRoughnessTexture':\n material.setRoughnessFactor(factor[1] * material.getRoughnessFactor());\n material.setMetallicFactor(factor[2] * material.getMetallicFactor());\n return true;\n case 'normalTexture':\n return len(sub(create(), factor, [0.5, 0.5, 1, 1])) <= EPS;\n }\n }\n logger.warn(`${NAME$o}: Detected single-color ${slot} texture. Pruning ${slot} not yet supported.`);\n return false;\n}\nasync function getTextureFactor(texture) {\n const pixels = await maybeGetPixels(texture);\n if (!pixels) return null;\n const min = [Infinity, Infinity, Infinity, Infinity];\n const max = [-Infinity, -Infinity, -Infinity, -Infinity];\n const target = [0, 0, 0, 0];\n const [width, height] = pixels.shape;\n for (let i = 0; i < width; i++) {\n for (let j = 0; j < height; j++) {\n for (let k = 0; k < 4; k++) {\n min[k] = Math.min(min[k], pixels.get(i, j, k));\n max[k] = Math.max(max[k], pixels.get(i, j, k));\n }\n }\n if (len(sub(target, max, min)) / 255 > EPS) {\n return null;\n }\n }\n return scale(target, add(target, max, min), 0.5 / 255);\n}\nasync function maybeGetPixels(texture) {\n try {\n return await getPixels(texture.getImage(), texture.getMimeType());\n } catch (_unused) {\n return null;\n }\n}\n\n/** Flags 'empty' values in a Uint32Array index. */\nconst EMPTY_U32$1 = 2 ** 32 - 1;\nclass VertexStream {\n constructor(prim) {\n this.attributes = [];\n /** Temporary vertex views in 4-byte-aligned memory. */\n this.u8 = void 0;\n this.u32 = void 0;\n let byteStride = 0;\n for (const attribute of deepListAttributes(prim)) {\n byteStride += this._initAttribute(attribute);\n }\n this.u8 = new Uint8Array(byteStride);\n this.u32 = new Uint32Array(this.u8.buffer);\n }\n _initAttribute(attribute) {\n const array = attribute.getArray();\n const u8 = new Uint8Array(array.buffer, array.byteOffset, array.byteLength);\n const byteStride = attribute.getElementSize() * attribute.getComponentSize();\n const paddedByteStride = BufferUtils.padNumber(byteStride);\n this.attributes.push({\n u8,\n byteStride,\n paddedByteStride\n });\n return paddedByteStride;\n }\n hash(index) {\n // Load vertex into 4-byte-aligned view.\n let byteOffset = 0;\n for (const {\n u8,\n byteStride,\n paddedByteStride\n } of this.attributes) {\n for (let i = 0; i < paddedByteStride; i++) {\n if (i < byteStride) {\n this.u8[byteOffset + i] = u8[index * byteStride + i];\n } else {\n this.u8[byteOffset + i] = 0;\n }\n }\n byteOffset += paddedByteStride;\n }\n // Compute hash.\n return murmurHash2(0, this.u32);\n }\n equal(a, b) {\n for (const {\n u8,\n byteStride\n } of this.attributes) {\n for (let j = 0; j < byteStride; j++) {\n if (u8[a * byteStride + j] !== u8[b * byteStride + j]) {\n return false;\n }\n }\n }\n return true;\n }\n}\n/**\n * References:\n * - https://github.com/mikolalysenko/murmurhash-js/blob/f19136e9f9c17f8cddc216ca3d44ec7c5c502f60/murmurhash2_gc.js#L14\n * - https://github.com/zeux/meshoptimizer/blob/e47e1be6d3d9513153188216455bdbed40a206ef/src/indexgenerator.cpp#L12\n */\nfunction murmurHash2(h, key) {\n // MurmurHash2\n const m = 0x5bd1e995;\n const r = 24;\n for (let i = 0, il = key.length; i < il; i++) {\n let k = key[i];\n k = Math.imul(k, m) >>> 0;\n k = (k ^ k >> r) >>> 0;\n k = Math.imul(k, m) >>> 0;\n h = Math.imul(h, m) >>> 0;\n h = (h ^ k) >>> 0;\n }\n return h;\n}\nfunction hashLookup(table, buckets, stream, key, empty = EMPTY_U32$1) {\n const hashmod = buckets - 1;\n const hashval = stream.hash(key);\n let bucket = hashval & hashmod;\n for (let probe = 0; probe <= hashmod; probe++) {\n const item = table[bucket];\n if (item === empty || stream.equal(item, key)) {\n return bucket;\n }\n bucket = bucket + probe + 1 & hashmod; // Hash collision.\n }\n throw new Error('Hash table full.');\n}\n\n/**\n * Various methods of estimating a vertex count. For some background on why\n * multiple definitions of a vertex count should exist, see [_Vertex Count\n * Higher in Engine than in 3D Software_](https://shahriyarshahrabi.medium.com/vertex-count-higher-in-engine-than-in-3d-software-badc348ada66).\n * Totals for a {@link Scene}, {@link Node}, or {@link Mesh} will not\n * necessarily match the sum of the totals for each {@link Primitive}. Choose\n * the appropriate method for a relevant total or estimate:\n *\n * - {@link getSceneVertexCount}\n * - {@link getNodeVertexCount}\n * - {@link getMeshVertexCount}\n * - {@link getPrimitiveVertexCount}\n *\n * Many rendering features, such as volumetric transmission, may lead\n * to additional passes over some or all vertices. These tradeoffs are\n * implementation-dependent, and not considered here.\n */\nvar VertexCountMethod;\n(function (VertexCountMethod) {\n /**\n * Expected number of vertices processed by the vertex shader for one render\n * pass, without considering the vertex cache.\n */\n VertexCountMethod[\"RENDER\"] = \"render\";\n /**\n * Expected number of vertices processed by the vertex shader for one render\n * pass, assuming an Average Transform to Vertex Ratio (ATVR) of 1. Approaching\n * this result requires optimizing for locality of vertex references (see\n * {@link reorder}).\n *\n * References:\n * - [ACMR and ATVR](https://www.realtimerendering.com/blog/acmr-and-atvr/), Real-Time Rendering\n */\n VertexCountMethod[\"RENDER_CACHED\"] = \"render-cached\";\n /**\n * Expected number of vertices uploaded to the GPU, assuming that a client\n * uploads each unique {@link Accessor} only once. Unless glTF vertex\n * attributes are pre-processed to a known buffer layout, and the client is\n * optimized for that buffer layout, this total will be optimistic.\n */\n VertexCountMethod[\"UPLOAD\"] = \"upload\";\n /**\n * Expected number of vertices uploaded to the GPU, assuming that a client\n * uploads each unique {@link Primitive} individually, duplicating vertex\n * attribute {@link Accessor Accessors} shared by multiple primitives, but\n * never uploading the same Mesh or Primitive to GPU memory more than once.\n */\n VertexCountMethod[\"UPLOAD_NAIVE\"] = \"upload-naive\";\n /**\n * Total number of unique vertices represented, considering all attributes of\n * each vertex, and removing any duplicates. Has no direct relationship to\n * runtime characteristics, but may be helpful in identifying asset\n * optimization opportunities.\n *\n * @hidden TODO(feat): Not yet implemented.\n * @internal\n */\n VertexCountMethod[\"DISTINCT\"] = \"distinct\";\n /**\n * Total number of unique vertices represented, considering only vertex\n * positions, and removing any duplicates. Has no direct relationship to\n * runtime characteristics, but may be helpful in identifying asset\n * optimization opportunities.\n *\n * @hidden TODO(feat): Not yet implemented.\n * @internal\n */\n VertexCountMethod[\"DISTINCT_POSITION\"] = \"distinct-position\";\n /**\n * Number of vertex positions never used by any {@link Primitive}. If all\n * vertices are unused, this total will match `UPLOAD`.\n */\n VertexCountMethod[\"UNUSED\"] = \"unused\";\n})(VertexCountMethod || (VertexCountMethod = {}));\n/**\n * Computes total number of vertices in a {@link Scene}, by the\n * specified method. Totals for the Scene will not necessarily match the sum\n * of the totals for each {@link Mesh} or {@link Primitive} within it. See\n * {@link VertexCountMethod} for available methods.\n */\nfunction getSceneVertexCount(scene, method) {\n return _getSubtreeVertexCount(scene, method);\n}\n/**\n * Computes total number of vertices in a {@link Node}, by the\n * specified method. Totals for the node will not necessarily match the sum\n * of the totals for each {@link Mesh} or {@link Primitive} within it. See\n * {@link VertexCountMethod} for available methods.\n */\nfunction getNodeVertexCount(node, method) {\n return _getSubtreeVertexCount(node, method);\n}\nfunction _getSubtreeVertexCount(node, method) {\n const instancedMeshes = [];\n const nonInstancedMeshes = [];\n const meshes = [];\n node.traverse(node => {\n const mesh = node.getMesh();\n const batch = node.getExtension('EXT_mesh_gpu_instancing');\n if (batch && mesh) {\n meshes.push(mesh);\n instancedMeshes.push([batch.listAttributes()[0].getCount(), mesh]);\n } else if (mesh) {\n meshes.push(mesh);\n nonInstancedMeshes.push(mesh);\n }\n });\n const prims = meshes.flatMap(mesh => mesh.listPrimitives());\n const positions = prims.map(prim => prim.getAttribute('POSITION'));\n const uniquePositions = Array.from(new Set(positions));\n const uniqueMeshes = Array.from(new Set(meshes));\n const uniquePrims = Array.from(new Set(uniqueMeshes.flatMap(mesh => mesh.listPrimitives())));\n switch (method) {\n case VertexCountMethod.RENDER:\n case VertexCountMethod.RENDER_CACHED:\n return _sum(nonInstancedMeshes.map(mesh => getMeshVertexCount(mesh, method))) + _sum(instancedMeshes.map(([batch, mesh]) => batch * getMeshVertexCount(mesh, method)));\n case VertexCountMethod.UPLOAD_NAIVE:\n return _sum(uniqueMeshes.map(mesh => getMeshVertexCount(mesh, method)));\n case VertexCountMethod.UPLOAD:\n return _sum(uniquePositions.map(attribute => attribute.getCount()));\n case VertexCountMethod.DISTINCT:\n case VertexCountMethod.DISTINCT_POSITION:\n return _assertNotImplemented(method);\n case VertexCountMethod.UNUSED:\n return _sumUnused(uniquePrims);\n default:\n return _assertUnreachable(method);\n }\n}\n/**\n * Computes total number of vertices in a {@link Mesh}, by the\n * specified method. Totals for the Mesh will not necessarily match the sum\n * of the totals for each {@link Primitive} within it. See\n * {@link VertexCountMethod} for available methods.\n */\nfunction getMeshVertexCount(mesh, method) {\n const prims = mesh.listPrimitives();\n const uniquePrims = Array.from(new Set(prims));\n const uniquePositions = Array.from(new Set(uniquePrims.map(prim => prim.getAttribute('POSITION'))));\n switch (method) {\n case VertexCountMethod.RENDER:\n case VertexCountMethod.RENDER_CACHED:\n case VertexCountMethod.UPLOAD_NAIVE:\n return _sum(prims.map(prim => getPrimitiveVertexCount(prim, method)));\n case VertexCountMethod.UPLOAD:\n return _sum(uniquePositions.map(attribute => attribute.getCount()));\n case VertexCountMethod.DISTINCT:\n case VertexCountMethod.DISTINCT_POSITION:\n return _assertNotImplemented(method);\n case VertexCountMethod.UNUSED:\n return _sumUnused(uniquePrims);\n default:\n return _assertUnreachable(method);\n }\n}\n/**\n * Computes total number of vertices in a {@link Primitive}, by the\n * specified method. See {@link VertexCountMethod} for available methods.\n */\nfunction getPrimitiveVertexCount(prim, method) {\n const position = prim.getAttribute('POSITION');\n const indices = prim.getIndices();\n switch (method) {\n case VertexCountMethod.RENDER:\n return indices ? indices.getCount() : position.getCount();\n case VertexCountMethod.RENDER_CACHED:\n return indices ? new Set(indices.getArray()).size : position.getCount();\n case VertexCountMethod.UPLOAD_NAIVE:\n case VertexCountMethod.UPLOAD:\n return position.getCount();\n case VertexCountMethod.DISTINCT:\n case VertexCountMethod.DISTINCT_POSITION:\n return _assertNotImplemented(method);\n case VertexCountMethod.UNUSED:\n return indices ? position.getCount() - new Set(indices.getArray()).size : 0;\n default:\n return _assertUnreachable(method);\n }\n}\nfunction _sum(values) {\n let total = 0;\n for (let i = 0; i < values.length; i++) {\n total += values[i];\n }\n return total;\n}\nfunction _sumUnused(prims) {\n const attributeIndexMap = new Map();\n for (const prim of prims) {\n const position = prim.getAttribute('POSITION');\n const indices = prim.getIndices();\n const indicesSet = attributeIndexMap.get(position) || new Set();\n indicesSet.add(indices);\n attributeIndexMap.set(position, indicesSet);\n }\n let unused = 0;\n for (const [position, indicesSet] of attributeIndexMap) {\n if (indicesSet.has(null)) continue;\n const usedIndices = new Uint8Array(position.getCount());\n for (const indices of indicesSet) {\n const indicesArray = indices.getArray();\n for (let i = 0, il = indicesArray.length; i < il; i++) {\n usedIndices[indicesArray[i]] = 1;\n }\n }\n for (let i = 0, il = position.getCount(); i < il; i++) {\n if (usedIndices[i] === 0) unused++;\n }\n }\n return unused;\n}\nfunction _assertNotImplemented(x) {\n throw new Error(`Not implemented: ${x}`);\n}\nfunction _assertUnreachable(x) {\n throw new Error(`Unexpected value: ${x}`);\n}\n\n/**\n * Rewrites a {@link Primitive} such that all unused vertices in its vertex\n * attributes are removed. When multiple Primitives share vertex attributes,\n * each indexing only a few, compaction can be used to produce Primitives\n * each having smaller, independent vertex streams instead.\n *\n * Regardless of whether the Primitive is indexed or contains unused vertices,\n * compaction will clone every {@link Accessor}. The resulting Primitive will\n * share no Accessors with other Primitives, allowing later changes to\n * the vertex stream to be applied in isolation.\n *\n * Example:\n *\n * ```javascript\n * import { compactPrimitive, transformMesh } from '@gltf-transform/functions';\n * import { fromTranslation } from 'gl-matrix/mat4';\n *\n * const mesh = document.getRoot().listMeshes().find((mesh) => mesh.getName() === 'MyMesh');\n * const prim = mesh.listPrimitives().find((prim) => { ... });\n *\n * // Compact primitive, removing unused vertices and detaching shared vertex\n * // attributes. Without compaction, `transformPrimitive` might affect other\n * // primitives sharing the same vertex attributes.\n * compactPrimitive(prim);\n *\n * // Transform primitive vertices, y += 10.\n * transformPrimitive(prim, fromTranslation([], [0, 10, 0]));\n * ```\n *\n * Parameters 'remap' and 'dstVertexCount' are optional. When either is\n * provided, the other must be provided as well. If one or both are missing,\n * both will be computed from the mesh indices.\n *\n * @param remap - Mapping. Array index represents vertex index in the source\n *\t\tattributes, array value represents index in the resulting compacted\n *\t\tprimitive. When omitted, calculated from indices.\n * @param dstVertexcount - Number of unique vertices in compacted primitive.\n *\t\tWhen omitted, calculated from indices.\n */\n// TODO(cleanup): Additional signatures currently break greendoc/parse.\n// export function compactPrimitive(prim: Primitive): Primitive;\n// export function compactPrimitive(prim: Primitive, remap: TypedArray, dstVertexCount: number): Primitive;\nfunction compactPrimitive(prim, remap, dstVertexCount) {\n const document = Document.fromGraph(prim.getGraph());\n if (!remap || !dstVertexCount) {\n [remap, dstVertexCount] = createCompactPlan(prim);\n }\n // Remap indices.\n const srcIndices = prim.getIndices();\n const srcIndicesArray = srcIndices ? srcIndices.getArray() : null;\n const srcIndicesCount = getPrimitiveVertexCount(prim, VertexCountMethod.RENDER);\n const dstIndices = document.createAccessor();\n const dstIndicesCount = srcIndicesCount; // primitive count does not change.\n const dstIndicesArray = createIndicesEmpty(dstIndicesCount, dstVertexCount);\n for (let i = 0; i < dstIndicesCount; i++) {\n dstIndicesArray[i] = remap[srcIndicesArray ? srcIndicesArray[i] : i];\n }\n prim.setIndices(dstIndices.setArray(dstIndicesArray));\n // Remap vertices.\n const srcAttributesPrev = deepListAttributes(prim);\n for (const srcAttribute of prim.listAttributes()) {\n const dstAttribute = shallowCloneAccessor(document, srcAttribute);\n compactAttribute(srcAttribute, srcIndices, remap, dstAttribute, dstVertexCount);\n prim.swap(srcAttribute, dstAttribute);\n }\n for (const target of prim.listTargets()) {\n for (const srcAttribute of target.listAttributes()) {\n const dstAttribute = shallowCloneAccessor(document, srcAttribute);\n compactAttribute(srcAttribute, srcIndices, remap, dstAttribute, dstVertexCount);\n target.swap(srcAttribute, dstAttribute);\n }\n }\n // Clean up accessors.\n if (srcIndices && srcIndices.listParents().length === 1) {\n srcIndices.dispose();\n }\n for (const srcAttribute of srcAttributesPrev) {\n if (srcAttribute.listParents().length === 1) {\n srcAttribute.dispose();\n }\n }\n return prim;\n}\n/**\n * Copies srcAttribute to dstAttribute, using the given indices and remap (srcIndex -> dstIndex).\n * Any existing array in dstAttribute is replaced. Vertices not used by the index are eliminated,\n * leaving a compact attribute.\n * @hidden\n * @internal\n */\nfunction compactAttribute(srcAttribute, srcIndices, remap, dstAttribute, dstVertexCount) {\n const elementSize = srcAttribute.getElementSize();\n const srcArray = srcAttribute.getArray();\n const srcIndicesArray = srcIndices ? srcIndices.getArray() : null;\n const srcIndicesCount = srcIndices ? srcIndices.getCount() : srcAttribute.getCount();\n const dstArray = new srcArray.constructor(dstVertexCount * elementSize);\n const dstDone = new Uint8Array(dstVertexCount);\n for (let i = 0; i < srcIndicesCount; i++) {\n const srcIndex = srcIndicesArray ? srcIndicesArray[i] : i;\n const dstIndex = remap[srcIndex];\n if (dstDone[dstIndex]) continue;\n for (let j = 0; j < elementSize; j++) {\n dstArray[dstIndex * elementSize + j] = srcArray[srcIndex * elementSize + j];\n }\n dstDone[dstIndex] = 1;\n }\n return dstAttribute.setArray(dstArray);\n}\n/**\n * Creates a 'remap' and 'dstVertexCount' plan for indexed primitives,\n * such that they can be rewritten with {@link compactPrimitive} removing\n * any non-rendered vertices.\n * @hidden\n * @internal\n */\nfunction createCompactPlan(prim) {\n const srcVertexCount = getPrimitiveVertexCount(prim, VertexCountMethod.UPLOAD);\n const indices = prim.getIndices();\n const indicesArray = indices ? indices.getArray() : null;\n if (!indices || !indicesArray) {\n return [createIndices(srcVertexCount, 1000000), srcVertexCount];\n }\n const remap = new Uint32Array(srcVertexCount).fill(EMPTY_U32$1);\n let dstVertexCount = 0;\n for (let i = 0; i < indicesArray.length; i++) {\n const srcIndex = indicesArray[i];\n if (remap[srcIndex] === EMPTY_U32$1) {\n remap[srcIndex] = dstVertexCount++;\n }\n }\n return [remap, dstVertexCount];\n}\n\n/**\n * CONTRIBUTOR NOTES\n *\n * Ideally a weld() implementation should be fast, robust, and tunable. The\n * writeup below tracks my attempts to solve for these constraints.\n *\n * (Approach #1) Follow the mergeVertices() implementation of three.js,\n * hashing vertices with a string concatenation of all vertex attributes.\n * The approach does not allow per-attribute tolerance in local units.\n *\n * (Approach #2) Sort points along the X axis, then make cheaper\n * searches up/down the sorted list for merge candidates. While this allows\n * simpler comparison based on specified tolerance, it's much slower, even\n * for cases where choice of the X vs. Y or Z axes is reasonable.\n *\n * (Approach #3) Attempted a Delaunay triangulation in three dimensions,\n * expecting it would be an n * log(n) algorithm, but the only implementation\n * I found (with delaunay-triangulate) appeared to be much slower than that,\n * and was notably slower than the sort-based approach, just building the\n * Delaunay triangulation alone.\n *\n * (Approach #4) Hybrid of (1) and (2), assigning vertices to a spatial\n * grid, then searching the local neighborhood (27 cells) for weld candidates.\n *\n * (Approach #5) Based on Meshoptimizer's implementation, when tolerance=0\n * use a hashtable to find bitwise-equal vertices quickly. Vastly faster than\n * previous approaches, but without tolerance options.\n *\n * RESULTS: For the \"Lovecraftian\" sample model linked below, after joining,\n * a primitive with 873,000 vertices can be welded down to 230,000 vertices.\n * https://sketchfab.com/3d-models/sculpt-january-day-19-lovecraftian-34ad2501108e4fceb9394f5b816b9f42\n *\n * - (1) Not tested, but prior results suggest not robust enough.\n * - (2) 30s\n * - (3) 660s\n * - (4) 5s exhaustive, 1.5s non-exhaustive\n * - (5) 0.2s\n *\n * As of April 2024, the lossy weld was removed, leaving only approach #5. An\n * upcoming Meshoptimizer release will include a simplifyWithAttributes\n * function allowing simplification with weighted consideration of vertex\n * attributes, which I hope to support. With that, weld() may remain faster,\n * simpler, and more maintainable.\n */\nconst NAME$n = 'weld';\nconst WELD_DEFAULTS = {\n overwrite: true,\n cleanup: true\n};\n/**\n * Welds {@link Primitive Primitives}, merging bitwise identical vertices. When\n * merged and indexed, data is shared more efficiently between vertices. File size\n * can be reduced, and the GPU uses the vertex cache more efficiently.\n *\n * Example:\n *\n * ```javascript\n * import { weld, getSceneVertexCount, VertexCountMethod } from '@gltf-transform/functions';\n *\n * const scene = document.getDefaultScene();\n * const srcVertexCount = getSceneVertexCount(scene, VertexCountMethod.UPLOAD);\n * await document.transform(weld());\n * const dstVertexCount = getSceneVertexCount(scene, VertexCountMethod.UPLOAD);\n * ```\n *\n * @category Transforms\n */\nfunction weld(_options = WELD_DEFAULTS) {\n const options = assignDefaults(WELD_DEFAULTS, _options);\n return createTransform(NAME$n, async doc => {\n const logger = doc.getLogger();\n for (const mesh of doc.getRoot().listMeshes()) {\n for (const prim of mesh.listPrimitives()) {\n weldPrimitive(prim, options);\n if (getPrimitiveVertexCount(prim, VertexCountMethod.RENDER) === 0) {\n prim.dispose();\n }\n }\n if (mesh.listPrimitives().length === 0) mesh.dispose();\n }\n // Welding removes degenerate meshes; prune leaf nodes afterward.\n if (options.cleanup) {\n await doc.transform(prune({\n propertyTypes: [PropertyType.ACCESSOR, PropertyType.NODE],\n keepAttributes: true,\n keepIndices: true,\n keepLeaves: false\n }), dedup({\n propertyTypes: [PropertyType.ACCESSOR]\n }));\n }\n logger.debug(`${NAME$n}: Complete.`);\n });\n}\n/**\n * Welds a {@link Primitive}, merging bitwise identical vertices. When merged\n * and indexed, data is shared more efficiently between vertices. File size can\n * be reduced, and the GPU uses the vertex cache more efficiently.\n *\n * Example:\n *\n * ```javascript\n * import { weldPrimitive, getMeshVertexCount, VertexCountMethod } from '@gltf-transform/functions';\n *\n * const mesh = document.getRoot().listMeshes()\n * \t.find((mesh) => mesh.getName() === 'Gizmo');\n *\n * const srcVertexCount = getMeshVertexCount(mesh, VertexCountMethod.UPLOAD);\n *\n * for (const prim of mesh.listPrimitives()) {\n * weldPrimitive(prim);\n * }\n *\n * const dstVertexCount = getMeshVertexCount(mesh, VertexCountMethod.UPLOAD);\n * ```\n */\nfunction weldPrimitive(prim, _options = WELD_DEFAULTS) {\n const graph = prim.getGraph();\n const document = Document.fromGraph(graph);\n const logger = document.getLogger();\n const options = _extends({}, WELD_DEFAULTS, _options);\n if (prim.getIndices() && !options.overwrite) return;\n if (prim.getMode() === Primitive.Mode.POINTS) return;\n const srcVertexCount = prim.getAttribute('POSITION').getCount();\n const srcIndices = prim.getIndices();\n const srcIndicesArray = srcIndices == null ? void 0 : srcIndices.getArray();\n const srcIndicesCount = srcIndices ? srcIndices.getCount() : srcVertexCount;\n const stream = new VertexStream(prim);\n const tableSize = ceilPowerOfTwo$1(srcVertexCount + srcVertexCount / 4);\n const table = new Uint32Array(tableSize).fill(EMPTY_U32$1);\n const writeMap = new Uint32Array(srcVertexCount).fill(EMPTY_U32$1); // oldIndex → newIndex\n // (1) Compare and identify indices to weld.\n let dstVertexCount = 0;\n for (let i = 0; i < srcIndicesCount; i++) {\n const srcIndex = srcIndicesArray ? srcIndicesArray[i] : i;\n if (writeMap[srcIndex] !== EMPTY_U32$1) continue;\n const hashIndex = hashLookup(table, tableSize, stream, srcIndex, EMPTY_U32$1);\n const dstIndex = table[hashIndex];\n if (dstIndex === EMPTY_U32$1) {\n table[hashIndex] = srcIndex;\n writeMap[srcIndex] = dstVertexCount++;\n } else {\n writeMap[srcIndex] = writeMap[dstIndex];\n }\n }\n logger.debug(`${NAME$n}: ${formatDeltaOp(srcVertexCount, dstVertexCount)} vertices.`);\n compactPrimitive(prim, writeMap, dstVertexCount);\n}\n\nconst {\n FLOAT\n} = Accessor.ComponentType;\n/**\n * Applies a transform matrix to a {@link Primitive}.\n *\n * All vertex attributes on the Primitive and its\n * {@link PrimitiveTarget PrimitiveTargets} are modified in place. If vertex\n * streams are shared with other Primitives, and overwriting the shared vertex\n * attributes is not desired, use {@link compactPrimitive} to pre-process\n * the Primitive or call {@link transformMesh} instead.\n *\n * Example:\n *\n * ```javascript\n * import { fromTranslation } from 'gl-matrix/mat4';\n * import { transformPrimitive } from '@gltf-transform/functions';\n *\n * // offset vertices, y += 10.\n * transformPrimitive(prim, fromTranslation([], [0, 10, 0]));\n * ```\n *\n * @param prim\n * @param matrix\n */\nfunction transformPrimitive(prim, matrix) {\n // Apply transform to base attributes.\n const position = prim.getAttribute('POSITION');\n if (position) {\n applyMatrix(matrix, position);\n }\n const normal = prim.getAttribute('NORMAL');\n if (normal) {\n applyNormalMatrix(matrix, normal);\n }\n const tangent = prim.getAttribute('TANGENT');\n if (tangent) {\n applyTangentMatrix(matrix, tangent);\n }\n // Apply transform to morph attributes.\n for (const target of prim.listTargets()) {\n const _position = target.getAttribute('POSITION');\n if (_position) {\n applyMatrix(matrix, _position);\n }\n const _normal = target.getAttribute('NORMAL');\n if (_normal) {\n applyNormalMatrix(matrix, _normal);\n }\n const _tangent = target.getAttribute('TANGENT');\n if (_tangent) {\n applyTangentMatrix(matrix, _tangent);\n }\n }\n // Reverse winding order if scale is negative.\n // See: https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/NegativeScaleTest\n if (determinant(matrix) < 0) {\n reversePrimitiveWindingOrder(prim);\n }\n}\nfunction applyMatrix(matrix, attribute) {\n const componentType = attribute.getComponentType();\n const normalized = attribute.getNormalized();\n const srcArray = attribute.getArray();\n const dstArray = componentType === FLOAT ? srcArray : new Float32Array(srcArray.length);\n const vector = create$1();\n for (let i = 0, il = attribute.getCount(); i < il; i++) {\n if (normalized) {\n vector[0] = MathUtils.decodeNormalizedInt(srcArray[i * 3], componentType);\n vector[1] = MathUtils.decodeNormalizedInt(srcArray[i * 3 + 1], componentType);\n vector[2] = MathUtils.decodeNormalizedInt(srcArray[i * 3 + 2], componentType);\n } else {\n vector[0] = srcArray[i * 3];\n vector[1] = srcArray[i * 3 + 1];\n vector[2] = srcArray[i * 3 + 2];\n }\n transformMat4(vector, vector, matrix);\n dstArray[i * 3] = vector[0];\n dstArray[i * 3 + 1] = vector[1];\n dstArray[i * 3 + 2] = vector[2];\n }\n attribute.setArray(dstArray).setNormalized(false);\n}\nfunction applyNormalMatrix(matrix, attribute) {\n const array = attribute.getArray();\n const normalized = attribute.getNormalized();\n const componentType = attribute.getComponentType();\n const normalMatrix = create$2();\n fromMat4(normalMatrix, matrix);\n invert(normalMatrix, normalMatrix);\n transpose(normalMatrix, normalMatrix);\n const vector = create$1();\n for (let i = 0, il = attribute.getCount(); i < il; i++) {\n if (normalized) {\n vector[0] = MathUtils.decodeNormalizedInt(array[i * 3], componentType);\n vector[1] = MathUtils.decodeNormalizedInt(array[i * 3 + 1], componentType);\n vector[2] = MathUtils.decodeNormalizedInt(array[i * 3 + 2], componentType);\n } else {\n vector[0] = array[i * 3];\n vector[1] = array[i * 3 + 1];\n vector[2] = array[i * 3 + 2];\n }\n transformMat3(vector, vector, normalMatrix);\n normalize(vector, vector);\n if (normalized) {\n array[i * 3] = MathUtils.decodeNormalizedInt(vector[0], componentType);\n array[i * 3 + 1] = MathUtils.decodeNormalizedInt(vector[1], componentType);\n array[i * 3 + 2] = MathUtils.decodeNormalizedInt(vector[2], componentType);\n } else {\n array[i * 3] = vector[0];\n array[i * 3 + 1] = vector[1];\n array[i * 3 + 2] = vector[2];\n }\n }\n}\nfunction applyTangentMatrix(matrix, attribute) {\n const array = attribute.getArray();\n const normalized = attribute.getNormalized();\n const componentType = attribute.getComponentType();\n const v3 = create$1();\n for (let i = 0, il = attribute.getCount(); i < il; i++) {\n if (normalized) {\n v3[0] = MathUtils.decodeNormalizedInt(array[i * 4], componentType);\n v3[1] = MathUtils.decodeNormalizedInt(array[i * 4 + 1], componentType);\n v3[2] = MathUtils.decodeNormalizedInt(array[i * 4 + 2], componentType);\n } else {\n v3[0] = array[i * 4];\n v3[1] = array[i * 4 + 1];\n v3[2] = array[i * 4 + 2];\n }\n // mat4 affine matrix applied to vector, vector interpreted as a direction.\n // Reference: https://github.com/mrdoob/three.js/blob/9f4de99828c05e71c47e6de0beb4c6e7652e486a/src/math/Vector3.js#L286-L300\n v3[0] = matrix[0] * v3[0] + matrix[4] * v3[1] + matrix[8] * v3[2];\n v3[1] = matrix[1] * v3[0] + matrix[5] * v3[1] + matrix[9] * v3[2];\n v3[2] = matrix[2] * v3[0] + matrix[6] * v3[1] + matrix[10] * v3[2];\n normalize(v3, v3);\n if (normalized) {\n array[i * 4] = MathUtils.decodeNormalizedInt(v3[0], componentType);\n array[i * 4 + 1] = MathUtils.decodeNormalizedInt(v3[1], componentType);\n array[i * 4 + 2] = MathUtils.decodeNormalizedInt(v3[2], componentType);\n } else {\n array[i * 4] = v3[0];\n array[i * 4 + 1] = v3[1];\n array[i * 4 + 2] = v3[2];\n }\n }\n}\nfunction reversePrimitiveWindingOrder(prim) {\n if (prim.getMode() !== Primitive.Mode.TRIANGLES) return;\n if (!prim.getIndices()) weldPrimitive(prim);\n const indices = prim.getIndices();\n for (let i = 0, il = indices.getCount(); i < il; i += 3) {\n const a = indices.getScalar(i);\n const c = indices.getScalar(i + 2);\n indices.setScalar(i, c);\n indices.setScalar(i + 2, a);\n }\n}\n\n/**\n * Applies a transform matrix to every {@link Primitive} in the given {@link Mesh}.\n *\n * For every Primitive in the Mesh, the operation first applies\n * {@link compactPrimitive} to isolate vertex streams, then calls\n * {@link transformPrimitive}. Transformed Mesh will no longer share vertex\n * attributes with any other Meshes — attributes are cloned before\n * transformation.\n *\n * Example:\n *\n * ```javascript\n * import { fromTranslation } from 'gl-matrix/mat4';\n * import { transformMesh } from '@gltf-transform/functions';\n *\n * // offset vertices, y += 10.\n * transformMesh(mesh, fromTranslation([], [0, 10, 0]));\n * ```\n *\n * @param mesh\n * @param matrix\n */\nfunction transformMesh(mesh, matrix) {\n // If primitives or morph targets are shared by other meshes, detach them.\n for (const srcPrim of mesh.listPrimitives()) {\n const dstPrim = shallowClonePrimitive(srcPrim, mesh);\n if (srcPrim !== dstPrim) {\n mesh.removePrimitive(srcPrim).addPrimitive(dstPrim);\n }\n }\n // Isolate vertex streams, remove unused vertices, and transform.\n for (const prim of mesh.listPrimitives()) {\n compactPrimitive(prim);\n transformPrimitive(prim, matrix);\n }\n}\n/**\n * Conditionally clones a {@link Primitive} and its\n * {@link PrimitiveTarget PrimitiveTargets}, if any are shared with other\n * parents. If nothing is shared, nothing is cloned. Accessors and materials\n * are not cloned.\n *\n * @hidden\n * @internal\n */\nfunction shallowClonePrimitive(prim, parentMesh) {\n const isSharedPrimitive = prim.listParents().some(parent => parent instanceof Mesh && parent !== parentMesh);\n if (isSharedPrimitive) {\n prim = prim.clone();\n }\n for (const target of prim.listTargets()) {\n const isSharedTarget = target.listParents().some(parent => parent instanceof Primitive && parent !== prim);\n if (isSharedTarget) {\n prim.removeTarget(target).addTarget(target.clone());\n }\n }\n return prim;\n}\n\n// biome-ignore format: Readability.\nconst IDENTITY = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n/**\n * Clears local transform of the {@link Node}, applying the transform to children and meshes.\n *\n * - Applies transform to children\n * - Applies transform to {@link Mesh mesh}\n * - Resets {@link Light lights}, {@link Camera cameras}, and other attachments to the origin\n *\n * Example:\n *\n * ```typescript\n * import { clearNodeTransform } from '@gltf-transform/functions';\n *\n * node.getTranslation(); // → [ 5, 0, 0 ]\n * node.getMesh(); // → vertex data centered at origin\n *\n * clearNodeTransform(node);\n *\n * node.getTranslation(); // → [ 0, 0, 0 ]\n * node.getMesh(); // → vertex data centered at [ 5, 0, 0 ]\n * ```\n *\n * To clear _all_ transforms of a Node, first clear its inherited transforms with\n * {@link clearNodeParent}, then clear the local transform with {@link clearNodeTransform}.\n */\nfunction clearNodeTransform(node) {\n const mesh = node.getMesh();\n const localMatrix = node.getMatrix();\n if (mesh && !MathUtils.eq(localMatrix, IDENTITY)) {\n transformMesh(mesh, localMatrix);\n }\n for (const child of node.listChildren()) {\n const matrix = child.getMatrix();\n multiply$2(matrix, matrix, localMatrix);\n child.setMatrix(matrix);\n }\n return node.setMatrix(IDENTITY);\n}\n\nconst {\n LINES: LINES$1,\n LINE_STRIP: LINE_STRIP$2,\n LINE_LOOP: LINE_LOOP$2,\n TRIANGLES: TRIANGLES$1,\n TRIANGLE_STRIP: TRIANGLE_STRIP$2,\n TRIANGLE_FAN: TRIANGLE_FAN$2\n} = Primitive.Mode;\n/**\n * Converts a LINE_STRIP or LINE_LOOP {@link Primitive} to LINES, which is\n * more widely supported. Any other topology given as input (points or\n * triangles) will throw an error.\n *\n * Example:\n *\n * ```javascript\n * import { convertPrimitiveToLines } from '@gltf-transform/functions';\n *\n * console.log(prim.getMode()); // 2 (LINE_LOOP)\n * convertPrimitiveToLines(prim);\n * console.log(prim.getMode()); // 1 (LINES)\n * ```\n */\nfunction convertPrimitiveToLines(prim) {\n const graph = prim.getGraph();\n const document = Document.fromGraph(graph);\n // Ensure indexed primitive.\n if (!prim.getIndices()) {\n weldPrimitive(prim);\n }\n // Allocate indices new GL primitives.\n const srcIndices = prim.getIndices();\n const srcIndicesArray = srcIndices.getArray();\n const dstGLPrimitiveCount = getGLPrimitiveCount(prim);\n const IndicesArray = ComponentTypeToTypedArray[srcIndices.getComponentType()];\n const dstIndicesArray = new IndicesArray(dstGLPrimitiveCount * 2);\n // Generate GL primitives.\n const srcMode = prim.getMode();\n if (srcMode === LINE_STRIP$2) {\n // https://glasnost.itcarlow.ie/~powerk/opengl/primitives/primitives.htm\n for (let i = 0; i < dstGLPrimitiveCount; i++) {\n dstIndicesArray[i * 2] = srcIndicesArray[i];\n dstIndicesArray[i * 2 + 1] = srcIndicesArray[i + 1];\n }\n } else if (srcMode === LINE_LOOP$2) {\n // https://glasnost.itcarlow.ie/~powerk/opengl/primitives/primitives.htm\n for (let i = 0; i < dstGLPrimitiveCount; i++) {\n if (i < dstGLPrimitiveCount - 1) {\n dstIndicesArray[i * 2] = srcIndicesArray[i];\n dstIndicesArray[i * 2 + 1] = srcIndicesArray[i + 1];\n } else {\n dstIndicesArray[i * 2] = srcIndicesArray[i];\n dstIndicesArray[i * 2 + 1] = srcIndicesArray[0];\n }\n }\n } else {\n throw new Error('Only LINE_STRIP and LINE_LOOP may be converted to LINES.');\n }\n // Update prim mode and indices.\n prim.setMode(LINES$1);\n const root = document.getRoot();\n if (srcIndices.listParents().some(parent => parent !== root && parent !== prim)) {\n prim.setIndices(shallowCloneAccessor(document, srcIndices).setArray(dstIndicesArray));\n } else {\n srcIndices.setArray(dstIndicesArray);\n }\n}\n/**\n * Converts a TRIANGLE_STRIP or TRIANGLE_LOOP {@link Primitive} to TRIANGLES,\n * which is more widely supported. Any other topology given as input (points or\n * lines) will throw an error.\n *\n * Example:\n *\n * ```javascript\n * import { convertPrimitiveToTriangles } from '@gltf-transform/functions';\n *\n * console.log(prim.getMode()); // 5 (TRIANGLE_STRIP)\n * convertPrimitiveToTriangles(prim);\n * console.log(prim.getMode()); // 4 (TRIANGLES)\n * ```\n */\nfunction convertPrimitiveToTriangles(prim) {\n const graph = prim.getGraph();\n const document = Document.fromGraph(graph);\n // Ensure indexed primitive.\n if (!prim.getIndices()) {\n weldPrimitive(prim);\n }\n // Allocate indices new GL primitives.\n const srcIndices = prim.getIndices();\n const srcIndicesArray = srcIndices.getArray();\n const dstGLPrimitiveCount = getGLPrimitiveCount(prim);\n const IndicesArray = ComponentTypeToTypedArray[srcIndices.getComponentType()];\n const dstIndicesArray = new IndicesArray(dstGLPrimitiveCount * 3);\n // Generate GL primitives.\n const srcMode = prim.getMode();\n if (srcMode === TRIANGLE_STRIP$2) {\n // https://en.wikipedia.org/wiki/Triangle_strip\n for (let i = 0, il = srcIndicesArray.length; i < il - 2; i++) {\n if (i % 2) {\n dstIndicesArray[i * 3] = srcIndicesArray[i + 1];\n dstIndicesArray[i * 3 + 1] = srcIndicesArray[i];\n dstIndicesArray[i * 3 + 2] = srcIndicesArray[i + 2];\n } else {\n dstIndicesArray[i * 3] = srcIndicesArray[i];\n dstIndicesArray[i * 3 + 1] = srcIndicesArray[i + 1];\n dstIndicesArray[i * 3 + 2] = srcIndicesArray[i + 2];\n }\n }\n } else if (srcMode === TRIANGLE_FAN$2) {\n // https://en.wikipedia.org/wiki/Triangle_fan\n for (let i = 0; i < dstGLPrimitiveCount; i++) {\n dstIndicesArray[i * 3] = srcIndicesArray[0];\n dstIndicesArray[i * 3 + 1] = srcIndicesArray[i + 1];\n dstIndicesArray[i * 3 + 2] = srcIndicesArray[i + 2];\n }\n } else {\n throw new Error('Only TRIANGLE_STRIP and TRIANGLE_FAN may be converted to TRIANGLES.');\n }\n // Update prim mode and indices.\n prim.setMode(TRIANGLES$1);\n const root = document.getRoot();\n if (srcIndices.listParents().some(parent => parent !== root && parent !== prim)) {\n prim.setIndices(shallowCloneAccessor(document, srcIndices).setArray(dstIndicesArray));\n } else {\n srcIndices.setArray(dstIndicesArray);\n }\n}\n\nconst NAME$m = 'dequantize';\nconst DEQUANTIZE_DEFAULTS = {\n pattern: /^((?!JOINTS_).)*$/\n};\n/**\n * Dequantize {@link Primitive Primitives}, removing {@link KHRMeshQuantization `KHR_mesh_quantization`}\n * if present. Dequantization will increase the size of the mesh on disk and in memory, but may be\n * necessary for compatibility with applications that don't support quantization.\n *\n * Example:\n *\n * ```javascript\n * import { dequantizePrimitive } from '@gltf-transform/functions';\n *\n * await document.transform(dequantize());\n * ```\n *\n * @category Transforms\n */\nfunction dequantize(_options = DEQUANTIZE_DEFAULTS) {\n const options = assignDefaults(DEQUANTIZE_DEFAULTS, _options);\n return createTransform(NAME$m, doc => {\n const logger = doc.getLogger();\n for (const mesh of doc.getRoot().listMeshes()) {\n for (const prim of mesh.listPrimitives()) {\n dequantizePrimitive(prim, options);\n }\n }\n doc.createExtension(KHRMeshQuantization).dispose();\n logger.debug(`${NAME$m}: Complete.`);\n });\n}\n/**\n * Dequantize a single {@link Primitive}, converting all vertex attributes to float32. Dequantization\n * will increase the size of the mesh on disk and in memory, but may be necessary for compatibility\n * with applications that don't support quantization.\n *\n * Example:\n *\n * ```javascript\n * import { dequantizePrimitive } from '@gltf-transform/functions';\n *\n * const mesh = document.getRoot().listMeshes().find((mesh) => mesh.getName() === 'MyMesh');\n *\n * for (const prim of mesh.listPrimitives()) {\n * \tdequantizePrimitive(prim);\n * }\n * ```\n */\nfunction dequantizePrimitive(prim, _options = DEQUANTIZE_DEFAULTS) {\n const options = assignDefaults(DEQUANTIZE_DEFAULTS, _options);\n for (const semantic of prim.listSemantics()) {\n if (options.pattern.test(semantic)) {\n dequantizeAttribute(prim.getAttribute(semantic));\n }\n }\n for (const target of prim.listTargets()) {\n for (const semantic of target.listSemantics()) {\n if (options.pattern.test(semantic)) {\n dequantizeAttribute(target.getAttribute(semantic));\n }\n }\n }\n}\nfunction dequantizeAttribute(attribute) {\n const srcArray = attribute.getArray();\n if (!srcArray) return;\n const dstArray = dequantizeAttributeArray(srcArray, attribute.getComponentType(), attribute.getNormalized());\n attribute.setArray(dstArray).setNormalized(false);\n}\nfunction dequantizeAttributeArray(srcArray, componentType, normalized) {\n const dstArray = new Float32Array(srcArray.length);\n for (let i = 0, il = srcArray.length; i < il; i++) {\n if (normalized) {\n dstArray[i] = MathUtils.decodeNormalizedInt(srcArray[i], componentType);\n } else {\n dstArray[i] = srcArray[i];\n }\n }\n return dstArray;\n}\n\nconst {\n TEXTURE_INFO,\n ROOT: ROOT$1\n} = PropertyType;\nconst NO_TRANSFER_TYPES = new Set([TEXTURE_INFO, ROOT$1]);\n/**\n * Clones source {@link Document}, copying all properties and extensions within\n * it. Source document remains unchanged, and the two may be modified\n * independently after cloning.\n *\n * Example:\n *\n * ```javascript\n *\timport { cloneDocument } from '@gltf-transform/functions';\n *\n *\tconst targetDocument = cloneDocument(sourceDocument);\n * ```\n */\nfunction cloneDocument(source) {\n const target = new Document().setLogger(source.getLogger());\n const resolve = createDefaultPropertyResolver(target, source);\n mergeDocuments(target, source, resolve);\n // Root properties (name, asset, default scene, extras) are not overwritten by\n // mergeDocuments(), and should be explicitly copied when cloning.\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n target.getRoot().copy(source.getRoot(), resolve);\n return target;\n}\n/**\n * Merges contents of source {@link Document} into target Document, without\n * modifying the source. Any extensions missing from the target will be added\n * {@link Scene Scenes} and {@link Buffer Buffers} are not combined —\n * the target Document may contain multiple Scenes and Buffers after this\n * operation. These may be cleaned up manually (see {@link unpartition}),\n * or document contents may be merged more granularly using\n * {@link copyToDocument}.\n *\n * Example:\n *\n * ```javascript\n *\timport { mergeDocuments, unpartition } from '@gltf-transform/functions';\n *\n *\t// Merge contents of sourceDocument into targetDocument.\n *\tmergeDocuments(targetDocument, sourceDocument);\n *\n *\t// (Optional) Remove all but one Buffer from the target Document.\n *\tawait targetDocument.transform(unpartition());\n * ```\n *\n * To merge several Scenes into one:\n *\n * ```javascript\n * import { mergeDocuments } from '@gltf-transform/functions';\n *\n * const map = mergeDocuments(targetDocument, sourceDocument);\n *\n * // Find original Scene.\n * const sceneA = targetDocument.getRoot().listScenes()[0];\n *\n * // Find counterpart of the source Scene in the target Document.\n * const sceneB = map.get(sourceDocument.getRoot().listScenes()[0]);\n *\n * // Create a Node, and append source Scene's direct children.\n * const rootNode = targetDocument.createNode()\n *\t\t.setName('SceneB')\n *\t\t.setPosition([10, 0, 0]);\n * for (const node of sceneB.listChildren()) {\n *\t\trootNode.addChild(node);\n * }\n *\n * // Append Node to original Scene, and dispose the empty Scene.\n * sceneA.addChild(rootNode);\n * sceneB.dispose();\n * ```\n */\nfunction mergeDocuments(target, source, resolve) {\n resolve || (resolve = createDefaultPropertyResolver(target, source));\n for (const sourceExtension of source.getRoot().listExtensionsUsed()) {\n const targetExtension = target.createExtension(sourceExtension.constructor);\n if (sourceExtension.isRequired()) targetExtension.setRequired(true);\n }\n // Root properties (name, asset, default scene, extras) are not overwritten.\n return _copyToDocument(target, source, listNonRootProperties(source), resolve);\n}\n/**\n * Moves the specified {@link Property Properties} from the source\n * {@link Document} to the target Document, and removes them from the source.\n * Dependencies of the source properties will be copied into the\n * target, but not removed from the source. Returns a Map from source\n * properties to their counterparts in the target Document.\n *\n * Example:\n *\n * ```javascript\n *\timport { moveToDocument, prune } from '@gltf-transform/functions';\n *\n *\t// Move all materials from sourceDocument to targetDocument.\n *\tconst map = moveToDocument(targetDocument, sourceDocument, sourceDocument.listMaterials());\n *\n *\t// Find the new counterpart of `sourceMaterial` in the target Document.\n *\tconst targetMaterial = map.get(sourceMaterial);\n *\n *\t// (Optional) Remove any resources (like Textures) that may now be unused\n *\t// in the source Document after their parent Materials have been moved.\n *\tawait sourceDocument.transform(prune());\n * ```\n *\n * Moving a {@link Mesh}, {@link Animation}, or another resource depending on\n * a {@link Buffer} will create a copy of the source Buffer in the target\n * Document. If the target Document should contain only one Buffer, call\n * {@link unpartition} after moving properties.\n *\n * Repeated use of `moveToDocument` may create multiple copies of some\n * resources, particularly shared dependencies like {@link Texture Textures} or\n * {@link Accessor Accessors}. While duplicates can be cleaned up with\n * {@link dedup}, it is also possible to prevent duplicates by creating and\n * reusing the same resolver for all calls to `moveToDocument`:\n *\n * ```javascript\n *\timport { moveToDocument, createDefaultPropertyResolver } from '@gltf-transform/functions';\n *\n *\tconst resolve = createDefaultPropertyResolver(targetDocument, sourceDocument);\n *\n *\t// Move materials individually, without creating duplicates of shared textures.\n *\tmoveToDocument(targetDocument, sourceDocument, materialA, resolve);\n *\tmoveToDocument(targetDocument, sourceDocument, materialB, resolve);\n *\tmoveToDocument(targetDocument, sourceDocument, materialC, resolve);\n * ```\n *\n * If the transferred properties include {@link ExtensionProperty ExtensionProperties},\n * the associated {@link Extension Extensions} must be added to the target\n * Document first:\n *\n * ```javascript\n *\tfor (const sourceExtension of source.getRoot().listExtensionsUsed()) {\n *\t\tconst targetExtension = target.createExtension(sourceExtension.constructor);\n *\t\tif (sourceExtension.isRequired()) targetExtension.setRequired(true);\n *\t}\n * ```\n *\n * {@link Root} properties cannot be moved.\n *\n * {@link TextureInfo} properties cannot be given in the property list, but\n * are handled automatically when moving a {@link Material}.\n *\n * To copy properties without removing them from the source Document, see\n * {@link copyToDocument}.\n *\n * @experimental\n */\nfunction moveToDocument(target, source, sourceProperties, resolve) {\n const targetProperties = copyToDocument(target, source, sourceProperties, resolve);\n for (const property of sourceProperties) {\n property.dispose();\n }\n return targetProperties;\n}\n/**\n * Copies the specified {@link Property Properties} from the source\n * {@link Document} to the target Document, leaving originals in the source.\n * Dependencies of the source properties will also be copied into the\n * target. Returns a Map from source properties to their counterparts in the\n * target Document.\n *\n * Example:\n *\n * ```javascript\n *\timport { copyToDocument } from '@gltf-transform/functions';\n *\n *\t// Copy all materials from sourceDocument to targetDocument.\n *\tconst map = copyToDocument(targetDocument, sourceDocument, sourceDocument.listMaterials());\n *\n *\t// Find the new counterpart of `sourceMaterial` in the target Document.\n *\tconst targetMaterial = map.get(sourceMaterial);\n * ```\n *\n * Copying a {@link Mesh}, {@link Animation}, or another resource depending on\n * a {@link Buffer} will create a copy of the source Buffer in the target\n * Document. If the target Document should contain only one Buffer, call\n * {@link unpartition} after copying properties.\n *\n * Repeated use of `copyToDocument` may create multiple copies of some\n * resources, particularly shared dependencies like {@link Texture Textures} or\n * {@link Accessor Accessors}. While duplicates can be cleaned up with\n * {@link dedup}, it is also possible to prevent duplicates by creating and\n * reusing the same resolver for all calls to `copyToDocument`:\n *\n * ```javascript\n *\timport { copyToDocument, createDefaultPropertyResolver } from '@gltf-transform/functions';\n *\n *\tconst resolve = createDefaultPropertyResolver(targetDocument, sourceDocument);\n *\n *\t// Copy materials individually, without creating duplicates of shared textures.\n *\tcopyToDocument(targetDocument, sourceDocument, materialA, resolve);\n *\tcopyToDocument(targetDocument, sourceDocument, materialB, resolve);\n *\tcopyToDocument(targetDocument, sourceDocument, materialC, resolve);\n * ```\n *\n * If the transferred properties include {@link ExtensionProperty ExtensionProperties},\n * the associated {@link Extension Extensions} must be added to the target\n * Document first:\n *\n * ```javascript\n *\tfor (const sourceExtension of source.getRoot().listExtensionsUsed()) {\n *\t\tconst targetExtension = target.createExtension(sourceExtension.constructor);\n *\t\tif (sourceExtension.isRequired()) targetExtension.setRequired(true);\n *\t}\n * ```\n *\n * {@link Root} properties cannot be copied.\n *\n * {@link TextureInfo} properties cannot be given in the property list, but\n * are handled automatically when copying a {@link Material}.\n *\n * To move properties to the target Document without leaving copies behind in\n * the source Document, use {@link moveToDocument} or dispose the properties\n * after copying.\n *\n * @experimental\n */\nfunction copyToDocument(target, source, sourceProperties, resolve) {\n const sourcePropertyDependencies = new Set();\n for (const property of sourceProperties) {\n if (NO_TRANSFER_TYPES.has(property.propertyType)) {\n throw new Error(`Type \"${property.propertyType}\" cannot be transferred.`);\n }\n listPropertyDependencies(property, sourcePropertyDependencies);\n }\n return _copyToDocument(target, source, Array.from(sourcePropertyDependencies), resolve);\n}\n/** @internal */\nfunction _copyToDocument(target, source, sourceProperties, resolve) {\n resolve || (resolve = createDefaultPropertyResolver(target, source));\n // Create stub classes for every Property in other Document.\n const propertyMap = new Map();\n for (const sourceProp of sourceProperties) {\n // TextureInfo copy handled by Material or ExtensionProperty.\n if (!propertyMap.has(sourceProp) && sourceProp.propertyType !== TEXTURE_INFO) {\n propertyMap.set(sourceProp, resolve(sourceProp));\n }\n }\n // Assemble relationships between Properties.\n for (const [sourceProp, targetProp] of propertyMap.entries()) {\n targetProp.copy(sourceProp, resolve);\n }\n return propertyMap;\n}\n/**\n * Creates a default `resolve` implementation. May be used when moving\n * properties between {@link Document Documents} with {@link mergeDocuments},\n * {@link copyToDocument}, and {@link moveToDocument}. When the same resolver\n * is passed to multiple invocations, these functions will reuse previously-\n * transferred resources.\n *\n * @experimental\n */\nfunction createDefaultPropertyResolver(target, source) {\n const propertyMap = new Map([[source.getRoot(), target.getRoot()]]);\n return sourceProp => {\n // TextureInfo lifecycle is bound to a Material or ExtensionProperty.\n if (sourceProp.propertyType === TEXTURE_INFO) return sourceProp;\n let targetProp = propertyMap.get(sourceProp);\n if (!targetProp) {\n // Create stub class, defer copying properties.\n const PropertyClass = sourceProp.constructor;\n targetProp = new PropertyClass(target.getGraph());\n propertyMap.set(sourceProp, targetProp);\n }\n return targetProp;\n };\n}\n/** @internal */\nfunction listPropertyDependencies(parent, visited) {\n const graph = parent.getGraph();\n const queue = [parent];\n let next = undefined;\n while (next = queue.pop()) {\n visited.add(next);\n for (const child of graph.listChildren(next)) {\n if (!visited.has(child)) {\n queue.push(child);\n }\n }\n }\n return visited;\n}\n/** @internal */\nfunction listNonRootProperties(document) {\n const visited = new Set();\n for (const edge of document.getGraph().listEdges()) {\n visited.add(edge.getChild());\n }\n return Array.from(visited);\n}\n\nconst NAME$l = 'draco';\nconst DRACO_DEFAULTS = {\n method: 'edgebreaker',\n encodeSpeed: 5,\n decodeSpeed: 5,\n quantizePosition: 14,\n quantizeNormal: 10,\n quantizeColor: 8,\n quantizeTexcoord: 12,\n quantizeGeneric: 12,\n quantizationVolume: 'mesh'\n};\n/**\n * Applies Draco compression using {@link KHRDracoMeshCompression KHR_draco_mesh_compression}.\n * Draco compression can reduce the size of triangle geometry.\n *\n * This function is a thin wrapper around the {@link KHRDracoMeshCompression} extension.\n *\n * ### Example\n *\n * ```typescript\n * import { NodeIO } from '@gltf-transform/core';\n * import { KHRDracoMeshCompression } from '@gltf-transform/extensions';\n * import { draco } from '@gltf-transform/functions';\n * import draco3d from 'draco3dgltf';\n *\n * const io = new NodeIO()\n * \t.registerExtensions([KHRDracoMeshCompression])\n * \t.registerDependencies({\n * \t\t'draco3d.encoder': await draco3d.createEncoderModule()\n * \t});\n *\n * await document.transform(\n * draco({method: 'edgebreaker'})\n * );\n *\n * await io.write('compressed.glb', document);\n * ```\n *\n * Compression is deferred until generating output with an I/O class.\n *\n * @category Transforms\n */\nfunction draco(_options = DRACO_DEFAULTS) {\n const options = assignDefaults(DRACO_DEFAULTS, _options);\n return createTransform(NAME$l, async document => {\n await document.transform(weld());\n document.createExtension(KHRDracoMeshCompression).setRequired(true).setEncoderOptions({\n method: options.method === 'edgebreaker' ? KHRDracoMeshCompression.EncoderMethod.EDGEBREAKER : KHRDracoMeshCompression.EncoderMethod.SEQUENTIAL,\n encodeSpeed: options.encodeSpeed,\n decodeSpeed: options.decodeSpeed,\n quantizationBits: {\n POSITION: options.quantizePosition,\n NORMAL: options.quantizeNormal,\n COLOR: options.quantizeColor,\n TEX_COORD: options.quantizeTexcoord,\n GENERIC: options.quantizeGeneric\n },\n quantizationVolume: options.quantizationVolume\n });\n });\n}\n\nconst NAME$k = 'flatten';\nconst FLATTEN_DEFAULTS = {\n cleanup: true\n};\n/**\n * Flattens the scene graph, leaving {@link Node Nodes} with\n * {@link Mesh Meshes}, {@link Camera Cameras}, and other attachments\n * as direct children of the {@link Scene}. Skeletons and their\n * descendants are left in their original Node structure.\n *\n * {@link Animation} targeting a Node or its parents will\n * prevent that Node from being moved.\n *\n * Example:\n *\n * ```ts\n * import { flatten } from '@gltf-transform/functions';\n *\n * await document.transform(flatten());\n * ```\n *\n * @category Transforms\n */\nfunction flatten(_options = FLATTEN_DEFAULTS) {\n const options = assignDefaults(FLATTEN_DEFAULTS, _options);\n return createTransform(NAME$k, async document => {\n const root = document.getRoot();\n const logger = document.getLogger();\n // (1) Mark joints.\n const joints = new Set();\n for (const skin of root.listSkins()) {\n for (const joint of skin.listJoints()) {\n joints.add(joint);\n }\n }\n // (2) Mark nodes with TRS animation.\n const animated = new Set();\n for (const animation of root.listAnimations()) {\n for (const channel of animation.listChannels()) {\n const node = channel.getTargetNode();\n if (node && channel.getTargetPath() !== 'weights') {\n animated.add(node);\n }\n }\n }\n // (3) Mark descendants of joints and animated nodes.\n const hasJointParent = new Set();\n const hasAnimatedParent = new Set();\n for (const scene of root.listScenes()) {\n scene.traverse(node => {\n const parent = node.getParentNode();\n if (!parent) return;\n if (joints.has(parent) || hasJointParent.has(parent)) {\n hasJointParent.add(node);\n }\n if (animated.has(parent) || hasAnimatedParent.has(parent)) {\n hasAnimatedParent.add(node);\n }\n });\n }\n // (4) For each affected node, in top-down order, clear parents.\n for (const scene of root.listScenes()) {\n scene.traverse(node => {\n if (animated.has(node)) return;\n if (hasJointParent.has(node)) return;\n if (hasAnimatedParent.has(node)) return;\n clearNodeParent(node);\n });\n }\n // TODO(feat): Transform animation channels, accounting for previously inherited transforms.\n if (animated.size) {\n logger.debug(`${NAME$k}: Flattening node hierarchies with TRS animation not yet supported.`);\n }\n // (5) Clean up leaf nodes.\n if (options.cleanup) {\n await document.transform(prune({\n propertyTypes: [PropertyType.NODE],\n keepLeaves: false\n }));\n }\n logger.debug(`${NAME$k}: Complete.`);\n });\n}\n\n/**\n * Computes bounding box (AABB) in world space for the given {@link Node} or {@link Scene}.\n *\n * Example:\n *\n * ```ts\n * import { getBounds } from '@gltf-transform/functions';\n *\n * const {min, max} = getBounds(scene);\n * ```\n */\nfunction getBounds(node) {\n return getBounds$1(node);\n}\n\n/** Inspects the contents of a glTF file and returns a JSON report. */\nfunction inspect(doc) {\n return {\n scenes: listScenes(doc),\n meshes: listMeshes(doc),\n materials: listMaterials(doc),\n textures: listTextures(doc),\n animations: listAnimations(doc)\n };\n}\n/** List scenes. */\nfunction listScenes(doc) {\n const scenes = doc.getRoot().listScenes().map(scene => {\n const root = scene.listChildren()[0];\n const sceneBounds = getBounds$1(scene);\n return {\n name: scene.getName(),\n rootName: root ? root.getName() : '',\n bboxMin: toPrecision(sceneBounds.min),\n bboxMax: toPrecision(sceneBounds.max),\n renderVertexCount: getSceneVertexCount(scene, VertexCountMethod.RENDER),\n uploadVertexCount: getSceneVertexCount(scene, VertexCountMethod.UPLOAD),\n uploadNaiveVertexCount: getSceneVertexCount(scene, VertexCountMethod.UPLOAD_NAIVE)\n };\n });\n return {\n properties: scenes\n };\n}\n/** List meshes. */\nfunction listMeshes(doc) {\n const meshes = doc.getRoot().listMeshes().map(mesh => {\n const instances = mesh.listParents().filter(parent => parent.propertyType !== PropertyType.ROOT).length;\n let glPrimitives = 0;\n const semantics = new Set();\n const meshIndices = new Set();\n const meshAccessors = new Set();\n mesh.listPrimitives().forEach(prim => {\n for (const semantic of prim.listSemantics()) {\n const attr = prim.getAttribute(semantic);\n semantics.add(semantic + ':' + accessorToTypeLabel(attr));\n meshAccessors.add(attr);\n }\n for (const targ of prim.listTargets()) {\n targ.listAttributes().forEach(attr => meshAccessors.add(attr));\n }\n const indices = prim.getIndices();\n if (indices) {\n meshIndices.add(accessorToTypeLabel(indices));\n meshAccessors.add(indices);\n }\n glPrimitives += getGLPrimitiveCount(prim);\n });\n let size = 0;\n Array.from(meshAccessors).forEach(a => size += a.getArray().byteLength);\n const modes = mesh.listPrimitives().map(prim => MeshPrimitiveModeLabels[prim.getMode()]);\n return {\n name: mesh.getName(),\n mode: Array.from(new Set(modes)),\n meshPrimitives: mesh.listPrimitives().length,\n glPrimitives: glPrimitives,\n vertices: getMeshVertexCount(mesh, VertexCountMethod.UPLOAD),\n indices: Array.from(meshIndices).sort(),\n attributes: Array.from(semantics).sort(),\n instances: instances,\n size: size\n };\n });\n return {\n properties: meshes\n };\n}\n/** List materials. */\nfunction listMaterials(doc) {\n const materials = doc.getRoot().listMaterials().map(material => {\n const instances = material.listParents().filter(parent => parent.propertyType !== PropertyType.ROOT).length;\n // Find all texture slots attached to this material or its extensions.\n const extensions = new Set(material.listExtensions());\n const slots = doc.getGraph().listEdges().filter(ref => {\n const child = ref.getChild();\n const parent = ref.getParent();\n if (child instanceof Texture && parent === material) {\n return true;\n }\n if (child instanceof Texture && parent instanceof ExtensionProperty && extensions.has(parent)) {\n return true;\n }\n return false;\n }).map(ref => ref.getName());\n return {\n name: material.getName(),\n instances,\n textures: slots,\n alphaMode: material.getAlphaMode(),\n doubleSided: material.getDoubleSided()\n };\n });\n return {\n properties: materials\n };\n}\n/** List textures. */\nfunction listTextures(doc) {\n const textures = doc.getRoot().listTextures().map(texture => {\n const instances = texture.listParents().filter(parent => parent.propertyType !== PropertyType.ROOT).length;\n const slots = doc.getGraph().listParentEdges(texture).filter(edge => edge.getParent().propertyType !== PropertyType.ROOT).map(edge => edge.getName());\n const resolution = ImageUtils.getSize(texture.getImage(), texture.getMimeType());\n let compression = '';\n if (texture.getMimeType() === 'image/ktx2') {\n const container = read(texture.getImage());\n const dfd = container.dataFormatDescriptor[0];\n if (dfd.colorModel === KHR_DF_MODEL_ETC1S) {\n compression = 'ETC1S';\n } else if (dfd.colorModel === KHR_DF_MODEL_UASTC) {\n compression = 'UASTC';\n }\n }\n return {\n name: texture.getName(),\n uri: texture.getURI(),\n slots: Array.from(new Set(slots)),\n instances,\n mimeType: texture.getMimeType(),\n compression,\n resolution: resolution ? resolution.join('x') : '',\n size: texture.getImage().byteLength,\n gpuSize: ImageUtils.getVRAMByteLength(texture.getImage(), texture.getMimeType())\n };\n });\n return {\n properties: textures\n };\n}\n/** List animations. */\nfunction listAnimations(doc) {\n const animations = doc.getRoot().listAnimations().map(anim => {\n let minTime = Infinity;\n let maxTime = -Infinity;\n anim.listSamplers().forEach(sampler => {\n const input = sampler.getInput();\n if (!input) return;\n minTime = Math.min(minTime, input.getMin([])[0]);\n maxTime = Math.max(maxTime, input.getMax([])[0]);\n });\n let size = 0;\n let keyframes = 0;\n const accessors = new Set();\n anim.listSamplers().forEach(sampler => {\n const input = sampler.getInput();\n const output = sampler.getOutput();\n if (!input) return;\n keyframes += input.getCount();\n accessors.add(input);\n if (!output) return;\n accessors.add(output);\n });\n Array.from(accessors).forEach(accessor => {\n size += accessor.getArray().byteLength;\n });\n return {\n name: anim.getName(),\n channels: anim.listChannels().length,\n samplers: anim.listSamplers().length,\n duration: Math.round((maxTime - minTime) * 1000) / 1000,\n keyframes: keyframes,\n size: size\n };\n });\n return {\n properties: animations\n };\n}\nconst MeshPrimitiveModeLabels = ['POINTS', 'LINES', 'LINE_LOOP', 'LINE_STRIP', 'TRIANGLES', 'TRIANGLE_STRIP', 'TRIANGLE_FAN'];\nconst NumericTypeLabels = {\n Float32Array: 'f32',\n Uint32Array: 'u32',\n Uint16Array: 'u16',\n Uint8Array: 'u8',\n Int32Array: 'i32',\n Int16Array: 'i16',\n Int8Array: 'i8'\n};\n/** Maps values in a vector to a finite precision. */\nfunction toPrecision(v) {\n for (let i = 0; i < v.length; i++) {\n if (v[i].toFixed) v[i] = Number(v[i].toFixed(5));\n }\n return v;\n}\nfunction accessorToTypeLabel(accessor) {\n const array = accessor.getArray();\n const base = NumericTypeLabels[array.constructor.name] || '?';\n const suffix = accessor.getNormalized() ? '_norm' : '';\n return base + suffix;\n}\n\nconst NAME$j = 'instance';\nconst INSTANCE_DEFAULTS = {\n min: 5\n};\n/**\n * Creates GPU instances (with {@link EXTMeshGPUInstancing}) for shared {@link Mesh} references. In\n * engines supporting the extension, reused Meshes will be drawn with GPU instancing, greatly\n * reducing draw calls and improving performance in many cases. If you're not sure that identical\n * Meshes share vertex data and materials (\"linked duplicates\"), run {@link dedup} first to link them.\n *\n * Example:\n *\n * ```javascript\n * import { dedup, instance } from '@gltf-transform/functions';\n *\n * await document.transform(\n * \tdedup(),\n * \tinstance({min: 5}),\n * );\n * ```\n *\n * @category Transforms\n */\nfunction instance(_options = INSTANCE_DEFAULTS) {\n const options = assignDefaults(INSTANCE_DEFAULTS, _options);\n return createTransform(NAME$j, doc => {\n const logger = doc.getLogger();\n const root = doc.getRoot();\n if (root.listAnimations().length) {\n logger.warn(`${NAME$j}: Instancing is not currently supported for animated models.`);\n logger.debug(`${NAME$j}: Complete.`);\n return;\n }\n const batchExtension = doc.createExtension(EXTMeshGPUInstancing);\n let numBatches = 0;\n let numInstances = 0;\n for (const scene of root.listScenes()) {\n // Gather a one-to-many Mesh/Node mapping, identifying what we can instance.\n const meshInstances = new Map();\n scene.traverse(node => {\n const mesh = node.getMesh();\n if (!mesh) return;\n if (node.getExtension('EXT_mesh_gpu_instancing')) return;\n meshInstances.set(mesh, (meshInstances.get(mesh) || new Set()).add(node));\n });\n // For each Mesh, create an InstancedMesh and collect transforms.\n const modifiedNodes = [];\n for (const mesh of Array.from(meshInstances.keys())) {\n const nodes = Array.from(meshInstances.get(mesh));\n if (nodes.length < options.min) continue;\n if (nodes.some(node => node.getSkin())) continue;\n // Cannot preserve volumetric effects when instancing with varying scale.\n // See: https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/AttenuationTest\n if (mesh.listPrimitives().some(hasVolume) && nodes.some(hasScale)) continue;\n const batch = createBatch(doc, batchExtension, mesh, nodes.length);\n const batchTranslation = batch.getAttribute('TRANSLATION');\n const batchRotation = batch.getAttribute('ROTATION');\n const batchScale = batch.getAttribute('SCALE');\n const batchNode = doc.createNode().setMesh(mesh).setExtension('EXT_mesh_gpu_instancing', batch);\n scene.addChild(batchNode);\n let needsTranslation = false;\n let needsRotation = false;\n let needsScale = false;\n // For each Node, write TRS properties into instance attributes.\n for (let i = 0; i < nodes.length; i++) {\n let t, r, s;\n const node = nodes[i];\n batchTranslation.setElement(i, t = node.getWorldTranslation());\n batchRotation.setElement(i, r = node.getWorldRotation());\n batchScale.setElement(i, s = node.getWorldScale());\n if (!MathUtils.eq(t, [0, 0, 0])) needsTranslation = true;\n if (!MathUtils.eq(r, [0, 0, 0, 1])) needsRotation = true;\n if (!MathUtils.eq(s, [1, 1, 1])) needsScale = true;\n }\n if (!needsTranslation) batchTranslation.dispose();\n if (!needsRotation) batchRotation.dispose();\n if (!needsScale) batchScale.dispose();\n if (!needsTranslation && !needsRotation && !needsScale) {\n batchNode.dispose();\n batch.dispose();\n continue;\n }\n // Mark nodes for cleanup.\n for (const node of nodes) {\n node.setMesh(null);\n modifiedNodes.push(node);\n }\n numBatches++;\n numInstances += nodes.length;\n }\n pruneUnusedNodes(modifiedNodes, logger);\n }\n if (numBatches > 0) {\n logger.info(`${NAME$j}: Created ${numBatches} batches, with ${numInstances} total instances.`);\n } else {\n logger.info(`${NAME$j}: No meshes with >=${options.min} parent nodes were found.`);\n }\n if (batchExtension.listProperties().length === 0) {\n batchExtension.dispose();\n }\n logger.debug(`${NAME$j}: Complete.`);\n });\n}\nfunction pruneUnusedNodes(nodes, logger) {\n let node;\n let unusedNodes = 0;\n while (node = nodes.pop()) {\n if (node.listChildren().length || node.getCamera() || node.getMesh() || node.getSkin() || node.listExtensions().length) {\n continue;\n }\n const nodeParent = node.getParentNode();\n if (nodeParent) nodes.push(nodeParent);\n node.dispose();\n unusedNodes++;\n }\n logger.debug(`${NAME$j}: Removed ${unusedNodes} unused nodes.`);\n}\nfunction hasVolume(prim) {\n const material = prim.getMaterial();\n return !!(material && material.getExtension('KHR_materials_volume'));\n}\nfunction hasScale(node) {\n const scale = node.getWorldScale();\n return !MathUtils.eq(scale, [1, 1, 1]);\n}\nfunction createBatch(doc, batchExtension, mesh, count) {\n const buffer = mesh.listPrimitives()[0].getAttribute('POSITION').getBuffer();\n const batchTranslation = doc.createAccessor().setType('VEC3').setArray(new Float32Array(3 * count)).setBuffer(buffer);\n const batchRotation = doc.createAccessor().setType('VEC4').setArray(new Float32Array(4 * count)).setBuffer(buffer);\n const batchScale = doc.createAccessor().setType('VEC3').setArray(new Float32Array(3 * count)).setBuffer(buffer);\n return batchExtension.createInstancedMesh().setAttribute('TRANSLATION', batchTranslation).setAttribute('ROTATION', batchRotation).setAttribute('SCALE', batchScale);\n}\n\nconst JOIN_PRIMITIVE_DEFAULTS = {\n skipValidation: false\n};\nconst EMPTY_U32 = 2 ** 32 - 1;\nconst {\n LINE_STRIP: LINE_STRIP$1,\n LINE_LOOP: LINE_LOOP$1,\n TRIANGLE_STRIP: TRIANGLE_STRIP$1,\n TRIANGLE_FAN: TRIANGLE_FAN$1\n} = Primitive.Mode;\n/**\n * Given a list of compatible Mesh {@link Primitive Primitives}, returns new Primitive\n * containing their vertex data. Compatibility requires that all Primitives share the\n * same {@link Material Materials}, draw mode, and vertex attribute types. Primitives\n * using morph targets cannot currently be joined.\n *\n * Example:\n *\n * ```javascript\n * import { joinPrimitives } from '@gltf-transform/functions';\n *\n * // Succeeds if Primitives are compatible, or throws an error.\n * const result = joinPrimitives(mesh.listPrimitives());\n *\n * for (const prim of mesh.listPrimitives()) {\n * \tprim.dispose();\n * }\n *\n * mesh.addPrimitive(result);\n * ```\n */\nfunction joinPrimitives(prims, _options = {}) {\n const options = assignDefaults(JOIN_PRIMITIVE_DEFAULTS, _options);\n const templatePrim = prims[0];\n const document = Document.fromGraph(templatePrim.getGraph());\n // (1) Validation.\n if (!options.skipValidation && new Set(prims.map(createPrimGroupKey)).size > 1) {\n throw new Error('' + 'Requires >=2 Primitives, sharing the same Material ' + 'and Mode, with compatible vertex attributes and indices.');\n }\n // (2) Convert all prims to POINTS, LINES, or TRIANGLES.\n for (const prim of prims) {\n switch (prim.getMode()) {\n case LINE_STRIP$1:\n case LINE_LOOP$1:\n convertPrimitiveToLines(prim);\n break;\n case TRIANGLE_STRIP$1:\n case TRIANGLE_FAN$1:\n convertPrimitiveToTriangles(prim);\n break;\n }\n }\n const primRemaps = []; // remap[srcIndex] → dstIndex, by prim\n const primVertexCounts = new Uint32Array(prims.length); // vertex count, by prim\n let dstVertexCount = 0;\n let dstIndicesCount = 0;\n // (3) Build remap lists.\n for (let primIndex = 0; primIndex < prims.length; primIndex++) {\n const srcPrim = prims[primIndex];\n const srcIndices = srcPrim.getIndices();\n const srcVertexCount = srcPrim.getAttribute('POSITION').getCount();\n const srcIndicesArray = srcIndices ? srcIndices.getArray() : null;\n const srcIndicesCount = srcIndices ? srcIndices.getCount() : srcVertexCount;\n const remap = new Uint32Array(srcVertexCount).fill(EMPTY_U32);\n for (let i = 0; i < srcIndicesCount; i++) {\n const index = srcIndicesArray ? srcIndicesArray[i] : i;\n if (remap[index] === EMPTY_U32) {\n remap[index] = dstVertexCount++;\n primVertexCounts[primIndex]++;\n }\n }\n primRemaps.push(remap);\n dstIndicesCount += srcIndicesCount;\n }\n // (4) Allocate joined attributes.\n const dstPrim = document.createPrimitive().setMode(templatePrim.getMode()).setMaterial(templatePrim.getMaterial());\n for (const semantic of templatePrim.listSemantics()) {\n const tplAttribute = templatePrim.getAttribute(semantic);\n const AttributeArray = ComponentTypeToTypedArray[tplAttribute.getComponentType()];\n const dstAttribute = shallowCloneAccessor(document, tplAttribute).setArray(new AttributeArray(dstVertexCount * tplAttribute.getElementSize()));\n dstPrim.setAttribute(semantic, dstAttribute);\n }\n // (5) Allocate joined indices.\n const tplIndices = templatePrim.getIndices();\n const dstIndices = tplIndices ? shallowCloneAccessor(document, tplIndices).setArray(createIndicesEmpty(dstIndicesCount, dstVertexCount)) : null;\n dstPrim.setIndices(dstIndices);\n // (6) Remap attributes into joined Primitive.\n let dstIndicesOffset = 0;\n for (let primIndex = 0; primIndex < primRemaps.length; primIndex++) {\n const srcPrim = prims[primIndex];\n const srcIndices = srcPrim.getIndices();\n const srcIndicesCount = srcIndices ? srcIndices.getCount() : -1;\n const remap = primRemaps[primIndex];\n if (srcIndices && dstIndices) {\n remapIndices(srcIndices, remap, dstIndices, dstIndicesOffset);\n dstIndicesOffset += srcIndicesCount;\n }\n for (const semantic of dstPrim.listSemantics()) {\n const srcAttribute = srcPrim.getAttribute(semantic);\n const dstAttribute = dstPrim.getAttribute(semantic);\n remapAttribute$1(srcAttribute, srcIndices, remap, dstAttribute);\n }\n }\n return dstPrim;\n}\n/**\n * Internal variant of {@link compactAttribute}. Unlike compactAttribute,\n * assumes the vertex count cannot change, and avoids cloning attributes.\n * @hidden\n * @internal\n */\nfunction remapAttribute$1(srcAttribute, srcIndices, remap, dstAttribute) {\n const elementSize = srcAttribute.getElementSize();\n const srcIndicesArray = srcIndices ? srcIndices.getArray() : null;\n const srcVertexCount = srcAttribute.getCount();\n const srcArray = srcAttribute.getArray();\n const dstArray = dstAttribute.getArray();\n const done = new Uint8Array(srcAttribute.getCount());\n for (let i = 0, il = srcIndices ? srcIndices.getCount() : srcVertexCount; i < il; i++) {\n const srcIndex = srcIndicesArray ? srcIndicesArray[i] : i;\n const dstIndex = remap[srcIndex];\n if (done[dstIndex]) continue;\n for (let j = 0; j < elementSize; j++) {\n dstArray[dstIndex * elementSize + j] = srcArray[srcIndex * elementSize + j];\n }\n done[dstIndex] = 1;\n }\n}\n/**\n * Internal variant of {@link compactPrimitive}'s index remapping. Avoids\n * cloning indices; writes directly to `dstIndices`.\n * @hidden\n * @internal\n */\nfunction remapIndices(srcIndices, remap, dstIndices, dstOffset) {\n const srcCount = srcIndices.getCount();\n const srcArray = srcIndices.getArray();\n const dstArray = dstIndices.getArray();\n for (let i = 0; i < srcCount; i++) {\n const srcIndex = srcArray[i];\n const dstIndex = remap[srcIndex];\n dstArray[dstOffset + i] = dstIndex;\n }\n}\n\nconst NAME$i = 'join';\nconst {\n ROOT,\n NODE,\n MESH,\n PRIMITIVE,\n ACCESSOR\n} = PropertyType;\n// biome-ignore format: Readability.\nconst _matrix = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\nconst JOIN_DEFAULTS = {\n keepMeshes: false,\n keepNamed: false,\n cleanup: true,\n filter: () => true\n};\n/**\n * Joins compatible {@link Primitive Primitives} and reduces draw calls.\n * Primitives are eligible for joining if they are members of the same\n * {@link Mesh} or, optionally, attached to sibling {@link Node Nodes}\n * in the scene hierarchy. For best results, apply {@link dedup} and\n * {@link flatten} first to maximize the number of Primitives that\n * can be joined.\n *\n * NOTE: In a Scene that heavily reuses the same Mesh data, joining may\n * increase vertex count. Consider alternatives, like\n * {@link instance instancing} with {@link EXTMeshGPUInstancing}.\n *\n * Example:\n *\n * ```ts\n * import { PropertyType } from '@gltf-transform/core';\n * import { join, flatten, dedup } from '@gltf-transform/functions';\n *\n * await document.transform(\n * \tdedup({ propertyTypes: [PropertyType.MATERIAL] }),\n * \tflatten(),\n * \tjoin({ keepNamed: false }),\n * );\n * ```\n *\n * @category Transforms\n */\nfunction join(_options = JOIN_DEFAULTS) {\n const options = assignDefaults(JOIN_DEFAULTS, _options);\n return createTransform(NAME$i, async document => {\n const root = document.getRoot();\n const logger = document.getLogger();\n // Join.\n for (const scene of root.listScenes()) {\n _joinLevel(document, scene, options);\n scene.traverse(node => _joinLevel(document, node, options));\n }\n // Clean up.\n if (options.cleanup) {\n await document.transform(prune({\n propertyTypes: [NODE, MESH, PRIMITIVE, ACCESSOR],\n keepAttributes: true,\n keepIndices: true,\n keepLeaves: false\n }));\n }\n logger.debug(`${NAME$i}: Complete.`);\n });\n}\nfunction _joinLevel(document, parent, options) {\n const logger = document.getLogger();\n const groups = {};\n // Scan for compatible Primitives.\n const children = parent.listChildren();\n for (let nodeIndex = 0; nodeIndex < children.length; nodeIndex++) {\n const node = children[nodeIndex];\n // Skip nodes not matching the filter.\n if (!options.filter(node)) continue;\n // Skip animated nodes.\n const isAnimated = node.listParents().some(p => p instanceof AnimationChannel);\n if (isAnimated) continue;\n // Skip nodes without meshes.\n const mesh = node.getMesh();\n if (!mesh) continue;\n // Skip nodes with instancing; unsupported.\n if (node.getExtension('EXT_mesh_gpu_instancing')) continue;\n // Skip nodes with skinning; unsupported.\n if (node.getSkin()) continue;\n for (const prim of mesh.listPrimitives()) {\n // Skip prims with morph targets; unsupported.\n if (prim.listTargets().length > 0) continue;\n // Skip prims with volumetric materials; unsupported.\n const material = prim.getMaterial();\n if (material && material.getExtension('KHR_materials_volume')) continue;\n compactPrimitive(prim);\n dequantizeTransformableAttributes(prim);\n let key = createPrimGroupKey(prim);\n const isNamed = mesh.getName() || node.getName();\n if (options.keepMeshes || options.keepNamed && isNamed) {\n key += `|${nodeIndex}`;\n }\n if (!(key in groups)) {\n groups[key] = {\n prims: [],\n primMeshes: [],\n primNodes: [],\n dstNode: node,\n dstMesh: undefined\n };\n }\n const group = groups[key];\n group.prims.push(prim);\n group.primNodes.push(node);\n }\n }\n // Discard single-Primitive groups.\n const joinGroups = Object.values(groups).filter(({\n prims\n }) => prims.length > 1);\n // Unlink all affected Meshes at current level, before modifying Primitives.\n const srcNodes = new Set(joinGroups.flatMap(group => group.primNodes));\n for (const node of srcNodes) {\n const mesh = node.getMesh();\n const isSharedMesh = mesh.listParents().some(parent => {\n return parent.propertyType !== ROOT && node !== parent;\n });\n if (isSharedMesh) {\n node.setMesh(mesh.clone());\n }\n }\n // Update Meshes in groups.\n for (const group of joinGroups) {\n const {\n dstNode,\n primNodes\n } = group;\n group.dstMesh = dstNode.getMesh();\n group.primMeshes = primNodes.map(node => node.getMesh());\n }\n // Join Primitives.\n for (const group of joinGroups) {\n const {\n prims,\n primNodes,\n primMeshes,\n dstNode,\n dstMesh\n } = group;\n const dstMatrix = dstNode.getMatrix();\n for (let i = 0; i < prims.length; i++) {\n const primNode = primNodes[i];\n const primMesh = primMeshes[i];\n let prim = prims[i];\n primMesh.removePrimitive(prim);\n // If Primitive is still in use after being removed from the\n // current mesh, above, make a deep copy. Because compactPrimitive()\n // was applied earlier in join(), we know the full vertex streams are\n // used, and no accessors are shared.\n if (isUsed(prim)) {\n prim = prims[i] = _deepClonePrimitive(prims[i]);\n }\n // Transform Primitive into new local coordinate space.\n if (primNode !== dstNode) {\n multiply$2(_matrix, invert$1(_matrix, dstMatrix), primNode.getMatrix());\n transformPrimitive(prim, _matrix);\n }\n }\n const dstPrim = joinPrimitives(prims);\n const dstVertexCount = dstPrim.listAttributes()[0].getCount();\n dstMesh.addPrimitive(dstPrim);\n logger.debug(`${NAME$i}: Joined Primitives (${prims.length}) containing ` + `${formatLong(dstVertexCount)} vertices under Node \"${dstNode.getName()}\".`);\n }\n}\nfunction _deepClonePrimitive(src) {\n // compactPrimitive already applied; no vertices are unused.\n const dst = src.clone();\n for (const semantic of dst.listSemantics()) {\n dst.setAttribute(semantic, dst.getAttribute(semantic).clone());\n }\n const indices = dst.getIndices();\n if (indices) dst.setIndices(indices.clone());\n return dst;\n}\n/**\n * Dequantize attributes that would be affected by {@link transformPrimitive},\n * to avoid invalidating our primitive group keys.\n *\n * See: https://github.com/donmccurdy/glTF-Transform/issues/844\n */\nfunction dequantizeTransformableAttributes(prim) {\n for (const semantic of ['POSITION', 'NORMAL', 'TANGENT']) {\n const attribute = prim.getAttribute(semantic);\n if (attribute) dequantizeAttribute(attribute);\n }\n}\n\n/**\n * Returns a list of {@link TextureChannel TextureChannels} used by the given\n * texture. Determination is based only on the _role_ of the textures, e.g.\n * a texture used for the `occlusionTexture` will have (at least) a red channel\n * in use. See {@link getTextureChannelMask} for bitmask alternative.\n *\n * Example:\n *\n * ```js\n * const channels = listTextureChannels(texture);\n * if (channels.includes(TextureChannel.R)) {\n * console.log('texture red channel used');\n * }\n * ```\n */\nfunction listTextureChannels(texture) {\n const mask = getTextureChannelMask(texture);\n const channels = [];\n if (mask & TextureChannel.R) channels.push(TextureChannel.R);\n if (mask & TextureChannel.G) channels.push(TextureChannel.G);\n if (mask & TextureChannel.B) channels.push(TextureChannel.B);\n if (mask & TextureChannel.A) channels.push(TextureChannel.A);\n return channels;\n}\n/**\n * Returns bitmask of all {@link TextureChannel TextureChannels} used by the\n * given texture. Determination is based only on the _role_ of the textures, e.g.\n * a texture used for the `occlusionTexture` will have (at least) a red channel.\n * See {@link listTextureChannels} for an array alternative.\n *\n * Example:\n *\n * ```js\n * const mask = getTextureChannelMask(texture);\n * if (mask & TextureChannel.R) {\n * console.log('texture red channel used');\n * }\n * ```\n */\nfunction getTextureChannelMask(texture) {\n const document = Document.fromGraph(texture.getGraph());\n let mask = 0x0000;\n for (const edge of document.getGraph().listParentEdges(texture)) {\n const parent = edge.getParent();\n let {\n channels\n } = edge.getAttributes();\n if (channels && edge.getName() === 'baseColorTexture' && parent instanceof Material && parent.getAlphaMode() === Material.AlphaMode.OPAQUE) {\n channels &= ~TextureChannel.A;\n }\n if (channels) {\n mask |= channels;\n continue;\n }\n if (parent.propertyType !== PropertyType.ROOT) {\n document.getLogger().warn(`Missing attribute \".channels\" on edge, \"${edge.getName()}\".`);\n }\n }\n return mask;\n}\n\nconst NAME$h = 'reorder';\nconst REORDER_DEFAULTS = {\n target: 'size',\n cleanup: true\n};\n/**\n * Optimizes {@link Mesh} {@link Primitive Primitives} for locality of reference. Choose whether\n * the order should be optimal for transmission size (recommended for Web) or for GPU rendering\n * performance. Requires a MeshoptEncoder instance from the Meshoptimizer library.\n *\n * Example:\n *\n * ```ts\n * import { MeshoptEncoder } from 'meshoptimizer';\n * import { reorder } from '@gltf-transform/functions';\n *\n * await MeshoptEncoder.ready;\n *\n * await document.transform(\n * \treorder({encoder: MeshoptEncoder})\n * );\n * ```\n *\n * @category Transforms\n */\nfunction reorder(_options) {\n const options = assignDefaults(REORDER_DEFAULTS, _options);\n const encoder = options.encoder;\n if (!encoder) {\n throw new Error(`${NAME$h}: encoder dependency required — install \"meshoptimizer\".`);\n }\n return createTransform(NAME$h, async document => {\n const logger = document.getLogger();\n await encoder.ready;\n const plan = createLayoutPlan(document);\n for (const srcIndices of plan.indicesToAttributes.keys()) {\n let indicesArray = srcIndices.getArray();\n if (!(indicesArray instanceof Uint32Array)) {\n indicesArray = new Uint32Array(indicesArray);\n } else {\n indicesArray = indicesArray.slice();\n }\n // Compute optimal order.\n const [remap, unique] = encoder.reorderMesh(indicesArray, plan.indicesToMode.get(srcIndices) === Primitive.Mode.TRIANGLES, options.target === 'size');\n const dstIndices = shallowCloneAccessor(document, srcIndices);\n dstIndices.setArray(unique <= 65534 ? new Uint16Array(indicesArray) : indicesArray);\n // Update affected primitives.\n for (const srcAttribute of plan.indicesToAttributes.get(srcIndices)) {\n const dstAttribute = shallowCloneAccessor(document, srcAttribute);\n compactAttribute(srcAttribute, srcIndices, remap, dstAttribute, unique);\n for (const prim of plan.indicesToPrimitives.get(srcIndices)) {\n if (prim.getIndices() === srcIndices) {\n prim.swap(srcIndices, dstIndices);\n }\n prim.swap(srcAttribute, dstAttribute);\n for (const target of prim.listTargets()) {\n target.swap(srcAttribute, dstAttribute);\n }\n }\n }\n }\n // Clean up any attributes left unused by earlier cloning.\n if (options.cleanup) {\n await document.transform(prune({\n propertyTypes: [PropertyType.ACCESSOR],\n keepAttributes: true,\n keepIndices: true\n }));\n }\n if (!plan.indicesToAttributes.size) {\n logger.warn(`${NAME$h}: No qualifying primitives found; may need to weld first.`);\n } else {\n logger.debug(`${NAME$h}: Complete.`);\n }\n });\n}\n/**\n * Constructs a plan for processing vertex streams, based on unique\n * index:attribute[] groups. Where different indices are used with the same\n * attributes, we'll end up splitting the primitives to not share attributes,\n * which appears to be consistent with the Meshopt implementation.\n *\n * @hidden\n */\nfunction createLayoutPlan(document) {\n const indicesToMode = new Map();\n const indicesToPrimitives = new SetMap();\n const indicesToAttributes = new SetMap();\n const attributesToPrimitives = new SetMap();\n for (const mesh of document.getRoot().listMeshes()) {\n for (const prim of mesh.listPrimitives()) {\n const indices = prim.getIndices();\n if (!indices) continue;\n indicesToMode.set(indices, prim.getMode());\n indicesToPrimitives.add(indices, prim);\n for (const attribute of deepListAttributes(prim)) {\n indicesToAttributes.add(indices, attribute);\n attributesToPrimitives.add(attribute, prim);\n }\n }\n }\n return {\n indicesToPrimitives,\n indicesToAttributes,\n indicesToMode,\n attributesToPrimitives\n };\n}\n\n/**\n * Sorts skinning weights from high to low, for each vertex of the input\n * {@link Primitive} or {@link PrimitiveTarget}, and normalizes the weights.\n * Optionally, uses the given 'limit' to remove least-significant joint\n * influences such that no vertex has more than 'limit' influences.\n *\n * Most realtime engines support a limited number of joint influences per vertex,\n * often 4 or 8. Sorting and removing the additional influences can reduce file\n * size and improve compatibility.\n *\n * Example:\n *\n * ```javascript\n * import { sortPrimitiveWeights } from '@gltf-transform/functions';\n *\n * const limit = 4;\n * for (const mesh of document.getRoot().listMeshes()) {\n * \tfor (const prim of mesh.listPrimitives()) {\n * \t\tsortPrimitiveWeights(prim, limit);\n * \t}\n * }\n * ```\n *\n * @param prim Input, to be modified in place.\n * @param limit Maximum number of joint influences per vertex. Must be a multiple of four.\n */\nfunction sortPrimitiveWeights(prim, limit = Infinity) {\n if (Number.isFinite(limit) && limit % 4 || limit <= 0) {\n throw new Error(`Limit must be positive multiple of four.`);\n }\n const vertexCount = prim.getAttribute('POSITION').getCount();\n const setCount = prim.listSemantics().filter(name => name.startsWith('WEIGHTS_')).length;\n // (1) Sort.\n const indices = new Uint16Array(setCount * 4);\n const srcWeights = new Float32Array(setCount * 4);\n const dstWeights = new Float32Array(setCount * 4);\n const srcJoints = new Uint32Array(setCount * 4);\n const dstJoints = new Uint32Array(setCount * 4);\n for (let i = 0; i < vertexCount; i++) {\n getVertexArray(prim, i, 'WEIGHTS', srcWeights);\n getVertexArray(prim, i, 'JOINTS', srcJoints);\n // Sort indices to create a lookup table, indices[dstIndex] → srcIndex,\n // indexed into the weights and joints arrays.\n for (let j = 0; j < setCount * 4; j++) indices[j] = j;\n indices.sort((a, b) => srcWeights[a] > srcWeights[b] ? -1 : 1);\n // Sort weights and joints.\n for (let j = 0; j < indices.length; j++) {\n dstWeights[j] = srcWeights[indices[j]];\n dstJoints[j] = srcJoints[indices[j]];\n }\n setVertexArray(prim, i, 'WEIGHTS', dstWeights);\n setVertexArray(prim, i, 'JOINTS', dstJoints);\n }\n // (2) Limit.\n for (let i = setCount; i * 4 > limit; i--) {\n const weights = prim.getAttribute(`WEIGHTS_${i - 1}`);\n const joints = prim.getAttribute(`JOINTS_${i - 1}`);\n prim.setAttribute(`WEIGHTS_${i - 1}`, null);\n prim.setAttribute(`JOINTS_${i - 1}`, null);\n if (weights.listParents().length === 1) weights.dispose();\n if (joints.listParents().length === 1) joints.dispose();\n }\n // (3) Normalize.\n normalizePrimitiveWeights(prim);\n}\nfunction normalizePrimitiveWeights(prim) {\n // TODO(feat): Convert attributes to same component types when necessary.\n if (!isNormalizeSafe(prim)) return;\n const vertexCount = prim.getAttribute('POSITION').getCount();\n const setCount = prim.listSemantics().filter(name => name.startsWith('WEIGHTS_')).length;\n const templateAttribute = prim.getAttribute('WEIGHTS_0');\n const templateArray = templateAttribute.getArray();\n const componentType = templateAttribute.getComponentType();\n const normalized = templateAttribute.getNormalized();\n const normalizedComponentType = normalized ? componentType : undefined;\n const delta = normalized ? MathUtils.decodeNormalizedInt(1, componentType) : Number.EPSILON;\n const joints = new Uint32Array(setCount * 4).fill(0);\n const weights = templateArray.slice(0, setCount * 4).fill(0);\n for (let i = 0; i < vertexCount; i++) {\n getVertexArray(prim, i, 'JOINTS', joints);\n getVertexArray(prim, i, 'WEIGHTS', weights, normalizedComponentType);\n let weightsSum = sum(weights, normalizedComponentType);\n if (weightsSum !== 0 && weightsSum !== 1) {\n // (1) If sum of weights not within δ of 1, renormalize all weights.\n if (Math.abs(1 - weightsSum) > delta) {\n for (let j = 0; j < weights.length; j++) {\n if (normalized) {\n const floatValue = MathUtils.decodeNormalizedInt(weights[j], componentType);\n weights[j] = MathUtils.encodeNormalizedInt(floatValue / weightsSum, componentType);\n } else {\n weights[j] /= weightsSum;\n }\n }\n }\n weightsSum = sum(weights, normalizedComponentType);\n // (2) Sum of normalized weights may still be off by δ. Compensate\n // in least-significant weight.\n if (normalized && weightsSum !== 1) {\n for (let j = weights.length - 1; j >= 0; j--) {\n if (weights[j] > 0) {\n // Normalized integer encoding will clamp negative values, so separate the sign.\n const _delta = 1 - weightsSum;\n weights[j] += Math.sign(_delta) * MathUtils.encodeNormalizedInt(Math.abs(_delta), componentType);\n break;\n }\n }\n }\n }\n // (3) Remove joint indices whose weights have fallen to zero.\n for (let j = weights.length - 1; j >= 0; j--) {\n if (weights[j] === 0) {\n joints[j] = 0;\n }\n }\n setVertexArray(prim, i, 'JOINTS', joints);\n setVertexArray(prim, i, 'WEIGHTS', weights, normalizedComponentType);\n }\n}\n/** Lists all values of a multi-set vertex attribute (WEIGHTS_#, ...) for given vertex. */\nfunction getVertexArray(prim, vertexIndex, prefix, target, normalizedComponentType) {\n let weights;\n const el = [0, 0, 0, 0];\n for (let i = 0; weights = prim.getAttribute(`${prefix}_${i}`); i++) {\n weights.getElement(vertexIndex, el);\n for (let j = 0; j < 4; j++) {\n if (normalizedComponentType) {\n target[i * 4 + j] = MathUtils.encodeNormalizedInt(el[j], normalizedComponentType);\n } else {\n target[i * 4 + j] = el[j];\n }\n }\n }\n return target;\n}\n/** Sets all values of a multi-set vertex attribute (WEIGHTS_#, ...) for given vertex. */\nfunction setVertexArray(prim, vertexIndex, prefix, values, normalizedComponentType) {\n let weights;\n const el = [0, 0, 0, 0];\n for (let i = 0; weights = prim.getAttribute(`${prefix}_${i}`); i++) {\n for (let j = 0; j < 4; j++) {\n if (normalizedComponentType) {\n el[j] = MathUtils.decodeNormalizedInt(values[i * 4 + j], normalizedComponentType);\n } else {\n el[j] = values[i * 4 + j];\n }\n }\n weights.setElement(vertexIndex, el);\n }\n}\n/** Sum an array of numbers. */\nfunction sum(values, normalizedComponentType) {\n let sum = 0;\n for (let i = 0; i < values.length; i++) {\n if (normalizedComponentType) {\n sum += MathUtils.decodeNormalizedInt(values[i], normalizedComponentType);\n } else {\n sum += values[i];\n }\n }\n return sum;\n}\n/** Returns true if attribute normalization is supported for this primitive. */\nfunction isNormalizeSafe(prim) {\n const attributes = prim.listSemantics().filter(name => name.startsWith('WEIGHTS_')).map(name => prim.getAttribute(name));\n const normList = attributes.map(a => a.getNormalized());\n const typeList = attributes.map(a => a.getComponentType());\n return new Set(normList).size === 1 && new Set(typeList).size === 1;\n}\n\nconst NAME$g = 'quantize';\nconst SIGNED_INT = [Int8Array, Int16Array, Int32Array];\nconst {\n TRANSLATION,\n ROTATION,\n SCALE,\n WEIGHTS\n} = AnimationChannel.TargetPath;\nconst TRS_CHANNELS = [TRANSLATION, ROTATION, SCALE];\nconst QUANTIZE_DEFAULTS = {\n pattern: /.*/,\n quantizationVolume: 'mesh',\n quantizePosition: 14,\n quantizeNormal: 10,\n quantizeTexcoord: 12,\n quantizeColor: 8,\n quantizeWeight: 8,\n quantizeGeneric: 12,\n normalizeWeights: true,\n cleanup: true\n};\n/**\n * References:\n * - https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n * - http://www.aclockworkberry.com/normal-unpacking-quantization-errors/\n * - https://www.mathworks.com/help/dsp/ref/uniformencoder.html\n * - https://oroboro.com/compressed-unit-vectors/\n */\n/**\n * Quantizes vertex attributes with `KHR_mesh_quantization`, reducing the size and memory footprint\n * of the file. Conceptually, quantization refers to snapping values to regular intervals; vertex\n * positions are snapped to a 3D grid, UVs to a 2D grid, and so on. When quantized to <= 16 bits,\n * larger component types may be more compactly stored as 16-bit or 8-bit attributes.\n *\n * Often, it can be useful to quantize to precision lower than the maximum allowed by the component\n * type. Positions quantized to 14 bits in a 16-bit accessor will occupy 16 bits in VRAM, but they\n * can be compressed further for network compression with lossless encodings such as ZSTD.\n *\n * Vertex positions are shifted into [-1,1] or [0,1] range before quantization. Compensating for\n * that shift, a transform is applied to the parent {@link Node}, or inverse bind matrices for a\n * {@link Skin} if applicable. Materials using {@link KHRMaterialsVolume} are adjusted to maintain\n * appearance. In future releases, UVs may also be transformed with {@link KHRTextureTransform}.\n * Currently UVs outside of [0,1] range are not quantized.\n *\n * In most cases, quantization requires {@link KHRMeshQuantization}; the extension will be added\n * automatically when `quantize()` is applied. When applying meshopt compression with\n * {@link EXTMeshoptCompression}, quantization is usually applied before compression.\n *\n * Example:\n *\n * ```javascript\n * import { quantize } from '@gltf-transform/functions';\n *\n * await document.transform(\n * quantize({\n *\t\tquantizePosition: 14,\n *\t\tquantizeNormal: 10,\n * }),\n * );\n * ```\n *\n * For the inverse operation, see {@link dequantize}.\n *\n * @category Transforms\n */\nfunction quantize(_options = QUANTIZE_DEFAULTS) {\n const options = assignDefaults(QUANTIZE_DEFAULTS, _extends({\n patternTargets: _options.pattern || QUANTIZE_DEFAULTS.pattern\n }, _options));\n return createTransform(NAME$g, async document => {\n const logger = document.getLogger();\n const root = document.getRoot();\n // Compute vertex position quantization volume.\n let nodeTransform = undefined;\n if (options.quantizationVolume === 'scene') {\n nodeTransform = getNodeTransform(expandBounds(root.listMeshes().map(getPositionQuantizationVolume)));\n }\n // Quantize mesh primitives.\n for (const mesh of document.getRoot().listMeshes()) {\n if (options.quantizationVolume === 'mesh') {\n nodeTransform = getNodeTransform(getPositionQuantizationVolume(mesh));\n }\n if (nodeTransform && options.pattern.test('POSITION')) {\n transformMeshParents(document, mesh, nodeTransform);\n transformMeshMaterials(mesh, 1 / nodeTransform.scale);\n }\n for (const prim of mesh.listPrimitives()) {\n const renderCount = getPrimitiveVertexCount(prim, VertexCountMethod.RENDER);\n const uploadCount = getPrimitiveVertexCount(prim, VertexCountMethod.UPLOAD);\n if (renderCount < uploadCount / 2) {\n compactPrimitive(prim);\n }\n quantizePrimitive(document, prim, nodeTransform, options);\n for (const target of prim.listTargets()) {\n quantizePrimitive(document, target, nodeTransform, options);\n }\n }\n }\n const needsExtension = root.listMeshes().flatMap(mesh => mesh.listPrimitives()).some(isQuantizedPrimitive);\n if (needsExtension) {\n document.createExtension(KHRMeshQuantization).setRequired(true);\n }\n if (options.cleanup) {\n await document.transform(prune({\n propertyTypes: [PropertyType.ACCESSOR, PropertyType.SKIN, PropertyType.MATERIAL],\n keepAttributes: true,\n keepIndices: true,\n keepLeaves: true,\n keepSolidTextures: true\n }), dedup({\n propertyTypes: [PropertyType.ACCESSOR, PropertyType.MATERIAL, PropertyType.SKIN],\n keepUniqueNames: true\n }));\n }\n logger.debug(`${NAME$g}: Complete.`);\n });\n}\nfunction quantizePrimitive(document, prim, nodeTransform, options) {\n const isTarget = prim instanceof PrimitiveTarget;\n const logger = document.getLogger();\n for (const semantic of prim.listSemantics()) {\n if (!isTarget && !options.pattern.test(semantic)) continue;\n if (isTarget && !options.patternTargets.test(semantic)) continue;\n const srcAttribute = prim.getAttribute(semantic);\n const {\n bits,\n ctor\n } = getQuantizationSettings(semantic, srcAttribute, logger, options);\n if (!ctor) continue;\n if (bits < 8 || bits > 16) throw new Error(`${NAME$g}: Requires bits = 8–16.`);\n if (srcAttribute.getComponentSize() <= bits / 8) continue;\n const dstAttribute = srcAttribute.clone();\n // Remap position data.\n if (semantic === 'POSITION') {\n const scale = nodeTransform.scale;\n const transform = [];\n // Morph targets are relative offsets, don't translate them.\n prim instanceof Primitive ? invert$1(transform, fromTransform(nodeTransform)) : fromScaling(transform, [1 / scale, 1 / scale, 1 / scale]);\n for (let i = 0, el = [0, 0, 0], il = dstAttribute.getCount(); i < il; i++) {\n dstAttribute.getElement(i, el);\n dstAttribute.setElement(i, transformMat4(el, el, transform));\n }\n }\n // Quantize the vertex attribute.\n quantizeAttribute(dstAttribute, ctor, bits);\n prim.setAttribute(semantic, dstAttribute);\n }\n // Normalize skinning weights.\n if (options.normalizeWeights && prim.getAttribute('WEIGHTS_0')) {\n sortPrimitiveWeights(prim, Infinity);\n }\n if (prim instanceof Primitive && prim.getIndices() && prim.listAttributes().length && prim.listAttributes()[0].getCount() < 65535) {\n const indices = prim.getIndices();\n indices.setArray(new Uint16Array(indices.getArray()));\n }\n}\n/** Computes node quantization transforms in local space. */\nfunction getNodeTransform(volume) {\n const {\n min,\n max\n } = volume;\n // Scaling factor transforms [-1,1] box to the mesh AABB in local space.\n // See: https://github.com/donmccurdy/glTF-Transform/issues/328\n const scale = Math.max((max[0] - min[0]) / 2,\n // Divide because interval [-1,1] has length 2.\n (max[1] - min[1]) / 2, (max[2] - min[2]) / 2);\n // Original center of the mesh, in local space.\n const offset = [min[0] + (max[0] - min[0]) / 2, min[1] + (max[1] - min[1]) / 2, min[2] + (max[2] - min[2]) / 2];\n return {\n offset,\n scale\n };\n}\n/** Applies corrective scale and offset to nodes referencing a quantized Mesh. */\nfunction transformMeshParents(document, mesh, nodeTransform) {\n const transformMatrix = fromTransform(nodeTransform);\n for (const parent of mesh.listParents()) {\n if (!(parent instanceof Node)) continue;\n const animChannels = parent.listParents().filter(p => p instanceof AnimationChannel);\n const isAnimated = animChannels.some(channel => TRS_CHANNELS.includes(channel.getTargetPath()));\n const isParentNode = parent.listChildren().length > 0;\n const skin = parent.getSkin();\n if (skin) {\n parent.setSkin(transformSkin(skin, nodeTransform));\n continue;\n }\n const batch = parent.getExtension('EXT_mesh_gpu_instancing');\n if (batch) {\n parent.setExtension('EXT_mesh_gpu_instancing', transformBatch(document, batch, nodeTransform));\n continue;\n }\n let targetNode;\n if (isParentNode || isAnimated) {\n targetNode = document.createNode('').setMesh(mesh);\n parent.addChild(targetNode).setMesh(null);\n animChannels.filter(channel => channel.getTargetPath() === WEIGHTS).forEach(channel => channel.setTargetNode(targetNode));\n } else {\n targetNode = parent;\n }\n const nodeMatrix = targetNode.getMatrix();\n multiply$2(nodeMatrix, nodeMatrix, transformMatrix);\n targetNode.setMatrix(nodeMatrix);\n }\n}\n/** Applies corrective scale and offset to skin IBMs. */\nfunction transformSkin(skin, nodeTransform) {\n skin = skin.clone(); // quantize() does cleanup.\n const transformMatrix = fromTransform(nodeTransform);\n const inverseBindMatrices = skin.getInverseBindMatrices().clone();\n const ibm = [];\n for (let i = 0, count = inverseBindMatrices.getCount(); i < count; i++) {\n inverseBindMatrices.getElement(i, ibm);\n multiply$2(ibm, ibm, transformMatrix);\n inverseBindMatrices.setElement(i, ibm);\n }\n return skin.setInverseBindMatrices(inverseBindMatrices);\n}\n/** Applies corrective scale and offset to GPU instancing batches. */\nfunction transformBatch(document, batch, nodeTransform) {\n var _batch$getAttribute, _batch$getAttribute2, _batch$getAttribute3;\n if (!batch.getAttribute('TRANSLATION') && !batch.getAttribute('ROTATION') && !batch.getAttribute('SCALE')) {\n return batch;\n }\n batch = batch.clone(); // quantize() does cleanup.\n let instanceTranslation = (_batch$getAttribute = batch.getAttribute('TRANSLATION')) == null ? void 0 : _batch$getAttribute.clone();\n const instanceRotation = (_batch$getAttribute2 = batch.getAttribute('ROTATION')) == null ? void 0 : _batch$getAttribute2.clone();\n let instanceScale = (_batch$getAttribute3 = batch.getAttribute('SCALE')) == null ? void 0 : _batch$getAttribute3.clone();\n const tpl = instanceTranslation || instanceRotation || instanceScale;\n const T_IDENTITY = [0, 0, 0];\n const R_IDENTITY = [0, 0, 0, 1];\n const S_IDENTITY = [1, 1, 1];\n // Transformed batch may now require instance translation or scale.\n // See: https://github.com/donmccurdy/glTF-Transform/issues/1584\n if (!instanceTranslation && nodeTransform.offset) {\n instanceTranslation = document.createAccessor().setType('VEC3').setArray(makeArray(tpl.getCount(), T_IDENTITY));\n }\n if (!instanceScale && nodeTransform.scale) {\n instanceScale = document.createAccessor().setType('VEC3').setArray(makeArray(tpl.getCount(), S_IDENTITY));\n }\n const t = [0, 0, 0];\n const r = [0, 0, 0, 1];\n const s = [1, 1, 1];\n // biome-ignore format: Readability.\n const instanceMatrix = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n const transformMatrix = fromTransform(nodeTransform);\n for (let i = 0, count = tpl.getCount(); i < count; i++) {\n MathUtils.compose(instanceTranslation ? instanceTranslation.getElement(i, t) : T_IDENTITY, instanceRotation ? instanceRotation.getElement(i, r) : R_IDENTITY, instanceScale ? instanceScale.getElement(i, s) : S_IDENTITY, instanceMatrix);\n multiply$2(instanceMatrix, instanceMatrix, transformMatrix);\n MathUtils.decompose(instanceMatrix, t, r, s);\n if (instanceTranslation) instanceTranslation.setElement(i, t);\n if (instanceRotation) instanceRotation.setElement(i, r);\n if (instanceScale) instanceScale.setElement(i, s);\n }\n if (instanceTranslation) batch.setAttribute('TRANSLATION', instanceTranslation);\n if (instanceRotation) batch.setAttribute('ROTATION', instanceRotation);\n if (instanceScale) batch.setAttribute('SCALE', instanceScale);\n return batch;\n}\n/** Applies corrective scale to volumetric materials, which give thickness in local units. */\nfunction transformMeshMaterials(mesh, scale) {\n for (const prim of mesh.listPrimitives()) {\n let material = prim.getMaterial();\n if (!material) continue;\n let volume = material.getExtension('KHR_materials_volume');\n if (!volume || volume.getThicknessFactor() <= 0) continue;\n // quantize() does cleanup.\n volume = volume.clone().setThicknessFactor(volume.getThicknessFactor() * scale);\n material = material.clone().setExtension('KHR_materials_volume', volume);\n prim.setMaterial(material);\n }\n}\n/**\n * Quantizes an attribute to the given parameters.\n *\n * Uniformly remap 32-bit floats to reduced-precision 8- or 16-bit integers, so\n * that there are only 2^N unique values, for N within [8, 16].\n *\n * See: https://github.com/donmccurdy/glTF-Transform/issues/208\n */\nfunction quantizeAttribute(attribute, ctor, bits) {\n const dstArray = new ctor(attribute.getArray().length);\n const signBits = SIGNED_INT.includes(ctor) ? 1 : 0;\n const quantBits = bits - signBits;\n const storageBits = ctor.BYTES_PER_ELEMENT * 8 - signBits;\n const scale = Math.pow(2, quantBits) - 1;\n const lo = storageBits - quantBits;\n const hi = 2 * quantBits - storageBits;\n const range = [signBits > 0 ? -1 : 0, 1];\n for (let i = 0, di = 0, el = []; i < attribute.getCount(); i++) {\n attribute.getElement(i, el);\n for (let j = 0; j < el.length; j++) {\n // Clamp to range.\n let value = clamp(el[j], range);\n // Map [0.0 ... 1.0] to [0 ... scale].\n value = Math.round(Math.abs(value) * scale);\n // Replicate msb to missing lsb.\n value = value << lo | value >> hi;\n // Restore sign.\n dstArray[di++] = value * Math.sign(el[j]);\n }\n }\n // TODO(feat): Support sparse accessors, https://github.com/donmccurdy/glTF-Transform/issues/795\n attribute.setArray(dstArray).setNormalized(true).setSparse(false);\n}\nfunction getQuantizationSettings(semantic, attribute, logger, options) {\n const min = attribute.getMinNormalized([]);\n const max = attribute.getMaxNormalized([]);\n let bits;\n let ctor;\n if (semantic === 'POSITION') {\n bits = options.quantizePosition;\n ctor = bits <= 8 ? Int8Array : Int16Array;\n } else if (semantic === 'NORMAL' || semantic === 'TANGENT') {\n bits = options.quantizeNormal;\n ctor = bits <= 8 ? Int8Array : Int16Array;\n } else if (semantic.startsWith('COLOR_')) {\n bits = options.quantizeColor;\n ctor = bits <= 8 ? Uint8Array : Uint16Array;\n } else if (semantic.startsWith('TEXCOORD_')) {\n if (min.some(v => v < 0) || max.some(v => v > 1)) {\n logger.warn(`${NAME$g}: Skipping ${semantic}; out of [0,1] range.`);\n return {\n bits: -1\n };\n }\n bits = options.quantizeTexcoord;\n ctor = bits <= 8 ? Uint8Array : Uint16Array;\n } else if (semantic.startsWith('JOINTS_')) {\n bits = Math.max(...attribute.getMax([])) <= 255 ? 8 : 16;\n ctor = bits <= 8 ? Uint8Array : Uint16Array;\n if (attribute.getComponentSize() > bits / 8) {\n attribute.setArray(new ctor(attribute.getArray()));\n }\n return {\n bits: -1\n };\n } else if (semantic.startsWith('WEIGHTS_')) {\n if (min.some(v => v < 0) || max.some(v => v > 1)) {\n logger.warn(`${NAME$g}: Skipping ${semantic}; out of [0,1] range.`);\n return {\n bits: -1\n };\n }\n bits = options.quantizeWeight;\n ctor = bits <= 8 ? Uint8Array : Uint16Array;\n } else if (semantic.startsWith('_')) {\n if (min.some(v => v < -1) || max.some(v => v > 1)) {\n logger.warn(`${NAME$g}: Skipping ${semantic}; out of [-1,1] range.`);\n return {\n bits: -1\n };\n }\n bits = options.quantizeGeneric;\n ctor = min.some(v => v < 0) ? ctor = bits <= 8 ? Int8Array : Int16Array : ctor = bits <= 8 ? Uint8Array : Uint16Array;\n } else {\n throw new Error(`${NAME$g}: Unexpected semantic, \"${semantic}\".`);\n }\n return {\n bits,\n ctor\n };\n}\nfunction getPositionQuantizationVolume(mesh) {\n const positions = [];\n const relativePositions = [];\n for (const prim of mesh.listPrimitives()) {\n const attribute = prim.getAttribute('POSITION');\n if (attribute) positions.push(attribute);\n for (const target of prim.listTargets()) {\n const _attribute = target.getAttribute('POSITION');\n if (_attribute) relativePositions.push(_attribute);\n }\n }\n if (positions.length === 0) {\n throw new Error(`${NAME$g}: Missing \"POSITION\" attribute.`);\n }\n const bbox = flatBounds(positions, 3);\n // Morph target quantization volume is computed differently. First, ensure that the origin\n // <0, 0, 0> is in the quantization volume. Because we can't offset target positions (they're\n // relative deltas), default remapping will only map to a [-2, 2] AABB. Double the bounding box\n // to ensure scaling puts them within a [-1, 1] AABB instead.\n if (relativePositions.length > 0) {\n const {\n min: relMin,\n max: relMax\n } = flatBounds(relativePositions, 3);\n min(bbox.min, bbox.min, min(relMin, scale$1(relMin, relMin, 2), [0, 0, 0]));\n max(bbox.max, bbox.max, max(relMax, scale$1(relMax, relMax, 2), [0, 0, 0]));\n }\n return bbox;\n}\nfunction isQuantizedAttribute(semantic, attribute) {\n // https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#meshes-overview\n const componentSize = attribute.getComponentSize();\n if (semantic === 'POSITION') return componentSize < 4;\n if (semantic === 'NORMAL') return componentSize < 4;\n if (semantic === 'TANGENT') return componentSize < 4;\n if (semantic.startsWith('TEXCOORD_')) {\n const componentType = attribute.getComponentType();\n const normalized = attribute.getNormalized();\n return componentSize < 4 && !(normalized && componentType === Accessor.ComponentType.UNSIGNED_BYTE) && !(normalized && componentType === Accessor.ComponentType.UNSIGNED_SHORT);\n }\n return false;\n}\nfunction isQuantizedPrimitive(prim) {\n for (const semantic of prim.listSemantics()) {\n const attribute = prim.getAttribute('POSITION');\n if (isQuantizedAttribute(semantic, attribute)) {\n return true;\n }\n }\n if (prim.propertyType === PropertyType.PRIMITIVE) {\n return prim.listTargets().some(isQuantizedPrimitive);\n }\n return false;\n}\n/** Computes total min and max of all Accessors in a list. */\nfunction flatBounds(accessors, elementSize) {\n const min = new Array(elementSize).fill(Infinity);\n const max = new Array(elementSize).fill(-Infinity);\n const tmpMin = [];\n const tmpMax = [];\n for (const accessor of accessors) {\n accessor.getMinNormalized(tmpMin);\n accessor.getMaxNormalized(tmpMax);\n for (let i = 0; i < elementSize; i++) {\n min[i] = Math.min(min[i], tmpMin[i]);\n max[i] = Math.max(max[i], tmpMax[i]);\n }\n }\n return {\n min,\n max\n };\n}\nfunction expandBounds(bboxes) {\n const result = bboxes[0];\n for (const bbox of bboxes) {\n min(result.min, result.min, bbox.min);\n max(result.max, result.max, bbox.max);\n }\n return result;\n}\nfunction fromTransform(transform) {\n return fromRotationTranslationScale([], [0, 0, 0, 1], transform.offset, [transform.scale, transform.scale, transform.scale]);\n}\nfunction clamp(value, range) {\n return Math.min(Math.max(value, range[0]), range[1]);\n}\nfunction makeArray(elementCount, initialElement) {\n const elementSize = initialElement.length;\n const array = new Float32Array(elementCount * elementSize);\n for (let i = 0; i < elementCount; i++) {\n array.set(initialElement, i * elementSize);\n }\n return array;\n}\n\nconst MESHOPT_DEFAULTS = _extends({\n level: 'high'\n}, QUANTIZE_DEFAULTS);\nconst NAME$f = 'meshopt';\n/**\n * Applies Meshopt compression using {@link EXTMeshoptCompression EXT_meshopt_compression}.\n * This type of compression can reduce the size of point, line, and triangle geometry,\n * morph targets, and animation data.\n *\n * This function is a thin wrapper around {@link reorder}, {@link quantize}, and\n * {@link EXTMeshoptCompression}, and exposes relatively few configuration options.\n * To access more options (like quantization bits) direct use of the underlying\n * functions is recommended.\n *\n * Example:\n *\n * ```javascript\n * import { MeshoptEncoder } from 'meshoptimizer';\n * import { meshopt } from '@gltf-transform/functions';\n *\n * await MeshoptEncoder.ready;\n *\n * await document.transform(\n * meshopt({encoder: MeshoptEncoder, level: 'medium'})\n * );\n * ```\n *\n * Compression is deferred until generating output with an I/O class.\n *\n * @category Transforms\n */\nfunction meshopt(_options) {\n const options = assignDefaults(MESHOPT_DEFAULTS, _options);\n const encoder = options.encoder;\n if (!encoder) {\n throw new Error(`${NAME$f}: encoder dependency required — install \"meshoptimizer\".`);\n }\n return createTransform(NAME$f, async document => {\n let pattern;\n let patternTargets;\n let quantizeNormal = options.quantizeNormal;\n if (document.getRoot().listAccessors().length === 0) {\n return;\n }\n // IMPORTANT: Vertex attributes should be quantized in 'high' mode IFF they are\n // _not_ filtered in 'packages/extensions/src/ext-meshopt-compression/encoder.ts'.\n // Note that normals and tangents use octahedral filters, but _morph_ normals\n // and tangents do not.\n // See: https://github.com/donmccurdy/glTF-Transform/issues/1142\n if (options.level === 'medium') {\n pattern = /.*/;\n patternTargets = /.*/;\n } else {\n pattern = /^(POSITION|TEXCOORD|JOINTS|WEIGHTS|COLOR)(_\\d+)?$/;\n patternTargets = /^(POSITION|TEXCOORD|JOINTS|WEIGHTS|COLOR|NORMAL|TANGENT)(_\\d+)?$/;\n quantizeNormal = Math.min(quantizeNormal, 8); // See meshopt::getMeshoptFilter.\n }\n await document.transform(reorder({\n encoder: encoder,\n target: 'size'\n }), quantize(_extends({}, options, {\n pattern,\n patternTargets,\n quantizeNormal\n })));\n document.createExtension(EXTMeshoptCompression).setRequired(true).setEncoderOptions({\n method: options.level === 'medium' ? EXTMeshoptCompression.EncoderMethod.QUANTIZE : EXTMeshoptCompression.EncoderMethod.FILTER\n });\n });\n}\n\nconst NAME$e = 'metalRough';\nconst METALROUGH_DEFAULTS = {};\n/**\n * Convert {@link Material}s from spec/gloss PBR workflow to metal/rough PBR workflow,\n * removing `KHR_materials_pbrSpecularGlossiness` and adding `KHR_materials_ior` and\n * `KHR_materials_specular`. The metal/rough PBR workflow is preferred for most use cases,\n * and is a prerequisite for other advanced PBR extensions provided by glTF.\n *\n * No options are currently implemented for this function.\n *\n * @category Transforms\n */\nfunction metalRough(_options = METALROUGH_DEFAULTS) {\n return createTransform(NAME$e, async doc => {\n const logger = doc.getLogger();\n const extensionsUsed = doc.getRoot().listExtensionsUsed().map(ext => ext.extensionName);\n if (!extensionsUsed.includes('KHR_materials_pbrSpecularGlossiness')) {\n logger.warn(`${NAME$e}: KHR_materials_pbrSpecularGlossiness not found on document.`);\n return;\n }\n const iorExtension = doc.createExtension(KHRMaterialsIOR);\n const specExtension = doc.createExtension(KHRMaterialsSpecular);\n const specGlossExtension = doc.createExtension(KHRMaterialsPBRSpecularGlossiness);\n const inputTextures = new Set();\n for (const material of doc.getRoot().listMaterials()) {\n const specGloss = material.getExtension('KHR_materials_pbrSpecularGlossiness');\n if (!specGloss) continue;\n // Create specular extension.\n const specular = specExtension.createSpecular().setSpecularFactor(1.0).setSpecularColorFactor(specGloss.getSpecularFactor());\n // Stash textures that might become unused, to check and clean up later.\n inputTextures.add(specGloss.getSpecularGlossinessTexture());\n inputTextures.add(material.getBaseColorTexture());\n inputTextures.add(material.getMetallicRoughnessTexture());\n // Set up a metal/rough PBR material with IOR=Infinity (or 0), metallic=0. This\n // representation is precise and reliable, but perhaps less convenient for artists\n // than deriving a metalness value. Unfortunately we can't do that without imprecise\n // heuristics, and perhaps user tuning.\n // See: https://github.com/KhronosGroup/glTF/pull/1719#issuecomment-674365677\n material.setBaseColorFactor(specGloss.getDiffuseFactor()).setMetallicFactor(0).setRoughnessFactor(1).setExtension('KHR_materials_ior', iorExtension.createIOR().setIOR(1000)).setExtension('KHR_materials_specular', specular);\n // Move diffuse -> baseColor.\n const diffuseTexture = specGloss.getDiffuseTexture();\n if (diffuseTexture) {\n material.setBaseColorTexture(diffuseTexture);\n material.getBaseColorTextureInfo().copy(specGloss.getDiffuseTextureInfo());\n }\n // Move specular + gloss -> specular + roughness.\n const sgTexture = specGloss.getSpecularGlossinessTexture();\n if (sgTexture) {\n // specularGlossiness -> specular.\n const sgTextureInfo = specGloss.getSpecularGlossinessTextureInfo();\n const specularTexture = doc.createTexture();\n await rewriteTexture(sgTexture, specularTexture, (pixels, i, j) => {\n pixels.set(i, j, 3, 255); // Remove glossiness.\n });\n specular.setSpecularTexture(specularTexture);\n specular.setSpecularColorTexture(specularTexture);\n specular.getSpecularTextureInfo().copy(sgTextureInfo);\n specular.getSpecularColorTextureInfo().copy(sgTextureInfo);\n // specularGlossiness -> roughness.\n const glossinessFactor = specGloss.getGlossinessFactor();\n const metalRoughTexture = doc.createTexture();\n await rewriteTexture(sgTexture, metalRoughTexture, (pixels, i, j) => {\n // Invert glossiness.\n const roughness = 255 - Math.round(pixels.get(i, j, 3) * glossinessFactor);\n pixels.set(i, j, 0, 0);\n pixels.set(i, j, 1, roughness);\n pixels.set(i, j, 2, 0);\n pixels.set(i, j, 3, 255);\n });\n material.setMetallicRoughnessTexture(metalRoughTexture);\n material.getMetallicRoughnessTextureInfo().copy(sgTextureInfo);\n } else {\n specular.setSpecularColorFactor(specGloss.getSpecularFactor());\n material.setRoughnessFactor(1 - specGloss.getGlossinessFactor());\n }\n // Remove KHR_materials_pbrSpecularGlossiness from the material.\n material.setExtension('KHR_materials_pbrSpecularGlossiness', null);\n }\n // Remove KHR_materials_pbrSpecularGlossiness from the document.\n specGlossExtension.dispose();\n // Clean up unused textures.\n for (const tex of inputTextures) {\n if (tex && tex.listParents().length === 1) tex.dispose();\n }\n logger.debug(`${NAME$e}: Complete.`);\n });\n}\n\nconst NAME$d = 'unweld';\nconst UNWELD_DEFAULTS = {};\n/**\n * De-index {@link Primitive}s, disconnecting any shared vertices. This operation will generally\n * increase the number of vertices in a mesh, but may be helpful for some geometry operations or\n * for creating hard edges.\n *\n * No options are currently implemented for this function.\n *\n * @category Transforms\n */\nfunction unweld(_options = UNWELD_DEFAULTS) {\n return createTransform(NAME$d, doc => {\n const logger = doc.getLogger();\n const visited = new Map();\n for (const mesh of doc.getRoot().listMeshes()) {\n for (const prim of mesh.listPrimitives()) {\n unweldPrimitive(prim, visited);\n }\n }\n logger.debug(`${NAME$d}: Complete.`);\n });\n}\n/**\n * @hidden\n * @internal\n */\nfunction unweldPrimitive(prim, visited = new Map()) {\n const indices = prim.getIndices();\n if (!indices) return;\n const graph = prim.getGraph();\n const document = Document.fromGraph(graph);\n const logger = document.getLogger();\n const srcVertexCount = prim.getAttribute('POSITION').getCount();\n // Vertex attributes.\n for (const srcAttribute of prim.listAttributes()) {\n prim.swap(srcAttribute, unweldAttribute(document, srcAttribute, indices, visited));\n // Clean up.\n if (srcAttribute.listParents().length === 1) srcAttribute.dispose();\n }\n // Morph target vertex attributes.\n for (const target of prim.listTargets()) {\n for (const srcAttribute of target.listAttributes()) {\n target.swap(srcAttribute, unweldAttribute(document, srcAttribute, indices, visited));\n // Clean up.\n if (srcAttribute.listParents().length === 1) srcAttribute.dispose();\n }\n }\n const dstVertexCount = prim.getAttribute('POSITION').getCount();\n logger.debug(`${NAME$d}: ${formatDeltaOp(srcVertexCount, dstVertexCount)} vertices.`);\n // Clean up.\n prim.setIndices(null);\n if (indices.listParents().length === 1) indices.dispose();\n}\nfunction unweldAttribute(document, srcAttribute, indices, visited) {\n if (visited.has(srcAttribute) && visited.get(srcAttribute).has(indices)) {\n return visited.get(srcAttribute).get(indices);\n }\n const srcArray = srcAttribute.getArray();\n const TypedArray = srcArray.constructor;\n const dstArray = new TypedArray(indices.getCount() * srcAttribute.getElementSize());\n const indicesArray = indices.getArray();\n const elementSize = srcAttribute.getElementSize();\n for (let i = 0, il = indices.getCount(); i < il; i++) {\n for (let j = 0; j < elementSize; j++) {\n dstArray[i * elementSize + j] = srcArray[indicesArray[i] * elementSize + j];\n }\n }\n if (!visited.has(srcAttribute)) visited.set(srcAttribute, new Map());\n const dstAttribute = shallowCloneAccessor(document, srcAttribute).setArray(dstArray);\n visited.get(srcAttribute).set(indices, dstAttribute);\n return dstAttribute;\n}\n\nconst NAME$c = 'normals';\nconst NORMALS_DEFAULTS = {\n overwrite: false\n};\n/**\n * Generates flat vertex normals for mesh primitives.\n *\n * Example:\n *\n * ```ts\n * import { normals } from '@gltf-transform/functions';\n *\n * await document.transform(normals({overwrite: true}));\n * ```\n *\n * @category Transforms\n */\nfunction normals(_options = NORMALS_DEFAULTS) {\n const options = assignDefaults(NORMALS_DEFAULTS, _options);\n return createTransform(NAME$c, async document => {\n const logger = document.getLogger();\n let modified = 0;\n await document.transform(unweld());\n for (const mesh of document.getRoot().listMeshes()) {\n for (const prim of mesh.listPrimitives()) {\n const position = prim.getAttribute('POSITION');\n let normal = prim.getAttribute('NORMAL');\n if (options.overwrite && normal) {\n normal.dispose();\n } else if (normal) {\n logger.debug(`${NAME$c}: Skipping primitive: NORMAL found.`);\n continue;\n }\n normal = document.createAccessor().setArray(new Float32Array(position.getCount() * 3)).setType('VEC3');\n const a = [0, 0, 0];\n const b = [0, 0, 0];\n const c = [0, 0, 0];\n for (let i = 0; i < position.getCount(); i += 3) {\n position.getElement(i + 0, a);\n position.getElement(i + 1, b);\n position.getElement(i + 2, c);\n const faceNormal = computeNormal(a, b, c);\n normal.setElement(i + 0, faceNormal);\n normal.setElement(i + 1, faceNormal);\n normal.setElement(i + 2, faceNormal);\n }\n prim.setAttribute('NORMAL', normal);\n modified++;\n }\n }\n if (!modified) {\n logger.warn(`${NAME$c}: No qualifying primitives found. See debug output.`);\n } else {\n logger.debug(`${NAME$c}: Complete.`);\n }\n });\n}\n// https://stackoverflow.com/a/23709352/1314762\nfunction computeNormal(a, b, c) {\n const A = [b[0] - a[0], b[1] - a[1], b[2] - a[2]];\n const B = [c[0] - a[0], c[1] - a[1], c[2] - a[2]];\n const n = [A[1] * B[2] - A[2] * B[1],\n //\n A[2] * B[0] - A[0] * B[2], A[0] * B[1] - A[1] * B[0]];\n return normalize([0, 0, 0], n);\n}\n\nconst NAME$b = 'palette';\nconst PALETTE_DEFAULTS = {\n blockSize: 4,\n min: 5,\n keepAttributes: false,\n cleanup: true\n};\n/**\n * Creates palette textures containing all unique values of scalar\n * {@link Material} properties within the scene, then merges materials. For\n * scenes with many solid-colored materials (often found in CAD, architectural,\n * or low-poly styles), texture palettes can reduce the number of materials\n * used, and significantly increase the number of {@link Mesh} objects eligible\n * for {@link join} operations.\n *\n * Materials already containing texture coordinates (UVs) are not eligible for\n * texture palette optimizations. Currently only a material's base color,\n * alpha, emissive factor, metallic factor, and roughness factor are converted\n * to palette textures.\n *\n * Example:\n *\n * ```typescript\n * import { palette, flatten, dequantize, join } from '@gltf-transform/functions';\n *\n * await document.transform(\n * \tpalette({ min: 5 }),\n * \tflatten(),\n * \tdequantize(),\n * \tjoin()\n * );\n * ```\n *\n * The illustration below shows a typical base color palette texture:\n *\n * <img\n * \tsrc=\"/media/functions/palette.png\"\n * \talt=\"Row of colored blocks\"\n * \tstyle=\"width: 100%; max-width: 320px; image-rendering: pixelated;\">\n *\n * @category Transforms\n */\nfunction palette(_options = PALETTE_DEFAULTS) {\n const options = assignDefaults(PALETTE_DEFAULTS, _options);\n const blockSize = Math.max(options.blockSize, 1);\n const min = Math.max(options.min, 1);\n return createTransform(NAME$b, async document => {\n const logger = document.getLogger();\n const root = document.getRoot();\n // Find and remove unused TEXCOORD_n attributes.\n if (!options.keepAttributes) {\n await document.transform(prune({\n propertyTypes: [PropertyType.ACCESSOR],\n keepAttributes: false,\n keepIndices: true,\n keepLeaves: true\n }));\n }\n const prims = new Set();\n const materials = new Set();\n // (1) Gather list of eligible prims and materials.\n for (const mesh of root.listMeshes()) {\n for (const prim of mesh.listPrimitives()) {\n const material = prim.getMaterial();\n if (!material || !!prim.getAttribute('TEXCOORD_0')) continue;\n prims.add(prim);\n materials.add(material);\n }\n }\n // (2) Gather list of distinct material properties.\n const materialKeys = new Set();\n const materialKeyMap = new Map();\n const materialProps = {\n baseColor: new Set(),\n emissive: new Set(),\n metallicRoughness: new Set()\n };\n for (const material of materials) {\n const baseColor = encodeRGBA(material.getBaseColorFactor().slice());\n const emissive = encodeRGBA([...material.getEmissiveFactor(), 1]);\n const roughness = encodeFloat(material.getRoughnessFactor());\n const metallic = encodeFloat(material.getMetallicFactor());\n const key = `baseColor:${baseColor},emissive:${emissive},metallicRoughness:${metallic}${roughness}`;\n materialProps.baseColor.add(baseColor);\n materialProps.emissive.add(emissive);\n materialProps.metallicRoughness.add(metallic + '+' + roughness);\n materialKeys.add(key);\n materialKeyMap.set(material, key);\n }\n // logger.debug(`${NAME}:\\n${Array.from(materialKeys.values()).join('\\n')}`);\n const keyCount = materialKeys.size;\n if (keyCount < min) {\n logger.debug(`${NAME$b}: Found <${min} unique material properties. Exiting.`);\n return;\n }\n // (3) Allocate palette textures.\n const w = ceilPowerOfTwo(keyCount * blockSize);\n const h = ceilPowerOfTwo(blockSize);\n const padWidth = w - keyCount * blockSize;\n const paletteTexturePixels = {\n baseColor: null,\n emissive: null,\n metallicRoughness: null\n };\n // Properties skipped for material equality comparisons.\n const skipProps = new Set(['name', 'extras']);\n const skip = (...props) => props.forEach(prop => skipProps.add(prop));\n let baseColorTexture = null;\n let emissiveTexture = null;\n let metallicRoughnessTexture = null;\n if (materialProps.baseColor.size >= min) {\n const name = 'PaletteBaseColor';\n baseColorTexture = document.createTexture(name).setURI(`${name}.png`);\n paletteTexturePixels.baseColor = ndarray(new Uint8Array(w * h * 4), [w, h, 4]);\n skip('baseColorFactor', 'baseColorTexture', 'baseColorTextureInfo');\n }\n if (materialProps.emissive.size >= min) {\n const name = 'PaletteEmissive';\n emissiveTexture = document.createTexture(name).setURI(`${name}.png`);\n paletteTexturePixels.emissive = ndarray(new Uint8Array(w * h * 4), [w, h, 4]);\n skip('emissiveFactor', 'emissiveTexture', 'emissiveTextureInfo');\n }\n if (materialProps.metallicRoughness.size >= min) {\n const name = 'PaletteMetallicRoughness';\n metallicRoughnessTexture = document.createTexture(name).setURI(`${name}.png`);\n paletteTexturePixels.metallicRoughness = ndarray(new Uint8Array(w * h * 4), [w, h, 4]);\n skip('metallicFactor', 'roughnessFactor', 'metallicRoughnessTexture', 'metallicRoughnessTextureInfo');\n }\n if (!(baseColorTexture || emissiveTexture || metallicRoughnessTexture)) {\n logger.debug(`${NAME$b}: No material property has >=${min} unique values. Exiting.`);\n return;\n }\n // (4) Write blocks to palette textures.\n const visitedKeys = new Set();\n const materialIndices = new Map();\n const paletteMaterials = [];\n let nextIndex = 0;\n for (const material of materials) {\n const key = materialKeyMap.get(material);\n if (visitedKeys.has(key)) continue;\n const index = nextIndex++;\n if (paletteTexturePixels.baseColor) {\n const pixels = paletteTexturePixels.baseColor;\n const baseColor = [...material.getBaseColorFactor()];\n ColorUtils.convertLinearToSRGB(baseColor, baseColor);\n writeBlock(pixels, index, baseColor, blockSize);\n }\n if (paletteTexturePixels.emissive) {\n const pixels = paletteTexturePixels.emissive;\n const emissive = [...material.getEmissiveFactor(), 1];\n ColorUtils.convertLinearToSRGB(emissive, emissive);\n writeBlock(pixels, index, emissive, blockSize);\n }\n if (paletteTexturePixels.metallicRoughness) {\n const pixels = paletteTexturePixels.metallicRoughness;\n const metallic = material.getMetallicFactor();\n const roughness = material.getRoughnessFactor();\n writeBlock(pixels, index, [0, roughness, metallic, 1], blockSize);\n }\n visitedKeys.add(key);\n materialIndices.set(key, index);\n }\n // (5) Compress palette textures and assign to palette materials.\n const mimeType = 'image/png';\n if (baseColorTexture) {\n const image = await savePixels(paletteTexturePixels.baseColor, mimeType);\n baseColorTexture.setImage(image).setMimeType(mimeType);\n }\n if (emissiveTexture) {\n const image = await savePixels(paletteTexturePixels.emissive, mimeType);\n emissiveTexture.setImage(image).setMimeType(mimeType);\n }\n if (metallicRoughnessTexture) {\n const image = await savePixels(paletteTexturePixels.metallicRoughness, mimeType);\n metallicRoughnessTexture.setImage(image).setMimeType(mimeType);\n }\n // (6) Create palette materials, generate UVs, and assign both to prims.\n let nextPaletteMaterialIndex = 1;\n for (const prim of prims) {\n const srcMaterial = prim.getMaterial();\n const key = materialKeyMap.get(srcMaterial);\n const blockIndex = materialIndices.get(key);\n // UVs are centered horizontally in each block, descending vertically\n // to form a diagonal line in the UV layout. Easy and compressible.\n const baseUV = (blockIndex + 0.5) / keyCount;\n const padUV = baseUV * (w - padWidth) / w;\n const position = prim.getAttribute('POSITION');\n const buffer = position.getBuffer();\n const array = new Float32Array(position.getCount() * 2).fill(padUV);\n const uv = document.createAccessor().setType('VEC2').setArray(array).setBuffer(buffer);\n let dstMaterial;\n for (const material of paletteMaterials) {\n if (material.equals(srcMaterial, skipProps)) {\n dstMaterial = material;\n }\n }\n if (!dstMaterial) {\n const suffix = (nextPaletteMaterialIndex++).toString().padStart(3, '0');\n dstMaterial = srcMaterial.clone().setName(`PaletteMaterial${suffix}`);\n if (baseColorTexture) {\n dstMaterial.setBaseColorFactor([1, 1, 1, 1]).setBaseColorTexture(baseColorTexture).getBaseColorTextureInfo().setMinFilter(TextureInfo.MinFilter.NEAREST).setMagFilter(TextureInfo.MagFilter.NEAREST);\n }\n if (emissiveTexture) {\n dstMaterial.setEmissiveFactor([1, 1, 1]).setEmissiveTexture(emissiveTexture).getEmissiveTextureInfo().setMinFilter(TextureInfo.MinFilter.NEAREST).setMagFilter(TextureInfo.MagFilter.NEAREST);\n }\n if (metallicRoughnessTexture) {\n dstMaterial.setMetallicFactor(1).setRoughnessFactor(1).setMetallicRoughnessTexture(metallicRoughnessTexture).getMetallicRoughnessTextureInfo().setMinFilter(TextureInfo.MinFilter.NEAREST).setMagFilter(TextureInfo.MagFilter.NEAREST);\n }\n paletteMaterials.push(dstMaterial);\n }\n prim.setMaterial(dstMaterial).setAttribute('TEXCOORD_0', uv);\n }\n if (options.cleanup) {\n await document.transform(prune({\n propertyTypes: [PropertyType.MATERIAL]\n }));\n }\n logger.debug(`${NAME$b}: Complete.`);\n });\n}\n/** Encodes a floating-point value on the interval [0,1] at 8-bit precision. */\nfunction encodeFloat(value) {\n const hex = Math.round(value * 255).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n}\n/** Encodes an RGBA color in Linear-sRGB-D65 color space. */\nfunction encodeRGBA(value) {\n ColorUtils.convertLinearToSRGB(value, value);\n return value.map(encodeFloat).join('');\n}\n/** Returns the nearest higher power of two. */\nfunction ceilPowerOfTwo(value) {\n return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2));\n}\n/** Writes an NxN block of pixels to an image, at the given block index. */\nfunction writeBlock(pixels, index, value, blockSize) {\n for (let i = 0; i < blockSize; i++) {\n for (let j = 0; j < blockSize; j++) {\n pixels.set(index * blockSize + i, j, 0, value[0] * 255);\n pixels.set(index * blockSize + i, j, 1, value[1] * 255);\n pixels.set(index * blockSize + i, j, 2, value[2] * 255);\n pixels.set(index * blockSize + i, j, 3, value[3] * 255);\n }\n }\n}\n\nconst NAME$a = 'partition';\nconst PARTITION_DEFAULTS = {\n animations: true,\n meshes: true\n};\n/**\n * Partitions the binary payload of a glTF file so separate mesh or animation data is in separate\n * `.bin` {@link Buffer}s. This technique may be useful for engines that support lazy-loading\n * specific binary resources as needed over the application lifecycle.\n *\n * Example:\n *\n * ```ts\n * document.getRoot().listBuffers(); // → [Buffer]\n *\n * await document.transform(partition({meshes: true}));\n *\n * document.getRoot().listBuffers(); // → [Buffer, Buffer, ...]\n * ```\n *\n * @category Transforms\n */\nfunction partition(_options = PARTITION_DEFAULTS) {\n const options = assignDefaults(PARTITION_DEFAULTS, _options);\n return createTransform(NAME$a, async doc => {\n const logger = doc.getLogger();\n if (options.meshes !== false) partitionMeshes(doc, logger, options);\n if (options.animations !== false) partitionAnimations(doc, logger, options);\n if (!options.meshes && !options.animations) {\n logger.warn(`${NAME$a}: Select animations or meshes to create a partition.`);\n }\n await doc.transform(prune({\n propertyTypes: [PropertyType.BUFFER]\n }));\n logger.debug(`${NAME$a}: Complete.`);\n });\n}\nfunction partitionMeshes(doc, logger, options) {\n const existingURIs = new Set(doc.getRoot().listBuffers().map(b => b.getURI()));\n doc.getRoot().listMeshes().forEach((mesh, meshIndex) => {\n if (Array.isArray(options.meshes) && !options.meshes.includes(mesh.getName())) {\n logger.debug(`${NAME$a}: Skipping mesh #${meshIndex} with name \"${mesh.getName()}\".`);\n return;\n }\n logger.debug(`${NAME$a}: Creating buffer for mesh \"${mesh.getName()}\".`);\n const buffer = doc.createBuffer(mesh.getName()).setURI(createBufferURI(mesh.getName() || 'mesh', existingURIs));\n mesh.listPrimitives().forEach(primitive => {\n const indices = primitive.getIndices();\n if (indices) indices.setBuffer(buffer);\n primitive.listAttributes().forEach(attribute => attribute.setBuffer(buffer));\n primitive.listTargets().forEach(primTarget => {\n primTarget.listAttributes().forEach(attribute => attribute.setBuffer(buffer));\n });\n });\n });\n}\nfunction partitionAnimations(doc, logger, options) {\n const existingURIs = new Set(doc.getRoot().listBuffers().map(b => b.getURI()));\n doc.getRoot().listAnimations().forEach((anim, animIndex) => {\n if (Array.isArray(options.animations) && !options.animations.includes(anim.getName())) {\n logger.debug(`${NAME$a}: Skipping animation #${animIndex} with name \"${anim.getName()}\".`);\n return;\n }\n logger.debug(`${NAME$a}: Creating buffer for animation \"${anim.getName()}\".`);\n const buffer = doc.createBuffer(anim.getName()).setURI(createBufferURI(anim.getName() || 'animation', existingURIs));\n anim.listSamplers().forEach(sampler => {\n const input = sampler.getInput();\n const output = sampler.getOutput();\n if (input) input.setBuffer(buffer);\n if (output) output.setBuffer(buffer);\n });\n });\n}\nconst SANITIZE_BASENAME_RE = /[^\\w0–9-]+/g;\nfunction createBufferURI(basename, existing) {\n basename = basename.replace(SANITIZE_BASENAME_RE, '');\n let uri = `${basename}.bin`;\n let i = 1;\n while (existing.has(uri)) uri = `${basename}_${i++}.bin`;\n existing.add(uri);\n return uri;\n}\n\nvar InterpolationInternal;\n\n(function (InterpolationInternal) {\n InterpolationInternal[InterpolationInternal[\"STEP\"] = 0] = \"STEP\";\n InterpolationInternal[InterpolationInternal[\"LERP\"] = 1] = \"LERP\";\n InterpolationInternal[InterpolationInternal[\"SLERP\"] = 2] = \"SLERP\";\n})(InterpolationInternal || (InterpolationInternal = {}));\nconst EPSILON = 0.000001;\n\n/* Implementation */\n\nfunction resampleDebug(input, output, interpolation, tolerance = 1e-4) {\n const elementSize = output.length / input.length;\n const tmp = new Array(elementSize).fill(0);\n const value = new Array(elementSize).fill(0);\n const valueNext = new Array(elementSize).fill(0);\n const valuePrev = new Array(elementSize).fill(0);\n const lastIndex = input.length - 1;\n let writeIndex = 1;\n\n for (let i = 1; i < lastIndex; ++i) {\n const timePrev = input[writeIndex - 1];\n const time = input[i];\n const timeNext = input[i + 1];\n const t = (time - timePrev) / (timeNext - timePrev);\n let keep = false; // Remove unnecessary adjacent keyframes.\n\n if (time !== timeNext && (i !== 1 || time !== input[0])) {\n getElement(output, writeIndex - 1, valuePrev);\n getElement(output, i, value);\n getElement(output, i + 1, valueNext);\n\n if (interpolation === 'slerp') {\n // Prune keyframes colinear with prev/next keyframes.\n const sample = slerp(tmp, valuePrev, valueNext, t);\n const angle = getAngle(valuePrev, value) + getAngle(value, valueNext);\n keep = !eq(value, sample, tolerance) || angle + Number.EPSILON >= Math.PI;\n } else if (interpolation === 'lerp') {\n // Prune keyframes colinear with prev/next keyframes.\n const sample = vlerp(tmp, valuePrev, valueNext, t);\n keep = !eq(value, sample, tolerance);\n } else if (interpolation === 'step') {\n // Prune keyframes identical to prev/next keyframes.\n keep = !eq(value, valuePrev) || !eq(value, valueNext);\n }\n } // In-place compaction.\n\n\n if (keep) {\n if (i !== writeIndex) {\n input[writeIndex] = input[i];\n setElement(output, writeIndex, getElement(output, i, tmp));\n }\n\n writeIndex++;\n }\n } // Flush last keyframe (compaction looks ahead).\n\n\n if (lastIndex > 0) {\n input[writeIndex] = input[lastIndex];\n setElement(output, writeIndex, getElement(output, lastIndex, tmp));\n writeIndex++;\n }\n\n return writeIndex;\n}\n/* Utilities */\n\nfunction getElement(array, index, target) {\n for (let i = 0, elementSize = target.length; i < elementSize; i++) {\n target[i] = array[index * elementSize + i];\n }\n\n return target;\n}\n\nfunction setElement(array, index, value) {\n for (let i = 0, elementSize = value.length; i < elementSize; i++) {\n array[index * elementSize + i] = value[i];\n }\n}\n\nfunction eq(a, b, tolerance = 0) {\n if (a.length !== b.length) {\n return false;\n }\n\n for (let i = 0; i < a.length; i++) {\n if (Math.abs(a[i] - b[i]) > tolerance) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction lerp(v0, v1, t) {\n return v0 * (1 - t) + v1 * t;\n}\n\nfunction vlerp(out, a, b, t) {\n for (let i = 0; i < a.length; i++) out[i] = lerp(a[i], b[i], t);\n\n return out;\n} // From gl-matrix.\n\n\nfunction slerp(out, a, b, t) {\n // benchmarks:\n // http://jsperf.com/quaternion-slerp-implementations\n let ax = a[0],\n ay = a[1],\n az = a[2],\n aw = a[3];\n let bx = b[0],\n by = b[1],\n bz = b[2],\n bw = b[3];\n let omega, cosom, sinom, scale0, scale1; // calc cosine\n\n cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary)\n\n if (cosom < 0.0) {\n cosom = -cosom;\n bx = -bx;\n by = -by;\n bz = -bz;\n bw = -bw;\n } // calculate coefficients\n\n\n if (1.0 - cosom > EPSILON) {\n // standard case (slerp)\n omega = Math.acos(cosom);\n sinom = Math.sin(omega);\n scale0 = Math.sin((1.0 - t) * omega) / sinom;\n scale1 = Math.sin(t * omega) / sinom;\n } else {\n // \"from\" and \"to\" quaternions are very close\n // ... so we can do a linear interpolation\n scale0 = 1.0 - t;\n scale1 = t;\n } // calculate final values\n\n\n out[0] = scale0 * ax + scale1 * bx;\n out[1] = scale0 * ay + scale1 * by;\n out[2] = scale0 * az + scale1 * bz;\n out[3] = scale0 * aw + scale1 * bw;\n return out;\n}\n\nfunction getAngle(a, b) {\n const dotproduct = dot(a, b);\n return Math.acos(2 * dotproduct * dotproduct - 1);\n}\n\nfunction dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n\nconst NAME$9 = 'resample';\nconst EMPTY_ARRAY = new Float32Array(0);\nconst RESAMPLE_DEFAULTS = {\n ready: Promise.resolve(),\n resample: resampleDebug,\n tolerance: 1e-4,\n cleanup: true\n};\n/**\n * Resample {@link AnimationChannel AnimationChannels}, losslessly deduplicating keyframes to\n * reduce file size. Duplicate keyframes are commonly present in animation 'baked' by the\n * authoring software to apply IK constraints or other software-specific features.\n *\n * Optionally, a WebAssembly implementation from the\n * [`keyframe-resample`](https://github.com/donmccurdy/keyframe-resample-wasm) library may be\n * provided. The WebAssembly version is usually much faster at processing large animation\n * sequences, but may not be compatible with all runtimes and JavaScript build tools.\n *\n * Result: (0,0,0,0,1,1,1,0,0,0,0,0,0,0) → (0,0,1,1,0,0)\n *\n * Example:\n *\n * ```\n * import { resample } from '@gltf-transform/functions';\n * import { ready, resample as resampleWASM } from 'keyframe-resample';\n *\n * // JavaScript (slower)\n * await document.transform(resample());\n *\n * // WebAssembly (faster)\n * await document.transform(resample({ ready, resample: resampleWASM }));\n * ```\n *\n * @privateRemarks Implementation based on THREE.KeyframeTrack#optimize().\n * @category Transforms\n */\nfunction resample(_options = RESAMPLE_DEFAULTS) {\n const options = assignDefaults(RESAMPLE_DEFAULTS, _options);\n return createTransform(NAME$9, async document => {\n const accessorsVisited = new Set();\n const srcAccessorCount = document.getRoot().listAccessors().length;\n const logger = document.getLogger();\n const ready = options.ready;\n const resample = options.resample;\n await ready;\n for (const animation of document.getRoot().listAnimations()) {\n const samplerTargetPaths = new Map();\n for (const channel of animation.listChannels()) {\n samplerTargetPaths.set(channel.getSampler(), channel.getTargetPath());\n }\n for (const sampler of animation.listSamplers()) {\n const samplerInterpolation = sampler.getInterpolation();\n if (samplerInterpolation === 'STEP' || samplerInterpolation === 'LINEAR') {\n const input = sampler.getInput();\n const output = sampler.getOutput();\n accessorsVisited.add(input);\n accessorsVisited.add(output);\n // biome-ignore format: Readability.\n const tmpTimes = toFloat32Array(input.getArray(), input.getComponentType(), input.getNormalized());\n const tmpValues = toFloat32Array(output.getArray(), output.getComponentType(), output.getNormalized());\n const elementSize = tmpValues.length / tmpTimes.length;\n const srcCount = tmpTimes.length;\n let dstCount;\n if (samplerInterpolation === 'STEP') {\n dstCount = resample(tmpTimes, tmpValues, 'step', options.tolerance);\n } else if (samplerTargetPaths.get(sampler) === 'rotation') {\n dstCount = resample(tmpTimes, tmpValues, 'slerp', options.tolerance);\n } else {\n dstCount = resample(tmpTimes, tmpValues, 'lerp', options.tolerance);\n }\n if (dstCount < srcCount) {\n // Clone the input/output accessors, without cloning their underlying\n // arrays. Then assign the resampled data.\n const srcTimes = input.getArray();\n const srcValues = output.getArray();\n const dstTimes = fromFloat32Array(new Float32Array(tmpTimes.buffer, tmpTimes.byteOffset, dstCount), input.getComponentType(), input.getNormalized());\n const dstValues = fromFloat32Array(new Float32Array(tmpValues.buffer, tmpValues.byteOffset, dstCount * elementSize), output.getComponentType(), output.getNormalized());\n input.setArray(EMPTY_ARRAY);\n output.setArray(EMPTY_ARRAY);\n sampler.setInput(input.clone().setArray(dstTimes));\n sampler.setOutput(output.clone().setArray(dstValues));\n input.setArray(srcTimes);\n output.setArray(srcValues);\n }\n }\n }\n }\n for (const accessor of Array.from(accessorsVisited.values())) {\n const used = accessor.listParents().some(p => !(p instanceof Root));\n if (!used) accessor.dispose();\n }\n // Resampling may result in duplicate input or output sampler\n // accessors. Find and remove the duplicates after processing.\n const dstAccessorCount = document.getRoot().listAccessors().length;\n if (dstAccessorCount > srcAccessorCount && options.cleanup) {\n await document.transform(dedup({\n propertyTypes: [PropertyType.ACCESSOR]\n }));\n }\n logger.debug(`${NAME$9}: Complete.`);\n });\n}\n/** Returns a copy of the source array, as a denormalized Float32Array. */\nfunction toFloat32Array(srcArray, componentType, normalized) {\n if (srcArray instanceof Float32Array) return srcArray.slice();\n const dstArray = new Float32Array(srcArray);\n if (!normalized) return dstArray;\n for (let i = 0; i < dstArray.length; i++) {\n dstArray[i] = MathUtils.decodeNormalizedInt(dstArray[i], componentType);\n }\n return dstArray;\n}\n/** Returns a copy of the source array, with specified component type and normalization. */\nfunction fromFloat32Array(srcArray, componentType, normalized) {\n if (componentType === Accessor.ComponentType.FLOAT) return srcArray.slice();\n const TypedArray = ComponentTypeToTypedArray[componentType];\n const dstArray = new TypedArray(srcArray.length);\n for (let i = 0; i < dstArray.length; i++) {\n dstArray[i] = normalized ? MathUtils.encodeNormalizedInt(srcArray[i], componentType) : srcArray[i];\n }\n return dstArray;\n}\n\nconst NAME$8 = 'sequence';\nconst SEQUENCE_DEFAULTS = {\n name: '',\n fps: 10,\n pattern: /.*/,\n sort: true\n};\n/**\n * Creates an {@link Animation} displaying each of the specified {@link Node}s sequentially.\n *\n * @category Transforms\n */\nfunction sequence(_options = SEQUENCE_DEFAULTS) {\n const options = assignDefaults(SEQUENCE_DEFAULTS, _options);\n return createTransform(NAME$8, doc => {\n const logger = doc.getLogger();\n const root = doc.getRoot();\n const fps = options.fps;\n // Collect sequence nodes.\n const sequenceNodes = root.listNodes().filter(node => node.getName().match(options.pattern));\n // Sort by node name.\n if (options.sort) {\n sequenceNodes.sort((a, b) => a.getName() > b.getName() ? 1 : -1);\n }\n // Create animation cycling visibility of each node.\n const anim = doc.createAnimation(options.name);\n const animBuffer = root.listBuffers()[0];\n sequenceNodes.forEach((node, i) => {\n // Create keyframe tracks that show each node for a single frame.\n let inputArray;\n let outputArray;\n if (i === 0) {\n inputArray = [i / fps, (i + 1) / fps];\n outputArray = [1, 1, 1, 0, 0, 0];\n } else if (i === sequenceNodes.length - 1) {\n inputArray = [(i - 1) / fps, i / fps];\n outputArray = [0, 0, 0, 1, 1, 1];\n } else {\n inputArray = [(i - 1) / fps, i / fps, (i + 1) / fps];\n outputArray = [0, 0, 0, 1, 1, 1, 0, 0, 0];\n }\n // Append channel to animation sequence.\n const input = doc.createAccessor().setArray(new Float32Array(inputArray)).setBuffer(animBuffer);\n const output = doc.createAccessor().setArray(new Float32Array(outputArray)).setBuffer(animBuffer).setType(Accessor.Type.VEC3);\n const sampler = doc.createAnimationSampler().setInterpolation(AnimationSampler.Interpolation.STEP).setInput(input).setOutput(output);\n const channel = doc.createAnimationChannel().setTargetNode(node).setTargetPath(AnimationChannel.TargetPath.SCALE).setSampler(sampler);\n anim.addSampler(sampler).addChannel(channel);\n });\n logger.debug(`${NAME$8}: Complete.`);\n });\n}\n\nconst NAME$7 = 'simplify';\nconst {\n POINTS,\n LINES,\n LINE_STRIP,\n LINE_LOOP,\n TRIANGLES,\n TRIANGLE_STRIP,\n TRIANGLE_FAN\n} = Primitive.Mode;\nconst SIMPLIFY_DEFAULTS = {\n ratio: 0.0,\n error: 0.0001,\n lockBorder: false,\n cleanup: true\n};\n/**\n * Simplification algorithm, based on meshoptimizer, producing meshes with fewer\n * triangles and vertices. Simplification is lossy, but the algorithm aims to\n * preserve visual quality as much as possible for given parameters.\n *\n * The algorithm aims to reach the target 'ratio', while minimizing error. If\n * error exceeds the specified 'error' threshold, the algorithm will quit\n * before reaching the target ratio. Examples:\n *\n * - ratio=0.0, error=0.0001: Aims for maximum simplification, constrained to 0.01% error.\n * - ratio=0.5, error=0.0001: Aims for 50% simplification, constrained to 0.01% error.\n * - ratio=0.5, error=1: Aims for 50% simplification, unconstrained by error.\n *\n * Topology, particularly split vertices, will also limit the simplifier. For\n * best results, apply a {@link weld} operation before simplification.\n *\n * Example:\n *\n * ```javascript\n * import { simplify, weld } from '@gltf-transform/functions';\n * import { MeshoptSimplifier } from 'meshoptimizer';\n *\n * await document.transform(\n * weld({}),\n * simplify({ simplifier: MeshoptSimplifier, ratio: 0.75, error: 0.001 })\n * );\n * ```\n *\n * References:\n * - https://github.com/zeux/meshoptimizer/blob/master/js/README.md#simplifier\n *\n * @category Transforms\n */\nfunction simplify(_options) {\n const options = assignDefaults(SIMPLIFY_DEFAULTS, _options);\n const simplifier = options.simplifier;\n if (!simplifier) {\n throw new Error(`${NAME$7}: simplifier dependency required — install \"meshoptimizer\".`);\n }\n return createTransform(NAME$7, async document => {\n const logger = document.getLogger();\n await simplifier.ready;\n await document.transform(weld({\n overwrite: false,\n cleanup: options.cleanup\n }));\n let numUnsupported = 0;\n // Simplify mesh primitives.\n for (const mesh of document.getRoot().listMeshes()) {\n for (const prim of mesh.listPrimitives()) {\n const mode = prim.getMode();\n if (mode === TRIANGLES || mode === TRIANGLE_STRIP || mode === TRIANGLE_FAN) {\n simplifyPrimitive(prim, options);\n if (getPrimitiveVertexCount(prim, VertexCountMethod.RENDER) === 0) {\n prim.dispose();\n }\n } else if (prim.getMode() === POINTS && !!simplifier.simplifyPoints) {\n simplifyPrimitive(prim, options);\n if (getPrimitiveVertexCount(prim, VertexCountMethod.RENDER) === 0) {\n prim.dispose();\n }\n } else {\n numUnsupported++;\n }\n }\n if (mesh.listPrimitives().length === 0) mesh.dispose();\n }\n if (numUnsupported > 0) {\n logger.warn(`${NAME$7}: Skipping simplification of ${numUnsupported} primitives: Unsupported draw mode.`);\n }\n // Where simplification removes meshes, we may need to prune leaf nodes.\n if (options.cleanup) {\n await document.transform(prune({\n propertyTypes: [PropertyType.ACCESSOR, PropertyType.NODE],\n keepAttributes: true,\n keepIndices: true,\n keepLeaves: false\n }), dedup({\n propertyTypes: [PropertyType.ACCESSOR]\n }));\n }\n logger.debug(`${NAME$7}: Complete.`);\n });\n}\n/** @hidden */\nfunction simplifyPrimitive(prim, _options) {\n const options = _extends({}, SIMPLIFY_DEFAULTS, _options);\n const simplifier = options.simplifier;\n const graph = prim.getGraph();\n const document = Document.fromGraph(graph);\n const logger = document.getLogger();\n switch (prim.getMode()) {\n case POINTS:\n return _simplifyPoints(document, prim, options);\n case LINES:\n case LINE_STRIP:\n case LINE_LOOP:\n logger.warn(`${NAME$7}: Skipping primitive simplification: Unsupported draw mode.`);\n return prim;\n case TRIANGLE_STRIP:\n case TRIANGLE_FAN:\n convertPrimitiveToTriangles(prim);\n break;\n }\n // (1) If primitive draws <50% of its vertex stream, compact before simplification.\n const srcVertexCount = getPrimitiveVertexCount(prim, VertexCountMethod.UPLOAD);\n const srcIndexCount = getPrimitiveVertexCount(prim, VertexCountMethod.RENDER);\n if (srcIndexCount < srcVertexCount / 2) {\n compactPrimitive(prim);\n }\n const position = prim.getAttribute('POSITION');\n const srcIndices = prim.getIndices();\n let positionArray = position.getArray();\n let indicesArray = srcIndices.getArray();\n // (2) Gather attributes and indices in Meshopt-compatible format.\n if (!(positionArray instanceof Float32Array)) {\n positionArray = dequantizeAttributeArray(positionArray, position.getComponentType(), position.getNormalized());\n }\n if (!(indicesArray instanceof Uint32Array)) {\n indicesArray = new Uint32Array(indicesArray);\n }\n // (3) Run simplification.\n const targetCount = Math.floor(options.ratio * srcIndexCount / 3) * 3;\n const flags = options.lockBorder ? ['LockBorder'] : [];\n const [dstIndicesArray, error] = simplifier.simplify(indicesArray, positionArray, 3, targetCount, options.error, flags);\n // (4) Assign subset of indexes; compact primitive.\n prim.setIndices(shallowCloneAccessor(document, srcIndices).setArray(dstIndicesArray));\n if (srcIndices.listParents().length === 1) srcIndices.dispose();\n compactPrimitive(prim);\n const dstVertexCount = getPrimitiveVertexCount(prim, VertexCountMethod.UPLOAD);\n if (dstVertexCount <= 65534) {\n prim.getIndices().setArray(new Uint16Array(prim.getIndices().getArray()));\n }\n logger.debug(`${NAME$7}: ${formatDeltaOp(srcVertexCount, dstVertexCount)} vertices, error: ${error.toFixed(4)}.`);\n return prim;\n}\nfunction _simplifyPoints(document, prim, options) {\n const simplifier = options.simplifier;\n const logger = document.getLogger();\n const indices = prim.getIndices();\n if (indices) unweldPrimitive(prim);\n const position = prim.getAttribute('POSITION');\n const color = prim.getAttribute('COLOR_0');\n const srcVertexCount = position.getCount();\n let positionArray = position.getArray();\n let colorArray = color ? color.getArray() : undefined;\n const colorStride = color ? color.getComponentSize() : undefined;\n // (1) Gather attributes in Meshopt-compatible format.\n if (!(positionArray instanceof Float32Array)) {\n positionArray = dequantizeAttributeArray(positionArray, position.getComponentType(), position.getNormalized());\n }\n if (colorArray && !(colorArray instanceof Float32Array)) {\n colorArray = dequantizeAttributeArray(colorArray, position.getComponentType(), position.getNormalized());\n }\n // (2) Run simplification.\n simplifier.useExperimentalFeatures = true;\n const targetCount = Math.floor(options.ratio * srcVertexCount);\n const dstIndicesArray = simplifier.simplifyPoints(positionArray, 3, targetCount, colorArray, colorStride);\n simplifier.useExperimentalFeatures = false;\n // (3) Write vertex attributes.\n const [remap, unique] = simplifier.compactMesh(dstIndicesArray);\n logger.debug(`${NAME$7}: ${formatDeltaOp(position.getCount(), unique)} vertices.`);\n for (const srcAttribute of deepListAttributes(prim)) {\n const dstAttribute = shallowCloneAccessor(document, srcAttribute);\n compactAttribute(srcAttribute, null, remap, dstAttribute, unique);\n deepSwapAttribute(prim, srcAttribute, dstAttribute);\n if (srcAttribute.listParents().length === 1) srcAttribute.dispose();\n }\n return prim;\n}\n\nconst NAME$6 = 'sparse';\nconst SPARSE_DEFAULTS = {\n ratio: 1 / 3\n};\n/**\n * Scans all {@link Accessor Accessors} in the Document, detecting whether each Accessor\n * would benefit from sparse data storage. Currently, sparse data storage is used only\n * when many values (>= ratio) are zeroes. Particularly for assets using morph target\n * (\"shape key\") animation, sparse data storage may significantly reduce file sizes.\n *\n * Example:\n *\n * ```ts\n * import { sparse } from '@gltf-transform/functions';\n *\n * accessor.getArray(); // → [ 0, 0, 0, 0, 0, 25.0, 0, 0, ... ]\n * accessor.getSparse(); // → false\n *\n * await document.transform(sparse({ratio: 1 / 10}));\n *\n * accessor.getSparse(); // → true\n * ```\n *\n * @experimental\n * @category Transforms\n */\nfunction sparse(_options = SPARSE_DEFAULTS) {\n const options = assignDefaults(SPARSE_DEFAULTS, _options);\n const ratio = options.ratio;\n if (ratio < 0 || ratio > 1) {\n throw new Error(`${NAME$6}: Ratio must be between 0 and 1.`);\n }\n return createTransform(NAME$6, document => {\n const root = document.getRoot();\n const logger = document.getLogger();\n let modifiedCount = 0;\n for (const accessor of root.listAccessors()) {\n const count = accessor.getCount();\n const base = Array(accessor.getElementSize()).fill(0);\n const el = Array(accessor.getElementSize()).fill(0);\n let nonZeroCount = 0;\n for (let i = 0; i < count; i++) {\n accessor.getElement(i, el);\n if (!MathUtils.eq(el, base, 0)) nonZeroCount++;\n if (nonZeroCount / count >= ratio) break;\n }\n const sparse = nonZeroCount / count < ratio;\n if (sparse !== accessor.getSparse()) {\n accessor.setSparse(sparse);\n modifiedCount++;\n }\n }\n logger.debug(`${NAME$6}: Updated ${modifiedCount} accessors.`);\n logger.debug(`${NAME$6}: Complete.`);\n });\n}\n\nconst NAME$5 = 'textureCompress';\nconst TEXTURE_COMPRESS_SUPPORTED_FORMATS = ['jpeg', 'png', 'webp', 'avif'];\nconst SUPPORTED_MIME_TYPES = ['image/jpeg', 'image/png', 'image/webp', 'image/avif'];\n/** Resampling filter methods. LANCZOS3 is sharper, LANCZOS2 is smoother. */\nvar TextureResizeFilter;\n(function (TextureResizeFilter) {\n /** Lanczos3 (sharp) */\n TextureResizeFilter[\"LANCZOS3\"] = \"lanczos3\";\n /** Lanczos2 (smooth) */\n TextureResizeFilter[\"LANCZOS2\"] = \"lanczos2\";\n})(TextureResizeFilter || (TextureResizeFilter = {}));\n// IMPORTANT: No defaults for quality flags, see https://github.com/donmccurdy/glTF-Transform/issues/969.\nconst TEXTURE_COMPRESS_DEFAULTS = {\n resizeFilter: TextureResizeFilter.LANCZOS3,\n pattern: undefined,\n formats: undefined,\n slots: undefined,\n quality: undefined,\n effort: undefined,\n lossless: false,\n nearLossless: false,\n limitInputPixels: true\n};\n/**\n * Optimizes images, optionally resizing or converting to JPEG, PNG, WebP, or AVIF formats.\n *\n * For best results use a Node.js environment, install the `sharp` module, and\n * provide an encoder. When the encoder is omitted — `sharp` works only in Node.js —\n * the implementation will use a platform-specific fallback encoder, and most\n * quality- and compression-related options are ignored.\n *\n * Example:\n *\n * ```javascript\n * import { textureCompress } from '@gltf-transform/functions';\n * import sharp from 'sharp';\n *\n * // (A) Optimize without conversion.\n * await document.transform(\n * \ttextureCompress({encoder: sharp})\n * );\n *\n * // (B) Optimize and convert images to WebP.\n * await document.transform(\n * \ttextureCompress({\n * \t\tencoder: sharp,\n * \t\ttargetFormat: 'webp',\n * \t\tslots: /^(?!normalTexture).*$/ // exclude normal maps\n * \t})\n * );\n *\n * // (C) Resize and convert images to WebP in a browser, without a Sharp\n * // encoder. Most quality- and compression-related options are ignored.\n * await document.transform(\n * \ttextureCompress({ targetFormat: 'webp', resize: [1024, 1024] })\n * );\n * ```\n *\n * @category Transforms\n */\nfunction textureCompress(_options) {\n const options = assignDefaults(TEXTURE_COMPRESS_DEFAULTS, _options);\n const targetFormat = options.targetFormat;\n const patternRe = options.pattern;\n const formatsRe = options.formats;\n const slotsRe = options.slots;\n return createTransform(NAME$5, async document => {\n const logger = document.getLogger();\n const textures = document.getRoot().listTextures();\n await Promise.all(textures.map(async (texture, textureIndex) => {\n const slots = listTextureSlots(texture);\n const channels = getTextureChannelMask(texture);\n const textureLabel = texture.getURI() || texture.getName() || `${textureIndex + 1}/${document.getRoot().listTextures().length}`;\n const prefix = `${NAME$5}(${textureLabel})`;\n // FILTER: Exclude textures that don't match (a) 'slots' or (b) expected formats.\n if (!SUPPORTED_MIME_TYPES.includes(texture.getMimeType())) {\n logger.debug(`${prefix}: Skipping, unsupported texture type \"${texture.getMimeType()}\".`);\n return;\n } else if (patternRe && !patternRe.test(texture.getName()) && !patternRe.test(texture.getURI())) {\n logger.debug(`${prefix}: Skipping, excluded by \"pattern\" parameter.`);\n return;\n } else if (formatsRe && !formatsRe.test(texture.getMimeType())) {\n logger.debug(`${prefix}: Skipping, \"${texture.getMimeType()}\" excluded by \"formats\" parameter.`);\n return;\n } else if (slotsRe && slots.length && !slots.some(slot => slotsRe.test(slot))) {\n logger.debug(`${prefix}: Skipping, [${slots.join(', ')}] excluded by \"slots\" parameter.`);\n return;\n } else if (options.targetFormat === 'jpeg' && channels & TextureChannel.A) {\n logger.warn(`${prefix}: Skipping, [${slots.join(', ')}] requires alpha channel.`);\n return;\n }\n const srcFormat = getFormat(texture);\n const dstFormat = targetFormat || srcFormat;\n logger.debug(`${prefix}: Format = ${srcFormat} → ${dstFormat}`);\n logger.debug(`${prefix}: Slots = [${slots.join(', ')}]`);\n const srcImage = texture.getImage();\n const srcByteLength = srcImage.byteLength;\n await compressTexture(texture, options);\n const dstImage = texture.getImage();\n const dstByteLength = dstImage.byteLength;\n const flag = srcImage === dstImage ? ' (SKIPPED' : '';\n logger.debug(`${prefix}: Size = ${formatBytes(srcByteLength)} → ${formatBytes(dstByteLength)}${flag}`);\n }));\n // Attach EXT_texture_webp if needed.\n const webpExtension = document.createExtension(EXTTextureWebP);\n if (textures.some(texture => texture.getMimeType() === 'image/webp')) {\n webpExtension.setRequired(true);\n } else {\n webpExtension.dispose();\n }\n // Attach EXT_texture_avif if needed.\n const avifExtension = document.createExtension(EXTTextureAVIF);\n if (textures.some(texture => texture.getMimeType() === 'image/avif')) {\n avifExtension.setRequired(true);\n } else {\n avifExtension.dispose();\n }\n logger.debug(`${NAME$5}: Complete.`);\n });\n}\n/**\n * Optimizes a single {@link Texture}, optionally resizing or converting to JPEG, PNG, WebP, or AVIF formats.\n *\n * For best results use a Node.js environment, install the `sharp` module, and\n * provide an encoder. When the encoder is omitted — `sharp` works only in Node.js —\n * the implementation will use a platform-specific fallback encoder, and most\n * quality- and compression-related options are ignored.\n *\n * Example:\n *\n * ```javascript\n * import { compressTexture } from '@gltf-transform/functions';\n * import sharp from 'sharp';\n *\n * const texture = document.getRoot().listTextures()\n * \t.find((texture) => texture.getName() === 'MyTexture');\n *\n * // (A) Node.js.\n * await compressTexture(texture, {\n * \tencoder: sharp,\n * \ttargetFormat: 'webp',\n * \tresize: [1024, 1024]\n * });\n *\n * // (B) Web.\n * await compressTexture(texture, {\n * \ttargetFormat: 'webp',\n * \tresize: [1024, 1024]\n * });\n * ```\n */\nasync function compressTexture(texture, _options) {\n const options = _extends({}, TEXTURE_COMPRESS_DEFAULTS, _options);\n const encoder = options.encoder;\n const srcURI = texture.getURI();\n const srcFormat = getFormat(texture);\n const dstFormat = options.targetFormat || srcFormat;\n const srcMimeType = texture.getMimeType();\n const dstMimeType = `image/${dstFormat}`;\n const srcImage = texture.getImage();\n const dstImage = encoder ? await _encodeWithSharp(srcImage, srcMimeType, dstMimeType, options) : await _encodeWithNdarrayPixels(srcImage, srcMimeType, dstMimeType, options);\n const srcByteLength = srcImage.byteLength;\n const dstByteLength = dstImage.byteLength;\n if (srcMimeType === dstMimeType && dstByteLength >= srcByteLength && !options.resize) {\n // Skip if src/dst formats match and dst is larger than the original.\n return;\n } else if (srcMimeType === dstMimeType) {\n // Overwrite if src/dst formats match and dst is smaller than the original.\n texture.setImage(dstImage);\n } else {\n // Overwrite, then update path and MIME type if src/dst formats differ.\n const srcExtension = srcURI ? FileUtils.extension(srcURI) : ImageUtils.mimeTypeToExtension(srcMimeType);\n const dstExtension = ImageUtils.mimeTypeToExtension(dstMimeType);\n const dstURI = texture.getURI().replace(new RegExp(`\\\\.${srcExtension}$`), `.${dstExtension}`);\n texture.setImage(dstImage).setMimeType(dstMimeType).setURI(dstURI);\n }\n}\nasync function _encodeWithSharp(srcImage, _srcMimeType, dstMimeType, options) {\n const encoder = options.encoder;\n let encoderOptions = {};\n const dstFormat = getFormatFromMimeType(dstMimeType);\n switch (dstFormat) {\n case 'jpeg':\n encoderOptions = {\n quality: options.quality\n };\n break;\n case 'png':\n encoderOptions = {\n quality: options.quality,\n effort: remap(options.effort, 100, 10)\n };\n break;\n case 'webp':\n encoderOptions = {\n quality: options.quality,\n effort: remap(options.effort, 100, 6),\n lossless: options.lossless,\n nearLossless: options.nearLossless\n };\n break;\n case 'avif':\n encoderOptions = {\n quality: options.quality,\n effort: remap(options.effort, 100, 9),\n lossless: options.lossless\n };\n break;\n }\n const limitInputPixels = options.limitInputPixels;\n const instance = encoder(srcImage, {\n limitInputPixels\n }).toFormat(dstFormat, encoderOptions);\n if (options.resize) {\n const srcSize = ImageUtils.getSize(srcImage, _srcMimeType);\n const dstSize = Array.isArray(options.resize) ? fitWithin(srcSize, options.resize) : fitPowerOfTwo(srcSize, options.resize);\n instance.resize(dstSize[0], dstSize[1], {\n fit: 'fill',\n kernel: options.resizeFilter\n });\n }\n return BufferUtils.toView(await instance.toBuffer());\n}\nasync function _encodeWithNdarrayPixels(srcImage, srcMimeType, dstMimeType, options) {\n const srcPixels = await getPixels(srcImage, srcMimeType);\n if (options.resize) {\n const [w, h] = srcPixels.shape;\n const dstSize = Array.isArray(options.resize) ? fitWithin([w, h], options.resize) : fitPowerOfTwo([w, h], options.resize);\n const dstPixels = ndarray(new Uint8Array(dstSize[0] * dstSize[1] * 4), [...dstSize, 4]);\n options.resizeFilter === TextureResizeFilter.LANCZOS3 ? lanczos3(srcPixels, dstPixels) : lanczos2(srcPixels, dstPixels);\n return savePixels(dstPixels, dstMimeType);\n }\n return savePixels(srcPixels, dstMimeType);\n}\nfunction getFormat(texture) {\n return getFormatFromMimeType(texture.getMimeType());\n}\nfunction getFormatFromMimeType(mimeType) {\n const format = mimeType.split('/').pop();\n if (!format || !TEXTURE_COMPRESS_SUPPORTED_FORMATS.includes(format)) {\n throw new Error(`Unknown MIME type \"${mimeType}\".`);\n }\n return format;\n}\nfunction remap(value, srcMax, dstMax) {\n if (value == null) return undefined;\n return Math.round(value / srcMax * dstMax);\n}\n\nconst NAME$4 = 'tangents';\nconst TANGENTS_DEFAULTS = {\n overwrite: false\n};\n/**\n * Generates MikkTSpace vertex tangents for mesh primitives, which may fix rendering issues\n * occurring with some baked normal maps. Requires access to the [mikktspace](https://github.com/donmccurdy/mikktspace-wasm)\n * WASM package, or equivalent.\n *\n * Example:\n *\n * ```ts\n * import { generateTangents } from 'mikktspace';\n * import { tangents } from '@gltf-transform/functions';\n *\n * await document.transform(\n * \ttangents({generateTangents})\n * );\n * ```\n *\n * @category Transforms\n */\nfunction tangents(_options = TANGENTS_DEFAULTS) {\n const options = assignDefaults(TANGENTS_DEFAULTS, _options);\n if (!options.generateTangents) {\n throw new Error(`${NAME$4}: generateTangents callback required — install \"mikktspace\".`);\n }\n return createTransform(NAME$4, doc => {\n const logger = doc.getLogger();\n const attributeIDs = new Map();\n const tangentCache = new Map();\n let modified = 0;\n for (const mesh of doc.getRoot().listMeshes()) {\n const meshName = mesh.getName();\n const meshPrimitives = mesh.listPrimitives();\n for (let i = 0; i < meshPrimitives.length; i++) {\n const prim = meshPrimitives[i];\n // Skip primitives for which we can't compute tangents.\n if (!filterPrimitive(prim, logger, meshName, i, options.overwrite)) continue;\n const texcoordSemantic = getNormalTexcoord(prim);\n // Nullability conditions checked by filterPrimitive() above.\n const position = prim.getAttribute('POSITION').getArray();\n const normal = prim.getAttribute('NORMAL').getArray();\n const texcoord = prim.getAttribute(texcoordSemantic).getArray();\n // Compute UUIDs for each attribute.\n const positionID = attributeIDs.get(position) || uuid();\n attributeIDs.set(position, positionID);\n const normalID = attributeIDs.get(normal) || uuid();\n attributeIDs.set(normal, normalID);\n const texcoordID = attributeIDs.get(texcoord) || uuid();\n attributeIDs.set(texcoord, texcoordID);\n // Dispose of previous TANGENT accessor if only used by this primitive (and Root).\n const prevTangent = prim.getAttribute('TANGENT');\n if (prevTangent && prevTangent.listParents().length === 2) prevTangent.dispose();\n // If we've already computed tangents for this pos/norm/uv set, reuse them.\n const attributeHash = `${positionID}|${normalID}|${texcoordID}`;\n let tangent = tangentCache.get(attributeHash);\n if (tangent) {\n logger.debug(`${NAME$4}: Found cache for primitive ${i} of mesh \"${meshName}\".`);\n prim.setAttribute('TANGENT', tangent);\n modified++;\n continue;\n }\n // Otherwise, generate tangents with the 'mikktspace' WASM library.\n logger.debug(`${NAME$4}: Generating for primitive ${i} of mesh \"${meshName}\".`);\n const tangentBuffer = prim.getAttribute('POSITION').getBuffer();\n const tangentArray = options.generateTangents(position instanceof Float32Array ? position : new Float32Array(position), normal instanceof Float32Array ? normal : new Float32Array(normal), texcoord instanceof Float32Array ? texcoord : new Float32Array(texcoord));\n // See: https://github.com/KhronosGroup/glTF-Sample-Models/issues/174\n for (let _i = 3; _i < tangentArray.length; _i += 4) tangentArray[_i] *= -1;\n tangent = doc.createAccessor().setBuffer(tangentBuffer).setArray(tangentArray).setType('VEC4');\n prim.setAttribute('TANGENT', tangent);\n tangentCache.set(attributeHash, tangent);\n modified++;\n }\n }\n if (!modified) {\n logger.warn(`${NAME$4}: No qualifying primitives found. See debug output.`);\n } else {\n logger.debug(`${NAME$4}: Complete.`);\n }\n });\n}\nfunction getNormalTexcoord(prim) {\n const material = prim.getMaterial();\n if (!material) return 'TEXCOORD_0';\n const normalTextureInfo = material.getNormalTextureInfo();\n if (!normalTextureInfo) return 'TEXCOORD_0';\n const texcoord = normalTextureInfo.getTexCoord();\n const semantic = `TEXCOORD_${texcoord}`;\n if (prim.getAttribute(semantic)) return semantic;\n return 'TEXCOORD_0';\n}\nfunction filterPrimitive(prim, logger, meshName, i, overwrite) {\n if (prim.getMode() !== Primitive.Mode.TRIANGLES || !prim.getAttribute('POSITION') || !prim.getAttribute('NORMAL') || !prim.getAttribute('TEXCOORD_0')) {\n logger.debug(`${NAME$4}: Skipping primitive ${i} of mesh \"${meshName}\": primitives must` + ' have attributes=[POSITION, NORMAL, TEXCOORD_0] and mode=TRIANGLES.');\n return false;\n }\n if (prim.getAttribute('TANGENT') && !overwrite) {\n logger.debug(`${NAME$4}: Skipping primitive ${i} of mesh \"${meshName}\": TANGENT found.`);\n return false;\n }\n if (prim.getIndices()) {\n logger.warn(`${NAME$4}: Skipping primitive ${i} of mesh \"${meshName}\": primitives must` + ' be unwelded.');\n return false;\n }\n return true;\n}\n\nconst NAME$3 = 'uninstance';\nconst UNINSTANCE_DEFAULTS = {};\n/**\n * Removes extension {@link EXTMeshGPUInstancing}, reversing the effects of the\n * {@link instance} transform or similar instancing operations. For each {@link Node}\n * associated with an {@link InstancedMesh}, the Node's {@link Mesh} and InstancedMesh will\n * be detached. In their place, one Node per instance will be attached to the original\n * Node as children, associated with the same Mesh. The extension, `EXT_mesh_gpu_instancing`,\n * will be removed from the {@link Document}.\n *\n * In applications that support `EXT_mesh_gpu_instancing`, removing the extension\n * is likely to substantially increase draw calls and reduce performance. Removing\n * the extension may be helpful for compatibility in applications without such support.\n *\n * Example:\n *\n * ```ts\n * import { uninstance } from '@gltf-transform/functions';\n *\n * document.getRoot().listNodes(); // → [ Node x 10 ]\n *\n * await document.transform(uninstance());\n *\n * document.getRoot().listNodes(); // → [ Node x 1000 ]\n * ```\n *\n * @category Transforms\n */\nfunction uninstance(_options = UNINSTANCE_DEFAULTS) {\n return createTransform(NAME$3, async document => {\n const logger = document.getLogger();\n const root = document.getRoot();\n const instanceAttributes = new Set();\n for (const srcNode of document.getRoot().listNodes()) {\n const batch = srcNode.getExtension('EXT_mesh_gpu_instancing');\n if (!batch) continue;\n // For each instance, attach a new Node under the source Node.\n for (const instanceNode of createInstanceNodes(srcNode)) {\n srcNode.addChild(instanceNode);\n }\n for (const instanceAttribute of batch.listAttributes()) {\n instanceAttributes.add(instanceAttribute);\n }\n srcNode.setMesh(null);\n batch.dispose();\n }\n // Clean up unused instance attributes.\n for (const attribute of instanceAttributes) {\n if (attribute.listParents().every(parent => parent === root)) {\n attribute.dispose();\n }\n }\n // Remove Extension from Document.\n document.createExtension(EXTMeshGPUInstancing).dispose();\n logger.debug(`${NAME$3}: Complete.`);\n });\n}\n/**\n * Given a {@link Node} with an {@link InstancedMesh} extension, returns a list\n * containing one Node per instance in the InstancedMesh. Each Node will have\n * the transform (translation/rotation/scale) of the corresponding instance,\n * and will be assigned to the same {@link Mesh}.\n *\n * May be used to unpack instancing previously applied with {@link instance}\n * and {@link EXTMeshGPUInstancing}. For a transform that applies this operation\n * to the entire {@link Document}, see {@link uninstance}.\n *\n * Example:\n * ```javascript\n * import { createInstanceNodes } from '@gltf-transform/functions';\n *\n * for (const instanceNode of createInstanceNodes(batchNode)) {\n * batchNode.addChild(instanceNode);\n * }\n *\n * batchNode.setMesh(null).setExtension('EXTMeshGPUInstancing', null);\n * ```\n */\nfunction createInstanceNodes(batchNode) {\n const batch = batchNode.getExtension('EXT_mesh_gpu_instancing');\n if (!batch) return [];\n const semantics = batch.listSemantics();\n if (semantics.length === 0) return [];\n const document = Document.fromGraph(batchNode.getGraph());\n const instanceCount = batch.listAttributes()[0].getCount();\n const instanceCountDigits = String(instanceCount).length;\n const mesh = batchNode.getMesh();\n const batchName = batchNode.getName();\n const instanceNodes = [];\n // For each instance construct a Node, assign attributes, and push to list.\n for (let i = 0; i < instanceCount; i++) {\n const instanceNode = document.createNode().setMesh(mesh);\n // MyNode_001, MyNode_002, ...\n if (batchName) {\n const paddedIndex = String(i).padStart(instanceCountDigits, '0');\n instanceNode.setName(`${batchName}_${paddedIndex}`);\n }\n // TRS attributes are applied to node transform; all other attributes are extras.\n for (const semantic of semantics) {\n const attribute = batch.getAttribute(semantic);\n switch (semantic) {\n case 'TRANSLATION':\n instanceNode.setTranslation(attribute.getElement(i, [0, 0, 0]));\n break;\n case 'ROTATION':\n instanceNode.setRotation(attribute.getElement(i, [0, 0, 0, 1]));\n break;\n case 'SCALE':\n instanceNode.setScale(attribute.getElement(i, [1, 1, 1]));\n break;\n default:\n _setInstanceExtras(instanceNode, semantic, attribute, i);\n }\n }\n instanceNodes.push(instanceNode);\n }\n return instanceNodes;\n}\nfunction _setInstanceExtras(node, semantic, attribute, index) {\n const value = attribute.getType() === 'SCALAR' ? attribute.getScalar(index) : attribute.getElement(index, []);\n node.setExtras(_extends({}, node.getExtras(), {\n [semantic]: value\n }));\n}\n\n/**\n * @category Transforms\n */\nfunction unlit() {\n return doc => {\n const unlitExtension = doc.createExtension(KHRMaterialsUnlit);\n const unlit = unlitExtension.createUnlit();\n doc.getRoot().listMaterials().forEach(material => {\n material.setExtension('KHR_materials_unlit', unlit);\n });\n };\n}\n\nconst NAME$2 = 'unpartition';\nconst UNPARTITION_DEFAULTS = {};\n/**\n * Removes partitions from the binary payload of a glTF file, so that the asset\n * contains at most one (1) `.bin` {@link Buffer}. This process reverses the\n * changes from a {@link partition} transform.\n *\n * Example:\n *\n * ```ts\n * document.getRoot().listBuffers(); // → [Buffer, Buffer, ...]\n *\n * await document.transform(unpartition());\n *\n * document.getRoot().listBuffers(); // → [Buffer]\n * ```\n *\n * @category Transforms\n */\nfunction unpartition(_options = UNPARTITION_DEFAULTS) {\n return createTransform(NAME$2, async document => {\n const logger = document.getLogger();\n const buffer = document.getRoot().listBuffers()[0];\n document.getRoot().listAccessors().forEach(a => a.setBuffer(buffer));\n document.getRoot().listBuffers().forEach((b, index) => index > 0 ? b.dispose() : null);\n logger.debug(`${NAME$2}: Complete.`);\n });\n}\n\nconst NAME$1 = 'unwrap';\nconst UNWRAP_DEFAULTS = {\n texcoord: 0,\n overwrite: false,\n groupBy: 'mesh'\n};\n/**\n * Generate new texture coordinates (“UV mappings”) for {@link Primitive Primitives}.\n * Useful for adding texture coordinates in scenes without existing UVs, or for\n * creating a second set of texture coordinates for baked textures such as ambient\n * occlusion maps and lightmaps. Operation may increase vertex count to\n * accommodate UV seams.\n *\n * UV layouts may be grouped, reducing the number of textures required. Available\n * groupings:\n *\n * - `\"primitive\"`: Each primitive is given it's own texcoord atlas.\n * - `\"mesh\"`: All primitives in a mesh share a texcoord atlas. (default)\n * - `\"scene\"`: All primitives in the scene share a texcoord atlas.\n *\n * Example:\n *\n * ```ts\n * import * as watlas from 'watlas';\n * import { unwrap } from '@gltf-transform/functions';\n *\n * // Generate a TEXCOORD_1 attribute for all primitives.\n * await document.transform(\n * unwrap({ watlas, texCoord: 1, overwrite: true, groupBy: 'scene' })\n * );\n * ```\n *\n * For more control and customization, see {@link unwrapPrimitives}.\n *\n * @experimental\n * @category Transforms\n */\nfunction unwrap(_options) {\n const options = _extends({}, UNWRAP_DEFAULTS, _options);\n const watlas = options.watlas;\n if (!watlas) {\n throw new Error(`${NAME$1}: dependency required — install \"watlas\".`);\n }\n return createTransform(NAME$1, async document => {\n await watlas.Initialize();\n switch (options.groupBy) {\n case 'primitive':\n {\n for (const mesh of document.getRoot().listMeshes()) {\n for (const prim of mesh.listPrimitives()) {\n unwrapPrimitives([prim], options);\n }\n }\n break;\n }\n case 'mesh':\n {\n for (const mesh of document.getRoot().listMeshes()) {\n unwrapPrimitives(mesh.listPrimitives(), options);\n }\n break;\n }\n case 'scene':\n {\n const prims = [];\n const weights = [];\n for (const mesh of document.getRoot().listMeshes()) {\n const weight = getNodeScaleMax(mesh);\n for (const prim of mesh.listPrimitives()) {\n prims.push(prim);\n weights.push(weight);\n }\n }\n unwrapPrimitives(prims, _extends({}, options, {\n weights\n }));\n break;\n }\n }\n const logger = document.getLogger();\n logger.debug(`${NAME$1}: Complete.`);\n });\n}\n/**\n * Generate new texture coordinates (“UV mappings”) for {@link Primitive Primitives}.\n * Useful for adding texture coordinates in scenes without existing UVs, or for\n * creating a second set of texture coordinates for baked textures such as ambient\n * occlusion maps and lightmaps. Operation may increase vertex count to\n * accommodate UV seams.\n *\n * UV layouts may be grouped, reducing the number of textures required. Available\n * groupings:\n *\n * - `\"primitive\"`: Each primitive is given it's own texcoord atlas.\n * - `\"mesh\"`: All primitives in a mesh share a texcoord atlas. (default)\n * - `\"scene\"`: All primitives in the scene share a texcoord atlas.\n *\n * watlas must be initialized before calling this function.\n *\n * Example:\n *\n * ```ts\n * import * as watlas from 'watlas';\n * import { unwrapPrimitives } from '@gltf-transform/functions';\n *\n * // Initialize watlas.\n * await watlas.Initialize();\n *\n * // Generate a TEXCOORD_1 attribute for the specified primitives.\n * unwrapPrimitives(mesh.listPrimitives(), {\n * watlas,\n * texCoord: 1,\n * overwrite: true\n * });\n * ```\n *\n * To create texture coordinates for an entire Document, see {@link unwrap}.\n *\n * @experimental\n */\nfunction unwrapPrimitives(primitives, options) {\n var _options$texcoord;\n const document = Document.fromGraph(primitives[0].getGraph());\n const watlas = options.watlas;\n const dstTexCoordIndex = (_options$texcoord = options.texcoord) != null ? _options$texcoord : 0;\n const dstSemantic = `TEXCOORD_${dstTexCoordIndex}`;\n if (!watlas) {\n throw new Error(`${NAME$1}: dependency required — install \"watlas\".`);\n }\n const atlas = new watlas.Atlas();\n const unwrapPrims = [];\n for (let i = 0; i < primitives.length; i++) {\n const prim = primitives[i];\n const primWeight = options.weights ? options.weights[i] : 1;\n // Don't process primitives that already have the desired TEXCOORD index\n // if overwrite is false.\n if (!options.overwrite && prim.getAttribute(dstSemantic)) {\n continue;\n }\n const unwrapPrim = compactPrimitive(prim);\n // Always pass vertex position data\n const position = unwrapPrim.getAttribute('POSITION');\n const meshDecl = {\n vertexCount: position.getCount(),\n vertexPositionData: getScaledAttributeFloat32Array(position, primWeight),\n vertexPositionStride: position.getElementSize() * Float32Array.BYTES_PER_ELEMENT\n };\n // Pass normal data if available to improve unwrapping\n const normal = unwrapPrim.getAttribute('NORMAL');\n if (normal) {\n meshDecl.vertexNormalData = getAttributeFloat32Array(normal);\n meshDecl.vertexNormalStride = normal.getElementSize() * Float32Array.BYTES_PER_ELEMENT;\n }\n // Pass texcoord data from set 0 if it's available and not the set that\n // is being generated.\n if (options.texcoord !== 0) {\n const texcoord = unwrapPrim.getAttribute('TEXCOORD_0');\n if (texcoord) {\n meshDecl.vertexUvData = getAttributeFloat32Array(texcoord);\n meshDecl.vertexUvStride = texcoord.getElementSize() * Float32Array.BYTES_PER_ELEMENT;\n }\n }\n // Pass indices if available\n const indices = unwrapPrim.getIndices();\n if (indices) {\n const indicesArray = indices.getArray();\n meshDecl.indexCount = indices.getCount();\n meshDecl.indexData = indicesArray instanceof Uint8Array ? new Uint16Array(indicesArray) : indicesArray;\n }\n unwrapPrims.push(unwrapPrim);\n atlas.addMesh(meshDecl);\n }\n // Don't proceed if we skipped every primitive in this group.\n if (unwrapPrims.length === 0) {\n return;\n }\n atlas.generate();\n if (atlas.meshCount !== unwrapPrims.length) {\n throw new Error(`${NAME$1}: Generated an unexpected number of atlas meshes. (got: ${atlas.meshCount}, expected: ${unwrapPrims.length})`);\n }\n // xatlas UVs are in texels, so they need to be normalized before saving to\n // the glTF attribute.\n const scale = [1 / atlas.width, 1 / atlas.height];\n for (let i = 0; i < atlas.meshCount; i++) {\n const prim = unwrapPrims[i];\n const atlasMesh = atlas.getMesh(i);\n // Clean up previous TEXCOORD_* attribute, if there was any.\n const srcTexCoord = prim.getAttribute(dstSemantic);\n if (srcTexCoord) {\n prim.setAttribute(dstSemantic, null);\n if (!isUsed(srcTexCoord)) srcTexCoord.dispose();\n }\n // Remap Vertex attributes.\n for (const srcAttribute of prim.listAttributes()) {\n prim.swap(srcAttribute, remapAttribute(document, srcAttribute, atlasMesh));\n // Clean up.\n if (!isUsed(srcAttribute)) srcAttribute.dispose();\n }\n // Remap morph target vertex attributes.\n for (const target of prim.listTargets()) {\n for (const srcAttribute of target.listAttributes()) {\n target.swap(srcAttribute, remapAttribute(document, srcAttribute, atlasMesh));\n // Clean up.\n if (!isUsed(srcAttribute)) srcAttribute.dispose();\n }\n }\n // Add new TEXCOORD_* attribute.\n const dstTexCoord = document.createAccessor().setArray(new Float32Array(atlasMesh.vertexCount * 2)).setType('VEC2');\n for (let j = 0; j < atlasMesh.vertexCount; j++) {\n const vertex = atlasMesh.getVertex(j);\n dstTexCoord.setElement(j, [vertex.uv[0] * scale[0], vertex.uv[1] * scale[1]]);\n }\n prim.setAttribute(dstSemantic, dstTexCoord);\n // The glTF spec says that if TEXCOORD_N (where N > 0) exists then\n // TEXCOORD_N-1...TEXCOORD_0 must also exist. If any prior TEXCOORD\n // attributes are missing, copy this attribute to satisfy that requirement.\n for (let j = dstTexCoordIndex - 1; j >= 0; j--) {\n const semantic = `TEXCOORD_${j}`;\n if (!prim.getAttribute(semantic)) {\n prim.setAttribute(semantic, dstTexCoord);\n }\n }\n // Update Indices.\n const dstIndicesArray = new Uint32Array(atlasMesh.indexCount);\n atlasMesh.getIndexArray(dstIndicesArray);\n const dstIndices = document.createAccessor().setArray(dstIndicesArray).setType('SCALAR');\n const srcIndices = prim.getIndices();\n prim.setIndices(dstIndices);\n if (srcIndices && !isUsed(srcIndices)) {\n srcIndices.dispose();\n }\n }\n atlas.delete();\n}\n// Returns a new attribute with the same values at as source attribute, but\n// re-ordered according to the vertex order output by xatlas to account for\n// vertex splitting.\nfunction remapAttribute(document, srcAttribute, atlasMesh) {\n const dstAttribute = shallowCloneAccessor(document, srcAttribute);\n const ArrayCtor = srcAttribute.getArray().constructor;\n dstAttribute.setArray(new ArrayCtor(atlasMesh.vertexCount * srcAttribute.getElementSize()));\n const el = [];\n for (let i = 0; i < atlasMesh.vertexCount; i++) {\n const vertex = atlasMesh.getVertex(i);\n dstAttribute.setElement(i, srcAttribute.getElement(vertex.xref, el));\n }\n return dstAttribute;\n}\n// Returns the values of the given attribute as a Float32Array.\nfunction getAttributeFloat32Array(attribute) {\n if (attribute.getComponentType() === Accessor.ComponentType.FLOAT) {\n return attribute.getArray();\n }\n return dequantizeAttributeArray(attribute.getArray(), attribute.getComponentType(), attribute.getNormalized());\n}\n// Returns scaled values of the given attribute as a Float32Array.\nfunction getScaledAttributeFloat32Array(attribute, scale) {\n const array = dequantizeAttributeArray(attribute.getArray(), attribute.getComponentType(), attribute.getNormalized());\n for (let i = 0; i < array.length; i++) {\n array[i] *= scale;\n }\n return array;\n}\nfunction getNodeScaleMax(mesh) {\n let scale = -Infinity;\n for (const parent of mesh.listParents()) {\n if (parent instanceof Node) {\n const s = parent.getWorldScale();\n scale = Number.isFinite(s[0]) ? Math.max(scale, Math.abs(s[0])) : scale;\n scale = Number.isFinite(s[1]) ? Math.max(scale, Math.abs(s[1])) : scale;\n scale = Number.isFinite(s[2]) ? Math.max(scale, Math.abs(s[2])) : scale;\n }\n }\n return scale > 0 && Number.isFinite(scale) ? scale : 1;\n}\n\nconst NAME = 'vertexColorSpace';\n/**\n * Vertex color color space correction. The glTF format requires vertex colors to be stored\n * in Linear Rec. 709 D65 color space, and this function provides a way to correct vertex\n * colors that are (incorrectly) stored in sRGB.\n *\n * Example:\n *\n * ```typescript\n * import { vertexColorSpace } from '@gltf-transform/functions';\n *\n * await document.transform(\n * vertexColorSpace({ inputColorSpace: 'srgb' })\n * );\n * ```\n *\n * @category Transforms\n */\nfunction vertexColorSpace(options) {\n return createTransform(NAME, doc => {\n const logger = doc.getLogger();\n const inputColorSpace = (options.inputColorSpace || '').toLowerCase();\n if (inputColorSpace === 'srgb-linear') {\n logger.info(`${NAME}: Vertex colors already linear. Skipping conversion.`);\n return;\n }\n if (inputColorSpace !== 'srgb') {\n logger.error(`${NAME}: Unknown input color space \"${inputColorSpace}\" – should be \"srgb\" or ` + '\"srgb-linear\". Skipping conversion.');\n return;\n }\n const converted = new Set();\n // Source: THREE.Color\n function sRGBToLinear(c) {\n return c < 0.04045 ? c * 0.0773993808 : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4);\n }\n function updatePrimitive(primitive) {\n const color = [0, 0, 0];\n let attribute;\n for (let i = 0; attribute = primitive.getAttribute(`COLOR_${i}`); i++) {\n if (converted.has(attribute)) continue;\n for (let j = 0; j < attribute.getCount(); j++) {\n attribute.getElement(j, color);\n color[0] = sRGBToLinear(color[0]);\n color[1] = sRGBToLinear(color[1]);\n color[2] = sRGBToLinear(color[2]);\n attribute.setElement(j, color);\n }\n converted.add(attribute);\n }\n }\n doc.getRoot().listMeshes().forEach(mesh => mesh.listPrimitives().forEach(updatePrimitive));\n logger.debug(`${NAME}: Complete.`);\n });\n}\n\nexport { DRACO_DEFAULTS, FLATTEN_DEFAULTS, INSTANCE_DEFAULTS, JOIN_DEFAULTS, MESHOPT_DEFAULTS, PALETTE_DEFAULTS, PRUNE_DEFAULTS, QUANTIZE_DEFAULTS, SIMPLIFY_DEFAULTS, TEXTURE_COMPRESS_DEFAULTS, TEXTURE_COMPRESS_SUPPORTED_FORMATS, TextureResizeFilter, UNWRAP_DEFAULTS, VertexCountMethod, WELD_DEFAULTS, assignDefaults, center, clearNodeParent, clearNodeTransform, cloneDocument, compactAttribute, compactPrimitive, compressTexture, convertPrimitiveToLines, convertPrimitiveToTriangles, copyToDocument, createDefaultPropertyResolver, createInstanceNodes, createTransform, dedup, dequantize, dequantizePrimitive, draco, fitPowerOfTwo, fitWithin, flatten, getBounds, getGLPrimitiveCount, getMeshVertexCount, getNodeVertexCount, getPrimitiveVertexCount, getSceneVertexCount, getTextureChannelMask, getTextureColorSpace, inspect, instance, isTransformPending, join, joinPrimitives, listNodeScenes, listTextureChannels, listTextureInfo, listTextureInfoByMaterial, listTextureSlots, mergeDocuments, meshopt, metalRough, moveToDocument, normals, palette, partition, prune, quantize, reorder, resample, sequence, simplify, simplifyPrimitive, sortPrimitiveWeights, sparse, tangents, textureCompress, transformMesh, transformPrimitive, uninstance, unlit, unpartition, unweld, unweldPrimitive, unwrap, unwrapPrimitives, vertexColorSpace, weld, weldPrimitive };\n//# sourceMappingURL=functions.modern.js.map\n","import {AViewerPluginSync, DRACOLoader2, GLTFBinaryExtension, GLTFLoader2, GLTFParser, ThreeViewer} from 'threepipe'\nimport {Extension, WebIO} from '@gltf-transform/core'\nimport {ALL_EXTENSIONS} from '@gltf-transform/extensions'\nimport {GLTFDracoExportPlugin} from './GLTFDracoExportPlugin'\nimport {metalRough} from '@gltf-transform/functions'\n\n/**\n * GLTFSpecGlossinessConverterPlugin\n *\n * Plugin that adds a gltf loader extension that automatically converts GLTF files with specular glossiness materials ([KHR_materials_pbrSpecularGlossiness](https://kcoley.github.io/glTF/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness/)) to metallic roughness during import.\n *\n * To use this plugin, simply add it to the viewer and import a file with specular glossiness materials.\n * If `confirm` is set to true, a confirmation dialog will be shown before the conversion.\n */\nexport class GLTFSpecGlossinessConverterPlugin extends AViewerPluginSync {\n enabled = true\n\n static readonly PluginType = 'GLTFSpecGlossinessConverterPlugin'\n toJSON: any = undefined\n\n // dependencies = [GLTFDracoExportPlugin]\n\n /**\n * Whether to show the confirmation dialog when loading a GLTF file with specular glossiness materials.\n * If set to false, the conversion will be done automatically without confirmation.\n * To disable the conversion entirely, disable the plugin.\n */\n confirm = true\n /**\n * The message to show in the confirmation dialog when loading a GLTF file with specular glossiness materials.\n */\n confirmMessage = 'GLTF Load: This file includes specular glossiness materials, do you want to convert it to metallic roughness before load?'\n\n private _loaderCreate({loader}: {loader: GLTFLoader2}) {\n if (!loader.isGLTFLoader2) return\n\n const ep = this._viewer?.getPlugin(GLTFDracoExportPlugin)\n if (!ep) {\n console.error('GLTFSpecGlossinessConverterPlugin requires GLTFDracoExportPlugin in the plugin for extra extensions')\n }\n loader.register(gltfKhrPbrSpecularGlossinessConverter(async(m)=>!this.enabled ? false : !this.confirm ? true : this._viewer?.dialog.confirm(this.confirmMessage || m) ?? true, ep?.gltfTransformExtensions))\n }\n\n constructor() {\n super()\n this._loaderCreate = this._loaderCreate.bind(this)\n }\n\n onAdded(v: ThreeViewer) {\n super.onAdded(v)\n v.assetManager.importer.addEventListener('loaderCreate', this._loaderCreate as any)\n }\n\n onRemove(v: ThreeViewer) {\n v.assetManager.importer.removeEventListener('loaderCreate', this._loaderCreate as any)\n return super.onRemove(v)\n }\n}\n\n\nexport const gltfKhrPbrSpecularGlossinessConverter = (confirm?: (s: string)=>Promise<boolean>, extensions?: (typeof Extension)[])=>(parser: GLTFParser)=>({\n name: 'KHR_materials_pbrSpecularGlossiness',\n beforeRoot: async() => {\n try {\n if (!parser.json.extensionsUsed || !parser.json.extensionsUsed.includes('KHR_materials_pbrSpecularGlossiness')) return\n const doConfirm = parser.importOptions?.confirmSpecGlossConversion ?? true\n if (doConfirm && confirm && !await confirm('Convert KHR_materials_pbrSpecularGlossiness to KHR_materials_pbrMetallicRoughness?')) return\n\n const json = parser.json\n const io = new WebIO().registerExtensions(ALL_EXTENSIONS).registerExtensions(extensions ?? [])\n\n if (parser.extensions.KHR_draco_mesh_compression) {\n const dracoLoader = parser.extensions.KHR_draco_mesh_compression.dracoLoader as DRACOLoader2\n if (!dracoLoader.isDRACOLoader2) {\n console.error('gltfKhrPbrSpecularGlossinessConverter: DRACOLoader2 required')\n return\n }\n const decoder = await dracoLoader.initDecoder()\n io.registerDependencies({\n // 'draco3d.encoder': libs[0],\n ['draco3d.decoder']: decoder,\n })\n }\n\n const document = await io.readJSON({\n json, resources: {\n ['@glb.bin']: new Uint8Array(parser.extensions.KHR_binary_glTF?.body),\n },\n })\n\n\n // Convert materials.\n await document.transform(metalRough())\n\n // no need to compress\n if (parser.extensions.KHR_draco_mesh_compression) {\n document.getRoot().listExtensionsUsed().find(e => e.extensionName === 'KHR_draco_mesh_compression')?.dispose()\n }\n\n // Write back to GLB.\n const res = await io.writeBinary(document)\n const binaryExtension = new GLTFBinaryExtension(res.buffer as any)\n parser.extensions.KHR_binary_glTF = binaryExtension\n parser.json = JSON.parse(binaryExtension.content)\n\n // this doesn't work for some reason\n // const res = await io.writeJSON(document, {format: Format.GLB})\n // parser.extensions.KHR_binary_glTF.data = res.resources['@glb.bin'].buffer as any\n // parser.extensions.KHR_binary_glTF.content = res.json\n // parser.json = res.json\n } catch (e) {\n console.error(e)\n return\n }\n },\n})\n\ndeclare module 'threepipe'{\n interface ImportAddOptions{\n /**\n * Whether to confirm the conversion of specular glossiness materials to metallic roughness.\n * @default true\n */\n confirmSpecGlossConversion?: boolean\n }\n}\n"],"names":["_extends","PropertyType","VertexLayout","BufferViewUsage","TextureChannel","Format","ARRAY_TYPE","create","node","Verbosity","generateOne","uuid","R","G","B","A","Extension","BufferViewTarget","edge","parent","index","ChunkType","EncoderMethod","MeshoptMode","MeshoptFilter","FLOAT","AttributeEnum","NAME$e","GLTFExporter2","ops","GLTFViewerConfigExtension","AViewerPluginSync","GLTFMaterialsBumpMapExtension","GLTFMaterialsLightMapExtension","GLTFMaterialsAlphaMapExtension","GLTFMaterialsDisplacementMapExtension","customBumpMapGLTFExtension","GLTFLightExtrasExtension","GLTFObject3DExtrasExtension","GLTFMaterialExtrasExtension","clearCoatTintGLTFExtension","noiseBumpMaterialGLTFExtension","fragmentClippingGLTFExtension","generateUUID","_a","AssetExporterPlugin","require$$0","require$$1","i","ndarray","uniq","compile","thunk","exports","VertexCountMethod","InterpolationInternal","TextureResizeFilter","GLTFBinaryExtension"],"mappings":"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","x_google_ignoreList":[0,1,2,3,6,7,8,9,10,11,12,13,14,15]}
|