@colijnit/configurator 261.1.0 → 261.1.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 (553) hide show
  1. package/bundles/colijnit-configurator.umd.js +18012 -1838
  2. package/bundles/colijnit-configurator.umd.js.map +1 -1
  3. package/colijnit-configurator.d.ts +2 -6
  4. package/esm2015/colijnit-configurator.js +2 -7
  5. package/esm2015/lib/builder.js +795 -0
  6. package/esm2015/lib/components/answer-card/answer-card.component.js +313 -0
  7. package/esm2015/lib/components/answer-card/answer-card.module.js +50 -0
  8. package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.component.js +182 -0
  9. package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.module.js +34 -0
  10. package/esm2015/lib/components/answers-slideout/answers-slideout.component.js +490 -0
  11. package/esm2015/lib/components/answers-slideout/answers-slideout.module.js +61 -0
  12. package/esm2015/lib/components/color-filter/color-filter.component.js +59 -0
  13. package/esm2015/lib/components/color-filter/color-filter.module.js +26 -0
  14. package/esm2015/lib/components/configurator/configurator.component.js +133 -0
  15. package/esm2015/lib/components/configurator/configurator.module.js +42 -0
  16. package/esm2015/lib/components/configurator-dialog/configurator-camera-settings.component.js +222 -0
  17. package/esm2015/lib/components/configurator-dialog/configurator-dialog.module.js +48 -0
  18. package/esm2015/lib/components/configurator-dialog/configurator-error-dialog.component.js +82 -0
  19. package/esm2015/lib/components/configurator-dialog/configurator-export-dialog.component.js +163 -0
  20. package/esm2015/lib/components/configurator-loader/configurator-loader.component.js +49 -0
  21. package/esm2015/lib/components/configurator-loader/configurator-loader.module.js +33 -0
  22. package/esm2015/lib/components/configurator-scene/configurator-scene.component.js +60 -0
  23. package/esm2015/lib/components/configurator-scene/configurator-scene.module.js +17 -0
  24. package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.component.js +46 -0
  25. package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.module.js +26 -0
  26. package/esm2015/lib/components/element-buttons/element-buttons.component.js +168 -0
  27. package/esm2015/lib/components/element-buttons/element-buttons.module.js +30 -0
  28. package/esm2015/lib/components/element-toolbar/element-toolbar.component.js +186 -0
  29. package/esm2015/lib/components/element-toolbar/element-toolbar.module.js +34 -0
  30. package/esm2015/lib/components/image-zoom/image-zoom.component.js +61 -0
  31. package/esm2015/lib/components/image-zoom/image-zoom.module.js +30 -0
  32. package/esm2015/lib/components/lite-selector/lite-selector.component.js +206 -0
  33. package/esm2015/lib/components/lite-selector/lite-selector.module.js +34 -0
  34. package/esm2015/lib/components/product-configurator/product-configurator.component.js +184 -0
  35. package/esm2015/lib/components/product-configurator/product-configurator.module.js +72 -0
  36. package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.component.js +237 -0
  37. package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.module.js +38 -0
  38. package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.js +284 -0
  39. package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.js +42 -0
  40. package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.js +72 -0
  41. package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.js +34 -0
  42. package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.js +82 -0
  43. package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.js +30 -0
  44. package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.js +80 -0
  45. package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.js +34 -0
  46. package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.js +93 -0
  47. package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.js +34 -0
  48. package/esm2015/lib/components/progress-bar/progress-bar.component.js +55 -0
  49. package/esm2015/lib/components/progress-bar/progress-bar.module.js +29 -0
  50. package/esm2015/lib/components/scene-options/scene-options.component.js +164 -0
  51. package/esm2015/lib/components/scene-options/scene-options.module.js +38 -0
  52. package/esm2015/lib/components/selections-summary/selections-summary.component.js +163 -0
  53. package/esm2015/lib/components/selections-summary/selections-summary.module.js +45 -0
  54. package/esm2015/lib/components/selections-summary-line/selections-summary-line.component.js +171 -0
  55. package/esm2015/lib/components/selections-summary-line/selections-summary-line.module.js +34 -0
  56. package/esm2015/lib/components/slideout/slideout.component.js +83 -0
  57. package/esm2015/lib/components/slideout/slideout.module.js +17 -0
  58. package/esm2015/lib/components/summary-line/summary-line.component.js +273 -0
  59. package/esm2015/lib/components/summary-line/summary-line.module.js +44 -0
  60. package/esm2015/lib/components/tag-filter/tag-filter.component.js +39 -0
  61. package/esm2015/lib/components/tag-filter/tag-filter.module.js +21 -0
  62. package/esm2015/lib/components/threedselector/threedselector.component.js +155 -0
  63. package/esm2015/lib/components/threedselector/threedselector.module.js +34 -0
  64. package/esm2015/lib/core/helper/variation-helper.js +553 -0
  65. package/esm2015/lib/core/shader/floor-fade.shader.js +33 -0
  66. package/esm2015/lib/core/textures/depth-data-texture.js +19 -0
  67. package/esm2015/lib/directives/directives.module.js +26 -0
  68. package/esm2015/lib/directives/visibility-observer-master.directive.js +53 -0
  69. package/esm2015/lib/directives/visibility-observer.directive.js +54 -0
  70. package/esm2015/lib/enum/ar-feature.enum.js +14 -0
  71. package/esm2015/lib/enum/configuration-key.enum.js +41 -0
  72. package/esm2015/lib/enum/configuration-template.enum.js +6 -0
  73. package/esm2015/lib/enum/device-size-type.js +7 -0
  74. package/esm2015/lib/enum/device-tier.enum.js +7 -0
  75. package/esm2015/lib/enum/icon.enum.js +113 -0
  76. package/esm2015/lib/enum/item-type.enum.js +23 -0
  77. package/esm2015/lib/enum/light.enum.js +9 -0
  78. package/esm2015/lib/enum/navigator-type.enum.js +6 -0
  79. package/esm2015/lib/enum/output-encoding.enum.js +9 -0
  80. package/esm2015/lib/enum/result-type.enum.js +21 -0
  81. package/esm2015/lib/enum/scene-event.enum.js +12 -0
  82. package/esm2015/lib/enum/shadow-map-type.enum.js +8 -0
  83. package/esm2015/lib/enum/texture-type.js +9 -0
  84. package/esm2015/lib/enum/tone-mapping-local.enum.js +12 -0
  85. package/esm2015/lib/enum/view-mode.enum.js +7 -0
  86. package/esm2015/lib/enum/xr-mode.enum.js +6 -0
  87. package/esm2015/lib/environments/environment.js +8 -0
  88. package/esm2015/lib/interfaces/aa-options.interface.js +2 -0
  89. package/esm2015/lib/interfaces/adjustable-element.interface.js +2 -0
  90. package/esm2015/lib/interfaces/ao-options.interface.js +2 -0
  91. package/esm2015/lib/interfaces/changes.interface.js +2 -0
  92. package/esm2015/lib/interfaces/configuration-data.interface.js +2 -0
  93. package/esm2015/lib/interfaces/light-preset.interface.js +2 -0
  94. package/esm2015/lib/interfaces/post-processing-setting.interface.js +2 -0
  95. package/esm2015/lib/interfaces/scene-option-button.interface.js +6 -0
  96. package/esm2015/lib/interfaces/screen-size-info.js +2 -0
  97. package/esm2015/lib/interfaces/setting.interface.js +2 -0
  98. package/esm2015/lib/interfaces/texture.interface.js +2 -0
  99. package/esm2015/lib/interfaces/vignette-options.interface.js +2 -0
  100. package/esm2015/lib/model/ar-position-indicator.js +18 -0
  101. package/esm2015/lib/model/camera-settings.js +14 -0
  102. package/esm2015/lib/model/configuration-result-object.js +6 -0
  103. package/esm2015/lib/model/configurator-error-message.js +9 -0
  104. package/esm2015/lib/model/configurator-settings.js +25 -0
  105. package/esm2015/lib/model/custom-button.js +16 -0
  106. package/esm2015/lib/model/factory.js +28 -0
  107. package/esm2015/lib/model/icon.js +112 -0
  108. package/esm2015/lib/model/intersected-objects.js +7 -0
  109. package/esm2015/lib/model/light-preset.js +73 -0
  110. package/esm2015/lib/model/light-properties.js +45 -0
  111. package/esm2015/lib/model/material.js +11 -0
  112. package/esm2015/lib/model/metadata.js +2 -0
  113. package/esm2015/lib/model/render-parameters.js +16 -0
  114. package/esm2015/lib/model/setting-options.js +71 -0
  115. package/esm2015/lib/model/settings.js +16 -0
  116. package/esm2015/lib/model/shadow-properties.js +10 -0
  117. package/esm2015/lib/model/skin.js +3 -0
  118. package/esm2015/lib/model/texture.js +76 -0
  119. package/esm2015/lib/model/variation-settings.js +54 -0
  120. package/esm2015/lib/model/variation.js +3 -0
  121. package/esm2015/lib/model/xr-reticle.js +79 -0
  122. package/esm2015/lib/modules/render/enum/scene-type.enum.js +6 -0
  123. package/esm2015/lib/modules/render/model/ar-parameters.js +12 -0
  124. package/esm2015/lib/modules/render/model/scene-setting.js +6 -0
  125. package/esm2015/lib/modules/render/model/scene-settings.js +3 -0
  126. package/esm2015/lib/pipes/append.pipe.js +21 -0
  127. package/esm2015/lib/pipes/google-translate.pipe.js +21 -0
  128. package/esm2015/lib/pipes/localize.pipe.js +28 -0
  129. package/esm2015/lib/pipes/pipes.module.js +41 -0
  130. package/esm2015/lib/pipes/prepend.pipe.js +21 -0
  131. package/esm2015/lib/pipes/strip-html.pipe.js +17 -0
  132. package/esm2015/lib/services/app-event.service.js +36 -0
  133. package/esm2015/lib/services/app-initializer.service.js +27 -0
  134. package/esm2015/lib/services/ar.service.js +844 -0
  135. package/esm2015/lib/services/build-furniture-base.service.js +1181 -0
  136. package/esm2015/lib/services/build-furniture-without-scene.service.js +86 -0
  137. package/esm2015/lib/services/build-furniture.service.js +169 -0
  138. package/esm2015/lib/services/bundle-initialzer.service.js +113 -0
  139. package/esm2015/lib/services/camera.service.js +123 -0
  140. package/esm2015/lib/services/configuration.service.js +79 -0
  141. package/esm2015/lib/services/configurator-connector.service.js +830 -0
  142. package/esm2015/lib/services/configurator.service.js +285 -0
  143. package/esm2015/lib/services/configuring.service.js +119 -0
  144. package/esm2015/lib/services/controls.js +799 -0
  145. package/esm2015/lib/services/debug.service.js +43 -0
  146. package/esm2015/lib/services/dictionary.service.js +65 -0
  147. package/esm2015/lib/services/dynamic-camera.service.js +96 -0
  148. package/esm2015/lib/services/floor-plane.service.js +252 -0
  149. package/esm2015/lib/services/font.service.js +27 -0
  150. package/esm2015/lib/services/google-translate.service.js +79 -0
  151. package/esm2015/lib/services/icon-cache.service.js +44 -0
  152. package/esm2015/lib/services/intersection.service.js +47 -0
  153. package/esm2015/lib/services/item.service.js +75 -0
  154. package/esm2015/lib/services/json-utils.service.js +48 -0
  155. package/esm2015/lib/services/light-creation.service.js +35 -0
  156. package/esm2015/lib/services/light-presets.service.js +157 -0
  157. package/esm2015/lib/services/lights.service.js +146 -0
  158. package/esm2015/lib/services/load-furniture-base.service.js +164 -0
  159. package/esm2015/lib/services/load-furniture-without-scene.service.js +45 -0
  160. package/esm2015/lib/services/load-furniture.service.js +72 -0
  161. package/esm2015/lib/services/loader.service.js +32 -0
  162. package/esm2015/lib/services/locator.service.js +11 -0
  163. package/esm2015/lib/services/message-board.service.js +50 -0
  164. package/esm2015/lib/services/post-processing.service.js +378 -0
  165. package/esm2015/lib/services/product-configurator.service.js +16 -0
  166. package/esm2015/lib/services/progress.service.js +20 -0
  167. package/esm2015/lib/services/scene-event.service.js +246 -0
  168. package/esm2015/lib/services/scene-options.service.js +24 -0
  169. package/esm2015/lib/services/scene.service.js +313 -0
  170. package/esm2015/lib/services/screen-size-analysis.service.js +97 -0
  171. package/esm2015/lib/services/settings.service.js +142 -0
  172. package/esm2015/lib/services/switch-build-furniture.service.js +37 -0
  173. package/esm2015/lib/services/switch-load-furniture.service.js +35 -0
  174. package/esm2015/lib/services/threedselector.service.js +72 -0
  175. package/esm2015/lib/services/utils.service.js +207 -0
  176. package/esm2015/lib/services/variation-cache.service.js +143 -0
  177. package/esm2015/lib/services/variation.service.js +490 -0
  178. package/esm2015/lib/services/view-mode.service.js +37 -0
  179. package/esm2015/lib/services/vr.service.js +191 -0
  180. package/esm2015/lib/services/xr.service.js +294 -0
  181. package/esm2015/lib/utils/asset.utils.js +120 -0
  182. package/esm2015/lib/utils/base-utils.js +9 -0
  183. package/esm2015/lib/utils/color.utils.js +30 -0
  184. package/esm2015/lib/utils/debug.utils.js +9 -0
  185. package/esm2015/lib/utils/device.utils.js +25 -0
  186. package/esm2015/lib/utils/file.utils.js +167 -0
  187. package/esm2015/lib/utils/image.utils.js +61 -0
  188. package/esm2015/lib/utils/json-parser.utils.js +180 -0
  189. package/esm2015/lib/utils/material.utils.js +433 -0
  190. package/esm2015/lib/utils/object.utils.js +360 -0
  191. package/esm2015/lib/utils/relative-position.utils.js +75 -0
  192. package/esm2015/lib/utils/rotation-helper.utils.js +15 -0
  193. package/esm2015/lib/utils/scene-3d.utils.js +213 -0
  194. package/esm2015/lib/utils/scene-utils.js +191 -0
  195. package/esm2015/lib/utils/text-utils.js +68 -0
  196. package/esm2015/lib/utils/threed.utils.js +281 -0
  197. package/esm2015/lib/utils/variation-utils.js +459 -0
  198. package/esm2015/public-api.js +65 -0
  199. package/fesm2015/colijnit-configurator.js +17512 -1451
  200. package/fesm2015/colijnit-configurator.js.map +1 -1
  201. package/{app → lib}/builder.d.ts +9 -1
  202. package/lib/components/answer-card/answer-card.component.d.ts +58 -0
  203. package/lib/components/answer-card/answer-card.module.d.ts +11 -0
  204. package/lib/components/answer-card/style/_layout.scss +88 -0
  205. package/lib/components/answer-card/style/_material-definition.scss +3 -0
  206. package/lib/components/answer-card/style/_theme.scss +67 -0
  207. package/lib/components/answer-card/style/material.scss +2 -0
  208. package/lib/components/answer-info-dialog/answer-info-dialog.component.d.ts +38 -0
  209. package/lib/components/answer-info-dialog/answer-info-dialog.module.d.ts +10 -0
  210. package/lib/components/answer-info-dialog/style/_layout.scss +88 -0
  211. package/lib/components/answer-info-dialog/style/_material-definition.scss +3 -0
  212. package/lib/components/answer-info-dialog/style/_theme.scss +44 -0
  213. package/lib/components/answer-info-dialog/style/material.scss +3 -0
  214. package/lib/components/answers-slideout/answers-slideout.component.d.ts +86 -0
  215. package/lib/components/answers-slideout/answers-slideout.module.d.ts +16 -0
  216. package/lib/components/answers-slideout/style/_layout.scss +198 -0
  217. package/lib/components/answers-slideout/style/_material-definition.scss +3 -0
  218. package/lib/components/answers-slideout/style/_theme.scss +54 -0
  219. package/lib/components/answers-slideout/style/material.scss +3 -0
  220. package/lib/components/color-filter/color-filter.component.d.ts +20 -0
  221. package/lib/components/color-filter/color-filter.module.d.ts +8 -0
  222. package/lib/components/color-filter/style/_layout.scss +41 -0
  223. package/lib/components/color-filter/style/_material-definition.scss +3 -0
  224. package/lib/components/color-filter/style/_theme.scss +7 -0
  225. package/lib/components/color-filter/style/material.scss +3 -0
  226. package/lib/components/configurator/configurator.component.d.ts +37 -0
  227. package/lib/components/configurator/configurator.module.d.ts +12 -0
  228. package/lib/components/configurator/style/_layout.scss +7 -0
  229. package/lib/components/configurator/style/_material-definition.scss +3 -0
  230. package/lib/components/configurator/style/_theme.scss +7 -0
  231. package/lib/components/configurator/style/material.scss +3 -0
  232. package/lib/components/configurator-dialog/configurator-camera-settings.component.d.ts +30 -0
  233. package/lib/components/configurator-dialog/configurator-dialog.module.d.ts +13 -0
  234. package/lib/components/configurator-dialog/configurator-error-dialog.component.d.ts +16 -0
  235. package/lib/components/configurator-dialog/configurator-export-dialog.component.d.ts +26 -0
  236. package/lib/components/configurator-dialog/style/_layout.scss +129 -0
  237. package/lib/components/configurator-dialog/style/_material-definition.scss +4 -0
  238. package/lib/components/configurator-dialog/style/_theme.scss +89 -0
  239. package/lib/components/configurator-dialog/style/material.scss +3 -0
  240. package/lib/components/configurator-loader/configurator-loader.component.d.ts +7 -0
  241. package/lib/components/configurator-loader/configurator-loader.module.d.ts +9 -0
  242. package/lib/components/configurator-loader/style/_layout.scss +72 -0
  243. package/lib/components/configurator-loader/style/_material-definition.scss +5 -0
  244. package/lib/components/configurator-loader/style/_theme.scss +26 -0
  245. package/lib/components/configurator-loader/style/material.scss +14 -0
  246. package/lib/components/configurator-scene/configurator-scene.component.d.ts +24 -0
  247. package/lib/components/configurator-scene/configurator-scene.module.d.ts +7 -0
  248. package/lib/components/configurator-scene/style/_layout.scss +22 -0
  249. package/lib/components/configurator-scene/style/_material-definition.scss +3 -0
  250. package/lib/components/configurator-scene/style/_theme.scss +7 -0
  251. package/lib/components/configurator-scene/style/material.scss +3 -0
  252. package/lib/components/configurator-scene-loader/configurator-scene-loader.component.d.ts +7 -0
  253. package/lib/components/configurator-scene-loader/configurator-scene-loader.module.d.ts +8 -0
  254. package/lib/components/configurator-scene-loader/style/_layout.scss +72 -0
  255. package/lib/components/configurator-scene-loader/style/_material-definition.scss +5 -0
  256. package/lib/components/configurator-scene-loader/style/_theme.scss +26 -0
  257. package/lib/components/configurator-scene-loader/style/material.scss +14 -0
  258. package/lib/components/element-buttons/element-buttons.component.d.ts +32 -0
  259. package/lib/components/element-buttons/element-buttons.module.d.ts +9 -0
  260. package/lib/components/element-buttons/style/_layout.scss +52 -0
  261. package/lib/components/element-buttons/style/_material-definition.scss +3 -0
  262. package/lib/components/element-buttons/style/_theme.scss +23 -0
  263. package/lib/components/element-buttons/style/material.scss +3 -0
  264. package/lib/components/element-toolbar/element-toolbar.component.d.ts +27 -0
  265. package/lib/components/element-toolbar/element-toolbar.component.scss +59 -0
  266. package/lib/components/element-toolbar/element-toolbar.module.d.ts +10 -0
  267. package/lib/components/element-toolbar/style/_layout.scss +107 -0
  268. package/lib/components/element-toolbar/style/_material-definition.scss +3 -0
  269. package/lib/components/element-toolbar/style/_theme.scss +47 -0
  270. package/lib/components/element-toolbar/style/material.scss +3 -0
  271. package/lib/components/image-zoom/image-zoom.component.d.ts +15 -0
  272. package/lib/components/image-zoom/image-zoom.module.d.ts +9 -0
  273. package/lib/components/image-zoom/style/_layout.scss +51 -0
  274. package/lib/components/image-zoom/style/_material-definition.scss +3 -0
  275. package/lib/components/image-zoom/style/_theme.scss +17 -0
  276. package/lib/components/image-zoom/style/material.scss +3 -0
  277. package/lib/components/lite-selector/lite-selector.component.d.ts +40 -0
  278. package/lib/components/lite-selector/lite-selector.module.d.ts +10 -0
  279. package/lib/components/lite-selector/style/_layout.scss +21 -0
  280. package/lib/components/lite-selector/style/_material-definition.scss +3 -0
  281. package/lib/components/lite-selector/style/_theme.scss +7 -0
  282. package/lib/components/lite-selector/style/material.scss +3 -0
  283. package/lib/components/product-configurator/product-configurator.component.d.ts +50 -0
  284. package/lib/components/product-configurator/product-configurator.module.d.ts +15 -0
  285. package/lib/components/product-configurator/style/_layout.scss +46 -0
  286. package/lib/components/product-configurator/style/_material-definition.scss +3 -0
  287. package/lib/components/product-configurator/style/_theme.scss +22 -0
  288. package/lib/components/product-configurator/style/material.scss +3 -0
  289. package/lib/components/product-configurator-selector/product-configurator-selector.component.d.ts +35 -0
  290. package/lib/components/product-configurator-selector/product-configurator-selector.module.d.ts +11 -0
  291. package/lib/components/product-configurator-selector/style/_layout.scss +145 -0
  292. package/lib/components/product-configurator-selector/style/_material-definition.scss +3 -0
  293. package/lib/components/product-configurator-selector/style/_theme.scss +57 -0
  294. package/lib/components/product-configurator-selector/style/material.scss +3 -0
  295. package/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.d.ts +31 -0
  296. package/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.d.ts +13 -0
  297. package/lib/components/product-configurator-selector-option/style/_layout.scss +7 -0
  298. package/lib/components/product-configurator-selector-option/style/_material-definition.scss +3 -0
  299. package/lib/components/product-configurator-selector-option/style/_theme.scss +7 -0
  300. package/lib/components/product-configurator-selector-option/style/material.scss +3 -0
  301. package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.d.ts +20 -0
  302. package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.d.ts +10 -0
  303. package/lib/components/product-configurator-selector-option-button/style/_layout.scss +28 -0
  304. package/lib/components/product-configurator-selector-option-button/style/_material-definition.scss +3 -0
  305. package/lib/components/product-configurator-selector-option-button/style/_theme.scss +33 -0
  306. package/lib/components/product-configurator-selector-option-button/style/material.scss +3 -0
  307. package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.d.ts +20 -0
  308. package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.d.ts +10 -0
  309. package/lib/components/product-configurator-selector-option-checkbox/style/_layout.scss +28 -0
  310. package/lib/components/product-configurator-selector-option-checkbox/style/_material-definition.scss +3 -0
  311. package/lib/components/product-configurator-selector-option-checkbox/style/_theme.scss +27 -0
  312. package/lib/components/product-configurator-selector-option-checkbox/style/material.scss +3 -0
  313. package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.d.ts +21 -0
  314. package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.d.ts +10 -0
  315. package/lib/components/product-configurator-selector-option-dropdown/style/_layout.scss +34 -0
  316. package/lib/components/product-configurator-selector-option-dropdown/style/_material-definition.scss +3 -0
  317. package/lib/components/product-configurator-selector-option-dropdown/style/_theme.scss +28 -0
  318. package/lib/components/product-configurator-selector-option-dropdown/style/material.scss +3 -0
  319. package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.d.ts +21 -0
  320. package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.d.ts +10 -0
  321. package/lib/components/product-configurator-selector-option-tile/style/_layout.scss +58 -0
  322. package/lib/components/product-configurator-selector-option-tile/style/_material-definition.scss +3 -0
  323. package/lib/components/product-configurator-selector-option-tile/style/_theme.scss +56 -0
  324. package/lib/components/product-configurator-selector-option-tile/style/material.scss +3 -0
  325. package/lib/components/progress-bar/progress-bar.component.d.ts +10 -0
  326. package/lib/components/progress-bar/progress-bar.component.scss +14 -0
  327. package/lib/components/progress-bar/progress-bar.module.d.ts +8 -0
  328. package/lib/components/progress-bar/style/_layout.scss +18 -0
  329. package/lib/components/progress-bar/style/_material-definition.scss +3 -0
  330. package/lib/components/progress-bar/style/_theme.scss +10 -0
  331. package/lib/components/progress-bar/style/material.scss +3 -0
  332. package/lib/components/scene-options/scene-options.component.d.ts +24 -0
  333. package/lib/components/scene-options/scene-options.module.d.ts +11 -0
  334. package/lib/components/scene-options/style/_layout.scss +52 -0
  335. package/lib/components/scene-options/style/_material-definition.scss +3 -0
  336. package/lib/components/scene-options/style/_theme.scss +7 -0
  337. package/lib/components/scene-options/style/material.scss +3 -0
  338. package/lib/components/selections-summary/selections-summary.component.d.ts +38 -0
  339. package/lib/components/selections-summary/selections-summary.module.d.ts +12 -0
  340. package/lib/components/selections-summary/style/_layout.scss +87 -0
  341. package/lib/components/selections-summary/style/_material-definition.scss +5 -0
  342. package/lib/components/selections-summary/style/_theme.scss +13 -0
  343. package/lib/components/selections-summary/style/material.scss +3 -0
  344. package/lib/components/selections-summary-line/selections-summary-line.component.d.ts +27 -0
  345. package/lib/components/selections-summary-line/selections-summary-line.module.d.ts +10 -0
  346. package/lib/components/selections-summary-line/style/_layout.scss +12 -0
  347. package/lib/components/selections-summary-line/style/_material-definition.scss +4 -0
  348. package/lib/components/selections-summary-line/style/_theme.scss +12 -0
  349. package/lib/components/selections-summary-line/style/material.scss +3 -0
  350. package/lib/components/slideout/slideout.component.d.ts +22 -0
  351. package/lib/components/slideout/slideout.module.d.ts +7 -0
  352. package/lib/components/slideout/style/_layout.scss +27 -0
  353. package/lib/components/slideout/style/_material-definition.scss +3 -0
  354. package/lib/components/slideout/style/_theme.scss +5 -0
  355. package/lib/components/slideout/style/material.scss +3 -0
  356. package/lib/components/summary-line/style/_layout.scss +137 -0
  357. package/lib/components/summary-line/style/_material-definition.scss +4 -0
  358. package/lib/components/summary-line/style/_theme.scss +56 -0
  359. package/lib/components/summary-line/style/material.scss +3 -0
  360. package/lib/components/summary-line/summary-line.component.d.ts +50 -0
  361. package/lib/components/summary-line/summary-line.module.d.ts +11 -0
  362. package/lib/components/tag-filter/style/_layout.scss +14 -0
  363. package/lib/components/tag-filter/style/_material-definition.scss +3 -0
  364. package/lib/components/tag-filter/style/_theme.scss +7 -0
  365. package/lib/components/tag-filter/style/material.scss +3 -0
  366. package/lib/components/tag-filter/tag-filter.component.d.ts +9 -0
  367. package/lib/components/tag-filter/tag-filter.module.d.ts +7 -0
  368. package/lib/components/threedselector/style/_layout.scss +32 -0
  369. package/lib/components/threedselector/style/_material-definition.scss +3 -0
  370. package/lib/components/threedselector/style/_theme.scss +7 -0
  371. package/lib/components/threedselector/style/material.scss +9 -0
  372. package/lib/components/threedselector/threedselector.component.d.ts +38 -0
  373. package/lib/components/threedselector/threedselector.module.d.ts +10 -0
  374. package/{helper → lib/core/helper}/variation-helper.d.ts +2 -2
  375. package/lib/core/shader/floor-fade.shader.d.ts +5 -0
  376. package/lib/core/textures/depth-data-texture.d.ts +5 -0
  377. package/lib/directives/directives.module.d.ts +8 -0
  378. package/{app → lib}/directives/visibility-observer-master.directive.d.ts +3 -0
  379. package/{app → lib}/directives/visibility-observer.directive.d.ts +3 -0
  380. package/lib/enum/ar-feature.enum.d.ts +12 -0
  381. package/lib/enum/configuration-key.enum.d.ts +39 -0
  382. package/lib/enum/configuration-template.enum.d.ts +4 -0
  383. package/lib/enum/device-size-type.d.ts +5 -0
  384. package/lib/enum/device-tier.enum.d.ts +5 -0
  385. package/lib/enum/icon.enum.d.ts +111 -0
  386. package/lib/enum/item-type.enum.d.ts +21 -0
  387. package/lib/enum/light.enum.d.ts +7 -0
  388. package/lib/enum/navigator-type.enum.d.ts +4 -0
  389. package/lib/enum/output-encoding.enum.d.ts +7 -0
  390. package/lib/enum/result-type.enum.d.ts +19 -0
  391. package/lib/enum/scene-event.enum.d.ts +10 -0
  392. package/lib/enum/shadow-map-type.enum.d.ts +6 -0
  393. package/lib/enum/texture-type.d.ts +7 -0
  394. package/lib/enum/tone-mapping-local.enum.d.ts +10 -0
  395. package/lib/enum/view-mode.enum.d.ts +5 -0
  396. package/lib/enum/xr-mode.enum.d.ts +4 -0
  397. package/lib/environments/environment.d.ts +4 -0
  398. package/lib/interfaces/aa-options.interface.d.ts +4 -0
  399. package/lib/interfaces/adjustable-element.interface.d.ts +5 -0
  400. package/lib/interfaces/ao-options.interface.d.ts +18 -0
  401. package/lib/interfaces/changes.interface.d.ts +9 -0
  402. package/lib/interfaces/configuration-data.interface.d.ts +40 -0
  403. package/lib/interfaces/light-preset.interface.d.ts +22 -0
  404. package/lib/interfaces/post-processing-setting.interface.d.ts +11 -0
  405. package/lib/interfaces/scene-option-button.interface.d.ts +19 -0
  406. package/lib/interfaces/screen-size-info.d.ts +10 -0
  407. package/lib/interfaces/setting.interface.d.ts +8 -0
  408. package/lib/interfaces/texture.interface.d.ts +44 -0
  409. package/lib/interfaces/vignette-options.interface.d.ts +4 -0
  410. package/lib/model/ar-position-indicator.d.ts +4 -0
  411. package/lib/model/camera-settings.d.ts +12 -0
  412. package/lib/model/configuration-result-object.d.ts +30 -0
  413. package/lib/model/configurator-error-message.d.ts +8 -0
  414. package/lib/model/configurator-settings.d.ts +62 -0
  415. package/lib/model/custom-button.d.ts +10 -0
  416. package/lib/model/factory.d.ts +5 -0
  417. package/lib/model/icon.d.ts +4 -0
  418. package/lib/model/intersected-objects.d.ts +6 -0
  419. package/lib/model/light-preset.d.ts +33 -0
  420. package/lib/model/light-properties.d.ts +25 -0
  421. package/lib/model/material.d.ts +41 -0
  422. package/lib/model/metadata.d.ts +78 -0
  423. package/lib/model/render-parameters.d.ts +12 -0
  424. package/lib/model/setting-options.d.ts +67 -0
  425. package/lib/model/settings.d.ts +10 -0
  426. package/lib/model/shadow-properties.d.ts +7 -0
  427. package/lib/model/skin.d.ts +15 -0
  428. package/lib/model/texture.d.ts +52 -0
  429. package/{model → lib/model}/variation-settings.d.ts +9 -8
  430. package/{model → lib/model}/variation.d.ts +2 -1
  431. package/lib/model/xr-reticle.d.ts +17 -0
  432. package/lib/modules/render/enum/scene-type.enum.d.ts +4 -0
  433. package/lib/modules/render/model/ar-parameters.d.ts +9 -0
  434. package/lib/modules/render/model/scene-setting.d.ts +13 -0
  435. package/lib/modules/render/model/scene-settings.d.ts +4 -0
  436. package/lib/pipes/append.pipe.d.ts +7 -0
  437. package/lib/pipes/google-translate.pipe.d.ts +11 -0
  438. package/lib/pipes/localize.pipe.d.ts +10 -0
  439. package/lib/pipes/pipes.module.d.ts +11 -0
  440. package/lib/pipes/prepend.pipe.d.ts +7 -0
  441. package/lib/pipes/strip-html.pipe.d.ts +7 -0
  442. package/lib/services/app-event.service.d.ts +32 -0
  443. package/lib/services/app-initializer.service.d.ts +14 -0
  444. package/lib/services/ar.service.d.ts +120 -0
  445. package/lib/services/build-furniture-base.service.d.ts +117 -0
  446. package/lib/services/build-furniture-without-scene.service.d.ts +14 -0
  447. package/lib/services/build-furniture.service.d.ts +14 -0
  448. package/lib/services/bundle-initialzer.service.d.ts +45 -0
  449. package/lib/services/camera.service.d.ts +44 -0
  450. package/lib/services/configuration.service.d.ts +18 -0
  451. package/lib/services/configurator-connector.service.d.ts +140 -0
  452. package/lib/services/configurator.service.d.ts +62 -0
  453. package/lib/services/configuring.service.d.ts +46 -0
  454. package/lib/services/controls.d.ts +11 -0
  455. package/lib/services/debug.service.d.ts +16 -0
  456. package/lib/services/dictionary.service.d.ts +15 -0
  457. package/lib/services/dynamic-camera.service.d.ts +21 -0
  458. package/lib/services/floor-plane.service.d.ts +47 -0
  459. package/lib/services/font.service.d.ts +10 -0
  460. package/lib/services/google-translate.service.d.ts +26 -0
  461. package/lib/services/icon-cache.service.d.ts +21 -0
  462. package/lib/services/intersection.service.d.ts +11 -0
  463. package/lib/services/item.service.d.ts +18 -0
  464. package/lib/services/json-utils.service.d.ts +7 -0
  465. package/lib/services/light-creation.service.d.ts +9 -0
  466. package/lib/services/light-presets.service.d.ts +34 -0
  467. package/lib/services/lights.service.d.ts +34 -0
  468. package/lib/services/load-furniture-base.service.d.ts +37 -0
  469. package/lib/services/load-furniture-without-scene.service.d.ts +9 -0
  470. package/lib/services/load-furniture.service.d.ts +9 -0
  471. package/lib/services/loader.service.d.ts +11 -0
  472. package/lib/services/locator.service.d.ts +7 -0
  473. package/lib/services/message-board.service.d.ts +18 -0
  474. package/lib/services/post-processing.service.d.ts +74 -0
  475. package/lib/services/product-configurator.service.d.ts +11 -0
  476. package/lib/services/progress.service.d.ts +9 -0
  477. package/lib/services/scene-event.service.d.ts +72 -0
  478. package/lib/services/scene-options.service.d.ts +11 -0
  479. package/lib/services/scene.service.d.ts +71 -0
  480. package/lib/services/screen-size-analysis.service.d.ts +32 -0
  481. package/lib/services/settings.service.d.ts +24 -0
  482. package/lib/services/switch-build-furniture.service.d.ts +21 -0
  483. package/lib/services/switch-load-furniture.service.d.ts +21 -0
  484. package/lib/services/threedselector.service.d.ts +17 -0
  485. package/lib/services/utils.service.d.ts +24 -0
  486. package/lib/services/variation-cache.service.d.ts +23 -0
  487. package/lib/services/variation.service.d.ts +26 -0
  488. package/lib/services/view-mode.service.d.ts +17 -0
  489. package/lib/services/vr.service.d.ts +42 -0
  490. package/lib/services/xr.service.d.ts +56 -0
  491. package/lib/style/_mixin.scss +9 -0
  492. package/lib/style/configurator-globals.scss +21 -0
  493. package/lib/style/template_variables.scss +37 -0
  494. package/lib/utils/color.utils.d.ts +8 -0
  495. package/lib/utils/debug.utils.d.ts +3 -0
  496. package/lib/utils/device.utils.d.ts +7 -0
  497. package/{utils → lib/utils}/file.utils.d.ts +3 -0
  498. package/{utils → lib/utils}/image.utils.d.ts +2 -3
  499. package/lib/utils/json-parser.utils.d.ts +9 -0
  500. package/lib/utils/material.utils.d.ts +34 -0
  501. package/lib/utils/object.utils.d.ts +32 -0
  502. package/lib/utils/relative-position.utils.d.ts +12 -0
  503. package/lib/utils/rotation-helper.utils.d.ts +6 -0
  504. package/lib/utils/scene-3d.utils.d.ts +8 -0
  505. package/lib/utils/text-utils.d.ts +4 -0
  506. package/{utils → lib/utils}/threed.utils.d.ts +7 -3
  507. package/{utils → lib/utils}/variation-utils.d.ts +4 -2
  508. package/package.json +17 -30
  509. package/public-api.d.ts +60 -0
  510. package/README.md +0 -28
  511. package/app/components/answers/answer/answer.component.d.ts +0 -11
  512. package/app/components/answers/answers.component.d.ts +0 -8
  513. package/app/components/answers/answers.module.d.ts +0 -2
  514. package/app/components/selections/selections.component.d.ts +0 -21
  515. package/app/components/selections/selections.module.d.ts +0 -2
  516. package/app/components/shared/loader/loader.component.d.ts +0 -2
  517. package/app/components/shared/shared.module.d.ts +0 -2
  518. package/app/services/configurator.service.d.ts +0 -19
  519. package/app/services/image-cache.service.d.ts +0 -10
  520. package/app/utils/object.utils.d.ts +0 -7
  521. package/colijnit-configurator.metadata.json +0 -1
  522. package/esm2015/app/builder.js +0 -710
  523. package/esm2015/app/components/answers/answer/answer.component.js +0 -66
  524. package/esm2015/app/components/answers/answers.component.js +0 -38
  525. package/esm2015/app/components/answers/answers.module.js +0 -27
  526. package/esm2015/app/components/selections/selections.component.js +0 -129
  527. package/esm2015/app/components/selections/selections.module.js +0 -21
  528. package/esm2015/app/components/shared/loader/loader.component.js +0 -22
  529. package/esm2015/app/components/shared/shared.module.js +0 -19
  530. package/esm2015/app/directives/visibility-observer-master.directive.js +0 -50
  531. package/esm2015/app/directives/visibility-observer.directive.js +0 -55
  532. package/esm2015/app/services/configurator.service.js +0 -79
  533. package/esm2015/app/services/image-cache.service.js +0 -63
  534. package/esm2015/app/utils/object.utils.js +0 -51
  535. package/esm2015/helper/variation-helper.js +0 -549
  536. package/esm2015/model/material.js +0 -11
  537. package/esm2015/model/variation-settings.js +0 -54
  538. package/esm2015/model/variation.js +0 -3
  539. package/esm2015/public_api.js +0 -7
  540. package/esm2015/utils/asset.utils.js +0 -124
  541. package/esm2015/utils/base-utils.js +0 -9
  542. package/esm2015/utils/file.utils.js +0 -142
  543. package/esm2015/utils/image.utils.js +0 -66
  544. package/esm2015/utils/object.utils.js +0 -49
  545. package/esm2015/utils/scene-utils.js +0 -187
  546. package/esm2015/utils/threed.utils.js +0 -226
  547. package/esm2015/utils/variation-utils.js +0 -388
  548. package/model/material.d.ts +0 -40
  549. package/public_api.d.ts +0 -6
  550. package/utils/object.utils.d.ts +0 -7
  551. /package/{utils → lib/utils}/asset.utils.d.ts +0 -0
  552. /package/{utils → lib/utils}/base-utils.d.ts +0 -0
  553. /package/{utils → lib/utils}/scene-utils.d.ts +0 -0
