@threepipe/plugin-blend-importer 0.1.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +53 -3
  2. package/README.md +25 -1
  3. package/dist/BlendLoadPlugin.d.ts +63 -3
  4. package/dist/BlendLoadPlugin.d.ts.map +1 -1
  5. package/dist/decompress.d.ts +10 -0
  6. package/dist/decompress.d.ts.map +1 -0
  7. package/dist/dependencies.txt +31 -1
  8. package/dist/index.d.ts +2 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +1354 -89
  11. package/dist/index.js.map +1 -1
  12. package/dist/index.mjs +1352 -87
  13. package/dist/index.mjs.map +1 -1
  14. package/dist/loader/camera.d.ts +1 -1
  15. package/dist/loader/ctx.d.ts +9 -1
  16. package/dist/loader/ctx.d.ts.map +1 -1
  17. package/dist/loader/geometry.d.ts +2 -2
  18. package/dist/loader/geometry.d.ts.map +1 -1
  19. package/dist/loader/index.d.ts +1 -1
  20. package/dist/loader/light.d.ts +1 -1
  21. package/dist/loader/material.d.ts +4 -1
  22. package/dist/loader/material.d.ts.map +1 -1
  23. package/dist/loader/mesh.d.ts +1 -1
  24. package/dist/loader/mesh.d.ts.map +1 -1
  25. package/docs/assets/highlight.css +49 -0
  26. package/docs/assets/icons.js +1 -1
  27. package/docs/assets/icons.svg +1 -1
  28. package/docs/assets/main.js +2 -2
  29. package/docs/assets/navigation.js +1 -1
  30. package/docs/assets/search.js +1 -1
  31. package/docs/assets/style.css +3 -3
  32. package/docs/classes/BlendLoadPlugin.html +6 -3
  33. package/docs/index.html +1 -1
  34. package/docs/interfaces/BlendFile.html +18 -0
  35. package/docs/interfaces/BlendLoadOptions.html +12 -0
  36. package/package.json +1 -1
  37. package/src/BlendLoadPlugin.ts +204 -13
  38. package/src/decompress.ts +59 -0
  39. package/src/index.ts +1 -0
  40. package/src/js-blend/main.js +4 -1
  41. package/src/js-blend/parser/parser.js +192 -52
  42. package/src/loader/ctx.ts +9 -0
  43. package/src/loader/geometry.ts +270 -13
  44. package/src/loader/material.ts +326 -8
  45. package/src/loader/mesh.ts +34 -8
  46. package/tsconfig.json +1 -0
  47. package/docs/.nojekyll +0 -1
