@roomle/web-sdk 3.6.0 → 3.7.0-alpha.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 (105) hide show
  1. package/lib/{BufferGeometry-DLEagG41.mjs → BufferGeometry-BLeRuMkh.mjs} +1 -1
  2. package/lib/{BufferGeometry-DLEagG41.mjs.map → BufferGeometry-BLeRuMkh.mjs.map} +1 -1
  3. package/lib/ConfiguratorKernel.js +54 -73
  4. package/lib/ConfiguratorKernel.wasm +0 -0
  5. package/lib/{GLTFExporter-D8qsdwDK.mjs → GLTFExporter-CFXCqoLa.mjs} +141 -141
  6. package/lib/{GLTFExporter-D8qsdwDK.mjs.map → GLTFExporter-CFXCqoLa.mjs.map} +1 -1
  7. package/lib/{PointLightHelper-BnjxGaOG.mjs → PointLightHelper-BEJEy6l_.mjs} +2 -2
  8. package/lib/{PointLightHelper-BnjxGaOG.mjs.map → PointLightHelper-BEJEy6l_.mjs.map} +1 -1
  9. package/lib/RoomleCore.js +59 -79
  10. package/lib/RoomleCore.wasm +0 -0
  11. package/lib/RoomleToolsCore.js +54 -74
  12. package/lib/RoomleToolsCore.wasm +0 -0
  13. package/lib/{SpotLightHelper-DqsfqCrs.mjs → SpotLightHelper-aXFW8qaJ.mjs} +2 -2
  14. package/lib/{SpotLightHelper-DqsfqCrs.mjs.map → SpotLightHelper-aXFW8qaJ.mjs.map} +1 -1
  15. package/lib/{USDZExporter-DxIqi8St.mjs → USDZExporter-B4hsiwhd.mjs} +2 -2
  16. package/lib/{USDZExporter-DxIqi8St.mjs.map → USDZExporter-B4hsiwhd.mjs.map} +1 -1
  17. package/lib/{api-xDJ-Uyom.mjs → api-C2-6Jm5W.mjs} +2 -2
  18. package/lib/{api-xDJ-Uyom.mjs.map → api-C2-6Jm5W.mjs.map} +1 -1
  19. package/lib/{banana-for-scale-C_iNmlCT.mjs → banana-for-scale-BV_na-g3.mjs} +4 -4
  20. package/lib/banana-for-scale-BV_na-g3.mjs.map +1 -0
  21. package/lib/chunk-C97zSiVS.mjs +20 -0
  22. package/lib/{common-utils-DMSTohiS.mjs → common-utils-qErzZAiR.mjs} +2 -2
  23. package/lib/common-utils-qErzZAiR.mjs.map +1 -0
  24. package/lib/{component-dimensioning-CvRmUja4.mjs → component-dimensioning-DCQTqssC.mjs} +49 -49
  25. package/lib/{component-dimensioning-CvRmUja4.mjs.map → component-dimensioning-DCQTqssC.mjs.map} +1 -1
  26. package/lib/{component-raycast-helper-CEp7wy9c.mjs → component-raycast-helper-B3WXp3oq.mjs} +20 -24
  27. package/lib/component-raycast-helper-B3WXp3oq.mjs.map +1 -0
  28. package/lib/configurator-CrNkzBp9.mjs +2 -0
  29. package/lib/configurator-Dx6kcXY_.mjs +45 -0
  30. package/lib/{configurator-CmuhFgC9.mjs.map → configurator-Dx6kcXY_.mjs.map} +1 -1
  31. package/lib/{continuous-drawing-helper-v_5UAM9A.mjs → continuous-drawing-helper-DzULJ9d1.mjs} +12 -12
  32. package/lib/continuous-drawing-helper-DzULJ9d1.mjs.map +1 -0
  33. package/lib/{decorate-C1QnXPYw.mjs → decorate-BIflHDAa.mjs} +1 -1
  34. package/lib/{decorate-C1QnXPYw.mjs.map → decorate-BIflHDAa.mjs.map} +1 -1
  35. package/lib/{dimensioning-helper-Fwpt1HTT.mjs → dimensioning-helper-Cj20VTW0.mjs} +66 -57
  36. package/lib/{dimensioning-helper-Fwpt1HTT.mjs.map → dimensioning-helper-Cj20VTW0.mjs.map} +1 -1
  37. package/lib/{glb-viewer-BzNA9-zH.mjs → glb-viewer-BqFcaUlb.mjs} +52 -52
  38. package/lib/glb-viewer-BqFcaUlb.mjs.map +1 -0
  39. package/lib/glb-viewer-FYw7R-ya.mjs +2 -0
  40. package/lib/{homag-intelligence-BwGjJEws.mjs → homag-intelligence-Dkz0AhB4.mjs} +3 -3
  41. package/lib/{homag-intelligence-BwGjJEws.mjs.map → homag-intelligence-Dkz0AhB4.mjs.map} +1 -1
  42. package/lib/{imos-ix-poc-export-helper-CQh94HsO.mjs → imos-ix-poc-export-helper-BjIgAfUu.mjs} +4 -3
  43. package/lib/imos-ix-poc-export-helper-BjIgAfUu.mjs.map +1 -0
  44. package/lib/kernel-BAQSG9r5.mjs.map +1 -1
  45. package/lib/{kernel-utils-H74uNY1h.mjs → kernel-utils-CfGzR_WC.mjs} +15 -15
  46. package/lib/{kernel-utils-H74uNY1h.mjs.map → kernel-utils-CfGzR_WC.mjs.map} +1 -1
  47. package/lib/{layer-C_JtkhdO.mjs → layer-CFAr2mK_.mjs} +1 -1
  48. package/lib/{layer-C_JtkhdO.mjs.map → layer-CFAr2mK_.mjs.map} +1 -1
  49. package/lib/{main-CtVIB52l.mjs → main-DMIVdAcT.mjs} +14471 -14300
  50. package/lib/main-DMIVdAcT.mjs.map +1 -0
  51. package/lib/{material-viewer-Bq4smZ6f.mjs → material-viewer-BkwvhHbQ.mjs} +40 -40
  52. package/lib/material-viewer-BkwvhHbQ.mjs.map +1 -0
  53. package/lib/planner-BPlxsTRJ.mjs +44 -0
  54. package/lib/{planner-CVw_xzGh.mjs.map → planner-BPlxsTRJ.mjs.map} +1 -1
  55. package/lib/planner-oj08ktHE.mjs +2 -0
  56. package/lib/{plugin-system-D9K46xJk.mjs → plugin-system-XhOJU1MI.mjs} +3 -3
  57. package/lib/{plugin-system-D9K46xJk.mjs.map → plugin-system-XhOJU1MI.mjs.map} +1 -1
  58. package/lib/roomle-renderer-BwPvUqSW.mjs +49 -0
  59. package/lib/roomle-renderer-BwPvUqSW.mjs.map +1 -0
  60. package/lib/roomle-sdk.d.ts +114 -1116
  61. package/lib/roomle-sdk.js +6 -6
  62. package/lib/roomle-webgpu-renderer-CSC5zFdC.mjs +217 -0
  63. package/lib/roomle-webgpu-renderer-CSC5zFdC.mjs.map +1 -0
  64. package/lib/{scene-renderer-D8HkTFeZ.mjs → scene-renderer-DWY_zPvU.mjs} +496 -513
  65. package/lib/scene-renderer-DWY_zPvU.mjs.map +1 -0
  66. package/lib/{script-loader-D8xCRzTr.mjs → script-loader-CA-XHFKN.mjs} +3 -3
  67. package/lib/{script-loader-D8xCRzTr.mjs.map → script-loader-CA-XHFKN.mjs.map} +1 -1
  68. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/package.json +1 -1
  69. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCoreInterface.d.ts +0 -1
  70. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreInterface.d.ts +3 -3
  71. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/ConfiguratorKernel.js +54 -73
  72. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/ConfiguratorKernel.wasm +0 -0
  73. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleCore.js +59 -79
  74. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleCore.wasm +0 -0
  75. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleToolsCore.js +54 -74
  76. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleToolsCore.wasm +0 -0
  77. package/lib/{stats-helper-HM0TaIM5.mjs → stats-helper-C954Cfgh.mjs} +4 -3
  78. package/lib/{stats-helper-HM0TaIM5.mjs.map → stats-helper-C954Cfgh.mjs.map} +1 -1
  79. package/lib/{three.core-CLIofecG.mjs → three.core-mM-jZdgg.mjs} +926 -926
  80. package/lib/{three.core-CLIofecG.mjs.map → three.core-mM-jZdgg.mjs.map} +1 -1
  81. package/lib/{three.module-C4Q1skJQ.mjs → three.module-Bmy3sVQ-.mjs} +1210 -1210
  82. package/lib/{three.module-C4Q1skJQ.mjs.map → three.module-Bmy3sVQ-.mjs.map} +1 -1
  83. package/lib/{three.webgpu-dFspy2yF.mjs → three.webgpu-0l2TztLa.mjs} +5355 -2935
  84. package/lib/{three.webgpu-dFspy2yF.mjs.map → three.webgpu-0l2TztLa.mjs.map} +1 -1
  85. package/lib/{threejs-utils-jEzvlJF1.mjs → threejs-utils-8zlxt158.mjs} +430 -431
  86. package/lib/threejs-utils-8zlxt158.mjs.map +1 -0
  87. package/lib/{tools-core-Bf9WsK5v.mjs → tools-core-BzhFD2Wk.mjs} +3 -3
  88. package/lib/{tools-core-Bf9WsK5v.mjs.map → tools-core-BzhFD2Wk.mjs.map} +1 -1
  89. package/package.json +1 -1
  90. package/lib/banana-for-scale-C_iNmlCT.mjs.map +0 -1
  91. package/lib/common-utils-DMSTohiS.mjs.map +0 -1
  92. package/lib/component-raycast-helper-CEp7wy9c.mjs.map +0 -1
  93. package/lib/configurator-BaUt4_LF.mjs +0 -2
  94. package/lib/configurator-CmuhFgC9.mjs +0 -45
  95. package/lib/continuous-drawing-helper-v_5UAM9A.mjs.map +0 -1
  96. package/lib/dimensioning-helper-DTcW85Oq.mjs +0 -2
  97. package/lib/glb-viewer-BzNA9-zH.mjs.map +0 -1
  98. package/lib/glb-viewer-DOxBD5k-.mjs +0 -2
  99. package/lib/imos-ix-poc-export-helper-CQh94HsO.mjs.map +0 -1
  100. package/lib/main-CtVIB52l.mjs.map +0 -1
  101. package/lib/material-viewer-Bq4smZ6f.mjs.map +0 -1
  102. package/lib/planner-CVw_xzGh.mjs +0 -44
  103. package/lib/planner-si70gWA2.mjs +0 -2
  104. package/lib/scene-renderer-D8HkTFeZ.mjs.map +0 -1
  105. package/lib/threejs-utils-jEzvlJF1.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"USDZExporter-DxIqi8St.mjs","names":[],"sources":["../../../../node_modules/three/examples/jsm/exporters/USDZExporter.js"],"sourcesContent":["import {\n\tNoColorSpace,\n\tDoubleSide,\n\tColor,\n} from 'three';\n\nimport {\n\tstrToU8,\n\tzipSync,\n} from '../libs/fflate.module.js';\n\nclass USDNode {\n\n\tconstructor( name, type = '', metadata = [], properties = [] ) {\n\n\t\tthis.name = name;\n\t\tthis.type = type;\n\t\tthis.metadata = metadata;\n\t\tthis.properties = properties;\n\t\tthis.children = [];\n\n\t}\n\n\taddMetadata( key, value ) {\n\n\t\tthis.metadata.push( { key, value } );\n\n\t}\n\n\taddProperty( property, metadata = [] ) {\n\n\t\tthis.properties.push( { property, metadata } );\n\n\t}\n\n\taddChild( child ) {\n\n\t\tthis.children.push( child );\n\n\t}\n\n\ttoString( indent = 0 ) {\n\n\t\tconst pad = '\\t'.repeat( indent );\n\n\t\tconst formattedMetadata = this.metadata.map( ( item ) => {\n\n\t\t\tconst key = item.key;\n\t\t\tconst value = item.value;\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tconst lines = [];\n\t\t\t\tlines.push( `${key} = {` );\n\t\t\t\tvalue.forEach( ( line ) => {\n\n\t\t\t\t\tlines.push( `${pad}\\t\\t${line}` );\n\n\t\t\t\t} );\n\t\t\t\tlines.push( `${pad}\\t}` );\n\t\t\t\treturn lines.join( '\\n' );\n\n\t\t\t} else {\n\n\t\t\t\treturn `${key} = ${value}`;\n\n\t\t\t}\n\n\t\t} );\n\n\t\tconst meta = formattedMetadata.length\n\t\t\t? ` (\\n${formattedMetadata\n\t\t\t\t.map( ( l ) => `${pad}\\t${l}` )\n\t\t\t\t.join( '\\n' )}\\n${pad})`\n\t\t\t: '';\n\n\t\tconst properties = this.properties.map( ( l ) => {\n\n\t\t\tconst property = l.property;\n\t\t\tconst metadata = l.metadata.length\n\t\t\t\t? ` (\\n${l.metadata.map( ( m ) => `${pad}\\t\\t${m}` ).join( '\\n' )}\\n${pad}\\t)`\n\t\t\t\t: '';\n\t\t\treturn `${pad}\\t${property}${metadata}`;\n\n\t\t} );\n\t\tconst children = this.children.map( ( c ) => c.toString( indent + 1 ) );\n\n\t\tconst bodyLines = [];\n\n\t\tif ( properties.length > 0 ) {\n\n\t\t\tbodyLines.push( ...properties );\n\n\t\t}\n\n\t\tif ( children.length > 0 ) {\n\n\t\t\tif ( properties.length > 0 ) {\n\n\t\t\t\tbodyLines.push( '' );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tbodyLines.push( children[ i ] );\n\t\t\t\tif ( i < children.length - 1 ) {\n\n\t\t\t\t\tbodyLines.push( '' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bodyContent = bodyLines.join( '\\n' );\n\n\t\tconst type = this.type ? this.type + ' ' : '';\n\n\t\treturn `${pad}def ${type}\"${this.name}\"${meta}\\n${pad}{\\n${bodyContent}\\n${pad}}`;\n\n\t}\n\n}\n\n/**\n * An exporter for USDZ.\n *\n * ```js\n * const exporter = new USDZExporter();\n * const arraybuffer = await exporter.parseAsync( scene );\n * ```\n *\n * @three_import import { USDZExporter } from 'three/addons/exporters/USDZExporter.js';\n */\nclass USDZExporter {\n\n\t/**\n\t * Constructs a new USDZ exporter.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A reference to a texture utils module.\n\t\t *\n\t\t * @type {?(WebGLTextureUtils|WebGPUTextureUtils)}\n\t\t * @default null\n\t\t */\n\t\tthis.textureUtils = null;\n\n\t}\n\n\t/**\n\t * Sets the texture utils for this exporter. Only relevant when compressed textures have to be exported.\n\t *\n\t * Depending on whether you use {@link WebGLRenderer} or {@link WebGPURenderer}, you must inject the\n\t * corresponding texture utils {@link WebGLTextureUtils} or {@link WebGPUTextureUtils}.\n\t *\n\t * @param {WebGLTextureUtils|WebGPUTextureUtils} utils - The texture utils.\n\t */\n\tsetTextureUtils( utils ) {\n\n\t\tthis.textureUtils = utils;\n\n\t}\n\n\t/**\n\t * Parse the given 3D object and generates the USDZ output.\n\t *\n\t * @param {Object3D} scene - The 3D object to export.\n\t * @param {USDZExporter~OnDone} onDone - A callback function that is executed when the export has finished.\n\t * @param {USDZExporter~OnError} onError - A callback function that is executed when an error happens.\n\t * @param {USDZExporter~Options} options - The export options.\n\t */\n\tparse( scene, onDone, onError, options ) {\n\n\t\tthis.parseAsync( scene, options ).then( onDone ).catch( onError );\n\n\t}\n\n\t/**\n\t * Async version of {@link USDZExporter#parse}.\n\t *\n\t * @async\n\t * @param {Object3D} scene - The 3D object to export.\n\t * @param {USDZExporter~Options} options - The export options.\n\t * @return {Promise<ArrayBuffer>} A Promise that resolved with the exported USDZ data.\n\t */\n\tasync parseAsync( scene, options = {} ) {\n\n\t\toptions = Object.assign(\n\t\t\t{\n\t\t\t\tar: {\n\t\t\t\t\tanchoring: { type: 'plane' },\n\t\t\t\t\tplaneAnchoring: { alignment: 'horizontal' },\n\t\t\t\t},\n\t\t\t\tincludeAnchoringProperties: true,\n\t\t\t\tonlyVisible: true,\n\t\t\t\tquickLookCompatible: false,\n\t\t\t\tmaxTextureSize: 1024,\n\t\t\t},\n\t\t\toptions\n\t\t);\n\n\t\tconst usedNames = new Set();\n\n\t\tconst files = {};\n\t\tconst modelFileName = 'model.usda';\n\n\t\t// model file should be first in USDZ archive so we init it here\n\t\tfiles[ modelFileName ] = null;\n\n\t\tconst root = new USDNode( 'Root', 'Xform' );\n\t\tconst scenesNode = new USDNode( 'Scenes', 'Scope' );\n\t\tscenesNode.addMetadata( 'kind', '\"sceneLibrary\"' );\n\t\troot.addChild( scenesNode );\n\n\t\tconst sceneName = 'Scene';\n\t\tconst sceneNode = new USDNode( sceneName, 'Xform' );\n\t\tsceneNode.addMetadata( 'customData', [\n\t\t\t'bool preliminary_collidesWithEnvironment = 0',\n\t\t\t`string sceneName = \"${sceneName}\"`,\n\t\t] );\n\t\tsceneNode.addMetadata( 'sceneName', `\"${sceneName}\"` );\n\t\tif ( options.includeAnchoringProperties ) {\n\n\t\t\tsceneNode.addProperty(\n\t\t\t\t`token preliminary:anchoring:type = \"${options.ar.anchoring.type}\"`\n\t\t\t);\n\t\t\tsceneNode.addProperty(\n\t\t\t\t`token preliminary:planeAnchoring:alignment = \"${options.ar.planeAnchoring.alignment}\"`\n\t\t\t);\n\n\t\t}\n\n\t\tscenesNode.addChild( sceneNode );\n\n\t\tlet output;\n\n\t\tconst materials = {};\n\t\tconst textures = {};\n\n\t\tbuildHierarchy( scene, sceneNode, materials, usedNames, files, options );\n\n\t\tconst materialsNode = buildMaterials(\n\t\t\tmaterials,\n\t\t\ttextures,\n\t\t\toptions.quickLookCompatible\n\t\t);\n\n\t\toutput =\n\t\t\tbuildHeader() +\n\t\t\t'\\n' +\n\t\t\troot.toString() +\n\t\t\t'\\n\\n' +\n\t\t\tmaterialsNode.toString();\n\n\t\tfiles[ modelFileName ] = strToU8( output );\n\t\toutput = null;\n\n\t\tfor ( const id in textures ) {\n\n\t\t\tlet texture = textures[ id ];\n\n\t\t\tif ( texture.isCompressedTexture === true ) {\n\n\t\t\t\tif ( this.textureUtils === null ) {\n\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'THREE.USDZExporter: setTextureUtils() must be called to process compressed textures.'\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture = await this.textureUtils.decompress( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst canvas = imageToCanvas(\n\t\t\t\ttexture.image,\n\t\t\t\ttexture.flipY,\n\t\t\t\toptions.maxTextureSize\n\t\t\t);\n\t\t\tconst blob = await new Promise( ( resolve ) =>\n\t\t\t\tcanvas.toBlob( resolve, 'image/png', 1 )\n\t\t\t);\n\n\t\t\tfiles[ `textures/Texture_${id}.png` ] = new Uint8Array(\n\t\t\t\tawait blob.arrayBuffer()\n\t\t\t);\n\n\t\t}\n\n\t\t// 64 byte alignment\n\t\t// https://github.com/101arrowz/fflate/issues/39#issuecomment-777263109\n\n\t\tlet offset = 0;\n\n\t\tfor ( const filename in files ) {\n\n\t\t\tconst file = files[ filename ];\n\t\t\tconst headerSize = 34 + filename.length;\n\n\t\t\toffset += headerSize;\n\n\t\t\tconst offsetMod64 = offset & 63;\n\n\t\t\tif ( offsetMod64 !== 4 ) {\n\n\t\t\t\tconst padLength = 64 - offsetMod64;\n\t\t\t\tconst padding = new Uint8Array( padLength );\n\n\t\t\t\tfiles[ filename ] = [ file, { extra: { 12345: padding } } ];\n\n\t\t\t}\n\n\t\t\toffset = file.length;\n\n\t\t}\n\n\t\treturn zipSync( files, { level: 0 } );\n\n\t}\n\n}\n\nfunction getName( object, namesSet ) {\n\n\tlet name = object.name;\n\tname = name.replace( /[^A-Za-z0-9_]/g, '' );\n\tif ( /^[0-9]/.test( name ) ) {\n\n\t\tname = '_' + name;\n\n\t}\n\n\tif ( name === '' ) {\n\n\t\tif ( object.isCamera ) {\n\n\t\t\tname = 'Camera';\n\n\t\t} else {\n\n\t\t\tname = 'Object';\n\n\t\t}\n\n\t}\n\n\tif ( namesSet.has( name ) ) {\n\n\t\tname = name + '_' + object.id;\n\n\t}\n\n\tnamesSet.add( name );\n\n\treturn name;\n\n}\n\nfunction imageToCanvas( image, flipY, maxTextureSize ) {\n\n\tif (\n\t\t( typeof HTMLImageElement !== 'undefined' &&\n\t\t\timage instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' &&\n\t\t\timage instanceof HTMLCanvasElement ) ||\n\t\t( typeof OffscreenCanvas !== 'undefined' &&\n\t\t\timage instanceof OffscreenCanvas ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap )\n\t) {\n\n\t\tconst scale = maxTextureSize / Math.max( image.width, image.height );\n\n\t\tconst canvas = document.createElement( 'canvas' );\n\t\tcanvas.width = image.width * Math.min( 1, scale );\n\t\tcanvas.height = image.height * Math.min( 1, scale );\n\n\t\tconst context = canvas.getContext( '2d' );\n\n\t\t// TODO: We should be able to do this in the UsdTransform2d?\n\n\t\tif ( flipY === true ) {\n\n\t\t\tcontext.translate( 0, canvas.height );\n\t\t\tcontext.scale( 1, - 1 );\n\n\t\t}\n\n\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\treturn canvas;\n\n\t} else {\n\n\t\tthrow new Error(\n\t\t\t'THREE.USDZExporter: No valid image data found. Unable to process texture.'\n\t\t);\n\n\t}\n\n}\n\n//\n\nconst PRECISION = 7;\n\nfunction buildHeader() {\n\n\treturn `#usda 1.0\n(\n\tcustomLayerData = {\n\t\tstring creator = \"Three.js USDZExporter\"\n\t}\n\tdefaultPrim = \"Root\"\n\tmetersPerUnit = 1\n\tupAxis = \"Y\"\n)\n`;\n\n}\n\n// Xform\n\nfunction buildHierarchy( object, parentNode, materials, usedNames, files, options ) {\n\n\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\tconst child = object.children[ i ];\n\n\t\tif ( child.visible === false && options.onlyVisible === true ) continue;\n\n\t\tlet childNode;\n\n\t\tif ( child.isMesh ) {\n\n\t\t\tconst geometry = child.geometry;\n\t\t\tconst material = child.material;\n\n\t\t\tif ( material.isMeshStandardMaterial ) {\n\n\t\t\t\tconst geometryFileName = 'geometries/Geometry_' + geometry.id + '.usda';\n\n\t\t\t\tif ( ! ( geometryFileName in files ) ) {\n\n\t\t\t\t\tconst meshObject = buildMeshObject( geometry );\n\t\t\t\t\tfiles[ geometryFileName ] = strToU8(\n\t\t\t\t\t\tbuildHeader() + '\\n' + meshObject.toString()\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( material.uuid in materials ) ) {\n\n\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t}\n\n\t\t\t\tchildNode = buildMesh(\n\t\t\t\t\tchild,\n\t\t\t\t\tgeometry,\n\t\t\t\t\tmaterials[ material.uuid ],\n\t\t\t\t\tusedNames\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'THREE.USDZExporter: Unsupported material type (USDZ only supports MeshStandardMaterial)',\n\t\t\t\t\tchild\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t} else if ( child.isCamera ) {\n\n\t\t\tchildNode = buildCamera( child, usedNames );\n\n\t\t} else {\n\n\t\t\tchildNode = buildXform( child, usedNames );\n\n\t\t}\n\n\t\tif ( childNode ) {\n\n\t\t\tparentNode.addChild( childNode );\n\t\t\tbuildHierarchy( child, childNode, materials, usedNames, files, options );\n\n\t\t}\n\n\t}\n\n}\n\nfunction buildXform( object, usedNames ) {\n\n\tconst name = getName( object, usedNames );\n\n\tif ( object.matrix.determinant() < 0 ) {\n\n\t\tconsole.warn(\n\t\t\t'THREE.USDZExporter: USDZ does not support negative scales',\n\t\t\tobject\n\t\t);\n\n\t}\n\n\tconst node = new USDNode( name, 'Xform' );\n\n\tif ( object.pivot !== null ) {\n\n\t\t// Export with pivot using separate transform ops\n\t\tconst p = object.position;\n\t\tconst q = object.quaternion;\n\t\tconst s = object.scale;\n\t\tconst piv = object.pivot;\n\n\t\tnode.addProperty( `float3 xformOp:translate = (${p.x.toPrecision( PRECISION )}, ${p.y.toPrecision( PRECISION )}, ${p.z.toPrecision( PRECISION )})` );\n\t\tnode.addProperty( `float3 xformOp:translate:pivot = (${piv.x.toPrecision( PRECISION )}, ${piv.y.toPrecision( PRECISION )}, ${piv.z.toPrecision( PRECISION )})` );\n\t\tnode.addProperty( `quatf xformOp:orient = (${q.w.toPrecision( PRECISION )}, ${q.x.toPrecision( PRECISION )}, ${q.y.toPrecision( PRECISION )}, ${q.z.toPrecision( PRECISION )})` );\n\t\tnode.addProperty( `float3 xformOp:scale = (${s.x.toPrecision( PRECISION )}, ${s.y.toPrecision( PRECISION )}, ${s.z.toPrecision( PRECISION )})` );\n\t\tnode.addProperty( 'uniform token[] xformOpOrder = [\"xformOp:translate\", \"xformOp:translate:pivot\", \"xformOp:orient\", \"xformOp:scale\", \"!invert!xformOp:translate:pivot\"]' );\n\n\t} else {\n\n\t\t// Export as single transform matrix\n\t\tconst transform = buildMatrix( object.matrix );\n\t\tnode.addProperty( `matrix4d xformOp:transform = ${transform}` );\n\t\tnode.addProperty( 'uniform token[] xformOpOrder = [\"xformOp:transform\"]' );\n\n\t}\n\n\treturn node;\n\n}\n\nfunction buildMesh( object, geometry, material, usedNames ) {\n\n\tconst node = buildXform( object, usedNames );\n\n\tnode.addMetadata(\n\t\t'prepend references',\n\t\t`@./geometries/Geometry_${geometry.id}.usda@</Geometry>`\n\t);\n\tnode.addMetadata( 'prepend apiSchemas', '[\"MaterialBindingAPI\"]' );\n\n\tnode.addProperty(\n\t\t`rel material:binding = </Materials/Material_${material.id}>`\n\t);\n\n\treturn node;\n\n}\n\nfunction buildMatrix( matrix ) {\n\n\tconst array = matrix.elements;\n\n\treturn `( ${buildMatrixRow( array, 0 )}, ${buildMatrixRow(\n\t\tarray,\n\t\t4\n\t)}, ${buildMatrixRow( array, 8 )}, ${buildMatrixRow( array, 12 )} )`;\n\n}\n\nfunction buildMatrixRow( array, offset ) {\n\n\treturn `(${array[ offset + 0 ]}, ${array[ offset + 1 ]}, ${array[ offset + 2 ]}, ${\n\t\tarray[ offset + 3 ]\n\t})`;\n\n}\n\n// Mesh\n\nfunction buildMeshObject( geometry ) {\n\n\tconst node = new USDNode( 'Geometry' );\n\n\tconst meshNode = buildMeshNode( geometry );\n\tnode.addChild( meshNode );\n\n\treturn node;\n\n}\n\nfunction buildMeshNode( geometry ) {\n\n\tconst name = 'Geometry';\n\tconst attributes = geometry.attributes;\n\tconst count = attributes.position.count;\n\n\tconst node = new USDNode( name, 'Mesh' );\n\n\tnode.addProperty(\n\t\t`int[] faceVertexCounts = [${buildMeshVertexCount( geometry )}]`\n\t);\n\tnode.addProperty(\n\t\t`int[] faceVertexIndices = [${buildMeshVertexIndices( geometry )}]`\n\t);\n\tnode.addProperty(\n\t\t`normal3f[] normals = [${buildVector3Array( attributes.normal, count )}]`,\n\t\t[ 'interpolation = \"vertex\"' ]\n\t);\n\tnode.addProperty(\n\t\t`point3f[] points = [${buildVector3Array( attributes.position, count )}]`\n\t);\n\n\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\tconst id = i > 0 ? i : '';\n\t\tconst attribute = attributes[ 'uv' + id ];\n\t\tif ( attribute !== undefined ) {\n\n\t\t\tnode.addProperty(\n\t\t\t\t`texCoord2f[] primvars:st${id} = [${buildVector2Array( attribute )}]`,\n\t\t\t\t[ 'interpolation = \"vertex\"' ]\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\tconst colorAttribute = attributes.color;\n\tif ( colorAttribute !== undefined ) {\n\n\t\tnode.addProperty(\n\t\t\t`color3f[] primvars:displayColor = [${buildVector3Array(\n\t\t\t\tcolorAttribute,\n\t\t\t\tcount\n\t\t\t)}]`,\n\t\t\t[ 'interpolation = \"vertex\"' ]\n\t\t);\n\n\t}\n\n\tnode.addProperty( 'uniform token subdivisionScheme = \"none\"' );\n\n\treturn node;\n\n}\n\nfunction buildMeshVertexCount( geometry ) {\n\n\tconst count =\n\t\tgeometry.index !== null\n\t\t\t? geometry.index.count\n\t\t\t: geometry.attributes.position.count;\n\n\treturn Array( count / 3 )\n\t\t.fill( 3 )\n\t\t.join( ', ' );\n\n}\n\nfunction buildMeshVertexIndices( geometry ) {\n\n\tconst index = geometry.index;\n\tconst array = [];\n\n\tif ( index !== null ) {\n\n\t\tfor ( let i = 0; i < index.count; i ++ ) {\n\n\t\t\tarray.push( index.getX( i ) );\n\n\t\t}\n\n\t} else {\n\n\t\tconst length = geometry.attributes.position.count;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tarray.push( i );\n\n\t\t}\n\n\t}\n\n\treturn array.join( ', ' );\n\n}\n\nfunction buildVector3Array( attribute, count ) {\n\n\tif ( attribute === undefined ) {\n\n\t\tconsole.warn( 'USDZExporter: Normals missing.' );\n\t\treturn Array( count ).fill( '(0, 0, 0)' ).join( ', ' );\n\n\t}\n\n\tconst array = [];\n\n\tfor ( let i = 0; i < attribute.count; i ++ ) {\n\n\t\tconst x = attribute.getX( i );\n\t\tconst y = attribute.getY( i );\n\t\tconst z = attribute.getZ( i );\n\n\t\tarray.push(\n\t\t\t`(${x.toPrecision( PRECISION )}, ${y.toPrecision(\n\t\t\t\tPRECISION\n\t\t\t)}, ${z.toPrecision( PRECISION )})`\n\t\t);\n\n\t}\n\n\treturn array.join( ', ' );\n\n}\n\nfunction buildVector2Array( attribute ) {\n\n\tconst array = [];\n\n\tfor ( let i = 0; i < attribute.count; i ++ ) {\n\n\t\tconst x = attribute.getX( i );\n\t\tconst y = attribute.getY( i );\n\n\t\tarray.push(\n\t\t\t`(${x.toPrecision( PRECISION )}, ${1 - y.toPrecision( PRECISION )})`\n\t\t);\n\n\t}\n\n\treturn array.join( ', ' );\n\n}\n\n// Materials\n\nfunction buildMaterials( materials, textures, quickLookCompatible = false ) {\n\n\tconst materialsNode = new USDNode( 'Materials' );\n\n\tfor ( const uuid in materials ) {\n\n\t\tconst material = materials[ uuid ];\n\n\t\tmaterialsNode.addChild(\n\t\t\tbuildMaterial( material, textures, quickLookCompatible )\n\t\t);\n\n\t}\n\n\treturn materialsNode;\n\n}\n\nfunction buildMaterial( material, textures, quickLookCompatible = false ) {\n\n\t// https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html\n\n\tconst materialNode = new USDNode( `Material_${material.id}`, 'Material' );\n\n\tfunction buildTextureNodes( texture, mapType, color ) {\n\n\t\tconst id = texture.source.id + '_' + texture.flipY;\n\n\t\ttextures[ id ] = texture;\n\n\t\tconst uv = texture.channel > 0 ? 'st' + texture.channel : 'st';\n\n\t\tconst WRAPPINGS = {\n\t\t\t1000: 'repeat', // RepeatWrapping\n\t\t\t1001: 'clamp', // ClampToEdgeWrapping\n\t\t\t1002: 'mirror', // MirroredRepeatWrapping\n\t\t};\n\n\t\tconst repeat = texture.repeat.clone();\n\t\tconst offset = texture.offset.clone();\n\t\tconst rotation = texture.rotation;\n\n\t\t// rotation is around the wrong point. after rotation we need to shift offset again so that we're rotating around the right spot\n\t\tconst xRotationOffset = Math.sin( rotation );\n\t\tconst yRotationOffset = Math.cos( rotation );\n\n\t\t// texture coordinates start in the opposite corner, need to correct\n\t\toffset.y = 1 - offset.y - repeat.y;\n\n\t\t// turns out QuickLook is buggy and interprets texture repeat inverted/applies operations in a different order.\n\t\t// Apple Feedback: \tFB10036297 and FB11442287\n\t\tif ( quickLookCompatible ) {\n\n\t\t\t// This is NOT correct yet in QuickLook, but comes close for a range of models.\n\t\t\t// It becomes more incorrect the bigger the offset is\n\n\t\t\toffset.x = offset.x / repeat.x;\n\t\t\toffset.y = offset.y / repeat.y;\n\n\t\t\toffset.x += xRotationOffset / repeat.x;\n\t\t\toffset.y += yRotationOffset - 1;\n\n\t\t} else {\n\n\t\t\t// results match glTF results exactly. verified correct in usdview.\n\t\t\toffset.x += xRotationOffset * repeat.x;\n\t\t\toffset.y += ( 1 - yRotationOffset ) * repeat.y;\n\n\t\t}\n\n\t\tconst primvarReaderNode = new USDNode( `PrimvarReader_${mapType}`, 'Shader' );\n\t\tprimvarReaderNode.addProperty(\n\t\t\t'uniform token info:id = \"UsdPrimvarReader_float2\"'\n\t\t);\n\t\tprimvarReaderNode.addProperty( 'float2 inputs:fallback = (0.0, 0.0)' );\n\t\tprimvarReaderNode.addProperty( `string inputs:varname = \"${uv}\"` );\n\t\tprimvarReaderNode.addProperty( 'float2 outputs:result' );\n\n\t\tconst transform2dNode = new USDNode( `Transform2d_${mapType}`, 'Shader' );\n\t\ttransform2dNode.addProperty( 'uniform token info:id = \"UsdTransform2d\"' );\n\t\ttransform2dNode.addProperty(\n\t\t\t`float2 inputs:in.connect = </Materials/Material_${material.id}/PrimvarReader_${mapType}.outputs:result>`\n\t\t);\n\t\ttransform2dNode.addProperty(\n\t\t\t`float inputs:rotation = ${( rotation * ( 180 / Math.PI ) ).toFixed(\n\t\t\t\tPRECISION\n\t\t\t)}`\n\t\t);\n\t\ttransform2dNode.addProperty(\n\t\t\t`float2 inputs:scale = ${buildVector2( repeat )}`\n\t\t);\n\t\ttransform2dNode.addProperty(\n\t\t\t`float2 inputs:translation = ${buildVector2( offset )}`\n\t\t);\n\t\ttransform2dNode.addProperty( 'float2 outputs:result' );\n\n\t\tconst textureNode = new USDNode(\n\t\t\t`Texture_${texture.id}_${mapType}`,\n\t\t\t'Shader'\n\t\t);\n\t\ttextureNode.addProperty( 'uniform token info:id = \"UsdUVTexture\"' );\n\t\ttextureNode.addProperty( `asset inputs:file = @textures/Texture_${id}.png@` );\n\t\ttextureNode.addProperty(\n\t\t\t`float2 inputs:st.connect = </Materials/Material_${material.id}/Transform2d_${mapType}.outputs:result>`\n\t\t);\n\n\t\tif ( color !== undefined ) {\n\n\t\t\ttextureNode.addProperty( `float4 inputs:scale = ${buildColor4( color )}` );\n\n\t\t}\n\n\t\tif ( mapType === 'normal' ) {\n\n\t\t\ttextureNode.addProperty( 'float4 inputs:scale = (2, 2, 2, 1)' );\n\t\t\ttextureNode.addProperty( 'float4 inputs:bias = (-1, -1, -1, 0)' );\n\n\t\t}\n\n\t\ttextureNode.addProperty(\n\t\t\t`token inputs:sourceColorSpace = \"${\n\t\t\t\ttexture.colorSpace === NoColorSpace ? 'raw' : 'sRGB'\n\t\t\t}\"`\n\t\t);\n\t\ttextureNode.addProperty(\n\t\t\t`token inputs:wrapS = \"${WRAPPINGS[ texture.wrapS ]}\"`\n\t\t);\n\t\ttextureNode.addProperty(\n\t\t\t`token inputs:wrapT = \"${WRAPPINGS[ texture.wrapT ]}\"`\n\t\t);\n\t\ttextureNode.addProperty( 'float outputs:r' );\n\t\ttextureNode.addProperty( 'float outputs:g' );\n\t\ttextureNode.addProperty( 'float outputs:b' );\n\t\ttextureNode.addProperty( 'float3 outputs:rgb' );\n\n\t\tif ( material.transparent || material.alphaTest > 0.0 ) {\n\n\t\t\ttextureNode.addProperty( 'float outputs:a' );\n\n\t\t}\n\n\t\treturn [ primvarReaderNode, transform2dNode, textureNode ];\n\n\t}\n\n\tif ( material.side === DoubleSide ) {\n\n\t\tconsole.warn(\n\t\t\t'THREE.USDZExporter: USDZ does not support double sided materials',\n\t\t\tmaterial\n\t\t);\n\n\t}\n\n\tconst previewSurfaceNode = new USDNode( 'PreviewSurface', 'Shader' );\n\tpreviewSurfaceNode.addProperty( 'uniform token info:id = \"UsdPreviewSurface\"' );\n\n\tif ( material.map !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`color3f inputs:diffuseColor.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:rgb>`\n\t\t);\n\n\t\tif ( material.transparent ) {\n\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:a>`\n\t\t\t);\n\n\t\t} else if ( material.alphaTest > 0.0 ) {\n\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:a>`\n\t\t\t);\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:opacityThreshold = ${material.alphaTest}`\n\t\t\t);\n\n\t\t}\n\n\t\tconst textureNodes = buildTextureNodes(\n\t\t\tmaterial.map,\n\t\t\t'diffuse',\n\t\t\tmaterial.color\n\t\t);\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t} else {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`color3f inputs:diffuseColor = ${buildColor( material.color )}`\n\t\t);\n\n\t}\n\n\tif ( material.emissiveMap !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`color3f inputs:emissiveColor.connect = </Materials/Material_${material.id}/Texture_${material.emissiveMap.id}_emissive.outputs:rgb>`\n\t\t);\n\n\t\tconst emissiveColor = new Color(\n\t\t\tmaterial.emissive.r * material.emissiveIntensity,\n\t\t\tmaterial.emissive.g * material.emissiveIntensity,\n\t\t\tmaterial.emissive.b * material.emissiveIntensity\n\t\t);\n\t\tconst textureNodes = buildTextureNodes(\n\t\t\tmaterial.emissiveMap,\n\t\t\t'emissive',\n\t\t\temissiveColor\n\t\t);\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t} else if ( material.emissive.getHex() > 0 ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`color3f inputs:emissiveColor = ${buildColor( material.emissive )}`\n\t\t);\n\n\t}\n\n\tif ( material.normalMap !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`normal3f inputs:normal.connect = </Materials/Material_${material.id}/Texture_${material.normalMap.id}_normal.outputs:rgb>`\n\t\t);\n\n\t\tconst textureNodes = buildTextureNodes( material.normalMap, 'normal' );\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t}\n\n\tif ( material.aoMap !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:occlusion.connect = </Materials/Material_${material.id}/Texture_${material.aoMap.id}_occlusion.outputs:r>`\n\t\t);\n\n\t\tconst aoColor = new Color(\n\t\t\tmaterial.aoMapIntensity,\n\t\t\tmaterial.aoMapIntensity,\n\t\t\tmaterial.aoMapIntensity\n\t\t);\n\t\tconst textureNodes = buildTextureNodes(\n\t\t\tmaterial.aoMap,\n\t\t\t'occlusion',\n\t\t\taoColor\n\t\t);\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t}\n\n\tif ( material.roughnessMap !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:roughness.connect = </Materials/Material_${material.id}/Texture_${material.roughnessMap.id}_roughness.outputs:g>`\n\t\t);\n\n\t\tconst roughnessColor = new Color(\n\t\t\tmaterial.roughness,\n\t\t\tmaterial.roughness,\n\t\t\tmaterial.roughness\n\t\t);\n\t\tconst textureNodes = buildTextureNodes(\n\t\t\tmaterial.roughnessMap,\n\t\t\t'roughness',\n\t\t\troughnessColor\n\t\t);\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t} else {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:roughness = ${material.roughness}`\n\t\t);\n\n\t}\n\n\tif ( material.metalnessMap !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:metallic.connect = </Materials/Material_${material.id}/Texture_${material.metalnessMap.id}_metallic.outputs:b>`\n\t\t);\n\n\t\tconst metalnessColor = new Color(\n\t\t\tmaterial.metalness,\n\t\t\tmaterial.metalness,\n\t\t\tmaterial.metalness\n\t\t);\n\t\tconst textureNodes = buildTextureNodes(\n\t\t\tmaterial.metalnessMap,\n\t\t\t'metallic',\n\t\t\tmetalnessColor\n\t\t);\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t} else {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:metallic = ${material.metalness}`\n\t\t);\n\n\t}\n\n\tif ( material.alphaMap !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.alphaMap.id}_opacity.outputs:r>`\n\t\t);\n\t\tpreviewSurfaceNode.addProperty( 'float inputs:opacityThreshold = 0.0001' );\n\n\t\tconst textureNodes = buildTextureNodes( material.alphaMap, 'opacity' );\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t} else {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:opacity = ${material.opacity}`\n\t\t);\n\n\t}\n\n\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\tif ( material.clearcoatMap !== null ) {\n\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:clearcoat.connect = </Materials/Material_${material.id}/Texture_${material.clearcoatMap.id}_clearcoat.outputs:r>`\n\t\t\t);\n\n\t\t\tconst clearcoatColor = new Color(\n\t\t\t\tmaterial.clearcoat,\n\t\t\t\tmaterial.clearcoat,\n\t\t\t\tmaterial.clearcoat\n\t\t\t);\n\t\t\tconst textureNodes = buildTextureNodes(\n\t\t\t\tmaterial.clearcoatMap,\n\t\t\t\t'clearcoat',\n\t\t\t\tclearcoatColor\n\t\t\t);\n\t\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t\t} else {\n\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:clearcoat = ${material.clearcoat}`\n\t\t\t);\n\n\t\t}\n\n\t\tif ( material.clearcoatRoughnessMap !== null ) {\n\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:clearcoatRoughness.connect = </Materials/Material_${material.id}/Texture_${material.clearcoatRoughnessMap.id}_clearcoatRoughness.outputs:g>`\n\t\t\t);\n\n\t\t\tconst clearcoatRoughnessColor = new Color(\n\t\t\t\tmaterial.clearcoatRoughness,\n\t\t\t\tmaterial.clearcoatRoughness,\n\t\t\t\tmaterial.clearcoatRoughness\n\t\t\t);\n\t\t\tconst textureNodes = buildTextureNodes(\n\t\t\t\tmaterial.clearcoatRoughnessMap,\n\t\t\t\t'clearcoatRoughness',\n\t\t\t\tclearcoatRoughnessColor\n\t\t\t);\n\t\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t\t} else {\n\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:clearcoatRoughness = ${material.clearcoatRoughness}`\n\t\t\t);\n\n\t\t}\n\n\t\tpreviewSurfaceNode.addProperty( `float inputs:ior = ${material.ior}` );\n\n\t}\n\n\tpreviewSurfaceNode.addProperty( 'int inputs:useSpecularWorkflow = 0' );\n\tpreviewSurfaceNode.addProperty( 'token outputs:surface' );\n\n\tmaterialNode.addChild( previewSurfaceNode );\n\n\tmaterialNode.addProperty(\n\t\t`token outputs:surface.connect = </Materials/Material_${material.id}/PreviewSurface.outputs:surface>`\n\t);\n\n\treturn materialNode;\n\n}\n\nfunction buildColor( color ) {\n\n\treturn `(${color.r}, ${color.g}, ${color.b})`;\n\n}\n\nfunction buildColor4( color ) {\n\n\treturn `(${color.r}, ${color.g}, ${color.b}, 1.0)`;\n\n}\n\nfunction buildVector2( vector ) {\n\n\treturn `(${vector.x}, ${vector.y})`;\n\n}\n\nfunction buildCamera( camera, usedNames ) {\n\n\tconst name = getName( camera, usedNames );\n\n\tconst transform = buildMatrix( camera.matrix );\n\n\tif ( camera.matrix.determinant() < 0 ) {\n\n\t\tconsole.warn(\n\t\t\t'THREE.USDZExporter: USDZ does not support negative scales',\n\t\t\tcamera\n\t\t);\n\n\t}\n\n\tconst node = new USDNode( name, 'Camera' );\n\tnode.addProperty( `matrix4d xformOp:transform = ${transform}` );\n\tnode.addProperty( 'uniform token[] xformOpOrder = [\"xformOp:transform\"]' );\n\n\tconst projection = camera.isOrthographicCamera\n\t\t? 'orthographic'\n\t\t: 'perspective';\n\tnode.addProperty( `token projection = \"${projection}\"` );\n\n\tconst clippingRange = `(${camera.near.toPrecision(\n\t\tPRECISION\n\t)}, ${camera.far.toPrecision( PRECISION )})`;\n\tnode.addProperty( `float2 clippingRange = ${clippingRange}` );\n\n\tlet horizontalAperture;\n\tif ( camera.isOrthographicCamera ) {\n\n\t\thorizontalAperture = (\n\t\t\t( Math.abs( camera.left ) + Math.abs( camera.right ) ) *\n\t\t\t10\n\t\t).toPrecision( PRECISION );\n\n\t} else {\n\n\t\thorizontalAperture = camera.getFilmWidth().toPrecision( PRECISION );\n\n\t}\n\n\tnode.addProperty( `float horizontalAperture = ${horizontalAperture}` );\n\n\tlet verticalAperture;\n\tif ( camera.isOrthographicCamera ) {\n\n\t\tverticalAperture = (\n\t\t\t( Math.abs( camera.top ) + Math.abs( camera.bottom ) ) *\n\t\t\t10\n\t\t).toPrecision( PRECISION );\n\n\t} else {\n\n\t\tverticalAperture = camera.getFilmHeight().toPrecision( PRECISION );\n\n\t}\n\n\tnode.addProperty( `float verticalAperture = ${verticalAperture}` );\n\n\tif ( camera.isPerspectiveCamera ) {\n\n\t\tconst focalLength = camera.getFocalLength().toPrecision( PRECISION );\n\t\tnode.addProperty( `float focalLength = ${focalLength}` );\n\n\t\tconst focusDistance = camera.focus.toPrecision( PRECISION );\n\t\tnode.addProperty( `float focusDistance = ${focusDistance}` );\n\n\t}\n\n\treturn node;\n\n}\n\n/**\n * Export options of `USDZExporter`.\n *\n * @typedef {Object} USDZExporter~Options\n * @property {number} [maxTextureSize=1024] - The maximum texture size that is going to be exported.\n * @property {boolean} [includeAnchoringProperties=true] - Whether to include anchoring properties or not.\n * @property {boolean} [onlyVisible=true] - Export only visible 3D objects.\n * @property {Object} [ar] - If `includeAnchoringProperties` is set to `true`, the anchoring type and alignment\n * can be configured via `ar.anchoring.type` and `ar.planeAnchoring.alignment`.\n * @property {boolean} [quickLookCompatible=false] - Whether to make the exported USDZ compatible to QuickLook\n * which means the asset is modified to accommodate the bugs FB10036297 and FB11442287 (Apple Feedback).\n **/\n\n/**\n * onDone callback of `USDZExporter`.\n *\n * @callback USDZExporter~OnDone\n * @param {ArrayBuffer} result - The generated USDZ.\n */\n\n/**\n * onError callback of `USDZExporter`.\n *\n * @callback USDZExporter~OnError\n * @param {Error} error - The error object.\n */\n\nexport { USDZExporter };\n"],"x_google_ignoreList":[0],"mappings":"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"}
