{"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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"}