@@ -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 function seekCheck (buffer, _in, str) {\n const length = str.length;\n for (let i = 0; i < length; i++) {\n if (buffer.getUint8(_in + i) !== str.charCodeAt(i)) {\n return false;\n }\n }\n return true;\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 // Adjust for alignment TYPE\n for (let j = 0; j < 8; j++) {\n if(seekCheck(data, offset2, 'TYPE')) break\n offset2++;\n }\n if(!seekCheck(data, offset2, 'TYPE')) {\n ERROR = 'Unexpected alignment error in SDNA parsing';\n break\n }\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 // Adjust for alignment\n for (let j = 0; j < 8; j++) {\n if(seekCheck(data, offset2, 'TLEN')) break\n offset2++;\n }\n if(!seekCheck(data, offset2, 'TLEN')) {\n ERROR = 'Unexpected alignment error in SDNA parsing';\n break\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 // Adjust for alignment\n for (let j = 0; j < 8; j++) {\n if(seekCheck(data, offset2, 'STRC')) break\n offset2++;\n }\n if(!seekCheck(data, offset2, 'STRC')) {\n ERROR = 'Unexpected alignment error in SDNA parsing';\n break\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 verticesData\n let indices\n let indicesData\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 verticesData = data\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 indicesData = data\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 (verticesData && verticesData.length > 0) {\n const positions = new Float32Array(verticesData.length * 3)\n for (let j = 0; j < verticesData.length; j++) {\n const {x, y, z, co} = verticesData[j] || {}\n if (x !== undefined) {\n positions[j * 3] = x\n positions[j * 3 + 1] = z\n positions[j * 3 + 2] = -y\n } else if (co !== undefined) {\n positions[j * 3] = co[0]\n positions[j * 3 + 1] = co[2]\n positions[j * 3 + 2] = -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', verticesData[j])\n break\n }\n }\n geometry.setAttribute('position', new ctx.BufferAttribute(positions, 3))\n }\n\n if (indicesData && indicesData.length > 0 && verticesData?.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 = indicesData[faceStart].i\n for (let k = 1; k < faceVertCount - 1; k++) {\n indexes[t++] = firstVert\n indexes[t++] = indicesData[faceStart + k].i\n indexes[t++] = indicesData[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 {co, no} = vertices[loop.v] || {}\n indices[currentIndex] = currentIndex\n\n if (co) {\n positions[currentIndex * 3 + 0] = co[0]\n positions[currentIndex * 3 + 1] = co[2]\n positions[currentIndex * 3 + 2] = -co[1]\n }\n\n if (no) {\n normals[currentIndex * 3 + 0] = no[0]\n normals[currentIndex * 3 + 1] = no[2]\n normals[currentIndex * 3 + 2] = -no[1]\n } else {\n computeNormals = true\n }\n\n if (uv) {\n const uv1 = uv[index].uv\n uvs[currentIndex * 2 + 0] = uv1[0]\n uvs[currentIndex * 2 + 1] = uv1[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","import {createCamera} from './camera'\nimport {createLight} from './light'\nimport {createMesh} from './mesh'\nimport {Euler, EulerOrder, IObject3D, Object3D, Quaternion, Vector3} from 'threepipe'\nimport {Ctx} from './ctx'\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"],"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","../src/loader/index.ts","../node_modules/fzstd/esm/index.mjs","../src/decompress.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 // ERROR is module-global; without this reset a failed parse (e.g. an unsupported\n // big-endian file) would be reported for the next, successful parse.\n ERROR = 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 // Alignment-safe TypedArray read over the file buffer. Consumers (e.g. loader/geometry.ts)\n // that reach into `__blender_file__.AB` at a datablock's `__data_address__` MUST use this\n // instead of `new Ctor(AB, byteOffset, n)` — Blender packs blocks with no padding, so on\n // v1 (17-byte header) and some v0 files the payload lands at an offset that isn't a multiple\n // of the element size, where a direct view throws RangeError. All supported files are\n // little-endian (big-endian is rejected at header parse), so a raw byte copy is correct.\n readTypedArray: function (Ctor, byteOffset, length) {\n return alignedTypedArray(Ctor, this.AB, byteOffset, length);\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 // Construct a TypedArray view over the file buffer, copying into a fresh aligned buffer when\n // the byte offset isn't a multiple of the element size. Blender packs blocks with no padding,\n // so on v1 (17-byte header) and some v0 files the payload lands at unaligned offsets where a\n // direct `new Float32Array(buf, oddOffset, n)` would throw. All supported files are\n // little-endian (big-endian is rejected at header parse), so a raw byte copy is correct.\n function alignedTypedArray (Ctor, buffer, byteOffset, length) {\n if ((byteOffset % Ctor.BYTES_PER_ELEMENT) === 0) {\n return new Ctor(buffer, byteOffset, length);\n }\n const out = new Ctor(length);\n new Uint8Array(out.buffer).set(new Uint8Array(buffer, byteOffset, length * Ctor.BYTES_PER_ELEMENT));\n return out;\n }\n\n function float64Prop (offset, Blender_Array_Length, length) {\n return {\n get: function () {\n return (Blender_Array_Length > 1) ?\n alignedTypedArray(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 alignedTypedArray(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 alignedTypedArray(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 alignedTypedArray(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 alignedTypedArray(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 alignedTypedArray(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 const bf = this.__blender_file__;\n let pointer = bf.getPointer(this.__data_address__ + offset, bf);\n const link = bf.memory_lookup[pointer];\n\n const results = [];\n\n if (link) {\n const address = link.__data_address__;\n const ps = (bf.template && bf.template.pointer_size) || 8;\n // The pointed-to block is a malloc'd array of `block_length / pointer_size` pointers\n // (e.g. `Material **mat` is `totcol` pointers). Read the WHOLE array and keep null\n // (unresolved) entries as null — Blender leaves empty/object-linked material slots as\n // null pointers in the middle of the array, so breaking at the first null silently\n // drops every slot after it (lost materials, invisible faces).\n const count = (typeof link.__byte_length__ === 'number' && link.__byte_length__ > 0)\n ? Math.floor(link.__byte_length__ / ps) : 0;\n if (count > 0) {\n for (let j = 0; j < count; j++) {\n pointer = bf.getPointer(address + j * ps, bf);\n results.push(bf.memory_lookup[pointer] || null);\n }\n } else {\n // Fallback (no known block length): read until the first null, as before.\n let j = 0;\n while (true) {\n pointer = bf.getPointer(address + j * ps, bf);\n const obj = bf.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 // Signed 1-byte field (int8_t). Used widely in Blender 5.0 DNA (enum domains, flags, etc).\n function int8Prop (offset, Blender_Array_Length, length) {\n return {\n get: function () {\n return (Blender_Array_Length > 1) ?\n alignedTypedArray(Int8Array, this.__blender_file__.AB, this.__data_address__ + offset, length) :\n this.__blender_file__.dv.getInt8(this.__data_address__ + offset);\n },\n set: function (v) { if (Blender_Array_Length <= 1) this.__blender_file__.dv.setInt8(this.__data_address__ + offset, v); },\n enumerable: true, configurable: true,\n };\n }\n\n // 8-byte integer field (int64_t / uint64_t). Returned as a JS Number — .blend counts/sizes are\n // well under 2^53. Used by Blender 5.0 DNA (AttributeArray.size, LargeBHead lengths, etc).\n function int64Prop (offset, Blender_Array_Length, length, unsigned) {\n return {\n get: function () {\n if (Blender_Array_Length > 1) {\n return alignedTypedArray(unsigned ? BigUint64Array : BigInt64Array, this.__blender_file__.AB, this.__data_address__ + offset, length);\n }\n const dv = this.__blender_file__.dv, le = this.__blender_file__.template.endianess;\n return Number(unsigned ? dv.getBigUint64(this.__data_address__ + offset, le) : dv.getBigInt64(this.__data_address__ + offset, le));\n },\n set: function () {},\n enumerable: true, 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 case 'int32_t':\n Object.defineProperty(obj, name, intProp(offset, array_size, length >> 2));\n break;\n case 'uint32_t':\n Object.defineProperty(obj, name, uIntProp(offset, array_size, length >> 2));\n break;\n case 'short':\n case 'int16_t':\n Object.defineProperty(obj, name, shortProp(offset, array_size, length >> 1));\n break;\n case 'ushort':\n case 'uint16_t':\n Object.defineProperty(obj, name, uShortProp(offset, array_size, length >> 1));\n break;\n case 'int8_t':\n Object.defineProperty(obj, name, int8Prop(offset, array_size, length));\n break;\n case 'char':\n case 'uchar':\n case 'uint8_t':\n Object.defineProperty(obj, name, charProp(offset, array_size, length));\n break;\n case 'int64_t':\n Object.defineProperty(obj, name, int64Prop(offset, array_size, length >> 3, false));\n break;\n case 'uint64_t':\n Object.defineProperty(obj, name, int64Prop(offset, array_size, length >> 3, true));\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 // Byte length of this block's payload (data_block_length is the end offset). Lets\n // consumers derive element counts for raw DATA blocks (e.g. poly_offset_indices) whose\n // logical length isn't available elsewhere — needed for Blender 5.0 where Mesh.tot* are\n // runtime (post-geometry-nodes) counts, not the stored array sizes.\n this.__byte_length__ = data_block_length - _data_offset;\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 function seekCheck (buffer, _in, str) {\n const length = str.length;\n for (let i = 0; i < length; i++) {\n if (buffer.getUint8(_in + i) !== str.charCodeAt(i)) {\n return false;\n }\n }\n return true;\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 // Compressed (gzip/zstd) blend files are decompressed upstream in BlendLoadPlugin.loadAsync.\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 // Decode the file header. Two formats exist\n // (.repos/blender/source/blender/blenloader_core/intern/blo_core_blend_header.cc):\n // v0 (12 bytes): 'BLENDER' + ('_'|'-') + ('v'|'V') + 3-digit version\n // '_' = 4-byte pointers (BHead4), '-' = 8-byte pointers (SmallBHead8)\n // v1 (17 bytes, Blender 5.0+): 'BLENDER' + '17' + '-' + '01' + 'v' + 4-digit version\n // always 8-byte pointers, little-endian, LargeBHead8 blocks.\n // BIG_ENDIAN is misleadingly named — it is `true` for little-endian files (the value is\n // passed straight to DataView getters as the `littleEndian` arg). Keep that convention.\n let version, large_bhead = false\n const fmtByte = toString(_data, 7, 8)\n if (fmtByte === '_' || fmtByte === '-') {\n pointer_size = fmtByte === '_' ? 4 : 8\n BIG_ENDIAN = toString(_data, 8, 9) !== 'V'\n version = toString(_data, 9, 12)\n offset = 12\n } else {\n // New-style 17-byte header. Bytes 7-8 = header size ('17'), 9 = '-',\n // 10-11 = file-format version ('01'), 12 = 'v', 13-16 = blender version.\n const headerSize = parseInt(toString(_data, 7, 9), 10)\n if (headerSize !== 17) return ERROR = 'Unsupported new-style blend header size: ' + headerSize;\n pointer_size = 8\n BIG_ENDIAN = true // v1 is always little-endian\n large_bhead = true\n version = toString(_data, 13, 17)\n offset = headerSize\n }\n\n if (!BIG_ENDIAN) {\n // Big-endian .blend files (ancient PowerPC/SGI era, e.g. Blender < 2.0) need every field\n // byte-swapped, which we don't do. Bail clearly instead of producing garbage.\n return ERROR = 'Big-endian .blend files are not supported';\n }\n\n // Per-format block-header layout. BHead variants\n // (.repos/blender/source/blender/blenloader_core/BLO_core_bhead.hh):\n // BHead4 (ptr=4): code@0 len@4(i32) old@8(u32) SDNAnr@12 nr@16 — 20 bytes\n // SmallBHead8 (v0): code@0 len@4(i32) old@8(u64) SDNAnr@16 nr@20 — 24 bytes\n // LargeBHead8 (v1): code@0 SDNAnr@4 old@8(u64) len@16(i64) nr@24(i64) — 32 bytes\n // For v0 these reduce to the original parametrised offsets, so v0 behaviour is unchanged.\n const BLOCK_HDR = large_bhead ? 32 : (16 + pointer_size)\n const SDNA_OFF = large_bhead ? 4 : (8 + pointer_size)\n const LEN_OFF = large_bhead ? 16 : 4\n const NR_OFF = large_bhead ? 24 : (12 + pointer_size)\n const LEN_I64 = large_bhead\n const NR_I64 = large_bhead\n // Blender packs blocks with no inter-block padding (verified empirically + writefile.cc),\n // so block offsets advance by exactly BLOCK_HDR + len. The v1 17-byte header (and some v0\n // files) leave block payloads at offsets that aren't multiples of 4/8 — those are handled\n // at the TypedArray getter level (alignedTypedArray) rather than by realigning the buffer.\n const readLen = (o) => LEN_I64 ? Number(data.getBigInt64(o + LEN_OFF, true)) : data.getInt32(o + LEN_OFF, true)\n const readSdna = (o) => data.getInt32(o + SDNA_OFF, BIG_ENDIAN)\n const readNr = (o) => NR_I64 ? Number(data.getBigInt64(o + NR_OFF, true)) : data.getInt32(o + NR_OFF, BIG_ENDIAN)\n\n // create new master template if none exist for current blender version;\n // Key on format + version so a v0 \"050\" and a v1 \"0500\" can never share a template.\n const templateKey = (large_bhead ? 'v1:' : 'v0:') + version\n if (!templates[templateKey]) {\n templates[templateKey] = new MASTER_SDNA_SCHEMA(version);\n }\n\n current_SDNA_template = templates[templateKey];\n\n FILE.template = current_SDNA_template;\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 // Bounds guard: the SDNA-search loop walks block headers looking for DNA1.\n // If a previous block's block_length is wrong (happens on some Blender 4.x\n // geometry-nodes files), offset2 lands past EOF and the getInt32 below throws\n // RangeError synchronously, killing the whole load. Match the main block\n // loop's guard pattern (line ~810).\n if (offset2 + BLOCK_HDR > data.byteLength) {\n ERROR = 'Unexpected end of file while searching for DNA1';\n break\n }\n sdna_index = readSdna(offset2);\n // eslint-disable-next-line no-control-regex\n code = toString(_data, offset2, offset2 + 4).replace(/\\u0000/g, '');\n block_length = readLen(offset2);\n offset2 += BLOCK_HDR;\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 // Adjust for alignment TYPE\n for (let j = 0; j < 8; j++) {\n if(seekCheck(data, offset2, 'TYPE')) break\n offset2++;\n }\n if(!seekCheck(data, offset2, 'TYPE')) {\n ERROR = 'Unexpected alignment error in SDNA parsing';\n break\n }\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 // Adjust for alignment\n for (let j = 0; j < 8; j++) {\n if(seekCheck(data, offset2, 'TLEN')) break\n offset2++;\n }\n if(!seekCheck(data, offset2, 'TLEN')) {\n ERROR = 'Unexpected alignment error in SDNA parsing';\n break\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 // Adjust for alignment\n for (let j = 0; j < 8; j++) {\n if(seekCheck(data, offset2, 'STRC')) break\n offset2++;\n }\n if(!seekCheck(data, offset2, 'STRC')) {\n ERROR = 'Unexpected alignment error in SDNA parsing';\n break\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 // Defensive: skip any stray NUL padding before a block header. Blender writes none\n // between blocks (verified), so for correctly-decoded files this is a no-op; it only\n // matters as a safety net against a mis-decoded length. Block codes are always A-Z.\n for (let j = 0; j < 8; j++) {\n if(data.getInt8(offset) === 0) {\n offset++\n continue\n }\n break\n }\n\n data_offset = offset;\n\n if (offset + BLOCK_HDR > data.byteLength) {\n ERROR = 'Unexpected end of file while parsing';\n break\n }\n\n sdna_index = readSdna(offset);\n const code_str = toString(_data, offset, offset + 4)\n\n offset2 = offset + BLOCK_HDR;\n\n const blockLength = readLen(offset);\n if (blockLength < 0 || offset + blockLength + BLOCK_HDR > data.byteLength) {\n ERROR = 'Invalid block length detected';\n break\n }\n\n offset += blockLength + BLOCK_HDR;\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 + BLOCK_HDR;\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 = alignedTypedArray(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 + BLOCK_HDR;\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 = readLen(data_offset);\n\n count = readNr(data_offset);\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 // Soft-error: log but still resolve with the partial result. Several\n // .blend files (notably geometry-nodes scenes in Blender 4.x) trigger\n // mid-parse errors but produce a usable partial scene; rejecting would\n // strip all rendered geometry. todo Re-evaluate if we should throw once the parser is hardened.\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// Read a NUL-terminated C string from a resolved pointer block (e.g. an Attribute.name char*).\nfunction readCString(block: any): string | null {\n if (!block || block.__data_address__ === undefined || !block.__blender_file__) return null\n const u8 = block.__blender_file__.byte\n let s = '', o = block.__data_address__\n while (o < u8.length && u8[o] !== 0 && s.length < 256) s += String.fromCharCode(u8[o++])\n return s\n}\n\n// Blender 5.0 (.blend file_format_version 1) stores mesh attributes in `attribute_storage`\n// (struct AttributeStorage { Attribute *dna_attributes; int dna_attributes_num; ... }) instead of\n// the CustomData vdata/ldata layers used by 2.8-4.x. See\n// .repos/blender/source/blender/makesdna/DNA_attribute_types.h and BKE_attribute_enums.hh.\n// Each Attribute { char *name; int16 data_type; int8 domain; int8 storage_type; void *data; } where\n// data -> AttributeArray { void *data; ...; int64 size; } and the void* points to the packed values.\nconst ATTR_TYPE_INT32 = 3, ATTR_TYPE_FLOAT2 = 6, ATTR_TYPE_FLOAT3 = 7 // bke::AttrType\nconst ATTR_DOMAIN_CORNER = 3 // bke::AttrDomain (Point=0, Edge=1, Face=2, Corner=3)\nfunction getAttributes(meshData: any): any[] {\n const as = meshData.attribute_storage\n if (!as) return []\n let attrs = as.dna_attributes\n if (!attrs) return []\n attrs = (Array.isArray(attrs) || attrs.length !== undefined) ? Array.from(attrs) : [attrs]\n return attrs as any[]\n}\nfunction findAttribute(attrs: any[], name: string, type?: number): any {\n for (const a of attrs) {\n if (readCString(a.name) === name && (type === undefined || a.data_type === type)) return a\n }\n return null\n}\n// Element count actually stored for an attribute (AttributeArray.size). In Blender 5.0 the Mesh\n// tot* fields are runtime (post-geometry-nodes) counts and DON'T match the stored array sizes — a\n// geometry-nodes \"Circle\" can report totvert=15 while only 4 base vertices are stored. So the\n// attribute's own size is authoritative; reading tot* elements overruns into adjacent blocks (garbage).\nfunction attrSize(attr: any): number {\n const arr = attr && attr.data\n const n = arr && arr.size !== undefined ? Number(arr.size) : 0\n return Number.isFinite(n) && n >= 0 ? n : 0\n}\n// Read the packed array for an Attribute as a TypedArray of `count` elements (alignment-safe).\nfunction readAttrArray(attr: any, Ctor: any, count: number): any {\n const arr = attr && attr.data // AttributeArray\n const block = arr && arr.data // void* -> packed values block\n if (!block || block.__data_address__ === undefined || !block.__blender_file__) return null\n return block.__blender_file__.readTypedArray(Ctor, block.__data_address__, count)\n}\n\n// ── Per-face material slots -> BufferGeometry groups ─────────────────\ntype GroupRun = {start: number, count: number, mat: number}\n// Append a triangle run [start, start+count) (index-buffer offsets) tagged with material slot `mat`,\n// merging into the previous run when contiguous and same-slot so the group count stays minimal.\nfunction mergeGroupRun(runs: GroupRun[], start: number, count: number, mat: number) {\n if (count <= 0) return\n const last = runs[runs.length - 1]\n if (last && last.mat === mat && last.start + last.count === start) last.count += count\n else runs.push({start, count, mat})\n}\n// Mid path (corner_vert): per-face material slot is the `pdata` CustomData layer \"material_index\"\n// (CD_PROP_INT32, type 11), one int per face. `pdata.layers` is a single object when totlayer===1.\nfunction readFaceMaterialIndex(meshData: any, faceCount: number): number[] | null {\n const pd = meshData.pdata\n if (!pd || !pd.layers || !pd.totlayer) return null\n for (let i = 0; i < pd.totlayer; i++) {\n const l = getLayer(pd.layers, i)\n if (l && l.name === 'material_index' && l.data) {\n const data = Array.isArray(l.data) ? l.data : (l.data.length !== undefined ? Array.from(l.data) : null)\n if (!data) return null\n const out: number[] = new Array(faceCount)\n for (let f = 0; f < faceCount; f++) {\n const e: any = data[f]\n out[f] = (e && typeof e === 'object') ? (e.i ?? e.value ?? 0) : (e || 0)\n }\n return out\n }\n }\n return null\n}\n\n// Build geometry from Blender 5.0 attribute_storage. Returns null if positions aren't available\n// (so the caller can fall back to the vdata/ldata path).\nfunction createBufferGeometryFromAttributes(meshData: any, ctx: Ctx): any {\n const attrs = getAttributes(meshData)\n if (!attrs.length) return null\n\n const posAttr = findAttribute(attrs, 'position', ATTR_TYPE_FLOAT3)\n const vertCount = attrSize(posAttr)\n const posRaw = vertCount > 0 && readAttrArray(posAttr, Float32Array, vertCount * 3)\n if (!posRaw) return null\n\n const geometry = new ctx.BufferGeometry()\n geometry.name = meshData.aname || ''\n\n // Blender Z-up (x,y,z) -> three.js Y-up (x, z, -y). Sanitize non-finite components to 0 —\n // real .blend files can contain NaN/Inf verts (e.g. from degenerate geometry-nodes ops), which\n // Blender tolerates but three.js does not (computeBoundingBox/Sphere return NaN and break culling).\n const positions = new Float32Array(vertCount * 3)\n for (let j = 0; j < vertCount; j++) {\n const x = posRaw[j * 3], y = posRaw[j * 3 + 1], z = posRaw[j * 3 + 2]\n positions[j * 3] = Number.isFinite(x) ? x : 0\n positions[j * 3 + 1] = Number.isFinite(z) ? z : 0\n positions[j * 3 + 2] = Number.isFinite(y) ? -y : 0\n }\n geometry.setAttribute('position', new ctx.BufferAttribute(positions, 3))\n\n // Faces: .corner_vert (vertex index per loop) + poly_offset_indices (loop range per face).\n // Use the corner_vert array size for the loop count, and the poly_offset_indices DATA block's\n // byte length for the face count (both are stored counts; Mesh.totloop/totpoly are runtime).\n const cvAttr = findAttribute(attrs, '.corner_vert', ATTR_TYPE_INT32)\n const loopCount = attrSize(cvAttr)\n const cornerVerts = loopCount > 0 && readAttrArray(cvAttr, Int32Array, loopCount)\n const poi = meshData.poly_offset_indices\n const faceOffsetCount = poi && poi.__byte_length__ ? (poi.__byte_length__ >> 2) : 0\n if (cornerVerts && faceOffsetCount > 1 && poi) {\n const faceIndices = poi.__blender_file__.readTypedArray(Int32Array, poi.__data_address__, faceOffsetCount)\n const faceCount = faceIndices.length - 1\n let totalTriangles = 0\n for (let i = 0; i < faceCount; i++) totalTriangles += Math.max(0, (faceIndices[i + 1] - faceIndices[i]) - 2)\n const indexes = new Uint32Array(totalTriangles * 3)\n const inRange = (v: number) => v >= 0 && v < vertCount\n // Per-face material slot -> groups (only when >1 slot). material_index is a Face-domain Int32 attribute.\n const matAttr = (meshData.totcol || 0) > 1 ? findAttribute(attrs, 'material_index', ATTR_TYPE_INT32) : null\n const faceMat = matAttr && attrSize(matAttr) >= faceCount ? readAttrArray(matAttr, Int32Array, faceCount) : null\n const groupRuns: GroupRun[] = []\n let t = 0\n for (let i = 0; i < faceCount; i++) {\n const faceStart = faceIndices[i], faceVertCount = faceIndices[i + 1] - faceStart\n const triStart = t\n if (faceVertCount >= 3 && faceStart >= 0 && faceStart + faceVertCount <= loopCount) {\n const firstVert = cornerVerts[faceStart] // todo: proper (ear-clip) triangulation for concave n-gons\n for (let k = 1; k < faceVertCount - 1; k++) {\n const b = cornerVerts[faceStart + k], c = cornerVerts[faceStart + k + 1]\n // Skip triangles referencing out-of-range vertices (corrupt/partial geometry-nodes data).\n if (inRange(firstVert) && inRange(b) && inRange(c)) {\n indexes[t++] = firstVert\n indexes[t++] = b\n indexes[t++] = c\n }\n }\n }\n if (faceMat) mergeGroupRun(groupRuns, triStart, t - triStart, faceMat[i] || 0)\n }\n geometry.setIndex(new ctx.BufferAttribute(t === indexes.length ? indexes : indexes.slice(0, t), 1))\n if (faceMat) for (const g of groupRuns) geometry.addGroup(g.start, g.count, g.mat)\n\n // UVs: the first user UV map is a Float2 attribute on the Corner domain (named, not dot-prefixed;\n // `.uv_select_*` are bools). UVs are per-corner but our geometry is per-vertex indexed, so we\n // assign each vertex the UV of a corner referencing it (last write wins). This is exact away\n // from UV seams; seam-correct UVs would need per-corner vertex expansion (todo).\n // Blender and three.js share the same UV origin (bottom-left), so no V flip.\n const uvAttr = attrs.find((a: any) => a.data_type === ATTR_TYPE_FLOAT2 && a.domain === ATTR_DOMAIN_CORNER && !(readCString(a.name) || '.').startsWith('.'))\n const uvRaw = uvAttr && attrSize(uvAttr) >= loopCount && readAttrArray(uvAttr, Float32Array, loopCount * 2)\n if (uvRaw) {\n const uvs = new Float32Array(vertCount * 2)\n for (let i = 0; i < loopCount; i++) {\n const v = cornerVerts[i]\n if (v >= 0 && v < vertCount) {\n const u = uvRaw[i * 2], vv = uvRaw[i * 2 + 1]\n uvs[v * 2] = Number.isFinite(u) ? u : 0\n uvs[v * 2 + 1] = Number.isFinite(vv) ? vv : 0\n }\n }\n geometry.setAttribute('uv', new ctx.BufferAttribute(uvs, 2))\n }\n }\n\n if (geometry.attributes.position && !geometry.attributes.normal)\n geometry.computeVertexNormals()\n return geometry\n}\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\n // Blender 5.0+ mesh attribute storage (file_format_version 1). Falls through to the\n // vdata/ldata path below if positions aren't found there.\n if (meshData.attribute_storage) {\n const g = createBufferGeometryFromAttributes(meshData, ctx)\n if (g) return g\n }\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 verticesData\n let indices\n let indicesData: any\n let uvLayerData: any = null\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 verticesData = data\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 const lname = layer.name || ''\n // UV map: a Float2 corner layer (CD_PROP_FLOAT2, type 49), user-named (not dot-prefixed\n // like `.corner_vert`/`.corner_edge`). Without this, textured meshes on the mid (3.6-4.x\n // corner_vert) path render with no UVs and the base-colour texture cannot map.\n if (!uvLayerData && (layer.type === 49 || (lname[0] !== '.' && /uv/i.test(lname)))) {\n uvLayerData = data\n continue\n }\n if (indices && (lname !== '.corner_vert' || indices.name === '.corner_vert')) {\n // console.warn('BlendLoader - multiple indices, ignoring', layer)\n continue\n }\n indices = layer\n indicesData = data\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 // Use the parser's alignment-safe reader — Blender packs blocks unpadded, so on v1\n // (Blender 5.0) and some v0 files this offset isn't 4-aligned and a raw Int32Array view throws.\n faceIndices = [...meshData.poly_offset_indices.__blender_file__.readTypedArray(Int32Array, 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 // Per-corner vertex expansion for SEAM-CORRECT UVs (mid path). Blender stores UVs per corner (loop);\n // three.js needs one UV per vertex. A Blender vertex shared by corners with DIFFERENT UVs is a UV seam —\n // assigning it a single UV (last-write-wins) makes the faces across the seam interpolate the texture over\n // the whole UV range, smearing/stretching it (classic symptom: the back of a UV-mapped sphere). Expand to\n // one vertex per unique (blenderVert, uv) so seams split. Coincident split verts stay welded under the\n // subsurf subdivision (same positions → same repositioning), so no crack. No UV layer ⇒ no expansion.\n const vco = (vd: any): [number, number, number] => vd?.x !== undefined ? [vd.x, vd.y, vd.z] : (vd?.co ? [vd.co[0], vd.co[1], vd.co[2]] : [0, 0, 0])\n let cornerToVert: Int32Array | null = null\n let expandedPos: Float32Array | null = null\n let expandedUv: Float32Array | null = null\n if (uvLayerData && indicesData && verticesData && verticesData.length) {\n cornerToVert = new Int32Array(indicesData.length)\n const seen = new Map<string, number>()\n const ps: number[] = [], us: number[] = []\n const uvN = uvLayerData.length\n for (let i = 0; i < indicesData.length; i++) {\n const bv = indicesData[i]?.i\n if (!(bv >= 0 && bv < verticesData.length)) { cornerToVert[i] = 0; continue }\n const e = i < uvN ? uvLayerData[i] : null\n const u = e && Number.isFinite(e.x) ? e.x : 0\n const w = e && Number.isFinite(e.y) ? e.y : 0\n const key = bv + '|' + Math.round(u * 4096) + '|' + Math.round(w * 4096)\n let ev = seen.get(key)\n if (ev === undefined) {\n ev = us.length / 2\n seen.set(key, ev)\n const [x, y, z] = vco(verticesData[bv])\n ps.push(x, z, -y) // Blender Z-up → three Y-up (same mapping as the non-expanded path)\n us.push(u, w)\n }\n cornerToVert[i] = ev\n }\n expandedPos = new Float32Array(ps)\n expandedUv = new Float32Array(us)\n }\n // Expanded-vertex index for a corner (loop) index; falls back to the raw Blender vertex when not expanding.\n const vAt = (corner: number) => cornerToVert ? cornerToVert[corner] : indicesData[corner].i\n\n if (expandedPos) {\n geometry.setAttribute('position', new ctx.BufferAttribute(expandedPos, 3))\n } else if (verticesData && verticesData.length > 0) {\n const positions = new Float32Array(verticesData.length * 3)\n for (let j = 0; j < verticesData.length; j++) {\n const {x, y, z, co} = verticesData[j] || {}\n if (x !== undefined) {\n positions[j * 3] = x\n positions[j * 3 + 1] = z\n positions[j * 3 + 2] = -y\n } else if (co !== undefined) {\n positions[j * 3] = co[0]\n positions[j * 3 + 1] = co[2]\n positions[j * 3 + 2] = -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', verticesData[j])\n break\n }\n }\n geometry.setAttribute('position', new ctx.BufferAttribute(positions, 3))\n }\n\n if (indicesData && indicesData.length > 0 && verticesData?.length) {\n const faceSize = meshData.totloop / meshData.totpoly\n if (faceIndices.length > 0) {\n // Use face offset indices for variable-sized faces\n const faceCount = faceIndices.length - 1\n let totalTriangles = 0\n for (let i = 0; i < faceCount; 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 // Per-face material slot -> groups (only when >1 slot). material_index lives in the `pdata` layer.\n const faceMat = (meshData.totcol || 0) > 1 ? readFaceMaterialIndex(meshData, faceCount) : null\n const groupRuns: GroupRun[] = []\n\n for (let i = 0; i < faceCount; i++) {\n const faceStart = faceIndices[i]\n const faceEnd = faceIndices[i + 1]\n const faceVertCount = faceEnd - faceStart\n const triStart = t\n\n if (faceVertCount >= 3) {\n // todo better Triangulate the face using fan triangulation\n const firstVert = vAt(faceStart)\n for (let k = 1; k < faceVertCount - 1; k++) {\n indexes[t++] = firstVert\n indexes[t++] = vAt(faceStart + k)\n indexes[t++] = vAt(faceStart + k + 1)\n }\n } else {\n // debugger\n }\n if (faceMat) mergeGroupRun(groupRuns, triStart, t - triStart, faceMat[i] || 0)\n }\n\n // console.log(indexes)\n geometry.setIndex(new ctx.BufferAttribute(indexes, 1))\n if (faceMat) for (const g of groupRuns) geometry.addGroup(g.start, g.count, g.mat)\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 = vAt(j)\n const b = vAt(j + 1)\n const c = vAt(j + 2)\n indexes[t++] = a\n indexes[t++] = b\n indexes[t++] = c\n\n if (isQuad) {\n const d = vAt(j + 3)\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 // UVs (mid corner_vert path): seam-correct, from the per-corner expansion above (one UV per split vertex).\n // Blender and three.js share the same UV origin (bottom-left), so no V flip.\n if (expandedUv && !geometry.attributes.uv) {\n geometry.setAttribute('uv', new ctx.BufferAttribute(expandedUv, 2))\n }\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 // Per-face material slot (mat_nr) -> geometry groups, but only when the mesh has >1 slot. Faces are\n // emitted in order, so each face's triangles form a contiguous index range; we merge consecutive\n // same-slot faces into one group. mesh.ts then assigns one material per slot.\n const useGroups = (mesh.totcol || 0) > 1\n const groupRuns: GroupRun[] = []\n\n for (const face of faces) {\n const len = face.totloop\n const start = face.loopstart\n const faceStartIndex = currentIndex\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 {co, no} = vertices[loop.v] || {}\n indices[currentIndex] = currentIndex\n\n if (co) {\n positions[currentIndex * 3 + 0] = co[0]\n positions[currentIndex * 3 + 1] = co[2]\n positions[currentIndex * 3 + 2] = -co[1]\n }\n\n if (no) {\n normals[currentIndex * 3 + 0] = no[0]\n normals[currentIndex * 3 + 1] = no[2]\n normals[currentIndex * 3 + 2] = -no[1]\n } else {\n computeNormals = true\n }\n\n if (uv) {\n const uv1 = uv[index].uv\n uvs[currentIndex * 2 + 0] = uv1[0]\n uvs[currentIndex * 2 + 1] = uv1[1]\n }\n\n currentIndex++\n }\n\n indexi += 2\n }\n\n if (useGroups) mergeGroupRun(groupRuns, faceStartIndex, currentIndex - faceStartIndex, face.mat_nr || 0)\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 // Emit groups for any multi-slot mesh: even a single run carries the correct slot index, so a mesh\n // whose faces all use e.g. slot 2 renders with material[2] (not material[0]).\n if (useGroups && groupRuns.length)\n for (const g of groupRuns) geometry.addGroup(g.start, g.count, g.mat)\n\n if (computeNormals) {\n geometry.computeVertexNormals()\n }\n\n return geometry\n}\n","import {ClampToEdgeWrapping, DoubleSide, FrontSide, MirroredRepeatWrapping, RepeatWrapping, SRGBColorSpace, Texture} from 'threepipe'\nimport {Ctx} from './ctx'\n\n// Material.blend_flag bit for the \"Backface Culling\" toggle (DNA_material_types.h: MA_BL_CULL_BACKFACE).\n// The Python `use_backface_culling` property binds to this exact bit (rna_material.cc:1136).\nconst MA_BL_CULL_BACKFACE = 1 << 2\n// Material.blend_method: alpha-clip cutout (DNA_material_types.h: MA_BM_CLIP). HASHED(4)/BLEND(5)/SOLID(0)\n// map to alpha blend; only CLIP becomes an alpha test.\nconst MA_BM_CLIP = 3\n\n// Faithful-ish port of Blender's glTF exporter material extraction (Principled BSDF -> glTF PBR),\n// mapped onto three.js MeshPhysicalMaterial (which is glTF-first). Reference:\n// .repos/gltf-blender-io/addons/io_scene_gltf2/blender/exp/material/{pbr_metallic_roughness,materials,search_node_tree}.py\n// We read the shader that feeds the active Material Output, take each property from its named socket\n// (constant default or a packed Image Texture), and apply the same defaults/clamps the exporter uses.\n// Only packed images load (external file-path images are skipped). Linear vs sRGB matches glTF convention:\n// base color + emissive factors are linear (Blender scene-linear == three.js linear); base/emissive\n// textures are sRGB, all other maps (roughness/metallic/normal) are linear.\n\n// ── Node-tree helpers ───────────────────────────────────────────────\nfunction listBaseToArray(lb: any): any[] {\n const out: any[] = []\n if (!lb) return out\n let n = lb.first, guard = 0\n while (n && guard++ < 8192) { out.push(n); n = n.next }\n return out\n}\nconst idnameOf = (n: any): string => (n && typeof n.idname === 'string' ? n.idname : '')\nconst nameOf = (s: any): string => (s && typeof s.name === 'string' ? s.name : '')\n\nfunction socketByName(sockets: any[], ...names: string[]): any {\n for (const name of names) {\n const s = sockets.find(x => nameOf(x) === name)\n if (s) return s\n }\n return null\n}\nfunction inputsOf(node: any): any[] { return node ? listBaseToArray(node.inputs) : [] }\n\n// A socket's constant value (bNodeSocketValueRGBA/Float/Vector expose default_value.value).\nfunction socketConst(sock: any): any {\n const dv = sock && sock.default_value\n return dv ? dv.value : undefined\n}\nconst num = (v: any): number | undefined => (typeof v === 'number' ? v : undefined)\nconst clamp01 = (c: number) => Math.max(0, Math.min(1, c))\n\n// Follow the link into `socket`, hopping through Reroute nodes, and return the source node.\nfunction nodeFeeding(links: any[], socket: any): any {\n if (!socket) return null\n let link = links.find(l => l.tosock === socket)\n let guard = 0\n while (link && idnameOf(link.fromnode).includes('Reroute') && guard++ < 32) {\n const re = inputsOf(link.fromnode)[0]\n link = links.find(l => l.tosock === re)\n }\n return link ? link.fromnode : null\n}\n\n// ── Packed image -> three.js Texture ────────────────────────────────\nfunction imageMime(b: Uint8Array): string | null {\n if (b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47) return 'image/png'\n if (b[0] === 0xff && b[1] === 0xd8 && b[2] === 0xff) return 'image/jpeg'\n if (b[0] === 0x42 && b[1] === 0x4d) return 'image/bmp'\n if (b[0] === 0x52 && b[1] === 0x49 && b[2] === 0x46 && b[3] === 0x46 && b[8] === 0x57 && b[9] === 0x45) return 'image/webp'\n return null\n}\n// Load the packed image of an Image Texture node. `srgb` for color maps (base/emissive); false for data maps.\nfunction packedTexture(imageNode: any, srgb: boolean): Texture | null {\n const img = imageNode && imageNode.id\n if (!img) return null\n const pf = img.packedfile || (img.packedfiles && img.packedfiles.first && img.packedfiles.first.packedfile)\n const block = pf && pf.data\n const size = pf && typeof pf.size === 'number' ? pf.size : 0\n if (!block || block.__data_address__ === undefined || size <= 0) return null\n // Bounds-check before constructing the view: a stale/corrupt PackedFile.size or address would otherwise\n // make `new Uint8Array(buffer, offset, size)` throw a RangeError that bubbles up and fails the whole\n // import. Skip the one bad texture instead.\n const buf = block.__blender_file__.byte.buffer\n if (block.__data_address__ + size > buf.byteLength) return null\n const bytes = new Uint8Array(buf, block.__data_address__, size).slice()\n const mime = imageMime(bytes)\n if (!mime || typeof Blob === 'undefined' || typeof URL === 'undefined' || typeof Image === 'undefined') return null\n const url = URL.createObjectURL(new Blob([bytes], {type: mime}))\n const el = new Image()\n const texture = new Texture(el)\n if (srgb) texture.colorSpace = SRGBColorSpace\n texture.name = (typeof img.aname === 'string' ? img.aname : '') || 'blendTexture'\n el.onload = () => { texture.needsUpdate = true; URL.revokeObjectURL(url) }\n el.onerror = () => { URL.revokeObjectURL(url) }\n el.src = url\n return texture\n}\n// Image source enum (DNA_image_types.h): GENERATED = 4, VIEWER = 5 have no backing file.\nconst IMA_SRC_GENERATED = 4, IMA_SRC_VIEWER = 5\n// Resolve an Image Texture node's image to a Texture: packed bytes if embedded, else an external file\n// load through threepipe's pipeline (ctx.loadExternalTexture, when provided). External images reference a\n// file by path in `Image.name` (e.g. \"//tex/wood.png\"). `source` is usually IMA_SRC_FILE (1), but some\n// files store 0 for a file reference that wasn't loaded at save time — so treat any non-packed image with\n// a path as external, excluding only GENERATED/VIEWER (which have no real file).\n// Map the Image Texture node's \"Extension\" (NodeTexImage.extension) to a three.js wrap mode. Blender's\n// DEFAULT is Repeat (0) — three.js defaults to ClampToEdge, so without this any mesh whose UVs fall outside\n// [0,1] (very common: tiled materials, the Poly Haven preview sphere whose unwrap spans U[-0.5,1.5]) clamps\n// to the edge texel and smears it into stripes instead of tiling. SHD_IMAGE_EXTENSION_*: 0 Repeat, 1 Extend,\n// 2 Clip, 3 Mirror.\nfunction applyWrap(tex: Texture | null, imageNode: any): Texture | null {\n if (!tex) return tex\n const ext = imageNode?.storage?.extension\n tex.wrapS = tex.wrapT = ext === 1 || ext === 2 ? ClampToEdgeWrapping : ext === 3 ? MirroredRepeatWrapping : RepeatWrapping\n tex.needsUpdate = true\n return tex\n}\nfunction imageNodeTexture(imageNode: any, srgb: boolean, ctx: Ctx): Texture | null {\n const packed = packedTexture(imageNode, srgb)\n if (packed) return applyWrap(packed, imageNode)\n const img = imageNode && imageNode.id\n if (img && img.source !== IMA_SRC_GENERATED && img.source !== IMA_SRC_VIEWER\n && typeof img.name === 'string' && img.name && ctx.loadExternalTexture) {\n return applyWrap(ctx.loadExternalTexture(img.name, srgb), imageNode)\n }\n return null\n}\n// The Image Texture node feeding a socket (directly, or through a Normal Map node for normals), or null.\nfunction imageNodeFeeding(links: any[], socket: any): any {\n let src = nodeFeeding(links, socket)\n if (src && idnameOf(src).includes('NormalMap')) src = nodeFeeding(links, socketByName(inputsOf(src), 'Color'))\n return src && idnameOf(src).includes('TexImage') ? src : null\n}\n// Trace a socket to its Image Texture node and load it.\nfunction textureFromSocket(links: any[], socket: any, srgb: boolean, ctx: Ctx): Texture | null {\n const src = imageNodeFeeding(links, socket)\n return src ? imageNodeTexture(src, srgb, ctx) : null\n}\n\n// ── Surface shader resolution ───────────────────────────────────────\n// Prefer the Principled BSDF feeding the active Material Output (matches the exporter's\n// check_if_is_linked_to_active_output); fall back to any Principled in the tree.\nfunction resolveShaders(nodes: any[], links: any[]): {principled: any, emission: any} {\n const outputs = nodes.filter(n => idnameOf(n).includes('OutputMaterial'))\n const activeOut = outputs.find(n => n.is_active_output) || outputs[0]\n let principled: any = null, emission: any = null\n if (activeOut) {\n let surf = nodeFeeding(links, socketByName(inputsOf(activeOut), 'Surface'))\n // hop through a single Mix/Add Shader to find a Principled, best-effort\n let guard = 0\n while (surf && !idnameOf(surf).includes('BsdfPrincipled') && guard++ < 4) {\n if (idnameOf(surf).includes('Emission') && !emission) emission = surf\n const next = inputsOf(surf).map(s => nodeFeeding(links, s)).find(n => n && idnameOf(n).includes('BsdfPrincipled'))\n if (!next) break\n surf = next\n }\n if (surf && idnameOf(surf).includes('BsdfPrincipled')) principled = surf\n }\n if (!principled) principled = nodes.find(n => idnameOf(n).includes('BsdfPrincipled'))\n if (!emission) emission = nodes.find(n => idnameOf(n) === 'ShaderNodeEmission')\n return {principled, emission}\n}\n\n/**\n * Build a PhysicalMaterial from a Blender material, following Blender's glTF exporter mapping.\n */\nexport function createMaterial(mat: any, ctx: Ctx) {\n const material = new ctx.MeshPhysicalMaterial()\n\n // Blender materials default to backface culling OFF, i.e. they render double-sided. The glTF exporter\n // maps this directly: doubleSided = not use_backface_culling (materials.py:289). three.js defaults to\n // FrontSide, so without this most thin/open geometry (planes, leaves, interiors) is invisible from\n // behind. Only the explicit \"Backface Culling\" toggle (MA_BL_CULL_BACKFACE) forces single-sided.\n material.side = (typeof mat.blend_flag === 'number' && (mat.blend_flag & MA_BL_CULL_BACKFACE)) ? FrontSide : DoubleSide\n\n const nodes = mat.nodetree ? listBaseToArray(mat.nodetree.nodes) : []\n const links = mat.nodetree ? listBaseToArray(mat.nodetree.links) : []\n const {principled, emission} = resolveShaders(nodes, links)\n\n let applied = false\n if (principled) {\n const inp = inputsOf(principled)\n applied = true\n\n // Base color: texture takes precedence; factor (clamped) otherwise. (pbr_metallic_roughness.py:73)\n const baseSock = socketByName(inp, 'Base Color', 'BaseColor')\n const baseImgNode = imageNodeFeeding(links, baseSock)\n const baseTex = baseImgNode ? imageNodeTexture(baseImgNode, true, ctx) : null\n if (baseTex) {\n material.map = baseTex\n material.color.setRGB(1, 1, 1)\n } else {\n const base = socketConst(baseSock)\n if (base && base.length >= 3) material.color.setRGB(clamp01(base[0]), clamp01(base[1]), clamp01(base[2]))\n }\n\n // Roughness / Metallic (factor or grayscale map; three.js reads G/B but greyscale maps work).\n const roughSock = socketByName(inp, 'Roughness')\n const roughTex = textureFromSocket(links, roughSock, false, ctx)\n if (roughTex) material.roughnessMap = roughTex\n else { const r = num(socketConst(roughSock)); if (r !== undefined) material.roughness = r }\n const metalSock = socketByName(inp, 'Metallic')\n const metalTex = textureFromSocket(links, metalSock, false, ctx)\n // three.js multiplies the map by the factor (default 0), so use 1 like the white base color above.\n if (metalTex) { material.metalnessMap = metalTex; material.metalness = 1 }\n else { const m = num(socketConst(metalSock)); if (m !== undefined) material.metalness = m }\n\n // Normal map + strength (materials.py:376; Normal Map node \"Strength\").\n const normSrc = nodeFeeding(links, socketByName(inp, 'Normal'))\n if (normSrc) {\n const normTex = textureFromSocket(links, socketByName(inp, 'Normal'), false, ctx)\n if (normTex) {\n material.normalMap = normTex\n const strength = num(socketConst(socketByName(inputsOf(normSrc), 'Strength')))\n if (strength !== undefined && material.normalScale) material.normalScale.set(strength, strength)\n }\n }\n\n // Alpha -> opacity (constant) or alphaMap (texture), plus the alpha *mode* from the material's\n // Eevee blend_method. Only applied when the material actually has an alpha input, so opaque\n // materials are never made see-through (notably the default material, which reports HASHED but\n // is fully opaque at alpha=1). Mode mapping is the canonical glTF one: CLIP -> alpha test\n // (cutout, using alpha_threshold); HASHED/BLEND/SOLID -> alpha blend. The 4.2+ glTF exporter\n // derives this from the node graph, but blend_method is the authoritative stored value for <=4.1\n // and a usable hint after (gather_alpha_info — search_node_tree.py).\n const alphaSock = socketByName(inp, 'Alpha')\n const alphaImgNode = imageNodeFeeding(links, alphaSock)\n // If Alpha comes from the SAME image as Base Color (the common cutout setup: Image.Color -> Base\n // Color, Image.Alpha -> Alpha), three.js material.map (RGBA) already supplies per-pixel opacity from\n // the texture's alpha channel. A separate material.alphaMap would instead read the GREEN channel\n // (three.js samples alphaMap.g), giving wrong cutouts — so only use a distinct alphaMap when the\n // alpha image differs from the base image.\n const alphaFromBase = !!(alphaImgNode && baseImgNode && alphaImgNode === baseImgNode)\n const alphaTex = (alphaImgNode && !alphaFromBase) ? imageNodeTexture(alphaImgNode, false, ctx) : null\n const alphaC = num(socketConst(alphaSock))\n const hasAlpha = !!alphaTex || alphaFromBase || (alphaC !== undefined && alphaC < 1.0)\n if (alphaTex) material.alphaMap = alphaTex\n else if (!alphaFromBase && alphaC !== undefined && alphaC < 1.0) material.opacity = alphaC\n if (hasAlpha) {\n if (mat.blend_method === MA_BM_CLIP) {\n const thr = num(mat.alpha_threshold)\n material.alphaTest = thr !== undefined && thr > 0 ? thr : 0.5\n } else material.transparent = true\n }\n\n // IOR (extensions/ior.py — default 1.5).\n const ior = num(socketConst(socketByName(inp, 'IOR')))\n if (ior !== undefined && (material as any).ior !== undefined) (material as any).ior = ior\n\n // Transmission (extensions/transmission.py — \"Transmission Weight\"/\"Transmission\").\n const trans = num(socketConst(socketByName(inp, 'Transmission Weight', 'Transmission')))\n if (trans !== undefined && trans > 0 && (material as any).transmission !== undefined) {\n (material as any).transmission = trans\n }\n\n // Clearcoat / Coat (extensions/clearcoat.py — \"Coat Weight\"/\"Clearcoat\", roughness default 0.03).\n const coat = num(socketConst(socketByName(inp, 'Coat Weight', 'Clearcoat')))\n if (coat !== undefined && coat > 0 && (material as any).clearcoat !== undefined) {\n (material as any).clearcoat = coat\n const cr = num(socketConst(socketByName(inp, 'Coat Roughness', 'Clearcoat Roughness')))\n if (cr !== undefined) (material as any).clearcoatRoughness = cr\n }\n\n // Sheen (extensions/sheen.py — \"Sheen Weight\"/\"Sheen\" gates; color + roughness).\n const sheen = num(socketConst(socketByName(inp, 'Sheen Weight', 'Sheen')))\n if (sheen !== undefined && sheen > 0 && (material as any).sheen !== undefined) {\n (material as any).sheen = sheen\n const stint = socketConst(socketByName(inp, 'Sheen Tint'))\n if (stint && stint.length >= 3 && (material as any).sheenColor) (material as any).sheenColor.setRGB(stint[0], stint[1], stint[2])\n const sr = num(socketConst(socketByName(inp, 'Sheen Roughness')))\n if (sr !== undefined) (material as any).sheenRoughness = sr\n }\n\n // Specular IOR Level -> specularIntensity (extensions/specular.py — factor is ×2, three.js range 0..1).\n const spec = num(socketConst(socketByName(inp, 'Specular IOR Level', 'Specular')))\n if (spec !== undefined && (material as any).specularIntensity !== undefined) {\n (material as any).specularIntensity = Math.min(1, spec * 2)\n }\n }\n\n // Displacement: Material Output \"Displacement\" <- Displacement node <- Height image. three.js\n // `displacementMap` moves vertices along the normal (needs tessellated geometry); we also drive\n // `bumpMap` from the same height so the relief is visible on coarse meshes, but only when there is no\n // normal map (bump + normal would double-perturb). Scale comes from the Displacement node, clamped.\n const matOutput = nodes.find(n => idnameOf(n).includes('OutputMaterial') && n.is_active_output)\n || nodes.find(n => idnameOf(n).includes('OutputMaterial'))\n const dispNode = matOutput ? nodeFeeding(links, socketByName(inputsOf(matOutput), 'Displacement')) : null\n if (dispNode && idnameOf(dispNode).includes('Displacement')) {\n const heightTex = textureFromSocket(links, socketByName(inputsOf(dispNode), 'Height'), false, ctx)\n if (heightTex) {\n const scale = num(socketConst(socketByName(inputsOf(dispNode), 'Scale')))\n const s = scale !== undefined && scale > 0 ? scale : 1\n const mid = num(socketConst(socketByName(inputsOf(dispNode), 'Midlevel')))\n if ((material as any).displacementMap !== undefined) {\n (material as any).displacementMap = heightTex\n ;(material as any).displacementScale = s\n ;(material as any).displacementBias = -(mid ?? 0.5) * s\n }\n // Bump fallback for un-tessellated meshes — only when the material has no normal map.\n if (!material.normalMap && (material as any).bumpMap !== undefined) {\n (material as any).bumpMap = heightTex\n ;(material as any).bumpScale = s\n }\n }\n }\n\n // Emission: dedicated Emission node \"Color\"/\"Strength\", else Principled \"Emission Color\"/\"Emission\".\n const emSock = emission ? socketByName(inputsOf(emission), 'Color')\n : (principled ? socketByName(inputsOf(principled), 'Emission Color', 'Emission') : null)\n const emStrSock = emission ? socketByName(inputsOf(emission), 'Strength')\n : (principled ? socketByName(inputsOf(principled), 'Emission Strength') : null)\n const emTex = textureFromSocket(links, emSock, true, ctx)\n if (emTex) material.emissiveMap = emTex\n let emCol = socketConst(emSock)\n // When a texture drives emission, the Emission Color factor multiplies it. Blender's default factor is\n // black [0,0,0] (and stays black even with a texture linked), which would zero out the map — so treat a\n // missing/short/all-black factor as white so the emissive map is actually visible.\n if (emTex && (!emCol || emCol.length < 3 || (!emCol[0] && !emCol[1] && !emCol[2]))) emCol = [1, 1, 1]\n if (emCol && emCol.length >= 3 && (emCol[0] || emCol[1] || emCol[2] || emTex)) {\n const f = [emCol[0], emCol[1], emCol[2]]\n const strength = num(socketConst(emStrSock))\n if (typeof strength === 'number') for (let i = 0; i < 3; i++) f[i] *= strength\n // Split intensity from color like the exporter (materials.py:149): keep color <=1, push the rest into intensity.\n const peak = Math.max(f[0], f[1], f[2])\n if (peak > 1) { material.emissiveIntensity = peak; material.emissive.setRGB(f[0] / peak, f[1] / peak, f[2] / peak) }\n else material.emissive.setRGB(f[0], f[1], f[2])\n }\n\n if (!applied) {\n // Legacy fallback — Blender material's viewport diffuse color (often just 0.8 grey).\n if (mat.r !== undefined) 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 }\n\n return material\n}\n","import {DoubleSide} from 'threepipe'\nimport {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 let geometry = loaded.get(object.data)\n if (!geometry) {\n geometry = createBufferGeometry(object.data, ctx)\n // Modifiers (subdivision surface, mirror, array, solidify) are evaluated on the `blend-importer-modifiers` branch, not here yet.\n loaded.set(object.data, geometry)\n }\n\n // Material slots: `object.data.mat` is the slot array (length `totcol`); faces reference slots by\n // index. When a mesh uses more than one slot, the geometry builder tags triangles with their slot\n // via `geometry.groups`; we then hand three.js the full material array (indexed by group.materialIndex).\n // Otherwise a single material is used (the common case).\n const matData = object.data.mat\n const slots: any[] = Array.isArray(matData) ? matData : (matData ? [matData] : [])\n\n const buildMaterial = (m: any) => {\n if (!m) { const d = new ctx.MeshPhysicalMaterial(); d.side = DoubleSide; return d } // empty slot -> Blender default\n const cached = loaded.get(m)\n if (cached) return cached\n const created = createMaterial(m, ctx)\n loaded.set(m, created)\n return created\n }\n\n const hasGroups = !!(geometry.groups && geometry.groups.length)\n let material: any\n if (hasGroups) {\n material = slots.map(buildMaterial) // multi-material: array indexed by geometry.groups' materialIndex\n // Defensive: a stale/over-range material_index (corrupt data) would map to an undefined entry and\n // three.js would silently skip those faces (invisible). Pad with a default so they stay visible.\n let maxIdx = 0\n for (const g of geometry.groups) if (g.materialIndex > maxIdx) maxIdx = g.materialIndex\n while (material.length <= maxIdx) material.push(buildMaterial(null))\n } else {\n material = buildMaterial(slots[0])\n }\n\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} from './mesh'\nimport {Euler, EulerOrder, IObject3D, Object3D, Quaternion, Vector3} from 'threepipe'\nimport {Ctx} from './ctx'\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","// Some numerical data is initialized as -1 even when it doesn't need initialization to help the JIT infer types\n// aliases for shorter compressed code (most minifers don't do this)\nvar ab = ArrayBuffer, u8 = Uint8Array, u16 = Uint16Array, i16 = Int16Array, u32 = Uint32Array, i32 = Int32Array;\nvar slc = function (v, s, e) {\n if (u8.prototype.slice)\n return u8.prototype.slice.call(v, s, e);\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n var n = new u8(e - s);\n n.set(v.subarray(s, e));\n return n;\n};\nvar fill = function (v, n, s, e) {\n if (u8.prototype.fill)\n return u8.prototype.fill.call(v, n, s, e);\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n for (; s < e; ++s)\n v[s] = n;\n return v;\n};\nvar cpw = function (v, t, s, e) {\n if (u8.prototype.copyWithin)\n return u8.prototype.copyWithin.call(v, t, s, e);\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n while (s < e) {\n v[t++] = v[s++];\n }\n};\n/**\n * Codes for errors generated within this library\n */\nexport var ZstdErrorCode = {\n InvalidData: 0,\n WindowSizeTooLarge: 1,\n InvalidBlockType: 2,\n FSEAccuracyTooHigh: 3,\n DistanceTooFarBack: 4,\n UnexpectedEOF: 5\n};\n// error codes\nvar ec = [\n 'invalid zstd data',\n 'window size too large (>2046MB)',\n 'invalid block type',\n 'FSE accuracy too high',\n 'match distance too far back',\n 'unexpected EOF'\n];\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\nvar rb = function (d, b, n) {\n var i = 0, o = 0;\n for (; i < n; ++i)\n o |= d[b++] << (i << 3);\n return o;\n};\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\n// read Zstandard frame header\nvar rzfh = function (dat, w) {\n var n3 = dat[0] | (dat[1] << 8) | (dat[2] << 16);\n if (n3 == 0x2FB528 && dat[3] == 253) {\n // Zstandard\n var flg = dat[4];\n // single segment checksum dict flag frame content flag\n var ss = (flg >> 5) & 1, cc = (flg >> 2) & 1, df = flg & 3, fcf = flg >> 6;\n if (flg & 8)\n err(0);\n // byte\n var bt = 6 - ss;\n // dict bytes\n var db = df == 3 ? 4 : df;\n // dictionary id\n var di = rb(dat, bt, db);\n bt += db;\n // frame size bytes\n var fsb = fcf ? (1 << fcf) : ss;\n // frame source size\n var fss = rb(dat, bt, fsb) + ((fcf == 1) && 256);\n // window size\n var ws = fss;\n if (!ss) {\n // window descriptor\n var wb = 1 << (10 + (dat[5] >> 3));\n ws = wb + (wb >> 3) * (dat[5] & 7);\n }\n if (ws > 2145386496)\n err(1);\n var buf = new u8((w == 1 ? (fss || ws) : w ? 0 : ws) + 12);\n buf[0] = 1, buf[4] = 4, buf[8] = 8;\n return {\n b: bt + fsb,\n y: 0,\n l: 0,\n d: di,\n w: (w && w != 1) ? w : buf.subarray(12),\n e: ws,\n o: new i32(buf.buffer, 0, 3),\n u: fss,\n c: cc,\n m: Math.min(131072, ws)\n };\n }\n else if (((n3 >> 4) | (dat[3] << 20)) == 0x184D2A5) {\n // skippable\n return b4(dat, 4) + 8;\n }\n err(0);\n};\n// most significant bit for nonzero\nvar msb = function (val) {\n var bits = 0;\n for (; (1 << bits) <= val; ++bits)\n ;\n return bits - 1;\n};\n// read finite state entropy\nvar rfse = function (dat, bt, mal) {\n // table pos\n var tpos = (bt << 3) + 4;\n // accuracy log\n var al = (dat[bt] & 15) + 5;\n if (al > mal)\n err(3);\n // size\n var sz = 1 << al;\n // probabilities symbols repeat index high threshold\n var probs = sz, sym = -1, re = -1, i = -1, ht = sz;\n // optimization: single allocation is much faster\n var buf = new ab(512 + (sz << 2));\n var freq = new i16(buf, 0, 256);\n // same view as freq\n var dstate = new u16(buf, 0, 256);\n var nstate = new u16(buf, 512, sz);\n var bb1 = 512 + (sz << 1);\n var syms = new u8(buf, bb1, sz);\n var nbits = new u8(buf, bb1 + sz);\n while (sym < 255 && probs > 0) {\n var bits = msb(probs + 1);\n var cbt = tpos >> 3;\n // mask\n var msk = (1 << (bits + 1)) - 1;\n var val = ((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (tpos & 7)) & msk;\n // mask (1 fewer bit)\n var msk1fb = (1 << bits) - 1;\n // max small value\n var msv = msk - probs - 1;\n // small value\n var sval = val & msk1fb;\n if (sval < msv)\n tpos += bits, val = sval;\n else {\n tpos += bits + 1;\n if (val > msk1fb)\n val -= msv;\n }\n freq[++sym] = --val;\n if (val == -1) {\n probs += val;\n syms[--ht] = sym;\n }\n else\n probs -= val;\n if (!val) {\n do {\n // repeat byte\n var rbt = tpos >> 3;\n re = ((dat[rbt] | (dat[rbt + 1] << 8)) >> (tpos & 7)) & 3;\n tpos += 2;\n sym += re;\n } while (re == 3);\n }\n }\n if (sym > 255 || probs)\n err(0);\n var sympos = 0;\n // sym step (coprime with sz - formula from zstd source)\n var sstep = (sz >> 1) + (sz >> 3) + 3;\n // sym mask\n var smask = sz - 1;\n for (var s = 0; s <= sym; ++s) {\n var sf = freq[s];\n if (sf < 1) {\n dstate[s] = -sf;\n continue;\n }\n // This is split into two loops in zstd to avoid branching, but as JS is higher-level that is unnecessary\n for (i = 0; i < sf; ++i) {\n syms[sympos] = s;\n do {\n sympos = (sympos + sstep) & smask;\n } while (sympos >= ht);\n }\n }\n // After spreading symbols, should be zero again\n if (sympos)\n err(0);\n for (i = 0; i < sz; ++i) {\n // next state\n var ns = dstate[syms[i]]++;\n // num bits\n var nb = nbits[i] = al - msb(ns);\n nstate[i] = (ns << nb) - sz;\n }\n return [(tpos + 7) >> 3, {\n b: al,\n s: syms,\n n: nbits,\n t: nstate\n }];\n};\n// read huffman\nvar rhu = function (dat, bt) {\n // index weight count\n var i = 0, wc = -1;\n // buffer header byte\n var buf = new u8(292), hb = dat[bt];\n // huffman weights\n var hw = buf.subarray(0, 256);\n // rank count\n var rc = buf.subarray(256, 268);\n // rank index\n var ri = new u16(buf.buffer, 268);\n // NOTE: at this point bt is 1 less than expected\n if (hb < 128) {\n // end byte, fse decode table\n var _a = rfse(dat, bt + 1, 6), ebt = _a[0], fdt = _a[1];\n bt += hb;\n var epos = ebt << 3;\n // last byte\n var lb = dat[bt];\n if (!lb)\n err(0);\n // state1 state2 state1 bits state2 bits\n var st1 = 0, st2 = 0, btr1 = fdt.b, btr2 = btr1;\n // fse pos\n // pre-increment to account for original deficit of 1\n var fpos = (++bt << 3) - 8 + msb(lb);\n for (;;) {\n fpos -= btr1;\n if (fpos < epos)\n break;\n var cbt = fpos >> 3;\n st1 += ((dat[cbt] | (dat[cbt + 1] << 8)) >> (fpos & 7)) & ((1 << btr1) - 1);\n hw[++wc] = fdt.s[st1];\n fpos -= btr2;\n if (fpos < epos)\n break;\n cbt = fpos >> 3;\n st2 += ((dat[cbt] | (dat[cbt + 1] << 8)) >> (fpos & 7)) & ((1 << btr2) - 1);\n hw[++wc] = fdt.s[st2];\n btr1 = fdt.n[st1];\n st1 = fdt.t[st1];\n btr2 = fdt.n[st2];\n st2 = fdt.t[st2];\n }\n if (++wc > 255)\n err(0);\n }\n else {\n wc = hb - 127;\n for (; i < wc; i += 2) {\n var byte = dat[++bt];\n hw[i] = byte >> 4;\n hw[i + 1] = byte & 15;\n }\n ++bt;\n }\n // weight exponential sum\n var wes = 0;\n for (i = 0; i < wc; ++i) {\n var wt = hw[i];\n // bits must be at most 11, same as weight\n if (wt > 11)\n err(0);\n wes += wt && (1 << (wt - 1));\n }\n // max bits\n var mb = msb(wes) + 1;\n // table size\n var ts = 1 << mb;\n // remaining sum\n var rem = ts - wes;\n // must be power of 2\n if (rem & (rem - 1))\n err(0);\n hw[wc++] = msb(rem) + 1;\n for (i = 0; i < wc; ++i) {\n var wt = hw[i];\n ++rc[hw[i] = wt && (mb + 1 - wt)];\n }\n // huf buf\n var hbuf = new u8(ts << 1);\n // symbols num bits\n var syms = hbuf.subarray(0, ts), nb = hbuf.subarray(ts);\n ri[mb] = 0;\n for (i = mb; i > 0; --i) {\n var pv = ri[i];\n fill(nb, i, pv, ri[i - 1] = pv + rc[i] * (1 << (mb - i)));\n }\n if (ri[0] != ts)\n err(0);\n for (i = 0; i < wc; ++i) {\n var bits = hw[i];\n if (bits) {\n var code = ri[bits];\n fill(syms, i, code, ri[bits] = code + (1 << (mb - bits)));\n }\n }\n return [bt, {\n n: nb,\n b: mb,\n s: syms\n }];\n};\n// Tables generated using this:\n// https://gist.github.com/101arrowz/a979452d4355992cbf8f257cbffc9edd\n// default literal length table\nvar dllt = /*#__PURE__*/ rfse(/*#__PURE__*/ new u8([\n 81, 16, 99, 140, 49, 198, 24, 99, 12, 33, 196, 24, 99, 102, 102, 134, 70, 146, 4\n]), 0, 6)[1];\n// default match length table\nvar dmlt = /*#__PURE__*/ rfse(/*#__PURE__*/ new u8([\n 33, 20, 196, 24, 99, 140, 33, 132, 16, 66, 8, 33, 132, 16, 66, 8, 33, 68, 68, 68, 68, 68, 68, 68, 68, 36, 9\n]), 0, 6)[1];\n// default offset code table\nvar doct = /*#__PURE__ */ rfse(/*#__PURE__*/ new u8([\n 32, 132, 16, 66, 102, 70, 68, 68, 68, 68, 36, 73, 2\n]), 0, 5)[1];\n// bits to baseline\nvar b2bl = function (b, s) {\n var len = b.length, bl = new i32(len);\n for (var i = 0; i < len; ++i) {\n bl[i] = s;\n s += 1 << b[i];\n }\n return bl;\n};\n// literal length bits\nvar llb = /*#__PURE__ */ new u8(( /*#__PURE__ */new i32([\n 0, 0, 0, 0, 16843009, 50528770, 134678020, 202050057, 269422093\n])).buffer, 0, 36);\n// literal length baseline\nvar llbl = /*#__PURE__ */ b2bl(llb, 0);\n// match length bits\nvar mlb = /*#__PURE__ */ new u8(( /*#__PURE__ */new i32([\n 0, 0, 0, 0, 0, 0, 0, 0, 16843009, 50528770, 117769220, 185207048, 252579084, 16\n])).buffer, 0, 53);\n// match length baseline\nvar mlbl = /*#__PURE__ */ b2bl(mlb, 3);\n// decode huffman stream\nvar dhu = function (dat, out, hu) {\n var len = dat.length, ss = out.length, lb = dat[len - 1], msk = (1 << hu.b) - 1, eb = -hu.b;\n if (!lb)\n err(0);\n var st = 0, btr = hu.b, pos = (len << 3) - 8 + msb(lb) - btr, i = -1;\n for (; pos > eb && i < ss;) {\n var cbt = pos >> 3;\n var val = (dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (pos & 7);\n st = ((st << btr) | val) & msk;\n out[++i] = hu.s[st];\n pos -= (btr = hu.n[st]);\n }\n if (pos != eb || i + 1 != ss)\n err(0);\n};\n// decode huffman stream 4x\n// TODO: use workers to parallelize\nvar dhu4 = function (dat, out, hu) {\n var bt = 6;\n var ss = out.length, sz1 = (ss + 3) >> 2, sz2 = sz1 << 1, sz3 = sz1 + sz2;\n dhu(dat.subarray(bt, bt += dat[0] | (dat[1] << 8)), out.subarray(0, sz1), hu);\n dhu(dat.subarray(bt, bt += dat[2] | (dat[3] << 8)), out.subarray(sz1, sz2), hu);\n dhu(dat.subarray(bt, bt += dat[4] | (dat[5] << 8)), out.subarray(sz2, sz3), hu);\n dhu(dat.subarray(bt), out.subarray(sz3), hu);\n};\n// read Zstandard block\nvar rzb = function (dat, st, out) {\n var _a;\n var bt = st.b;\n // byte 0 block type\n var b0 = dat[bt], btype = (b0 >> 1) & 3;\n st.l = b0 & 1;\n var sz = (b0 >> 3) | (dat[bt + 1] << 5) | (dat[bt + 2] << 13);\n // end byte for block\n var ebt = (bt += 3) + sz;\n if (btype == 1) {\n if (bt >= dat.length)\n return;\n st.b = bt + 1;\n if (out) {\n fill(out, dat[bt], st.y, st.y += sz);\n return out;\n }\n return fill(new u8(sz), dat[bt]);\n }\n if (ebt > dat.length)\n return;\n if (btype == 0) {\n st.b = ebt;\n if (out) {\n out.set(dat.subarray(bt, ebt), st.y);\n st.y += sz;\n return out;\n }\n return slc(dat, bt, ebt);\n }\n if (btype == 2) {\n // byte 3 lit btype size format\n var b3 = dat[bt], lbt = b3 & 3, sf = (b3 >> 2) & 3;\n // lit src size lit cmp sz 4 streams\n var lss = b3 >> 4, lcs = 0, s4 = 0;\n if (lbt < 2) {\n if (sf & 1)\n lss |= (dat[++bt] << 4) | ((sf & 2) && (dat[++bt] << 12));\n else\n lss = b3 >> 3;\n }\n else {\n s4 = sf;\n if (sf < 2)\n lss |= ((dat[++bt] & 63) << 4), lcs = (dat[bt] >> 6) | (dat[++bt] << 2);\n else if (sf == 2)\n lss |= (dat[++bt] << 4) | ((dat[++bt] & 3) << 12), lcs = (dat[bt] >> 2) | (dat[++bt] << 6);\n else\n lss |= (dat[++bt] << 4) | ((dat[++bt] & 63) << 12), lcs = (dat[bt] >> 6) | (dat[++bt] << 2) | (dat[++bt] << 10);\n }\n ++bt;\n // add literals to end - can never overlap with backreferences because unused literals always appended\n var buf = out ? out.subarray(st.y, st.y + st.m) : new u8(st.m);\n // starting point for literals\n var spl = buf.length - lss;\n if (lbt == 0)\n buf.set(dat.subarray(bt, bt += lss), spl);\n else if (lbt == 1)\n fill(buf, dat[bt++], spl);\n else {\n // huffman table\n var hu = st.h;\n if (lbt == 2) {\n var hud = rhu(dat, bt);\n // subtract description length\n lcs += bt - (bt = hud[0]);\n st.h = hu = hud[1];\n }\n else if (!hu)\n err(0);\n (s4 ? dhu4 : dhu)(dat.subarray(bt, bt += lcs), buf.subarray(spl), hu);\n }\n // num sequences\n var ns = dat[bt++];\n if (ns) {\n if (ns == 255)\n ns = (dat[bt++] | (dat[bt++] << 8)) + 0x7F00;\n else if (ns > 127)\n ns = ((ns - 128) << 8) | dat[bt++];\n // symbol compression modes\n var scm = dat[bt++];\n if (scm & 3)\n err(0);\n var dts = [dmlt, doct, dllt];\n for (var i = 2; i > -1; --i) {\n var md = (scm >> ((i << 1) + 2)) & 3;\n if (md == 1) {\n // rle buf\n var rbuf = new u8([0, 0, dat[bt++]]);\n dts[i] = {\n s: rbuf.subarray(2, 3),\n n: rbuf.subarray(0, 1),\n t: new u16(rbuf.buffer, 0, 1),\n b: 0\n };\n }\n else if (md == 2) {\n // accuracy log 8 for offsets, 9 for others\n _a = rfse(dat, bt, 9 - (i & 1)), bt = _a[0], dts[i] = _a[1];\n }\n else if (md == 3) {\n if (!st.t)\n err(0);\n dts[i] = st.t[i];\n }\n }\n var _b = st.t = dts, mlt = _b[0], oct = _b[1], llt = _b[2];\n var lb = dat[ebt - 1];\n if (!lb)\n err(0);\n var spos = (ebt << 3) - 8 + msb(lb) - llt.b, cbt = spos >> 3, oubt = 0;\n var lst = ((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << llt.b) - 1);\n cbt = (spos -= oct.b) >> 3;\n var ost = ((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << oct.b) - 1);\n cbt = (spos -= mlt.b) >> 3;\n var mst = ((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << mlt.b) - 1);\n for (++ns; --ns;) {\n var llc = llt.s[lst];\n var lbtr = llt.n[lst];\n var mlc = mlt.s[mst];\n var mbtr = mlt.n[mst];\n var ofc = oct.s[ost];\n var obtr = oct.n[ost];\n cbt = (spos -= ofc) >> 3;\n var ofp = 1 << ofc;\n var off = ofp + (((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16) | (dat[cbt + 3] << 24)) >>> (spos & 7)) & (ofp - 1));\n cbt = (spos -= mlb[mlc]) >> 3;\n var ml = mlbl[mlc] + (((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (spos & 7)) & ((1 << mlb[mlc]) - 1));\n cbt = (spos -= llb[llc]) >> 3;\n var ll = llbl[llc] + (((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (spos & 7)) & ((1 << llb[llc]) - 1));\n cbt = (spos -= lbtr) >> 3;\n lst = llt.t[lst] + (((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << lbtr) - 1));\n cbt = (spos -= mbtr) >> 3;\n mst = mlt.t[mst] + (((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << mbtr) - 1));\n cbt = (spos -= obtr) >> 3;\n ost = oct.t[ost] + (((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << obtr) - 1));\n if (off > 3) {\n st.o[2] = st.o[1];\n st.o[1] = st.o[0];\n st.o[0] = off -= 3;\n }\n else {\n var idx = off - (ll != 0);\n if (idx) {\n off = idx == 3 ? st.o[0] - 1 : st.o[idx];\n if (idx > 1)\n st.o[2] = st.o[1];\n st.o[1] = st.o[0];\n st.o[0] = off;\n }\n else\n off = st.o[0];\n }\n for (var i = 0; i < ll; ++i) {\n buf[oubt + i] = buf[spl + i];\n }\n oubt += ll, spl += ll;\n var stin = oubt - off;\n if (stin < 0) {\n var len = -stin;\n var bs = st.e + stin;\n if (len > ml)\n len = ml;\n for (var i = 0; i < len; ++i) {\n buf[oubt + i] = st.w[bs + i];\n }\n oubt += len, ml -= len, stin = 0;\n }\n for (var i = 0; i < ml; ++i) {\n buf[oubt + i] = buf[stin + i];\n }\n oubt += ml;\n }\n if (oubt != spl) {\n while (spl < buf.length) {\n buf[oubt++] = buf[spl++];\n }\n }\n else\n oubt = buf.length;\n if (out)\n st.y += oubt;\n else\n buf = slc(buf, 0, oubt);\n }\n else if (out) {\n st.y += lss;\n if (spl) {\n for (var i = 0; i < lss; ++i) {\n buf[i] = buf[spl + i];\n }\n }\n }\n else if (spl)\n buf = slc(buf, spl);\n st.b = ebt;\n return buf;\n }\n err(2);\n};\n// concat\nvar cct = function (bufs, ol) {\n if (bufs.length == 1)\n return bufs[0];\n var buf = new u8(ol);\n for (var i = 0, b = 0; i < bufs.length; ++i) {\n var chk = bufs[i];\n buf.set(chk, b);\n b += chk.length;\n }\n return buf;\n};\n/**\n * Decompresses Zstandard data\n * @param dat The input data\n * @param buf The output buffer. If unspecified, the function will allocate\n * exactly enough memory to fit the decompressed data. If your\n * data has multiple frames and you know the output size, specifying\n * it will yield better performance.\n * @returns The decompressed data\n */\nexport function decompress(dat, buf) {\n var bufs = [], nb = +!buf;\n var bt = 0, ol = 0;\n for (; dat.length;) {\n var st = rzfh(dat, nb || buf);\n if (typeof st == 'object') {\n if (nb) {\n buf = null;\n if (st.w.length == st.u) {\n bufs.push(buf = st.w);\n ol += st.u;\n }\n }\n else {\n bufs.push(buf);\n st.e = 0;\n }\n for (; !st.l;) {\n var blk = rzb(dat, st, buf);\n if (!blk)\n err(5);\n if (buf)\n st.e = st.y;\n else {\n bufs.push(blk);\n ol += blk.length;\n cpw(st.w, 0, blk.length);\n st.w.set(blk, st.w.length - blk.length);\n }\n }\n bt = st.b + (st.c * 4);\n }\n else\n bt = st;\n dat = dat.subarray(bt);\n }\n return cct(bufs, ol);\n}\n/**\n * Decompressor for Zstandard streamed data\n */\nvar Decompress = /*#__PURE__*/ (function () {\n /**\n * Creates a Zstandard decompressor\n * @param ondata The handler for stream data\n */\n function Decompress(ondata) {\n this.ondata = ondata;\n this.c = [];\n this.l = 0;\n this.z = 0;\n }\n /**\n * Pushes data to be decompressed\n * @param chunk The chunk of data to push\n * @param final Whether or not this is the last chunk in the stream\n */\n Decompress.prototype.push = function (chunk, final) {\n if (typeof this.s == 'number') {\n var sub = Math.min(chunk.length, this.s);\n chunk = chunk.subarray(sub);\n this.s -= sub;\n }\n var sl = chunk.length;\n var ncs = sl + this.l;\n if (!this.s) {\n if (final) {\n if (!ncs) {\n this.ondata(new u8(0), true);\n return;\n }\n // min for frame + one block\n if (ncs < 5)\n err(5);\n }\n else if (ncs < 18) {\n this.c.push(chunk);\n this.l = ncs;\n return;\n }\n if (this.l) {\n this.c.push(chunk);\n chunk = cct(this.c, ncs);\n this.c = [];\n this.l = 0;\n }\n if (typeof (this.s = rzfh(chunk)) == 'number')\n return this.push(chunk, final);\n }\n if (typeof this.s != 'number') {\n if (ncs < (this.z || 3)) {\n if (final)\n err(5);\n this.c.push(chunk);\n this.l = ncs;\n return;\n }\n if (this.l) {\n this.c.push(chunk);\n chunk = cct(this.c, ncs);\n this.c = [];\n this.l = 0;\n }\n if (!this.z && ncs < (this.z = (chunk[this.s.b] & 2) ? 4 : 3 + ((chunk[this.s.b] >> 3) | (chunk[this.s.b + 1] << 5) | (chunk[this.s.b + 2] << 13)))) {\n if (final)\n err(5);\n this.c.push(chunk);\n this.l = ncs;\n return;\n }\n else\n this.z = 0;\n for (;;) {\n var blk = rzb(chunk, this.s);\n if (!blk) {\n if (final)\n err(5);\n var adc = chunk.subarray(this.s.b);\n this.s.b = 0;\n this.c.push(adc), this.l += adc.length;\n return;\n }\n else {\n this.ondata(blk, false);\n cpw(this.s.w, 0, blk.length);\n this.s.w.set(blk, this.s.w.length - blk.length);\n }\n if (this.s.l) {\n var rest = chunk.subarray(this.s.b);\n this.s = this.s.c * 4;\n this.push(rest, final);\n return;\n }\n }\n }\n else if (final)\n err(5);\n };\n return Decompress;\n}());\nexport { Decompress };\n","import {gunzipSync} from 'threepipe'\nimport {decompress as zstdDecompress} from 'fzstd'\n\ntype BlendCompression = 'none' | 'gzip' | 'zstd' | 'unknown'\n\n/**\n * Detect compression of a .blend file by its first 4-7 bytes.\n * Mirrors Blender's own `BLO_file_reader_uncompressed` logic\n * (`source/blender/blenloader_core/intern/blo_core_file_reader.cc`).\n */\nfunction detectBlendCompression(u8: Uint8Array): BlendCompression {\n // gzip needs 3 bytes, zstd 4, BLENDER literal 7 — check each at its own minimum.\n if (u8.length >= 3 && u8[0] === 0x1f && u8[1] === 0x8b && u8[2] === 0x08) return 'gzip'\n if (u8.length >= 4) {\n // zstd frame magic: 28 b5 2f fd (LE 0xFD2FB528)\n if (u8[0] === 0x28 && u8[1] === 0xb5 && u8[2] === 0x2f && u8[3] === 0xfd) return 'zstd'\n // zstd skippable frame magic: 50..5f 2a 4d 18 ((LE u32 >> 4) === 0x184D2A5)\n if ((u8[0] & 0xf0) === 0x50 && u8[1] === 0x2a && u8[2] === 0x4d && u8[3] === 0x18) return 'zstd'\n }\n if (u8.length >= 7 &&\n u8[0] === 0x42 && u8[1] === 0x4c && u8[2] === 0x45 && u8[3] === 0x4e &&\n u8[4] === 0x44 && u8[5] === 0x45 && u8[6] === 0x52) return 'none'\n return 'unknown'\n}\n\nfunction toArrayBuffer(u8: Uint8Array): ArrayBuffer {\n // Short-circuit when the Uint8Array exactly spans its backing buffer\n // (the common case for fresh gunzipSync / fzstd.decompress allocations).\n if (u8.byteOffset === 0 && u8.byteLength === u8.buffer.byteLength) return u8.buffer as ArrayBuffer\n return u8.buffer.slice(u8.byteOffset, u8.byteOffset + u8.byteLength) as ArrayBuffer\n}\n\n/**\n * Decompress a `.blend` payload if needed and return a plain `ArrayBuffer`.\n * Returns the input unchanged for uncompressed files.\n *\n * Throws if the file magic is unrecognised, or if a decompressor produces\n * output too short to be a valid .blend header (which would otherwise hang\n * the downstream parser).\n */\nexport function decompressBlend(buf: ArrayBuffer): ArrayBuffer {\n const u8 = new Uint8Array(buf)\n const kind = detectBlendCompression(u8)\n if (kind === 'none') return buf\n let out: ArrayBuffer\n if (kind === 'gzip') out = toArrayBuffer(gunzipSync(u8))\n else if (kind === 'zstd') out = toArrayBuffer(zstdDecompress(u8))\n else {\n const hex = [u8[0], u8[1], u8[2], u8[3]].map(b => (b ?? 0).toString(16).padStart(2, '0')).join(' ')\n throw new Error(`BlendLoadPlugin: unrecognised file magic (first 4 bytes: ${hex}). Expected 'BLENDER' literal, gzip, or zstd.`)\n }\n // Parser reads the BLENDER-v### header (12 bytes) unconditionally; reject\n // truncated/malformed decompressor output here so parseBlend doesn't throw\n // a RangeError inside its sync onmessage handler (which would never resolve).\n if (out.byteLength < 12) {\n throw new Error(`BlendLoadPlugin: ${kind} decompression produced ${out.byteLength} bytes, too short to be a valid .blend file.`)\n }\n return out\n}\n","import {\n AmbientLight2,\n AnyOptions,\n BaseImporterPlugin,\n BufferAttribute,\n BufferGeometry2,\n DataTexture,\n DirectionalLight2,\n FileLoader,\n IAssetImporter,\n ILoader,\n Importer, Mesh,\n Mesh2,\n Object3D,\n Object3D2,\n OrthographicCamera0,\n PerspectiveCamera0,\n PhysicalMaterial,\n PointLight2,\n Scene,\n Source,\n SpotLight2,\n SRGBColorSpace,\n Texture,\n UnlitMaterial,\n} from 'threepipe'\nimport {parseBlend} from './js-blend/main.js'\nimport {createObjects} from './loader'\nimport {decompressBlend} from './decompress'\n\ninterface ExternalTextureRequest { texture: Texture, url: string, srgb: boolean, path: string }\n\n/**\n * Resolve a Blender Image file path to an absolute URL relative to the `.blend`, and return a placeholder\n * {@link Texture} plus a request to import it later. Resolution happens NOW, while the importer's root\n * context for this `.blend` is active — the actual import is deferred (see {@link importExternalTexture})\n * because importing re-enters the AssetImporter and would clobber that root context for sibling textures.\n *\n * Blender path conventions: leading `//` means relative to the `.blend`'s directory; `\\` separators and a\n * leading `./` are normalised. Returns `null` in Node (no DOM) or for an empty path.\n */\nfunction resolveExternalTexture(blenderPath: string, srgb: boolean, importer: IAssetImporter, blendUrl: string): ExternalTextureRequest | null {\n if (typeof document === 'undefined') return null // image decoding needs the DOM\n const path = blenderPath.replace(/^\\/\\//, '').replace(/\\\\/g, '/').replace(/^\\.\\//, '')\n if (!path) return null\n let url = importer.resolveURL(path)\n // Fall back to joining against the .blend's directory if the importer didn't make it absolute\n // (e.g. the root context wasn't applied) — keeps relative sibling textures resolvable.\n if (url === path && !/^([a-z][a-z0-9+.-]*:|\\/|blob:|data:)/i.test(url)) {\n url = blendUrl.replace(/[?#].*$/, '').replace(/[^/]*$/, '') + path\n }\n // Start as a benign 1x1 texture so a failed/unsupported import leaves a harmless map (white) instead of\n // an undefined-image texture that crashes the GPU upload. The placeholder must match the imported\n // texture's CLASS: EXR/HDR import as a DataTexture (float data, different GPU upload path) — a regular\n // Texture placeholder would crash on upload even after copying. Replaced by the real image on success.\n // Detect EXR/HDR from the Blender PATH's extension, not the resolved `url`: a dropped/registered file\n // (folder drop, importFiles) resolves to a blob: URL with the real path in the #fragment\n // (`blob:…uuid#/dir/x.exr`), so testing `url` would miss the extension and wrongly pick a non-data\n // Texture placeholder — breaking the GPU upload (texSubImage2D) and the UI preview (putImageData) of\n // EXR/HDR maps. `path` always carries the true extension.\n const isData = /\\.(exr|hdr|rgbe)$/i.test(path.split(/[?#]/)[0])\n let texture: Texture\n if (isData) {\n texture = new DataTexture(new Uint8Array([255, 255, 255, 255]), 1, 1)\n } else {\n const canvas = document.createElement('canvas')\n canvas.width = canvas.height = 1\n const c2d = canvas.getContext('2d')\n if (c2d) { c2d.fillStyle = '#ffffff'; c2d.fillRect(0, 0, 1, 1) }\n texture = new Texture(canvas)\n }\n texture.needsUpdate = true\n if (srgb) texture.colorSpace = SRGBColorSpace\n return {texture, url, srgb, path}\n}\n\n/**\n * Vertically flip a DataTexture's pixel rows into a PRIVATE copy and reseat its `source`.\n *\n * Why: EXR/HDR import as `DataTexture`s with `flipY=false`, while the blend importer's raster maps\n * (jpg/png via the AssetImporter) import as image textures with `flipY=true`. WebGL's `UNPACK_FLIP_Y`\n * only applies to DOM/ImageBitmap uploads, NOT to `ArrayBufferView` (DataTexture) uploads — so a data\n * map ends up sampled vertically mirrored relative to the raster maps on the SAME UVs. On a material\n * that mixes them (e.g. jpg base color + EXR normal/roughness) the normal/rough/displacement detail\n * lands upside-down and fights the diffuse — the normal map appears not to work. Pre-flipping the data\n * makes a `flipY=false` data texture sample identically to a `flipY=true` raster, restoring alignment;\n * three + Blender share the OpenGL (`nor_gl`) green-up convention, so `normalScale` stays positive.\n *\n * The flip goes into a fresh typed array + `Source` so we never mutate the AssetImporter-CACHED source\n * (the same EXR is reused across materials — Plane and Sphere here share one normal map).\n */\nfunction flipDataTextureRowsY(tex: DataTexture): void {\n const img: any = tex.image\n const data: any = img?.data\n if (!data?.length || !img.width || !img.height) return\n const {width, height} = img\n const elemsPerRow = data.length / height // width * channels-per-pixel\n if (!Number.isInteger(elemsPerRow)) return\n const flipped = new (data.constructor as new (n: number) => typeof data)(data.length)\n for (let y = 0; y < height; y++) {\n flipped.set(data.subarray(y * elemsPerRow, (y + 1) * elemsPerRow), (height - 1 - y) * elemsPerRow)\n }\n const newImage = {data: flipped, width, height}\n tex.image = newImage\n tex.source = new Source(newImage)\n tex.needsUpdate = true\n}\n\n/**\n * Import a resolved external texture through threepipe's {@link IAssetImporter} — which selects the correct\n * loader per format (EXR/HDR/KTX2/JPG/PNG/WebP/...) and applies its cache and progress tracking, so any\n * format threepipe supports works, not just browser-native rasters. Fills the placeholder texture from the\n * result. Missing/unsupported files log a warning and resolve (no throw) so one bad path doesn't fail the\n * whole import.\n */\nasync function importExternalTexture(req: ExternalTextureRequest, importer: IAssetImporter): Promise<void> {\n try {\n const imported: any = await importer.importSingle<Texture>(req.url)\n if (imported && imported.isTexture && imported.image) {\n // Copy the FULL texture state — source, type, format, filters, flipY — not just the image, so a\n // HalfFloat/Float DataTexture (EXR/HDR) uploads with the correct type (copying only the source\n // onto a default UnsignedByte texture crashes the GPU upload). But preserve the wrap mode the\n // loader set from the Blender node's Extension (copy would overwrite it with the importer's\n // ClampToEdge default → tiled UVs outside [0,1] would clamp/smear instead of repeat).\n const wrapS = req.texture.wrapS, wrapT = req.texture.wrapT\n req.texture.copy(imported)\n req.texture.wrapS = wrapS; req.texture.wrapT = wrapT\n req.texture.colorSpace = req.srgb ? SRGBColorSpace : imported.colorSpace\n // Align flipY=false data textures (EXR/HDR) to the flipY=true raster convention — see helper.\n if (imported.isDataTexture && imported.flipY === false) flipDataTextureRowsY(req.texture as DataTexture)\n req.texture.needsUpdate = true\n } else {\n console.warn('BlendLoadPlugin - external texture not found/unsupported:', req.path)\n }\n } catch (e) {\n console.warn('BlendLoadPlugin - external texture failed:', req.path, e)\n }\n}\n\n/**\n * Shape of the parsed Blender file passed to {@link BlendLoadOptions.onBlendLoad}.\n *\n * This is the raw `js.blend` FILE object — see `src/js-blend/parser/parser.js` for the\n * full DNA tree. Notable fields are typed here; everything else is untyped under `[k: string]`.\n */\nexport interface BlendFile {\n /** Three.js root constructed from the file's Blender objects. Same object returned as the Scene. */\n scene: Object3D\n /**\n * Embedded preview thumbnail (RGBA8, packed one pixel per `Uint32`). Absent on very old saves\n * or files saved with preview disabled. Typical size 128×128.\n * Convert via `<canvas>.createImageData` for display.\n */\n thumbnail?: {width: number, height: number, data: Uint32Array}\n /** Parsed Blender objects keyed by SDNA struct type, e.g. `objects.Object`, `objects.Mesh`, `objects.Material`. */\n objects: Record<string, any[]>\n /** SDNA template — Blender's runtime struct definitions parsed out of the DNA1 block. */\n template: any\n /** Memory-address-keyed lookup of every parsed block. */\n memory_lookup: Record<string, any>\n /** Raw `ArrayBuffer` of the decompressed `.blend` payload. */\n AB: ArrayBuffer\n [k: string]: any\n}\n\n/**\n * Loader options consumed by `BlendLoadPlugin`. Pass via `viewer.load(url, options)`.\n */\nexport interface BlendLoadOptions {\n /**\n * Called once after parsing, before the Scene is returned to the asset pipeline. Use to read\n * metadata that isn't represented in the three.js Scene — Blender's embedded thumbnail, raw\n * DNA struct data, library/kinematics references, etc.\n *\n * The callback's return value is ignored. Don't put data here onto `userData` (the import/export\n * pipeline will round-trip it as JSON — large typed arrays like the thumbnail will balloon\n * exports or fail serialization).\n *\n * @example\n * ```ts\n * viewer.load('scene.blend', {\n * onBlendLoad: (blend) => {\n * if (blend.thumbnail) {\n * // render the embedded preview to a <canvas>...\n * }\n * },\n * })\n * ```\n */\n onBlendLoad?: (blend: BlendFile) => void\n}\n\n/**\n * Adds support for loading Blender `.blend`, `application/x-blender` files and data URIs.\n *\n * Handles uncompressed, gzip-compressed (Blender ≤ 2.93), and zstd-compressed (Blender 3.0+ default)\n * files. See {@link BlendLoadOptions} for callback hooks, including access to the embedded thumbnail\n * and the raw parsed DNA tree.\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 // The AssetImporter that constructed this loader (injected via the Importer onCtor below). Used to\n // load external textures through the full pipeline (correct loader per format + cache).\n assetImporter?: IAssetImporter\n async loadAsync(url: string, onProgress?: (event: ProgressEvent) => void): Promise<any> {\n this.setResponseType('arraybuffer')\n let res: ArrayBuffer | null = (await super.loadAsync(url, onProgress)) as ArrayBuffer\n const decompressed = decompressBlend(res)\n // Drop the reference to the original (possibly compressed) buffer so it can be\n // garbage-collected while the parser works on the decompressed copy.\n res = null\n const blend = await parseBlend(decompressed)\n // console.log(bakeGetters(blend))\n // External textures: resolve each path NOW (the importer's root context for this .blend is\n // active during createObjects), then import them all AFTER createObjects — importing re-enters\n // the AssetImporter and would otherwise clobber the root context for sibling textures.\n const importer = this.assetImporter\n const texReqs: ExternalTextureRequest[] = []\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 loadExternalTexture: importer\n ? (p: string, srgb: boolean) => {\n const req = resolveExternalTexture(p, srgb, importer, url)\n if (req) texReqs.push(req)\n return req ? req.texture : null\n }\n : undefined,\n }\n const objects = await createObjects(blend, ctx)\n if (importer && texReqs.length) await Promise.all(texReqs.map(r => importExternalTexture(r, importer)))\n const root = new Object3D()\n root.add(...objects)\n blend.scene = root\n return blend\n }\n\n transform(res: BlendFile, options: AnyOptions & BlendLoadOptions): Scene {\n if (typeof options.onBlendLoad === 'function') {\n options.onBlendLoad(res)\n }\n return res.scene as unknown as Scene\n }\n }, ['blend'], ['application/x-blender'], true, (loader, assetImporter) => {\n // Inject the AssetImporter so the loader can import external textures through the full pipeline.\n if (loader) (loader as any).assetImporter = assetImporter\n return loader\n })\n}\n"],"names":["AB","offset","pointer_size","array_names","i","BLENDER_FILE","err","parser","u8","zstdDecompress"],"mappings":"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","x_google_ignoreList":[8]}