@@ -1,187 +0,0 @@
1
- import * as THREE from 'three';
2
- import { Selection } from '@colijnit/configuratorapi/build/model/selection';
3
- export class SceneUtils {
4
- static TrySelectorConnection(scene, parent, part1, part2, isFirstElement, createAddableFn) {
5
- let addable;
6
- if (createAddableFn) {
7
- addable = part2;
8
- part2 = createAddableFn(addable);
9
- }
10
- if (part1 && part2) {
11
- let con1;
12
- let con2;
13
- // if part2 is an addable and decoConnection is present, then no need to iterate through connectors
14
- if (addable && addable instanceof Selection && addable.decoConnection) {
15
- con1 = part1.children.find(c => c.name === addable.decoConnection);
16
- if (!con1) {
17
- return false;
18
- }
19
- for (let ii = 0; ii < part2.children.length; ii++) {
20
- con2 = part2.children[ii];
21
- // if these connectors can connect connect them
22
- if (!con1['connected'] && !con2['connected'] && this.CanSelectorConnect(part1.children, con1, con2, isFirstElement)) {
23
- // if addable, continue this loop with a new addable
24
- if (addable) {
25
- const newPart2 = createAddableFn(addable, part2, part1);
26
- // reference of part2 changed, so refresh con2
27
- this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
28
- }
29
- else {
30
- return this.SelectorConnect(scene, parent, con1, con2);
31
- }
32
- }
33
- }
34
- }
35
- else {
36
- for (let i = 0; i < part1.children.length; i++) {
37
- for (let ii = 0; ii < part2.children.length; ii++) {
38
- con1 = part1.children[i];
39
- con2 = part2.children[ii];
40
- // if these connectors can connect connect them
41
- if (!con1['connected'] && !con2['connected'] && this.CanSelectorConnect(part1.children, con1, con2, isFirstElement)) {
42
- // if addable, continue this loop with a new addable
43
- if (addable) {
44
- const newPart2 = createAddableFn(addable, part2, part1);
45
- // reference of part2 changed, so refresh con2
46
- this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
47
- }
48
- else {
49
- return this.SelectorConnect(scene, parent, con1, con2);
50
- }
51
- }
52
- }
53
- }
54
- }
55
- }
56
- return false;
57
- }
58
- // public static TrySelectorConnection(scene: THREE.Scene, parent: THREE.Object3D,
59
- // part1: any, part2: any, createAddableFn?: Function): boolean {
60
- // let addable: any;
61
- // if (createAddableFn) {
62
- // addable = part2;
63
- // part2 = createAddableFn(addable);
64
- // }
65
- // for (let i = 0; i < part1.children.length; i++) {
66
- // for (let ii = 0; ii < part2.children.length; ii++) {
67
- // const con1: THREE.Object3D = part1.children[i];
68
- // const con2: THREE.Object3D = part2.children[ii];
69
- // // if these connectors can connect connect them
70
- // if (!con1['connected'] && !con2['connected'] && this.CanSelectorConnect(con1, con2)) {
71
- // // if addable, continue this loop with a new addable
72
- // if (addable) {
73
- // const newPart2: THREE.Object3D = createAddableFn(addable, part2, part1);
74
- // // reference of part2 changed, so refresh con2
75
- // this.SelectorConnect(scene, parent, con1, newPart2.children[ii]);
76
- // } else {
77
- // return this.SelectorConnect(scene, parent, con1, con2);
78
- // }
79
- // }
80
- // }
81
- // }
82
- // return false;
83
- // }
84
- static Convert3DPointToScreenPoint(point, camera, width, height) {
85
- if (!point) {
86
- return new THREE.Vector2();
87
- }
88
- const vector = point.clone().project(camera);
89
- vector.x = (vector.x + 1) / 2 * width;
90
- vector.y = -(vector.y - 1) / 2 * height;
91
- return new THREE.Vector2(vector.x, vector.y);
92
- }
93
- static CanSelectorConnect(consPart1, con1, con2, startWithMale) {
94
- const con1Name = (con1.constructor.name === 'Mesh' || con1.constructor.name === 'Object3D') ? con1.name : con1.connector;
95
- const con2Name = (con2.constructor.name === 'Mesh' || con2.constructor.name === 'Object3D') ? con2.name : con2.connector;
96
- const sameParent = (con1.constructor.name === 'Mesh' || con1.constructor.name === 'Object3D') &&
97
- (con2.constructor.name === 'Mesh' || con2.constructor.name === 'Object3D') ? con1.parent === con2.parent : false;
98
- if (!con1Name || !con2Name) {
99
- return false;
100
- }
101
- const parts1 = con1Name.toUpperCase().split('_'), parts2 = con2Name.toUpperCase().split('_');
102
- if (parts1.length >= 3 && parts2.length >= 3 && !sameParent) {
103
- const connectable = parts1[0] === 'C' && parts2[0] === 'C' &&
104
- parts1[1] === parts2[1] && parts1[2] !== parts2[2];
105
- return connectable;
106
- }
107
- return false;
108
- }
109
- // public static CanSelectorConnect(con1: THREE.Object3D | any, con2: THREE.Object3D | any): boolean {
110
- // const con1Name: string = con1 instanceof THREE.Object3D ? con1.name : con1.connector;
111
- // const con2Name: string = con2 instanceof THREE.Object3D ? con2.name : con2.connector;
112
- // const sameParent: boolean = con1 instanceof THREE.Object3D && con2 instanceof THREE.Object3D ? con1.parent === con2.parent : false;
113
- // const parts1: string[] = con1Name.toUpperCase().split('_'),
114
- // parts2: string[] = con2Name.toUpperCase().split('_');
115
- // if (parts1.length >= 3 && parts2.length >= 3 && !sameParent) {
116
- // const connectable: boolean = parts1[0] === 'C' && parts2[0] === 'C' &&
117
- // parts1[1] === parts2[1] && parts1[2] !== parts2[2];
118
- // return connectable;
119
- // }
120
- // return false;
121
- // }
122
- static SelectorConnect(scene, parent, con1, con2) {
123
- if (!scene || !parent) {
124
- return false;
125
- }
126
- con1['connectedTo'] = con2 && con2.parent ? con2.parent.name : '';
127
- con2['connectedTo'] = con1 && con1.parent ? con1.parent.name : '';
128
- const motherRotation = new THREE.Euler(0, 0, 0);
129
- const motherPosition = new THREE.Vector3(0, 0, 0);
130
- parent.updateMatrixWorld();
131
- motherRotation.copy(parent.rotation);
132
- parent.getWorldPosition(motherPosition);
133
- parent.rotation.set(0, 0, 0);
134
- parent.position.set(0, 0, 0);
135
- scene.updateMatrixWorld(true);
136
- const con1Quat = new THREE.Quaternion();
137
- if (con1) {
138
- con1.getWorldQuaternion(con1Quat);
139
- }
140
- const con2Quat = new THREE.Quaternion();
141
- if (con2) {
142
- con2.getWorldQuaternion(con2Quat);
143
- }
144
- const con1QuatParent = new THREE.Quaternion();
145
- if (con1 && con1.parent) {
146
- con1.parent.getWorldQuaternion(con1QuatParent);
147
- }
148
- const con2QuatParent = new THREE.Quaternion();
149
- if (con2 && con2.parent) {
150
- con2.parent.getWorldQuaternion(con2QuatParent);
151
- }
152
- const rotation = new THREE.Quaternion().multiplyQuaternions(con1Quat.invert(), con2Quat).multiply(new THREE.Quaternion().multiplyQuaternions(con1QuatParent, con1QuatParent));
153
- if (con2 && con2.parent) {
154
- con2.parent.quaternion.copy(rotation);
155
- }
156
- // Update because the matrix has been tempered with
157
- scene.updateMatrixWorld(true);
158
- // Move the connectors towards eachother
159
- const con1Pos = new THREE.Vector3();
160
- if (con1) {
161
- con1.getWorldPosition(con1Pos);
162
- }
163
- const con2Pos = new THREE.Vector3();
164
- if (con2) {
165
- con2.getWorldPosition(con2Pos);
166
- }
167
- const move = con1Pos.sub(con2Pos);
168
- if (con2 && con2.parent) {
169
- con2.parent.position.x += move.x;
170
- con2.parent.position.y += move.y;
171
- con2.parent.position.z += move.z;
172
- }
173
- // reset parent's objects rotation and position
174
- parent.rotation.copy(motherRotation);
175
- parent.position.copy(motherPosition);
176
- scene.updateMatrixWorld(true);
177
- // Set the connected flag
178
- if (con1) {
179
- con1['connected'] = true;
180
- }
181
- if (con2) {
182
- con2['connected'] = true;
183
- }
184
- return true;
185
- }
186
- }
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvc2NlbmUtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBRTFFLE1BQU0sT0FBTyxVQUFVO0lBRVosTUFBTSxDQUFDLHFCQUFxQixDQUFDLEtBQWtCLEVBQUUsTUFBc0IsRUFDNUUsS0FBVSxFQUFFLEtBQVUsRUFBRSxjQUF1QixFQUFFLGVBQTBCO1FBQ3pFLElBQUksT0FBWSxDQUFDO1FBQ2pCLElBQUksZUFBZSxFQUFFO1lBQ2pCLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDaEIsS0FBSyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQztRQUNELElBQUksS0FBSyxJQUFJLEtBQUssRUFBRTtZQUNoQixJQUFJLElBQW9CLENBQUM7WUFDekIsSUFBSSxJQUFvQixDQUFDO1lBQ3pCLG1HQUFtRztZQUNuRyxJQUFJLE9BQU8sSUFBSSxPQUFPLFlBQVksU0FBUyxJQUFJLE9BQU8sQ0FBQyxjQUFjLEVBQUU7Z0JBQ25FLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNuRSxJQUFJLENBQUMsSUFBSSxFQUFFO29CQUNQLE9BQU8sS0FBSyxDQUFDO2lCQUNoQjtnQkFDRCxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUU7b0JBQy9DLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUMxQiwrQ0FBK0M7b0JB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Q0FBQztRQUNuRCxJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNsQztRQUVELE1BQU0sSUFBSSxHQUFrQixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDcEM7UUFFRCwrQ0FBK0M7UUFDL0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFckMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTlCLHlCQUF5QjtRQUN6QixJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDNUI7UUFDRCxJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDNUI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBaUVKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9zZWxlY3Rpb24nO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNjZW5lVXRpbHMge1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgVHJ5U2VsZWN0b3JDb25uZWN0aW9uKHNjZW5lOiBUSFJFRS5TY2VuZSwgcGFyZW50OiBUSFJFRS5PYmplY3QzRCxcclxuICAgICAgcGFydDE6IGFueSwgcGFydDI6IGFueSwgaXNGaXJzdEVsZW1lbnQ6IGJvb2xlYW4sIGNyZWF0ZUFkZGFibGVGbj86IEZ1bmN0aW9uKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGFkZGFibGU6IGFueTtcclxuICAgICAgICBpZiAoY3JlYXRlQWRkYWJsZUZuKSB7XHJcbiAgICAgICAgICAgIGFkZGFibGUgPSBwYXJ0MjtcclxuICAgICAgICAgICAgcGFydDIgPSBjcmVhdGVBZGRhYmxlRm4oYWRkYWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwYXJ0MSAmJiBwYXJ0Mikge1xyXG4gICAgICAgICAgICBsZXQgY29uMTogVEhSRUUuT2JqZWN0M0Q7XHJcbiAgICAgICAgICAgIGxldCBjb24yOiBUSFJFRS5PYmplY3QzRDtcclxuICAgICAgICAgICAgLy8gaWYgcGFydDIgaXMgYW4gYWRkYWJsZSBhbmQgZGVjb0Nvbm5lY3Rpb24gaXMgcHJlc2VudCwgdGhlbiBubyBuZWVkIHRvIGl0ZXJhdGUgdGhyb3VnaCBjb25uZWN0b3JzXHJcbiAgICAgICAgICAgIGlmIChhZGRhYmxlICYmIGFkZGFibGUgaW5zdGFuY2VvZiBTZWxlY3Rpb24gJiYgYWRkYWJsZS5kZWNvQ29ubmVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY29uMSA9IHBhcnQxLmNoaWxkcmVuLmZpbmQoYyA9PiBjLm5hbWUgPT09IGFkZGFibGUuZGVjb0Nvbm5lY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjb24xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IHBhcnQyLmNoaWxkcmVuLmxlbmd0aDsgaWkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbjIgPSBwYXJ0Mi5jaGlsZHJlbltpaV07XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlc2UgY29ubmVjdG9ycyBjYW4gY29ubmVjdCBjb25uZWN0IHRoZW1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbjFbJ2Nvbm5lY3RlZCddICYmICFjb24yWydjb25uZWN0ZWQnXSAmJiB0aGlzLkNhblNlbGVjdG9yQ29ubmVjdChwYXJ0MS5jaGlsZHJlbiwgY29uMSwgY29uMiwgaXNGaXJzdEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGFkZGFibGUsIGNvbnRpbnVlIHRoaXMgbG9vcCB3aXRoIGEgbmV3IGFkZGFibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1BhcnQyOiBhbnkgPSBjcmVhdGVBZGRhYmxlRm4oYWRkYWJsZSwgcGFydDIsIHBhcnQxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBvZiBwYXJ0MiBjaGFuZ2VkLCBzbyByZWZyZXNoIGNvbjJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU2VsZWN0b3JDb25uZWN0KHNjZW5lLCBwYXJlbnQsIGNvbjEsIG5ld1BhcnQyLmNoaWxkcmVuW2lpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgY29uMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnQxLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IHBhcnQyLmNoaWxkcmVuLmxlbmd0aDsgaWkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb24xID0gcGFydDEuY2hpbGRyZW5baV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbjIgPSBwYXJ0Mi5jaGlsZHJlbltpaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXNlIGNvbm5lY3RvcnMgY2FuIGNvbm5lY3QgY29ubmVjdCB0aGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29uMVsnY29ubmVjdGVkJ10gJiYgIWNvbjJbJ2Nvbm5lY3RlZCddICYmIHRoaXMuQ2FuU2VsZWN0b3JDb25uZWN0KHBhcnQxLmNoaWxkcmVuLCBjb24xLCBjb24yLCBpc0ZpcnN0RWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGFkZGFibGUsIGNvbnRpbnVlIHRoaXMgbG9vcCB3aXRoIGEgbmV3IGFkZGFibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UGFydDI6IGFueSA9IGNyZWF0ZUFkZGFibGVGbihhZGRhYmxlLCBwYXJ0MiwgcGFydDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBvZiBwYXJ0MiBjaGFuZ2VkLCBzbyByZWZyZXNoIGNvbjJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNlbGVjdG9yQ29ubmVjdChzY2VuZSwgcGFyZW50LCBjb24xLCBuZXdQYXJ0Mi5jaGlsZHJlbltpaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5TZWxlY3RvckNvbm5lY3Qoc2NlbmUsIHBhcmVudCwgY29uMSwgY29uMik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgVHJ5U2VsZWN0b3JDb25uZWN0aW9uKHNjZW5lOiBUSFJFRS5TY2VuZSwgcGFyZW50OiBUSFJFRS5PYmplY3QzRCxcclxuICAgIC8vICAgICBwYXJ0MTogYW55LCBwYXJ0MjogYW55LCBjcmVhdGVBZGRhYmxlRm4/OiBGdW5jdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgLy8gICAgIGxldCBhZGRhYmxlOiBhbnk7XHJcbiAgICAvLyAgICAgaWYgKGNyZWF0ZUFkZGFibGVGbikge1xyXG4gICAgLy8gICAgICAgICBhZGRhYmxlID0gcGFydDI7XHJcbiAgICAvLyAgICAgICAgIHBhcnQyID0gY3JlYXRlQWRkYWJsZUZuKGFkZGFibGUpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnQxLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAvLyAgICAgICAgIGZvciAobGV0IGlpID0gMDsgaWkgPCBwYXJ0Mi5jaGlsZHJlbi5sZW5ndGg7IGlpKyspIHtcclxuICAgIC8vICAgICAgICAgICAgIGNvbnN0IGNvbjE6IFRIUkVFLk9iamVjdDNEID0gcGFydDEuY2hpbGRyZW5baV07XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBjb24yOiBUSFJFRS5PYmplY3QzRCA9IHBhcnQyLmNoaWxkcmVuW2lpXTtcclxuICAgIC8vICAgICAgICAgICAgIC8vIGlmIHRoZXNlIGNvbm5lY3RvcnMgY2FuIGNvbm5lY3QgY29ubmVjdCB0aGVtXHJcbiAgICAvLyAgICAgICAgICAgICBpZiAoIWNvbjFbJ2Nvbm5lY3RlZCddICYmICFjb24yWydjb25uZWN0ZWQnXSAmJiB0aGlzLkNhblNlbGVjdG9yQ29ubmVjdChjb24xLCBjb24yKSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIC8vIGlmIGFkZGFibGUsIGNvbnRpbnVlIHRoaXMgbG9vcCB3aXRoIGEgbmV3IGFkZGFibGVcclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiAoYWRkYWJsZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQYXJ0MjogVEhSRUUuT2JqZWN0M0QgPSBjcmVhdGVBZGRhYmxlRm4oYWRkYWJsZSwgcGFydDIsIHBhcnQxKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIG9mIHBhcnQyIGNoYW5nZWQsIHNvIHJlZnJlc2ggY29uMlxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLlNlbGVjdG9yQ29ubmVjdChzY2VuZSwgcGFyZW50LCBjb24xLCBuZXdQYXJ0Mi5jaGlsZHJlbltpaV0pO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlNlbGVjdG9yQ29ubmVjdChzY2VuZSwgcGFyZW50LCBjb24xLCBjb24yKTtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgQ29udmVydDNEUG9pbnRUb1NjcmVlblBvaW50KHBvaW50OiBUSFJFRS5WZWN0b3IzLCBjYW1lcmE6IFRIUkVFLkNhbWVyYSwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBUSFJFRS5WZWN0b3IyIHtcclxuICAgICAgICBpZiAoIXBvaW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgVEhSRUUuVmVjdG9yMigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB2ZWN0b3I6IFRIUkVFLlZlY3RvcjMgPSBwb2ludC5jbG9uZSgpLnByb2plY3QoY2FtZXJhKTtcclxuICAgICAgICB2ZWN0b3IueCA9ICh2ZWN0b3IueCArIDEpIC8gMiAqIHdpZHRoO1xyXG4gICAgICAgIHZlY3Rvci55ID0gLSh2ZWN0b3IueSAtIDEpIC8gMiAqIGhlaWdodDtcclxuICAgICAgICByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjIodmVjdG9yLngsIHZlY3Rvci55KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBDYW5TZWxlY3RvckNvbm5lY3QoXHJcbiAgICAgIGNvbnNQYXJ0MTogVEhSRUUuT2JqZWN0M0RbXSwgY29uMTogVEhSRUUuT2JqZWN0M0QgfCBhbnksIGNvbjI6IFRIUkVFLk9iamVjdDNEIHwgYW55LCBzdGFydFdpdGhNYWxlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGNvbjFOYW1lOiBzdHJpbmcgPSAoY29uMS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTWVzaCcgfHwgY29uMS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnT2JqZWN0M0QnKSA/IGNvbjEubmFtZSA6IGNvbjEuY29ubmVjdG9yO1xyXG4gICAgICAgIGNvbnN0IGNvbjJOYW1lOiBzdHJpbmcgPSAoY29uMi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTWVzaCcgfHwgY29uMi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnT2JqZWN0M0QnKSA/IGNvbjIubmFtZSA6IGNvbjIuY29ubmVjdG9yO1xyXG4gICAgICAgIGNvbnN0IHNhbWVQYXJlbnQ6IGJvb2xlYW4gPSAoY29uMS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTWVzaCcgfHwgY29uMS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnT2JqZWN0M0QnKSAmJlxyXG4gICAgICAgIChjb24yLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdNZXNoJyB8fCBjb24yLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdPYmplY3QzRCcpID8gY29uMS5wYXJlbnQgPT09IGNvbjIucGFyZW50IDogZmFsc2U7XHJcbiAgICAgICAgaWYgKCFjb24xTmFtZSB8fCAhY29uMk5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwYXJ0czE6IHN0cmluZ1tdID0gY29uMU5hbWUudG9VcHBlckNhc2UoKS5zcGxpdCgnXycpLFxyXG4gICAgICAgICAgcGFydHMyOiBzdHJpbmdbXSA9IGNvbjJOYW1lLnRvVXBwZXJDYXNlKCkuc3BsaXQoJ18nKTtcclxuICAgICAgICBpZiAocGFydHMxLmxlbmd0aCA+PSAzICYmIHBhcnRzMi5sZW5ndGggPj0gMyAmJiAhc2FtZVBhcmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBjb25uZWN0YWJsZTogYm9vbGVhbiA9IHBhcnRzMVswXSA9PT0gJ0MnICYmIHBhcnRzMlswXSA9PT0gJ0MnICYmXHJcbiAgICAgICAgICAgICAgcGFydHMxWzFdID09PSBwYXJ0czJbMV0gJiYgcGFydHMxWzJdICE9PSBwYXJ0czJbMl07XHJcbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0YWJsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHB1YmxpYyBzdGF0aWMgQ2FuU2VsZWN0b3JDb25uZWN0KGNvbjE6IFRIUkVFLk9iamVjdDNEIHwgYW55LCBjb24yOiBUSFJFRS5PYmplY3QzRCB8IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbjFOYW1lOiBzdHJpbmcgPSBjb24xIGluc3RhbmNlb2YgVEhSRUUuT2JqZWN0M0QgPyBjb24xLm5hbWUgOiBjb24xLmNvbm5lY3RvcjtcclxuICAgIC8vICAgICBjb25zdCBjb24yTmFtZTogc3RyaW5nID0gY29uMiBpbnN0YW5jZW9mIFRIUkVFLk9iamVjdDNEID8gY29uMi5uYW1lIDogY29uMi5jb25uZWN0b3I7XHJcbiAgICAvLyAgICAgY29uc3Qgc2FtZVBhcmVudDogYm9vbGVhbiA9IGNvbjEgaW5zdGFuY2VvZiBUSFJFRS5PYmplY3QzRCAmJiBjb24yIGluc3RhbmNlb2YgVEhSRUUuT2JqZWN0M0QgPyBjb24xLnBhcmVudCA9PT0gY29uMi5wYXJlbnQgOiBmYWxzZTtcclxuICAgIC8vICAgICBjb25zdCBwYXJ0czE6IHN0cmluZ1tdID0gY29uMU5hbWUudG9VcHBlckNhc2UoKS5zcGxpdCgnXycpLFxyXG4gICAgLy8gICAgICAgICBwYXJ0czI6IHN0cmluZ1tdID0gY29uMk5hbWUudG9VcHBlckNhc2UoKS5zcGxpdCgnXycpO1xyXG4gICAgLy8gICAgIGlmIChwYXJ0czEubGVuZ3RoID49IDMgJiYgcGFydHMyLmxlbmd0aCA+PSAzICYmICFzYW1lUGFyZW50KSB7XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGNvbm5lY3RhYmxlOiBib29sZWFuID0gcGFydHMxWzBdID09PSAnQycgJiYgcGFydHMyWzBdID09PSAnQycgJiZcclxuICAgIC8vICAgICAgICAgICAgIHBhcnRzMVsxXSA9PT0gcGFydHMyWzFdICYmIHBhcnRzMVsyXSAhPT0gcGFydHMyWzJdO1xyXG4gICAgLy8gICAgICAgICByZXR1cm4gY29ubmVjdGFibGU7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHJldHVybiBmYWxzZTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBTZWxlY3RvckNvbm5lY3Qoc2NlbmU6IFRIUkVFLlNjZW5lLCBwYXJlbnQ6IFRIUkVFLk9iamVjdDNELCBjb24xOiBUSFJFRS5PYmplY3QzRCwgY29uMjogVEhSRUUuT2JqZWN0M0QpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXNjZW5lIHx8ICFwYXJlbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb24xWydjb25uZWN0ZWRUbyddID0gY29uMiAmJiBjb24yLnBhcmVudCA/IGNvbjIucGFyZW50Lm5hbWUgOiAnJztcclxuICAgICAgICBjb24yWydjb25uZWN0ZWRUbyddID0gY29uMSAmJiBjb24xLnBhcmVudCA/IGNvbjEucGFyZW50Lm5hbWUgOiAnJztcclxuXHJcbiAgICAgICAgY29uc3QgbW90aGVyUm90YXRpb246IFRIUkVFLkV1bGVyID0gbmV3IFRIUkVFLkV1bGVyKDAsIDAsIDApO1xyXG4gICAgICAgIGNvbnN0IG1vdGhlclBvc2l0aW9uOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoMCwgMCwgMCk7XHJcblxyXG4gICAgICAgIHBhcmVudC51cGRhdGVNYXRyaXhXb3JsZCgpO1xyXG4gICAgICAgIG1vdGhlclJvdGF0aW9uLmNvcHkocGFyZW50LnJvdGF0aW9uKTtcclxuICAgICAgICBwYXJlbnQuZ2V0V29ybGRQb3NpdGlvbihtb3RoZXJQb3NpdGlvbik7XHJcblxyXG4gICAgICAgIHBhcmVudC5yb3RhdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICAgICAgcGFyZW50LnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcclxuXHJcbiAgICAgICAgc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbjFRdWF0OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgICAgICBpZiAoY29uMSkge1xyXG4gICAgICAgICAgICBjb24xLmdldFdvcmxkUXVhdGVybmlvbihjb24xUXVhdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbjJRdWF0OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgICAgICBpZiAoY29uMikge1xyXG4gICAgICAgICAgICBjb24yLmdldFdvcmxkUXVhdGVybmlvbihjb24yUXVhdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbjFRdWF0UGFyZW50OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgICAgICBpZiAoY29uMSAmJiBjb24xLnBhcmVudCkge1xyXG4gICAgICAgICAgICBjb24xLnBhcmVudC5nZXRXb3JsZFF1YXRlcm5pb24oY29uMVF1YXRQYXJlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjb24yUXVhdFBhcmVudDogVEhSRUUuUXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XHJcbiAgICAgICAgaWYgKGNvbjIgJiYgY29uMi5wYXJlbnQpIHtcclxuICAgICAgICAgICAgY29uMi5wYXJlbnQuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjJRdWF0UGFyZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJvdGF0aW9uOiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5tdWx0aXBseVF1YXRlcm5pb25zKFxyXG4gICAgICAgICAgY29uMVF1YXQuaW52ZXJ0KCksXHJcbiAgICAgICAgICBjb24yUXVhdFxyXG4gICAgICAgICkubXVsdGlwbHkoXHJcbiAgICAgICAgICBuZXcgVEhSRUUuUXVhdGVybmlvbigpLm11bHRpcGx5UXVhdGVybmlvbnMoXHJcbiAgICAgICAgICAgIGNvbjFRdWF0UGFyZW50LFxyXG4gICAgICAgICAgICBjb24xUXVhdFBhcmVudFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKGNvbjIgJiYgY29uMi5wYXJlbnQpIHtcclxuICAgICAgICAgICAgY29uMi5wYXJlbnQucXVhdGVybmlvbi5jb3B5KHJvdGF0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIGJlY2F1c2UgdGhlIG1hdHJpeCBoYXMgYmVlbiB0ZW1wZXJlZCB3aXRoXHJcbiAgICAgICAgc2NlbmUudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcblxyXG4gICAgICAgIC8vIE1vdmUgdGhlIGNvbm5lY3RvcnMgdG93YXJkcyBlYWNob3RoZXJcclxuICAgICAgICBjb25zdCBjb24xUG9zOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgICAgICBpZiAoY29uMSkge1xyXG4gICAgICAgICAgICBjb24xLmdldFdvcmxkUG9zaXRpb24oY29uMVBvcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbjJQb3M6IFRIUkVFLlZlY3RvcjMgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgICAgIGlmIChjb24yKSB7XHJcbiAgICAgICAgICAgIGNvbjIuZ2V0V29ybGRQb3NpdGlvbihjb24yUG9zKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1vdmU6IFRIUkVFLlZlY3RvcjMgPSBjb24xUG9zLnN1Yihjb24yUG9zKTtcclxuICAgICAgICBpZiAoY29uMiAmJiBjb24yLnBhcmVudCkge1xyXG4gICAgICAgICAgICBjb24yLnBhcmVudC5wb3NpdGlvbi54ICs9IG1vdmUueDtcclxuICAgICAgICAgICAgY29uMi5wYXJlbnQucG9zaXRpb24ueSArPSBtb3ZlLnk7XHJcbiAgICAgICAgICAgIGNvbjIucGFyZW50LnBvc2l0aW9uLnogKz0gbW92ZS56O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcmVzZXQgcGFyZW50J3Mgb2JqZWN0cyByb3RhdGlvbiBhbmQgcG9zaXRpb25cclxuICAgICAgICBwYXJlbnQucm90YXRpb24uY29weShtb3RoZXJSb3RhdGlvbik7XHJcbiAgICAgICAgcGFyZW50LnBvc2l0aW9uLmNvcHkobW90aGVyUG9zaXRpb24pO1xyXG5cclxuICAgICAgICBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuXHJcbiAgICAgICAgLy8gU2V0IHRoZSBjb25uZWN0ZWQgZmxhZ1xyXG4gICAgICAgIGlmIChjb24xKSB7XHJcbiAgICAgICAgICAgIGNvbjFbJ2Nvbm5lY3RlZCddID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbjIpIHtcclxuICAgICAgICAgICAgY29uMlsnY29ubmVjdGVkJ10gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBwcml2YXRlIHN0YXRpYyBTZWxlY3RvckNvbm5lY3Qoc2NlbmU6IFRIUkVFLlNjZW5lLCBwYXJlbnQ6IFRIUkVFLk9iamVjdDNELCBjb24xOiBUSFJFRS5PYmplY3QzRCwgY29uMjogVEhSRUUuT2JqZWN0M0QpOiBib29sZWFuIHtcclxuICAgIC8vICAgICBpZiAoIXNjZW5lIHx8ICFwYXJlbnQpIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICBjb24xWydjb25uZWN0ZWRUbyddID0gY29uMi5wYXJlbnQubmFtZTtcclxuICAgIC8vICAgICBjb24yWydjb25uZWN0ZWRUbyddID0gY29uMS5wYXJlbnQubmFtZTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgY29uc3QgbW90aGVyUm90YXRpb246IFRIUkVFLkV1bGVyID0gbmV3IFRIUkVFLkV1bGVyKDAsIDAsIDApO1xyXG4gICAgLy8gICAgIGNvbnN0IG1vdGhlclBvc2l0aW9uOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoMCwgMCwgMCk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xyXG4gICAgLy8gICAgIG1vdGhlclJvdGF0aW9uLmNvcHkocGFyZW50LnJvdGF0aW9uKTtcclxuICAgIC8vICAgICBwYXJlbnQuZ2V0V29ybGRQb3NpdGlvbihtb3RoZXJQb3NpdGlvbik7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgIHBhcmVudC5yb3RhdGlvbi5zZXQoMCwgMCwgMCk7XHJcbiAgICAvLyAgICAgcGFyZW50LnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgY29uc3QgY29uMVF1YXQ6IFRIUkVFLlF1YXRlcm5pb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpO1xyXG4gICAgLy8gICAgIGNvbjEuZ2V0V29ybGRRdWF0ZXJuaW9uKGNvbjFRdWF0KTtcclxuICAgIC8vICAgICBjb25zdCBjb24yUXVhdDogVEhSRUUuUXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XHJcbiAgICAvLyAgICAgY29uMi5nZXRXb3JsZFF1YXRlcm5pb24oY29uMlF1YXQpO1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbjFRdWF0UGFyZW50OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgIC8vICAgICBjb24xLnBhcmVudC5nZXRXb3JsZFF1YXRlcm5pb24oY29uMVF1YXRQYXJlbnQpO1xyXG4gICAgLy8gICAgIGNvbnN0IGNvbjJRdWF0UGFyZW50OiBUSFJFRS5RdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcclxuICAgIC8vICAgICBjb24yLnBhcmVudC5nZXRXb3JsZFF1YXRlcm5pb24oY29uMlF1YXRQYXJlbnQpO1xyXG4gICAgLy9cclxuICAgIC8vICAgICBjb25zdCByb3RhdGlvbjogVEhSRUUuUXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkubXVsdGlwbHlRdWF0ZXJuaW9ucyhcclxuICAgIC8vICAgICAgICAgY29uMVF1YXQuaW52ZXJ0KCksXHJcbiAgICAvLyAgICAgICAgIGNvbjJRdWF0XHJcbiAgICAvLyAgICAgKS5tdWx0aXBseShcclxuICAgIC8vICAgICAgICAgbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5tdWx0aXBseVF1YXRlcm5pb25zKFxyXG4gICAgLy8gICAgICAgICAgICAgY29uMVF1YXRQYXJlbnQsXHJcbiAgICAvLyAgICAgICAgICAgICBjb24xUXVhdFBhcmVudFxyXG4gICAgLy8gICAgICAgICApXHJcbiAgICAvLyAgICAgKTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgY29uMi5wYXJlbnQucXVhdGVybmlvbi5jb3B5KHJvdGF0aW9uKTtcclxuICAgIC8vICAgICAvLyBVcGRhdGUgYmVjYXVzZSB0aGUgbWF0cml4IGhhcyBiZWVuIHRlbXBlcmVkIHdpdGhcclxuICAgIC8vICAgICBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgLy8gTW92ZSB0aGUgY29ubmVjdG9ycyB0b3dhcmRzIGVhY2hvdGhlclxyXG4gICAgLy8gICAgIGNvbnN0IGNvbjFQb3M6IFRIUkVFLlZlY3RvcjMgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgLy8gICAgIGNvbjEuZ2V0V29ybGRQb3NpdGlvbihjb24xUG9zKTtcclxuICAgIC8vICAgICBjb25zdCBjb24yUG9zOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIC8vICAgICBjb24yLmdldFdvcmxkUG9zaXRpb24oY29uMlBvcyk7XHJcbiAgICAvL1xyXG4gICAgLy8gICAgIGNvbnN0IG1vdmU6IFRIUkVFLlZlY3RvcjMgPSBjb24xUG9zLnN1Yihjb24yUG9zKTtcclxuICAgIC8vICAgICBjb24yLnBhcmVudC5wb3NpdGlvbi54ICs9IG1vdmUueDtcclxuICAgIC8vICAgICBjb24yLnBhcmVudC5wb3NpdGlvbi55ICs9IG1vdmUueTtcclxuICAgIC8vICAgICBjb24yLnBhcmVudC5wb3NpdGlvbi56ICs9IG1vdmUuejtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgLy8gcmVzZXQgcGFyZW50J3Mgb2JqZWN0cyByb3RhdGlvbiBhbmQgcG9zaXRpb25cclxuICAgIC8vICAgICBwYXJlbnQucm90YXRpb24uY29weShtb3RoZXJSb3RhdGlvbik7XHJcbiAgICAvLyAgICAgcGFyZW50LnBvc2l0aW9uLmNvcHkobW90aGVyUG9zaXRpb24pO1xyXG4gICAgLy9cclxuICAgIC8vICAgICBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuICAgIC8vXHJcbiAgICAvLyAgICAgLy8gU2V0IHRoZSBjb25uZWN0ZWQgZmxhZ1xyXG4gICAgLy8gICAgIGNvbjFbJ2Nvbm5lY3RlZCddID0gdHJ1ZTtcclxuICAgIC8vICAgICBjb24yWydjb25uZWN0ZWQnXSA9IHRydWU7XHJcbiAgICAvLyAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAvLyB9XHJcblxyXG59XHJcbiJdfQ==
@@ -1,226 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import * as THREE from "three";
3
- import { ObjectUtils } from "./object.utils";
4
- export class ThreedUtils {
5
- constructor() {
6
- this._objectCache = new Map();
7
- }
8
- clearCache() {
9
- const objs = Array.from(this._objectCache.values());
10
- objs.forEach(o => ObjectUtils.DisposeObject(o));
11
- this._objectCache.clear();
12
- }
13
- download3DSource(fileName, setVisibleFalse = true) {
14
- return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
15
- fileName = fileName.replace('.unity3d', '');
16
- let lookupFileName = fileName + (fileName.indexOf('.glb') < 0 ? '.glb' : '');
17
- if (this._objectCache.has(lookupFileName)) {
18
- resolve(this._objectCache.get(lookupFileName));
19
- return;
20
- }
21
- this.loadGlbSource(lookupFileName, setVisibleFalse)
22
- .then((obj) => {
23
- this._objectCache.set(lookupFileName, obj);
24
- resolve(obj);
25
- })
26
- .catch(() => {
27
- reject(`GLB source not found! (${lookupFileName})`);
28
- });
29
- }));
30
- }
31
- readFileAsText(file) {
32
- const fileReader = new FileReader();
33
- return new Promise((resolve, reject) => {
34
- fileReader.onload = (e) => resolve(e.target.result);
35
- fileReader.onerror = error => reject(error);
36
- fileReader.readAsText(file);
37
- });
38
- }
39
- loadJsonModel(filePath) {
40
- return __awaiter(this, void 0, void 0, function* () {
41
- if (this._objectCache.has(filePath)) {
42
- return Promise.resolve(this._objectCache.get(filePath));
43
- }
44
- const json = yield this._readJsonFile(filePath);
45
- const loader = new THREE.ObjectLoader();
46
- loader.crossOrigin = 'Anonymous';
47
- return new Promise((resolve, reject) => {
48
- try {
49
- const obj = loader.parse(json);
50
- this._objectCache.set(filePath, obj);
51
- resolve(obj);
52
- }
53
- catch (e) {
54
- reject(null);
55
- }
56
- });
57
- });
58
- }
59
- loadJsonObjectModel(filePath) {
60
- return __awaiter(this, void 0, void 0, function* () {
61
- if (this._objectCache.has(filePath)) {
62
- return Promise.resolve(this._objectCache.get(filePath));
63
- }
64
- const loader = new THREE.ObjectLoader();
65
- loader.setCrossOrigin('Anonymous');
66
- loader.setResourcePath('');
67
- return new Promise((resolve, reject) => {
68
- loader.load(filePath, (object) => {
69
- const obj = (object.type === 'Scene' && object.children[0].type === 'Object3D') ? object.children[0] : object;
70
- this._objectCache.set(filePath, obj);
71
- resolve(obj);
72
- }, xhr => null, error => reject(error));
73
- });
74
- });
75
- }
76
- loadGlbModel(file, cleanUp = true) {
77
- return __awaiter(this, void 0, void 0, function* () {
78
- if (this._objectCache.has(file)) {
79
- return Promise.resolve(this._objectCache.get(file));
80
- }
81
- if (!window.hasOwnProperty('loadGLTF')) {
82
- console.error('loadGLTF not defined in window global');
83
- return null;
84
- }
85
- // const loader = new GLTFLoader();
86
- const obj = yield window.loadGLTF(file);
87
- if (obj) {
88
- this._cleanedUpObjects(obj, cleanUp);
89
- this._objectCache.set(file, obj);
90
- return obj;
91
- }
92
- else {
93
- return null;
94
- }
95
- });
96
- }
97
- loadGlbSource(file, setVisibleFalse = true) {
98
- return __awaiter(this, void 0, void 0, function* () {
99
- const obj = yield this.loadGlbModel(file, false);
100
- if (obj) {
101
- obj.children = obj.children.filter(c => !(c instanceof THREE.Camera || (c.constructor.name && c.constructor.name.toLowerCase().indexOf('camera') > -1)));
102
- obj.children.sort((a, b) => a['name'] < b['name'] ? 1 : -1);
103
- obj.children.forEach((c) => {
104
- c.traverse((t) => {
105
- t.visible = !t.name.toLowerCase().startsWith('c_');
106
- });
107
- if (setVisibleFalse) {
108
- c.visible = false;
109
- }
110
- });
111
- if (obj.children.length === 1 && (obj.children[0] instanceof THREE.Group || obj.children[0].constructor.name === 'Group')) { // flatten children
112
- const children = obj.children[0].children.slice();
113
- const name = obj.children[0].name;
114
- obj.children.length = 0;
115
- const parent = new THREE.Object3D();
116
- parent.name = name;
117
- parent.children = children;
118
- obj.add(parent);
119
- }
120
- }
121
- return obj;
122
- });
123
- }
124
- textureFromUrl(url) {
125
- return __awaiter(this, void 0, void 0, function* () {
126
- // url = this._includeBaseUrl(url);
127
- return new Promise((resolve, reject) => {
128
- const textureLoader = new THREE.TextureLoader();
129
- // textureLoader.setBaseU(this._settingsService.settings.assetPath);
130
- textureLoader.load(url, (texture) => {
131
- texture.wrapT = THREE.RepeatWrapping;
132
- texture.wrapS = THREE.RepeatWrapping;
133
- texture.repeat.set(1, 1);
134
- texture.needsUpdate = true;
135
- return resolve(texture);
136
- }, null, reject);
137
- });
138
- });
139
- }
140
- _cleanedUpObjects(object, cleanUp = true) {
141
- let obj = new THREE.Object3D();
142
- object.children.forEach((c) => {
143
- if (!(c instanceof THREE.Camera || (c.constructor.name && c.constructor.name.toLowerCase().indexOf('camera') > -1))) {
144
- if (cleanUp && (c instanceof THREE.Group || c.constructor.name === 'Group') || (c.children.length === 1 && (c.children[0] instanceof THREE.Group || c.children[0].constructor.name === 'Group'))) {
145
- this._addGroupChildrenToObject(c, obj);
146
- }
147
- else if ((cleanUp && !(c instanceof THREE.Mesh || c.constructor.name === 'Mesh')) || (!(c instanceof THREE.Mesh || c.constructor.name === 'Mesh') && !c.name && c.children.length > 0)) {
148
- c.children.forEach((child) => {
149
- child.translateY(c.position.y);
150
- });
151
- c.translateY(-c.position.y);
152
- if (obj.children.length > 0) {
153
- obj.add(c.clone());
154
- }
155
- else {
156
- obj = c.clone();
157
- }
158
- }
159
- else {
160
- // if (c.position.y > 0 || c.position.y < 0) {
161
- // c.children.forEach((child) => {
162
- // child.translateY(c.position.y);
163
- // });
164
- // c.translateY(-c.position.y);
165
- // }
166
- obj.add(c.clone());
167
- }
168
- }
169
- });
170
- const boundingBox = new THREE.Box3().setFromObject(obj);
171
- const bbCenterPivot = new THREE.Vector3();
172
- boundingBox.getCenter(bbCenterPivot);
173
- const delta = new THREE.Vector3().add(bbCenterPivot).negate();
174
- obj.children.forEach((cc) => {
175
- cc.position.add(delta);
176
- });
177
- return obj;
178
- }
179
- _addGroupChildrenToObject(group, obj, cleanUp = true) {
180
- group.children.forEach((gc) => {
181
- if (cleanUp && (gc instanceof THREE.Group || gc.constructor.name === 'Group')) {
182
- this._addGroupChildrenToObject(gc, obj);
183
- }
184
- else {
185
- // gc.translateX(-group.position.x);
186
- gc.translateY(group.position.y);
187
- // gc.translateZ(-group.position.z);
188
- obj.add(gc.clone());
189
- }
190
- });
191
- }
192
- _iterateChildren(children, callback) {
193
- for (let i = 0; i < children.length; i++) {
194
- const child = children[i];
195
- if (child instanceof THREE.Mesh || child.constructor.name === 'Mesh') {
196
- callback(child);
197
- }
198
- else {
199
- this._iterateChildren(child.children, callback);
200
- }
201
- }
202
- }
203
- _readJsonFile(filePath) {
204
- return __awaiter(this, void 0, void 0, function* () {
205
- try {
206
- const response = yield fetch(filePath);
207
- if (!response.ok) {
208
- return '';
209
- }
210
- else {
211
- let empty = false;
212
- yield response.clone().text().then((value) => {
213
- if (value === '') {
214
- empty = true;
215
- }
216
- });
217
- return empty ? {} : response.json();
218
- }
219
- }
220
- catch (e) {
221
- return '';
222
- }
223
- });
224
- }
225
- }
226
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWVkLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL3RocmVlZC51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRzNDLE1BQU0sT0FBTyxXQUFXO0lBQXhCO1FBRVUsaUJBQVksR0FBZ0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQTBOaEUsQ0FBQztJQXhOUSxVQUFVO1FBQ2YsTUFBTSxJQUFJLEdBQXFCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0sZ0JBQWdCLENBQUMsUUFBZ0IsRUFBRSxrQkFBMkIsSUFBSTtRQUN2RSxPQUFPLElBQUksT0FBTyxDQUFDLENBQU8sT0FBaUIsRUFBRSxNQUFnQixFQUFFLEVBQUU7WUFDL0QsUUFBUSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLElBQUksY0FBYyxHQUFXLFFBQVEsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JGLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUU7Z0JBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxj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LE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxNQUFNLEtBQUssR0FBbUIsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFDLElBQUksS0FBSyxZQUFZLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO2dCQUNwRSxRQUFRLENBQUMsS0FBbUIsQ0FBQyxDQUFDO2FBQy9CO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ2pEO1NBQ0Y7SUFDSCxDQUFDO0lBRWEsYUFBYSxDQUFDLFFBQWdCOztZQUMxQyxJQUFJO2dCQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtvQkFDaEIsT0FBTyxFQUFFLENBQUM7aUJBQ1g7cUJBQU07b0JBQ0wsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDO29CQUNsQixNQUFNLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTt3QkFDM0MsSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFOzRCQUNoQixLQUFLLEdBQUcsSUFBSSxDQUFDO3lCQUNkO29CQUNILENBQUMsQ0FBQyxDQUFDO29CQUNILE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDckM7YUFDRjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE9BQU8sRUFBRSxDQUFDO2FBQ1g7UUFDSCxDQUFDO0tBQUE7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFRIUkVFIGZyb20gXCJ0aHJlZVwiO1xyXG5pbXBvcnQge09iamVjdFV0aWxzfSBmcm9tIFwiLi9vYmplY3QudXRpbHNcIjtcclxuaW1wb3J0IHtGaWxlVXRpbHN9IGZyb20gXCIuL2ZpbGUudXRpbHNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUaHJlZWRVdGlscyB7XHJcblxyXG4gIHByaXZhdGUgX29iamVjdENhY2hlOiBNYXA8c3RyaW5nLCBUSFJFRS5PYmplY3QzRD4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIHB1YmxpYyBjbGVhckNhY2hlKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgb2JqczogVEhSRUUuT2JqZWN0M0RbXSA9IEFycmF5LmZyb20odGhpcy5fb2JqZWN0Q2FjaGUudmFsdWVzKCkpO1xyXG4gICAgb2Jqcy5mb3JFYWNoKG8gPT4gT2JqZWN0VXRpbHMuRGlzcG9zZU9iamVjdChvKSk7XHJcbiAgICB0aGlzLl9vYmplY3RDYWNoZS5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRvd25sb2FkM0RTb3VyY2UoZmlsZU5hbWU6IHN0cmluZywgc2V0VmlzaWJsZUZhbHNlOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8VEhSRUUuT2JqZWN0M0Q+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcclxuICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5yZXBsYWNlKCcudW5pdHkzZCcsICcnKTtcclxuICAgICAgbGV0IGxvb2t1cEZpbGVOYW1lOiBzdHJpbmcgPSBmaWxlTmFtZSArIChmaWxlTmFtZS5pbmRleE9mKCcuZ2xiJykgPCAwID8gJy5nbGInIDogJycpO1xyXG4gICAgICBpZiAodGhpcy5fb2JqZWN0Q2FjaGUuaGFzKGxvb2t1cEZpbGVOYW1lKSkge1xyXG4gICAgICAgIHJlc29sdmUodGhpcy5fb2JqZWN0Q2FjaGUuZ2V0KGxvb2t1cEZpbGVOYW1lKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubG9hZEdsYlNvdXJjZShsb29rdXBGaWxlTmFtZSwgc2V0VmlzaWJsZUZhbHNlKVxyXG4gICAgICAgICAgLnRoZW4oKG9iajogVEhSRUUuT2JqZWN0M0QpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fb2JqZWN0Q2FjaGUuc2V0KGxvb2t1cEZpbGVOYW1lLCBvYmopO1xyXG4gICAgICAgICAgICByZXNvbHZlKG9iaik7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KGBHTEIgc291cmNlIG5vdCBmb3VuZCEgKCR7bG9va3VwRmlsZU5hbWV9KWApO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWFkRmlsZUFzVGV4dChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiByZXNvbHZlKGUudGFyZ2V0LnJlc3VsdCk7XHJcbiAgICAgIGZpbGVSZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlamVjdChlcnJvcik7XHJcbiAgICAgIGZpbGVSZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvYWRKc29uTW9kZWwoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICBpZiAodGhpcy5fb2JqZWN0Q2FjaGUuaGFzKGZpbGVQYXRoKSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX29iamVjdENhY2hlLmdldChmaWxlUGF0aCkpO1xyXG4gICAgfVxyXG4gICAgY29uc3QganNvbjogc3RyaW5nID0gYXdhaXQgdGhpcy5fcmVhZEpzb25GaWxlKGZpbGVQYXRoKTtcclxuICAgIGNvbnN0IGxvYWRlciA9IG5ldyBUSFJFRS5PYmplY3RMb2FkZXIoKTtcclxuICAgIGxvYWRlci5jcm9zc09yaWdpbiA9ICdBbm9ueW1vdXMnO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBvYmogPSBsb2FkZXIucGFyc2UoanNvbik7XHJcbiAgICAgICAgdGhpcy5fb2JqZWN0Q2FjaGUuc2V0KGZpbGVQYXRoLCBvYmopO1xyXG4gICAgICAgIHJlc29sdmUob2JqKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJlamVjdChudWxsKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9hZEpzb25PYmplY3RNb2RlbChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLl9vYmplY3RDYWNoZS5oYXMoZmlsZVBhdGgpKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fb2JqZWN0Q2FjaGUuZ2V0KGZpbGVQYXRoKSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBsb2FkZXIgPSBuZXcgVEhSRUUuT2JqZWN0TG9hZGVyKCk7XHJcbiAgICBsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oJ0Fub255bW91cycpO1xyXG4gICAgbG9hZGVyLnNldFJlc291cmNlUGF0aCgnJyk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBsb2FkZXIubG9hZChmaWxlUGF0aCxcclxuICAgICAgICAob2JqZWN0OiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IG9iajogVEhSRUUuT2JqZWN0M0QgPSAob2JqZWN0LnR5cGUgPT09ICdTY2VuZScgJiYgb2JqZWN0LmNoaWxkcmVuWzBdLnR5cGUgPT09ICdPYmplY3QzRCcpID8gb2JqZWN0LmNoaWxkcmVuWzBdIDogb2JqZWN0O1xyXG4gICAgICAgICAgdGhpcy5fb2JqZWN0Q2FjaGUuc2V0KGZpbGVQYXRoLCBvYmopO1xyXG4gICAgICAgICAgcmVzb2x2ZShvYmogYXMgVEhSRUUuT2JqZWN0M0QpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgeGhyID0+IG51bGwsXHJcbiAgICAgICAgZXJyb3IgPT4gcmVqZWN0KGVycm9yKVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9hZEdsYk1vZGVsKGZpbGU6IHN0cmluZywgY2xlYW5VcDogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPFRIUkVFLk9iamVjdDNEPiB7XHJcbiAgICBpZiAodGhpcy5fb2JqZWN0Q2FjaGUuaGFzKGZpbGUpKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fb2JqZWN0Q2FjaGUuZ2V0KGZpbGUpKTtcclxuICAgIH1cclxuICAgIGlmICghd2luZG93Lmhhc093blByb3BlcnR5KCdsb2FkR0xURicpKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2xvYWRHTFRGIG5vdCBkZWZpbmVkIGluIHdpbmRvdyBnbG9iYWwnKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAgIC8vIGNvbnN0IGxvYWRlciA9IG5ldyBHTFRGTG9hZGVyKCk7XHJcbiAgICBjb25zdCBvYmo6IFRIUkVFLk9iamVjdDNEID0gYXdhaXQgKHdpbmRvdyBhcyBhbnkpLmxvYWRHTFRGKGZpbGUpO1xyXG4gICAgaWYgKG9iaikge1xyXG4gICAgICB0aGlzLl9jbGVhbmVkVXBPYmplY3RzKG9iaiwgY2xlYW5VcCk7XHJcbiAgICAgIHRoaXMuX29iamVjdENhY2hlLnNldChmaWxlLCBvYmopO1xyXG4gICAgICByZXR1cm4gb2JqO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9hZEdsYlNvdXJjZShmaWxlOiBzdHJpbmcsIHNldFZpc2libGVGYWxzZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPFRIUkVFLk9iamVjdDNEPiB7XHJcbiAgICBjb25zdCBvYmogPSBhd2FpdCB0aGlzLmxvYWRHbGJNb2RlbChmaWxlLCBmYWxzZSk7XHJcbiAgICBpZiAob2JqKSB7XHJcbiAgICAgIG9iai5jaGlsZHJlbiA9IG9iai5jaGlsZHJlbi5maWx0ZXIoYyA9PiAhKGMgaW5zdGFuY2VvZiBUSFJFRS5DYW1lcmEgfHwgKGMuY29uc3RydWN0b3IubmFtZSAmJiBjLmNvbnN0cnVjdG9yLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdjYW1lcmEnKSA+IC0xKSkpO1xyXG4gICAgICBvYmouY2hpbGRyZW4uc29ydCgoYSwgYikgPT4gYVsnbmFtZSddIDwgYlsnbmFtZSddID8gMSA6IC0xKTtcclxuICAgICAgb2JqLmNoaWxkcmVuLmZvckVhY2goKGM6IFRIUkVFLk9iamVjdDNEKSA9PiB7XHJcbiAgICAgICAgYy50cmF2ZXJzZSgodDogVEhSRUUuT2JqZWN0M0QpID0+IHtcclxuICAgICAgICAgIHQudmlzaWJsZSA9ICF0Lm5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCdjXycpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChzZXRWaXNpYmxlRmFsc2UpIHtcclxuICAgICAgICAgIGMudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChvYmouY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIChvYmouY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBUSFJFRS5Hcm91cCB8fCBvYmouY2hpbGRyZW5bMF0uY29uc3RydWN0b3IubmFtZSA9PT0gJ0dyb3VwJykpIHsgLy8gZmxhdHRlbiBjaGlsZHJlblxyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuOiBhbnkgPSBvYmouY2hpbGRyZW5bMF0uY2hpbGRyZW4uc2xpY2UoKTtcclxuICAgICAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSBvYmouY2hpbGRyZW5bMF0ubmFtZTtcclxuICAgICAgICBvYmouY2hpbGRyZW4ubGVuZ3RoID0gMDtcclxuICAgICAgICBjb25zdCBwYXJlbnQ6IFRIUkVFLk9iamVjdDNEID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XHJcbiAgICAgICAgcGFyZW50Lm5hbWUgPSBuYW1lO1xyXG4gICAgICAgIHBhcmVudC5jaGlsZHJlbiA9IGNoaWxkcmVuO1xyXG4gICAgICAgIG9iai5hZGQocGFyZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB0ZXh0dXJlRnJvbVVybCh1cmw6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAvLyB1cmwgPSB0aGlzLl9pbmNsdWRlQmFzZVVybCh1cmwpO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgdGV4dHVyZUxvYWRlciA9IG5ldyBUSFJFRS5UZXh0dXJlTG9hZGVyKCk7XHJcbiAgICAgIC8vIHRleHR1cmVMb2FkZXIuc2V0QmFzZVUodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmFzc2V0UGF0aCk7XHJcbiAgICAgIHRleHR1cmVMb2FkZXIubG9hZCh1cmwsXHJcbiAgICAgICAgKHRleHR1cmU6IFRIUkVFLlRleHR1cmUpID0+IHtcclxuICAgICAgICAgIHRleHR1cmUud3JhcFQgPSBUSFJFRS5SZXBlYXRXcmFwcGluZztcclxuICAgICAgICAgIHRleHR1cmUud3JhcFMgPSBUSFJFRS5SZXBlYXRXcmFwcGluZztcclxuICAgICAgICAgIHRleHR1cmUucmVwZWF0LnNldCgxLCAxKTtcclxuICAgICAgICAgIHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUodGV4dHVyZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBudWxsLFxyXG4gICAgICAgIHJlamVjdFxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jbGVhbmVkVXBPYmplY3RzKG9iamVjdDogVEhSRUUuT2JqZWN0M0QsIGNsZWFuVXA6IGJvb2xlYW4gPSB0cnVlKTogVEhSRUUuT2JqZWN0M0Qge1xyXG4gICAgbGV0IG9iajogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuICAgIG9iamVjdC5jaGlsZHJlbi5mb3JFYWNoKChjOiBUSFJFRS5PYmplY3QzRCkgPT4ge1xyXG4gICAgICBpZiAoIShjIGluc3RhbmNlb2YgVEhSRUUuQ2FtZXJhIHx8IChjLmNvbnN0cnVjdG9yLm5hbWUgJiYgYy5jb25zdHJ1Y3Rvci5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignY2FtZXJhJykgPiAtMSkpKSB7XHJcbiAgICAgICAgaWYgKGNsZWFuVXAgJiYgKGMgaW5zdGFuY2VvZiBUSFJFRS5Hcm91cCB8fCBjLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdHcm91cCcpIHx8IChjLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiAoYy5jaGlsZHJlblswXSBpbnN0YW5jZW9mIFRIUkVFLkdyb3VwIHx8IGMuY2hpbGRyZW5bMF0uY29uc3RydWN0b3IubmFtZSA9PT0gJ0dyb3VwJykpKSB7XHJcbiAgICAgICAgICB0aGlzLl9hZGRHcm91cENoaWxkcmVuVG9PYmplY3QoYywgb2JqKTtcclxuICAgICAgICB9IGVsc2UgaWYgKChjbGVhblVwICYmICEoYyBpbnN0YW5jZW9mIFRIUkVFLk1lc2ggfHwgYy5jb25zdHJ1Y3Rvci5uYW1lID09PSAnTWVzaCcpKSB8fCAoIShjIGluc3RhbmNlb2YgVEhSRUUuTWVzaCB8fCBjLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdNZXNoJykgJiYgIWMubmFtZSAmJiBjLmNoaWxkcmVuLmxlbmd0aCA+IDApKSB7XHJcbiAgICAgICAgICBjLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgICAgIGNoaWxkLnRyYW5zbGF0ZVkoYy5wb3NpdGlvbi55KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgYy50cmFuc2xhdGVZKC1jLnBvc2l0aW9uLnkpO1xyXG4gICAgICAgICAgaWYgKG9iai5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9iai5hZGQoYy5jbG9uZSgpKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG9iaiA9IGMuY2xvbmUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gaWYgKGMucG9zaXRpb24ueSA+IDAgfHwgYy5wb3NpdGlvbi55IDwgMCkge1xyXG4gICAgICAgICAgLy8gICBjLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgICAvLyAgICAgY2hpbGQudHJhbnNsYXRlWShjLnBvc2l0aW9uLnkpO1xyXG4gICAgICAgICAgLy8gICB9KTtcclxuICAgICAgICAgIC8vICAgYy50cmFuc2xhdGVZKC1jLnBvc2l0aW9uLnkpO1xyXG4gICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgb2JqLmFkZChjLmNsb25lKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBib3VuZGluZ0JveCA9IG5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdChvYmopO1xyXG4gICAgY29uc3QgYmJDZW50ZXJQaXZvdCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICBib3VuZGluZ0JveC5nZXRDZW50ZXIoYmJDZW50ZXJQaXZvdCk7XHJcbiAgICBjb25zdCBkZWx0YTogVEhSRUUuVmVjdG9yMyA9IG5ldyBUSFJFRS5WZWN0b3IzKCkuYWRkKGJiQ2VudGVyUGl2b3QpLm5lZ2F0ZSgpO1xyXG4gICAgb2JqLmNoaWxkcmVuLmZvckVhY2goKGNjKSA9PiB7XHJcbiAgICAgIGNjLnBvc2l0aW9uLmFkZChkZWx0YSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9hZGRHcm91cENoaWxkcmVuVG9PYmplY3QoZ3JvdXA6IFRIUkVFLk9iamVjdDNELCBvYmo6IFRIUkVFLk9iamVjdDNELCBjbGVhblVwOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgZ3JvdXAuY2hpbGRyZW4uZm9yRWFjaCgoZ2M6IFRIUkVFLk9iamVjdDNEKSA9PiB7XHJcbiAgICAgIGlmIChjbGVhblVwICYmIChnYyBpbnN0YW5jZW9mIFRIUkVFLkdyb3VwIHx8IGdjLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdHcm91cCcpKSB7XHJcbiAgICAgICAgdGhpcy5fYWRkR3JvdXBDaGlsZHJlblRvT2JqZWN0KGdjLCBvYmopO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGdjLnRyYW5zbGF0ZVgoLWdyb3VwLnBvc2l0aW9uLngpO1xyXG4gICAgICAgIGdjLnRyYW5zbGF0ZVkoZ3JvdXAucG9zaXRpb24ueSk7XHJcbiAgICAgICAgLy8gZ2MudHJhbnNsYXRlWigtZ3JvdXAucG9zaXRpb24ueik7XHJcbiAgICAgICAgb2JqLmFkZChnYy5jbG9uZSgpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pdGVyYXRlQ2hpbGRyZW4oY2hpbGRyZW46IFRIUkVFLk9iamVjdDNEW10sIGNhbGxiYWNrOiAoY2hpbGQ6IFRIUkVFLk1lc2gpID0+IHt9KTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkOiBUSFJFRS5PYmplY3QzRCA9IGNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBUSFJFRS5NZXNoIHx8IGNoaWxkLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdNZXNoJykge1xyXG4gICAgICAgIGNhbGxiYWNrKGNoaWxkIGFzIFRIUkVFLk1lc2gpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2l0ZXJhdGVDaGlsZHJlbihjaGlsZC5jaGlsZHJlbiwgY2FsbGJhY2spO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9yZWFkSnNvbkZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGZpbGVQYXRoKTtcclxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgZW1wdHkgPSBmYWxzZTtcclxuICAgICAgICBhd2FpdCByZXNwb25zZS5jbG9uZSgpLnRleHQoKS50aGVuKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJykge1xyXG4gICAgICAgICAgICBlbXB0eSA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGVtcHR5ID8ge30gOiByZXNwb25zZS5qc29uKCk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuIl19