@rocketshow/designer 1.32.0 → 1.35.0
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.
- package/assets/i18n/de.json +2 -1
- package/assets/i18n/en.json +2 -1
- package/esm2022/lib/array-sort-pipe.mjs +30 -0
- package/esm2022/lib/designer.component.mjs +672 -0
- package/esm2022/lib/designer.module.mjs +186 -0
- package/esm2022/lib/designer.service.mjs +14 -0
- package/esm2022/lib/dropzone/dropzone.component.mjs +93 -0
- package/esm2022/lib/effect/effect-curve/effect-curve.component.mjs +577 -0
- package/esm2022/lib/effect/effect-pan-tilt/effect-pan-tilt.component.mjs +36 -0
- package/esm2022/lib/effect/effect.component.mjs +174 -0
- package/esm2022/lib/error-dialog/error-dialog.component.mjs +75 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.mjs +222 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.mjs +147 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.mjs +213 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.mjs +78 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.mjs +119 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability.component.mjs +169 -0
- package/esm2022/lib/fixture/fixture-channel/fixture-channel.component.mjs +162 -0
- package/esm2022/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.mjs +365 -0
- package/esm2022/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.mjs +151 -0
- package/esm2022/lib/fixture/fixture-settings/fixture-settings.component.mjs +46 -0
- package/esm2022/lib/fixture/fixture.component.mjs +148 -0
- package/esm2022/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.mjs +145 -0
- package/esm2022/lib/fixture-pool/fixture-pool.component.mjs +643 -0
- package/esm2022/lib/intro/intro.component.mjs +95 -0
- package/esm2022/lib/master-dimmer/master-dimmer.component.mjs +66 -0
- package/esm2022/lib/models/cached-fixture-capability.mjs +9 -0
- package/esm2022/lib/models/cached-fixture-channel.mjs +7 -0
- package/esm2022/lib/models/cached-fixture.mjs +6 -0
- package/esm2022/lib/models/color.mjs +8 -0
- package/esm2022/lib/models/composition.mjs +46 -0
- package/esm2022/lib/models/effect-curve-profile-channel.mjs +15 -0
- package/esm2022/lib/models/effect-curve.mjs +69 -0
- package/esm2022/lib/models/effect-pan-tilt.mjs +19 -0
- package/esm2022/lib/models/effect.mjs +12 -0
- package/esm2022/lib/models/fixture-capability-value.mjs +15 -0
- package/esm2022/lib/models/fixture-capability.mjs +84 -0
- package/esm2022/lib/models/fixture-channel-value.mjs +11 -0
- package/esm2022/lib/models/fixture-channel.mjs +24 -0
- package/esm2022/lib/models/fixture-matrix-pixel-group-constraints.mjs +27 -0
- package/esm2022/lib/models/fixture-matrix-pixel-group.mjs +12 -0
- package/esm2022/lib/models/fixture-matrix.mjs +25 -0
- package/esm2022/lib/models/fixture-mode-channel.mjs +26 -0
- package/esm2022/lib/models/fixture-mode.mjs +17 -0
- package/esm2022/lib/models/fixture-physical.mjs +14 -0
- package/esm2022/lib/models/fixture-profile.mjs +85 -0
- package/esm2022/lib/models/fixture-wheel-slot.mjs +26 -0
- package/esm2022/lib/models/fixture-wheel.mjs +15 -0
- package/esm2022/lib/models/fixture.mjs +40 -0
- package/esm2022/lib/models/preset-fixture.mjs +10 -0
- package/esm2022/lib/models/preset-region-scene.mjs +8 -0
- package/esm2022/lib/models/preset.mjs +65 -0
- package/esm2022/lib/models/project.mjs +78 -0
- package/esm2022/lib/models/scene-playback-region.mjs +11 -0
- package/esm2022/lib/models/scene.mjs +27 -0
- package/esm2022/lib/preset/preset-settings/preset-settings.component.mjs +194 -0
- package/esm2022/lib/preset/preset.component.mjs +131 -0
- package/esm2022/lib/preview/models/color-changer-3d.mjs +64 -0
- package/esm2022/lib/preview/models/fixture-3d.mjs +274 -0
- package/esm2022/lib/preview/models/moving-head-3d.mjs +124 -0
- package/esm2022/lib/preview/preview.component.mjs +219 -0
- package/esm2022/lib/project/project-browser/project-browser.component.mjs +143 -0
- package/esm2022/lib/project/project-import/project-import.component.mjs +107 -0
- package/esm2022/lib/project/project-save/project-save.component.mjs +178 -0
- package/esm2022/lib/project/project-share/project-share.component.mjs +71 -0
- package/esm2022/lib/scene/scene-settings/scene-settings.component.mjs +146 -0
- package/esm2022/lib/scene/scene.component.mjs +110 -0
- package/esm2022/lib/services/animation.service.mjs +16 -0
- package/esm2022/lib/services/config.service.mjs +28 -0
- package/esm2022/lib/services/effect.service.mjs +14 -0
- package/esm2022/lib/services/error-dialog.service.mjs +39 -0
- package/esm2022/lib/services/fixture-pool.service.mjs +30 -0
- package/esm2022/lib/services/fixture.service.mjs +639 -0
- package/esm2022/lib/services/hotkey-target-exclude.service.mjs +24 -0
- package/esm2022/lib/services/intro.service.mjs +140 -0
- package/esm2022/lib/services/preset.service.mjs +449 -0
- package/esm2022/lib/services/preview-mesh.service.mjs +57 -0
- package/esm2022/lib/services/preview.service.mjs +497 -0
- package/esm2022/lib/services/project-load.service.mjs +209 -0
- package/esm2022/lib/services/project.service.mjs +93 -0
- package/esm2022/lib/services/scene.service.mjs +164 -0
- package/esm2022/lib/services/timeline.service.mjs +726 -0
- package/esm2022/lib/services/user-ensure-login.service.mjs +38 -0
- package/esm2022/lib/services/user.service.mjs +89 -0
- package/esm2022/lib/services/uuid.service.mjs +23 -0
- package/esm2022/lib/services/warning-dialog.service.mjs +38 -0
- package/esm2022/lib/timeline/composition-settings/composition-settings.component.mjs +304 -0
- package/esm2022/lib/timeline/timeline-grid/timeline-grid.component.mjs +216 -0
- package/esm2022/lib/timeline/timeline.component.mjs +418 -0
- package/esm2022/lib/user/user-login/user-login.component.mjs +144 -0
- package/esm2022/lib/user/user-register/user-register.component.mjs +220 -0
- package/esm2022/lib/wait-dialog/wait-dialog.component.mjs +26 -0
- package/esm2022/lib/warning-dialog/warning-dialog.component.mjs +68 -0
- package/esm2022/public_api.mjs +7 -0
- package/esm2022/rocketshow-designer.mjs +5 -0
- package/fesm2022/rocketshow-designer.mjs +11171 -0
- package/fesm2022/rocketshow-designer.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/array-sort-pipe.d.ts +3 -0
- package/lib/designer.component.d.ts +19 -16
- package/lib/designer.module.d.ts +55 -0
- package/lib/designer.service.d.ts +3 -0
- package/lib/dropzone/dropzone.component.d.ts +24 -0
- package/lib/effect/effect-curve/effect-curve.component.d.ts +4 -1
- package/lib/effect/effect-pan-tilt/effect-pan-tilt.component.d.ts +3 -0
- package/lib/effect/effect.component.d.ts +3 -0
- package/lib/error-dialog/error-dialog.component.d.ts +3 -0
- package/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.d.ts +4 -1
- package/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.d.ts +3 -0
- package/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.d.ts +5 -2
- package/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.d.ts +3 -0
- package/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.d.ts +3 -0
- package/lib/fixture/fixture-capability/fixture-capability.component.d.ts +3 -0
- package/lib/fixture/fixture-channel/fixture-channel.component.d.ts +3 -0
- package/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.d.ts +3 -0
- package/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.d.ts +3 -0
- package/lib/fixture/fixture-settings/fixture-settings.component.d.ts +3 -0
- package/lib/fixture/fixture.component.d.ts +7 -3
- package/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.d.ts +3 -0
- package/lib/fixture-pool/fixture-pool.component.d.ts +3 -0
- package/lib/intro/intro.component.d.ts +3 -0
- package/lib/master-dimmer/master-dimmer.component.d.ts +3 -0
- package/lib/models/cached-fixture.d.ts +1 -0
- package/lib/models/fixture-matrix-pixel-group-constraints.d.ts +8 -0
- package/lib/models/fixture-matrix-pixel-group.d.ts +6 -0
- package/lib/models/fixture-matrix.d.ts +6 -0
- package/lib/models/fixture-mode-channel.d.ts +8 -0
- package/lib/models/fixture-mode.d.ts +3 -1
- package/lib/models/fixture-physical.d.ts +4 -0
- package/lib/models/fixture-profile.d.ts +5 -0
- package/lib/models/preset-fixture.d.ts +5 -0
- package/lib/models/preset.d.ts +2 -0
- package/lib/models/project.d.ts +3 -0
- package/lib/preset/preset-settings/preset-settings.component.d.ts +3 -0
- package/lib/preset/preset.component.d.ts +3 -0
- package/lib/preview/models/color-changer-3d.d.ts +1 -11
- package/lib/preview/models/fixture-3d.d.ts +11 -0
- package/lib/preview/models/moving-head-3d.d.ts +1 -11
- package/lib/preview/preview.component.d.ts +4 -4
- package/lib/project/project-browser/project-browser.component.d.ts +3 -0
- package/lib/project/project-import/project-import.component.d.ts +3 -0
- package/lib/project/project-save/project-save.component.d.ts +3 -0
- package/lib/project/project-share/project-share.component.d.ts +3 -0
- package/lib/scene/scene-settings/scene-settings.component.d.ts +3 -0
- package/lib/scene/scene.component.d.ts +3 -0
- package/lib/services/animation.service.d.ts +3 -0
- package/lib/services/config.service.d.ts +4 -0
- package/lib/services/effect.service.d.ts +3 -0
- package/lib/services/error-dialog.service.d.ts +3 -0
- package/lib/services/fixture-pool.service.d.ts +3 -0
- package/lib/services/fixture.service.d.ts +10 -2
- package/lib/services/hotkey-target-exclude.service.d.ts +3 -0
- package/lib/services/intro.service.d.ts +3 -0
- package/lib/services/preset.service.d.ts +7 -2
- package/lib/services/preview-mesh.service.d.ts +3 -0
- package/lib/services/preview.service.d.ts +6 -4
- package/lib/services/project-load.service.d.ts +8 -1
- package/lib/services/project.service.d.ts +5 -3
- package/lib/services/scene.service.d.ts +3 -0
- package/lib/services/timeline.service.d.ts +3 -0
- package/lib/services/user-ensure-login.service.d.ts +3 -0
- package/lib/services/user.service.d.ts +3 -0
- package/lib/services/uuid.service.d.ts +3 -0
- package/lib/services/warning-dialog.service.d.ts +3 -0
- package/lib/timeline/composition-settings/composition-settings.component.d.ts +5 -1
- package/lib/timeline/timeline-grid/timeline-grid.component.d.ts +3 -0
- package/lib/timeline/timeline.component.d.ts +3 -0
- package/lib/user/user-login/user-login.component.d.ts +3 -0
- package/lib/user/user-register/user-register.component.d.ts +3 -0
- package/lib/wait-dialog/wait-dialog.component.d.ts +3 -0
- package/lib/warning-dialog/warning-dialog.component.d.ts +3 -0
- package/package.json +20 -22
- package/rocketshow-designer-1.35.0.tgz +0 -0
- package/bundles/rocketshow-designer.umd.js +0 -9966
- package/bundles/rocketshow-designer.umd.js.map +0 -1
- package/bundles/rocketshow-designer.umd.min.js +0 -17
- package/bundles/rocketshow-designer.umd.min.js.map +0 -1
- package/esm2015/lib/array-sort-pipe.js +0 -28
- package/esm2015/lib/designer.component.js +0 -411
- package/esm2015/lib/designer.module.js +0 -117
- package/esm2015/lib/designer.service.js +0 -16
- package/esm2015/lib/effect/effect-curve/effect-curve.component.js +0 -325
- package/esm2015/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -30
- package/esm2015/lib/effect/effect.component.js +0 -73
- package/esm2015/lib/error-dialog/error-dialog.component.js +0 -42
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -141
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -128
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -163
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -60
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -87
- package/esm2015/lib/fixture/fixture-capability/fixture-capability.component.js +0 -97
- package/esm2015/lib/fixture/fixture-channel/fixture-channel.component.js +0 -66
- package/esm2015/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -200
- package/esm2015/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -31
- package/esm2015/lib/fixture/fixture-settings/fixture-settings.component.js +0 -35
- package/esm2015/lib/fixture/fixture.component.js +0 -70
- package/esm2015/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -128
- package/esm2015/lib/fixture-pool/fixture-pool.component.js +0 -331
- package/esm2015/lib/intro/intro.component.js +0 -25
- package/esm2015/lib/master-dimmer/master-dimmer.component.js +0 -41
- package/esm2015/lib/models/cached-fixture-capability.js +0 -9
- package/esm2015/lib/models/cached-fixture-channel.js +0 -7
- package/esm2015/lib/models/cached-fixture.js +0 -6
- package/esm2015/lib/models/color.js +0 -8
- package/esm2015/lib/models/composition.js +0 -46
- package/esm2015/lib/models/effect-curve-profile-channel.js +0 -15
- package/esm2015/lib/models/effect-curve.js +0 -69
- package/esm2015/lib/models/effect-pan-tilt.js +0 -19
- package/esm2015/lib/models/effect.js +0 -12
- package/esm2015/lib/models/fixture-capability-value.js +0 -15
- package/esm2015/lib/models/fixture-capability.js +0 -84
- package/esm2015/lib/models/fixture-channel-value.js +0 -11
- package/esm2015/lib/models/fixture-channel.js +0 -24
- package/esm2015/lib/models/fixture-mode.js +0 -14
- package/esm2015/lib/models/fixture-profile.js +0 -70
- package/esm2015/lib/models/fixture-wheel-slot.js +0 -26
- package/esm2015/lib/models/fixture-wheel.js +0 -15
- package/esm2015/lib/models/fixture.js +0 -40
- package/esm2015/lib/models/preset-region-scene.js +0 -8
- package/esm2015/lib/models/preset.js +0 -56
- package/esm2015/lib/models/project.js +0 -68
- package/esm2015/lib/models/scene-playback-region.js +0 -11
- package/esm2015/lib/models/scene.js +0 -27
- package/esm2015/lib/models/universe.js +0 -11
- package/esm2015/lib/preset/preset-settings/preset-settings.component.js +0 -66
- package/esm2015/lib/preset/preset.component.js +0 -85
- package/esm2015/lib/preview/models/color-changer-3d.js +0 -167
- package/esm2015/lib/preview/models/fixture-3d.js +0 -150
- package/esm2015/lib/preview/models/moving-head-3d.js +0 -233
- package/esm2015/lib/preview/preview.component.js +0 -242
- package/esm2015/lib/project/project-browser/project-browser.component.js +0 -73
- package/esm2015/lib/project/project-import/project-import.component.js +0 -89
- package/esm2015/lib/project/project-save/project-save.component.js +0 -105
- package/esm2015/lib/project/project-share/project-share.component.js +0 -43
- package/esm2015/lib/scene/scene-settings/scene-settings.component.js +0 -52
- package/esm2015/lib/scene/scene.component.js +0 -56
- package/esm2015/lib/services/animation.service.js +0 -17
- package/esm2015/lib/services/config.service.js +0 -28
- package/esm2015/lib/services/effect.service.js +0 -16
- package/esm2015/lib/services/error-dialog.service.js +0 -44
- package/esm2015/lib/services/fixture-pool.service.js +0 -34
- package/esm2015/lib/services/fixture.service.js +0 -443
- package/esm2015/lib/services/hotkey-target-exclude.service.js +0 -26
- package/esm2015/lib/services/intro.service.js +0 -144
- package/esm2015/lib/services/preset.service.js +0 -416
- package/esm2015/lib/services/preview-mesh.service.js +0 -58
- package/esm2015/lib/services/preview.service.js +0 -500
- package/esm2015/lib/services/project-load.service.js +0 -171
- package/esm2015/lib/services/project.service.js +0 -113
- package/esm2015/lib/services/scene.service.js +0 -174
- package/esm2015/lib/services/timeline.service.js +0 -738
- package/esm2015/lib/services/universe.service.js +0 -24
- package/esm2015/lib/services/user-ensure-login.service.js +0 -44
- package/esm2015/lib/services/user.service.js +0 -93
- package/esm2015/lib/services/uuid.service.js +0 -25
- package/esm2015/lib/services/warning-dialog.service.js +0 -43
- package/esm2015/lib/timeline/composition-settings/composition-settings.component.js +0 -197
- package/esm2015/lib/timeline/timeline-grid/timeline-grid.component.js +0 -55
- package/esm2015/lib/timeline/timeline.component.js +0 -239
- package/esm2015/lib/user/user-login/user-login.component.js +0 -64
- package/esm2015/lib/user/user-register/user-register.component.js +0 -89
- package/esm2015/lib/wait-dialog/wait-dialog.component.js +0 -16
- package/esm2015/lib/warning-dialog/warning-dialog.component.js +0 -42
- package/esm2015/public_api.js +0 -7
- package/esm2015/rocketshow-designer.js +0 -61
- package/esm5/lib/array-sort-pipe.js +0 -31
- package/esm5/lib/designer.component.js +0 -468
- package/esm5/lib/designer.module.js +0 -120
- package/esm5/lib/designer.service.js +0 -17
- package/esm5/lib/effect/effect-curve/effect-curve.component.js +0 -386
- package/esm5/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -31
- package/esm5/lib/effect/effect.component.js +0 -75
- package/esm5/lib/error-dialog/error-dialog.component.js +0 -43
- package/esm5/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -159
- package/esm5/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -130
- package/esm5/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -215
- package/esm5/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -61
- package/esm5/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -88
- package/esm5/lib/fixture/fixture-capability/fixture-capability.component.js +0 -130
- package/esm5/lib/fixture/fixture-channel/fixture-channel.component.js +0 -68
- package/esm5/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -306
- package/esm5/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -32
- package/esm5/lib/fixture/fixture-settings/fixture-settings.component.js +0 -36
- package/esm5/lib/fixture/fixture.component.js +0 -71
- package/esm5/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -127
- package/esm5/lib/fixture-pool/fixture-pool.component.js +0 -430
- package/esm5/lib/intro/intro.component.js +0 -26
- package/esm5/lib/master-dimmer/master-dimmer.component.js +0 -42
- package/esm5/lib/models/cached-fixture-capability.js +0 -11
- package/esm5/lib/models/cached-fixture-channel.js +0 -9
- package/esm5/lib/models/cached-fixture.js +0 -8
- package/esm5/lib/models/color.js +0 -10
- package/esm5/lib/models/composition.js +0 -60
- package/esm5/lib/models/effect-curve-profile-channel.js +0 -29
- package/esm5/lib/models/effect-curve.js +0 -95
- package/esm5/lib/models/effect-pan-tilt.js +0 -24
- package/esm5/lib/models/effect.js +0 -14
- package/esm5/lib/models/fixture-capability-value.js +0 -17
- package/esm5/lib/models/fixture-capability.js +0 -86
- package/esm5/lib/models/fixture-channel-value.js +0 -13
- package/esm5/lib/models/fixture-channel.js +0 -38
- package/esm5/lib/models/fixture-mode.js +0 -16
- package/esm5/lib/models/fixture-profile.js +0 -114
- package/esm5/lib/models/fixture-wheel-slot.js +0 -28
- package/esm5/lib/models/fixture-wheel.js +0 -29
- package/esm5/lib/models/fixture.js +0 -42
- package/esm5/lib/models/preset-region-scene.js +0 -10
- package/esm5/lib/models/preset.js +0 -90
- package/esm5/lib/models/project.js +0 -122
- package/esm5/lib/models/scene-playback-region.js +0 -13
- package/esm5/lib/models/scene.js +0 -29
- package/esm5/lib/models/universe.js +0 -13
- package/esm5/lib/preset/preset-settings/preset-settings.component.js +0 -67
- package/esm5/lib/preset/preset.component.js +0 -86
- package/esm5/lib/preview/models/color-changer-3d.js +0 -194
- package/esm5/lib/preview/models/fixture-3d.js +0 -196
- package/esm5/lib/preview/models/moving-head-3d.js +0 -250
- package/esm5/lib/preview/preview.component.js +0 -280
- package/esm5/lib/project/project-browser/project-browser.component.js +0 -77
- package/esm5/lib/project/project-import/project-import.component.js +0 -88
- package/esm5/lib/project/project-save/project-save.component.js +0 -120
- package/esm5/lib/project/project-share/project-share.component.js +0 -44
- package/esm5/lib/scene/scene-settings/scene-settings.component.js +0 -53
- package/esm5/lib/scene/scene.component.js +0 -57
- package/esm5/lib/services/animation.service.js +0 -18
- package/esm5/lib/services/config.service.js +0 -29
- package/esm5/lib/services/effect.service.js +0 -17
- package/esm5/lib/services/error-dialog.service.js +0 -46
- package/esm5/lib/services/fixture-pool.service.js +0 -36
- package/esm5/lib/services/fixture.service.js +0 -643
- package/esm5/lib/services/hotkey-target-exclude.service.js +0 -27
- package/esm5/lib/services/intro.service.js +0 -145
- package/esm5/lib/services/preset.service.js +0 -637
- package/esm5/lib/services/preview-mesh.service.js +0 -61
- package/esm5/lib/services/preview.service.js +0 -754
- package/esm5/lib/services/project-load.service.js +0 -185
- package/esm5/lib/services/project.service.js +0 -127
- package/esm5/lib/services/scene.service.js +0 -251
- package/esm5/lib/services/timeline.service.js +0 -845
- package/esm5/lib/services/universe.service.js +0 -36
- package/esm5/lib/services/user-ensure-login.service.js +0 -45
- package/esm5/lib/services/user.service.js +0 -95
- package/esm5/lib/services/uuid.service.js +0 -26
- package/esm5/lib/services/warning-dialog.service.js +0 -45
- package/esm5/lib/timeline/composition-settings/composition-settings.component.js +0 -206
- package/esm5/lib/timeline/timeline-grid/timeline-grid.component.js +0 -56
- package/esm5/lib/timeline/timeline.component.js +0 -243
- package/esm5/lib/user/user-login/user-login.component.js +0 -66
- package/esm5/lib/user/user-register/user-register.component.js +0 -91
- package/esm5/lib/wait-dialog/wait-dialog.component.js +0 -18
- package/esm5/lib/warning-dialog/warning-dialog.component.js +0 -43
- package/esm5/public_api.js +0 -7
- package/esm5/rocketshow-designer.js +0 -61
- package/fesm2015/rocketshow-designer.js +0 -7945
- package/fesm2015/rocketshow-designer.js.map +0 -1
- package/fesm5/rocketshow-designer.js +0 -9690
- package/fesm5/rocketshow-designer.js.map +0 -1
- package/lib/models/universe.d.ts +0 -8
- package/lib/services/universe.service.d.ts +0 -6
- package/rocketshow-designer-1.32.0.tgz +0 -0
- package/rocketshow-designer.d.ts +0 -60
- package/rocketshow-designer.metadata.json +0 -1
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
import { HttpClient } from '@angular/common/http';
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import { Subject } from 'rxjs';
|
|
4
|
+
import { FixtureCapabilityColor, FixtureCapabilityType } from '../models/fixture-capability';
|
|
5
|
+
import { FixtureCapabilityValue } from '../models/fixture-capability-value';
|
|
6
|
+
import { FixtureChannelValue } from '../models/fixture-channel-value';
|
|
7
|
+
import { Preset } from '../models/preset';
|
|
8
|
+
import { AnimationService } from './animation.service';
|
|
9
|
+
import { ConfigService } from './config.service';
|
|
10
|
+
import { EffectService } from './effect.service';
|
|
11
|
+
import { FixtureService } from './fixture.service';
|
|
12
|
+
import { ProjectService } from './project.service';
|
|
13
|
+
import { UuidService } from './uuid.service';
|
|
14
|
+
import { PresetFixture } from '../models/preset-fixture';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "./effect.service";
|
|
17
|
+
import * as i2 from "./uuid.service";
|
|
18
|
+
import * as i3 from "./project.service";
|
|
19
|
+
import * as i4 from "./fixture.service";
|
|
20
|
+
import * as i5 from "./config.service";
|
|
21
|
+
import * as i6 from "@angular/common/http";
|
|
22
|
+
import * as i7 from "./animation.service";
|
|
23
|
+
export class PresetService {
|
|
24
|
+
constructor(effectService, uuidService, projectService, fixtureService, configService, http, animationService) {
|
|
25
|
+
this.effectService = effectService;
|
|
26
|
+
this.uuidService = uuidService;
|
|
27
|
+
this.projectService = projectService;
|
|
28
|
+
this.fixtureService = fixtureService;
|
|
29
|
+
this.configService = configService;
|
|
30
|
+
this.http = http;
|
|
31
|
+
this.animationService = animationService;
|
|
32
|
+
// fires, when the current preview element has changed (scene/preset)
|
|
33
|
+
this.previewSelectionChanged = new Subject();
|
|
34
|
+
// fires, when the fixture selection has changed
|
|
35
|
+
this.fixtureSelectionChanged = new Subject();
|
|
36
|
+
// fires, when the fixture selection has changed for settings
|
|
37
|
+
this.fixtureSelectionSettingsChanged = new Subject();
|
|
38
|
+
// fires, when the selected color has changed. This is required,
|
|
39
|
+
// because detectChanges is not enough to trigger different components.
|
|
40
|
+
this.fixtureColorChanged = new Subject();
|
|
41
|
+
this.liveChangePending = false;
|
|
42
|
+
}
|
|
43
|
+
getPresetByUuid(uuid) {
|
|
44
|
+
for (const preset of this.projectService.project.presets) {
|
|
45
|
+
if (preset.uuid === uuid) {
|
|
46
|
+
return preset;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
getPresetFixture(preset, fixtureUuid, pixelKey) {
|
|
51
|
+
for (const fixture of preset.fixtures) {
|
|
52
|
+
if (fixture.fixtureUuid === fixtureUuid && ((!fixture.pixelKey && !pixelKey) || fixture.pixelKey === pixelKey)) {
|
|
53
|
+
return fixture;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
fixtureIsSelected(fixture, pixelKey, preset) {
|
|
59
|
+
// is the passed fixture selected in the passed/currently selected preset?
|
|
60
|
+
if (!preset) {
|
|
61
|
+
if (this.selectedPreset) {
|
|
62
|
+
preset = this.selectedPreset;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const presetFixture = this.getPresetFixture(preset, fixture.uuid, pixelKey);
|
|
69
|
+
if (presetFixture) {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
switchFixtureSelection(fixture, pixelKey) {
|
|
75
|
+
if (!this.selectedPreset) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// select all fixtures at the specified start channel or unselect them,
|
|
79
|
+
// if already selected
|
|
80
|
+
if (this.fixtureIsSelected(fixture, pixelKey)) {
|
|
81
|
+
for (let i = this.selectedPreset.fixtures.length - 1; i >= 0; i--) {
|
|
82
|
+
const projectFixture = this.fixtureService.getFixtureByUuid(this.selectedPreset.fixtures[i].fixtureUuid);
|
|
83
|
+
if (projectFixture.dmxFirstChannel === fixture.dmxFirstChannel &&
|
|
84
|
+
((!this.selectedPreset.fixtures[i].pixelKey && !pixelKey) || this.selectedPreset.fixtures[i].pixelKey === pixelKey)) {
|
|
85
|
+
this.selectedPreset.fixtures.splice(i, 1);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
for (const projectPresetFixture of this.projectService.project.presetFixtures) {
|
|
91
|
+
if ((!projectPresetFixture.pixelKey && !pixelKey) || projectPresetFixture.pixelKey === pixelKey) {
|
|
92
|
+
const projectFixture = this.fixtureService.getFixtureByUuid(projectPresetFixture.fixtureUuid);
|
|
93
|
+
if (projectFixture.dmxFirstChannel === fixture.dmxFirstChannel) {
|
|
94
|
+
const presetFixture = new PresetFixture();
|
|
95
|
+
presetFixture.fixtureUuid = projectPresetFixture.fixtureUuid;
|
|
96
|
+
presetFixture.pixelKey = pixelKey;
|
|
97
|
+
this.selectedPreset.fixtures.push(presetFixture);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
selectAllFixtures() {
|
|
104
|
+
if (!this.selectedPreset) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
for (const fixture of this.projectService.project.fixtures) {
|
|
108
|
+
const pixelKeys = this.fixtureService.fixtureGetUniquePixelKeys(fixture);
|
|
109
|
+
if (pixelKeys.length > 0) {
|
|
110
|
+
for (const pixelKey of pixelKeys) {
|
|
111
|
+
if (!this.fixtureIsSelected(fixture, pixelKey)) {
|
|
112
|
+
const presetFixture = new PresetFixture();
|
|
113
|
+
presetFixture.fixtureUuid = fixture.uuid;
|
|
114
|
+
presetFixture.pixelKey = pixelKey;
|
|
115
|
+
this.selectedPreset.fixtures.push(presetFixture);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
if (!this.fixtureIsSelected(fixture, null)) {
|
|
121
|
+
const presetFixture = new PresetFixture();
|
|
122
|
+
presetFixture.fixtureUuid = fixture.uuid;
|
|
123
|
+
this.selectedPreset.fixtures.push(presetFixture);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
selectNoFixtures() {
|
|
129
|
+
if (!this.selectedPreset) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
this.selectedPreset.fixtures = [];
|
|
133
|
+
}
|
|
134
|
+
removeDeletedFixtures() {
|
|
135
|
+
// after changing the configuration in the fixture pool, we might need to
|
|
136
|
+
// delete some fixtures
|
|
137
|
+
for (const preset of this.projectService.project.presets) {
|
|
138
|
+
for (let i = preset.fixtures.length - 1; i >= 0; i--) {
|
|
139
|
+
const presetFixture = this.fixtureService.getFixtureByUuid(preset.fixtures[i].fixtureUuid);
|
|
140
|
+
if (!presetFixture) {
|
|
141
|
+
preset.fixtures.splice(i, 1);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
updateFixtureSelection() {
|
|
147
|
+
// after changing the configuration in the fixture pool, we might need to
|
|
148
|
+
// select some more fixtures on the same channel as already selected ones
|
|
149
|
+
for (const preset of this.projectService.project.presets) {
|
|
150
|
+
for (let presetFixture of preset.fixtures) {
|
|
151
|
+
const fixture = this.fixtureService.getFixtureByUuid(presetFixture.fixtureUuid);
|
|
152
|
+
for (const projectFixture of this.projectService.project.fixtures) {
|
|
153
|
+
if (projectFixture.dmxFirstChannel === fixture.dmxFirstChannel &&
|
|
154
|
+
!this.fixtureIsSelected(projectFixture, presetFixture.pixelKey, preset)) {
|
|
155
|
+
const newPresetFixture = new PresetFixture();
|
|
156
|
+
newPresetFixture.fixtureUuid = projectFixture.uuid;
|
|
157
|
+
newPresetFixture.pixelKey = presetFixture.pixelKey;
|
|
158
|
+
preset.fixtures.push(newPresetFixture);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
deleteCapabilityValue(preset, capabilityType, color, wheel, profileUuid) {
|
|
165
|
+
for (let i = 0; i < preset.fixtureCapabilityValues.length; i++) {
|
|
166
|
+
if (this.fixtureService.capabilitiesMatch(preset.fixtureCapabilityValues[i].type, capabilityType, preset.fixtureCapabilityValues[i].color, color, preset.fixtureCapabilityValues[i].wheel, wheel, preset.fixtureCapabilityValues[i].profileUuid, profileUuid)) {
|
|
167
|
+
preset.fixtureCapabilityValues.splice(i, 1);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
setCapabilityValue(preset, capabilityType, valuePercentage, slotNumber, color, wheel, profileUuid) {
|
|
173
|
+
// Delete existant properties with this type and set the new value
|
|
174
|
+
this.deleteCapabilityValue(preset, capabilityType, color, wheel, profileUuid);
|
|
175
|
+
const fixtureCapabilityValue = new FixtureCapabilityValue();
|
|
176
|
+
fixtureCapabilityValue.type = capabilityType;
|
|
177
|
+
fixtureCapabilityValue.color = color;
|
|
178
|
+
fixtureCapabilityValue.wheel = wheel;
|
|
179
|
+
fixtureCapabilityValue.valuePercentage = valuePercentage;
|
|
180
|
+
fixtureCapabilityValue.slotNumber = slotNumber;
|
|
181
|
+
fixtureCapabilityValue.profileUuid = profileUuid;
|
|
182
|
+
preset.fixtureCapabilityValues.push(fixtureCapabilityValue);
|
|
183
|
+
}
|
|
184
|
+
getCapabilityValue(preset, capabilityType, color, wheel, profileUuid) {
|
|
185
|
+
for (const capabilityValue of preset.fixtureCapabilityValues) {
|
|
186
|
+
if (this.fixtureService.capabilitiesMatch(capabilityValue.type, capabilityType, capabilityValue.color, color, capabilityValue.wheel, wheel, capabilityValue.profileUuid, profileUuid)) {
|
|
187
|
+
return capabilityValue;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return undefined;
|
|
191
|
+
}
|
|
192
|
+
deleteChannelValue(channelName, profileUuid) {
|
|
193
|
+
for (let i = 0; i < this.selectedPreset.fixtureChannelValues.length; i++) {
|
|
194
|
+
if (this.selectedPreset.fixtureChannelValues[i].channelName === channelName &&
|
|
195
|
+
this.selectedPreset.fixtureChannelValues[i].profileUuid === profileUuid) {
|
|
196
|
+
this.selectedPreset.fixtureChannelValues.splice(i, 1);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
setChannelValue(channelName, profileUuid, value) {
|
|
202
|
+
// Delete existant properties with this type and set the new value
|
|
203
|
+
this.deleteChannelValue(channelName, profileUuid);
|
|
204
|
+
const fixtureChannelValue = new FixtureChannelValue();
|
|
205
|
+
fixtureChannelValue.channelName = channelName;
|
|
206
|
+
fixtureChannelValue.profileUuid = profileUuid;
|
|
207
|
+
fixtureChannelValue.value = value;
|
|
208
|
+
this.selectedPreset.fixtureChannelValues.push(fixtureChannelValue);
|
|
209
|
+
}
|
|
210
|
+
getChannelValue(channelName, profileUuid) {
|
|
211
|
+
for (const channelValue of this.selectedPreset.fixtureChannelValues) {
|
|
212
|
+
if (channelValue.channelName === channelName && channelValue.profileUuid === profileUuid) {
|
|
213
|
+
return channelValue.value;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
getApproximatedColorWheelCapability(preset, cachedChannel) {
|
|
218
|
+
// return an approximated wheel slot channel capability, if a color or a slot on a different
|
|
219
|
+
// wheel has been selected
|
|
220
|
+
let colorRed;
|
|
221
|
+
let colorGreen;
|
|
222
|
+
let colorBlue;
|
|
223
|
+
let lowestDiff = Number.MAX_VALUE;
|
|
224
|
+
let lowestDiffCapability;
|
|
225
|
+
let capabilityValue;
|
|
226
|
+
capabilityValue = this.getCapabilityValue(preset, FixtureCapabilityType.ColorIntensity, FixtureCapabilityColor.Red);
|
|
227
|
+
if (capabilityValue) {
|
|
228
|
+
colorRed = 255 * capabilityValue.valuePercentage;
|
|
229
|
+
}
|
|
230
|
+
capabilityValue = this.getCapabilityValue(preset, FixtureCapabilityType.ColorIntensity, FixtureCapabilityColor.Green);
|
|
231
|
+
if (capabilityValue) {
|
|
232
|
+
colorGreen = 255 * capabilityValue.valuePercentage;
|
|
233
|
+
}
|
|
234
|
+
capabilityValue = this.getCapabilityValue(preset, FixtureCapabilityType.ColorIntensity, FixtureCapabilityColor.Blue);
|
|
235
|
+
if (capabilityValue) {
|
|
236
|
+
colorBlue = 255 * capabilityValue.valuePercentage;
|
|
237
|
+
}
|
|
238
|
+
if (!colorRed && !colorGreen && !colorBlue) {
|
|
239
|
+
// no color found -> search the first color wheel
|
|
240
|
+
// TODO
|
|
241
|
+
}
|
|
242
|
+
if (colorRed !== undefined && colorGreen !== undefined && colorBlue !== undefined) {
|
|
243
|
+
for (const capability of cachedChannel.capabilities) {
|
|
244
|
+
if (capability.capability.slotNumber) {
|
|
245
|
+
const mixedColor = this.fixtureService.getMixedWheelSlotColor(capability.wheel, capability.capability.slotNumber);
|
|
246
|
+
if (mixedColor) {
|
|
247
|
+
const diff = Math.abs(mixedColor.red - colorRed) + Math.abs(mixedColor.green - colorGreen) + Math.abs(mixedColor.blue - colorBlue);
|
|
248
|
+
if (diff < lowestDiff) {
|
|
249
|
+
lowestDiff = diff;
|
|
250
|
+
lowestDiffCapability = capability;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return lowestDiffCapability;
|
|
257
|
+
}
|
|
258
|
+
hasCapabilityType(type) {
|
|
259
|
+
// there is at least one channel with at least one intensity capability
|
|
260
|
+
for (const projectFixture of this.selectedPreset.fixtures) {
|
|
261
|
+
const fixture = this.fixtureService.getCachedFixtureByUuid(projectFixture.fixtureUuid, projectFixture.pixelKey);
|
|
262
|
+
for (const channel of fixture.channels) {
|
|
263
|
+
if (channel.channel) {
|
|
264
|
+
for (const capability of channel.capabilities) {
|
|
265
|
+
if (capability.capability.type === type) {
|
|
266
|
+
return true;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
hasCapabilityDimmer() {
|
|
275
|
+
return this.hasCapabilityType(FixtureCapabilityType.Intensity);
|
|
276
|
+
}
|
|
277
|
+
hasCapabilityColor() {
|
|
278
|
+
// TODO optionally color temperature and color white (see stairville/mh-100)
|
|
279
|
+
// one of the profiles has a color intensity
|
|
280
|
+
if (this.hasCapabilityType(FixtureCapabilityType.ColorIntensity)) {
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
hasCapabilityColorOrColorWheel() {
|
|
286
|
+
// TODO optionally color temperature and color white (see stairville/mh-100)
|
|
287
|
+
// one of the profiles has a color intensity
|
|
288
|
+
if (this.hasCapabilityColor()) {
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
// a color wheel is involved
|
|
292
|
+
for (const projectFixture of this.selectedPreset.fixtures) {
|
|
293
|
+
const fixture = this.fixtureService.getCachedFixtureByUuid(projectFixture.fixtureUuid, projectFixture.pixelKey);
|
|
294
|
+
for (const channel of fixture.channels) {
|
|
295
|
+
if (channel.colorWheel) {
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
hasCapabilityPanTilt() {
|
|
303
|
+
let hasPan = false;
|
|
304
|
+
let hasTilt = false;
|
|
305
|
+
// there is at least one pan and one tilt channel
|
|
306
|
+
if (this.hasCapabilityType(FixtureCapabilityType.Pan)) {
|
|
307
|
+
hasPan = true;
|
|
308
|
+
}
|
|
309
|
+
if (this.hasCapabilityType(FixtureCapabilityType.Tilt)) {
|
|
310
|
+
hasTilt = true;
|
|
311
|
+
}
|
|
312
|
+
if (hasPan && hasTilt) {
|
|
313
|
+
return true;
|
|
314
|
+
}
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
selectPreset(index) {
|
|
318
|
+
this.effectService.selectedEffect = undefined;
|
|
319
|
+
this.selectedPreset = this.projectService.project.presets[index];
|
|
320
|
+
this.projectService.project.selectedPresetUuid = this.projectService.project.presets[index].uuid;
|
|
321
|
+
this.autoOpenFirstEffect();
|
|
322
|
+
this.previewSelectionChanged.next();
|
|
323
|
+
this.previewLive();
|
|
324
|
+
}
|
|
325
|
+
autoOpenFirstEffect() {
|
|
326
|
+
// open the first effect, if the preset only has one
|
|
327
|
+
if (this.selectedPreset && this.selectedPreset.effects.length === 1) {
|
|
328
|
+
this.effectService.selectedEffect = this.selectedPreset.effects[0];
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
addPreset(name) {
|
|
332
|
+
const preset = new Preset();
|
|
333
|
+
preset.uuid = this.uuidService.getUuid();
|
|
334
|
+
preset.name = name || 'New Preset';
|
|
335
|
+
// Insert the new preset before the highest currently selected preset
|
|
336
|
+
let highestSelectedPresetIndex = 0;
|
|
337
|
+
for (let i = 0; i < this.projectService.project.presets.length; i++) {
|
|
338
|
+
if (this.selectedPreset === this.projectService.project.presets[i]) {
|
|
339
|
+
highestSelectedPresetIndex = i;
|
|
340
|
+
break;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
this.projectService.project.presets.splice(highestSelectedPresetIndex, 0, preset);
|
|
344
|
+
this.selectPreset(highestSelectedPresetIndex);
|
|
345
|
+
}
|
|
346
|
+
// return all fixture profiles used in the current preset selection
|
|
347
|
+
getSelectedProfiles() {
|
|
348
|
+
const profiles = [];
|
|
349
|
+
if (!this.selectedPreset) {
|
|
350
|
+
return profiles;
|
|
351
|
+
}
|
|
352
|
+
for (const presetFixture of this.selectedPreset.fixtures) {
|
|
353
|
+
const fixture = this.fixtureService.getFixtureByUuid(presetFixture.fixtureUuid);
|
|
354
|
+
const profile = this.fixtureService.getProfileByUuid(fixture.profileUuid);
|
|
355
|
+
if (profiles.indexOf(profile) < 0) {
|
|
356
|
+
profiles.push(profile);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return profiles;
|
|
360
|
+
}
|
|
361
|
+
// given a list of fixture profiles, return all available channels based on the currently selected fixtures in the preset
|
|
362
|
+
getSelectedProfileChannels(selectedProfiles) {
|
|
363
|
+
const calculatedProfileModes = new Map();
|
|
364
|
+
const availableChannels = new Map();
|
|
365
|
+
// calculate all modes for each profile
|
|
366
|
+
for (const profile of selectedProfiles) {
|
|
367
|
+
const modeAndPixelKeys = [];
|
|
368
|
+
// loop over the project fixtures to keep the order
|
|
369
|
+
for (let projectFixture of this.projectService.project.presetFixtures) {
|
|
370
|
+
for (const presetFixture of this.selectedPreset.fixtures) {
|
|
371
|
+
if (projectFixture.fixtureUuid === presetFixture.fixtureUuid &&
|
|
372
|
+
((!projectFixture.pixelKey && !presetFixture.pixelKey) || projectFixture.pixelKey === presetFixture.pixelKey)) {
|
|
373
|
+
const fixture = this.fixtureService.getCachedFixtureByUuid(presetFixture.fixtureUuid, presetFixture.pixelKey);
|
|
374
|
+
if (fixture.profile.uuid === profile.uuid) {
|
|
375
|
+
const exists = modeAndPixelKeys.some((item) => (item.mode === fixture.mode && !item.pixelKey && !fixture.pixelKey) || item.pixelKey === fixture.pixelKey);
|
|
376
|
+
if (!exists) {
|
|
377
|
+
modeAndPixelKeys.push({
|
|
378
|
+
mode: fixture.mode,
|
|
379
|
+
pixelKey: presetFixture.pixelKey,
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
calculatedProfileModes.set(profile, modeAndPixelKeys);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
// calculate all channels from the modes
|
|
389
|
+
calculatedProfileModes.forEach((modeAndPixelKeys, profile) => {
|
|
390
|
+
const profileChannels = [];
|
|
391
|
+
for (const modeAndPixelKey of modeAndPixelKeys) {
|
|
392
|
+
const channels = this.fixtureService.getCachedChannels(profile, modeAndPixelKey.mode, modeAndPixelKey.pixelKey);
|
|
393
|
+
for (const channel of channels) {
|
|
394
|
+
// only add the channel, if no channel with the same name has already been added
|
|
395
|
+
// (e.g. a fine channel)
|
|
396
|
+
if (channel.channel && !profileChannels.find((c) => c.name === channel.name)) {
|
|
397
|
+
profileChannels.push(channel);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
availableChannels.set(profile, profileChannels);
|
|
402
|
+
});
|
|
403
|
+
return availableChannels;
|
|
404
|
+
}
|
|
405
|
+
previewLive(compositionName = '', positionMillis) {
|
|
406
|
+
if (!this.configService.livePreview) {
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
// collect all changes and delay them to not flood the backend
|
|
410
|
+
// (except play events. they need to be delivered always)
|
|
411
|
+
if (this.livePreviewTimer && !compositionName) {
|
|
412
|
+
this.liveChangePending = true;
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
let position = positionMillis;
|
|
416
|
+
if (position === undefined) {
|
|
417
|
+
position = Math.round(this.animationService.timeMillis);
|
|
418
|
+
}
|
|
419
|
+
this.http
|
|
420
|
+
.post('preview?positionMillis=' + position + '&compositionName=' + compositionName, JSON.stringify(this.projectService.project))
|
|
421
|
+
.subscribe();
|
|
422
|
+
this.liveChangePending = false;
|
|
423
|
+
if (!compositionName) {
|
|
424
|
+
this.livePreviewTimer = setTimeout(() => {
|
|
425
|
+
this.livePreviewTimer = undefined;
|
|
426
|
+
if (this.liveChangePending) {
|
|
427
|
+
this.http
|
|
428
|
+
.post('preview?positionMillis=' + position + '&compositionName=' + compositionName, JSON.stringify(this.projectService.project))
|
|
429
|
+
.subscribe();
|
|
430
|
+
}
|
|
431
|
+
}, 50);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
stopPreviewPlay() {
|
|
435
|
+
if (!this.configService.livePreview) {
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
this.http.post('stop-preview-play', null).subscribe();
|
|
439
|
+
}
|
|
440
|
+
static { this.ɵfac = function PresetService_Factory(t) { return new (t || PresetService)(i0.ɵɵinject(i1.EffectService), i0.ɵɵinject(i2.UuidService), i0.ɵɵinject(i3.ProjectService), i0.ɵɵinject(i4.FixtureService), i0.ɵɵinject(i5.ConfigService), i0.ɵɵinject(i6.HttpClient), i0.ɵɵinject(i7.AnimationService)); }; }
|
|
441
|
+
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PresetService, factory: PresetService.ɵfac, providedIn: 'root' }); }
|
|
442
|
+
}
|
|
443
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PresetService, [{
|
|
444
|
+
type: Injectable,
|
|
445
|
+
args: [{
|
|
446
|
+
providedIn: 'root',
|
|
447
|
+
}]
|
|
448
|
+
}], () => [{ type: i1.EffectService }, { type: i2.UuidService }, { type: i3.ProjectService }, { type: i4.FixtureService }, { type: i5.ConfigService }, { type: i6.HttpClient }, { type: i7.AnimationService }], null); })();
|
|
449
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL3NlcnZpY2VzL3ByZXNldC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJL0IsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0YsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHdEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7QUFLekQsTUFBTSxPQUFPLGFBQWE7SUFtQnhCLFlBQ1UsYUFBNEIsRUFDNUIsV0FBd0IsRUFDeEIsY0FBOEIsRUFDOUIsY0FBOEIsRUFDOUIsYUFBNEIsRUFDNUIsSUFBZ0IsRUFDaEIsZ0JBQWtDO1FB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LEVBQUUsQ0FBQztRQUVmLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFFL0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUN0QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO2dCQUNsQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUMzQixJQUFJLENBQUMsSUFBSTt5QkFDTixJQUFJLENBQUMseUJBQXlCLEdBQUcsUUFBUSxHQUFHLG1CQUFtQixHQUFHLGVBQWUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7eUJBQy9ILFNBQVMsRUFBRSxDQUFDO2dCQUNqQixDQUFDO1lBQ0gsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ1QsQ0FBQztJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDcEMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN4RCxDQUFDOzhFQWppQlUsYUFBYTt1RUFBYixhQUFhLFdBQWIsYUFBYSxtQkFGWixNQUFNOztpRkFFUCxhQUFhO2NBSHpCLFVBQVU7ZUFBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eSB9IGZyb20gJy4uL21vZGVscy9jYWNoZWQtZml4dHVyZS1jYXBhYmlsaXR5JztcbmltcG9ydCB7IENhY2hlZEZpeHR1cmVDaGFubmVsIH0gZnJvbSAnLi4vbW9kZWxzL2NhY2hlZC1maXh0dXJlLWNoYW5uZWwnO1xuaW1wb3J0IHsgRml4dHVyZSB9IGZyb20gJy4uL21vZGVscy9maXh0dXJlJztcbmltcG9ydCB7IEZpeHR1cmVDYXBhYmlsaXR5Q29sb3IsIEZpeHR1cmVDYXBhYmlsaXR5VHlwZSB9IGZyb20gJy4uL21vZGVscy9maXh0dXJlLWNhcGFiaWxpdHknO1xuaW1wb3J0IHsgRml4dHVyZUNhcGFiaWxpdHlWYWx1ZSB9IGZyb20gJy4uL21vZGVscy9maXh0dXJlLWNhcGFiaWxpdHktdmFsdWUnO1xuaW1wb3J0IHsgRml4dHVyZUNoYW5uZWxWYWx1ZSB9IGZyb20gJy4uL21vZGVscy9maXh0dXJlLWNoYW5uZWwtdmFsdWUnO1xuaW1wb3J0IHsgRml4dHVyZU1vZGUgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS1tb2RlJztcbmltcG9ydCB7IEZpeHR1cmVQcm9maWxlIH0gZnJvbSAnLi4vbW9kZWxzL2ZpeHR1cmUtcHJvZmlsZSc7XG5pbXBvcnQgeyBQcmVzZXQgfSBmcm9tICcuLi9tb2RlbHMvcHJlc2V0JztcbmltcG9ydCB7IEFuaW1hdGlvblNlcnZpY2UgfSBmcm9tICcuL2FuaW1hdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IEVmZmVjdFNlcnZpY2UgfSBmcm9tICcuL2VmZmVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IEZpeHR1cmVTZXJ2aWNlIH0gZnJvbSAnLi9maXh0dXJlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJvamVjdFNlcnZpY2UgfSBmcm9tICcuL3Byb2plY3Quc2VydmljZSc7XG5pbXBvcnQgeyBVdWlkU2VydmljZSB9IGZyb20gJy4vdXVpZC5zZXJ2aWNlJztcbmltcG9ydCB7IFByZXNldEZpeHR1cmUgfSBmcm9tICcuLi9tb2RlbHMvcHJlc2V0LWZpeHR1cmUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUHJlc2V0U2VydmljZSB7XG4gIHNlbGVjdGVkUHJlc2V0OiBQcmVzZXQ7XG5cbiAgLy8gZmlyZXMsIHdoZW4gdGhlIGN1cnJlbnQgcHJldmlldyBlbGVtZW50IGhhcyBjaGFuZ2VkIChzY2VuZS9wcmVzZXQpXG4gIHByZXZpZXdTZWxlY3Rpb25DaGFuZ2VkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyBmaXJlcywgd2hlbiB0aGUgZml4dHVyZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWRcbiAgZml4dHVyZVNlbGVjdGlvbkNoYW5nZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vIGZpcmVzLCB3aGVuIHRoZSBmaXh0dXJlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZCBmb3Igc2V0dGluZ3NcbiAgZml4dHVyZVNlbGVjdGlvblNldHRpbmdzQ2hhbmdlZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gZmlyZXMsIHdoZW4gdGhlIHNlbGVjdGVkIGNvbG9yIGhhcyBjaGFuZ2VkLiBUaGlzIGlzIHJlcXVpcmVkLFxuICAvLyBiZWNhdXNlIGRldGVjdENoYW5nZXMgaXMgbm90IGVub3VnaCB0byB0cmlnZ2VyIGRpZmZlcmVudCBjb21wb25lbnRzLlxuICBmaXh0dXJlQ29sb3JDaGFuZ2VkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBsaXZlUHJldmlld1RpbWVyOiBhbnk7XG4gIGxpdmVDaGFuZ2VQZW5kaW5nID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlZmZlY3RTZXJ2aWNlOiBFZmZlY3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXVpZFNlcnZpY2U6IFV1aWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcHJvamVjdFNlcnZpY2U6IFByb2plY3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgZml4dHVyZVNlcnZpY2U6IEZpeHR1cmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBhbmltYXRpb25TZXJ2aWNlOiBBbmltYXRpb25TZXJ2aWNlXG4gICkge31cblxuICBnZXRQcmVzZXRCeVV1aWQodXVpZDogc3RyaW5nKTogUHJlc2V0IHtcbiAgICBmb3IgKGNvbnN0IHByZXNldCBvZiB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QucHJlc2V0cykge1xuICAgICAgaWYgKHByZXNldC51dWlkID09PSB1dWlkKSB7XG4gICAgICAgIHJldHVybiBwcmVzZXQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0UHJlc2V0Rml4dHVyZShwcmVzZXQ6IFByZXNldCwgZml4dHVyZVV1aWQ6IHN0cmluZywgcGl4ZWxLZXk/OiBzdHJpbmcpOiBQcmVzZXRGaXh0dXJlIHtcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgcHJlc2V0LmZpeHR1cmVzKSB7XG4gICAgICBpZiAoZml4dHVyZS5maXh0dXJlVXVpZCA9PT0gZml4dHVyZVV1aWQgJiYgKCghZml4dHVyZS5waXhlbEtleSAmJiAhcGl4ZWxLZXkpIHx8IGZpeHR1cmUucGl4ZWxLZXkgPT09IHBpeGVsS2V5KSkge1xuICAgICAgICByZXR1cm4gZml4dHVyZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZpeHR1cmVJc1NlbGVjdGVkKGZpeHR1cmU6IEZpeHR1cmUsIHBpeGVsS2V5OiBzdHJpbmcsIHByZXNldD86IFByZXNldCk6IGJvb2xlYW4ge1xuICAgIC8vIGlzIHRoZSBwYXNzZWQgZml4dHVyZSBzZWxlY3RlZCBpbiB0aGUgcGFzc2VkL2N1cnJlbnRseSBzZWxlY3RlZCBwcmVzZXQ/XG4gICAgaWYgKCFwcmVzZXQpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkUHJlc2V0KSB7XG4gICAgICAgIHByZXNldCA9IHRoaXMuc2VsZWN0ZWRQcmVzZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHJlc2V0Rml4dHVyZSA9IHRoaXMuZ2V0UHJlc2V0Rml4dHVyZShwcmVzZXQsIGZpeHR1cmUudXVpZCwgcGl4ZWxLZXkpO1xuXG4gICAgaWYgKHByZXNldEZpeHR1cmUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN3aXRjaEZpeHR1cmVTZWxlY3Rpb24oZml4dHVyZTogRml4dHVyZSwgcGl4ZWxLZXk6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZFByZXNldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHNlbGVjdCBhbGwgZml4dHVyZXMgYXQgdGhlIHNwZWNpZmllZCBzdGFydCBjaGFubmVsIG9yIHVuc2VsZWN0IHRoZW0sXG4gICAgLy8gaWYgYWxyZWFkeSBzZWxlY3RlZFxuICAgIGlmICh0aGlzLmZpeHR1cmVJc1NlbGVjdGVkKGZpeHR1cmUsIHBpeGVsS2V5KSkge1xuICAgICAgZm9yIChsZXQgaSA9IHRoaXMuc2VsZWN0ZWRQcmVzZXQuZml4dHVyZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgcHJvamVjdEZpeHR1cmUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldEZpeHR1cmVCeVV1aWQodGhpcy5zZWxlY3RlZFByZXNldC5maXh0dXJlc1tpXS5maXh0dXJlVXVpZCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcm9qZWN0Rml4dHVyZS5kbXhGaXJzdENoYW5uZWwgPT09IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICYmXG4gICAgICAgICAgKCghdGhpcy5zZWxlY3RlZFByZXNldC5maXh0dXJlc1tpXS5waXhlbEtleSAmJiAhcGl4ZWxLZXkpIHx8IHRoaXMuc2VsZWN0ZWRQcmVzZXQuZml4dHVyZXNbaV0ucGl4ZWxLZXkgPT09IHBpeGVsS2V5KVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0LmZpeHR1cmVzLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IHByb2plY3RQcmVzZXRGaXh0dXJlIG9mIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRGaXh0dXJlcykge1xuICAgICAgICBpZiAoKCFwcm9qZWN0UHJlc2V0Rml4dHVyZS5waXhlbEtleSAmJiAhcGl4ZWxLZXkpIHx8IHByb2plY3RQcmVzZXRGaXh0dXJlLnBpeGVsS2V5ID09PSBwaXhlbEtleSkge1xuICAgICAgICAgIGNvbnN0IHByb2plY3RGaXh0dXJlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRGaXh0dXJlQnlVdWlkKHByb2plY3RQcmVzZXRGaXh0dXJlLmZpeHR1cmVVdWlkKTtcbiAgICAgICAgICBpZiAocHJvamVjdEZpeHR1cmUuZG14Rmlyc3RDaGFubmVsID09PSBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCkge1xuICAgICAgICAgICAgY29uc3QgcHJlc2V0Rml4dHVyZSA9IG5ldyBQcmVzZXRGaXh0dXJlKCk7XG4gICAgICAgICAgICBwcmVzZXRGaXh0dXJlLmZpeHR1cmVVdWlkID0gcHJvamVjdFByZXNldEZpeHR1cmUuZml4dHVyZVV1aWQ7XG4gICAgICAgICAgICBwcmVzZXRGaXh0dXJlLnBpeGVsS2V5ID0gcGl4ZWxLZXk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0LmZpeHR1cmVzLnB1c2gocHJlc2V0Rml4dHVyZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0QWxsRml4dHVyZXMoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUHJlc2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5maXh0dXJlcykge1xuICAgICAgY29uc3QgcGl4ZWxLZXlzID0gdGhpcy5maXh0dXJlU2VydmljZS5maXh0dXJlR2V0VW5pcXVlUGl4ZWxLZXlzKGZpeHR1cmUpO1xuICAgICAgaWYgKHBpeGVsS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGl4ZWxLZXkgb2YgcGl4ZWxLZXlzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmZpeHR1cmVJc1NlbGVjdGVkKGZpeHR1cmUsIHBpeGVsS2V5KSkge1xuICAgICAgICAgICAgY29uc3QgcHJlc2V0Rml4dHVyZSA9IG5ldyBQcmVzZXRGaXh0dXJlKCk7XG4gICAgICAgICAgICBwcmVzZXRGaXh0dXJlLmZpeHR1cmVVdWlkID0gZml4dHVyZS51dWlkO1xuICAgICAgICAgICAgcHJlc2V0Rml4dHVyZS5waXhlbEtleSA9IHBpeGVsS2V5O1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFByZXNldC5maXh0dXJlcy5wdXNoKHByZXNldEZpeHR1cmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpeHR1cmVJc1NlbGVjdGVkKGZpeHR1cmUsIG51bGwpKSB7XG4gICAgICAgICAgY29uc3QgcHJlc2V0Rml4dHVyZSA9IG5ldyBQcmVzZXRGaXh0dXJlKCk7XG4gICAgICAgICAgcHJlc2V0Rml4dHVyZS5maXh0dXJlVXVpZCA9IGZpeHR1cmUudXVpZDtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0LmZpeHR1cmVzLnB1c2gocHJlc2V0Rml4dHVyZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZWxlY3ROb0ZpeHR1cmVzKCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZFByZXNldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQuZml4dHVyZXMgPSBbXTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVEZWxldGVkRml4dHVyZXMoKSB7XG4gICAgLy8gYWZ0ZXIgY2hhbmdpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGZpeHR1cmUgcG9vbCwgd2UgbWlnaHQgbmVlZCB0b1xuICAgIC8vIGRlbGV0ZSBzb21lIGZpeHR1cmVzXG4gICAgZm9yIChjb25zdCBwcmVzZXQgb2YgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldHMpIHtcbiAgICAgIGZvciAobGV0IGkgPSBwcmVzZXQuZml4dHVyZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgcHJlc2V0Rml4dHVyZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0Rml4dHVyZUJ5VXVpZChwcmVzZXQuZml4dHVyZXNbaV0uZml4dHVyZVV1aWQpO1xuICAgICAgICBpZiAoIXByZXNldEZpeHR1cmUpIHtcbiAgICAgICAgICBwcmVzZXQuZml4dHVyZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZUZpeHR1cmVTZWxlY3Rpb24oKSB7XG4gICAgLy8gYWZ0ZXIgY2hhbmdpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGZpeHR1cmUgcG9vbCwgd2UgbWlnaHQgbmVlZCB0b1xuICAgIC8vIHNlbGVjdCBzb21lIG1vcmUgZml4dHVyZXMgb24gdGhlIHNhbWUgY2hhbm5lbCBhcyBhbHJlYWR5IHNlbGVjdGVkIG9uZXNcbiAgICBmb3IgKGNvbnN0IHByZXNldCBvZiB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QucHJlc2V0cykge1xuICAgICAgZm9yIChsZXQgcHJlc2V0Rml4dHVyZSBvZiBwcmVzZXQuZml4dHVyZXMpIHtcbiAgICAgICAgY29uc3QgZml4dHVyZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0Rml4dHVyZUJ5VXVpZChwcmVzZXRGaXh0dXJlLmZpeHR1cmVVdWlkKTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9qZWN0Rml4dHVyZSBvZiB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZXMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBwcm9qZWN0Rml4dHVyZS5kbXhGaXJzdENoYW5uZWwgPT09IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICYmXG4gICAgICAgICAgICAhdGhpcy5maXh0dXJlSXNTZWxlY3RlZChwcm9qZWN0Rml4dHVyZSwgcHJlc2V0Rml4dHVyZS5waXhlbEtleSwgcHJlc2V0KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgbmV3UHJlc2V0Rml4dHVyZSA9IG5ldyBQcmVzZXRGaXh0dXJlKCk7XG4gICAgICAgICAgICBuZXdQcmVzZXRGaXh0dXJlLmZpeHR1cmVVdWlkID0gcHJvamVjdEZpeHR1cmUudXVpZDtcbiAgICAgICAgICAgIG5ld1ByZXNldEZpeHR1cmUucGl4ZWxLZXkgPSBwcmVzZXRGaXh0dXJlLnBpeGVsS2V5O1xuICAgICAgICAgICAgcHJlc2V0LmZpeHR1cmVzLnB1c2gobmV3UHJlc2V0Rml4dHVyZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlQ2FwYWJpbGl0eVZhbHVlKFxuICAgIHByZXNldDogUHJlc2V0LFxuICAgIGNhcGFiaWxpdHlUeXBlOiBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUsXG4gICAgY29sb3I/OiBGaXh0dXJlQ2FwYWJpbGl0eUNvbG9yLFxuICAgIHdoZWVsPzogc3RyaW5nLFxuICAgIHByb2ZpbGVVdWlkPzogc3RyaW5nXG4gICkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJlc2V0LmZpeHR1cmVDYXBhYmlsaXR5VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZml4dHVyZVNlcnZpY2UuY2FwYWJpbGl0aWVzTWF0Y2goXG4gICAgICAgICAgcHJlc2V0LmZpeHR1cmVDYXBhYmlsaXR5VmFsdWVzW2ldLnR5cGUsXG4gICAgICAgICAgY2FwYWJpbGl0eVR5cGUsXG4gICAgICAgICAgcHJlc2V0LmZpeHR1cmVDYXBhYmlsaXR5VmFsdWVzW2ldLmNvbG9yLFxuICAgICAgICAgIGNvbG9yLFxuICAgICAgICAgIHByZXNldC5maXh0dXJlQ2FwYWJpbGl0eVZhbHVlc1tpXS53aGVlbCxcbiAgICAgICAgICB3aGVlbCxcbiAgICAgICAgICBwcmVzZXQuZml4dHVyZUNhcGFiaWxpdHlWYWx1ZXNbaV0ucHJvZmlsZVV1aWQsXG4gICAgICAgICAgcHJvZmlsZVV1aWRcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHByZXNldC5maXh0dXJlQ2FwYWJpbGl0eVZhbHVlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRDYXBhYmlsaXR5VmFsdWUoXG4gICAgcHJlc2V0OiBQcmVzZXQsXG4gICAgY2FwYWJpbGl0eVR5cGU6IEZpeHR1cmVDYXBhYmlsaXR5VHlwZSxcbiAgICB2YWx1ZVBlcmNlbnRhZ2U6IG51bWJlcixcbiAgICBzbG90TnVtYmVyPzogbnVtYmVyLFxuICAgIGNvbG9yPzogRml4dHVyZUNhcGFiaWxpdHlDb2xvcixcbiAgICB3aGVlbD86IHN0cmluZyxcbiAgICBwcm9maWxlVXVpZD86IHN0cmluZ1xuICApIHtcbiAgICAvLyBEZWxldGUgZXhpc3RhbnQgcHJvcGVydGllcyB3aXRoIHRoaXMgdHlwZSBhbmQgc2V0IHRoZSBuZXcgdmFsdWVcbiAgICB0aGlzLmRlbGV0ZUNhcGFiaWxpdHlWYWx1ZShwcmVzZXQsIGNhcGFiaWxpdHlUeXBlLCBjb2xvciwgd2hlZWwsIHByb2ZpbGVVdWlkKTtcblxuICAgIGNvbnN0IGZpeHR1cmVDYXBhYmlsaXR5VmFsdWUgPSBuZXcgRml4dHVyZUNhcGFiaWxpdHlWYWx1ZSgpO1xuICAgIGZpeHR1cmVDYXBhYmlsaXR5VmFsdWUudHlwZSA9IGNhcGFiaWxpdHlUeXBlO1xuICAgIGZpeHR1cmVDYXBhYmlsaXR5VmFsdWUuY29sb3IgPSBjb2xvcjtcbiAgICBmaXh0dXJlQ2FwYWJpbGl0eVZhbHVlLndoZWVsID0gd2hlZWw7XG4gICAgZml4dHVyZUNhcGFiaWxpdHlWYWx1ZS52YWx1ZVBlcmNlbnRhZ2UgPSB2YWx1ZVBlcmNlbnRhZ2U7XG4gICAgZml4dHVyZUNhcGFiaWxpdHlWYWx1ZS5zbG90TnVtYmVyID0gc2xvdE51bWJlcjtcbiAgICBmaXh0dXJlQ2FwYWJpbGl0eVZhbHVlLnByb2ZpbGVVdWlkID0gcHJvZmlsZVV1aWQ7XG5cbiAgICBwcmVzZXQuZml4dHVyZUNhcGFiaWxpdHlWYWx1ZXMucHVzaChmaXh0dXJlQ2FwYWJpbGl0eVZhbHVlKTtcbiAgfVxuXG4gIGdldENhcGFiaWxpdHlWYWx1ZShcbiAgICBwcmVzZXQ6IFByZXNldCxcbiAgICBjYXBhYmlsaXR5VHlwZTogRml4dHVyZUNhcGFiaWxpdHlUeXBlLFxuICAgIGNvbG9yPzogRml4dHVyZUNhcGFiaWxpdHlDb2xvcixcbiAgICB3aGVlbD86IHN0cmluZyxcbiAgICBwcm9maWxlVXVpZD86IHN0cmluZ1xuICApOiBGaXh0dXJlQ2FwYWJpbGl0eVZhbHVlIHtcbiAgICBmb3IgKGNvbnN0IGNhcGFiaWxpdHlWYWx1ZSBvZiBwcmVzZXQuZml4dHVyZUNhcGFiaWxpdHlWYWx1ZXMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5maXh0dXJlU2VydmljZS5jYXBhYmlsaXRpZXNNYXRjaChcbiAgICAgICAgICBjYXBhYmlsaXR5VmFsdWUudHlwZSxcbiAgICAgICAgICBjYXBhYmlsaXR5VHlwZSxcbiAgICAgICAgICBjYXBhYmlsaXR5VmFsdWUuY29sb3IsXG4gICAgICAgICAgY29sb3IsXG4gICAgICAgICAgY2FwYWJpbGl0eVZhbHVlLndoZWVsLFxuICAgICAgICAgIHdoZWVsLFxuICAgICAgICAgIGNhcGFiaWxpdHlWYWx1ZS5wcm9maWxlVXVpZCxcbiAgICAgICAgICBwcm9maWxlVXVpZFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGNhcGFiaWxpdHlWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGRlbGV0ZUNoYW5uZWxWYWx1ZShjaGFubmVsTmFtZTogc3RyaW5nLCBwcm9maWxlVXVpZDogc3RyaW5nKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkUHJlc2V0LmZpeHR1cmVDaGFubmVsVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQuZml4dHVyZUNoYW5uZWxWYWx1ZXNbaV0uY2hhbm5lbE5hbWUgPT09IGNoYW5uZWxOYW1lICYmXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQuZml4dHVyZUNoYW5uZWxWYWx1ZXNbaV0ucHJvZmlsZVV1aWQgPT09IHByb2ZpbGVVdWlkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFByZXNldC5maXh0dXJlQ2hhbm5lbFZhbHVlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRDaGFubmVsVmFsdWUoY2hhbm5lbE5hbWU6IHN0cmluZywgcHJvZmlsZVV1aWQ6IHN0cmluZywgdmFsdWU6IG51bWJlcikge1xuICAgIC8vIERlbGV0ZSBleGlzdGFudCBwcm9wZXJ0aWVzIHdpdGggdGhpcyB0eXBlIGFuZCBzZXQgdGhlIG5ldyB2YWx1ZVxuICAgIHRoaXMuZGVsZXRlQ2hhbm5lbFZhbHVlKGNoYW5uZWxOYW1lLCBwcm9maWxlVXVpZCk7XG5cbiAgICBjb25zdCBmaXh0dXJlQ2hhbm5lbFZhbHVlID0gbmV3IEZpeHR1cmVDaGFubmVsVmFsdWUoKTtcbiAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLmNoYW5uZWxOYW1lID0gY2hhbm5lbE5hbWU7XG4gICAgZml4dHVyZUNoYW5uZWxWYWx1ZS5wcm9maWxlVXVpZCA9IHByb2ZpbGVVdWlkO1xuICAgIGZpeHR1cmVDaGFubmVsVmFsdWUudmFsdWUgPSB2YWx1ZTtcblxuICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQuZml4dHVyZUNoYW5uZWxWYWx1ZXMucHVzaChmaXh0dXJlQ2hhbm5lbFZhbHVlKTtcbiAgfVxuXG4gIGdldENoYW5uZWxWYWx1ZShjaGFubmVsTmFtZTogc3RyaW5nLCBwcm9maWxlVXVpZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBmb3IgKGNvbnN0IGNoYW5uZWxWYWx1ZSBvZiB0aGlzLnNlbGVjdGVkUHJlc2V0LmZpeHR1cmVDaGFubmVsVmFsdWVzKSB7XG4gICAgICBpZiAoY2hhbm5lbFZhbHVlLmNoYW5uZWxOYW1lID09PSBjaGFubmVsTmFtZSAmJiBjaGFubmVsVmFsdWUucHJvZmlsZVV1aWQgPT09IHByb2ZpbGVVdWlkKSB7XG4gICAgICAgIHJldHVybiBjaGFubmVsVmFsdWUudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0QXBwcm94aW1hdGVkQ29sb3JXaGVlbENhcGFiaWxpdHkocHJlc2V0OiBQcmVzZXQsIGNhY2hlZENoYW5uZWw6IENhY2hlZEZpeHR1cmVDaGFubmVsKTogQ2FjaGVkRml4dHVyZUNhcGFiaWxpdHkge1xuICAgIC8vIHJldHVybiBhbiBhcHByb3hpbWF0ZWQgd2hlZWwgc2xvdCBjaGFubmVsIGNhcGFiaWxpdHksIGlmIGEgY29sb3Igb3IgYSBzbG90IG9uIGEgZGlmZmVyZW50XG4gICAgLy8gd2hlZWwgaGFzIGJlZW4gc2VsZWN0ZWRcbiAgICBsZXQgY29sb3JSZWQ6IG51bWJlcjtcbiAgICBsZXQgY29sb3JHcmVlbjogbnVtYmVyO1xuICAgIGxldCBjb2xvckJsdWU6IG51bWJlcjtcbiAgICBsZXQgbG93ZXN0RGlmZiA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgbGV0IGxvd2VzdERpZmZDYXBhYmlsaXR5OiBDYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eTtcbiAgICBsZXQgY2FwYWJpbGl0eVZhbHVlOiBGaXh0dXJlQ2FwYWJpbGl0eVZhbHVlO1xuXG4gICAgY2FwYWJpbGl0eVZhbHVlID0gdGhpcy5nZXRDYXBhYmlsaXR5VmFsdWUocHJlc2V0LCBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuQ29sb3JJbnRlbnNpdHksIEZpeHR1cmVDYXBhYmlsaXR5Q29sb3IuUmVkKTtcbiAgICBpZiAoY2FwYWJpbGl0eVZhbHVlKSB7XG4gICAgICBjb2xvclJlZCA9IDI1NSAqIGNhcGFiaWxpdHlWYWx1ZS52YWx1ZVBlcmNlbnRhZ2U7XG4gICAgfVxuICAgIGNhcGFiaWxpdHlWYWx1ZSA9IHRoaXMuZ2V0Q2FwYWJpbGl0eVZhbHVlKHByZXNldCwgRml4dHVyZUNhcGFiaWxpdHlUeXBlLkNvbG9ySW50ZW5zaXR5LCBGaXh0dXJlQ2FwYWJpbGl0eUNvbG9yLkdyZWVuKTtcbiAgICBpZiAoY2FwYWJpbGl0eVZhbHVlKSB7XG4gICAgICBjb2xvckdyZWVuID0gMjU1ICogY2FwYWJpbGl0eVZhbHVlLnZhbHVlUGVyY2VudGFnZTtcbiAgICB9XG4gICAgY2FwYWJpbGl0eVZhbHVlID0gdGhpcy5nZXRDYXBhYmlsaXR5VmFsdWUocHJlc2V0LCBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuQ29sb3JJbnRlbnNpdHksIEZpeHR1cmVDYXBhYmlsaXR5Q29sb3IuQmx1ZSk7XG4gICAgaWYgKGNhcGFiaWxpdHlWYWx1ZSkge1xuICAgICAgY29sb3JCbHVlID0gMjU1ICogY2FwYWJpbGl0eVZhbHVlLnZhbHVlUGVyY2VudGFnZTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbG9yUmVkICYmICFjb2xvckdyZWVuICYmICFjb2xvckJsdWUpIHtcbiAgICAgIC8vIG5vIGNvbG9yIGZvdW5kIC0+IHNlYXJjaCB0aGUgZmlyc3QgY29sb3Igd2hlZWxcbiAgICAgIC8vIFRPRE9cbiAgICB9XG5cbiAgICBpZiAoY29sb3JSZWQgIT09IHVuZGVmaW5lZCAmJiBjb2xvckdyZWVuICE9PSB1bmRlZmluZWQgJiYgY29sb3JCbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAoY29uc3QgY2FwYWJpbGl0eSBvZiBjYWNoZWRDaGFubmVsLmNhcGFiaWxpdGllcykge1xuICAgICAgICBpZiAoY2FwYWJpbGl0eS5jYXBhYmlsaXR5LnNsb3ROdW1iZXIpIHtcbiAgICAgICAgICBjb25zdCBtaXhlZENvbG9yID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRNaXhlZFdoZWVsU2xvdENvbG9yKGNhcGFiaWxpdHkud2hlZWwsIGNhcGFiaWxpdHkuY2FwYWJpbGl0eS5zbG90TnVtYmVyKTtcbiAgICAgICAgICBpZiAobWl4ZWRDb2xvcikge1xuICAgICAgICAgICAgY29uc3QgZGlmZiA9XG4gICAgICAgICAgICAgIE1hdGguYWJzKG1peGVkQ29sb3IucmVkIC0gY29sb3JSZWQpICsgTWF0aC5hYnMobWl4ZWRDb2xvci5ncmVlbiAtIGNvbG9yR3JlZW4pICsgTWF0aC5hYnMobWl4ZWRDb2xvci5ibHVlIC0gY29sb3JCbHVlKTtcblxuICAgICAgICAgICAgaWYgKGRpZmYgPCBsb3dlc3REaWZmKSB7XG4gICAgICAgICAgICAgIGxvd2VzdERpZmYgPSBkaWZmO1xuICAgICAgICAgICAgICBsb3dlc3REaWZmQ2FwYWJpbGl0eSA9IGNhcGFiaWxpdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvd2VzdERpZmZDYXBhYmlsaXR5O1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNDYXBhYmlsaXR5VHlwZSh0eXBlOiBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUpOiBib29sZWFuIHtcbiAgICAvLyB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhbm5lbCB3aXRoIGF0IGxlYXN0IG9uZSBpbnRlbnNpdHkgY2FwYWJpbGl0eVxuICAgIGZvciAoY29uc3QgcHJvamVjdEZpeHR1cmUgb2YgdGhpcy5zZWxlY3RlZFByZXNldC5maXh0dXJlcykge1xuICAgICAgY29uc3QgZml4dHVyZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0Q2FjaGVkRml4dHVyZUJ5VXVpZChwcm9qZWN0Rml4dHVyZS5maXh0dXJlVXVpZCwgcHJvamVjdEZpeHR1cmUucGl4ZWxLZXkpO1xuICAgICAgZm9yIChjb25zdCBjaGFubmVsIG9mIGZpeHR1cmUuY2hhbm5lbHMpIHtcbiAgICAgICAgaWYgKGNoYW5uZWwuY2hhbm5lbCkge1xuICAgICAgICAgIGZvciAoY29uc3QgY2FwYWJpbGl0eSBvZiBjaGFubmVsLmNhcGFiaWxpdGllcykge1xuICAgICAgICAgICAgaWYgKGNhcGFiaWxpdHkuY2FwYWJpbGl0eS50eXBlID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBoYXNDYXBhYmlsaXR5RGltbWVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0NhcGFiaWxpdHlUeXBlKEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5JbnRlbnNpdHkpO1xuICB9XG5cbiAgaGFzQ2FwYWJpbGl0eUNvbG9yKCk6IGJvb2xlYW4ge1xuICAgIC8vIFRPRE8gb3B0aW9uYWxseSBjb2xvciB0ZW1wZXJhdHVyZSBhbmQgY29sb3Igd2hpdGUgKHNlZSBzdGFpcnZpbGxlL21oLTEwMClcblxuICAgIC8vIG9uZSBvZiB0aGUgcHJvZmlsZXMgaGFzIGEgY29sb3IgaW50ZW5zaXR5XG4gICAgaWYgKHRoaXMuaGFzQ2FwYWJpbGl0eVR5cGUoRml4dHVyZUNhcGFiaWxpdHlUeXBlLkNvbG9ySW50ZW5zaXR5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaGFzQ2FwYWJpbGl0eUNvbG9yT3JDb2xvcldoZWVsKCk6IGJvb2xlYW4ge1xuICAgIC8vIFRPRE8gb3B0aW9uYWxseSBjb2xvciB0ZW1wZXJhdHVyZSBhbmQgY29sb3Igd2hpdGUgKHNlZSBzdGFpcnZpbGxlL21oLTEwMClcblxuICAgIC8vIG9uZSBvZiB0aGUgcHJvZmlsZXMgaGFzIGEgY29sb3IgaW50ZW5zaXR5XG4gICAgaWYgKHRoaXMuaGFzQ2FwYWJpbGl0eUNvbG9yKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIGEgY29sb3Igd2hlZWwgaXMgaW52b2x2ZWRcbiAgICBmb3IgKGNvbnN0IHByb2plY3RGaXh0dXJlIG9mIHRoaXMuc2VsZWN0ZWRQcmVzZXQuZml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IGZpeHR1cmUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldENhY2hlZEZpeHR1cmVCeVV1aWQocHJvamVjdEZpeHR1cmUuZml4dHVyZVV1aWQsIHByb2plY3RGaXh0dXJlLnBpeGVsS2V5KTtcbiAgICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBmaXh0dXJlLmNoYW5uZWxzKSB7XG4gICAgICAgIGlmIChjaGFubmVsLmNvbG9yV2hlZWwpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGhhc0NhcGFiaWxpdHlQYW5UaWx0KCk6IGJvb2xlYW4ge1xuICAgIGxldCBoYXNQYW4gPSBmYWxzZTtcbiAgICBsZXQgaGFzVGlsdCA9IGZhbHNlO1xuXG4gICAgLy8gdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHBhbiBhbmQgb25lIHRpbHQgY2hhbm5lbFxuICAgIGlmICh0aGlzLmhhc0NhcGFiaWxpdHlUeXBlKEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5QYW4pKSB7XG4gICAgICBoYXNQYW4gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0NhcGFiaWxpdHlUeXBlKEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5UaWx0KSkge1xuICAgICAgaGFzVGlsdCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGhhc1BhbiAmJiBoYXNUaWx0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzZWxlY3RQcmVzZXQoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuZWZmZWN0U2VydmljZS5zZWxlY3RlZEVmZmVjdCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldHNbaW5kZXhdO1xuICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zZWxlY3RlZFByZXNldFV1aWQgPSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QucHJlc2V0c1tpbmRleF0udXVpZDtcbiAgICB0aGlzLmF1dG9PcGVuRmlyc3RFZmZlY3QoKTtcbiAgICB0aGlzLnByZXZpZXdTZWxlY3Rpb25DaGFuZ2VkLm5leHQoKTtcbiAgICB0aGlzLnByZXZpZXdMaXZlKCk7XG4gIH1cblxuICBhdXRvT3BlbkZpcnN0RWZmZWN0KCkge1xuICAgIC8vIG9wZW4gdGhlIGZpcnN0IGVmZmVjdCwgaWYgdGhlIHByZXNldCBvbmx5IGhhcyBvbmVcbiAgICBpZiAodGhpcy5zZWxlY3RlZFByZXNldCAmJiB0aGlzLnNlbGVjdGVkUHJlc2V0LmVmZmVjdHMubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLmVmZmVjdFNlcnZpY2Uuc2VsZWN0ZWRFZmZlY3QgPSB0aGlzLnNlbGVjdGVkUHJlc2V0LmVmZmVjdHNbMF07XG4gICAgfVxuICB9XG5cbiAgYWRkUHJlc2V0KG5hbWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBwcmVzZXQ6IFByZXNldCA9IG5ldyBQcmVzZXQoKTtcbiAgICBwcmVzZXQudXVpZCA9IHRoaXMudXVpZFNlcnZpY2UuZ2V0VXVpZCgpO1xuICAgIHByZXNldC5uYW1lID0gbmFtZSB8fCAnTmV3IFByZXNldCc7XG5cbiAgICAvLyBJbnNlcnQgdGhlIG5ldyBwcmVzZXQgYmVmb3JlIHRoZSBoaWdoZXN0IGN1cnJlbnRseSBzZWxlY3RlZCBwcmVzZXRcbiAgICBsZXQgaGlnaGVzdFNlbGVjdGVkUHJlc2V0SW5kZXggPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QucHJlc2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRQcmVzZXQgPT09IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRzW2ldKSB7XG4gICAgICAgIGhpZ2hlc3RTZWxlY3RlZFByZXNldEluZGV4ID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldHMuc3BsaWNlKGhpZ2hlc3RTZWxlY3RlZFByZXNldEluZGV4LCAwLCBwcmVzZXQpO1xuICAgIHRoaXMuc2VsZWN0UHJlc2V0KGhpZ2hlc3RTZWxlY3RlZFByZXNldEluZGV4KTtcbiAgfVxuXG4gIC8vIHJldHVybiBhbGwgZml4dHVyZSBwcm9maWxlcyB1c2VkIGluIHRoZSBjdXJyZW50IHByZXNldCBzZWxlY3Rpb25cbiAgZ2V0U2VsZWN0ZWRQcm9maWxlcygpIHtcbiAgICBjb25zdCBwcm9maWxlczogRml4dHVyZVByb2ZpbGVbXSA9IFtdO1xuXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUHJlc2V0KSB7XG4gICAgICByZXR1cm4gcHJvZmlsZXM7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcmVzZXRGaXh0dXJlIG9mIHRoaXMuc2VsZWN0ZWRQcmVzZXQuZml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IGZpeHR1cmUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldEZpeHR1cmVCeVV1aWQocHJlc2V0Rml4dHVyZS5maXh0dXJlVXVpZCk7XG4gICAgICBjb25zdCBwcm9maWxlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpO1xuXG4gICAgICBpZiAocHJvZmlsZXMuaW5kZXhPZihwcm9maWxlKSA8IDApIHtcbiAgICAgICAgcHJvZmlsZXMucHVzaChwcm9maWxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJvZmlsZXM7XG4gIH1cblxuICAvLyBnaXZlbiBhIGxpc3Qgb2YgZml4dHVyZSBwcm9maWxlcywgcmV0dXJuIGFsbCBhdmFpbGFibGUgY2hhbm5lbHMgYmFzZWQgb24gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBmaXh0dXJlcyBpbiB0aGUgcHJlc2V0XG4gIGdldFNlbGVjdGVkUHJvZmlsZUNoYW5uZWxzKHNlbGVjdGVkUHJvZmlsZXM6IEZpeHR1cmVQcm9maWxlW10pIHtcbiAgICBjb25zdCBjYWxjdWxhdGVkUHJvZmlsZU1vZGVzID0gbmV3IE1hcDxGaXh0dXJlUHJvZmlsZSwgYW55W10+KCk7XG4gICAgY29uc3QgYXZhaWxhYmxlQ2hhbm5lbHM6IE1hcDxGaXh0dXJlUHJvZmlsZSwgQ2FjaGVkRml4dHVyZUNoYW5uZWxbXT4gPSBuZXcgTWFwPEZpeHR1cmVQcm9maWxlLCBDYWNoZWRGaXh0dXJlQ2hhbm5lbFtdPigpO1xuXG4gICAgLy8gY2FsY3VsYXRlIGFsbCBtb2RlcyBmb3IgZWFjaCBwcm9maWxlXG4gICAgZm9yIChjb25zdCBwcm9maWxlIG9mIHNlbGVjdGVkUHJvZmlsZXMpIHtcbiAgICAgIGNvbnN0IG1vZGVBbmRQaXhlbEtleXM6IGFueVtdID0gW107XG5cbiAgICAgIC8vIGxvb3Agb3ZlciB0aGUgcHJvamVjdCBmaXh0dXJlcyB0byBrZWVwIHRoZSBvcmRlclxuICAgICAgZm9yIChsZXQgcHJvamVjdEZpeHR1cmUgb2YgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldEZpeHR1cmVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJlc2V0Rml4dHVyZSBvZiB0aGlzLnNlbGVjdGVkUHJlc2V0LmZpeHR1cmVzKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcHJvamVjdEZpeHR1cmUuZml4dHVyZVV1aWQgPT09IHByZXNldEZpeHR1cmUuZml4dHVyZVV1aWQgJiZcbiAgICAgICAgICAgICgoIXByb2plY3RGaXh0dXJlLnBpeGVsS2V5ICYmICFwcmVzZXRGaXh0dXJlLnBpeGVsS2V5KSB8fCBwcm9qZWN0Rml4dHVyZS5waXhlbEtleSA9PT0gcHJlc2V0Rml4dHVyZS5waXhlbEtleSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IGZpeHR1cmUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldENhY2hlZEZpeHR1cmVCeVV1aWQocHJlc2V0Rml4dHVyZS5maXh0dXJlVXVpZCwgcHJlc2V0Rml4dHVyZS5waXhlbEtleSk7XG4gICAgICAgICAgICBpZiAoZml4dHVyZS5wcm9maWxlLnV1aWQgPT09IHByb2ZpbGUudXVpZCkge1xuICAgICAgICAgICAgICBjb25zdCBleGlzdHMgPSBtb2RlQW5kUGl4ZWxLZXlzLnNvbWUoXG4gICAgICAgICAgICAgICAgKGl0ZW0pID0+IChpdGVtLm1vZGUgPT09IGZpeHR1cmUubW9kZSAmJiAhaXRlbS5waXhlbEtleSAmJiAhZml4dHVyZS5waXhlbEtleSkgfHwgaXRlbS5waXhlbEtleSA9PT0gZml4dHVyZS5waXhlbEtleVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgICAgICAgIG1vZGVBbmRQaXhlbEtleXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBtb2RlOiBmaXh0dXJlLm1vZGUsXG4gICAgICAgICAgICAgICAgICBwaXhlbEtleTogcHJlc2V0Rml4dHVyZS5waXhlbEtleSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGN1bGF0ZWRQcm9maWxlTW9kZXMuc2V0KHByb2ZpbGUsIG1vZGVBbmRQaXhlbEtleXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNhbGN1bGF0ZSBhbGwgY2hhbm5lbHMgZnJvbSB0aGUgbW9kZXNcbiAgICBjYWxjdWxhdGVkUHJvZmlsZU1vZGVzLmZvckVhY2goKG1vZGVBbmRQaXhlbEtleXM6IGFueVtdLCBwcm9maWxlOiBGaXh0dXJlUHJvZmlsZSkgPT4ge1xuICAgICAgY29uc3QgcHJvZmlsZUNoYW5uZWxzOiBDYWNoZWRGaXh0dXJlQ2hhbm5lbFtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IG1vZGVBbmRQaXhlbEtleSBvZiBtb2RlQW5kUGl4ZWxLZXlzKSB7XG4gICAgICAgIGNvbnN0IGNoYW5uZWxzID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRDYWNoZWRDaGFubmVscyhwcm9maWxlLCBtb2RlQW5kUGl4ZWxLZXkubW9kZSwgbW9kZUFuZFBpeGVsS2V5LnBpeGVsS2V5KTtcbiAgICAgICAgZm9yIChjb25zdCBjaGFubmVsIG9mIGNoYW5uZWxzKSB7XG4gICAgICAgICAgLy8gb25seSBhZGQgdGhlIGNoYW5uZWwsIGlmIG5vIGNoYW5uZWwgd2l0aCB0aGUgc2FtZSBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWRcbiAgICAgICAgICAvLyAoZS5nLiBhIGZpbmUgY2hhbm5lbClcbiAgICAgICAgICBpZiAoY2hhbm5lbC5jaGFubmVsICYmICFwcm9maWxlQ2hhbm5lbHMuZmluZCgoYykgPT4gYy5uYW1lID09PSBjaGFubmVsLm5hbWUpKSB7XG4gICAgICAgICAgICBwcm9maWxlQ2hhbm5lbHMucHVzaChjaGFubmVsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF2YWlsYWJsZUNoYW5uZWxzLnNldChwcm9maWxlLCBwcm9maWxlQ2hhbm5lbHMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGF2YWlsYWJsZUNoYW5uZWxzO1xuICB9XG5cbiAgcHJldmlld0xpdmUoY29tcG9zaXRpb25OYW1lOiBzdHJpbmcgPSAnJywgcG9zaXRpb25NaWxsaXM/OiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnU2VydmljZS5saXZlUHJldmlldykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNvbGxlY3QgYWxsIGNoYW5nZXMgYW5kIGRlbGF5IHRoZW0gdG8gbm90IGZsb29kIHRoZSBiYWNrZW5kXG4gICAgLy8gKGV4Y2VwdCBwbGF5IGV2ZW50cy4gdGhleSBuZWVkIHRvIGJlIGRlbGl2ZXJlZCBhbHdheXMpXG4gICAgaWYgKHRoaXMubGl2ZVByZXZpZXdUaW1lciAmJiAhY29tcG9zaXRpb25OYW1lKSB7XG4gICAgICB0aGlzLmxpdmVDaGFuZ2VQZW5kaW5nID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcG9zaXRpb24gPSBwb3NpdGlvbk1pbGxpcztcblxuICAgIGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwb3NpdGlvbiA9IE1hdGgucm91bmQodGhpcy5hbmltYXRpb25TZXJ2aWNlLnRpbWVNaWxsaXMpO1xuICAgIH1cblxuICAgIHRoaXMuaHR0cFxuICAgICAgLnBvc3QoJ3ByZXZpZXc/cG9zaXRpb25NaWxsaXM9JyArIHBvc2l0aW9uICsgJyZjb21wb3NpdGlvbk5hbWU9JyArIGNvbXBvc2l0aW9uTmFtZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0KSlcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIHRoaXMubGl2ZUNoYW5nZVBlbmRpbmcgPSBmYWxzZTtcblxuICAgIGlmICghY29tcG9zaXRpb25OYW1lKSB7XG4gICAgICB0aGlzLmxpdmVQcmV2aWV3VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5saXZlUHJldmlld1RpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5saXZlQ2hhbmdlUGVuZGluZykge1xuICAgICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgICAgLnBvc3QoJ3ByZXZpZXc/cG9zaXRpb25NaWxsaXM9JyArIHBvc2l0aW9uICsgJyZjb21wb3NpdGlvbk5hbWU9JyArIGNvbXBvc2l0aW9uTmFtZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0KSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgfSwgNTApO1xuICAgIH1cbiAgfVxuXG4gIHN0b3BQcmV2aWV3UGxheSgpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnU2VydmljZS5saXZlUHJldmlldykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaHR0cC5wb3N0KCdzdG9wLXByZXZpZXctcGxheScsIG51bGwpLnN1YnNjcmliZSgpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Observable, of } from 'rxjs';
|
|
3
|
+
import { map } from 'rxjs/operators';
|
|
4
|
+
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class PreviewMeshService {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.loader = new GLTFLoader();
|
|
9
|
+
this.cachedMeshes = new Map();
|
|
10
|
+
// the observable, if the requested mesh is already being loaded currently
|
|
11
|
+
this.cachedObservables = new Map();
|
|
12
|
+
}
|
|
13
|
+
loadScene(name) {
|
|
14
|
+
return new Observable((observer) => {
|
|
15
|
+
this.loader.load('./assets/designer/models/' + name + '.gltf',
|
|
16
|
+
// Called when the resource is loaded
|
|
17
|
+
(gltf) => {
|
|
18
|
+
const model = gltf.scene.children[0];
|
|
19
|
+
model.position.set(0, 0, 0);
|
|
20
|
+
observer.next(gltf.scene);
|
|
21
|
+
observer.complete();
|
|
22
|
+
},
|
|
23
|
+
// Called while loading is progressing
|
|
24
|
+
(xhr) => { },
|
|
25
|
+
// Called when loading has errors
|
|
26
|
+
(error) => {
|
|
27
|
+
observer.error(error);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
loadMesh(name) {
|
|
32
|
+
const observable = this.loadScene(name).pipe(map((scene) => {
|
|
33
|
+
const model = scene.children[0];
|
|
34
|
+
model.position.set(0, 0, 0);
|
|
35
|
+
this.cachedMeshes.set(name, model);
|
|
36
|
+
this.cachedObservables.delete(name);
|
|
37
|
+
return model.clone();
|
|
38
|
+
}));
|
|
39
|
+
this.cachedObservables.set(name, observable);
|
|
40
|
+
return observable;
|
|
41
|
+
}
|
|
42
|
+
getMesh(name) {
|
|
43
|
+
if (this.cachedMeshes.get(name)) {
|
|
44
|
+
return of(this.cachedMeshes.get(name).clone());
|
|
45
|
+
}
|
|
46
|
+
return this.cachedObservables.get(name) || this.loadMesh(name);
|
|
47
|
+
}
|
|
48
|
+
static { this.ɵfac = function PreviewMeshService_Factory(t) { return new (t || PreviewMeshService)(); }; }
|
|
49
|
+
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PreviewMeshService, factory: PreviewMeshService.ɵfac, providedIn: 'root' }); }
|
|
50
|
+
}
|
|
51
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PreviewMeshService, [{
|
|
52
|
+
type: Injectable,
|
|
53
|
+
args: [{
|
|
54
|
+
providedIn: 'root',
|
|
55
|
+
}]
|
|
56
|
+
}], () => [], null); })();
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy1tZXNoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL3NlcnZpY2VzL3ByZXZpZXctbWVzaC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQzs7QUFLbkUsTUFBTSxPQUFPLGtCQUFrQjtJQU83QjtRQU5RLFdBQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQzFCLGlCQUFZLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7UUFFckQsMEVBQTBFO1FBQ2xFLHNCQUFpQixHQUFHLElBQUksR0FBRyxFQUFrQyxDQUFDO0lBRXZELENBQUM7SUFFUixTQUFTLENBQUMsSUFBWTtRQUM1QixPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2QsMkJBQTJCLEdBQUcsSUFBSSxHQUFHLE9BQU87WUFFNUMscUNBQXFDO1lBQ3JDLENBQUMsSUFBUyxFQUFFLEVBQUU7Z0JBQ1osTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRXJDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBRTVCLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQixRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEIsQ0FBQztZQUVELHNDQUFzQztZQUN0QyxDQUFDLEdBQVEsRUFBRSxFQUFFLEdBQUUsQ0FBQztZQUVoQixpQ0FBaUM7WUFDakMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtnQkFDYixRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hCLENBQUMsQ0FDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sUUFBUSxDQUFDLElBQVk7UUFDM0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQzFDLEdBQUcsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ2pCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFaEMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUU1QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVwQyxPQUFPLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRUYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFN0MsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFZO1FBQ2xCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRSxDQUFDO21GQTVEVSxrQkFBa0I7dUVBQWxCLGtCQUFrQixXQUFsQixrQkFBa0IsbUJBRmpCLE1BQU07O2lGQUVQLGtCQUFrQjtjQUg5QixVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgR0xURkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0dMVEZMb2FkZXInO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUHJldmlld01lc2hTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBsb2FkZXIgPSBuZXcgR0xURkxvYWRlcigpO1xuICBwcml2YXRlIGNhY2hlZE1lc2hlcyA9IG5ldyBNYXA8c3RyaW5nLCBUSFJFRS5NZXNoPigpO1xuXG4gIC8vIHRoZSBvYnNlcnZhYmxlLCBpZiB0aGUgcmVxdWVzdGVkIG1lc2ggaXMgYWxyZWFkeSBiZWluZyBsb2FkZWQgY3VycmVudGx5XG4gIHByaXZhdGUgY2FjaGVkT2JzZXJ2YWJsZXMgPSBuZXcgTWFwPHN0cmluZywgT2JzZXJ2YWJsZTxUSFJFRS5NZXNoPj4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgcHJpdmF0ZSBsb2FkU2NlbmUobmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxUSFJFRS5TY2VuZT4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHtcbiAgICAgIHRoaXMubG9hZGVyLmxvYWQoXG4gICAgICAgICcuL2Fzc2V0cy9kZXNpZ25lci9tb2RlbHMvJyArIG5hbWUgKyAnLmdsdGYnLFxuXG4gICAgICAgIC8vIENhbGxlZCB3aGVuIHRoZSByZXNvdXJjZSBpcyBsb2FkZWRcbiAgICAgICAgKGdsdGY6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG1vZGVsID0gZ2x0Zi5zY2VuZS5jaGlsZHJlblswXTtcblxuICAgICAgICAgIG1vZGVsLnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcblxuICAgICAgICAgIG9ic2VydmVyLm5leHQoZ2x0Zi5zY2VuZSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBDYWxsZWQgd2hpbGUgbG9hZGluZyBpcyBwcm9ncmVzc2luZ1xuICAgICAgICAoeGhyOiBhbnkpID0+IHt9LFxuXG4gICAgICAgIC8vIENhbGxlZCB3aGVuIGxvYWRpbmcgaGFzIGVycm9yc1xuICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZE1lc2gobmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxUSFJFRS5NZXNoPiB7XG4gICAgY29uc3Qgb2JzZXJ2YWJsZSA9IHRoaXMubG9hZFNjZW5lKG5hbWUpLnBpcGUoXG4gICAgICBtYXAoKHNjZW5lOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBzY2VuZS5jaGlsZHJlblswXTtcblxuICAgICAgICBtb2RlbC5wb3NpdGlvbi5zZXQoMCwgMCwgMCk7XG5cbiAgICAgICAgdGhpcy5jYWNoZWRNZXNoZXMuc2V0KG5hbWUsIG1vZGVsKTtcbiAgICAgICAgdGhpcy5jYWNoZWRPYnNlcnZhYmxlcy5kZWxldGUobmFtZSk7XG5cbiAgICAgICAgcmV0dXJuIG1vZGVsLmNsb25lKCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmNhY2hlZE9ic2VydmFibGVzLnNldChuYW1lLCBvYnNlcnZhYmxlKTtcblxuICAgIHJldHVybiBvYnNlcnZhYmxlO1xuICB9XG5cbiAgZ2V0TWVzaChuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFRIUkVFLk1lc2g+IHtcbiAgICBpZiAodGhpcy5jYWNoZWRNZXNoZXMuZ2V0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5jYWNoZWRNZXNoZXMuZ2V0KG5hbWUpLmNsb25lKCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNhY2hlZE9ic2VydmFibGVzLmdldChuYW1lKSB8fCB0aGlzLmxvYWRNZXNoKG5hbWUpO1xuICB9XG59XG4iXX0=
|