@threepipe/plugin-blend-importer 0.0.5 → 0.0.6

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/js-blend/parser/parser.js","../src/js-blend/main.js","../src/loader/camera.ts","../src/loader/light.ts","../src/loader/geometry.ts","../src/loader/material.ts","../src/loader/mesh.ts","../src/loader/index.ts","../src/BlendLoadPlugin.ts"],"sourcesContent":["/* eslint-disable camelcase, no-unused-vars, no-empty, no-constant-condition */\nconst DNA1 = 826363460;\nconst ENDB = 1111772741;\n\n/* Note: Blender coordinates treat the Z axis as the vertical an Y as depth. */\n\n// web worker not functional in this version\nlet USE_WEBWORKER = false;\n\nlet worker = null;\n\n// FR = new FileReader(),\n\nconst return_object = {\n loadBlendFromArrayBuffer: function (array_buffer) {\n return_object.ready = false;\n if (USE_WEBWORKER) {\n worker.postMessage(array_buffer, array_buffer);\n } else {\n worker.onmessage({\n data: array_buffer,\n });\n }\n },\n // loadBlendFromBlob: function (blob) {\n // FR.onload = function () {\n // return_object.loadBlendFromArrayBuffer(this.result);\n // };\n // FR.readAsArrayBuffer(blob);\n // },\n ready: true,\n onParseReady: function () {},\n};\n\nfunction worker_code () {\n 'use strict';\n\n let data = null,\n _data = null,\n BIG_ENDIAN = false,\n pointer_size = 0,\n struct_names = [],\n offset = 0,\n working_blend_file = null,\n current_SDNA_template = null,\n templates = {},\n finished_objects = [],\n FILE = null,\n ERROR = null,\n AB = null;\n\n const self = this;\n\n function parseFile (msg) {\n\n if (typeof msg.data == 'object') {\n // reset global variables\n AB = null;\n data = null;\n BIG_ENDIAN = false;\n pointer_size = 0;\n struct_names = [];\n offset = 0;\n working_blend_file = null;\n finished_objects = [];\n current_SDNA_template = null;\n\n\n // set data\n _data = msg.data;\n\n AB = _data.slice();\n\n data = new DataView(_data);\n\n\n FILE = new BLENDER_FILE(AB);\n\n // start parsing\n readFile();\n\n // export parsed data\n self.postMessage(FILE, ERROR);\n }\n }\n\n /*\n Export object for a parsed __blender_file__.\n */\n\n const BLENDER_FILE = function (AB) {\n this.AB = AB;\n // this.double = new Float64Array(AB);\n this.byte = new Uint8Array(AB);\n\n this.dv = new DataView(AB);\n\n this.objects = {};\n this.memory_lookup = {},\n this.object_array = [];\n\n this.template = null;\n };\n\n BLENDER_FILE.prototype = {\n addObject: function (obj) {\n this.object_array.push(obj);\n if (!this.objects[obj.blender_name]) this.objects[obj.blender_name] = [];\n this.objects[obj.blender_name].push(obj);\n },\n\n getPointer: function (offset) {\n const pointerLow = this.dv.getUint32(offset, this.template.endianess);\n if (this.template.pointer_size > 4) {\n const pointerHigh = this.dv.getUint32(offset + 4, this.template.endianess);\n if (this.template.endianess) {\n return (pointerLow) + 'l|h' + pointerHigh;\n } else {\n return (pointerHigh) + 'h|l' + pointerLow;\n }\n } else {\n return pointerLow;\n }\n },\n };\n\n self.onmessage = parseFile;\n // this.onmessage = parseFile;\n\n /*\n These functions map offsets in the blender __blender_file__ to basic types (byte,short,int,float) through TypedArrays;\n This allows the underlying binary data to be changed.\n */\n\n function float64Prop (offset, Blender_Array_Length, length) {\n return {\n get: function () {\n return (Blender_Array_Length > 1) ?\n new Float64Array(this.__blender_file__.AB, this.__data_address__ + offset, length) :\n this.__blender_file__.dv.getFloat64(this.__data_address__ + offset, this.__blender_file__.template.endianess);\n },\n set: function (float) {\n if (Blender_Array_Length > 1) {} else {\n this.__blender_file__.dv.setFloat64(this.__data_address__ + offset, float, this.__blender_file__.template.endianess);\n }\n },\n enumerable: true,\n configurable: true,\n };\n }\n\n function floatProp (offset, Blender_Array_Length, length) {\n return {\n get: function () {\n return (Blender_Array_Length > 1) ?\n new Float32Array(this.__blender_file__.AB, this.__data_address__ + offset, length) :\n this.__blender_file__.dv.getFloat32(this.__data_address__ + offset, this.__blender_file__.template.endianess);\n },\n set: function (float) {\n if (Blender_Array_Length > 1) {} else {\n this.__blender_file__.dv.setFloat32(this.__data_address__ + offset, float, this.__blender_file__.template.endianess);\n }\n },\n enumerable: true,\n configurable: true,\n };\n }\n\n function intProp (offset, Blender_Array_Length, length) {\n return {\n get: function () {\n return (Blender_Array_Length > 1) ?\n new Int32Array(this.__blender_file__.AB, this.__data_address__ + offset, length) :\n this.__blender_file__.dv.getInt32(this.__data_address__ + offset, this.__blender_file__.template.endianess);\n },\n set: function (float) {\n if (Blender_Array_Length > 1) {} else {\n this.__blender_file__.dv.setInt32(this.__data_address__ + offset, float, this.__blender_file__.template.endianess);\n }\n },\n enumerable: true,\n configurable: true,\n };\n }\n\n function uIntProp (offset, Blender_Array_Length, length) {\n return {\n get: function () {\n return (Blender_Array_Length > 1) ?\n new Uint32Array(this.__blender_file__.AB, this.__data_address__ + offset, length) :\n this.__blender_file__.dv.getUint32(this.__data_address__ + offset, this.__blender_file__.template.endianess);\n },\n set: function (float) {\n if (Blender_Array_Length > 1) {} else {\n this.__blender_file__.dv.setUint32(this.__data_address__ + offset, float, this.__blender_file__.template.endianess);\n }\n },\n enumerable: true,\n configurable: true,\n };\n }\n\n function shortProp (offset, Blender_Array_Length, length) {\n return {\n get: function () {\n return (Blender_Array_Length > 1) ?\n new Int16Array(this.__blender_file__.AB, this.__data_address__ + offset, length) :\n this.__blender_file__.dv.getInt16(this.__data_address__ + offset, this.__blender_file__.template.endianess);\n },\n set: function (float) {\n if (Blender_Array_Length > 1) {} else {\n this.__blender_file__.dv.setInt16(this.__data_address__ + offset, float, this.__blender_file__.template.endianess);\n }\n },\n enumerable: true,\n configurable: true,\n };\n }\n\n const uShortProp = (offset, Blender_Array_Length, length) => {\n return {\n get: function () {\n return (Blender_Array_Length > 1) ?\n new Uint16Array(this.__blender_file__.AB, this.__data_address__ + offset, length) :\n this.__blender_file__.dv.getUint16(this.__data_address__ + offset, this.__blender_file__.template.endianess);\n },\n set: function (float) {\n if (Blender_Array_Length > 1) {\n } else {\n this.__blender_file__.dv.setUint16(this.__data_address__ + offset, float, this.__blender_file__.template.endianess);\n }\n },\n enumerable: true,\n configurable: true,\n };\n };\n\n function charProp (offset, Blender_Array_Length, length) {\n return {\n get: function () {\n if (Blender_Array_Length > 1) {\n let start = this.__data_address__ + offset;\n let end = start;\n let buffer_guard = 0;\n\n while (this.__blender_file__.byte[end] != 0 && buffer_guard++ < length) end++;\n\n return toString(this.__blender_file__.AB, start, end);\n }\n return this.__blender_file__.byte[(this.__data_address__ + offset)];\n },\n set: function (byte) {\n if (Blender_Array_Length > 1) {\n const string = byte + '';\n let i = 0;\n const l = string.length;\n while (i < length) {\n if (i < l) {\n this.__blender_file__.byte[(this.__data_address__ + offset + i)] = string.charCodeAt(i) | 0;\n } else {\n this.__blender_file__.byte[(this.__data_address__ + offset + i)] = 0;\n }\n i++;\n }\n } else {\n this.__blender_file__.byte[(this.__data_address__ + offset)] = byte | 0;\n }\n },\n enumerable: true,\n configurable: true,\n };\n }\n\n function pointerProp2 (offset) {\n return {\n get: function () {\n let pointer = this.__blender_file__.getPointer(this.__data_address__ + offset, this.__blender_file__);\n const link = this.__blender_file__.memory_lookup[pointer];\n\n const results = [];\n\n if (link) {\n const address = link.__data_address__;\n let j = 0;\n while (true) {\n pointer = this.__blender_file__.getPointer(address + j * 8, this.__blender_file__);\n let obj = this.__blender_file__.memory_lookup[pointer];\n if (!obj) break;\n results.push(obj);\n j++;\n }\n\n }\n\n return results;\n },\n set: function () {},\n enumerable: true,\n configurable: true,\n };\n }\n\n function pointerProp (offset, Blender_Array_Length, length) {\n return {\n get: function () {\n if (Blender_Array_Length > 1) {\n let array = [];\n let j = 0;\n let off = offset;\n while (j < Blender_Array_Length) {\n let pointer = this.__blender_file__.getPointer(this.__data_address__ + off, this.__blender_file__);\n\n array.push(this.__blender_file__.memory_lookup[pointer]);\n off += length;\n j++;\n }\n\n return array;\n } else {\n let pointer = this.__blender_file__.getPointer(this.__data_address__ + offset, this.__blender_file__);\n return this.__blender_file__.memory_lookup[pointer];\n }\n },\n set: function () {},\n enumerable: true,\n configurable: true,\n };\n }\n\n function compileProp (obj, name, type, offset, array_size, IS_POINTER, pointer_size, length) {\n\n if (!IS_POINTER) {\n switch (type) {\n case 'double':\n Object.defineProperty(obj, name, float64Prop(offset, array_size, length >> 3));\n break;\n case 'float':\n Object.defineProperty(obj, name, floatProp(offset, array_size, length >> 2));\n break;\n case 'int':\n Object.defineProperty(obj, name, intProp(offset, array_size, length >> 2));\n break;\n case 'short':\n Object.defineProperty(obj, name, shortProp(offset, array_size, length >> 1));\n break;\n case 'ushort':\n Object.defineProperty(obj, name, uShortProp(offset, array_size, length >> 1));\n break;\n case 'char':\n case 'uchar':\n Object.defineProperty(obj, name, charProp(offset, array_size, length));\n break;\n default:\n // compile list to\n obj[name] = {};\n obj.__list__.push(name, type, length, offset, array_size, IS_POINTER);\n }\n obj._length += length;\n offset += length;\n } else {\n Object.defineProperty(obj, name, pointerProp(offset, array_size, pointer_size));\n obj._length += pointer_size * array_size;\n offset += pointer_size * array_size;\n }\n\n return offset;\n }\n\n // Store final DNA structs\n const MASTER_SDNA_SCHEMA = function (version) {\n this.version = version;\n this.SDNA_SET = false;\n this.byte_size = 0;\n this.struct_index = 0;\n this.structs = {};\n this.SDNA = {};\n this.endianess = false;\n };\n\n MASTER_SDNA_SCHEMA.prototype = {\n getSDNAStructureConstructor: function (name, struct) {\n if (struct) {\n const jsName = name === 'void' ? 'void_' : name\n const blen_struct = Function('function ' + jsName + '(){}; return ' + jsName)();\n\n // if(name === 'CustomDataLayer') debugger\n\n blen_struct.prototype = new BLENDER_STRUCTURE();\n blen_struct.prototype.blender_name = name;\n blen_struct.prototype.__pointers = [];\n blen_struct.prototype.__list__ = [];\n\n const DNA = this.SDNA[name] = {\n constructor: blen_struct,\n };\n let offset = 0;\n // Create properties of struct\n for (let i = 0; i < struct.length; i += 3) {\n let _name = struct[i];\n const n = _name,\n type = struct[i + 1];\n let length = struct[i + 2],\n array_length = 0,\n match = null,\n Blender_Array_Length = 1,\n Suparray_match = 1,\n PointerToArray = false,\n Pointer_Match = 0;\n\n\n let original_name = _name;\n\n // mini type parser\n if ((match = _name.match(/(\\*?)(\\*?)(\\w+)(\\[(\\w*)\\])?(\\[(\\w*)\\])?/))) {\n\n // base name\n _name = match[3];\n\n // pointer type\n if (match[1]) {\n Pointer_Match = 10;\n blen_struct.prototype.__pointers.push(_name);\n }\n\n if (match[2]) {\n PointerToArray = true;\n }\n\n // arrays\n if (match[4]) {\n if (match[6]) {\n Suparray_match = parseInt(match[5]);\n Blender_Array_Length = parseInt(match[7]);\n } else {\n Blender_Array_Length = parseInt(match[5]);\n }\n }\n array_length = Blender_Array_Length * length;\n length = array_length * Suparray_match;\n }\n\n DNA[n] = {\n type: type,\n length: length,\n isArray: (Blender_Array_Length > 0),\n };\n\n if (PointerToArray) {\n Object.defineProperty(blen_struct.prototype, _name, pointerProp2(offset));\n offset += pointer_size;\n } else if (Suparray_match > 1) {\n const array_names = new Array(Suparray_match);\n\n // construct sub_array object that will return the correct structs\n for (let j = 0; j < Suparray_match; j++) {\n let array_name_ = `__${_name}[${j}]__`;\n array_names[j] = array_name_;\n\n offset = compileProp(blen_struct.prototype, array_name_, type, offset, Blender_Array_Length, Pointer_Match, pointer_size, array_length);\n }\n\n Object.defineProperty(blen_struct.prototype, _name, {\n get: (function (array_names) {\n return function () {\n const array = [];\n for (let i = 0; i < array_names.length; i++) {\n array.push(this[array_names[i]]);\n }\n return array;\n };\n })(array_names),\n enumerable: true,\n configurable: true,\n });\n } else {\n offset = compileProp(blen_struct.prototype, _name, type, offset, Blender_Array_Length, Pointer_Match, pointer_size, length);\n }\n }\n\n return this.SDNA[name].constructor;\n\n } else {\n if (!this.SDNA[name]) {\n return null;\n }\n return this.SDNA[name].constructor;\n }\n },\n };\n\n const BLENDER_STRUCTURE = function () {\n this.__blender_file__ = null;\n this.__list__ = null;\n this.__super_array_list__ = null;\n this.blender_name = '';\n this.__pointers = null;\n this.address = null;\n this.length = 0;\n this.__data_address__ = 0;\n this.blender_name = '';\n this._length = 0;\n };\n\n\n /*\n Returns a pre-constructed BLENDER_STRUCTURE or creates a new BLENDER_STRUCTURE to match the DNA struct type\n */\n const pointer_function = (pointer) => () => {\n return FILE.memory_lookup[pointer];\n };\n\n function getPointer (offset) {\n const pointerLow = data.getUint32(offset, BIG_ENDIAN);\n if (pointer_size > 4) {\n const pointerHigh = data.getUint32(offset + 4, BIG_ENDIAN);\n\n if (BIG_ENDIAN) {\n return (pointerLow) + '' + pointerHigh;\n } else {\n return (pointerHigh) + '' + pointerLow;\n }\n } else {\n return pointerLow;\n }\n }\n\n BLENDER_STRUCTURE.prototype = {\n setData: function (pointer, _data_offset, data_block_length, BLENDER_FILE) {\n if (this.__list__ === null) return this;\n BLENDER_FILE.addObject(this);\n\n this.__blender_file__ = BLENDER_FILE;\n\n const struct = this.__list__;\n let j = 0,\n i = 0,\n obj, name = '',\n type, length, Blender_Array_Length, Pointer_Match, offset, constructor;\n\n this.__data_address__ = _data_offset;\n\n // if(this.blender_name === 'CustomDataLayer') debugger\n\n if (struct === null) return this;\n\n for (i = 0; i < struct.length; i += 6) {\n obj = null;\n name = struct[i];\n type = struct[i + 1];\n Blender_Array_Length = struct[i + 4];\n Pointer_Match = struct[i + 5];\n offset = this.__data_address__ + struct[i + 3];\n\n if (Blender_Array_Length > 1) {\n this[name] = [];\n j = 0;\n while (j < Blender_Array_Length) {\n if (current_SDNA_template.getSDNAStructureConstructor(type)) {\n constructor = current_SDNA_template.getSDNAStructureConstructor(type);\n this[name].push((new constructor()).setData(0, offset, offset + length / Blender_Array_Length, BLENDER_FILE));\n } else this[name].push(null);\n offset += length / Blender_Array_Length;\n j++;\n }\n } else {\n if (current_SDNA_template.getSDNAStructureConstructor(type)) {\n constructor = current_SDNA_template.getSDNAStructureConstructor(type);\n this[name] = (new constructor()).setData(0, offset, length + offset, BLENDER_FILE);\n } else this[name] = null;\n }\n }\n // break connection to configuration list\n this.__list__ = null;\n return this;\n },\n\n get aname () {\n if (this.id) return this.id.name.slice(2);\n else return undefined;\n },\n };\n\n function toString (buffer, _in, _out) {\n return String.fromCharCode.apply(String, new Uint8Array(buffer, _in, _out - _in));\n }\n\n // Begin parsing blender __blender_file__\n\n function readFile () {\n let count = 0;\n let offset2 = 0;\n const root = 0;\n const i = 0;\n let data_offset = 0;\n let sdna_index = 0;\n let code = '';\n let block_length = 0;\n let curr_count = 0;\n let curr_count2 = 0;\n\n FILE.memory_lookup = {};\n struct_names = [];\n offset = 0;\n\n // todo gzip, zstd(28 b5 2f fd, https://projects.blender.org/archive/blender-file/issues/93858)\n // Make sure we have a .blend __blender_file__. All blend files have the first 12bytes\n // set with BLENDER-v### in Utf-8\n const magic = toString(_data, offset, 7)\n if (magic !== 'BLENDER') return ERROR = 'File supplied is not a .blend compatible Blender file.';\n\n // otherwise get templete from save version.\n\n offset += 7;\n pointer_size = ((toString(_data, offset++, offset)) == '_') ? 4 : 8;\n BIG_ENDIAN = toString(_data, offset++, offset) !== 'V';\n const version = toString(_data, offset, offset + 3);\n\n\n // create new master template if none exist for current blender version;\n if (!templates[version]) {\n templates[version] = new MASTER_SDNA_SCHEMA(version);\n }\n\n current_SDNA_template = templates[version];\n\n FILE.template = current_SDNA_template;\n\n offset += 3;\n\n // Set SDNA structs if template hasn't been set.\n // Todo: Move the following block into the MASTER_SDNA_SCHEMA object.\n //* Like so:*/ current_SDNA_template.set(AB);\n\n if (!current_SDNA_template.SDNA_SET) {\n current_SDNA_template.endianess = BIG_ENDIAN;\n current_SDNA_template.pointer_size = pointer_size;\n // find DNA1 data block\n offset2 = offset;\n\n while (true) {\n sdna_index = data.getInt32(offset2 + pointer_size + 8, BIG_ENDIAN);\n // eslint-disable-next-line no-control-regex\n code = toString(_data, offset2, offset2 + 4).replace(/\\u0000/g, '');\n block_length = data.getInt32(offset2 + 4, true);\n offset2 += 16 + (pointer_size);\n if (code === 'DNA1') {\n // DNA found; This is the core of the __blender_file__ and contains all the structure for the various data types used in Blender.\n count = 0;\n let types = [],\n fields = [],\n names = [],\n lengths = [],\n name = '',\n curr_name = '';\n\n // skip SDNA and NAME identifiers\n offset2 += 8;\n\n // Number of structs.\n count = data.getInt32(offset2, true);\n offset2 += 4;\n\n curr_count = 0;\n\n // Build up list of names for structs\n while (curr_count < count) {\n curr_name = '';\n while (data.getInt8(offset2) !== 0) {\n curr_name += toString(_data, offset2, offset2 + 1);\n offset2++;\n }\n names.push(curr_name);\n offset2++;\n curr_count++;\n }\n\n // todo fix seek logic\n // Adjust for 4byte alignment TYPE\n if (toString(_data, offset2, offset2 + 4) !== 'TYPE'\n ) {\n for (let j = 0; j < 8; j++) {\n if(toString(_data, offset2, offset2 + 4) === 'TYPE') break\n offset2++;\n }\n // offset2 = (4 - (offset2 % 4)) + offset2;\n }\n if(toString(_data, offset2, offset2 + 4) !== 'TYPE') {\n debugger\n }\n offset2 += 4;\n\n // Number of struct types\n count = data.getUint32(offset2, true);\n offset2 += 4;\n curr_count = 0;\n\n // Build up list of types\n while (curr_count < count) {\n curr_name = '';\n while (data.getInt8(offset2) !== 0) {\n curr_name += toString(_data, offset2, offset2 + 1);\n offset2++;\n }\n types.push(curr_name);\n offset2++;\n curr_count++;\n }\n\n // todo fix seek logic\n // Adjust for 4byte alignment\n if (toString(_data, offset2, offset2 + 4) !== 'TLEN'\n ) {\n for (let j = 0; j < 8; j++) {\n if(toString(_data, offset2, offset2 + 4) === 'TLEN') break\n offset2++;\n }\n // offset2 = (4 - (offset2 % 4)) + offset2;\n }\n if(toString(_data, offset2, offset2 + 4) !== 'TLEN') {\n debugger\n }\n offset2 += 4;\n curr_count = 0;\n\n // Build up list of byte lengths for types\n while (curr_count < count) {\n lengths.push(data.getInt16(offset2, BIG_ENDIAN));\n offset2 += 2;\n curr_count++;\n }\n\n // todo fix seek logic\n // Adjust for 4byte alignment STRC\n if (toString(_data, offset2, offset2 + 4) !== 'STRC'\n ) {\n for (let j = 0; j < 8; j++) {\n if(toString(_data, offset2, offset2 + 4) === 'STRC') break\n offset2++;\n }\n // offset2 = (4 - (offset2 % 4)) + offset2;\n }\n if(toString(_data, offset2, offset2 + 4) !== 'STRC') {\n debugger\n }\n offset2 += 4;\n\n // Number of structures\n const structure_count = data.getInt32(offset2, BIG_ENDIAN);\n offset2 += 4;\n curr_count = 0;\n\n // Create constructor objects from list of SDNA structs\n while (curr_count < structure_count) {\n const struct_name = types[data.getInt16(offset2, BIG_ENDIAN)];\n offset2 += 2;\n const obj = [];\n count = data.getInt16(offset2, BIG_ENDIAN);\n offset2 += 2;\n curr_count2 = 0;\n struct_names.push(struct_name);\n\n // Fill an array with name, type, and length for each SDNA struct property\n while (curr_count2 < count) {\n\n // const n = names[data.getInt16(offset2 + 2, BIG_ENDIAN)]\n // if(obj.find((o, i)=>i%3===0 && o===n)){\n // debugger\n // }\n obj.push(names[data.getInt16(offset2 + 2, BIG_ENDIAN)], types[data.getInt16(offset2, BIG_ENDIAN)], lengths[data.getInt16(offset2, BIG_ENDIAN)]);\n offset2 += 4;\n curr_count2++;\n }\n\n // Create a SDNA constructor by passing [type,name,lenth] array as second argument\n current_SDNA_template.getSDNAStructureConstructor(struct_name, obj);\n curr_count++;\n }\n current_SDNA_template.SDNA_SET = true;\n current_SDNA_template.SDNA_NAMES = struct_names;\n break;\n }\n offset2 += block_length;\n }\n }\n\n // parse the rest of the data, starting back at the top.\n\n // TODO: turn into \"on-demand\" parsing.\n\n // https://github.com/fschutt/mystery-of-the-blend-backup\n while (true) {\n // todo fix cleanup\n // this is not the case, see blend-load-test.blend and Ruins_Assets.blend\n // if ((offset % 4) > 0) {\n // console.log('fix', offset, offset % 4)\n // debugger\n // offset = (4 - (offset % 4)) + offset;\n // }\n for (let j = 0; j < 8; j++) {\n if(data.getInt8(offset) === 0) {\n offset++\n continue\n }\n break\n }\n if(data.getInt8(offset) === 0) {\n debugger\n }\n\n data_offset = offset;\n\n if (offset + pointer_size + 12 >= data.byteLength) {\n ERROR = 'Unexpected end of file while parsing';\n break\n }\n\n sdna_index = data.getInt32(offset + pointer_size + 8, BIG_ENDIAN);\n // let code_uint = data.getUint32(offset, BIG_ENDIAN);\n const code_str = toString(_data, offset, offset + 4) // data.getUint32(offset, BIG_ENDIAN);\n\n offset2 = offset + 16 + (pointer_size);\n // console.log(code_str, code_str.length, data.getInt8(offset))\n\n const blockLength = data.getInt32(offset + 4, true);\n if (blockLength < 0 || offset + blockLength + 16 + pointer_size > data.byteLength) {\n ERROR = 'Invalid block length detected';\n break\n }\n // if(blockLength === 1) {\n // debugger\n // }\n\n // last_offset = offset\n\n offset += blockLength + 16 + (pointer_size);\n\n if (code_str === 'DNA1') {} // skip - already processed at this point\n else if (code_str === 'ENDB') break; // end of __blender_file__ found\n else if (code_str === 'TEST') { // snapshot\n const data_start = data_offset + pointer_size + 16;\n const width = data.getInt32(data_start, BIG_ENDIAN);\n const height = data.getInt32(data_start + 4, BIG_ENDIAN);\n if ((width * height > 0)) {\n const data_len = width * height * 4; // RGBA\n if(blockLength < data_len + 8) {\n ERROR = 'Invalid TEST block length detected';\n break;\n }\n const image_data = new Uint32Array(_data, data_start + 8, data_len >> 2);\n const image = {\n width: width,\n height: height,\n data: image_data,\n };\n FILE.thumbnail = image\n }\n }\n else {\n // Create a Blender object using a constructor template from current_SDNA_template\n const data_start = data_offset + pointer_size + 16;\n\n // Get a SDNA constructor by name;\n const constructor = current_SDNA_template.getSDNAStructureConstructor(current_SDNA_template.SDNA_NAMES[sdna_index]);\n\n const size = data.getInt32(data_offset + 4, BIG_ENDIAN);\n\n count = data.getInt32(data_offset + 12 + pointer_size, BIG_ENDIAN);\n\n if (count > 0 && constructor) {\n let obj = new constructor();\n\n const length = constructor.prototype._length;\n\n\n const address = FILE.getPointer(data_offset + 8);\n\n obj.address = address + '';\n\n obj.setData(address, data_start, data_start + size, FILE);\n\n if (count > 1) {\n let array = [];\n array.push(obj);\n for (let u = 1; u < count; u++) {\n obj = new constructor();\n obj.setData(address, data_start + length * u, data_start + (length * u) + length, FILE);\n array.push(obj);\n }\n FILE.memory_lookup[address] = array;\n } else {\n FILE.memory_lookup[address] = obj;\n }\n }\n }\n }\n }\n}\n\nworker = new worker_code();\n\nworker.postMessage = function (message, err) {\n return_object.onParseReady(message, err);\n};\n\nexport default return_object;\n\n// window.prettyPrintHex = function (view, offset = 0, length = view.byteLength - offset) {\n// const bytes = Array.from({ length }, (_, i) => view.getUint8(offset + i));\n// console.log(bytes.map((b, i) => (i % 16 === 0 ? '\\n' : '') + b.toString(16).padStart(2, '0')).join(' '));\n// console.log(bytes.map((b, i) => (i % 16 === 0 ? '\\n' : '') + String.fromCharCode(b)).join(''));\n// }\n","/* eslint-disable camelcase */\n/**\n * JS.Blend\n * Original Repo: https://github.com/acweathersby/js.blend\n * Slightly modified for three.js and js updates, minor refactor.\n * Object-creation part re-written for latest three.js and typescript\n * MIT License\n * Copyright (c) 2020 Anthony C, Weathersby\n * @license\n */\nimport parser from './parser/parser.js';\n\nexport async function parseBlend (buffer, name = '') {\n return new Promise((res, rej) => {\n parser.onParseReady = (file, error) => {\n // todo throw error if no objects?\n if (error) console.error(error)\n res(file)\n }\n parser.loadBlendFromArrayBuffer(buffer, name)\n })\n}\n","import {Object3D} from 'threepipe'\n\nexport function createCamera(object: any, ctx: any): Object3D | undefined {\n const cdata = object.data\n // console.log(bakeGetters(object))\n if (!cdata) return undefined\n\n // Blender camera types: 0 = Perspective, 1 = Orthographic\n const type = cdata.type\n let camera: Object3D\n if (type === 0) {\n // Perspective\n camera = new ctx.PerspectiveCamera(\n cdata.lens || 50, // fov or lens\n (cdata.sensor_x || 36) / (cdata.sensor_y || 24), // aspect\n cdata.clipsta || 0.1, // near\n cdata.clipend || 1000 // far\n )\n // Set additional properties if needed\n camera.position.set(0, 0, 0)\n if ('shiftx' in cdata) camera.userData.shiftX = cdata.shiftx // todo?\n if ('shifty' in cdata) camera.userData.shiftY = cdata.shifty\n } else if (type === 1) {\n // Orthographic\n const scale = cdata.ortho_scale || 1\n const aspect = (cdata.sensor_x || 36) / (cdata.sensor_y || 24)\n const left = -scale * aspect / 2\n const right = scale * aspect / 2\n const top = scale / 2\n const bottom = -scale / 2\n camera = new ctx.OrthographicCamera(\n left, right, top, bottom,\n cdata.clipsta || 0.1,\n cdata.clipend || 1000\n )\n camera.position.set(0, 0, 0)\n if ('shiftx' in cdata) camera.userData.shiftX = cdata.shiftx\n if ('shifty' in cdata) camera.userData.shiftY = cdata.shifty\n } else {\n // Unknown camera type\n camera = new ctx.PerspectiveCamera()\n console.warn('Unsupported camera type', type)\n }\n\n return camera\n}\n","import {Light} from 'threepipe'\n\nconst blenderLightTypes = {\n point: 0,\n sun: 1,\n spot: 0,\n hemi: 0,\n area: 0,\n}\n\nexport function createLight(lamp: any, ctx: any) {\n const ldata = lamp.data\n\n const position = [lamp.loc[0], lamp.loc[2], -lamp.loc[1]]\n\n const color = ldata.r * 255 << 16 | ldata.g * 255 << 8 | ldata.b * 255 << 0\n const intensity = ldata.energy\n const distance = 0\n\n let light: Light | undefined = undefined\n\n switch (ldata.type) {\n case blenderLightTypes.point:\n light = new ctx.PointLight(color, intensity, distance)\n light!.position.fromArray(position, 0)\n light!.castShadow = true\n break\n case blenderLightTypes.sun:\n light = new ctx.PointLight(color, intensity, distance)\n light!.position.fromArray(position, 0)\n light!.castShadow = true\n if (light!.shadow) {\n light!.shadow.mapSize.width = 1024\n light!.shadow.mapSize.height = 1024\n // @ts-expect-error ??/\n light!.shadow.camera.near = 0.01\n // @ts-expect-error ??/\n light!.shadow.camera.far = 500\n }\n break\n default:\n console.warn('Unsupported light type', ldata.type)\n }\n\n return light\n}\n","function getLayer(layers: any, i: number) {\n if (!Array.isArray(layers)) return layers\n return layers[i]\n}\n// https://projects.blender.org/blender/blender/pulls/108015/files\n// https://projects.blender.org/blender/blender/commit/1b63a290c68636211b16c5e212a699e6b63031b9\n// https://developer.blender.org/docs/release_notes/4.0/python_api/#breaking-changes\n// https://developer.blender.org/docs/release_notes/4.0/#blend-files\n// https://projects.blender.org/blender/blender/commit/7966cd16d6dc4e66d01f7bd68a090107c1a7978c\n// https://projects.blender.org/blender/blender/issues/95967\n// https://projects.blender.org/blender/blender/pulls/106638\n\n// https://github.com/blender/blender/blob/55e2fd2929b7577e0785c128c8f8069efd990c07/source/blender/blenkernel/intern/mesh.cc#L413\nexport function createBufferGeometry(meshData: any, ctx: any) {\n\n if (meshData.mpoly) return createBufferGeometryOld(meshData, ctx)\n const geometry = new ctx.BufferGeometry()\n geometry.name = meshData.aname || ''\n\n // console.log(bakeGetters(meshData))\n\n // https://github.com/blender/blender/blob/05dcc0377b62d8e026e1901dfbecbd4b06fda0b5/scripts/addons_core/io_scene_gltf2/blender/exp/primitive_extract.py#L19\n\n let vertices\n let indices\n\n // Extract vertex positions from vdata layers\n if (meshData.vdata && meshData.vdata.layers && meshData.vdata.totlayer > 0) {\n for (let i = 0; i < meshData.vdata.totlayer; i++) {\n const layer = getLayer(meshData.vdata.layers, i)\n // if (layer.type === 0) {\n // https://github.com/blender/blender/blob/05dcc0377b62d8e026e1901dfbecbd4b06fda0b5/scripts/addons_core/io_scene_gltf2/blender/exp/primitive_extract.py#L1575\n const data = layer.data || []\n // if (layer.name === 'position') { // type = 48 (custom vec3)\n if (data.length === meshData.totvert) {\n if (vertices && (layer.name !== 'position' || vertices.name === 'position')) {\n // console.warn('BlendLoader - multiple vertices, ignoring', layer)\n continue\n }\n vertices = layer\n } else {\n // console.log('unknown vdata', layer)\n }\n }\n }\n\n // Blender loops are indexes in three.js/blender. Called dots in gltf exporter\n\n // // Extract indexes from loop data layers\n if (meshData.ldata && meshData.ldata.layers) {\n for (let i = 0; i < meshData.ldata.totlayer; i++) {\n const layer = getLayer(meshData.ldata.layers, i)\n // if (layer.type === 0) {\n const data = layer.data || []\n // if (layer.name === '.corner_vert') { // type = 11\n if (data.length === meshData.totloop) { // type = 11\n if (indices && (layer.name !== '.corner_vert' || indices.name === '.corner_vert')) {\n // console.warn('BlendLoader - multiple indices, ignoring', layer)\n continue\n }\n indices = layer\n } else {\n // console.log('unknown ldata', layer)\n }\n }\n }\n // if (meshData.pdata && meshData.pdata.layers) {\n // for (let i = 0; i < meshData.pdata.totlayer; i++) {\n // const layer = getLayer(meshData.pdata.layers, i)\n // // if (layer.type === 0) {\n // // if (layer.name === '.corner_vert') { // type = 11\n // // } else {\n // console.log('unknown pdata', layer)\n // // }\n // }\n // }\n // if (meshData.fdata && meshData.fdata.layers) {\n // for (let i = 0; i < meshData.fdata.totlayer; i++) {\n // const layer = getLayer(meshData.fdata.layers, i)\n // // if (layer.type === 0) {\n // // if (layer.name === '.corner_vert') { // type = 11\n // // } else {\n // console.log('unknown fdata', layer)\n // // }\n // }\n // }\n // if (meshData.edata && meshData.edata.layers) {\n // for (let i = 0; i < meshData.edata.totlayer; i++) {\n // const layer = getLayer(meshData.edata.layers, i)\n // // if (layer.type === 0) {\n // // if (layer.name === '.corner_vert') { // type = 11\n // // } else {\n // console.log('unknown edata', layer)\n // // }\n // }\n // }\n\n let faceIndices: number[] = []\n if (meshData.poly_offset_indices && meshData.totpoly > 0) {\n faceIndices = [...new Int32Array(meshData.poly_offset_indices.__blender_file__.AB, meshData.poly_offset_indices.__data_address__, meshData.totpoly + 1)]\n }\n // if (faceSize !== 3 && faceSize !== 4 && !faceIndices.length) {\n // console.error('not supported polygons with ', faceSize, 'vertices')\n // return geometry\n // }\n\n if (vertices?.data && vertices.data.length > 0) {\n const positions = new Float32Array(vertices.data.length * 3)\n for (let j = 0; j < vertices.data.length; j++) {\n const vertex = vertices.data[j]\n if (vertex.x !== undefined) {\n positions[j * 3] = vertex.x\n positions[j * 3 + 1] = vertex.z\n positions[j * 3 + 2] = -vertex.y\n } else if (vertex.co !== undefined) {\n positions[j * 3] = vertex.co[0]\n positions[j * 3 + 1] = vertex.co[2]\n positions[j * 3 + 2] = -vertex.co[1]\n } else {\n // console.log(bakeGetters(meshData))\n // const t = [...new Int32Array(vertex.__blender_file__.AB, vertex.__data_address__, 8)]\n // debugger\n console.error('BlendLoader - unknown vertex', vertex)\n break\n }\n }\n geometry.setAttribute('position', new ctx.BufferAttribute(positions, 3))\n }\n\n if (indices?.data && indices.data.length > 0 && vertices?.data?.length) {\n const faceSize = meshData.totloop / meshData.totpoly\n if (faceIndices.length > 0) {\n // Use face offset indices for variable-sized faces\n let totalTriangles = 0\n for (let i = 0; i < faceIndices.length - 1; i++) {\n const faceVertCount = faceIndices[i + 1] - faceIndices[i]\n totalTriangles += Math.max(0, faceVertCount - 2)\n }\n\n const indexes = new Uint32Array(totalTriangles * 3)\n let t = 0\n\n for (let i = 0; i < faceIndices.length - 1; i++) {\n const faceStart = faceIndices[i]\n const faceEnd = faceIndices[i + 1]\n const faceVertCount = faceEnd - faceStart\n\n if (faceVertCount >= 3) {\n // todo better Triangulate the face using fan triangulation\n const firstVert = indices.data[faceStart].i\n for (let k = 1; k < faceVertCount - 1; k++) {\n indexes[t++] = firstVert\n indexes[t++] = indices.data[faceStart + k].i\n indexes[t++] = indices.data[faceStart + k + 1].i\n }\n } else {\n // debugger\n }\n }\n\n // console.log(indexes)\n geometry.setIndex(new ctx.BufferAttribute(indexes, 1))\n } else if (faceSize === 3 || faceSize === 4) {\n // Fall back to uniform face size approach\n const isQuad = faceSize === 4\n const faceCount = indices.length / faceSize\n const indexes = new Uint32Array(faceCount * 3 * (isQuad ? 2 : 1))\n\n if (faceSize !== 3 && faceSize !== 4) return geometry\n for (let j = 0, t = 0; j < indices.length; j += faceSize) {\n const a = indices[j].i\n const b = indices[j + 1].i\n const c = indices[j + 2].i\n indexes[t++] = a\n indexes[t++] = b\n indexes[t++] = c\n\n if (isQuad) {\n const d = indices[j + 3].i\n indexes[t++] = a\n indexes[t++] = c\n indexes[t++] = d\n }\n }\n geometry.setIndex(new ctx.BufferAttribute(indexes, 1))\n }\n } else if (faceIndices) {\n console.error('BlendLoader - no indices data found, but face indices are present', faceIndices)\n }\n\n // console.log(geometry.attributes.position)\n // console.log(geometry.index)\n\n // compute stuff not present\n if (geometry.attributes.position && !geometry.attributes.normal)\n geometry.computeVertexNormals()\n\n // if (meshData.loc) { // maybe this is the bbox center?\n // geometry.translate(meshData.loc[0], meshData.loc[2], -meshData.loc[1])\n // }\n // if (meshData.size) { // maybe this is the bbox size?\n // geometry.scale(meshData.size[0], meshData.size[2], -meshData.size[1])\n // }\n\n return geometry\n}\n// // https://github.com/blender/blender/blob/05dcc0377b62d8e026e1901dfbecbd4b06fda0b5/scripts/addons_core/io_scene_gltf2/blender/exp/primitive_extract.py#L19\n// // https://github.com/blender/blender/blob/05dcc0377b62d8e026e1901dfbecbd4b06fda0b5/scripts/addons_core/io_scene_gltf2/blender/exp/primitive_extract.py#L1575\n// // todo __set_morph_locs_attribute\n// // todo __set_morph_tangent_attribute\n// // todo pdata(points), edata(edge), fdata(face? legacy?)\n// // meshData.eData = domain edge - https://github.com/blender/blender/blob/05dcc0377b62d8e026e1901dfbecbd4b06fda0b5/scripts/addons_core/io_scene_gltf2/blender/exp/primitive_extract.py#L189\n// // todo normals, tangents\n\nexport function createBufferGeometryOld(mesh: any, ctx: any) {\n const\n faces = Array.isArray(mesh.mpoly) ? mesh.mpoly as any[] : [mesh.mpoly],\n loops = mesh.mloop,\n uv = mesh.mloopuv,\n vertices = mesh.mvert\n\n const geometry = new ctx.BufferGeometry()\n\n if (!faces) return geometry\n\n const size = faces.reduce((acc, face) => acc + Math.floor(face.totloop * 3.0 / 2), 0)\n const indices = new Uint32Array(size)\n const uvs = new Float32Array(size * 2)\n const normals = new Float32Array(size * 3)\n const positions = new Float32Array(size * 3)\n\n let currentIndex = 0\n let computeNormals = false\n\n for (const face of faces) {\n const len = face.totloop\n const start = face.loopstart\n let indexi = 1\n\n while (indexi < len) {\n\n let index = 0\n\n for (let l = 0; l < 3; l++) {\n // Per Vertex\n\n index = start\n if (indexi - 1 + l < len)\n index += indexi - 1 + l\n\n const loop = loops[index]\n const vert = vertices[loop.v]\n indices[currentIndex] = currentIndex\n\n positions[currentIndex * 3 + 0] = vert.co[0]\n positions[currentIndex * 3 + 1] = vert.co[2]\n positions[currentIndex * 3 + 2] = -vert.co[1]\n\n if (vert.no) {\n normals[currentIndex * 3 + 0] = vert.no[0]\n normals[currentIndex * 3 + 1] = vert.no[2]\n normals[currentIndex * 3 + 2] = -vert.no[1]\n } else {\n computeNormals = true\n }\n\n if (uv) {\n uvs[currentIndex * 2 + 0] = uv[index].uv[0]\n uvs[currentIndex * 2 + 1] = uv[index].uv[1]\n }\n\n currentIndex++\n }\n\n indexi += 2\n }\n }\n\n geometry.setAttribute('position', new ctx.BufferAttribute(positions, 3))\n geometry.setIndex(new ctx.BufferAttribute(indices, 1))\n geometry.setAttribute('normal', new ctx.BufferAttribute(normals, 3))\n geometry.setAttribute('uv', new ctx.BufferAttribute(uvs, 2))\n\n if (computeNormals) {\n geometry.computeVertexNormals()\n }\n\n return geometry\n}\n","// todo see blender gltf exporter and convert to js. structure is the same\n// https://github.com/KhronosGroup/glTF-Blender-IO/blob/ed5100ab6c40472b7c3254fddfe0dd0d76d60644/addons/io_scene_gltf2/blender/exp/material/materials.py#L60\nexport function createMaterial(mat: any, ctx: any) {\n const material = new ctx.MeshPhysicalMaterial()\n material.color.setRGB(mat.r, mat.g, mat.b)\n material.roughness = mat.roughness !== undefined ? mat.roughness : 0.4\n material.metalness = mat.metallic !== undefined ? mat.metallic : 0.0\n // material.opacity = mat.alpha !== undefined ? mat.alpha : 0.0\n material.opacity = 1\n material.transparent = material.opacity < 1.0\n return material\n}\n","import {Object3D} from 'threepipe'\nimport {createBufferGeometry} from './geometry'\nimport {createMaterial} from './material'\n\nexport function setCreateTransform(object: any, obj: Object3D) {\n // obj.rotateZ(object.rot[2])\n // obj.rotateY(object.rot[1])\n // obj.rotateX(object.rot[0])\n\n obj.name = object.aname\n obj.quaternion.set(object.quat[1], object.quat[3], -object.quat[2], object.quat[0]) // wxyz\n obj.scale.set(object.size[0], object.size[1], object.size[2])\n obj.position.set(object.loc[0], object.loc[2], -object.loc[1])\n obj.updateMatrix()\n}\n\nexport function createMesh(object: any, loaded: WeakMap<any, any>, ctx: any) {\n if (!object.data) {\n return undefined\n }\n\n const geometry = loaded.get(object.data) ?? createBufferGeometry(object.data, ctx)\n loaded.set(object.data, geometry)\n\n const mat = object.data.mat[0]\n\n // const material = mat ? createMaterial(mat) : undefined\n const material = mat ? loaded.get(mat) ?? createMaterial(mat, ctx) : new ctx.MeshPhysicalMaterial()\n if (mat) loaded.set(mat, material)\n\n // console.log(material, mat)\n // material.side = DoubleSide\n const mesh = new ctx.Mesh(geometry, material)\n\n mesh.castShadow = true\n mesh.receiveShadow = true\n\n return mesh\n}\n","import {createCamera} from './camera'\nimport {createLight} from './light'\nimport {createMesh, setCreateTransform} from './mesh'\nimport {Object3D} from 'threepipe'\n\n// https://github.com/blender/blender/blob/99a4c93081cc2310a09a14f20a1493e8974c10d2/source/blender/makesdna/DNA_object_types.h#L445\nconst blenderObjectTypes = {\n empty: 0,\n mesh: 1,\n lamp: 10,\n camera: 11,\n}\n\nexport async function createObjects(file: any, ctx: any) {\n const objects: (Object3D|null)[] = []\n const childMap = new Map<any, Object3D[]>()\n const objMap = new Map<any, Object3D>()\n const blendObjects = file.objects.Object ?? []\n const loaded = new WeakMap()\n // console.log(bakeGetters(file))\n for (const object of blendObjects) {\n if (loaded.has(object)) {\n console.warn('BlendLoader - duplicate object')\n continue\n }\n let obj: Object3D | undefined = undefined\n switch (object.type) {\n case blenderObjectTypes.empty:\n obj = new ctx.Object3D()\n break\n case blenderObjectTypes.mesh:\n obj = createMesh(object, loaded, ctx)\n break\n case blenderObjectTypes.lamp:\n obj = createLight(object, ctx)\n break\n case blenderObjectTypes.camera:\n obj = createCamera(object, ctx)\n break\n default:\n obj = new ctx.Object3D()\n console.warn('Unsupported object type', object.type, object, obj)\n }\n if (obj) {\n setCreateTransform(object, obj)\n const exChildren = childMap.get(object)\n if (exChildren) {\n for (const exChild of exChildren) {\n obj.add(exChild)\n }\n childMap.delete(object)\n }\n objMap.set(object, obj)\n if (object.parent === object) {\n console.error('invalid, parent same as object, adding to root', object)\n objects.push(obj)\n } else if (!object.parent) { // just in case\n objects.push(obj)\n } else {\n const parent = objMap.get(object.parent)\n if (!parent) {\n const chi = childMap.get(object.parent) ?? []\n chi.push(obj)\n childMap.set(object, chi)\n } else {\n parent.add(obj)\n }\n }\n loaded.set(object, obj)\n }\n }\n if (childMap.size) {\n const vals = [...childMap.values()].flat()\n console.warn('unknown objects with parents, adding to root', vals, childMap)\n objects.push(...vals)\n }\n return objects.filter(o => !!o) as Object3D[]\n}\n","import {\n AnyOptions,\n BaseImporterPlugin,\n BufferAttribute,\n BufferGeometry2,\n DirectionalLight2,\n FileLoader,\n ILoader,\n Importer,\n Mesh2,\n Object3D,\n Object3D2,\n OrthographicCamera0,\n PerspectiveCamera0,\n PhysicalMaterial,\n PointLight2,\n Scene,\n UnlitMaterial,\n} from 'threepipe'\nimport {parseBlend} from './js-blend/main.js'\nimport {createObjects} from './loader'\n\n/**\n * Adds support for loading Blend `.blend`, `application/x-blender` files and data uris\n */\nexport class BlendLoadPlugin extends BaseImporterPlugin {\n public static readonly PluginType = 'BlendLoadPlugin'\n constructor() {\n super()\n }\n protected _importer = new Importer(class extends FileLoader implements ILoader {\n async loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise<any> {\n this.setResponseType('arraybuffer')\n const res = (await super.loadAsync(url, onProgress)) as ArrayBuffer\n const blend = await parseBlend(res)\n // console.log(bakeGetters(blend))\n const ctx = {\n Object3D: Object3D2,\n Mesh: Mesh2,\n MeshPhysicalMaterial: PhysicalMaterial,\n MeshBasicMaterial: UnlitMaterial,\n PerspectiveCamera: PerspectiveCamera0,\n OrthographicCamera: OrthographicCamera0,\n PointLight: PointLight2,\n DirectionalLight: DirectionalLight2,\n BufferGeometry: BufferGeometry2,\n BufferAttribute: BufferAttribute,\n }\n const objects = await createObjects(blend, ctx)\n const root = new Object3D()\n root.add(...objects)\n // console.log(res, blend, root)\n blend.scene = root\n return blend\n }\n\n transform(res: any, options: AnyOptions): Scene {\n // console.log(res)\n // res.scene.userData.kinematics = res.kinematics\n // res.scene.userData.library = res.library\n if (typeof options.onBlendLoad === 'function') {\n options.onBlendLoad(res)\n }\n return res.scene\n }\n }, ['blend'], ['application/x-blender'], true)\n}\n"],"names":["AB","offset","pointer_size","array_names","i","BLENDER_FILE","parser"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/js-blend/parser/parser.js","../src/js-blend/main.js","../src/loader/camera.ts","../src/loader/light.ts","../src/loader/geometry.ts","../src/loader/material.ts","../src/loader/mesh.ts","../../../node_modules/three/src/math/MathUtils.js","../../../node_modules/three/src/math/Quaternion.js","../../../node_modules/three/src/constants.js","../../../node_modules/three/src/math/Vector3.js","../../../node_modules/three/src/math/Matrix4.js","../../../node_modules/three/src/math/Euler.js","../src/loader/index.ts","../src/BlendLoadPlugin.ts"],"sourcesContent":["/* eslint-disable camelcase, no-unused-vars, no-empty, no-constant-condition */\nconst DNA1 = 826363460;\nconst ENDB = 1111772741;\n\n/* Note: Blender coordinates treat the Z axis as the vertical an Y as depth. */\n\n// web worker not functional in this version\nlet USE_WEBWORKER = false;\n\nlet worker = null;\n\n// FR = new FileReader(),\n\nconst return_object = {\n loadBlendFromArrayBuffer: function (array_buffer) {\n return_object.ready = false;\n if (USE_WEBWORKER) {\n worker.postMessage(array_buffer, array_buffer);\n } else {\n worker.onmessage({\n data: array_buffer,\n });\n }\n },\n // loadBlendFromBlob: function (blob) {\n // FR.onload = function () {\n // return_object.loadBlendFromArrayBuffer(this.result);\n // };\n // FR.readAsArrayBuffer(blob);\n // },\n ready: true,\n onParseReady: function () {},\n};\n\nfunction worker_code () {\n 'use strict';\n\n let data = null,\n _data = null,\n BIG_ENDIAN = false,\n pointer_size = 0,\n struct_names = [],\n offset = 0,\n working_blend_file = null,\n current_SDNA_template = null,\n templates = {},\n finished_objects = [],\n FILE = null,\n ERROR = null,\n AB = null;\n\n const self = this;\n\n function parseFile (msg) {\n\n if (typeof msg.data == 'object') {\n // reset global variables\n AB = null;\n data = null;\n BIG_ENDIAN = false;\n pointer_size = 0;\n struct_names = [];\n offset = 0;\n working_blend_file = null;\n finished_objects = [];\n current_SDNA_template = null;\n\n\n // set data\n _data = msg.data;\n\n AB = _data.slice();\n\n data = new DataView(_data);\n\n\n FILE = new BLENDER_FILE(AB);\n\n // start parsing\n readFile();\n\n // export parsed data\n self.postMessage(FILE, ERROR);\n }\n }\n\n /*\n Export object for a parsed __blender_file__.\n */\n\n const BLENDER_FILE = function (AB) {\n this.AB = AB;\n // this.double = new Float64Array(AB);\n this.byte = new Uint8Array(AB);\n\n this.dv = new DataView(AB);\n\n this.objects = {};\n this.memory_lookup = {},\n this.object_array = [];\n\n this.template = null;\n };\n\n BLENDER_FILE.prototype = {\n addObject: function (obj) {\n this.object_array.push(obj);\n if (!this.objects[obj.blender_name]) this.objects[obj.blender_name] = [];\n this.objects[obj.blender_name].push(obj);\n },\n\n getPointer: function (offset) {\n const pointerLow = this.dv.getUint32(offset, this.template.endianess);\n if (this.template.pointer_size > 4) {\n const pointerHigh = this.dv.getUint32(offset + 4, this.template.endianess);\n if (this.template.endianess) {\n return (pointerLow) + 'l|h' + pointerHigh;\n } else {\n return (pointerHigh) + 'h|l' + pointerLow;\n }\n } else {\n return pointerLow;\n }\n },\n };\n\n self.onmessage = parseFile;\n // this.onmessage = parseFile;\n\n /*\n These functions map offsets in the blender __blender_file__ to basic types (byte,short,int,float) through TypedArrays;\n This allows the underlying binary data to be changed.\n */\n\n function float64Prop (offset, Blender_Array_Length, length) {\n return {\n get: function () {\n return (Blender_Array_Length > 1) ?\n new Float64Array(this.__blender_file__.AB, this.__data_address__ + offset, length) :\n this.__blender_file__.dv.getFloat64(this.__data_address__ + offset, this.__blender_file__.template.endianess);\n },\n set: function (float) {\n if (Blender_Array_Length > 1) {} else {\n this.__blender_file__.dv.setFloat64(this.__data_address__ + offset, float, this.__blender_file__.template.endianess);\n }\n },\n enumerable: true,\n configurable: true,\n };\n }\n\n function floatProp (offset, Blender_Array_Length, length) {\n return {\n get: function () {\n return (Blender_Array_Length > 1) ?\n new Float32Array(this.__blender_file__.AB, this.__data_address__ + offset, length) :\n this.__blender_file__.dv.getFloat32(this.__data_address__ + offset, this.__blender_file__.template.endianess);\n },\n set: function (float) {\n if (Blender_Array_Length > 1) {} else {\n this.__blender_file__.dv.setFloat32(this.__data_address__ + offset, float, this.__blender_file__.template.endianess);\n }\n },\n enumerable: true,\n configurable: true,\n };\n }\n\n function intProp (offset, Blender_Array_Length, length) {\n return {\n get: function () {\n return (Blender_Array_Length > 1) ?\n new Int32Array(this.__blender_file__.AB, this.__data_address__ + offset, length) :\n this.__blender_file__.dv.getInt32(this.__data_address__ + offset, this.__blender_file__.template.endianess);\n },\n set: function (float) {\n if (Blender_Array_Length > 1) {} else {\n this.__blender_file__.dv.setInt32(this.__data_address__ + offset, float, this.__blender_file__.template.endianess);\n }\n },\n enumerable: true,\n configurable: true,\n };\n }\n\n function uIntProp (offset, Blender_Array_Length, length) {\n return {\n get: function () {\n return (Blender_Array_Length > 1) ?\n new Uint32Array(this.__blender_file__.AB, this.__data_address__ + offset, length) :\n this.__blender_file__.dv.getUint32(this.__data_address__ + offset, this.__blender_file__.template.endianess);\n },\n set: function (float) {\n if (Blender_Array_Length > 1) {} else {\n this.__blender_file__.dv.setUint32(this.__data_address__ + offset, float, this.__blender_file__.template.endianess);\n }\n },\n enumerable: true,\n configurable: true,\n };\n }\n\n function shortProp (offset, Blender_Array_Length, length) {\n return {\n get: function () {\n return (Blender_Array_Length > 1) ?\n new Int16Array(this.__blender_file__.AB, this.__data_address__ + offset, length) :\n this.__blender_file__.dv.getInt16(this.__data_address__ + offset, this.__blender_file__.template.endianess);\n },\n set: function (float) {\n if (Blender_Array_Length > 1) {} else {\n this.__blender_file__.dv.setInt16(this.__data_address__ + offset, float, this.__blender_file__.template.endianess);\n }\n },\n enumerable: true,\n configurable: true,\n };\n }\n\n const uShortProp = (offset, Blender_Array_Length, length) => {\n return {\n get: function () {\n return (Blender_Array_Length > 1) ?\n new Uint16Array(this.__blender_file__.AB, this.__data_address__ + offset, length) :\n this.__blender_file__.dv.getUint16(this.__data_address__ + offset, this.__blender_file__.template.endianess);\n },\n set: function (float) {\n if (Blender_Array_Length > 1) {\n } else {\n this.__blender_file__.dv.setUint16(this.__data_address__ + offset, float, this.__blender_file__.template.endianess);\n }\n },\n enumerable: true,\n configurable: true,\n };\n };\n\n function charProp (offset, Blender_Array_Length, length) {\n return {\n get: function () {\n if (Blender_Array_Length > 1) {\n let start = this.__data_address__ + offset;\n let end = start;\n let buffer_guard = 0;\n\n while (this.__blender_file__.byte[end] != 0 && buffer_guard++ < length) end++;\n\n return toString(this.__blender_file__.AB, start, end);\n }\n return this.__blender_file__.byte[(this.__data_address__ + offset)];\n },\n set: function (byte) {\n if (Blender_Array_Length > 1) {\n const string = byte + '';\n let i = 0;\n const l = string.length;\n while (i < length) {\n if (i < l) {\n this.__blender_file__.byte[(this.__data_address__ + offset + i)] = string.charCodeAt(i) | 0;\n } else {\n this.__blender_file__.byte[(this.__data_address__ + offset + i)] = 0;\n }\n i++;\n }\n } else {\n this.__blender_file__.byte[(this.__data_address__ + offset)] = byte | 0;\n }\n },\n enumerable: true,\n configurable: true,\n };\n }\n\n function pointerProp2 (offset) {\n return {\n get: function () {\n let pointer = this.__blender_file__.getPointer(this.__data_address__ + offset, this.__blender_file__);\n const link = this.__blender_file__.memory_lookup[pointer];\n\n const results = [];\n\n if (link) {\n const address = link.__data_address__;\n let j = 0;\n while (true) {\n pointer = this.__blender_file__.getPointer(address + j * 8, this.__blender_file__);\n let obj = this.__blender_file__.memory_lookup[pointer];\n if (!obj) break;\n results.push(obj);\n j++;\n }\n\n }\n\n return results;\n },\n set: function () {},\n enumerable: true,\n configurable: true,\n };\n }\n\n function pointerProp (offset, Blender_Array_Length, length) {\n return {\n get: function () {\n if (Blender_Array_Length > 1) {\n let array = [];\n let j = 0;\n let off = offset;\n while (j < Blender_Array_Length) {\n let pointer = this.__blender_file__.getPointer(this.__data_address__ + off, this.__blender_file__);\n\n array.push(this.__blender_file__.memory_lookup[pointer]);\n off += length;\n j++;\n }\n\n return array;\n } else {\n let pointer = this.__blender_file__.getPointer(this.__data_address__ + offset, this.__blender_file__);\n return this.__blender_file__.memory_lookup[pointer];\n }\n },\n set: function () {},\n enumerable: true,\n configurable: true,\n };\n }\n\n function compileProp (obj, name, type, offset, array_size, IS_POINTER, pointer_size, length) {\n\n if (!IS_POINTER) {\n switch (type) {\n case 'double':\n Object.defineProperty(obj, name, float64Prop(offset, array_size, length >> 3));\n break;\n case 'float':\n Object.defineProperty(obj, name, floatProp(offset, array_size, length >> 2));\n break;\n case 'int':\n Object.defineProperty(obj, name, intProp(offset, array_size, length >> 2));\n break;\n case 'short':\n Object.defineProperty(obj, name, shortProp(offset, array_size, length >> 1));\n break;\n case 'ushort':\n Object.defineProperty(obj, name, uShortProp(offset, array_size, length >> 1));\n break;\n case 'char':\n case 'uchar':\n Object.defineProperty(obj, name, charProp(offset, array_size, length));\n break;\n default:\n // compile list to\n obj[name] = {};\n obj.__list__.push(name, type, length, offset, array_size, IS_POINTER);\n }\n obj._length += length;\n offset += length;\n } else {\n Object.defineProperty(obj, name, pointerProp(offset, array_size, pointer_size));\n obj._length += pointer_size * array_size;\n offset += pointer_size * array_size;\n }\n\n return offset;\n }\n\n // Store final DNA structs\n const MASTER_SDNA_SCHEMA = function (version) {\n this.version = version;\n this.SDNA_SET = false;\n this.byte_size = 0;\n this.struct_index = 0;\n this.structs = {};\n this.SDNA = {};\n this.endianess = false;\n };\n\n MASTER_SDNA_SCHEMA.prototype = {\n getSDNAStructureConstructor: function (name, struct) {\n if (struct) {\n const jsName = name === 'void' ? 'void_' : name\n const blen_struct = Function('function ' + jsName + '(){}; return ' + jsName)();\n\n // if(name === 'CustomDataLayer') debugger\n\n blen_struct.prototype = new BLENDER_STRUCTURE();\n blen_struct.prototype.blender_name = name;\n blen_struct.prototype.__pointers = [];\n blen_struct.prototype.__list__ = [];\n\n const DNA = this.SDNA[name] = {\n constructor: blen_struct,\n };\n let offset = 0;\n // Create properties of struct\n for (let i = 0; i < struct.length; i += 3) {\n let _name = struct[i];\n const n = _name,\n type = struct[i + 1];\n let length = struct[i + 2],\n array_length = 0,\n match = null,\n Blender_Array_Length = 1,\n Suparray_match = 1,\n PointerToArray = false,\n Pointer_Match = 0;\n\n\n let original_name = _name;\n\n // mini type parser\n if ((match = _name.match(/(\\*?)(\\*?)(\\w+)(\\[(\\w*)\\])?(\\[(\\w*)\\])?/))) {\n\n // base name\n _name = match[3];\n\n // pointer type\n if (match[1]) {\n Pointer_Match = 10;\n blen_struct.prototype.__pointers.push(_name);\n }\n\n if (match[2]) {\n PointerToArray = true;\n }\n\n // arrays\n if (match[4]) {\n if (match[6]) {\n Suparray_match = parseInt(match[5]);\n Blender_Array_Length = parseInt(match[7]);\n } else {\n Blender_Array_Length = parseInt(match[5]);\n }\n }\n array_length = Blender_Array_Length * length;\n length = array_length * Suparray_match;\n }\n\n DNA[n] = {\n type: type,\n length: length,\n isArray: (Blender_Array_Length > 0),\n };\n\n if (PointerToArray) {\n Object.defineProperty(blen_struct.prototype, _name, pointerProp2(offset));\n offset += pointer_size;\n } else if (Suparray_match > 1) {\n const array_names = new Array(Suparray_match);\n\n // construct sub_array object that will return the correct structs\n for (let j = 0; j < Suparray_match; j++) {\n let array_name_ = `__${_name}[${j}]__`;\n array_names[j] = array_name_;\n\n offset = compileProp(blen_struct.prototype, array_name_, type, offset, Blender_Array_Length, Pointer_Match, pointer_size, array_length);\n }\n\n Object.defineProperty(blen_struct.prototype, _name, {\n get: (function (array_names) {\n return function () {\n const array = [];\n for (let i = 0; i < array_names.length; i++) {\n array.push(this[array_names[i]]);\n }\n return array;\n };\n })(array_names),\n enumerable: true,\n configurable: true,\n });\n } else {\n offset = compileProp(blen_struct.prototype, _name, type, offset, Blender_Array_Length, Pointer_Match, pointer_size, length);\n }\n }\n\n return this.SDNA[name].constructor;\n\n } else {\n if (!this.SDNA[name]) {\n return null;\n }\n return this.SDNA[name].constructor;\n }\n },\n };\n\n const BLENDER_STRUCTURE = function () {\n this.__blender_file__ = null;\n this.__list__ = null;\n this.__super_array_list__ = null;\n this.blender_name = '';\n this.__pointers = null;\n this.address = null;\n this.length = 0;\n this.__data_address__ = 0;\n this.blender_name = '';\n this._length = 0;\n };\n\n\n /*\n Returns a pre-constructed BLENDER_STRUCTURE or creates a new BLENDER_STRUCTURE to match the DNA struct type\n */\n const pointer_function = (pointer) => () => {\n return FILE.memory_lookup[pointer];\n };\n\n function getPointer (offset) {\n const pointerLow = data.getUint32(offset, BIG_ENDIAN);\n if (pointer_size > 4) {\n const pointerHigh = data.getUint32(offset + 4, BIG_ENDIAN);\n\n if (BIG_ENDIAN) {\n return (pointerLow) + '' + pointerHigh;\n } else {\n return (pointerHigh) + '' + pointerLow;\n }\n } else {\n return pointerLow;\n }\n }\n\n BLENDER_STRUCTURE.prototype = {\n setData: function (pointer, _data_offset, data_block_length, BLENDER_FILE) {\n if (this.__list__ === null) return this;\n BLENDER_FILE.addObject(this);\n\n this.__blender_file__ = BLENDER_FILE;\n\n const struct = this.__list__;\n let j = 0,\n i = 0,\n obj, name = '',\n type, length, Blender_Array_Length, Pointer_Match, offset, constructor;\n\n this.__data_address__ = _data_offset;\n\n // if(this.blender_name === 'CustomDataLayer') debugger\n\n if (struct === null) return this;\n\n for (i = 0; i < struct.length; i += 6) {\n obj = null;\n name = struct[i];\n type = struct[i + 1];\n Blender_Array_Length = struct[i + 4];\n Pointer_Match = struct[i + 5];\n offset = this.__data_address__ + struct[i + 3];\n\n if (Blender_Array_Length > 1) {\n this[name] = [];\n j = 0;\n while (j < Blender_Array_Length) {\n if (current_SDNA_template.getSDNAStructureConstructor(type)) {\n constructor = current_SDNA_template.getSDNAStructureConstructor(type);\n this[name].push((new constructor()).setData(0, offset, offset + length / Blender_Array_Length, BLENDER_FILE));\n } else this[name].push(null);\n offset += length / Blender_Array_Length;\n j++;\n }\n } else {\n if (current_SDNA_template.getSDNAStructureConstructor(type)) {\n constructor = current_SDNA_template.getSDNAStructureConstructor(type);\n this[name] = (new constructor()).setData(0, offset, length + offset, BLENDER_FILE);\n } else this[name] = null;\n }\n }\n // break connection to configuration list\n this.__list__ = null;\n return this;\n },\n\n get aname () {\n if (this.id) return this.id.name.slice(2);\n else return undefined;\n },\n };\n\n function toString (buffer, _in, _out) {\n return String.fromCharCode.apply(String, new Uint8Array(buffer, _in, _out - _in));\n }\n\n // Begin parsing blender __blender_file__\n\n function readFile () {\n let count = 0;\n let offset2 = 0;\n const root = 0;\n const i = 0;\n let data_offset = 0;\n let sdna_index = 0;\n let code = '';\n let block_length = 0;\n let curr_count = 0;\n let curr_count2 = 0;\n\n FILE.memory_lookup = {};\n struct_names = [];\n offset = 0;\n\n // todo gzip, zstd(28 b5 2f fd, https://projects.blender.org/archive/blender-file/issues/93858)\n // Make sure we have a .blend __blender_file__. All blend files have the first 12bytes\n // set with BLENDER-v### in Utf-8\n const magic = toString(_data, offset, 7)\n if (magic !== 'BLENDER') return ERROR = 'File supplied is not a .blend compatible Blender file.';\n\n // otherwise get templete from save version.\n\n offset += 7;\n pointer_size = ((toString(_data, offset++, offset)) == '_') ? 4 : 8;\n BIG_ENDIAN = toString(_data, offset++, offset) !== 'V';\n const version = toString(_data, offset, offset + 3);\n\n\n // create new master template if none exist for current blender version;\n if (!templates[version]) {\n templates[version] = new MASTER_SDNA_SCHEMA(version);\n }\n\n current_SDNA_template = templates[version];\n\n FILE.template = current_SDNA_template;\n\n offset += 3;\n\n // Set SDNA structs if template hasn't been set.\n // Todo: Move the following block into the MASTER_SDNA_SCHEMA object.\n //* Like so:*/ current_SDNA_template.set(AB);\n\n if (!current_SDNA_template.SDNA_SET) {\n current_SDNA_template.endianess = BIG_ENDIAN;\n current_SDNA_template.pointer_size = pointer_size;\n // find DNA1 data block\n offset2 = offset;\n\n while (true) {\n sdna_index = data.getInt32(offset2 + pointer_size + 8, BIG_ENDIAN);\n // eslint-disable-next-line no-control-regex\n code = toString(_data, offset2, offset2 + 4).replace(/\\u0000/g, '');\n block_length = data.getInt32(offset2 + 4, true);\n offset2 += 16 + (pointer_size);\n if (code === 'DNA1') {\n // DNA found; This is the core of the __blender_file__ and contains all the structure for the various data types used in Blender.\n count = 0;\n let types = [],\n fields = [],\n names = [],\n lengths = [],\n name = '',\n curr_name = '';\n\n // skip SDNA and NAME identifiers\n offset2 += 8;\n\n // Number of structs.\n count = data.getInt32(offset2, true);\n offset2 += 4;\n\n curr_count = 0;\n\n // Build up list of names for structs\n while (curr_count < count) {\n curr_name = '';\n while (data.getInt8(offset2) !== 0) {\n curr_name += toString(_data, offset2, offset2 + 1);\n offset2++;\n }\n names.push(curr_name);\n offset2++;\n curr_count++;\n }\n\n // todo fix seek logic\n // Adjust for 4byte alignment TYPE\n if (toString(_data, offset2, offset2 + 4) !== 'TYPE'\n ) {\n for (let j = 0; j < 8; j++) {\n if(toString(_data, offset2, offset2 + 4) === 'TYPE') break\n offset2++;\n }\n // offset2 = (4 - (offset2 % 4)) + offset2;\n }\n if(toString(_data, offset2, offset2 + 4) !== 'TYPE') {\n debugger\n }\n offset2 += 4;\n\n // Number of struct types\n count = data.getUint32(offset2, true);\n offset2 += 4;\n curr_count = 0;\n\n // Build up list of types\n while (curr_count < count) {\n curr_name = '';\n while (data.getInt8(offset2) !== 0) {\n curr_name += toString(_data, offset2, offset2 + 1);\n offset2++;\n }\n types.push(curr_name);\n offset2++;\n curr_count++;\n }\n\n // todo fix seek logic\n // Adjust for 4byte alignment\n if (toString(_data, offset2, offset2 + 4) !== 'TLEN'\n ) {\n for (let j = 0; j < 8; j++) {\n if(toString(_data, offset2, offset2 + 4) === 'TLEN') break\n offset2++;\n }\n // offset2 = (4 - (offset2 % 4)) + offset2;\n }\n if(toString(_data, offset2, offset2 + 4) !== 'TLEN') {\n debugger\n }\n offset2 += 4;\n curr_count = 0;\n\n // Build up list of byte lengths for types\n while (curr_count < count) {\n lengths.push(data.getInt16(offset2, BIG_ENDIAN));\n offset2 += 2;\n curr_count++;\n }\n\n // todo fix seek logic\n // Adjust for 4byte alignment STRC\n if (toString(_data, offset2, offset2 + 4) !== 'STRC'\n ) {\n for (let j = 0; j < 8; j++) {\n if(toString(_data, offset2, offset2 + 4) === 'STRC') break\n offset2++;\n }\n // offset2 = (4 - (offset2 % 4)) + offset2;\n }\n if(toString(_data, offset2, offset2 + 4) !== 'STRC') {\n debugger\n }\n offset2 += 4;\n\n // Number of structures\n const structure_count = data.getInt32(offset2, BIG_ENDIAN);\n offset2 += 4;\n curr_count = 0;\n\n // Create constructor objects from list of SDNA structs\n while (curr_count < structure_count) {\n const struct_name = types[data.getInt16(offset2, BIG_ENDIAN)];\n offset2 += 2;\n const obj = [];\n count = data.getInt16(offset2, BIG_ENDIAN);\n offset2 += 2;\n curr_count2 = 0;\n struct_names.push(struct_name);\n\n // Fill an array with name, type, and length for each SDNA struct property\n while (curr_count2 < count) {\n\n // const n = names[data.getInt16(offset2 + 2, BIG_ENDIAN)]\n // if(obj.find((o, i)=>i%3===0 && o===n)){\n // debugger\n // }\n obj.push(names[data.getInt16(offset2 + 2, BIG_ENDIAN)], types[data.getInt16(offset2, BIG_ENDIAN)], lengths[data.getInt16(offset2, BIG_ENDIAN)]);\n offset2 += 4;\n curr_count2++;\n }\n\n // Create a SDNA constructor by passing [type,name,lenth] array as second argument\n current_SDNA_template.getSDNAStructureConstructor(struct_name, obj);\n curr_count++;\n }\n current_SDNA_template.SDNA_SET = true;\n current_SDNA_template.SDNA_NAMES = struct_names;\n break;\n }\n offset2 += block_length;\n }\n }\n\n // parse the rest of the data, starting back at the top.\n\n // TODO: turn into \"on-demand\" parsing.\n\n // https://github.com/fschutt/mystery-of-the-blend-backup\n while (true) {\n // todo fix cleanup\n // this is not the case, see blend-load-test.blend and Ruins_Assets.blend\n // if ((offset % 4) > 0) {\n // console.log('fix', offset, offset % 4)\n // debugger\n // offset = (4 - (offset % 4)) + offset;\n // }\n for (let j = 0; j < 8; j++) {\n if(data.getInt8(offset) === 0) {\n offset++\n continue\n }\n break\n }\n if(data.getInt8(offset) === 0) {\n debugger\n }\n\n data_offset = offset;\n\n if (offset + pointer_size + 12 >= data.byteLength) {\n ERROR = 'Unexpected end of file while parsing';\n break\n }\n\n sdna_index = data.getInt32(offset + pointer_size + 8, BIG_ENDIAN);\n // let code_uint = data.getUint32(offset, BIG_ENDIAN);\n const code_str = toString(_data, offset, offset + 4) // data.getUint32(offset, BIG_ENDIAN);\n\n offset2 = offset + 16 + (pointer_size);\n // console.log(code_str, code_str.length, data.getInt8(offset))\n\n const blockLength = data.getInt32(offset + 4, true);\n if (blockLength < 0 || offset + blockLength + 16 + pointer_size > data.byteLength) {\n ERROR = 'Invalid block length detected';\n break\n }\n // if(blockLength === 1) {\n // debugger\n // }\n\n // last_offset = offset\n\n offset += blockLength + 16 + (pointer_size);\n\n if (code_str === 'DNA1') {} // skip - already processed at this point\n else if (code_str === 'ENDB') break; // end of __blender_file__ found\n else if (code_str === 'TEST') { // snapshot\n const data_start = data_offset + pointer_size + 16;\n const width = data.getInt32(data_start, BIG_ENDIAN);\n const height = data.getInt32(data_start + 4, BIG_ENDIAN);\n if ((width * height > 0)) {\n const data_len = width * height * 4; // RGBA\n if(blockLength < data_len + 8) {\n ERROR = 'Invalid TEST block length detected';\n break;\n }\n const image_data = new Uint32Array(_data, data_start + 8, data_len >> 2);\n const image = {\n width: width,\n height: height,\n data: image_data,\n };\n FILE.thumbnail = image\n }\n }\n else {\n // Create a Blender object using a constructor template from current_SDNA_template\n const data_start = data_offset + pointer_size + 16;\n\n // Get a SDNA constructor by name;\n const constructor = current_SDNA_template.getSDNAStructureConstructor(current_SDNA_template.SDNA_NAMES[sdna_index]);\n\n const size = data.getInt32(data_offset + 4, BIG_ENDIAN);\n\n count = data.getInt32(data_offset + 12 + pointer_size, BIG_ENDIAN);\n\n if (count > 0 && constructor) {\n let obj = new constructor();\n\n const length = constructor.prototype._length;\n\n\n const address = FILE.getPointer(data_offset + 8);\n\n obj.address = address + '';\n\n obj.setData(address, data_start, data_start + size, FILE);\n\n if (count > 1) {\n let array = [];\n array.push(obj);\n for (let u = 1; u < count; u++) {\n obj = new constructor();\n obj.setData(address, data_start + length * u, data_start + (length * u) + length, FILE);\n array.push(obj);\n }\n FILE.memory_lookup[address] = array;\n } else {\n FILE.memory_lookup[address] = obj;\n }\n }\n }\n }\n }\n}\n\nworker = new worker_code();\n\nworker.postMessage = function (message, err) {\n return_object.onParseReady(message, err);\n};\n\nexport default return_object;\n\n// window.prettyPrintHex = function (view, offset = 0, length = view.byteLength - offset) {\n// const bytes = Array.from({ length }, (_, i) => view.getUint8(offset + i));\n// console.log(bytes.map((b, i) => (i % 16 === 0 ? '\\n' : '') + b.toString(16).padStart(2, '0')).join(' '));\n// console.log(bytes.map((b, i) => (i % 16 === 0 ? '\\n' : '') + String.fromCharCode(b)).join(''));\n// }\n","/* eslint-disable camelcase */\n/**\n * JS.Blend\n * Original Repo: https://github.com/acweathersby/js.blend\n * Slightly modified for three.js and js updates, minor refactor.\n * Object-creation part re-written for latest three.js and typescript\n * MIT License\n * Copyright (c) 2020 Anthony C, Weathersby\n * @license\n */\nimport parser from './parser/parser.js';\n\nexport async function parseBlend (buffer, name = '') {\n return new Promise((res, rej) => {\n parser.onParseReady = (file, error) => {\n // todo throw error if no objects?\n if (error) console.error(error)\n res(file)\n }\n parser.loadBlendFromArrayBuffer(buffer, name)\n })\n}\n","import {Object3D} from 'threepipe'\nimport {Ctx} from './ctx'\n\nexport function createCamera(object: any, ctx: Ctx): Object3D | undefined {\n const cdata = object.data\n // console.log(bakeGetters(object))\n if (!cdata) return undefined\n\n // Blender camera types: 0 = Perspective, 1 = Orthographic\n const type = cdata.type\n let camera: Object3D\n if (type === 0) {\n // Perspective\n // Convert lens (mm) to field of view (fov) in degrees (vfov)\n const sensorWidth = cdata.sensor_x || 36\n const sensorHeight = cdata.sensor_y || 24\n const lens = cdata.lens || 50\n const fov = 2 * Math.atan(sensorHeight / (2 * lens)) * (180 / Math.PI)\n\n camera = new ctx.PerspectiveCamera(\n fov,\n sensorWidth / sensorHeight,\n cdata.clipsta || 0.1,\n cdata.clipend || 1000\n )\n if ('shiftx' in cdata) camera.userData.shiftX = cdata.shiftx // todo?\n if ('shiftx' in cdata) camera.userData.shiftX = cdata.shiftx // todo?\n if ('shifty' in cdata) camera.userData.shiftY = cdata.shifty\n } else if (type === 1) {\n // Orthographic\n const scale = cdata.ortho_scale || 1\n const aspect = (cdata.sensor_x || 36) / (cdata.sensor_y || 24)\n const left = -scale * aspect / 2\n const right = scale * aspect / 2\n const top = scale / 2\n const bottom = -scale / 2\n camera = new ctx.OrthographicCamera(\n left, right, top, bottom,\n cdata.clipsta || 0.1,\n cdata.clipend || 1000\n )\n if ('shiftx' in cdata) camera.userData.shiftX = cdata.shiftx\n if ('shifty' in cdata) camera.userData.shiftY = cdata.shifty\n } else {\n // Unknown camera type\n camera = new ctx.PerspectiveCamera()\n console.warn('Unsupported camera type', type)\n }\n\n // const obj = new Object3D()\n // camera.rotation.x = -Math.PI / 2\n // obj.add(camera)\n\n return camera\n}\n","import {Light} from 'threepipe'\nimport {Ctx} from './ctx'\n\nconst blenderLightTypes = {\n point: 0,\n sun: 1,\n spot: 0,\n hemi: 0,\n area: 0,\n}\n\nexport function createLight(lamp: any, ctx: Ctx) {\n const ldata = lamp.data\n\n const position = [lamp.loc[0], lamp.loc[2], -lamp.loc[1]]\n\n const color = ldata.r * 255 << 16 | ldata.g * 255 << 8 | ldata.b * 255 << 0\n const intensity = ldata.energy\n const distance = 0\n\n let light: Light | undefined = undefined\n\n switch (ldata.type) {\n case blenderLightTypes.point:\n light = new ctx.PointLight(color, intensity, distance)\n light!.position.fromArray(position, 0)\n light!.castShadow = true\n break\n case blenderLightTypes.sun:\n light = new ctx.PointLight(color, intensity, distance)\n light!.position.fromArray(position, 0)\n light!.castShadow = true\n if (light!.shadow) {\n light!.shadow.mapSize.width = 1024\n light!.shadow.mapSize.height = 1024\n // @ts-expect-error ??/\n light!.shadow.camera.near = 0.01\n // @ts-expect-error ??/\n light!.shadow.camera.far = 500\n }\n break\n default:\n console.warn('Unsupported light type', ldata.type)\n }\n\n return light\n}\n","import {Ctx} from './ctx'\n\nfunction getLayer(layers: any, i: number) {\n if (!Array.isArray(layers)) return layers\n return layers[i]\n}\n// https://projects.blender.org/blender/blender/pulls/108015/files\n// https://projects.blender.org/blender/blender/commit/1b63a290c68636211b16c5e212a699e6b63031b9\n// https://developer.blender.org/docs/release_notes/4.0/python_api/#breaking-changes\n// https://developer.blender.org/docs/release_notes/4.0/#blend-files\n// https://projects.blender.org/blender/blender/commit/7966cd16d6dc4e66d01f7bd68a090107c1a7978c\n// https://projects.blender.org/blender/blender/issues/95967\n// https://projects.blender.org/blender/blender/pulls/106638\n\n// https://github.com/blender/blender/blob/55e2fd2929b7577e0785c128c8f8069efd990c07/source/blender/blenkernel/intern/mesh.cc#L413\nexport function createBufferGeometry(meshData: any, ctx: Ctx) {\n\n if (meshData.mpoly) return createBufferGeometryOld(meshData, ctx)\n const geometry = new ctx.BufferGeometry()\n geometry.name = meshData.aname || ''\n\n // console.log(bakeGetters(meshData))\n\n // https://github.com/blender/blender/blob/05dcc0377b62d8e026e1901dfbecbd4b06fda0b5/scripts/addons_core/io_scene_gltf2/blender/exp/primitive_extract.py#L19\n\n let vertices\n let indices\n\n // Extract vertex positions from vdata layers\n if (meshData.vdata && meshData.vdata.layers && meshData.vdata.totlayer > 0) {\n for (let i = 0; i < meshData.vdata.totlayer; i++) {\n const layer = getLayer(meshData.vdata.layers, i)\n // if (layer.type === 0) {\n // https://github.com/blender/blender/blob/05dcc0377b62d8e026e1901dfbecbd4b06fda0b5/scripts/addons_core/io_scene_gltf2/blender/exp/primitive_extract.py#L1575\n const data = layer.data || []\n // if (layer.name === 'position') { // type = 48 (custom vec3)\n if (data.length === meshData.totvert) {\n if (vertices && (layer.name !== 'position' || vertices.name === 'position')) {\n // console.warn('BlendLoader - multiple vertices, ignoring', layer)\n continue\n }\n vertices = layer\n } else {\n // console.log('unknown vdata', layer)\n }\n }\n }\n\n // Blender loops are indexes in three.js/blender. Called dots in gltf exporter\n\n // // Extract indexes from loop data layers\n if (meshData.ldata && meshData.ldata.layers) {\n for (let i = 0; i < meshData.ldata.totlayer; i++) {\n const layer = getLayer(meshData.ldata.layers, i)\n // if (layer.type === 0) {\n const data = layer.data || []\n // if (layer.name === '.corner_vert') { // type = 11\n if (data.length === meshData.totloop) { // type = 11\n if (indices && (layer.name !== '.corner_vert' || indices.name === '.corner_vert')) {\n // console.warn('BlendLoader - multiple indices, ignoring', layer)\n continue\n }\n indices = layer\n } else {\n // console.log('unknown ldata', layer)\n }\n }\n }\n // if (meshData.pdata && meshData.pdata.layers) {\n // for (let i = 0; i < meshData.pdata.totlayer; i++) {\n // const layer = getLayer(meshData.pdata.layers, i)\n // // if (layer.type === 0) {\n // // if (layer.name === '.corner_vert') { // type = 11\n // // } else {\n // console.log('unknown pdata', layer)\n // // }\n // }\n // }\n // if (meshData.fdata && meshData.fdata.layers) {\n // for (let i = 0; i < meshData.fdata.totlayer; i++) {\n // const layer = getLayer(meshData.fdata.layers, i)\n // // if (layer.type === 0) {\n // // if (layer.name === '.corner_vert') { // type = 11\n // // } else {\n // console.log('unknown fdata', layer)\n // // }\n // }\n // }\n // if (meshData.edata && meshData.edata.layers) {\n // for (let i = 0; i < meshData.edata.totlayer; i++) {\n // const layer = getLayer(meshData.edata.layers, i)\n // // if (layer.type === 0) {\n // // if (layer.name === '.corner_vert') { // type = 11\n // // } else {\n // console.log('unknown edata', layer)\n // // }\n // }\n // }\n\n let faceIndices: number[] = []\n if (meshData.poly_offset_indices && meshData.totpoly > 0) {\n faceIndices = [...new Int32Array(meshData.poly_offset_indices.__blender_file__.AB, meshData.poly_offset_indices.__data_address__, meshData.totpoly + 1)]\n }\n // if (faceSize !== 3 && faceSize !== 4 && !faceIndices.length) {\n // console.error('not supported polygons with ', faceSize, 'vertices')\n // return geometry\n // }\n\n if (vertices?.data && vertices.data.length > 0) {\n const positions = new Float32Array(vertices.data.length * 3)\n for (let j = 0; j < vertices.data.length; j++) {\n const vertex = vertices.data[j]\n if (vertex.x !== undefined) {\n positions[j * 3] = vertex.x\n positions[j * 3 + 1] = vertex.z\n positions[j * 3 + 2] = -vertex.y\n } else if (vertex.co !== undefined) {\n positions[j * 3] = vertex.co[0]\n positions[j * 3 + 1] = vertex.co[2]\n positions[j * 3 + 2] = -vertex.co[1]\n } else {\n // console.log(bakeGetters(meshData))\n // const t = [...new Int32Array(vertex.__blender_file__.AB, vertex.__data_address__, 8)]\n // debugger\n console.error('BlendLoader - unknown vertex', vertex)\n break\n }\n }\n geometry.setAttribute('position', new ctx.BufferAttribute(positions, 3))\n }\n\n if (indices?.data && indices.data.length > 0 && vertices?.data?.length) {\n const faceSize = meshData.totloop / meshData.totpoly\n if (faceIndices.length > 0) {\n // Use face offset indices for variable-sized faces\n let totalTriangles = 0\n for (let i = 0; i < faceIndices.length - 1; i++) {\n const faceVertCount = faceIndices[i + 1] - faceIndices[i]\n totalTriangles += Math.max(0, faceVertCount - 2)\n }\n\n const indexes = new Uint32Array(totalTriangles * 3)\n let t = 0\n\n for (let i = 0; i < faceIndices.length - 1; i++) {\n const faceStart = faceIndices[i]\n const faceEnd = faceIndices[i + 1]\n const faceVertCount = faceEnd - faceStart\n\n if (faceVertCount >= 3) {\n // todo better Triangulate the face using fan triangulation\n const firstVert = indices.data[faceStart].i\n for (let k = 1; k < faceVertCount - 1; k++) {\n indexes[t++] = firstVert\n indexes[t++] = indices.data[faceStart + k].i\n indexes[t++] = indices.data[faceStart + k + 1].i\n }\n } else {\n // debugger\n }\n }\n\n // console.log(indexes)\n geometry.setIndex(new ctx.BufferAttribute(indexes, 1))\n } else if (faceSize === 3 || faceSize === 4) {\n // Fall back to uniform face size approach\n const isQuad = faceSize === 4\n const faceCount = indices.length / faceSize\n const indexes = new Uint32Array(faceCount * 3 * (isQuad ? 2 : 1))\n\n if (faceSize !== 3 && faceSize !== 4) return geometry\n for (let j = 0, t = 0; j < indices.length; j += faceSize) {\n const a = indices[j].i\n const b = indices[j + 1].i\n const c = indices[j + 2].i\n indexes[t++] = a\n indexes[t++] = b\n indexes[t++] = c\n\n if (isQuad) {\n const d = indices[j + 3].i\n indexes[t++] = a\n indexes[t++] = c\n indexes[t++] = d\n }\n }\n geometry.setIndex(new ctx.BufferAttribute(indexes, 1))\n }\n } else if (faceIndices) {\n console.error('BlendLoader - no indices data found, but face indices are present', faceIndices)\n }\n\n // console.log(geometry.attributes.position)\n // console.log(geometry.index)\n\n // compute stuff not present\n if (geometry.attributes.position && !geometry.attributes.normal)\n geometry.computeVertexNormals()\n\n // if (meshData.loc) { // maybe this is the bbox center?\n // geometry.translate(meshData.loc[0], meshData.loc[2], -meshData.loc[1])\n // }\n // if (meshData.size) { // maybe this is the bbox size?\n // geometry.scale(meshData.size[0], meshData.size[2], -meshData.size[1])\n // }\n\n return geometry\n}\n// // https://github.com/blender/blender/blob/05dcc0377b62d8e026e1901dfbecbd4b06fda0b5/scripts/addons_core/io_scene_gltf2/blender/exp/primitive_extract.py#L19\n// // https://github.com/blender/blender/blob/05dcc0377b62d8e026e1901dfbecbd4b06fda0b5/scripts/addons_core/io_scene_gltf2/blender/exp/primitive_extract.py#L1575\n// // todo __set_morph_locs_attribute\n// // todo __set_morph_tangent_attribute\n// // todo pdata(points), edata(edge), fdata(face? legacy?)\n// // meshData.eData = domain edge - https://github.com/blender/blender/blob/05dcc0377b62d8e026e1901dfbecbd4b06fda0b5/scripts/addons_core/io_scene_gltf2/blender/exp/primitive_extract.py#L189\n// // todo normals, tangents\n\nexport function createBufferGeometryOld(mesh: any, ctx: Ctx) {\n const\n faces = Array.isArray(mesh.mpoly) ? mesh.mpoly as any[] : [mesh.mpoly],\n loops = mesh.mloop,\n uv = mesh.mloopuv,\n vertices = mesh.mvert\n\n const geometry = new ctx.BufferGeometry()\n\n if (!faces) return geometry\n\n const size = faces.reduce((acc, face) => acc + Math.floor(face.totloop * 3.0 / 2), 0)\n const indices = new Uint32Array(size)\n const uvs = new Float32Array(size * 2)\n const normals = new Float32Array(size * 3)\n const positions = new Float32Array(size * 3)\n\n let currentIndex = 0\n let computeNormals = false\n\n for (const face of faces) {\n const len = face.totloop\n const start = face.loopstart\n let indexi = 1\n\n while (indexi < len) {\n\n let index = 0\n\n for (let l = 0; l < 3; l++) {\n // Per Vertex\n\n index = start\n if (indexi - 1 + l < len)\n index += indexi - 1 + l\n\n const loop = loops[index]\n const vert = vertices[loop.v]\n indices[currentIndex] = currentIndex\n\n positions[currentIndex * 3 + 0] = vert.co[0]\n positions[currentIndex * 3 + 1] = vert.co[2]\n positions[currentIndex * 3 + 2] = -vert.co[1]\n\n if (vert.no) {\n normals[currentIndex * 3 + 0] = vert.no[0]\n normals[currentIndex * 3 + 1] = vert.no[2]\n normals[currentIndex * 3 + 2] = -vert.no[1]\n } else {\n computeNormals = true\n }\n\n if (uv) {\n uvs[currentIndex * 2 + 0] = uv[index].uv[0]\n uvs[currentIndex * 2 + 1] = uv[index].uv[1]\n }\n\n currentIndex++\n }\n\n indexi += 2\n }\n }\n\n geometry.setAttribute('position', new ctx.BufferAttribute(positions, 3))\n geometry.setIndex(new ctx.BufferAttribute(indices, 1))\n geometry.setAttribute('normal', new ctx.BufferAttribute(normals, 3))\n geometry.setAttribute('uv', new ctx.BufferAttribute(uvs, 2))\n\n if (computeNormals) {\n geometry.computeVertexNormals()\n }\n\n return geometry\n}\n","// todo see blender gltf exporter and convert to js. structure is the same\n// https://github.com/KhronosGroup/glTF-Blender-IO/blob/ed5100ab6c40472b7c3254fddfe0dd0d76d60644/addons/io_scene_gltf2/blender/exp/material/materials.py#L60\nimport {Ctx} from './ctx'\n\nexport function createMaterial(mat: any, ctx: Ctx) {\n const material = new ctx.MeshPhysicalMaterial()\n material.color.setRGB(mat.r, mat.g, mat.b)\n material.roughness = mat.roughness !== undefined ? mat.roughness : 0.4\n material.metalness = mat.metallic !== undefined ? mat.metallic : 0.0\n // material.opacity = mat.alpha !== undefined ? mat.alpha : 0.0\n material.opacity = 1\n material.transparent = material.opacity < 1.0\n return material\n}\n","import {createBufferGeometry} from './geometry'\nimport {createMaterial} from './material'\nimport {Ctx} from './ctx'\n\nexport function createMesh(object: any, loaded: WeakMap<any, any>, ctx: Ctx) {\n if (!object.data) {\n return undefined\n }\n\n const geometry = loaded.get(object.data) ?? createBufferGeometry(object.data, ctx)\n loaded.set(object.data, geometry)\n\n const mat = object.data.mat[0]\n\n // const material = mat ? createMaterial(mat) : undefined\n const material = mat ? loaded.get(mat) ?? createMaterial(mat, ctx) : new ctx.MeshPhysicalMaterial()\n if (mat) loaded.set(mat, material)\n\n // console.log(material, mat)\n // material.side = DoubleSide\n const mesh = new ctx.Mesh(geometry, material)\n\n mesh.castShadow = true\n mesh.receiveShadow = true\n\n return mesh\n}\n","const _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\nfunction generateUUID() {\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n// compute euclidean modulo of m % n\n// https://en.wikipedia.org/wiki/Modulo_operation\nfunction euclideanModulo( n, m ) {\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n// Linear mapping from range <a1, a2> to range <b1, b2>\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\nfunction inverseLerp( x, y, value ) {\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n// https://en.wikipedia.org/wiki/Linear_interpolation\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n// https://www.desmos.com/calculator/vcsjnyz7x4\nfunction pingpong( x, length = 1 ) {\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n// http://en.wikipedia.org/wiki/Smoothstep\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n// Random integer from <low, high> interval\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n// Random float from <low, high> interval\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n// Random float from <-range/2, range/2> interval\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n// Deterministic pseudo-random float in the interval [ 0, 1 ]\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\t// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n\n\t// rotations are applied to the axes in the order specified by 'order'\n\t// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n\t// angles are in radians\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn value / 4294967295.0;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.max( value / 2147483647.0, - 1.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, - 1.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, - 1.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn Math.round( value * 4294967295.0 );\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.round( value * 2147483647.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nconst MathUtils = {\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\tgenerateUUID: generateUUID,\n\tclamp: clamp,\n\teuclideanModulo: euclideanModulo,\n\tmapLinear: mapLinear,\n\tinverseLerp: inverseLerp,\n\tlerp: lerp,\n\tdamp: damp,\n\tpingpong: pingpong,\n\tsmoothstep: smoothstep,\n\tsmootherstep: smootherstep,\n\trandInt: randInt,\n\trandFloat: randFloat,\n\trandFloatSpread: randFloatSpread,\n\tseededRandom: seededRandom,\n\tdegToRad: degToRad,\n\tradToDeg: radToDeg,\n\tisPowerOfTwo: isPowerOfTwo,\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\tnormalize: normalize,\n\tdenormalize: denormalize\n};\n\nexport {\n\tDEG2RAD,\n\tRAD2DEG,\n\tgenerateUUID,\n\tclamp,\n\teuclideanModulo,\n\tmapLinear,\n\tinverseLerp,\n\tlerp,\n\tdamp,\n\tpingpong,\n\tsmoothstep,\n\tsmootherstep,\n\trandInt,\n\trandFloat,\n\trandFloatSpread,\n\tseededRandom,\n\tdegToRad,\n\tradToDeg,\n\tisPowerOfTwo,\n\tceilPowerOfTwo,\n\tfloorPowerOfTwo,\n\tsetQuaternionFromProperEuler,\n\tnormalize,\n\tdenormalize,\n\tMathUtils\n};\n","import * as MathUtils from './MathUtils.js';\n\nclass Quaternion {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tthis.isQuaternion = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t === 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t === 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet s = 1 - t;\n\t\t\tconst cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\tconst sin = Math.sqrt( sqrSin ),\n\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t}\n\n\t\t\tconst tDir = t * dir;\n\n\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t// Normalize in case we just did a lerp:\n\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromEuler( euler, update = true ) {\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t// assumes axis is normalized\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < Number.EPSILON ) {\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( MathUtils.clamp( this.dot( q ), - 1, 1 ) ) );\n\n\t}\n\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\tinvert() {\n\n\t\t// quaternion is assumed to have unit length\n\n\t\treturn this.conjugate();\n\n\t}\n\n\tconjugate() {\n\n\t\tthis._x *= - 1;\n\t\tthis._y *= - 1;\n\t\tthis._z *= - 1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerp( qb, t ) {\n\n\t\tif ( t === 0 ) return this;\n\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\tconst x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\tlet cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\tthis._w = - qb._w;\n\t\t\tthis._x = - qb._x;\n\t\t\tthis._y = - qb._y;\n\t\t\tthis._z = - qb._z;\n\n\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t} else {\n\n\t\t\tthis.copy( qb );\n\n\t\t}\n\n\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\tthis._w = w;\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n\t\tif ( sqrSinHalfTheta <= Number.EPSILON ) {\n\n\t\t\tconst s = 1 - t;\n\t\t\tthis._w = s * w + t * this._w;\n\t\t\tthis._x = s * x + t * this._x;\n\t\t\tthis._y = s * y + t * this._y;\n\t\t\tthis._z = s * z + t * this._z;\n\n\t\t\tthis.normalize(); // normalize calls _onChangeCallback()\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sinHalfTheta = Math.sqrt( sqrSinHalfTheta );\n\t\tconst halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\tconst ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\trandom() {\n\n\t\t// Derived from http://planning.cs.uiuc.edu/node198.html\n\t\t// Note, this source uses w, x, y, z ordering,\n\t\t// so we swap the order below.\n\n\t\tconst u1 = Math.random();\n\t\tconst sqrt1u1 = Math.sqrt( 1 - u1 );\n\t\tconst sqrtu1 = Math.sqrt( u1 );\n\n\t\tconst u2 = 2 * Math.PI * Math.random();\n\n\t\tconst u3 = 2 * Math.PI * Math.random();\n\n\t\treturn this.set(\n\t\t\tsqrt1u1 * Math.cos( u2 ),\n\t\t\tsqrtu1 * Math.sin( u3 ),\n\t\t\tsqrtu1 * Math.cos( u3 ),\n\t\t\tsqrt1u1 * Math.sin( u2 ),\n\t\t);\n\n\t}\n\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.toArray();\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\n\t}\n\n}\n\nexport { Quaternion };\n","export const REVISION = '160';\n\nexport const MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\nexport const TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\nexport const CullFaceNone = 0;\nexport const CullFaceBack = 1;\nexport const CullFaceFront = 2;\nexport const CullFaceFrontBack = 3;\nexport const BasicShadowMap = 0;\nexport const PCFShadowMap = 1;\nexport const PCFSoftShadowMap = 2;\nexport const VSMShadowMap = 3;\nexport const FrontSide = 0;\nexport const BackSide = 1;\nexport const DoubleSide = 2;\nexport const TwoPassDoubleSide = 2; // r149\nexport const NoBlending = 0;\nexport const NormalBlending = 1;\nexport const AdditiveBlending = 2;\nexport const SubtractiveBlending = 3;\nexport const MultiplyBlending = 4;\nexport const CustomBlending = 5;\nexport const AddEquation = 100;\nexport const SubtractEquation = 101;\nexport const ReverseSubtractEquation = 102;\nexport const MinEquation = 103;\nexport const MaxEquation = 104;\nexport const ZeroFactor = 200;\nexport const OneFactor = 201;\nexport const SrcColorFactor = 202;\nexport const OneMinusSrcColorFactor = 203;\nexport const SrcAlphaFactor = 204;\nexport const OneMinusSrcAlphaFactor = 205;\nexport const DstAlphaFactor = 206;\nexport const OneMinusDstAlphaFactor = 207;\nexport const DstColorFactor = 208;\nexport const OneMinusDstColorFactor = 209;\nexport const SrcAlphaSaturateFactor = 210;\nexport const ConstantColorFactor = 211;\nexport const OneMinusConstantColorFactor = 212;\nexport const ConstantAlphaFactor = 213;\nexport const OneMinusConstantAlphaFactor = 214;\nexport const NeverDepth = 0;\nexport const AlwaysDepth = 1;\nexport const LessDepth = 2;\nexport const LessEqualDepth = 3;\nexport const EqualDepth = 4;\nexport const GreaterEqualDepth = 5;\nexport const GreaterDepth = 6;\nexport const NotEqualDepth = 7;\nexport const MultiplyOperation = 0;\nexport const MixOperation = 1;\nexport const AddOperation = 2;\nexport const NoToneMapping = 0;\nexport const LinearToneMapping = 1;\nexport const ReinhardToneMapping = 2;\nexport const CineonToneMapping = 3;\nexport const ACESFilmicToneMapping = 4;\nexport const CustomToneMapping = 5;\nexport const AgXToneMapping = 6;\nexport const AttachedBindMode = 'attached';\nexport const DetachedBindMode = 'detached';\n\nexport const UVMapping = 300;\nexport const CubeReflectionMapping = 301;\nexport const CubeRefractionMapping = 302;\nexport const EquirectangularReflectionMapping = 303;\nexport const EquirectangularRefractionMapping = 304;\nexport const CubeUVReflectionMapping = 306;\nexport const RepeatWrapping = 1000;\nexport const ClampToEdgeWrapping = 1001;\nexport const MirroredRepeatWrapping = 1002;\nexport const NearestFilter = 1003;\nexport const NearestMipmapNearestFilter = 1004;\nexport const NearestMipMapNearestFilter = 1004;\nexport const NearestMipmapLinearFilter = 1005;\nexport const NearestMipMapLinearFilter = 1005;\nexport const LinearFilter = 1006;\nexport const LinearMipmapNearestFilter = 1007;\nexport const LinearMipMapNearestFilter = 1007;\nexport const LinearMipmapLinearFilter = 1008;\nexport const LinearMipMapLinearFilter = 1008;\nexport const UnsignedByteType = 1009;\nexport const ByteType = 1010;\nexport const ShortType = 1011;\nexport const UnsignedShortType = 1012;\nexport const IntType = 1013;\nexport const UnsignedIntType = 1014;\nexport const FloatType = 1015;\nexport const HalfFloatType = 1016;\nexport const UnsignedShort4444Type = 1017;\nexport const UnsignedShort5551Type = 1018;\nexport const UnsignedInt248Type = 1020;\nexport const AlphaFormat = 1021;\nexport const RGBAFormat = 1023;\nexport const LuminanceFormat = 1024;\nexport const LuminanceAlphaFormat = 1025;\nexport const DepthFormat = 1026;\nexport const DepthStencilFormat = 1027;\nexport const RedFormat = 1028;\nexport const RedIntegerFormat = 1029;\nexport const RGFormat = 1030;\nexport const RGIntegerFormat = 1031;\nexport const RGBAIntegerFormat = 1033;\n\nexport const RGB_S3TC_DXT1_Format = 33776;\nexport const RGBA_S3TC_DXT1_Format = 33777;\nexport const RGBA_S3TC_DXT3_Format = 33778;\nexport const RGBA_S3TC_DXT5_Format = 33779;\nexport const RGB_PVRTC_4BPPV1_Format = 35840;\nexport const RGB_PVRTC_2BPPV1_Format = 35841;\nexport const RGBA_PVRTC_4BPPV1_Format = 35842;\nexport const RGBA_PVRTC_2BPPV1_Format = 35843;\nexport const RGB_ETC1_Format = 36196;\nexport const RGB_ETC2_Format = 37492;\nexport const RGBA_ETC2_EAC_Format = 37496;\nexport const RGBA_ASTC_4x4_Format = 37808;\nexport const RGBA_ASTC_5x4_Format = 37809;\nexport const RGBA_ASTC_5x5_Format = 37810;\nexport const RGBA_ASTC_6x5_Format = 37811;\nexport const RGBA_ASTC_6x6_Format = 37812;\nexport const RGBA_ASTC_8x5_Format = 37813;\nexport const RGBA_ASTC_8x6_Format = 37814;\nexport const RGBA_ASTC_8x8_Format = 37815;\nexport const RGBA_ASTC_10x5_Format = 37816;\nexport const RGBA_ASTC_10x6_Format = 37817;\nexport const RGBA_ASTC_10x8_Format = 37818;\nexport const RGBA_ASTC_10x10_Format = 37819;\nexport const RGBA_ASTC_12x10_Format = 37820;\nexport const RGBA_ASTC_12x12_Format = 37821;\nexport const RGBA_BPTC_Format = 36492;\nexport const RGB_BPTC_SIGNED_Format = 36494;\nexport const RGB_BPTC_UNSIGNED_Format = 36495;\nexport const RED_RGTC1_Format = 36283;\nexport const SIGNED_RED_RGTC1_Format = 36284;\nexport const RED_GREEN_RGTC2_Format = 36285;\nexport const SIGNED_RED_GREEN_RGTC2_Format = 36286;\nexport const LoopOnce = 2200;\nexport const LoopRepeat = 2201;\nexport const LoopPingPong = 2202;\nexport const InterpolateDiscrete = 2300;\nexport const InterpolateLinear = 2301;\nexport const InterpolateSmooth = 2302;\nexport const ZeroCurvatureEnding = 2400;\nexport const ZeroSlopeEnding = 2401;\nexport const WrapAroundEnding = 2402;\nexport const NormalAnimationBlendMode = 2500;\nexport const AdditiveAnimationBlendMode = 2501;\nexport const TrianglesDrawMode = 0;\nexport const TriangleStripDrawMode = 1;\nexport const TriangleFanDrawMode = 2;\n/** @deprecated Use LinearSRGBColorSpace or NoColorSpace in three.js r152+. */\nexport const LinearEncoding = 3000;\n/** @deprecated Use SRGBColorSpace in three.js r152+. */\nexport const sRGBEncoding = 3001;\nexport const BasicDepthPacking = 3200;\nexport const RGBADepthPacking = 3201;\nexport const TangentSpaceNormalMap = 0;\nexport const ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\nexport const NoColorSpace = '';\nexport const SRGBColorSpace = 'srgb';\nexport const LinearSRGBColorSpace = 'srgb-linear';\nexport const DisplayP3ColorSpace = 'display-p3';\nexport const LinearDisplayP3ColorSpace = 'display-p3-linear';\nexport const RGBM16ColorSpace = 'rgbm-16';\n\nexport const LinearTransfer = 'linear';\nexport const SRGBTransfer = 'srgb';\n\nexport const Rec709Primaries = 'rec709';\nexport const P3Primaries = 'p3';\n\nexport const ZeroStencilOp = 0;\nexport const KeepStencilOp = 7680;\nexport const ReplaceStencilOp = 7681;\nexport const IncrementStencilOp = 7682;\nexport const DecrementStencilOp = 7683;\nexport const IncrementWrapStencilOp = 34055;\nexport const DecrementWrapStencilOp = 34056;\nexport const InvertStencilOp = 5386;\n\nexport const NeverStencilFunc = 512;\nexport const LessStencilFunc = 513;\nexport const EqualStencilFunc = 514;\nexport const LessEqualStencilFunc = 515;\nexport const GreaterStencilFunc = 516;\nexport const NotEqualStencilFunc = 517;\nexport const GreaterEqualStencilFunc = 518;\nexport const AlwaysStencilFunc = 519;\n\nexport const NeverCompare = 512;\nexport const LessCompare = 513;\nexport const EqualCompare = 514;\nexport const LessEqualCompare = 515;\nexport const GreaterCompare = 516;\nexport const NotEqualCompare = 517;\nexport const GreaterEqualCompare = 518;\nexport const AlwaysCompare = 519;\n\nexport const StaticDrawUsage = 35044;\nexport const DynamicDrawUsage = 35048;\nexport const StreamDrawUsage = 35040;\nexport const StaticReadUsage = 35045;\nexport const DynamicReadUsage = 35049;\nexport const StreamReadUsage = 35041;\nexport const StaticCopyUsage = 35046;\nexport const DynamicCopyUsage = 35050;\nexport const StreamCopyUsage = 35042;\n\nexport const GLSL1 = '100';\nexport const GLSL3 = '300 es';\n\nexport const _SRGBAFormat = 1035; // fallback for WebGL 1\n\nexport const WebGLCoordinateSystem = 2000;\nexport const WebGPUCoordinateSystem = 2001;\n","import * as MathUtils from './MathUtils.js';\nimport { Quaternion } from './Quaternion.js';\n\nclass Vector3 {\n\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\tVector3.prototype.isVector3 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t}\n\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyEuler( euler ) {\n\n\t\treturn this.applyQuaternion( _quaternion.setFromEuler( euler ) );\n\n\t}\n\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\t// quaternion q is assumed to have unit length\n\n\t\tconst vx = this.x, vy = this.y, vz = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// t = 2 * cross( q.xyz, v );\n\t\tconst tx = 2 * ( qy * vz - qz * vy );\n\t\tconst ty = 2 * ( qz * vx - qx * vz );\n\t\tconst tz = 2 * ( qx * vy - qy * vx );\n\n\t\t// v + q.w * t + cross( q.xyz, t );\n\t\tthis.x = vx + qw * tx + qy * tz - qz * ty;\n\t\tthis.y = vy + qw * ty + qz * tx - qx * tz;\n\t\tthis.z = vz + qw * tz + qx * ty - qy * tx;\n\n\t\treturn this;\n\n\t}\n\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector );\n\n\t}\n\n\treflect( normal ) {\n\n\t\t// reflect incident vector off plane orthogonal to normal\n\t\t// normal is assumed to have unit length\n\n\t\treturn this.sub( _vector.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( MathUtils.clamp( theta, - 1, 1 ) );\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\tsetFromEuler( e ) {\n\n\t\tthis.x = e._x;\n\t\tthis.y = e._y;\n\t\tthis.z = e._z;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromColor( c ) {\n\n\t\tthis.x = c.r;\n\t\tthis.y = c.g;\n\t\tthis.z = c.b;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\trandomDirection() {\n\n\t\t// Derived from https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst u = ( Math.random() - 0.5 ) * 2;\n\t\tconst t = Math.random() * Math.PI * 2;\n\t\tconst f = Math.sqrt( 1 - u ** 2 );\n\n\t\tthis.x = f * Math.cos( t );\n\t\tthis.y = f * Math.sin( t );\n\t\tthis.z = u;\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\n\nexport { Vector3 };\n","import { WebGLCoordinateSystem, WebGPUCoordinateSystem } from '../constants.js';\nimport { Vector3 } from './Vector3.js';\n\nclass Matrix4 {\n\n\tconstructor( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tMatrix4.prototype.isMatrix4 = true;\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 );\n\n\t\t}\n\n\t}\n\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractRotation( m ) {\n\n\t\t// this method does not support reflection matrices\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromEuler( euler ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\tmakeTranslation( x, y, z ) {\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x.x,\n\t\t\t\t0, 1, 0, x.y,\n\t\t\t\t0, 0, 1, x.z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1.elements[ 0 ] *= invSX;\n\t\t_m1.elements[ 1 ] *= invSX;\n\t\t_m1.elements[ 2 ] *= invSX;\n\n\t\t_m1.elements[ 4 ] *= invSY;\n\t\t_m1.elements[ 5 ] *= invSY;\n\t\t_m1.elements[ 6 ] *= invSY;\n\n\t\t_m1.elements[ 8 ] *= invSZ;\n\t\t_m1.elements[ 9 ] *= invSZ;\n\t\t_m1.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tmakePerspective( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tc = - ( far + near ) / ( far - near );\n\t\t\td = ( - 2 * far * near ) / ( far - near );\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tc = - far / ( far - near );\n\t\t\td = ( - far * near ) / ( far - near );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a; \tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b; \tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c; \tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\tmakeOrthographic( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem ) {\n\n\t\tconst te = this.elements;\n\t\tconst w = 1.0 / ( right - left );\n\t\tconst h = 1.0 / ( top - bottom );\n\t\tconst p = 1.0 / ( far - near );\n\n\t\tconst x = ( right + left ) * w;\n\t\tconst y = ( top + bottom ) * h;\n\n\t\tlet z, zInv;\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tz = ( far + near ) * p;\n\t\t\tzInv = - 2 * p;\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tz = near * p;\n\t\t\tzInv = - 1 * p;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\t\tte[ 8 ] = 0; \t\tte[ 12 ] = - x;\n\t\tte[ 1 ] = 0; \t\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0; \t\tte[ 13 ] = - y;\n\t\tte[ 2 ] = 0; \t\tte[ 6 ] = 0;\t\tte[ 10 ] = zInv;\tte[ 14 ] = - z;\n\t\tte[ 3 ] = 0; \t\tte[ 7 ] = 0;\t\tte[ 11 ] = 0;\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nexport { Matrix4 };\n","import { Quaternion } from './Quaternion.js';\nimport { Matrix4 } from './Matrix4.js';\nimport { clamp } from './MathUtils.js';\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\n\nclass Euler {\n\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER ) {\n\n\t\tthis.isEuler = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix, order, update );\n\n\t}\n\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\treorder( newOrder ) {\n\n\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t_quaternion.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion, newOrder );\n\n\t}\n\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\n\t}\n\n}\n\nEuler.DEFAULT_ORDER = 'XYZ';\n\nexport { Euler };\n","import {createCamera} from './camera'\nimport {createLight} from './light'\nimport {createMesh} from './mesh'\nimport {IObject3D, Object3D} from 'threepipe'\nimport {Ctx} from './ctx'\nimport {Euler, EulerOrder} from 'three/src/math/Euler'\nimport {Quaternion, Vector3} from 'three'\n\n// https://github.com/blender/blender/blob/99a4c93081cc2310a09a14f20a1493e8974c10d2/source/blender/makesdna/DNA_object_types.h#L445\nconst blenderObjectTypes = {\n empty: 0,\n mesh: 1,\n lamp: 10,\n camera: 11,\n}\n\nexport async function createObjects(file: any, ctx: Ctx) {\n const objects: (Object3D|null)[] = []\n const childMap = new Map<any, Object3D[]>()\n const objMap = new Map<any, Object3D>()\n const blendObjects = file.objects.Object ?? []\n const loaded = new WeakMap()\n // console.log(bakeGetters(file))\n for (const object of blendObjects) {\n if (loaded.has(object)) {\n console.warn('BlendLoader - duplicate object')\n continue\n }\n let obj: Object3D | undefined = undefined\n switch (object.type) {\n case blenderObjectTypes.empty:\n obj = new ctx.Object3D()\n break\n case blenderObjectTypes.mesh:\n obj = createMesh(object, loaded, ctx)\n break\n case blenderObjectTypes.lamp:\n obj = createLight(object, ctx)\n break\n case blenderObjectTypes.camera:\n obj = createCamera(object, ctx)\n break\n default:\n obj = new ctx.Object3D()\n console.warn('Unsupported object type', object.type, object, obj)\n }\n if (obj) {\n setTransform(object, obj as any)\n const exChildren = childMap.get(object)\n if (exChildren) {\n for (const exChild of exChildren) {\n obj.add(exChild)\n }\n childMap.delete(object)\n }\n objMap.set(object, obj)\n if (object.parent === object) {\n console.error('BlendLoader - invalid, parent same as object, adding to root', object)\n objects.push(obj)\n } else if (!object.parent) { // just in case\n objects.push(obj)\n } else {\n const parent = objMap.get(object.parent)\n if (!parent) {\n const chi = childMap.get(object.parent) ?? []\n chi.push(obj)\n childMap.set(object, chi)\n } else {\n parent.add(obj)\n }\n }\n loaded.set(object, obj)\n }\n }\n if (childMap.size) {\n const vals = [...childMap.values()].flat()\n console.warn('BlendLoader - unknown objects with parents, adding to root', vals, childMap)\n objects.push(...vals)\n }\n return objects.filter(o => !!o) as Object3D[]\n}\n\n\n// https://github.com/blender/blender/blob/458e224587e8c45da20841a283cc1b41adc98950/source/blender/makesdna/DNA_action_types.h#L526\nconst eulerModes: Record<number, EulerOrder> = {\n [1]: 'XYZ',\n [2]: 'XZY',\n [3]: 'YXZ',\n [4]: 'YZX',\n [5]: 'ZXY',\n [6]: 'ZYX',\n}\n\nfunction setTransform(object: any, obj: IObject3D) {\n obj.name = object.aname\n obj.scale.set(object.size[0], object.size[2], object.size[1])\n obj.position.set(object.loc[0], object.loc[2], -object.loc[1])\n\n if (!object.rotmode || object.rotmode === 0) {\n // const quat = new Quaternion()\n obj.quaternion.set(object.quat[1], object.quat[3], -object.quat[2], object.quat[0]) // wxyz\n } else {\n // console.log(object.rotmode)\n // const order = eulerModes[4]\n const order = eulerModes[object.rotmode] ?? 'XYZ'\n const quat = new Quaternion().setFromEuler(new Euler(object.rot[0], object.rot[1], object.rot[2], order.split('').reverse().join('') as any))\n obj.quaternion.set(quat.x, quat.z, -quat.y, quat.w) // wxyz\n }\n // because camera is rotated 90d in blender\n if (object.type === blenderObjectTypes.camera)\n obj.quaternion.multiply(new Quaternion().setFromAxisAngle(new Vector3(1, 0, 0), -Math.PI / 2))\n\n obj.updateMatrix()\n if (obj.setDirty) obj.setDirty()\n}\n","import {\n AmbientLight2,\n AnyOptions,\n BaseImporterPlugin,\n BufferAttribute,\n BufferGeometry2,\n DirectionalLight2,\n FileLoader,\n ILoader,\n Importer, Mesh,\n Mesh2,\n Object3D,\n Object3D2,\n OrthographicCamera0,\n PerspectiveCamera0,\n PhysicalMaterial,\n PointLight2,\n Scene, SpotLight2,\n UnlitMaterial,\n} from 'threepipe'\nimport {parseBlend} from './js-blend/main.js'\nimport {createObjects} from './loader'\n\n/**\n * Adds support for loading Blend `.blend`, `application/x-blender` files and data uris\n */\nexport class BlendLoadPlugin extends BaseImporterPlugin {\n public static readonly PluginType = 'BlendLoadPlugin'\n constructor() {\n super()\n }\n protected _importer = new Importer(class extends FileLoader implements ILoader {\n async loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise<any> {\n this.setResponseType('arraybuffer')\n const res = (await super.loadAsync(url, onProgress)) as ArrayBuffer\n const blend = await parseBlend(res)\n // console.log(bakeGetters(blend))\n const ctx = {\n Object3D: Object3D2,\n Mesh: Mesh2 as typeof Mesh,\n MeshPhysicalMaterial: PhysicalMaterial,\n MeshBasicMaterial: UnlitMaterial,\n PerspectiveCamera: PerspectiveCamera0,\n OrthographicCamera: OrthographicCamera0,\n PointLight: PointLight2,\n DirectionalLight: DirectionalLight2,\n SpotLight: SpotLight2,\n AmbientLight: AmbientLight2,\n BufferGeometry: BufferGeometry2,\n BufferAttribute: BufferAttribute,\n }\n const objects = await createObjects(blend, ctx)\n const root = new Object3D()\n root.add(...objects)\n root.userData.autoScaled = true\n root.userData.autoCentered = true\n // console.log(res, blend, root)\n blend.scene = root\n return blend\n }\n\n transform(res: any, options: AnyOptions): Scene {\n // console.log(res)\n // res.scene.userData.kinematics = res.kinematics\n // res.scene.userData.library = res.library\n if (typeof options.onBlendLoad === 'function') {\n options.onBlendLoad(res)\n }\n return res.scene\n }\n }, ['blend'], ['application/x-blender'], true)\n}\n"],"names":["AB","offset","pointer_size","array_names","i","BLENDER_FILE","parser","MathUtils.clamp","_quaternion","Quaternion","Vector3"],"mappings":"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","x_google_ignoreList":[7,8,9,10,11,12]}