1
+ {"version":3,"file":"USDZExporter-B4hsiwhd.mjs","names":[],"sources":["../../../../node_modules/three/examples/jsm/exporters/USDZExporter.js"],"sourcesContent":["import {\n\tNoColorSpace,\n\tDoubleSide,\n\tColor,\n} from 'three';\n\nimport {\n\tstrToU8,\n\tzipSync,\n} from '../libs/fflate.module.js';\n\nclass USDNode {\n\n\tconstructor( name, type = '', metadata = [], properties = [] ) {\n\n\t\tthis.name = name;\n\t\tthis.type = type;\n\t\tthis.metadata = metadata;\n\t\tthis.properties = properties;\n\t\tthis.children = [];\n\n\t}\n\n\taddMetadata( key, value ) {\n\n\t\tthis.metadata.push( { key, value } );\n\n\t}\n\n\taddProperty( property, metadata = [] ) {\n\n\t\tthis.properties.push( { property, metadata } );\n\n\t}\n\n\taddChild( child ) {\n\n\t\tthis.children.push( child );\n\n\t}\n\n\ttoString( indent = 0 ) {\n\n\t\tconst pad = '\\t'.repeat( indent );\n\n\t\tconst formattedMetadata = this.metadata.map( ( item ) => {\n\n\t\t\tconst key = item.key;\n\t\t\tconst value = item.value;\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tconst lines = [];\n\t\t\t\tlines.push( `${key} = {` );\n\t\t\t\tvalue.forEach( ( line ) => {\n\n\t\t\t\t\tlines.push( `${pad}\\t\\t${line}` );\n\n\t\t\t\t} );\n\t\t\t\tlines.push( `${pad}\\t}` );\n\t\t\t\treturn lines.join( '\\n' );\n\n\t\t\t} else {\n\n\t\t\t\treturn `${key} = ${value}`;\n\n\t\t\t}\n\n\t\t} );\n\n\t\tconst meta = formattedMetadata.length\n\t\t\t? ` (\\n${formattedMetadata\n\t\t\t\t.map( ( l ) => `${pad}\\t${l}` )\n\t\t\t\t.join( '\\n' )}\\n${pad})`\n\t\t\t: '';\n\n\t\tconst properties = this.properties.map( ( l ) => {\n\n\t\t\tconst property = l.property;\n\t\t\tconst metadata = l.metadata.length\n\t\t\t\t? ` (\\n${l.metadata.map( ( m ) => `${pad}\\t\\t${m}` ).join( '\\n' )}\\n${pad}\\t)`\n\t\t\t\t: '';\n\t\t\treturn `${pad}\\t${property}${metadata}`;\n\n\t\t} );\n\t\tconst children = this.children.map( ( c ) => c.toString( indent + 1 ) );\n\n\t\tconst bodyLines = [];\n\n\t\tif ( properties.length > 0 ) {\n\n\t\t\tbodyLines.push( ...properties );\n\n\t\t}\n\n\t\tif ( children.length > 0 ) {\n\n\t\t\tif ( properties.length > 0 ) {\n\n\t\t\t\tbodyLines.push( '' );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tbodyLines.push( children[ i ] );\n\t\t\t\tif ( i < children.length - 1 ) {\n\n\t\t\t\t\tbodyLines.push( '' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bodyContent = bodyLines.join( '\\n' );\n\n\t\tconst type = this.type ? this.type + ' ' : '';\n\n\t\treturn `${pad}def ${type}\"${this.name}\"${meta}\\n${pad}{\\n${bodyContent}\\n${pad}}`;\n\n\t}\n\n}\n\n/**\n * An exporter for USDZ.\n *\n * ```js\n * const exporter = new USDZExporter();\n * const arraybuffer = await exporter.parseAsync( scene );\n * ```\n *\n * @three_import import { USDZExporter } from 'three/addons/exporters/USDZExporter.js';\n */\nclass USDZExporter {\n\n\t/**\n\t * Constructs a new USDZ exporter.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A reference to a texture utils module.\n\t\t *\n\t\t * @type {?(WebGLTextureUtils|WebGPUTextureUtils)}\n\t\t * @default null\n\t\t */\n\t\tthis.textureUtils = null;\n\n\t}\n\n\t/**\n\t * Sets the texture utils for this exporter. Only relevant when compressed textures have to be exported.\n\t *\n\t * Depending on whether you use {@link WebGLRenderer} or {@link WebGPURenderer}, you must inject the\n\t * corresponding texture utils {@link WebGLTextureUtils} or {@link WebGPUTextureUtils}.\n\t *\n\t * @param {WebGLTextureUtils|WebGPUTextureUtils} utils - The texture utils.\n\t */\n\tsetTextureUtils( utils ) {\n\n\t\tthis.textureUtils = utils;\n\n\t}\n\n\t/**\n\t * Parse the given 3D object and generates the USDZ output.\n\t *\n\t * @param {Object3D} scene - The 3D object to export.\n\t * @param {USDZExporter~OnDone} onDone - A callback function that is executed when the export has finished.\n\t * @param {USDZExporter~OnError} onError - A callback function that is executed when an error happens.\n\t * @param {USDZExporter~Options} options - The export options.\n\t */\n\tparse( scene, onDone, onError, options ) {\n\n\t\tthis.parseAsync( scene, options ).then( onDone ).catch( onError );\n\n\t}\n\n\t/**\n\t * Async version of {@link USDZExporter#parse}.\n\t *\n\t * @async\n\t * @param {Object3D} scene - The 3D object to export.\n\t * @param {USDZExporter~Options} options - The export options.\n\t * @return {Promise<ArrayBuffer>} A Promise that resolved with the exported USDZ data.\n\t */\n\tasync parseAsync( scene, options = {} ) {\n\n\t\toptions = Object.assign(\n\t\t\t{\n\t\t\t\tar: {\n\t\t\t\t\tanchoring: { type: 'plane' },\n\t\t\t\t\tplaneAnchoring: { alignment: 'horizontal' },\n\t\t\t\t},\n\t\t\t\tincludeAnchoringProperties: true,\n\t\t\t\tonlyVisible: true,\n\t\t\t\tquickLookCompatible: false,\n\t\t\t\tmaxTextureSize: 1024,\n\t\t\t},\n\t\t\toptions\n\t\t);\n\n\t\tconst usedNames = new Set();\n\n\t\tconst files = {};\n\t\tconst modelFileName = 'model.usda';\n\n\t\t// model file should be first in USDZ archive so we init it here\n\t\tfiles[ modelFileName ] = null;\n\n\t\tconst root = new USDNode( 'Root', 'Xform' );\n\t\tconst scenesNode = new USDNode( 'Scenes', 'Scope' );\n\t\tscenesNode.addMetadata( 'kind', '\"sceneLibrary\"' );\n\t\troot.addChild( scenesNode );\n\n\t\tconst sceneName = 'Scene';\n\t\tconst sceneNode = new USDNode( sceneName, 'Xform' );\n\t\tsceneNode.addMetadata( 'customData', [\n\t\t\t'bool preliminary_collidesWithEnvironment = 0',\n\t\t\t`string sceneName = \"${sceneName}\"`,\n\t\t] );\n\t\tsceneNode.addMetadata( 'sceneName', `\"${sceneName}\"` );\n\t\tif ( options.includeAnchoringProperties ) {\n\n\t\t\tsceneNode.addProperty(\n\t\t\t\t`token preliminary:anchoring:type = \"${options.ar.anchoring.type}\"`\n\t\t\t);\n\t\t\tsceneNode.addProperty(\n\t\t\t\t`token preliminary:planeAnchoring:alignment = \"${options.ar.planeAnchoring.alignment}\"`\n\t\t\t);\n\n\t\t}\n\n\t\tscenesNode.addChild( sceneNode );\n\n\t\tlet output;\n\n\t\tconst materials = {};\n\t\tconst textures = {};\n\n\t\tbuildHierarchy( scene, sceneNode, materials, usedNames, files, options );\n\n\t\tconst materialsNode = buildMaterials(\n\t\t\tmaterials,\n\t\t\ttextures,\n\t\t\toptions.quickLookCompatible\n\t\t);\n\n\t\toutput =\n\t\t\tbuildHeader() +\n\t\t\t'\\n' +\n\t\t\troot.toString() +\n\t\t\t'\\n\\n' +\n\t\t\tmaterialsNode.toString();\n\n\t\tfiles[ modelFileName ] = strToU8( output );\n\t\toutput = null;\n\n\t\tfor ( const id in textures ) {\n\n\t\t\tlet texture = textures[ id ];\n\n\t\t\tif ( texture.isCompressedTexture === true ) {\n\n\t\t\t\tif ( this.textureUtils === null ) {\n\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'THREE.USDZExporter: setTextureUtils() must be called to process compressed textures.'\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture = await this.textureUtils.decompress( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst canvas = imageToCanvas(\n\t\t\t\ttexture.image,\n\t\t\t\ttexture.flipY,\n\t\t\t\toptions.maxTextureSize\n\t\t\t);\n\t\t\tconst blob = await new Promise( ( resolve ) =>\n\t\t\t\tcanvas.toBlob( resolve, 'image/png', 1 )\n\t\t\t);\n\n\t\t\tfiles[ `textures/Texture_${id}.png` ] = new Uint8Array(\n\t\t\t\tawait blob.arrayBuffer()\n\t\t\t);\n\n\t\t}\n\n\t\t// 64 byte alignment\n\t\t// https://github.com/101arrowz/fflate/issues/39#issuecomment-777263109\n\n\t\tlet offset = 0;\n\n\t\tfor ( const filename in files ) {\n\n\t\t\tconst file = files[ filename ];\n\t\t\tconst headerSize = 34 + filename.length;\n\n\t\t\toffset += headerSize;\n\n\t\t\tconst offsetMod64 = offset & 63;\n\n\t\t\tif ( offsetMod64 !== 4 ) {\n\n\t\t\t\tconst padLength = 64 - offsetMod64;\n\t\t\t\tconst padding = new Uint8Array( padLength );\n\n\t\t\t\tfiles[ filename ] = [ file, { extra: { 12345: padding } } ];\n\n\t\t\t}\n\n\t\t\toffset = file.length;\n\n\t\t}\n\n\t\treturn zipSync( files, { level: 0 } );\n\n\t}\n\n}\n\nfunction getName( object, namesSet ) {\n\n\tlet name = object.name;\n\tname = name.replace( /[^A-Za-z0-9_]/g, '' );\n\tif ( /^[0-9]/.test( name ) ) {\n\n\t\tname = '_' + name;\n\n\t}\n\n\tif ( name === '' ) {\n\n\t\tif ( object.isCamera ) {\n\n\t\t\tname = 'Camera';\n\n\t\t} else {\n\n\t\t\tname = 'Object';\n\n\t\t}\n\n\t}\n\n\tif ( namesSet.has( name ) ) {\n\n\t\tname = name + '_' + object.id;\n\n\t}\n\n\tnamesSet.add( name );\n\n\treturn name;\n\n}\n\nfunction imageToCanvas( image, flipY, maxTextureSize ) {\n\n\tif (\n\t\t( typeof HTMLImageElement !== 'undefined' &&\n\t\t\timage instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' &&\n\t\t\timage instanceof HTMLCanvasElement ) ||\n\t\t( typeof OffscreenCanvas !== 'undefined' &&\n\t\t\timage instanceof OffscreenCanvas ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap )\n\t) {\n\n\t\tconst scale = maxTextureSize / Math.max( image.width, image.height );\n\n\t\tconst canvas = document.createElement( 'canvas' );\n\t\tcanvas.width = image.width * Math.min( 1, scale );\n\t\tcanvas.height = image.height * Math.min( 1, scale );\n\n\t\tconst context = canvas.getContext( '2d' );\n\n\t\t// TODO: We should be able to do this in the UsdTransform2d?\n\n\t\tif ( flipY === true ) {\n\n\t\t\tcontext.translate( 0, canvas.height );\n\t\t\tcontext.scale( 1, - 1 );\n\n\t\t}\n\n\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\treturn canvas;\n\n\t} else {\n\n\t\tthrow new Error(\n\t\t\t'THREE.USDZExporter: No valid image data found. Unable to process texture.'\n\t\t);\n\n\t}\n\n}\n\n//\n\nconst PRECISION = 7;\n\nfunction buildHeader() {\n\n\treturn `#usda 1.0\n(\n\tcustomLayerData = {\n\t\tstring creator = \"Three.js USDZExporter\"\n\t}\n\tdefaultPrim = \"Root\"\n\tmetersPerUnit = 1\n\tupAxis = \"Y\"\n)\n`;\n\n}\n\n// Xform\n\nfunction buildHierarchy( object, parentNode, materials, usedNames, files, options ) {\n\n\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\tconst child = object.children[ i ];\n\n\t\tif ( child.visible === false && options.onlyVisible === true ) continue;\n\n\t\tlet childNode;\n\n\t\tif ( child.isMesh ) {\n\n\t\t\tconst geometry = child.geometry;\n\t\t\tconst material = child.material;\n\n\t\t\tif ( material.isMeshStandardMaterial ) {\n\n\t\t\t\tconst geometryFileName = 'geometries/Geometry_' + geometry.id + '.usda';\n\n\t\t\t\tif ( ! ( geometryFileName in files ) ) {\n\n\t\t\t\t\tconst meshObject = buildMeshObject( geometry );\n\t\t\t\t\tfiles[ geometryFileName ] = strToU8(\n\t\t\t\t\t\tbuildHeader() + '\\n' + meshObject.toString()\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( material.uuid in materials ) ) {\n\n\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t}\n\n\t\t\t\tchildNode = buildMesh(\n\t\t\t\t\tchild,\n\t\t\t\t\tgeometry,\n\t\t\t\t\tmaterials[ material.uuid ],\n\t\t\t\t\tusedNames\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'THREE.USDZExporter: Unsupported material type (USDZ only supports MeshStandardMaterial)',\n\t\t\t\t\tchild\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t} else if ( child.isCamera ) {\n\n\t\t\tchildNode = buildCamera( child, usedNames );\n\n\t\t} else {\n\n\t\t\tchildNode = buildXform( child, usedNames );\n\n\t\t}\n\n\t\tif ( childNode ) {\n\n\t\t\tparentNode.addChild( childNode );\n\t\t\tbuildHierarchy( child, childNode, materials, usedNames, files, options );\n\n\t\t}\n\n\t}\n\n}\n\nfunction buildXform( object, usedNames ) {\n\n\tconst name = getName( object, usedNames );\n\n\tif ( object.matrix.determinant() < 0 ) {\n\n\t\tconsole.warn(\n\t\t\t'THREE.USDZExporter: USDZ does not support negative scales',\n\t\t\tobject\n\t\t);\n\n\t}\n\n\tconst node = new USDNode( name, 'Xform' );\n\n\tif ( object.pivot !== null ) {\n\n\t\t// Export with pivot using separate transform ops\n\t\tconst p = object.position;\n\t\tconst q = object.quaternion;\n\t\tconst s = object.scale;\n\t\tconst piv = object.pivot;\n\n\t\tnode.addProperty( `float3 xformOp:translate = (${p.x.toPrecision( PRECISION )}, ${p.y.toPrecision( PRECISION )}, ${p.z.toPrecision( PRECISION )})` );\n\t\tnode.addProperty( `float3 xformOp:translate:pivot = (${piv.x.toPrecision( PRECISION )}, ${piv.y.toPrecision( PRECISION )}, ${piv.z.toPrecision( PRECISION )})` );\n\t\tnode.addProperty( `quatf xformOp:orient = (${q.w.toPrecision( PRECISION )}, ${q.x.toPrecision( PRECISION )}, ${q.y.toPrecision( PRECISION )}, ${q.z.toPrecision( PRECISION )})` );\n\t\tnode.addProperty( `float3 xformOp:scale = (${s.x.toPrecision( PRECISION )}, ${s.y.toPrecision( PRECISION )}, ${s.z.toPrecision( PRECISION )})` );\n\t\tnode.addProperty( 'uniform token[] xformOpOrder = [\"xformOp:translate\", \"xformOp:translate:pivot\", \"xformOp:orient\", \"xformOp:scale\", \"!invert!xformOp:translate:pivot\"]' );\n\n\t} else {\n\n\t\t// Export as single transform matrix\n\t\tconst transform = buildMatrix( object.matrix );\n\t\tnode.addProperty( `matrix4d xformOp:transform = ${transform}` );\n\t\tnode.addProperty( 'uniform token[] xformOpOrder = [\"xformOp:transform\"]' );\n\n\t}\n\n\treturn node;\n\n}\n\nfunction buildMesh( object, geometry, material, usedNames ) {\n\n\tconst node = buildXform( object, usedNames );\n\n\tnode.addMetadata(\n\t\t'prepend references',\n\t\t`@./geometries/Geometry_${geometry.id}.usda@</Geometry>`\n\t);\n\tnode.addMetadata( 'prepend apiSchemas', '[\"MaterialBindingAPI\"]' );\n\n\tnode.addProperty(\n\t\t`rel material:binding = </Materials/Material_${material.id}>`\n\t);\n\n\treturn node;\n\n}\n\nfunction buildMatrix( matrix ) {\n\n\tconst array = matrix.elements;\n\n\treturn `( ${buildMatrixRow( array, 0 )}, ${buildMatrixRow(\n\t\tarray,\n\t\t4\n\t)}, ${buildMatrixRow( array, 8 )}, ${buildMatrixRow( array, 12 )} )`;\n\n}\n\nfunction buildMatrixRow( array, offset ) {\n\n\treturn `(${array[ offset + 0 ]}, ${array[ offset + 1 ]}, ${array[ offset + 2 ]}, ${\n\t\tarray[ offset + 3 ]\n\t})`;\n\n}\n\n// Mesh\n\nfunction buildMeshObject( geometry ) {\n\n\tconst node = new USDNode( 'Geometry' );\n\n\tconst meshNode = buildMeshNode( geometry );\n\tnode.addChild( meshNode );\n\n\treturn node;\n\n}\n\nfunction buildMeshNode( geometry ) {\n\n\tconst name = 'Geometry';\n\tconst attributes = geometry.attributes;\n\tconst count = attributes.position.count;\n\n\tconst node = new USDNode( name, 'Mesh' );\n\n\tnode.addProperty(\n\t\t`int[] faceVertexCounts = [${buildMeshVertexCount( geometry )}]`\n\t);\n\tnode.addProperty(\n\t\t`int[] faceVertexIndices = [${buildMeshVertexIndices( geometry )}]`\n\t);\n\tnode.addProperty(\n\t\t`normal3f[] normals = [${buildVector3Array( attributes.normal, count )}]`,\n\t\t[ 'interpolation = \"vertex\"' ]\n\t);\n\tnode.addProperty(\n\t\t`point3f[] points = [${buildVector3Array( attributes.position, count )}]`\n\t);\n\n\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\tconst id = i > 0 ? i : '';\n\t\tconst attribute = attributes[ 'uv' + id ];\n\t\tif ( attribute !== undefined ) {\n\n\t\t\tnode.addProperty(\n\t\t\t\t`texCoord2f[] primvars:st${id} = [${buildVector2Array( attribute )}]`,\n\t\t\t\t[ 'interpolation = \"vertex\"' ]\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\tconst colorAttribute = attributes.color;\n\tif ( colorAttribute !== undefined ) {\n\n\t\tnode.addProperty(\n\t\t\t`color3f[] primvars:displayColor = [${buildVector3Array(\n\t\t\t\tcolorAttribute,\n\t\t\t\tcount\n\t\t\t)}]`,\n\t\t\t[ 'interpolation = \"vertex\"' ]\n\t\t);\n\n\t}\n\n\tnode.addProperty( 'uniform token subdivisionScheme = \"none\"' );\n\n\treturn node;\n\n}\n\nfunction buildMeshVertexCount( geometry ) {\n\n\tconst count =\n\t\tgeometry.index !== null\n\t\t\t? geometry.index.count\n\t\t\t: geometry.attributes.position.count;\n\n\treturn Array( count / 3 )\n\t\t.fill( 3 )\n\t\t.join( ', ' );\n\n}\n\nfunction buildMeshVertexIndices( geometry ) {\n\n\tconst index = geometry.index;\n\tconst array = [];\n\n\tif ( index !== null ) {\n\n\t\tfor ( let i = 0; i < index.count; i ++ ) {\n\n\t\t\tarray.push( index.getX( i ) );\n\n\t\t}\n\n\t} else {\n\n\t\tconst length = geometry.attributes.position.count;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tarray.push( i );\n\n\t\t}\n\n\t}\n\n\treturn array.join( ', ' );\n\n}\n\nfunction buildVector3Array( attribute, count ) {\n\n\tif ( attribute === undefined ) {\n\n\t\tconsole.warn( 'USDZExporter: Normals missing.' );\n\t\treturn Array( count ).fill( '(0, 0, 0)' ).join( ', ' );\n\n\t}\n\n\tconst array = [];\n\n\tfor ( let i = 0; i < attribute.count; i ++ ) {\n\n\t\tconst x = attribute.getX( i );\n\t\tconst y = attribute.getY( i );\n\t\tconst z = attribute.getZ( i );\n\n\t\tarray.push(\n\t\t\t`(${x.toPrecision( PRECISION )}, ${y.toPrecision(\n\t\t\t\tPRECISION\n\t\t\t)}, ${z.toPrecision( PRECISION )})`\n\t\t);\n\n\t}\n\n\treturn array.join( ', ' );\n\n}\n\nfunction buildVector2Array( attribute ) {\n\n\tconst array = [];\n\n\tfor ( let i = 0; i < attribute.count; i ++ ) {\n\n\t\tconst x = attribute.getX( i );\n\t\tconst y = attribute.getY( i );\n\n\t\tarray.push(\n\t\t\t`(${x.toPrecision( PRECISION )}, ${1 - y.toPrecision( PRECISION )})`\n\t\t);\n\n\t}\n\n\treturn array.join( ', ' );\n\n}\n\n// Materials\n\nfunction buildMaterials( materials, textures, quickLookCompatible = false ) {\n\n\tconst materialsNode = new USDNode( 'Materials' );\n\n\tfor ( const uuid in materials ) {\n\n\t\tconst material = materials[ uuid ];\n\n\t\tmaterialsNode.addChild(\n\t\t\tbuildMaterial( material, textures, quickLookCompatible )\n\t\t);\n\n\t}\n\n\treturn materialsNode;\n\n}\n\nfunction buildMaterial( material, textures, quickLookCompatible = false ) {\n\n\t// https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html\n\n\tconst materialNode = new USDNode( `Material_${material.id}`, 'Material' );\n\n\tfunction buildTextureNodes( texture, mapType, color ) {\n\n\t\tconst id = texture.source.id + '_' + texture.flipY;\n\n\t\ttextures[ id ] = texture;\n\n\t\tconst uv = texture.channel > 0 ? 'st' + texture.channel : 'st';\n\n\t\tconst WRAPPINGS = {\n\t\t\t1000: 'repeat', // RepeatWrapping\n\t\t\t1001: 'clamp', // ClampToEdgeWrapping\n\t\t\t1002: 'mirror', // MirroredRepeatWrapping\n\t\t};\n\n\t\tconst repeat = texture.repeat.clone();\n\t\tconst offset = texture.offset.clone();\n\t\tconst rotation = texture.rotation;\n\n\t\t// rotation is around the wrong point. after rotation we need to shift offset again so that we're rotating around the right spot\n\t\tconst xRotationOffset = Math.sin( rotation );\n\t\tconst yRotationOffset = Math.cos( rotation );\n\n\t\t// texture coordinates start in the opposite corner, need to correct\n\t\toffset.y = 1 - offset.y - repeat.y;\n\n\t\t// turns out QuickLook is buggy and interprets texture repeat inverted/applies operations in a different order.\n\t\t// Apple Feedback: \tFB10036297 and FB11442287\n\t\tif ( quickLookCompatible ) {\n\n\t\t\t// This is NOT correct yet in QuickLook, but comes close for a range of models.\n\t\t\t// It becomes more incorrect the bigger the offset is\n\n\t\t\toffset.x = offset.x / repeat.x;\n\t\t\toffset.y = offset.y / repeat.y;\n\n\t\t\toffset.x += xRotationOffset / repeat.x;\n\t\t\toffset.y += yRotationOffset - 1;\n\n\t\t} else {\n\n\t\t\t// results match glTF results exactly. verified correct in usdview.\n\t\t\toffset.x += xRotationOffset * repeat.x;\n\t\t\toffset.y += ( 1 - yRotationOffset ) * repeat.y;\n\n\t\t}\n\n\t\tconst primvarReaderNode = new USDNode( `PrimvarReader_${mapType}`, 'Shader' );\n\t\tprimvarReaderNode.addProperty(\n\t\t\t'uniform token info:id = \"UsdPrimvarReader_float2\"'\n\t\t);\n\t\tprimvarReaderNode.addProperty( 'float2 inputs:fallback = (0.0, 0.0)' );\n\t\tprimvarReaderNode.addProperty( `string inputs:varname = \"${uv}\"` );\n\t\tprimvarReaderNode.addProperty( 'float2 outputs:result' );\n\n\t\tconst transform2dNode = new USDNode( `Transform2d_${mapType}`, 'Shader' );\n\t\ttransform2dNode.addProperty( 'uniform token info:id = \"UsdTransform2d\"' );\n\t\ttransform2dNode.addProperty(\n\t\t\t`float2 inputs:in.connect = </Materials/Material_${material.id}/PrimvarReader_${mapType}.outputs:result>`\n\t\t);\n\t\ttransform2dNode.addProperty(\n\t\t\t`float inputs:rotation = ${( rotation * ( 180 / Math.PI ) ).toFixed(\n\t\t\t\tPRECISION\n\t\t\t)}`\n\t\t);\n\t\ttransform2dNode.addProperty(\n\t\t\t`float2 inputs:scale = ${buildVector2( repeat )}`\n\t\t);\n\t\ttransform2dNode.addProperty(\n\t\t\t`float2 inputs:translation = ${buildVector2( offset )}`\n\t\t);\n\t\ttransform2dNode.addProperty( 'float2 outputs:result' );\n\n\t\tconst textureNode = new USDNode(\n\t\t\t`Texture_${texture.id}_${mapType}`,\n\t\t\t'Shader'\n\t\t);\n\t\ttextureNode.addProperty( 'uniform token info:id = \"UsdUVTexture\"' );\n\t\ttextureNode.addProperty( `asset inputs:file = @textures/Texture_${id}.png@` );\n\t\ttextureNode.addProperty(\n\t\t\t`float2 inputs:st.connect = </Materials/Material_${material.id}/Transform2d_${mapType}.outputs:result>`\n\t\t);\n\n\t\tif ( color !== undefined ) {\n\n\t\t\ttextureNode.addProperty( `float4 inputs:scale = ${buildColor4( color )}` );\n\n\t\t}\n\n\t\tif ( mapType === 'normal' ) {\n\n\t\t\ttextureNode.addProperty( 'float4 inputs:scale = (2, 2, 2, 1)' );\n\t\t\ttextureNode.addProperty( 'float4 inputs:bias = (-1, -1, -1, 0)' );\n\n\t\t}\n\n\t\ttextureNode.addProperty(\n\t\t\t`token inputs:sourceColorSpace = \"${\n\t\t\t\ttexture.colorSpace === NoColorSpace ? 'raw' : 'sRGB'\n\t\t\t}\"`\n\t\t);\n\t\ttextureNode.addProperty(\n\t\t\t`token inputs:wrapS = \"${WRAPPINGS[ texture.wrapS ]}\"`\n\t\t);\n\t\ttextureNode.addProperty(\n\t\t\t`token inputs:wrapT = \"${WRAPPINGS[ texture.wrapT ]}\"`\n\t\t);\n\t\ttextureNode.addProperty( 'float outputs:r' );\n\t\ttextureNode.addProperty( 'float outputs:g' );\n\t\ttextureNode.addProperty( 'float outputs:b' );\n\t\ttextureNode.addProperty( 'float3 outputs:rgb' );\n\n\t\tif ( material.transparent || material.alphaTest > 0.0 ) {\n\n\t\t\ttextureNode.addProperty( 'float outputs:a' );\n\n\t\t}\n\n\t\treturn [ primvarReaderNode, transform2dNode, textureNode ];\n\n\t}\n\n\tif ( material.side === DoubleSide ) {\n\n\t\tconsole.warn(\n\t\t\t'THREE.USDZExporter: USDZ does not support double sided materials',\n\t\t\tmaterial\n\t\t);\n\n\t}\n\n\tconst previewSurfaceNode = new USDNode( 'PreviewSurface', 'Shader' );\n\tpreviewSurfaceNode.addProperty( 'uniform token info:id = \"UsdPreviewSurface\"' );\n\n\tif ( material.map !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`color3f inputs:diffuseColor.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:rgb>`\n\t\t);\n\n\t\tif ( material.transparent ) {\n\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:a>`\n\t\t\t);\n\n\t\t} else if ( material.alphaTest > 0.0 ) {\n\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:a>`\n\t\t\t);\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:opacityThreshold = ${material.alphaTest}`\n\t\t\t);\n\n\t\t}\n\n\t\tconst textureNodes = buildTextureNodes(\n\t\t\tmaterial.map,\n\t\t\t'diffuse',\n\t\t\tmaterial.color\n\t\t);\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t} else {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`color3f inputs:diffuseColor = ${buildColor( material.color )}`\n\t\t);\n\n\t}\n\n\tif ( material.emissiveMap !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`color3f inputs:emissiveColor.connect = </Materials/Material_${material.id}/Texture_${material.emissiveMap.id}_emissive.outputs:rgb>`\n\t\t);\n\n\t\tconst emissiveColor = new Color(\n\t\t\tmaterial.emissive.r * material.emissiveIntensity,\n\t\t\tmaterial.emissive.g * material.emissiveIntensity,\n\t\t\tmaterial.emissive.b * material.emissiveIntensity\n\t\t);\n\t\tconst textureNodes = buildTextureNodes(\n\t\t\tmaterial.emissiveMap,\n\t\t\t'emissive',\n\t\t\temissiveColor\n\t\t);\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t} else if ( material.emissive.getHex() > 0 ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`color3f inputs:emissiveColor = ${buildColor( material.emissive )}`\n\t\t);\n\n\t}\n\n\tif ( material.normalMap !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`normal3f inputs:normal.connect = </Materials/Material_${material.id}/Texture_${material.normalMap.id}_normal.outputs:rgb>`\n\t\t);\n\n\t\tconst textureNodes = buildTextureNodes( material.normalMap, 'normal' );\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t}\n\n\tif ( material.aoMap !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:occlusion.connect = </Materials/Material_${material.id}/Texture_${material.aoMap.id}_occlusion.outputs:r>`\n\t\t);\n\n\t\tconst aoColor = new Color(\n\t\t\tmaterial.aoMapIntensity,\n\t\t\tmaterial.aoMapIntensity,\n\t\t\tmaterial.aoMapIntensity\n\t\t);\n\t\tconst textureNodes = buildTextureNodes(\n\t\t\tmaterial.aoMap,\n\t\t\t'occlusion',\n\t\t\taoColor\n\t\t);\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t}\n\n\tif ( material.roughnessMap !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:roughness.connect = </Materials/Material_${material.id}/Texture_${material.roughnessMap.id}_roughness.outputs:g>`\n\t\t);\n\n\t\tconst roughnessColor = new Color(\n\t\t\tmaterial.roughness,\n\t\t\tmaterial.roughness,\n\t\t\tmaterial.roughness\n\t\t);\n\t\tconst textureNodes = buildTextureNodes(\n\t\t\tmaterial.roughnessMap,\n\t\t\t'roughness',\n\t\t\troughnessColor\n\t\t);\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t} else {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:roughness = ${material.roughness}`\n\t\t);\n\n\t}\n\n\tif ( material.metalnessMap !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:metallic.connect = </Materials/Material_${material.id}/Texture_${material.metalnessMap.id}_metallic.outputs:b>`\n\t\t);\n\n\t\tconst metalnessColor = new Color(\n\t\t\tmaterial.metalness,\n\t\t\tmaterial.metalness,\n\t\t\tmaterial.metalness\n\t\t);\n\t\tconst textureNodes = buildTextureNodes(\n\t\t\tmaterial.metalnessMap,\n\t\t\t'metallic',\n\t\t\tmetalnessColor\n\t\t);\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t} else {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:metallic = ${material.metalness}`\n\t\t);\n\n\t}\n\n\tif ( material.alphaMap !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.alphaMap.id}_opacity.outputs:r>`\n\t\t);\n\t\tpreviewSurfaceNode.addProperty( 'float inputs:opacityThreshold = 0.0001' );\n\n\t\tconst textureNodes = buildTextureNodes( material.alphaMap, 'opacity' );\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t} else {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:opacity = ${material.opacity}`\n\t\t);\n\n\t}\n\n\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\tif ( material.clearcoatMap !== null ) {\n\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:clearcoat.connect = </Materials/Material_${material.id}/Texture_${material.clearcoatMap.id}_clearcoat.outputs:r>`\n\t\t\t);\n\n\t\t\tconst clearcoatColor = new Color(\n\t\t\t\tmaterial.clearcoat,\n\t\t\t\tmaterial.clearcoat,\n\t\t\t\tmaterial.clearcoat\n\t\t\t);\n\t\t\tconst textureNodes = buildTextureNodes(\n\t\t\t\tmaterial.clearcoatMap,\n\t\t\t\t'clearcoat',\n\t\t\t\tclearcoatColor\n\t\t\t);\n\t\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t\t} else {\n\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:clearcoat = ${material.clearcoat}`\n\t\t\t);\n\n\t\t}\n\n\t\tif ( material.clearcoatRoughnessMap !== null ) {\n\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:clearcoatRoughness.connect = </Materials/Material_${material.id}/Texture_${material.clearcoatRoughnessMap.id}_clearcoatRoughness.outputs:g>`\n\t\t\t);\n\n\t\t\tconst clearcoatRoughnessColor = new Color(\n\t\t\t\tmaterial.clearcoatRoughness,\n\t\t\t\tmaterial.clearcoatRoughness,\n\t\t\t\tmaterial.clearcoatRoughness\n\t\t\t);\n\t\t\tconst textureNodes = buildTextureNodes(\n\t\t\t\tmaterial.clearcoatRoughnessMap,\n\t\t\t\t'clearcoatRoughness',\n\t\t\t\tclearcoatRoughnessColor\n\t\t\t);\n\t\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t\t} else {\n\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:clearcoatRoughness = ${material.clearcoatRoughness}`\n\t\t\t);\n\n\t\t}\n\n\t\tpreviewSurfaceNode.addProperty( `float inputs:ior = ${material.ior}` );\n\n\t}\n\n\tpreviewSurfaceNode.addProperty( 'int inputs:useSpecularWorkflow = 0' );\n\tpreviewSurfaceNode.addProperty( 'token outputs:surface' );\n\n\tmaterialNode.addChild( previewSurfaceNode );\n\n\tmaterialNode.addProperty(\n\t\t`token outputs:surface.connect = </Materials/Material_${material.id}/PreviewSurface.outputs:surface>`\n\t);\n\n\treturn materialNode;\n\n}\n\nfunction buildColor( color ) {\n\n\treturn `(${color.r}, ${color.g}, ${color.b})`;\n\n}\n\nfunction buildColor4( color ) {\n\n\treturn `(${color.r}, ${color.g}, ${color.b}, 1.0)`;\n\n}\n\nfunction buildVector2( vector ) {\n\n\treturn `(${vector.x}, ${vector.y})`;\n\n}\n\nfunction buildCamera( camera, usedNames ) {\n\n\tconst name = getName( camera, usedNames );\n\n\tconst transform = buildMatrix( camera.matrix );\n\n\tif ( camera.matrix.determinant() < 0 ) {\n\n\t\tconsole.warn(\n\t\t\t'THREE.USDZExporter: USDZ does not support negative scales',\n\t\t\tcamera\n\t\t);\n\n\t}\n\n\tconst node = new USDNode( name, 'Camera' );\n\tnode.addProperty( `matrix4d xformOp:transform = ${transform}` );\n\tnode.addProperty( 'uniform token[] xformOpOrder = [\"xformOp:transform\"]' );\n\n\tconst projection = camera.isOrthographicCamera\n\t\t? 'orthographic'\n\t\t: 'perspective';\n\tnode.addProperty( `token projection = \"${projection}\"` );\n\n\tconst clippingRange = `(${camera.near.toPrecision(\n\t\tPRECISION\n\t)}, ${camera.far.toPrecision( PRECISION )})`;\n\tnode.addProperty( `float2 clippingRange = ${clippingRange}` );\n\n\tlet horizontalAperture;\n\tif ( camera.isOrthographicCamera ) {\n\n\t\thorizontalAperture = (\n\t\t\t( Math.abs( camera.left ) + Math.abs( camera.right ) ) *\n\t\t\t10\n\t\t).toPrecision( PRECISION );\n\n\t} else {\n\n\t\thorizontalAperture = camera.getFilmWidth().toPrecision( PRECISION );\n\n\t}\n\n\tnode.addProperty( `float horizontalAperture = ${horizontalAperture}` );\n\n\tlet verticalAperture;\n\tif ( camera.isOrthographicCamera ) {\n\n\t\tverticalAperture = (\n\t\t\t( Math.abs( camera.top ) + Math.abs( camera.bottom ) ) *\n\t\t\t10\n\t\t).toPrecision( PRECISION );\n\n\t} else {\n\n\t\tverticalAperture = camera.getFilmHeight().toPrecision( PRECISION );\n\n\t}\n\n\tnode.addProperty( `float verticalAperture = ${verticalAperture}` );\n\n\tif ( camera.isPerspectiveCamera ) {\n\n\t\tconst focalLength = camera.getFocalLength().toPrecision( PRECISION );\n\t\tnode.addProperty( `float focalLength = ${focalLength}` );\n\n\t\tconst focusDistance = camera.focus.toPrecision( PRECISION );\n\t\tnode.addProperty( `float focusDistance = ${focusDistance}` );\n\n\t}\n\n\treturn node;\n\n}\n\n/**\n * Export options of `USDZExporter`.\n *\n * @typedef {Object} USDZExporter~Options\n * @property {number} [maxTextureSize=1024] - The maximum texture size that is going to be exported.\n * @property {boolean} [includeAnchoringProperties=true] - Whether to include anchoring properties or not.\n * @property {boolean} [onlyVisible=true] - Export only visible 3D objects.\n * @property {Object} [ar] - If `includeAnchoringProperties` is set to `true`, the anchoring type and alignment\n * can be configured via `ar.anchoring.type` and `ar.planeAnchoring.alignment`.\n * @property {boolean} [quickLookCompatible=false] - Whether to make the exported USDZ compatible to QuickLook\n * which means the asset is modified to accommodate the bugs FB10036297 and FB11442287 (Apple Feedback).\n **/\n\n/**\n * onDone callback of `USDZExporter`.\n *\n * @callback USDZExporter~OnDone\n * @param {ArrayBuffer} result - The generated USDZ.\n */\n\n/**\n * onError callback of `USDZExporter`.\n *\n * @callback USDZExporter~OnError\n * @param {Error} error - The error object.\n */\n\nexport { USDZExporter };\n"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { l as e } from "./main-CtVIB52l.mjs";
1
+ import { I as e } from "./main-DMIVdAcT.mjs";
2
2
  //#region packages/homag-intelligence/src/api.ts
3
3
  var t = class {
4
4
  constructor(e) {
@@ -52,4 +52,4 @@ var t = class {
52
52
  //#endregion
53
53
  export { t };
54
54
 
55
- //# sourceMappingURL=api-xDJ-Uyom.mjs.map
55
+ //# sourceMappingURL=api-C2-6Jm5W.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-xDJ-Uyom.mjs","names":[],"sources":["../../packages/homag-intelligence/src/api.ts"],"sourcesContent":["import type { RoomDesignerRequests } from './glue-logic';\nimport type { MasterData, PosGroup } from './model/oc-scripts-domain.model';\nimport type { RoomlePlannerType } from '../../typings/external-objects';\nimport {\n HI_CONTEXT_ACTION,\n type LoadExternalObjectOptions,\n} from './external-object-api';\n\nexport interface ExternalObjectModuleIdMap {\n originalModuleId: string;\n newModuleId: string;\n}\n\nexport class RoomDesignerApi implements RoomDesignerRequests {\n private _roomlePlanner: RoomlePlannerType;\n\n constructor(roomlePlanner: RoomlePlannerType) {\n this._roomlePlanner = roomlePlanner;\n }\n\n public loadMasterData(masterData: MasterData) {\n this._roomlePlanner.loadExternalObjectMasterData(masterData);\n }\n\n public async loadPosGroups(\n posDataJson: PosGroup | PosGroup[],\n options: LoadExternalObjectOptions,\n ): Promise<void> {\n const posDataArray = Array.isArray(posDataJson)\n ? posDataJson\n : [posDataJson];\n await this._roomlePlanner.loadExternalObjectGroups(posDataArray, options);\n }\n\n completelyLoaded(): void {\n this._roomlePlanner.externalObjectsCompletelyLoaded();\n }\n\n public async selectGroup(groupId: string): Promise<void> {\n await this._roomlePlanner.selectExternalObject(\n groupId,\n null,\n HI_CONTEXT_ACTION.ROOM,\n );\n }\n\n public async selectRoot(rootModuleId: string): Promise<void> {\n await this._roomlePlanner.selectExternalObject(\n rootModuleId,\n null,\n HI_CONTEXT_ACTION.ISOLATION,\n );\n }\n\n public async selectModule(\n rootModuleId: string,\n subModuleId: string,\n ): Promise<void> {\n await this._roomlePlanner.selectExternalObject(\n rootModuleId,\n subModuleId,\n HI_CONTEXT_ACTION.ISOLATION,\n );\n }\n\n public openCloseGroup(\n groupOrRootModuleId: string,\n subModuleId: string | null,\n open: boolean,\n animate: boolean,\n ) {\n this._roomlePlanner.openOrCloseGeometryOfExternalObject(\n groupOrRootModuleId,\n subModuleId ?? null,\n open,\n animate,\n );\n return Promise.resolve();\n }\n\n public deleteGroup(groupId: string) {\n this._roomlePlanner.removeExternalObject(groupId);\n }\n\n public deleteRootModule(rootModuleId: string) {\n this._roomlePlanner.removeExternalObject(rootModuleId);\n }\n\n public async getPosDataOfAllGroups() {\n const groups =\n (await this._roomlePlanner.getExternalObjectGroups()) as PosGroup[];\n return groups;\n }\n\n public async getRoomInformation() {\n const rooms = await this._roomlePlanner.getExternalRoomInformation();\n return rooms;\n }\n\n public async saveExternalObjectSnapshot() {\n return this._roomlePlanner.saveExternalObjectSnapshot();\n }\n\n public async saveCurrentPlanSnapshot() {\n return this._roomlePlanner.saveCurrentPlanSnapshot();\n }\n\n public async renderPosDataImage(posDataJson: object) {\n const posDataArray = Array.isArray(posDataJson)\n ? posDataJson\n : [posDataJson];\n await this._roomlePlanner.renderImagesOfExternalObjectGroup(posDataArray);\n }\n}\n"],"mappings":";;AAaA,IAAa,IAAb,MAA6D;CAG3D,YAAY,GAAkC;AAC5C,OAAK,iBAAiB;;CAGxB,eAAsB,GAAwB;AAC5C,OAAK,eAAe,6BAA6B,EAAW;;CAG9D,MAAa,cACX,GACA,GACe;EACf,IAAM,IAAe,MAAM,QAAQ,EAAY,GAC3C,IACA,CAAC,EAAY;AACjB,QAAM,KAAK,eAAe,yBAAyB,GAAc,EAAQ;;CAG3E,mBAAyB;AACvB,OAAK,eAAe,iCAAiC;;CAGvD,MAAa,YAAY,GAAgC;AACvD,QAAM,KAAK,eAAe,qBACxB,GACA,MACA,EAAkB,KACnB;;CAGH,MAAa,WAAW,GAAqC;AAC3D,QAAM,KAAK,eAAe,qBACxB,GACA,MACA,EAAkB,UACnB;;CAGH,MAAa,aACX,GACA,GACe;AACf,QAAM,KAAK,eAAe,qBACxB,GACA,GACA,EAAkB,UACnB;;CAGH,eACE,GACA,GACA,GACA,GACA;AAOA,SANA,KAAK,eAAe,oCAClB,GACA,KAAe,MACf,GACA,EACD,EACM,QAAQ,SAAS;;CAG1B,YAAmB,GAAiB;AAClC,OAAK,eAAe,qBAAqB,EAAQ;;CAGnD,iBAAwB,GAAsB;AAC5C,OAAK,eAAe,qBAAqB,EAAa;;CAGxD,MAAa,wBAAwB;AAGnC,SADG,MAAM,KAAK,eAAe,yBAAyB;;CAIxD,MAAa,qBAAqB;AAEhC,SADc,MAAM,KAAK,eAAe,4BAA4B;;CAItE,MAAa,6BAA6B;AACxC,SAAO,KAAK,eAAe,4BAA4B;;CAGzD,MAAa,0BAA0B;AACrC,SAAO,KAAK,eAAe,yBAAyB;;CAGtD,MAAa,mBAAmB,GAAqB;EACnD,IAAM,IAAe,MAAM,QAAQ,EAAY,GAC3C,IACA,CAAC,EAAY;AACjB,QAAM,KAAK,eAAe,kCAAkC,EAAa"}
1
+ {"version":3,"file":"api-C2-6Jm5W.mjs","names":[],"sources":["../../packages/homag-intelligence/src/api.ts"],"sourcesContent":["import type { RoomDesignerRequests } from './glue-logic';\nimport type { MasterData, PosGroup } from './model/oc-scripts-domain.model';\nimport type { RoomlePlannerType } from '../../typings/external-objects';\nimport {\n HI_CONTEXT_ACTION,\n type LoadExternalObjectOptions,\n} from './external-object-api';\n\nexport interface ExternalObjectModuleIdMap {\n originalModuleId: string;\n newModuleId: string;\n}\n\nexport class RoomDesignerApi implements RoomDesignerRequests {\n private _roomlePlanner: RoomlePlannerType;\n\n constructor(roomlePlanner: RoomlePlannerType) {\n this._roomlePlanner = roomlePlanner;\n }\n\n public loadMasterData(masterData: MasterData) {\n this._roomlePlanner.loadExternalObjectMasterData(masterData);\n }\n\n public async loadPosGroups(\n posDataJson: PosGroup | PosGroup[],\n options: LoadExternalObjectOptions,\n ): Promise<void> {\n const posDataArray = Array.isArray(posDataJson)\n ? posDataJson\n : [posDataJson];\n await this._roomlePlanner.loadExternalObjectGroups(posDataArray, options);\n }\n\n completelyLoaded(): void {\n this._roomlePlanner.externalObjectsCompletelyLoaded();\n }\n\n public async selectGroup(groupId: string): Promise<void> {\n await this._roomlePlanner.selectExternalObject(\n groupId,\n null,\n HI_CONTEXT_ACTION.ROOM,\n );\n }\n\n public async selectRoot(rootModuleId: string): Promise<void> {\n await this._roomlePlanner.selectExternalObject(\n rootModuleId,\n null,\n HI_CONTEXT_ACTION.ISOLATION,\n );\n }\n\n public async selectModule(\n rootModuleId: string,\n subModuleId: string,\n ): Promise<void> {\n await this._roomlePlanner.selectExternalObject(\n rootModuleId,\n subModuleId,\n HI_CONTEXT_ACTION.ISOLATION,\n );\n }\n\n public openCloseGroup(\n groupOrRootModuleId: string,\n subModuleId: string | null,\n open: boolean,\n animate: boolean,\n ) {\n this._roomlePlanner.openOrCloseGeometryOfExternalObject(\n groupOrRootModuleId,\n subModuleId ?? null,\n open,\n animate,\n );\n return Promise.resolve();\n }\n\n public deleteGroup(groupId: string) {\n this._roomlePlanner.removeExternalObject(groupId);\n }\n\n public deleteRootModule(rootModuleId: string) {\n this._roomlePlanner.removeExternalObject(rootModuleId);\n }\n\n public async getPosDataOfAllGroups() {\n const groups =\n (await this._roomlePlanner.getExternalObjectGroups()) as PosGroup[];\n return groups;\n }\n\n public async getRoomInformation() {\n const rooms = await this._roomlePlanner.getExternalRoomInformation();\n return rooms;\n }\n\n public async saveExternalObjectSnapshot() {\n return this._roomlePlanner.saveExternalObjectSnapshot();\n }\n\n public async saveCurrentPlanSnapshot() {\n return this._roomlePlanner.saveCurrentPlanSnapshot();\n }\n\n public async renderPosDataImage(posDataJson: object) {\n const posDataArray = Array.isArray(posDataJson)\n ? posDataJson\n : [posDataJson];\n await this._roomlePlanner.renderImagesOfExternalObjectGroup(posDataArray);\n }\n}\n"],"mappings":";;AAaA,IAAa,IAAb,MAA6D;CAG3D,YAAY,GAAkC;AAC5C,OAAK,iBAAiB;;CAGxB,eAAsB,GAAwB;AAC5C,OAAK,eAAe,6BAA6B,EAAW;;CAG9D,MAAa,cACX,GACA,GACe;EACf,IAAM,IAAe,MAAM,QAAQ,EAAY,GAC3C,IACA,CAAC,EAAY;AACjB,QAAM,KAAK,eAAe,yBAAyB,GAAc,EAAQ;;CAG3E,mBAAyB;AACvB,OAAK,eAAe,iCAAiC;;CAGvD,MAAa,YAAY,GAAgC;AACvD,QAAM,KAAK,eAAe,qBACxB,GACA,MACA,EAAkB,KACnB;;CAGH,MAAa,WAAW,GAAqC;AAC3D,QAAM,KAAK,eAAe,qBACxB,GACA,MACA,EAAkB,UACnB;;CAGH,MAAa,aACX,GACA,GACe;AACf,QAAM,KAAK,eAAe,qBACxB,GACA,GACA,EAAkB,UACnB;;CAGH,eACE,GACA,GACA,GACA,GACA;AAOA,SANA,KAAK,eAAe,oCAClB,GACA,KAAe,MACf,GACA,EACD,EACM,QAAQ,SAAS;;CAG1B,YAAmB,GAAiB;AAClC,OAAK,eAAe,qBAAqB,EAAQ;;CAGnD,iBAAwB,GAAsB;AAC5C,OAAK,eAAe,qBAAqB,EAAa;;CAGxD,MAAa,wBAAwB;AAGnC,SADG,MAAM,KAAK,eAAe,yBAAyB;;CAIxD,MAAa,qBAAqB;AAEhC,SADc,MAAM,KAAK,eAAe,4BAA4B;;CAItE,MAAa,6BAA6B;AACxC,SAAO,KAAK,eAAe,4BAA4B;;CAGzD,MAAa,0BAA0B;AACrC,SAAO,KAAK,eAAe,yBAAyB;;CAGtD,MAAa,mBAAmB,GAAqB;EACnD,IAAM,IAAe,MAAM,QAAQ,EAAY,GAC3C,IACA,CAAC,EAAY;AACjB,QAAM,KAAK,eAAe,kCAAkC,EAAa"}
@@ -1,6 +1,6 @@
1
- import { Rr as e } from "./three.core-CLIofecG.mjs";
2
- import { n as t, r as n, t as r } from "./decorate-C1QnXPYw.mjs";
3
- import { n as i } from "./plugin-system-D9K46xJk.mjs";
1
+ import { xi as e } from "./three.core-mM-jZdgg.mjs";
2
+ import { n as t, r as n, t as r } from "./decorate-BIflHDAa.mjs";
3
+ import { n as i } from "./plugin-system-XhOJU1MI.mjs";
4
4
  //#region packages/configurator-core/public/geometry/banana.glb?no-inline?url
5
5
  var a = "" + new URL("banana.glb", import.meta.url).href, o = class extends i {
6
6
  setScene(e) {
@@ -33,4 +33,4 @@ r([n, t("design:type", Object)], o.prototype, "_staticItemLoader", void 0);
33
33
  //#endregion
34
34
  export { o as default };
35
35
 
36
- //# sourceMappingURL=banana-for-scale-C_iNmlCT.mjs.map
36
+ //# sourceMappingURL=banana-for-scale-BV_na-g3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banana-for-scale-BV_na-g3.mjs","names":[],"sources":["../../packages/configurator-core/public/geometry/banana.glb?no-inline?url","../../packages/configurator-core/src/webgl/banana-for-scale.ts"],"sourcesContent":["export default \"__VITE_ASSET__rN_1li4k2aIbHGs0zKW8QQ__\"","import inject from '../../../common-core/src/di/inject';\nimport type StaticItemLoader from '../../../common-core/src/webgl/static-item-loader';\nimport { ScenePluginDefaultImplementation } from './plugin-system';\nimport { BANANA_FILE_NAME } from '../static-files/geometries';\nimport type { Box3, Object3D, Scene } from 'three';\nimport { Vector3 } from 'three';\n\nexport default class BananaForScale extends ScenePluginDefaultImplementation {\n private _scene: Scene;\n private _bounds: Box3;\n private _banana: Object3D;\n\n @inject\n private _staticItemLoader: StaticItemLoader;\n\n public setScene(scene: Scene) {\n this._scene = scene;\n\n this._staticItemLoader.loadGLB(BANANA_FILE_NAME).then((glb) => {\n this._banana = glb.scene;\n this.updateBounds(null);\n });\n\n console.log(\n '%c' + 'Banana 3D model by https://sketchfab.com/daniel132',\n 'color: #ffe135',\n );\n console.log(\n '%c' +\n 'Banana source: https://sketchfab.com/3d-models/banana-mark-2-a7fef734bf4544cb8a780a858fa6af97',\n 'color: #ffe135',\n );\n console.log(\n '%c' +\n 'Licensed under Creative Commons 4.0: https://creativecommons.org/licenses/by/4.0/',\n 'color: #ffe135',\n );\n }\n\n public updateBounds(bounds: Box3 | null) {\n if (bounds) {\n this._bounds = bounds;\n }\n if (!this._bounds) {\n return;\n }\n if (this._banana) {\n const size = this._bounds.getSize(new Vector3());\n const center = this._bounds.getCenter(new Vector3());\n const position = center.clone();\n position.x -= size.x / 2 + 0.18;\n position.z += size.z / 2 + 0.05;\n position.y = 0;\n let scale = 0.1;\n this._banana.scale.copy(new Vector3(scale, scale, scale));\n this._banana.rotation.y = 0.6;\n this._banana.position.copy(position);\n }\n if (!this._scene.children.includes(this._banana)) {\n this.addToScene();\n }\n }\n\n public clearScene(scene: Scene, uiScene: Scene): void {\n super.clearScene(scene, uiScene);\n\n this.removeFromScene();\n }\n\n public addToScene(): void {\n if (!this._scene || !this._banana) {\n return;\n }\n this._scene.add(this._banana);\n }\n\n public removeFromScene(): void {\n if (!this._scene || !this._banana) {\n return;\n }\n this._scene.remove(this._banana);\n }\n}\n"],"mappings":";;;;AAAA,IAAA,IAAe,KAAA,IAAA,IAAA,cAAA,OAAA,KAAA,IAAA,CAAA,MCOM,IAArB,cAA4C,EAAiC;CAQ3E,SAAgB,GAAc;AAiB5B,EAhBA,KAAK,SAAS,GAEd,KAAK,kBAAkB,QAAQ,EAAiB,CAAC,MAAM,MAAQ;AAE7D,GADA,KAAK,UAAU,EAAI,OACnB,KAAK,aAAa,KAAK;IACvB,EAEF,QAAQ,IACN,wDACA,iBACD,EACD,QAAQ,IACN,mGAEA,iBACD,EACD,QAAQ,IACN,uFAEA,iBACD;;CAGH,aAAoB,GAAqB;AACvC,MAAI,MACF,KAAK,UAAU,IAEZ,KAAK,SAGV;OAAI,KAAK,SAAS;IAChB,IAAM,IAAO,KAAK,QAAQ,QAAQ,IAAI,GAAS,CAAC,EAE1C,IADS,KAAK,QAAQ,UAAU,IAAI,GAAS,CAAC,CAC5B,OAAO;AAG/B,IAFA,EAAS,KAAK,EAAK,IAAI,IAAI,KAC3B,EAAS,KAAK,EAAK,IAAI,IAAI,KAC3B,EAAS,IAAI;IACb,IAAI,IAAQ;AAGZ,IAFA,KAAK,QAAQ,MAAM,KAAK,IAAI,EAAQ,GAAO,GAAO,EAAM,CAAC,EACzD,KAAK,QAAQ,SAAS,IAAI,IAC1B,KAAK,QAAQ,SAAS,KAAK,EAAS;;AAEtC,GAAK,KAAK,OAAO,SAAS,SAAS,KAAK,QAAQ,IAC9C,KAAK,YAAY;;;CAIrB,WAAkB,GAAc,GAAsB;AAGpD,EAFA,MAAM,WAAW,GAAO,EAAQ,EAEhC,KAAK,iBAAiB;;CAGxB,aAA0B;AACpB,GAAC,KAAK,UAAU,CAAC,KAAK,WAG1B,KAAK,OAAO,IAAI,KAAK,QAAQ;;CAG/B,kBAA+B;AACzB,GAAC,KAAK,UAAU,CAAC,KAAK,WAG1B,KAAK,OAAO,OAAO,KAAK,QAAQ;;;GApEjC,GAAA,EAAA,eAAA,OAAA,CAAA,EAAA,EAAA,WAAA,qBAAA,KAAA,EAAA"}
@@ -0,0 +1,20 @@
1
+ //#region \0rolldown/runtime.js
2
+ var e = Object.create, t = Object.defineProperty, n = Object.getOwnPropertyDescriptor, r = Object.getOwnPropertyNames, i = Object.getPrototypeOf, a = Object.prototype.hasOwnProperty, o = (e, t) => () => (t || e((t = { exports: {} }).exports, t), t.exports), s = (e, n) => {
3
+ let r = {};
4
+ for (var i in e) t(r, i, {
5
+ get: e[i],
6
+ enumerable: !0
7
+ });
8
+ return n || t(r, Symbol.toStringTag, { value: "Module" }), r;
9
+ }, c = (e, i, o, s) => {
10
+ if (i && typeof i == "object" || typeof i == "function") for (var c = r(i), l = 0, u = c.length, d; l < u; l++) d = c[l], !a.call(e, d) && d !== o && t(e, d, {
11
+ get: ((e) => i[e]).bind(null, d),
12
+ enumerable: !(s = n(i, d)) || s.enumerable
13
+ });
14
+ return e;
15
+ }, l = (n, r, a) => (a = n == null ? {} : e(i(n)), c(r || !n || !n.__esModule ? t(a, "default", {
16
+ value: n,
17
+ enumerable: !0
18
+ }) : a, n));
19
+ //#endregion
20
+ export { s as n, l as r, o as t };
@@ -1,4 +1,4 @@
1
- import { h as e } from "./three.core-CLIofecG.mjs";
1
+ import { C as e } from "./three.core-mM-jZdgg.mjs";
2
2
  //#region packages/typings/rapi-types.ts
3
3
  var t = /* @__PURE__ */ function(e) {
4
4
  return e.RGB = "RGB", e.RGBA = "RGBA", e.XYZ = "XYZ", e.ORM = "ORM", e.EMRGB = "EMRGB", e.CCRG = "CCRG", e.CCXYZ = "CCXYZ", e.SHRGBA = "SHRGBA", e.SPRGBA = "SPRGBA", e.TTRG = "TTRG", e;
@@ -184,4 +184,4 @@ var t = /* @__PURE__ */ function(e) {
184
184
  //#endregion
185
185
  export { z as A, n as B, G as C, x as D, j as E, l as F, g as I, k as L, S as M, o as N, h as O, u as P, c as R, R as S, m as T, t as V, A as _, L as a, E as b, O as c, K as d, v as f, I as g, T as h, F as i, D as j, V as k, d as l, H as m, i as n, _ as o, y as p, a as r, B as s, r as t, f as u, w as v, U as w, s as x, W as y, b as z };
186
186
 
187
- //# sourceMappingURL=common-utils-DMSTohiS.mjs.map
187
+ //# sourceMappingURL=common-utils-qErzZAiR.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common-utils-qErzZAiR.mjs","names":[],"sources":["../../packages/typings/rapi-types.ts","../../packages/common-core/src/utils/common-utils.ts"],"sourcesContent":["import type { Enumify } from '#/common/src/utils/types';\nimport type { InitDataDefinition } from '../common-core/src/utils/shims';\nimport type { UiPossibleChild } from './kernel';\n\nexport type RapiId = string;\nexport type AssetUrl = string;\nexport type ConfigurationString = string;\nexport type ConfigurationHash = string;\nexport type Base64String = string;\nexport type RapiServerUrlType = 'live' | 'test';\nexport type HexColorString = string; // #ffffff\nexport type HexColorNumber = number; // 0xffffff\nexport type PriceId = string;\nexport type ArticleNumber = string;\n\nexport interface LinksCollection {\n [key: string]: string;\n}\n\nexport interface RoomleSortable {\n sort?: number;\n}\n\nexport interface RapiJsonBox {\n meta?: RapiMeta;\n\n [key: string]: RapiMeta | RapiJson | RapiJson[] | undefined;\n}\n\nexport interface RapiMeta {\n serverTime: string;\n total: number;\n\n [key: string]: string | number;\n}\n\nexport interface RapiJson {\n id?: RapiId | number | null;\n isLocally?: boolean;\n __rapi_path__?: string;\n\n links?: LinksCollection;\n [key: string]: any;\n}\n\nexport interface RapiPackage extends RapiJson {\n components: RapiComponent[];\n materials: RapiMaterial[];\n textures: RapiTexture[];\n}\n\nexport interface RapiBaseColor {\n r: number;\n g: number;\n b: number;\n\n [key: string]: number;\n}\n\nexport interface RapiMesh extends RapiJson {\n catalog: RapiId;\n id: RapiId;\n}\n\nexport interface RapiMeshData {\n format: string;\n quality: number;\n url: string;\n created: string;\n changed: string;\n meshId: RapiId;\n\n [key: string]: number | string | RapiId;\n}\n\nexport interface RapiMaterialShading {\n version?: string;\n alpha: number;\n metallic: number;\n specularity?: number;\n basecolor: RapiBaseColor;\n roughness: number;\n doubleSided: boolean;\n alphaCutoff?: number;\n occlusion?: number;\n transmission?: number;\n reflectivity?: number;\n transmissionIOR?: number;\n emissiveColor?: RapiBaseColor;\n emissiveIntensity?: number;\n clearcoatIntensity?: number;\n clearcoatRoughness?: number;\n clearcoatNormalScale?: number;\n sheenColor?: RapiBaseColor;\n sheenIntensity?: number;\n sheenRoughness?: number;\n specularColor?: RapiBaseColor;\n thicknessFactor?: number;\n attenuationColor?: RapiBaseColor;\n attenuationDistance?: number;\n embeddedTextures?: RapiTexture[];\n\n [key: string]:\n | number\n | boolean\n | string\n | RapiBaseColor\n | RapiTexture[]\n | undefined;\n}\n\nexport interface RapiMaterial extends RapiJson {\n id: RapiId;\n name: string;\n externalIdentifier: string;\n group: string;\n groupLabel: string;\n color: string;\n thumbnail: AssetUrl;\n label: string;\n textures: number[];\n shading: RapiMaterialShading;\n tags: RapiId[];\n active: boolean;\n additionalInfos?: AdditionalInfo[];\n properties?: Record<string, string>;\n sort?: number;\n\n [key: string]:\n | string\n | RapiMaterialShading\n | AssetUrl\n | RapiId\n | number[]\n | AdditionalInfo[]\n | boolean\n | number\n | LinksCollection\n | RapiId[]\n | Record<string, string>\n | undefined;\n}\n\nexport interface RapiMaterialGroup extends RapiJson {\n id: RapiId | null;\n label?: string | null;\n materials: RapiMaterial[];\n legacyId?: RapiId;\n sort?: number;\n\n [key: string]:\n | string\n | RapiMaterial[]\n | RapiId\n | boolean\n | LinksCollection\n | number\n | null\n | undefined;\n}\n\nexport const enum RAPI_TEXTURE_TYPE {\n RGB = 'RGB', // diffuse color texture\n RGBA = 'RGBA', // Diffuse color texture and opacity map\n XYZ = 'XYZ', // normal vectors encoded in the 3 color channels\n ORM = 'ORM', // ambient Occlusion, roughness and metalness stored in the red, green and blue channels of the texture (in this order)\n EMRGB = 'EMRGB', // emissive color texture\n CCRG = 'CCRG', // clear coat intensity and clear coat roughness stored in the red and green channels of the texture (in this order)\n CCXYZ = 'CCXYZ', // separate normal vectors for the clear coat effect\n SHRGBA = 'SHRGBA', // sheen effect color texture and sheen roughness, the color is stored in the RGB channels and the roughness is stored in the alpha channel\n SPRGBA = 'SPRGBA', // specular color texture and specular intensity, the color is stored in the RGB channels and the intensity is stored in the alpha channel\n TTRG = 'TTRG', // transmission degree and thickness stored in the red and green channels of the texture (in this order)\n}\n\nexport interface RapiTexture extends RapiJson {\n mapping: RAPI_TEXTURE_TYPE;\n url: AssetUrl;\n image: AssetUrl;\n height: number;\n width: number;\n mmHeight: number;\n mmWidth: number;\n tileable: boolean;\n material: RapiId;\n\n [key: string]:\n | string\n | number\n | boolean\n | AssetUrl\n | RapiId\n | LinksCollection\n | null\n | undefined;\n}\n\nexport interface RapiCatalog extends RapiJson {\n id: RapiId;\n name: string;\n featuredImage: string;\n externalIdentifier: string;\n cover: string;\n brandIcon: string;\n description: string;\n free: boolean;\n public: boolean;\n featured: boolean;\n sort: number;\n created: string;\n updated: string;\n hidden: boolean;\n hiddenByUser: boolean;\n hiddenByTenant: boolean;\n tenantIsOwner: boolean;\n orderable: boolean;\n active: boolean;\n purchased: boolean;\n branded: boolean;\n\n tenant: RapiTenant;\n items: RapiItem[];\n allItems: RapiItem[];\n components: RapiComponent[];\n materials: RapiMaterial[];\n tags: RapiId[];\n allTags: RapiTag[];\n rootTags: RapiTag[];\n retailers: RapiRetailer[];\n\n [key: string]:\n | string\n | number\n | boolean\n | RapiRetailer[]\n | RapiTag[]\n | RapiMaterial[]\n | RapiComponent[]\n | RapiItem[]\n | RapiId[]\n | RapiTenant\n | LinksCollection\n | undefined;\n}\n\nexport interface RapiTenant extends RapiJson {\n name: string;\n label: string;\n defaultLanguage: string;\n active: boolean;\n showLanguageSwitch: boolean;\n branded: boolean;\n authenticationRequired: boolean;\n configuration: string;\n privacyUrl: string;\n\n catalogs: RapiCatalog[];\n users: RapiUser[];\n roles: RapiRole[];\n skin: RapiSkin[];\n plans: RapiPlan[];\n}\n\nexport interface RapiUser extends RapiJson {\n username: string;\n salutationCode: number;\n firstname: string;\n lastname: string;\n email: string;\n street: string;\n zipcode: string;\n city: string;\n countryCode: string;\n birthdate: string;\n phone: string;\n locale: string;\n registerDate: string;\n password: string;\n lastLogin: string;\n active: boolean;\n newsletter: boolean;\n emailValidated: string;\n termsChanged: boolean;\n providedConsentInTenant: boolean;\n priceLists: any;\n\n // Relationships\n tenants: RapiTenant[];\n roles: RapiRole[];\n catalogs: RapiCatalog[];\n plans: RapiPlan[];\n favorites: RapiFavorite[];\n setting: RapiUserSetting;\n}\n\nexport const enum RapiFavoriteType {\n ITEM = 1,\n CONFIG = 2,\n AFFILIATE = 3,\n}\n\nexport interface RapiFavorite extends RapiJson {\n objectId: string;\n type: RapiFavoriteType;\n created: string;\n user: RapiUser;\n}\n\nexport interface RapiUserSetting extends RapiJson {\n metric: boolean;\n measurements: boolean;\n area: boolean;\n furnitureSnap: boolean;\n\n user: RapiUser;\n}\n\nexport interface RapiRole extends RapiJson {\n // Data\n role: number;\n\n allowedModules: any;\n\n // Relationships\n tenantId: RapiTenant;\n userId: RapiUser;\n}\n\nexport interface RapiSkin extends RapiJson {\n accentColor: string;\n appIcon: string;\n backgroundImage: string;\n btnColorDark: string;\n btnColorLight: string;\n ciColor: string;\n dashboardBackground: string;\n loginBackground: string;\n dashboardLogo: string;\n fontColor: string;\n headerBackgroundColor: string;\n headerForegroundColor: string;\n logo: string;\n mailBackgroundColor: string;\n mailHeaderImage: string;\n planBackground: string;\n planLogo: string;\n splashScreenImage: string;\n tenantUrl: string;\n watermarkImage: string;\n brandedCatalogsIcon: string;\n planNote: string;\n inquiryImage: string;\n inquiryLink: string;\n hideMadeByRoomle: boolean;\n hidePressLink: boolean;\n hideShareButton: boolean;\n translationPath: string;\n hideFeedbackButton: boolean;\n referralUrl: string;\n hideCatalogOverview: boolean;\n // Relationships\n tenant: RapiTenant;\n catalogEntryTags: RapiTag;\n}\n\nexport interface RapiPlan extends RapiJson {\n name: string;\n description: string;\n changeDate: string;\n created: string;\n draftId: number | null; // THIS IS NOT USED BY THE BACKEND! USE DRAFT INSTEAD!!!!\n thumbnail: string;\n planObjects: string | null;\n active: boolean;\n right?: number;\n draft?: number;\n open: number;\n planDirectory: number;\n changed: number;\n version: number;\n floorLevel: number;\n //assets: array;\n visibility: number;\n\n // Relationships\n user: RapiUser | RapiId | null;\n tenant: RapiTenant | RapiId | null;\n assets: RapiPlanAsset[];\n parent: RapiPlan | RapiId | null;\n setting: RapiPlanSetting | null;\n}\n\nexport interface RapiPlanAsset extends RapiJson {\n image: string;\n}\n\nexport interface RapiPlanSetting extends RapiJson {\n metric: boolean;\n measurements: boolean;\n area: boolean;\n furnitureSnap: boolean;\n\n plan: RapiPlan;\n}\n\nexport type RapiPlanSnapshotId = `ps_${string}`;\nexport interface RapiPlanSnapshotPostData extends RapiJson {\n parentId: RapiId;\n planObjects: Array<{\n combinedId: RapiId;\n position: string;\n }>;\n plan: string;\n}\n\nexport interface RapiPlanSnapshotGetData extends RapiPlanSnapshotPostData {\n combinedIds: RapiId[];\n embedId: RapiId;\n perspectiveImage: string;\n topImage: string;\n}\n\n/* eslint-disable */\nexport interface RapiRetailer extends RapiJson {\n // NO ATTRS --> ask KUEGI how table looks\n}\n\n/* eslint:enable */\n\nexport interface RapiConfiguration extends RapiJson {\n id: RapiId;\n created: string;\n lastAccess: string;\n configuration: ConfigurationString;\n configurationHash: string;\n parts: string;\n perspectiveImage?: AssetUrl | null;\n topImage?: AssetUrl | null;\n rootComponentId: RapiId;\n orderable?: boolean;\n requestable?: boolean;\n width: number;\n height: number;\n depth: number;\n catalog?: RapiId;\n assets?: AssetItem;\n\n [key: string]:\n | string\n | number\n | boolean\n | AssetUrl\n | RapiId\n | LinksCollection\n | AssetItem\n | null\n | undefined;\n}\n\nexport interface RapiConfigurationEnhanced extends RapiConfiguration {\n label: string;\n}\n\nexport interface Element {\n id: string;\n label: string;\n perspectiveImage: AssetUrl;\n}\n\nexport interface RapiElement extends RapiJson, RoomleSortable, Element {\n id: RapiId;\n configuration?: ConfigurationString;\n externalIdentifier: string;\n tags: RapiId[];\n\n [key: string]:\n | string\n | number\n | boolean\n | AssetUrl\n | RapiId\n | RapiId[]\n | LinksCollection\n | AdditionalInfo[]\n | UiPossibleChild[]\n | AssetItem\n | undefined;\n}\nexport const CATALOG_INFOS_TYPES = {\n PARAMETER: 'parameter',\n PARAMETER_VALUE: 'paramValue',\n MATERIAL: 'material',\n COMPONENT: 'component',\n ITEM: 'item',\n} as const;\nexport interface AdditionalInfo {\n type: Enumify<typeof CATALOG_INFOS_TYPES>;\n key: string;\n parentIdFilter: string;\n catalog: string;\n tooltip: {\n [key: string]: string;\n };\n fullInfo: {\n type: string;\n url: {\n [key: string]: string;\n };\n };\n}\nexport interface RapiComponent extends RapiElement {\n active: boolean;\n additionalInfos: AdditionalInfo[];\n}\n\nexport interface Asset {\n format: string;\n url: string;\n}\n\nexport interface AssetItem {\n [key: string]: Asset;\n}\n\nexport interface RapiItem extends RapiElement {\n width: number;\n height: number;\n depth: number;\n basecolor: number;\n displayedWidth: number;\n displayedHeight: number;\n displayedDepth: number;\n perspectiveImageHD: AssetUrl;\n topImage: AssetUrl;\n threeDimensionalAssetWeb: AssetUrl;\n threeDimensionalAssetIOS: AssetUrl;\n threeDimensionalAsset: AssetUrl;\n flipable: boolean;\n scaleable: boolean;\n meta: string;\n hidden: boolean;\n link?: string;\n colorable: boolean;\n layer: number;\n language: string;\n type: string;\n detailType: string;\n currencySymbol?: string;\n customerPrice?: number;\n sort: number;\n orderable: boolean;\n requestable: boolean;\n catalog: RapiId;\n assets?: AssetItem;\n rootComponentId?: string;\n}\n\nexport const enum RAPI_ADDITIONAL_CONTENTS {\n UNKNOWN,\n LINK,\n TEXT,\n VIDEO,\n DOWNLOAD,\n IMAGE,\n SKETCH,\n}\n\nexport interface RapiAdditionalContent extends RapiJson {\n changed: string;\n content: string;\n created: string;\n itemId: RapiId;\n label: string;\n language: string;\n type: RAPI_ADDITIONAL_CONTENTS;\n}\n\nexport interface RapiTagGeneric extends RapiJson {\n label?: string;\n externalIdentifier: string;\n pngIcon?: AssetUrl;\n svgIcon?: AssetUrl;\n inspirationImage?: AssetUrl;\n global: boolean;\n sort?: number;\n created: string;\n updated: string;\n language: string;\n description?: string;\n\n // Relationships\n catalog: RapiId;\n tags: RapiId[];\n parents: RapiId[];\n\n [key: string]:\n | string\n | number\n | boolean\n | AssetUrl\n | RapiId\n | RapiId[]\n | RapiElement[]\n | RapiMaterial[]\n | LinksCollection\n | null\n | undefined;\n}\n\nexport interface RapiTag extends RapiTagGeneric {\n id: RapiId;\n items: RapiId[];\n materials: RapiId[];\n}\n\nexport interface RapiTagForUi extends RapiTagGeneric {\n materials: RapiMaterial[];\n items: RapiItem[];\n}\n\nexport interface RapiShortId {\n shortId: string;\n referencedId: string;\n url: string;\n type: number;\n created: string;\n lastAccess: string;\n\n [key: string]: string | number;\n}\n\nexport interface RapiPrice {\n priceId: PriceId;\n price: number;\n currencySymbol: string;\n}\n\nexport interface RapiConfiguratorSettings {\n id: string;\n tenant: number;\n allowedHosts: string;\n settings: InitDataDefinition;\n}\n\nexport interface UserAction {\n module: number;\n action: number;\n planId: RapiId;\n actionId: RapiId;\n actionValue: number;\n actionLabel: number;\n}\n\nexport const enum MAIL_TYPE {\n STANDARD = 1,\n AUGMENTED_REALITY = 2,\n SAVE_DRAFT = 3,\n PLANNER_SHARE = 13,\n}\n\nexport interface RapiAuth {\n token: string;\n lastActionDate: string;\n loginDate: string;\n userId: RapiId;\n}\n","import '../../../typings/global-definitions';\nimport type {\n RapiId,\n RapiItem,\n RapiJson,\n RapiMaterial,\n RapiTexture,\n} from '../../../typings/rapi-types';\nimport { RAPI_TEXTURE_TYPE } from '../../../typings/rapi-types';\nimport type {\n KernelFloorMaterial,\n KernelWallMaterial,\n} from '../../../typings/planner';\nimport type { BatchPaintMaterial } from '../../../planner-core/src/roomle-planner';\nimport { Color } from 'three';\nimport type { CameraParameter } from '../cameracontrol/camera-control';\n\nexport const enum CURSOR_STYLE {\n HOVER = 'pointer',\n DEFAULT = 'default',\n MOVE = 'move',\n DRAGGING = 'grabbing',\n ROTATE = 'ew-resize',\n NODE_HOVER = 'crosshair',\n // eslint-disable-next-line @typescript-eslint/quotes\n DRAW = \"url('https://res.cloudinary.com/roomle/image/upload/v1664957371/pencil_j5vkhm.svg') 3 20, auto\",\n // eslint-disable-next-line @typescript-eslint/quotes\n DRAW_FALLBACK = \"url('https://res.cloudinary.com/roomle/image/upload/v1664957371/pencil_j5vkhm.svg') 0 15, auto\",\n}\n\n/**\n * Colors can be set as hex value, eg 0x00ff00 or as official HTML color name: https://www.w3schools.com/colors/colors_names.asp\n */\nexport const ROOMLE_COLORS = {\n PRIMARY: 0xdb0000,\n ON_PRIMARY: 0xffffff,\n DEFAULT_BACKGROUND: 0xf7f7f7,\n SELECTION: 0xffffff,\n PREVIEW_DOCKING_COLOR: 0xfdddddd,\n} as const;\n\nexport const ROOMLE_HIGHLIGHTNG = {\n SMART: 'smart',\n OFF: 'off',\n ALWAYS: 'always',\n};\n\nexport const setCursor = (style: CURSOR_STYLE) => {\n // refactor into dom helper to be save in SDK\n document.body.style.cursor = style;\n};\n\nexport const handleJsonResponse = (response: Response): Promise<any> => {\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n return response.json();\n }\n throw new TypeError('No JSON returned');\n};\n\nexport const uuid = (a: string | null = null): string => {\n return a\n ? (\n parseInt(a, 10) ^\n ((Math.random() * 16) >> (parseInt(a, 10) / 4))\n ).toString(16)\n : ((1e7).toString() + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, uuid);\n};\n\nexport const setEnumerable = (\n target: any,\n property: string,\n isEnumerable: boolean,\n) => {\n setDescriptor(target, property, { enumerable: isEnumerable });\n};\n\nexport const setWriteable = (\n target: any,\n property: string,\n isWritable: boolean,\n) => {\n setDescriptor(target, property, { writable: isWritable });\n};\n\nexport const setDescriptor = (\n target: any,\n property: string,\n options: PropertyDescriptor,\n) => {\n const descriptor = Object.getOwnPropertyDescriptor(target, property);\n if (!descriptor) {\n throw new Error(`Property \"${property}\" not found on target`);\n }\n for (const prop in options) {\n if (options.hasOwnProperty(prop)) {\n (descriptor as any)[prop] = (options as any)[prop]; // as any because there are no signature types defined in std.lib\n }\n }\n Object.defineProperty(target, property, descriptor);\n};\n\nexport const setPropertiesFromOptions = (\n target: any,\n options: any,\n writeable?: true,\n) => {\n if (!options) {\n return;\n }\n Object.keys(options).forEach((key) => {\n Object.defineProperty(target, key, {\n value: options[key],\n writable: writeable,\n });\n });\n};\n\nexport const createBenchmarkMaterial = (materialId: string): RapiMaterial => {\n const color = new Color(0.5, 0.5, 0.5);\n const hexColor = color.getHexString();\n const material: RapiMaterial = {\n id: materialId,\n name: materialId,\n externalIdentifier: 'test-identifier',\n group: 'test-group',\n groupLabel: 'test-group-label',\n color: '#' + hexColor,\n thumbnail: createBenchmarkUrl(materialId, 15),\n label: 'test-label',\n textures: [1, 2, 3],\n shading: {\n alpha: 1,\n metallic: 0.5,\n basecolor: {\n r: 0.5,\n g: 0.5,\n b: 0.5,\n },\n roughness: 0.5,\n doubleSided: false,\n alphaCutoff: 0.5,\n },\n active: true,\n tags: [],\n };\n\n return material;\n};\n\nexport const createBenchmarkTexture = (materialId: string): RapiTexture => {\n const parts = materialId.split('_');\n const size = parseInt(parts[1], 10);\n const texture = {\n mapping: RAPI_TEXTURE_TYPE.RGB,\n id: materialId,\n material: materialId,\n image: createBenchmarkUrl(materialId),\n url: createBenchmarkUrl(materialId),\n height: size,\n width: size,\n mmHeight: 1,\n mmWidth: 1,\n tileable: true,\n };\n\n return texture;\n};\n\nexport const createBenchmarkUrl = (\n materialId: string,\n size?: number,\n): string => {\n const parts = materialId.split('_');\n if (!size) {\n size = parseInt(parts[1], 10);\n }\n const uniqueId = Math.abs(parseFloat(parts[2]));\n const dummyUrl =\n 'https://loremflickr.com/' + size + '/' + size + '?lock=' + uniqueId;\n return dummyUrl;\n};\n\nexport const isString = (value: unknown): boolean => {\n return typeof value === 'string' || value instanceof String;\n};\n\nexport const objectArrayToMap = <K extends V[keyof V], V extends object>(\n arr: V[],\n key: keyof V,\n): Map<K, V> => {\n return arr.reduce((acc, data) => {\n if (typeof data !== 'object') {\n console.warn('objectArrayToMap only works for arrays of objects');\n return acc;\n }\n const mapKey = data[key];\n if (!mapKey) {\n console.warn(\n 'Object has no key \"' +\n key.toString() +\n '\" therefore we do not know where to put it',\n );\n return acc;\n }\n if (!acc.has(mapKey)) {\n acc.set(mapKey, data);\n }\n return acc;\n }, new Map());\n};\n\nexport const throttle = <T extends (...args: any[]) => any>(\n func: T,\n delay: number = 16,\n): ((...funcArgs: Parameters<T>) => void) => {\n let time: number;\n let called = false;\n let skippedCalls = 0;\n let trailingCall: NodeJS.Timeout | null = null;\n return function (this: T, ..._args: Parameters<T>): void {\n if (!time) {\n time = Date.now();\n }\n if (!called || time + delay - Date.now() < 0) {\n func.apply(this, [...arguments]);\n time = Date.now();\n called = true;\n } else {\n skippedCalls++;\n }\n if (!trailingCall) {\n trailingCall = setInterval(() => {\n if (skippedCalls) {\n func.apply(this, [...arguments]);\n }\n skippedCalls = 0;\n if (trailingCall !== null) {\n clearInterval(trailingCall);\n }\n trailingCall = null;\n }, delay);\n }\n };\n};\n\n/**\n * Calls the function only if there has been no call for x (param after) milliseconds\n * @param func\n * @param after\n */\nexport const callAgainAfter = <T extends (...args: any[]) => any>(\n func: T,\n after: number = 16,\n): ((...funcArgs: Parameters<T>) => void) => {\n let lastCall: number;\n let called = false;\n return function (this: T, ..._args: Parameters<T>): void {\n if (!called || lastCall + after - Date.now() < 0) {\n lastCall = Date.now();\n func.apply(this, [...arguments]);\n called = true;\n } else {\n lastCall = Date.now();\n }\n };\n};\n\nexport const debounce = <Params extends any[]>(\n func: (...args: Params) => any,\n timeout: number,\n): ((...args: Params) => void) => {\n let timer: NodeJS.Timeout;\n return (...args: Params) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n func(...args);\n }, timeout);\n };\n};\n\n/**\n * A generic type for a function.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyFunction = (...args: any[]) => any;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `delay`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked with the same key. The debounced function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them.\n *\n * T The type of the function to debounce.\n * @param {T} func The function to debounce.\n * @param {number} delay The number of milliseconds to delay.\n * @param {(...args: Parameters<T>) => unknown} [keyResolver]\n * Optional. A function to resolve the key from the arguments.\n * Defaults to using the first argument as the key.\n * @returns {((...args: Parameters<T>) => void)} The new debounced function.\n */\nexport const debounceByKey = <T extends AnyFunction>(\n func: T,\n delay: number,\n keyResolver?: (...args: Parameters<T>) => unknown,\n) => {\n // 1. Use a Map to store timers, keyed by your object or resolved key.\n // The key can be of any type, and the value is the timer ID from setTimeout.\n const timers = new Map<unknown, ReturnType<typeof setTimeout>>();\n\n // 2. The default resolver just uses the first argument as the key.\n const resolver = keyResolver || ((...args: Parameters<T>) => args[0]);\n\n // 3. Return the new debounced function.\n // It accepts the same parameters as the original function.\n return function (this: ThisParameterType<T>, ...args: Parameters<T>): void {\n // 4. Capture the 'this' context from the call.\n const context = this;\n\n // 5. Get the unique key for this specific call (e.g., the object itself).\n const key = resolver.apply(context, args);\n\n // 6. Check for an existing timer *for this specific key*.\n const existingTimer = timers.get(key);\n\n // 7. If a timer already exists for this key, clear it.\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n // 8. Set a new timer.\n const newTimer = setTimeout(() => {\n // 9. When the timer finally fires, call the original function\n // with the saved context and arguments from the *last* call.\n func.apply(context, args);\n\n // 10. Clean up the map to prevent memory leaks for this key.\n timers.delete(key);\n }, delay);\n\n // 11. Store the new timer ID, associated with its key.\n timers.set(key, newTimer);\n };\n};\n\n/**\n * Interface for storing a single promise's resolve and reject handlers.\n */\ninterface PromiseHandlers<T extends AnyFunction> {\n resolve: (value: ReturnType<T> | PromiseLike<ReturnType<T>>) => void;\n reject: (reason?: any) => void;\n}\n\n/**\n * Interface for storing timer details along with promise handlers for a given key.\n */\ninterface TimerDetails<T extends AnyFunction> {\n timer: ReturnType<typeof setTimeout>;\n handlers: Array<PromiseHandlers<T>>;\n}\n\n/**\n * Creates a debounced function that delays invoking `func` until after `delay`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked with the same key. All calls made with the same key during the\n * delay period will have their returned promises resolved with the result\n * of the single final invocation.\n *\n * T The type of the function to debounce.\n * @param {T} func The function to debounce. This function can be synchronous or asynchronous.\n * @param {number} delay The number of milliseconds to delay.\n * @param {(...args: Parameters<T>) => unknown} [keyResolver]\n * Optional. A function to resolve the key from the arguments.\n * Defaults to using the first argument as the key.\n * @returns {((...args: Parameters<T>) => Promise<ReturnType<T>>)} The new debounced function.\n */\nexport const debounceByKeyAsync = <T extends AnyFunction>(\n func: T,\n delay: number,\n keyResolver?: (...args: Parameters<T>) => unknown,\n) => {\n // 1. Use a Map to store timers and promise handlers, keyed by the resolved key.\n const timers = new Map<unknown, TimerDetails<T>>();\n\n // 2. The default resolver uses the first argument as the key.\n const resolver = keyResolver || ((...args: Parameters<T>) => args[0]);\n\n // 3. Return the new promise-based debounced function.\n return function (\n this: ThisParameterType<T>,\n ...args: Parameters<T>\n ): Promise<ReturnType<T>> {\n const context = this;\n const key = resolver.apply(context, args);\n\n return new Promise((resolve, reject) => {\n // 4. Check for existing timer details for this specific key.\n const existingTimerDetails = timers.get(key);\n\n // 5. If a timer already exists, clear it.\n if (existingTimerDetails) {\n clearTimeout(existingTimerDetails.timer);\n }\n\n // 6. Get the list of promise handlers, or create a new one.\n const handlers = existingTimerDetails?.handlers || [];\n handlers.push({ resolve, reject }); // Add the current promise's handlers.\n\n // 7. Set a new timer.\n const newTimer = setTimeout(() => {\n // When the timer fires, execute the original function.\n // Using Promise.resolve().then() correctly handles both sync and async functions.\n Promise.resolve(func.apply(context, args))\n .then((result) => {\n // On success, resolve ALL promises for this key with the same result.\n handlers.forEach((handler) => handler.resolve(result));\n })\n .catch((error) => {\n // On failure, reject ALL promises for this key with the same error.\n handlers.forEach((handler) => handler.reject(error));\n })\n .finally(() => {\n // 9. Clean up the map to prevent memory leaks for this key.\n timers.delete(key);\n });\n }, delay);\n\n // 10. Store the new timer and the (potentially updated) list of handlers.\n timers.set(key, { timer: newTimer, handlers });\n });\n };\n};\n\nexport const wait = async (delay: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, delay));\n\nexport const nextTick = async (): Promise<void> => wait(0);\n\nexport const roundWithPrecision = (float: number, precision: number) => {\n if (precision === -1) {\n return float;\n }\n const factor = Math.pow(10, precision);\n return Math.round(float * factor) / factor;\n};\n\nconst LEGACY_ASSET_URL_REG_EX = new RegExp(/\\/3d\\/[0-9]+\\//);\n\nexport const getGlbUrl = (item: RapiItem): string | null => {\n // use glb asset without ktx textures as default\n // glb2 used ktx textures\n if (item.assets?.glb?.url) {\n return item.assets.glb.url;\n }\n if (item.threeDimensionalAsset) {\n return item.threeDimensionalAsset;\n }\n const assetUrl = item.threeDimensionalAssetWeb;\n if (!assetUrl || typeof assetUrl !== 'string') {\n // Maybe we should introduce Nullable so we can turn on\n // strict null checks for SDK? But that's probably\n // a separate user story\n return null;\n }\n return !assetUrl.match(LEGACY_ASSET_URL_REG_EX)\n ? assetUrl\n : assetUrl\n .replace(LEGACY_ASSET_URL_REG_EX, '/3d/glb/')\n .replace('.flash.u3d', '.glb');\n};\n\n/**\n * Recursively merge properties of two objects.\n * If a property exists in both, property of obj2 is used\n * @param obj1\n * @param obj2\n */\nexport const deepMerge = (obj1: any, obj2: any): any => {\n for (const p in obj2) {\n try {\n // Property in destination object set; update its value.\n if (obj2[p].constructor === Object) {\n obj1[p] = deepMerge(obj1[p], obj2[p]);\n } else {\n obj1[p] = obj2[p];\n }\n } catch (_e) {\n // Property in destination object not set; create it and set its value.\n obj1[p] = obj2[p];\n }\n }\n return obj1;\n};\n\nexport const getValue = (value: any, defaultValue: any): any => {\n if (value === undefined) {\n return defaultValue;\n }\n return value;\n};\n\nexport const removeItem = (arr: any[], element: any) => {\n const index = arr.indexOf(element);\n if (index > -1) {\n arr.splice(index, 1);\n }\n};\n\nexport type ValuesFromObject<T> = T[keyof T];\n\nexport type MaybePromise<T> = (() => T) | (() => Promise<T>);\n\nexport const copy = <T>(object: T): T => {\n if (!object) {\n return object;\n }\n return JSON.parse(JSON.stringify(object));\n};\n\nexport const isWebGl2 = (): boolean => {\n const canvas = document.createElement('canvas');\n if (\n !canvas ||\n !canvas.getContext ||\n typeof canvas.getContext !== 'function'\n ) {\n return false;\n }\n try {\n return canvas ? !!canvas.getContext('webgl2') : false;\n } catch (_e) {\n return false;\n }\n};\n\n/**\n * Creates a proxy around that class that logs all calls to it\n * @param obj the class to trace\n * @param name the tag under which it will be logged\n */\nexport const traceMethodCalls = (obj: object, name: string) => {\n const handler = {\n get(target: any, propKey: any, receiver: any) {\n const targetValue = Reflect.get(target, propKey, receiver);\n if (typeof targetValue === 'function') {\n return function (...args: any) {\n console.trace(name, propKey, args);\n // @ts-ignore -- helper for better debugging, TS does not know what we are doing\n return targetValue.apply(this, args); // (A)\n };\n } else {\n return targetValue;\n }\n },\n };\n return new Proxy(obj, handler);\n};\n\n/**\n * Creates a proxy around that class that can be used to track property access\n * @param obj the class to track\n * @param name the tag under which it will be logged\n */\nexport const trackPropertyAccess = (obj: object, _name: string) => {\n const handler = {\n get(target: any, propKey: any, _receiver: any) {\n return target[propKey];\n },\n set(target: any, propKey: any, value: any, _receiver: any) {\n target[propKey] = value;\n return true;\n },\n };\n return new Proxy(obj, handler);\n};\n\nexport const getColor = (value: string | number | Color): Color => {\n if (isThreeJsColor(value)) {\n return value;\n }\n if (typeof value === 'string' && (isHex(value) || isOnlyNumbers(value))) {\n return new Color(Number(value));\n } else {\n return new Color(value);\n }\n};\n\nexport const isThreeJsColor = (value: any): value is Color => {\n return value instanceof Color;\n};\n\nexport const isHex = (num: string) => {\n return Boolean(num.match(/^0x[0-9a-f]+$/i));\n};\n\nexport const isOnlyNumbers = (num: string) => {\n return Boolean(num.match(/^[0-9]+$/i));\n};\n\nexport const parseColorToHexDecimal = (color: string) =>\n !color ? -1 : Number('0x' + color.substring(1));\n\n/**\n * Copies the properties of an incoming material to a kernel material, used mainly\n * to avoid copying core data when applying a material to a planObject\n * @param materialPtr Kernel material pointer to apply properties to\n * @param material material to copy color properties from\n */\nexport const applyMaterialToKernelMaterial = (\n materialPtr: KernelWallMaterial | KernelFloorMaterial,\n material: BatchPaintMaterial,\n): KernelWallMaterial | KernelFloorMaterial => {\n if (material.materialId) {\n materialPtr.materialId = material.materialId;\n } else if (material.color) {\n // Material is a hex string, so we convert it to a rgb value.\n materialPtr.rgbValue = parseColorToHexDecimal(material.color);\n } else if (material.rgbValue) {\n materialPtr.rgbValue = material.rgbValue;\n } else if (material.catalogItemId !== undefined) {\n materialPtr.catalogItemId = material.catalogItemId;\n } else if (material.id) {\n materialPtr.materialId = material.id;\n } else {\n console.warn(\n 'Can not set material because neither a texture nor a RGB value was found',\n );\n }\n return materialPtr;\n};\n\nexport const download = (filename: string, content: string): void => {\n const element = document.createElement('a');\n element.setAttribute('href', content);\n element.setAttribute('download', filename);\n\n element.style.display = 'none';\n document.body.appendChild(element);\n\n element.click();\n\n document.body.removeChild(element);\n};\n\nexport const areCameraParametersEqual = (\n start: CameraParameter,\n end: CameraParameter,\n): boolean => {\n if (!start || !end) {\n return false;\n }\n if (\n start.targetX === undefined ||\n end.targetX === undefined ||\n Math.abs(start.targetX - end.targetX) > 0.01\n ) {\n return false;\n }\n if (\n start.targetY === undefined ||\n end.targetY === undefined ||\n Math.abs(start.targetY - end.targetY) > 0.01\n ) {\n return false;\n }\n if (\n start.targetZ === undefined ||\n end.targetZ === undefined ||\n Math.abs(start.targetZ - end.targetZ) > 0.01\n ) {\n return false;\n }\n if (\n start.yaw === undefined ||\n end.yaw === undefined ||\n Math.abs(start.yaw - end.yaw) > 0.01\n ) {\n return false;\n }\n if (\n start.distance === undefined ||\n end.distance === undefined ||\n Math.abs(start.distance - end.distance) > 0.01\n ) {\n return false;\n }\n return true;\n};\n\n/**\n * transforms a value from one range (oldMin, oldMax) to a new range (newMin, newMax)\n * @param value the value to transform\n * @param oldMin\n * @param oldMax\n * @param newMin\n * @param newMax\n * @returns the transformed value\n */\nexport const transformRange = (\n value: number,\n oldMin: number,\n oldMax: number,\n newMin: number,\n newMax: number,\n): number => {\n return ((value - oldMin) * (newMax - newMin)) / (oldMax - oldMin) + newMin;\n};\n\nexport const hashCode = (value: string): number => {\n let hash = 0;\n if (value.length === 0) {\n return hash;\n }\n for (let i = 0; i < value.length; i++) {\n const chr = value.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n};\n\nexport const rearrangeArrayByIdOrder = <T extends RapiJson>(\n idsInOrder: RapiId[],\n rapiJson: T[],\n idKey: string = 'id',\n): T[] => {\n const indexMap = new Map<RapiId, number>();\n const length = idsInOrder.length;\n for (let i = 0; i < length; i++) {\n indexMap.set(idsInOrder[i], i);\n }\n\n const sortedResult = new Array<T>(length);\n\n // Place each element from the result array at its corresponding index in sortedResult\n const rapiJsonLength = rapiJson.length;\n for (let j = 0; j < rapiJsonLength; j++) {\n const entry = rapiJson[j];\n const id = entry[idKey];\n const index = indexMap.get(id as RapiId);\n if (index !== undefined) {\n sortedResult[index] = entry;\n } else {\n sortedResult.push(entry);\n }\n }\n\n return sortedResult.filter((element) => element !== undefined);\n};\n\nexport const promiseWithResolvers = <T>() => {\n let resolve!: (value: T) => void;\n let reject!: (reason?: any) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n};\n\nexport const clamp = (value: number, min: number, max: number): number => {\n return Math.max(min, Math.min(max, value));\n};\n\nexport const randomString = (length: number = 8): string => {\n return [...Array(length)]\n .map(() => Math.random().toString(36).charAt(2))\n .join('');\n};\n\nexport const deepCopy = <T>(obj: T): T => {\n return JSON.parse(JSON.stringify(obj));\n};\n\nexport const isRecord = (value: any): value is Record<string, any> => {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n};\n\nexport const getIdQueryParam = (urlString: string): string | null => {\n try {\n const url = new URL(urlString);\n const params = new URLSearchParams(url.search);\n return params.get('id');\n } catch (_error) {\n return null; // Return null if URL is invalid or 'id' param is not found\n }\n};\n\nexport const isCtrlOrCmd = (event: KeyboardEvent) =>\n event.key === 'Meta' || event.key === 'Control';\n\nexport const ctrlOrCmd = (\n event: KeyboardEvent,\n checkIfItIsTheOnlyKey: boolean = false,\n) => {\n const isMultiSelectKey =\n checkIfItIsTheOnlyKey === false\n ? checkIfItIsTheOnlyKey\n : isCtrlOrCmd(event);\n return event.key && (event.metaKey || event.ctrlKey || isMultiSelectKey);\n};\n\nexport const runIfNotEmpty = <T extends any[]>(\n ids: string[],\n executor: () => Promise<T>,\n): Promise<T> => {\n if (!ids || ids.length === 0) {\n return Promise.resolve([] as unknown as T);\n }\n return executor();\n};\n"],"mappings":"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"}