@rocketshow/designer 1.40.0 → 1.42.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.
Files changed (191) hide show
  1. package/fesm2022/rocketshow-designer.mjs +1076 -1058
  2. package/fesm2022/rocketshow-designer.mjs.map +1 -1
  3. package/index.d.ts +1658 -5
  4. package/package.json +2 -4
  5. package/rocketshow-designer-1.42.0.tgz +0 -0
  6. package/esm2022/lib/array-sort-pipe.mjs +0 -30
  7. package/esm2022/lib/designer.component.mjs +0 -672
  8. package/esm2022/lib/designer.module.mjs +0 -186
  9. package/esm2022/lib/designer.service.mjs +0 -14
  10. package/esm2022/lib/dropzone/dropzone.component.mjs +0 -93
  11. package/esm2022/lib/effect/effect-curve/effect-curve.component.mjs +0 -577
  12. package/esm2022/lib/effect/effect-pan-tilt/effect-pan-tilt.component.mjs +0 -36
  13. package/esm2022/lib/effect/effect.component.mjs +0 -174
  14. package/esm2022/lib/error-dialog/error-dialog.component.mjs +0 -75
  15. package/esm2022/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.mjs +0 -370
  16. package/esm2022/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.mjs +0 -147
  17. package/esm2022/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.mjs +0 -213
  18. package/esm2022/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.mjs +0 -78
  19. package/esm2022/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.mjs +0 -119
  20. package/esm2022/lib/fixture/fixture-capability/fixture-capability.component.mjs +0 -191
  21. package/esm2022/lib/fixture/fixture-channel/fixture-channel.component.mjs +0 -162
  22. package/esm2022/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.mjs +0 -365
  23. package/esm2022/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.mjs +0 -151
  24. package/esm2022/lib/fixture/fixture-settings/fixture-settings.component.mjs +0 -46
  25. package/esm2022/lib/fixture/fixture.component.mjs +0 -148
  26. package/esm2022/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.mjs +0 -145
  27. package/esm2022/lib/fixture-pool/fixture-pool.component.mjs +0 -641
  28. package/esm2022/lib/intro/intro.component.mjs +0 -95
  29. package/esm2022/lib/master-dimmer/master-dimmer.component.mjs +0 -66
  30. package/esm2022/lib/models/cached-fixture-capability.mjs +0 -9
  31. package/esm2022/lib/models/cached-fixture-channel.mjs +0 -7
  32. package/esm2022/lib/models/cached-fixture.mjs +0 -6
  33. package/esm2022/lib/models/color.mjs +0 -8
  34. package/esm2022/lib/models/composition.mjs +0 -46
  35. package/esm2022/lib/models/effect-curve-profile-channel.mjs +0 -15
  36. package/esm2022/lib/models/effect-curve.mjs +0 -69
  37. package/esm2022/lib/models/effect-pan-tilt.mjs +0 -19
  38. package/esm2022/lib/models/effect.mjs +0 -12
  39. package/esm2022/lib/models/fixture-capability-value.mjs +0 -15
  40. package/esm2022/lib/models/fixture-capability.mjs +0 -127
  41. package/esm2022/lib/models/fixture-channel-value.mjs +0 -11
  42. package/esm2022/lib/models/fixture-channel.mjs +0 -24
  43. package/esm2022/lib/models/fixture-matrix-pixel-group-constraints.mjs +0 -27
  44. package/esm2022/lib/models/fixture-matrix-pixel-group.mjs +0 -12
  45. package/esm2022/lib/models/fixture-matrix.mjs +0 -25
  46. package/esm2022/lib/models/fixture-mode-channel.mjs +0 -26
  47. package/esm2022/lib/models/fixture-mode.mjs +0 -17
  48. package/esm2022/lib/models/fixture-physical.mjs +0 -14
  49. package/esm2022/lib/models/fixture-profile.mjs +0 -85
  50. package/esm2022/lib/models/fixture-wheel-slot.mjs +0 -26
  51. package/esm2022/lib/models/fixture-wheel.mjs +0 -15
  52. package/esm2022/lib/models/fixture.mjs +0 -40
  53. package/esm2022/lib/models/preset-fixture.mjs +0 -10
  54. package/esm2022/lib/models/preset-region-scene.mjs +0 -8
  55. package/esm2022/lib/models/preset.mjs +0 -65
  56. package/esm2022/lib/models/project.mjs +0 -78
  57. package/esm2022/lib/models/scene-playback-region.mjs +0 -11
  58. package/esm2022/lib/models/scene.mjs +0 -27
  59. package/esm2022/lib/preset/preset-settings/preset-settings.component.mjs +0 -194
  60. package/esm2022/lib/preset/preset.component.mjs +0 -131
  61. package/esm2022/lib/preview/models/color-changer-3d.mjs +0 -52
  62. package/esm2022/lib/preview/models/fixture-3d.mjs +0 -260
  63. package/esm2022/lib/preview/models/moving-head-3d.mjs +0 -115
  64. package/esm2022/lib/preview/preview.component.mjs +0 -216
  65. package/esm2022/lib/project/project-browser/project-browser.component.mjs +0 -143
  66. package/esm2022/lib/project/project-import/project-import.component.mjs +0 -107
  67. package/esm2022/lib/project/project-save/project-save.component.mjs +0 -178
  68. package/esm2022/lib/project/project-share/project-share.component.mjs +0 -71
  69. package/esm2022/lib/scene/scene-settings/scene-settings.component.mjs +0 -146
  70. package/esm2022/lib/scene/scene.component.mjs +0 -110
  71. package/esm2022/lib/services/animation.service.mjs +0 -16
  72. package/esm2022/lib/services/config.service.mjs +0 -28
  73. package/esm2022/lib/services/effect.service.mjs +0 -14
  74. package/esm2022/lib/services/error-dialog.service.mjs +0 -39
  75. package/esm2022/lib/services/fixture-pool.service.mjs +0 -30
  76. package/esm2022/lib/services/fixture.service.mjs +0 -699
  77. package/esm2022/lib/services/hotkey-target-exclude.service.mjs +0 -24
  78. package/esm2022/lib/services/intro.service.mjs +0 -140
  79. package/esm2022/lib/services/preset.service.mjs +0 -450
  80. package/esm2022/lib/services/preview-mesh.service.mjs +0 -57
  81. package/esm2022/lib/services/preview.service.mjs +0 -481
  82. package/esm2022/lib/services/project-load.service.mjs +0 -206
  83. package/esm2022/lib/services/project.service.mjs +0 -93
  84. package/esm2022/lib/services/scene.service.mjs +0 -164
  85. package/esm2022/lib/services/timeline.service.mjs +0 -726
  86. package/esm2022/lib/services/user-ensure-login.service.mjs +0 -38
  87. package/esm2022/lib/services/user.service.mjs +0 -89
  88. package/esm2022/lib/services/uuid.service.mjs +0 -23
  89. package/esm2022/lib/services/warning-dialog.service.mjs +0 -38
  90. package/esm2022/lib/timeline/composition-settings/composition-settings.component.mjs +0 -304
  91. package/esm2022/lib/timeline/timeline-grid/timeline-grid.component.mjs +0 -216
  92. package/esm2022/lib/timeline/timeline.component.mjs +0 -418
  93. package/esm2022/lib/user/user-login/user-login.component.mjs +0 -144
  94. package/esm2022/lib/user/user-register/user-register.component.mjs +0 -220
  95. package/esm2022/lib/wait-dialog/wait-dialog.component.mjs +0 -26
  96. package/esm2022/lib/warning-dialog/warning-dialog.component.mjs +0 -68
  97. package/esm2022/public_api.mjs +0 -7
  98. package/esm2022/rocketshow-designer.mjs +0 -5
  99. package/lib/array-sort-pipe.d.ts +0 -7
  100. package/lib/designer.component.d.ts +0 -73
  101. package/lib/designer.module.d.ts +0 -57
  102. package/lib/designer.service.d.ts +0 -6
  103. package/lib/dropzone/dropzone.component.d.ts +0 -24
  104. package/lib/effect/effect-curve/effect-curve.component.d.ts +0 -59
  105. package/lib/effect/effect-pan-tilt/effect-pan-tilt.component.d.ts +0 -15
  106. package/lib/effect/effect.component.d.ts +0 -22
  107. package/lib/error-dialog/error-dialog.component.d.ts +0 -17
  108. package/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.d.ts +0 -41
  109. package/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.d.ts +0 -26
  110. package/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.d.ts +0 -34
  111. package/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.d.ts +0 -15
  112. package/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.d.ts +0 -18
  113. package/lib/fixture/fixture-capability/fixture-capability.component.d.ts +0 -31
  114. package/lib/fixture/fixture-channel/fixture-channel.component.d.ts +0 -25
  115. package/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.d.ts +0 -32
  116. package/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.d.ts +0 -14
  117. package/lib/fixture/fixture-settings/fixture-settings.component.d.ts +0 -14
  118. package/lib/fixture/fixture.component.d.ts +0 -25
  119. package/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.d.ts +0 -28
  120. package/lib/fixture-pool/fixture-pool.component.d.ts +0 -62
  121. package/lib/intro/intro.component.d.ts +0 -11
  122. package/lib/master-dimmer/master-dimmer.component.d.ts +0 -15
  123. package/lib/models/cached-fixture-capability.d.ts +0 -11
  124. package/lib/models/cached-fixture-channel.d.ts +0 -11
  125. package/lib/models/cached-fixture.d.ts +0 -11
  126. package/lib/models/color.d.ts +0 -6
  127. package/lib/models/composition.d.ts +0 -19
  128. package/lib/models/effect-curve-profile-channel.d.ts +0 -5
  129. package/lib/models/effect-curve.d.ts +0 -15
  130. package/lib/models/effect-pan-tilt.d.ts +0 -6
  131. package/lib/models/effect.d.ts +0 -6
  132. package/lib/models/fixture-capability-value.d.ts +0 -10
  133. package/lib/models/fixture-capability.d.ts +0 -117
  134. package/lib/models/fixture-channel-value.d.ts +0 -6
  135. package/lib/models/fixture-channel.d.ts +0 -9
  136. package/lib/models/fixture-matrix-pixel-group-constraints.d.ts +0 -8
  137. package/lib/models/fixture-matrix-pixel-group.d.ts +0 -6
  138. package/lib/models/fixture-matrix.d.ts +0 -6
  139. package/lib/models/fixture-mode-channel.d.ts +0 -8
  140. package/lib/models/fixture-mode.d.ts +0 -8
  141. package/lib/models/fixture-physical.d.ts +0 -4
  142. package/lib/models/fixture-profile.d.ts +0 -39
  143. package/lib/models/fixture-wheel-slot.d.ts +0 -17
  144. package/lib/models/fixture-wheel.d.ts +0 -5
  145. package/lib/models/fixture.d.ts +0 -23
  146. package/lib/models/preset-fixture.d.ts +0 -5
  147. package/lib/models/preset-region-scene.d.ts +0 -9
  148. package/lib/models/preset.d.ts +0 -20
  149. package/lib/models/project.d.ts +0 -31
  150. package/lib/models/scene-playback-region.d.ts +0 -6
  151. package/lib/models/scene.d.ts +0 -11
  152. package/lib/preset/preset-settings/preset-settings.component.d.ts +0 -22
  153. package/lib/preset/preset.component.d.ts +0 -25
  154. package/lib/preview/models/color-changer-3d.d.ts +0 -16
  155. package/lib/preview/models/fixture-3d.d.ts +0 -38
  156. package/lib/preview/models/moving-head-3d.d.ts +0 -23
  157. package/lib/preview/preview.component.d.ts +0 -38
  158. package/lib/project/project-browser/project-browser.component.d.ts +0 -27
  159. package/lib/project/project-import/project-import.component.d.ts +0 -23
  160. package/lib/project/project-save/project-save.component.d.ts +0 -28
  161. package/lib/project/project-share/project-share.component.d.ts +0 -16
  162. package/lib/scene/scene-settings/scene-settings.component.d.ts +0 -20
  163. package/lib/scene/scene.component.d.ts +0 -22
  164. package/lib/services/animation.service.d.ts +0 -7
  165. package/lib/services/config.service.d.ts +0 -20
  166. package/lib/services/effect.service.d.ts +0 -8
  167. package/lib/services/error-dialog.service.d.ts +0 -12
  168. package/lib/services/fixture-pool.service.d.ts +0 -10
  169. package/lib/services/fixture.service.d.ts +0 -70
  170. package/lib/services/hotkey-target-exclude.service.d.ts +0 -7
  171. package/lib/services/intro.service.d.ts +0 -21
  172. package/lib/services/preset.service.d.ts +0 -64
  173. package/lib/services/preview-mesh.service.d.ts +0 -14
  174. package/lib/services/preview.service.d.ts +0 -42
  175. package/lib/services/project-load.service.d.ts +0 -36
  176. package/lib/services/project.service.d.ts +0 -26
  177. package/lib/services/scene.service.d.ts +0 -30
  178. package/lib/services/timeline.service.d.ts +0 -70
  179. package/lib/services/user-ensure-login.service.d.ts +0 -14
  180. package/lib/services/user.service.d.ts +0 -22
  181. package/lib/services/uuid.service.d.ts +0 -7
  182. package/lib/services/warning-dialog.service.d.ts +0 -12
  183. package/lib/timeline/composition-settings/composition-settings.component.d.ts +0 -48
  184. package/lib/timeline/timeline-grid/timeline-grid.component.d.ts +0 -22
  185. package/lib/timeline/timeline.component.d.ts +0 -50
  186. package/lib/user/user-login/user-login.component.d.ts +0 -21
  187. package/lib/user/user-register/user-register.component.d.ts +0 -26
  188. package/lib/wait-dialog/wait-dialog.component.d.ts +0 -8
  189. package/lib/warning-dialog/warning-dialog.component.d.ts +0 -16
  190. package/public_api.d.ts +0 -3
  191. package/rocketshow-designer-1.40.0.tgz +0 -0
@@ -1,260 +0,0 @@
1
- import * as THREE from 'three';
2
- import { Positioning } from '../../models/fixture';
3
- import { FixtureCapabilityColor, FixtureCapabilityType } from '../../models/fixture-capability';
4
- export class Fixture3d {
5
- constructor(fixtureService, previewService, fixture, scene, hasSpotLight = false) {
6
- this.fixtureService = fixtureService;
7
- this.previewService = previewService;
8
- this.pointLightMaxIntensity = 2;
9
- this.spotLightLightMaxIntensity = 10;
10
- this.fixtureHasDimmer = false;
11
- this.fixtureHasColorWheel = false;
12
- this.fixtureHasColor = false;
13
- this.dimmer = 0;
14
- this.isSelected = false;
15
- this.isLoaded = false;
16
- this.hasSpotLight = false;
17
- this.fixture = fixture;
18
- this.scene = scene;
19
- this.hasSpotLight = hasSpotLight;
20
- // evaluate, various capabilities of this fixture
21
- for (const cachedChannel of this.fixture.channels) {
22
- if (cachedChannel.channel) {
23
- for (const capability of cachedChannel.capabilities) {
24
- switch (capability.capability.type) {
25
- case FixtureCapabilityType.Intensity:
26
- this.fixtureHasDimmer = true;
27
- break;
28
- case FixtureCapabilityType.ColorIntensity:
29
- this.fixtureHasColor = true;
30
- break;
31
- }
32
- }
33
- if (cachedChannel.colorWheel) {
34
- this.fixtureHasColorWheel = true;
35
- }
36
- }
37
- }
38
- }
39
- createSpotlightMaterial() {
40
- const vertexShader = `
41
- varying vec3 vNormal;
42
- varying vec3 vWorldPosition;
43
-
44
- void main(){
45
- vNormal = normalize(normalMatrix * normal);
46
-
47
- vec4 worldPosition = modelMatrix * vec4(position, 1.0);
48
- vWorldPosition = worldPosition.xyz;
49
-
50
- gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
51
- }`;
52
- const fragmentShader = `
53
- varying vec3 vNormal;
54
- varying vec3 vWorldPosition;
55
-
56
- uniform vec3 lightColor;
57
- uniform float opacity;
58
- uniform vec3 spotPosition;
59
- uniform float attenuation;
60
- uniform float anglePower;
61
-
62
- void main(){
63
- float intensity;
64
-
65
- intensity = distance(vWorldPosition, spotPosition) / attenuation;
66
- intensity = 1.0 - clamp(intensity, 0.0, 1.0);
67
-
68
- vec3 normal = vec3(vNormal.x, vNormal.y, abs(vNormal.z));
69
- float angleIntensity = pow(dot(normal, vec3(0.0, 0.0, 1.0)), anglePower);
70
- intensity = intensity * angleIntensity * opacity;
71
-
72
- gl_FragColor = vec4(lightColor, intensity);
73
- }`;
74
- this.spotlightMaterial = new THREE.ShaderMaterial({
75
- uniforms: {
76
- attenuation: {
77
- type: 'f',
78
- value: 800.0,
79
- },
80
- anglePower: {
81
- type: 'f',
82
- value: 2,
83
- },
84
- spotPosition: {
85
- type: 'v3',
86
- value: new THREE.Vector3(0, 0, 0),
87
- },
88
- lightColor: {
89
- type: 'c',
90
- value: new THREE.Color('white'),
91
- },
92
- opacity: {
93
- type: 'f',
94
- value: 1.0,
95
- },
96
- },
97
- vertexShader,
98
- fragmentShader,
99
- transparent: true,
100
- depthWrite: false,
101
- });
102
- }
103
- createObjects() {
104
- if (this.hasSpotLight) {
105
- this.createSpotlightMaterial();
106
- this.spotLight = new THREE.SpotLight(0xffffff, 50000);
107
- this.spotLight.angle = 2;
108
- this.spotLight.penumbra = 1;
109
- this.spotLight.decay = 0.01;
110
- this.spotLight.distance = 0;
111
- this.spotLight.intensity = 1;
112
- const spotLightTarget = new THREE.Object3D();
113
- this.spotLight.target = spotLightTarget;
114
- this.spotlightGroup = new THREE.Object3D();
115
- this.spotlightGroup.add(this.spotLight);
116
- this.spotlightGroup.add(spotLightTarget);
117
- this.spotLight.position.set(0, -1.4, 0);
118
- spotLightTarget.position.set(0, -10, 0);
119
- this.createSpotLightBeam();
120
- }
121
- }
122
- getCapabilityInValue(channel, value) {
123
- for (const capability of channel.capabilities) {
124
- if (capability.capability.dmxRange.length === 0 ||
125
- (value >= capability.capability.dmxRange[0] && value <= capability.capability.dmxRange[1])) {
126
- return capability;
127
- }
128
- }
129
- return undefined;
130
- }
131
- // Apply the properties of the base fixture to the preview
132
- updatePreview(channelValues, masterDimmerValue) {
133
- // Apply default settings
134
- if (this.fixtureHasDimmer) {
135
- this.dimmer = 0;
136
- }
137
- else {
138
- this.dimmer = 1;
139
- }
140
- this.colorRed = 255;
141
- this.colorGreen = 255;
142
- this.colorBlue = 255;
143
- if (!this.fixtureHasColorWheel && this.fixtureHasColor) {
144
- this.colorRed = 0;
145
- this.colorGreen = 0;
146
- this.colorBlue = 0;
147
- }
148
- for (const channelValue of channelValues) {
149
- const channel = this.fixtureService.getChannelByName(this.fixture, channelValue.channelName);
150
- const capability = this.getCapabilityInValue(channel, channelValue.value);
151
- if (capability) {
152
- switch (capability.capability.type) {
153
- case FixtureCapabilityType.Intensity: {
154
- let valuePercentage;
155
- if (capability.capability.dmxRange.length > 0) {
156
- valuePercentage =
157
- (channelValue.value - capability.capability.dmxRange[0]) /
158
- (capability.capability.dmxRange[1] - capability.capability.dmxRange[0]);
159
- }
160
- else {
161
- valuePercentage = channelValue.value / channel.maxValue;
162
- }
163
- this.dimmer = valuePercentage * masterDimmerValue;
164
- break;
165
- }
166
- case FixtureCapabilityType.ColorIntensity: {
167
- const valuePercentage = (255 * channelValue.value) / channel.maxValue;
168
- switch (capability.capability.color) {
169
- case FixtureCapabilityColor.Red:
170
- // Round needed for threejs
171
- this.colorRed = Math.round(valuePercentage);
172
- break;
173
- case FixtureCapabilityColor.Green:
174
- // Round needed for threejs
175
- this.colorGreen = Math.round(valuePercentage);
176
- break;
177
- case FixtureCapabilityColor.Blue:
178
- // Round needed for threejs
179
- this.colorBlue = Math.round(valuePercentage);
180
- break;
181
- }
182
- break;
183
- }
184
- case FixtureCapabilityType.WheelSlot: {
185
- const mixedColor = this.fixtureService.getMixedWheelSlotColor(capability.wheel, capability.capability.slotNumber);
186
- if (mixedColor) {
187
- this.colorRed = Math.round(mixedColor.red);
188
- this.colorGreen = Math.round(mixedColor.green);
189
- this.colorBlue = Math.round(mixedColor.blue);
190
- }
191
- break;
192
- }
193
- }
194
- }
195
- }
196
- // Apply the colors and intensities
197
- // Apply the dimmer value
198
- // Take the color into account for the beam (don't show a black beam)
199
- const color = new THREE.Color('rgb(' + this.colorRed + ', ' + this.colorGreen + ', ' + this.colorBlue + ')');
200
- const intensityColor = Math.max(this.colorRed, this.colorGreen, this.colorBlue);
201
- if (this.hasSpotLight) {
202
- this.spotLight.color = color;
203
- this.spotLightBeam.material.uniforms.lightColor.value = color;
204
- this.spotLightBeam.material.uniforms.opacity.value = Math.min(intensityColor, this.dimmer);
205
- this.spotLight.intensity = this.spotLightLightMaxIntensity * this.dimmer;
206
- this.spotLightBeam.material.uniforms.spotPosition.value = this.spotlightGroup.position;
207
- }
208
- }
209
- updatePosition(object) {
210
- // Update the position
211
- switch (this.fixture.fixture.positioning) {
212
- case Positioning.topFront: {
213
- object.rotation.x = THREE.MathUtils.degToRad(0);
214
- object.position.set(this.fixture.fixture.positionX, this.fixture.fixture.positionY - 13, this.fixture.fixture.positionZ);
215
- break;
216
- }
217
- case Positioning.bottomFront: {
218
- object.rotation.x = THREE.MathUtils.degToRad(180);
219
- object.position.set(this.fixture.fixture.positionX, this.fixture.fixture.positionY + 13, this.fixture.fixture.positionZ);
220
- break;
221
- }
222
- case Positioning.topBack: {
223
- object.rotation.x = THREE.MathUtils.degToRad(0);
224
- object.position.set(this.fixture.fixture.positionX, this.fixture.fixture.positionY - 13, this.fixture.fixture.positionZ);
225
- break;
226
- }
227
- case Positioning.bottomBack: {
228
- object.rotation.x = THREE.MathUtils.degToRad(180);
229
- object.position.set(this.fixture.fixture.positionX, this.fixture.fixture.positionY + 13, this.fixture.fixture.positionZ);
230
- break;
231
- }
232
- case Positioning.manual: {
233
- object.position.set(this.fixture.fixture.positionX, this.fixture.fixture.positionY, this.fixture.fixture.positionZ);
234
- object.rotation.x = THREE.MathUtils.degToRad(this.fixture.fixture.rotationX);
235
- object.rotation.y = THREE.MathUtils.degToRad(this.fixture.fixture.rotationY);
236
- object.rotation.z = THREE.MathUtils.degToRad(this.fixture.fixture.rotationZ);
237
- break;
238
- }
239
- }
240
- }
241
- createSpotLightBeam() {
242
- // TODO set the correct angle from the profile
243
- const beamAngleDegrees = 14;
244
- const geometry = new THREE.CylinderGeometry(0.1, beamAngleDegrees * 1.2, 100, 64, 20, false);
245
- geometry.applyMatrix4(new THREE.Matrix4().makeTranslation(0, -geometry.parameters.height / 2, 0));
246
- geometry.applyMatrix4(new THREE.Matrix4().makeRotationX(-Math.PI / 2));
247
- this.spotLightBeam = new THREE.Mesh(geometry, this.spotlightMaterial);
248
- this.spotLightBeam.position.set(0, -0.02, 0);
249
- this.spotLightBeam.receiveShadow = false;
250
- this.spotLightBeam.castShadow = false;
251
- this.spotlightGroup.add(this.spotLightBeam);
252
- this.spotLightBeam.rotation.x = Math.PI / 2;
253
- }
254
- destroy() {
255
- if (this.hasSpotLight) {
256
- this.spotlightMaterial.dispose();
257
- }
258
- }
259
- }
260
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS0zZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbmVyL3NyYy9saWIvcHJldmlldy9tb2RlbHMvZml4dHVyZS0zZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUkvQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFLaEcsTUFBTSxPQUFnQixTQUFTO0lBMEI3QixZQUNTLGNBQThCLEVBQzlCLGNBQThCLEVBQ3JDLE9BQXNCLEVBQ3RCLEtBQVUsRUFDVixlQUF3QixLQUFLO1FBSnRCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUEzQnRCLDJCQUFzQixHQUFXLENBQUMsQ0FBQztRQUNuQywrQkFBMEIsR0FBVyxFQUFFLENBQUM7UUFLakQscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUM3QixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUt4QixXQUFNLEdBQVcsQ0FBQyxDQUFDO1FBR3BCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDaEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVqQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQWF0QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUVqQyxpREFBaUQ7UUFDakQsS0FBSyxNQUFNLGFBQWEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xELElBQUksYUFBYSxDQUFDLE9BQU8sRUFB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Q0FBQztJQUM5QyxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgQ2FjaGVkRml4dHVyZSB9IGZyb20gJy4uLy4uL21vZGVscy9jYWNoZWQtZml4dHVyZSc7XG5pbXBvcnQgeyBDYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eSB9IGZyb20gJy4uLy4uL21vZGVscy9jYWNoZWQtZml4dHVyZS1jYXBhYmlsaXR5JztcbmltcG9ydCB7IENhY2hlZEZpeHR1cmVDaGFubmVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhY2hlZC1maXh0dXJlLWNoYW5uZWwnO1xuaW1wb3J0IHsgUG9zaXRpb25pbmcgfSBmcm9tICcuLi8uLi9tb2RlbHMvZml4dHVyZSc7XG5pbXBvcnQgeyBGaXh0dXJlQ2FwYWJpbGl0eUNvbG9yLCBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvZml4dHVyZS1jYXBhYmlsaXR5JztcbmltcG9ydCB7IEZpeHR1cmVDaGFubmVsVmFsdWUgfSBmcm9tICcuLi8uLi9tb2RlbHMvZml4dHVyZS1jaGFubmVsLXZhbHVlJztcbmltcG9ydCB7IEZpeHR1cmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZml4dHVyZS5zZXJ2aWNlJztcbmltcG9ydCB7IFByZXZpZXdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcHJldmlldy5zZXJ2aWNlJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZpeHR1cmUzZCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcG9pbnRMaWdodE1heEludGVuc2l0eTogbnVtYmVyID0gMjtcbiAgcHJpdmF0ZSByZWFkb25seSBzcG90TGlnaHRMaWdodE1heEludGVuc2l0eTogbnVtYmVyID0gMTA7XG5cbiAgcHJvdGVjdGVkIHNjZW5lOiBhbnk7XG5cbiAgcHVibGljIGZpeHR1cmU6IENhY2hlZEZpeHR1cmU7XG4gIHByaXZhdGUgZml4dHVyZUhhc0RpbW1lciA9IGZhbHNlO1xuICBwcml2YXRlIGZpeHR1cmVIYXNDb2xvcldoZWVsID0gZmFsc2U7XG4gIHByaXZhdGUgZml4dHVyZUhhc0NvbG9yID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBjb2xvclJlZDogbnVtYmVyO1xuICBwcml2YXRlIGNvbG9yR3JlZW46IG51bWJlcjtcbiAgcHJpdmF0ZSBjb2xvckJsdWU6IG51bWJlcjtcbiAgcHJpdmF0ZSBkaW1tZXI6IG51bWJlciA9IDA7XG5cbiAgcHJvdGVjdGVkIGxhc3RTZWxlY3RlZDogYm9vbGVhbjtcbiAgcHVibGljIGlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzTG9hZGVkID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGhhc1Nwb3RMaWdodDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgc3BvdExpZ2h0OiBUSFJFRS5TcG90TGlnaHQ7XG4gIHByb3RlY3RlZCBzcG90TGlnaHRCZWFtOiBUSFJFRS5NZXNoO1xuICBwcm90ZWN0ZWQgc3BvdGxpZ2h0R3JvdXA6IFRIUkVFLk9iamVjdDNEO1xuICBwcm90ZWN0ZWQgc3BvdGxpZ2h0TWF0ZXJpYWw6IFRIUkVFLlNoYWRlck1hdGVyaWFsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBmaXh0dXJlU2VydmljZTogRml4dHVyZVNlcnZpY2UsXG4gICAgcHVibGljIHByZXZpZXdTZXJ2aWNlOiBQcmV2aWV3U2VydmljZSxcbiAgICBmaXh0dXJlOiBDYWNoZWRGaXh0dXJlLFxuICAgIHNjZW5lOiBhbnksXG4gICAgaGFzU3BvdExpZ2h0OiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgdGhpcy5maXh0dXJlID0gZml4dHVyZTtcbiAgICB0aGlzLnNjZW5lID0gc2NlbmU7XG4gICAgdGhpcy5oYXNTcG90TGlnaHQgPSBoYXNTcG90TGlnaHQ7XG5cbiAgICAvLyBldmFsdWF0ZSwgdmFyaW91cyBjYXBhYmlsaXRpZXMgb2YgdGhpcyBmaXh0dXJlXG4gICAgZm9yIChjb25zdCBjYWNoZWRDaGFubmVsIG9mIHRoaXMuZml4dHVyZS5jaGFubmVscykge1xuICAgICAgaWYgKGNhY2hlZENoYW5uZWwuY2hhbm5lbCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNhcGFiaWxpdHkgb2YgY2FjaGVkQ2hhbm5lbC5jYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgICBzd2l0Y2ggKGNhcGFiaWxpdHkuY2FwYWJpbGl0eS50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5JbnRlbnNpdHk6XG4gICAgICAgICAgICAgIHRoaXMuZml4dHVyZUhhc0RpbW1lciA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuQ29sb3JJbnRlbnNpdHk6XG4gICAgICAgICAgICAgIHRoaXMuZml4dHVyZUhhc0NvbG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhY2hlZENoYW5uZWwuY29sb3JXaGVlbCkge1xuICAgICAgICAgIHRoaXMuZml4dHVyZUhhc0NvbG9yV2hlZWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTcG90bGlnaHRNYXRlcmlhbCgpIHtcbiAgICBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSBgXG4gICAgdmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4gICAgdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuXG4gICAgdm9pZCBtYWluKCl7XG4gICAgICB2Tm9ybWFsID0gbm9ybWFsaXplKG5vcm1hbE1hdHJpeCAqIG5vcm1hbCk7XG5cbiAgICAgIHZlYzQgd29ybGRQb3NpdGlvbiA9IG1vZGVsTWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcbiAgICAgIHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XG5cbiAgICAgIGdsX1Bvc2l0aW9uXHQ9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xuICAgIH1gO1xuICAgIGNvbnN0IGZyYWdtZW50U2hhZGVyID0gYFxuICAgIHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuICAgIHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcblxuICAgIHVuaWZvcm0gdmVjMyBsaWdodENvbG9yO1xuICAgIHVuaWZvcm0gZmxvYXRcdG9wYWNpdHk7XG4gICAgdW5pZm9ybSB2ZWMzIHNwb3RQb3NpdGlvbjtcbiAgICB1bmlmb3JtIGZsb2F0IGF0dGVudWF0aW9uO1xuICAgIHVuaWZvcm0gZmxvYXRcdGFuZ2xlUG93ZXI7XG5cbiAgICB2b2lkIG1haW4oKXtcbiAgICAgIGZsb2F0IGludGVuc2l0eTtcblxuICAgICAgaW50ZW5zaXR5XHQ9IGRpc3RhbmNlKHZXb3JsZFBvc2l0aW9uLCBzcG90UG9zaXRpb24pIC8gYXR0ZW51YXRpb247XG4gICAgICBpbnRlbnNpdHlcdD0gMS4wIC0gY2xhbXAoaW50ZW5zaXR5LCAwLjAsIDEuMCk7XG5cbiAgICAgIHZlYzMgbm9ybWFsXHQ9IHZlYzModk5vcm1hbC54LCB2Tm9ybWFsLnksIGFicyh2Tm9ybWFsLnopKTtcbiAgICAgIGZsb2F0IGFuZ2xlSW50ZW5zaXR5XHQ9IHBvdyhkb3Qobm9ybWFsLCB2ZWMzKDAuMCwgMC4wLCAxLjApKSwgYW5nbGVQb3dlcik7XG4gICAgICBpbnRlbnNpdHlcdD0gaW50ZW5zaXR5ICogYW5nbGVJbnRlbnNpdHkgKiBvcGFjaXR5O1xuXG4gICAgICBnbF9GcmFnQ29sb3JcdD0gdmVjNChsaWdodENvbG9yLCBpbnRlbnNpdHkpO1xuICAgIH1gO1xuXG4gICAgdGhpcy5zcG90bGlnaHRNYXRlcmlhbCA9IG5ldyBUSFJFRS5TaGFkZXJNYXRlcmlhbCh7XG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICBhdHRlbnVhdGlvbjoge1xuICAgICAgICAgIHR5cGU6ICdmJyxcbiAgICAgICAgICB2YWx1ZTogODAwLjAsXG4gICAgICAgIH0sXG4gICAgICAgIGFuZ2xlUG93ZXI6IHtcbiAgICAgICAgICB0eXBlOiAnZicsXG4gICAgICAgICAgdmFsdWU6IDIsXG4gICAgICAgIH0sXG4gICAgICAgIHNwb3RQb3NpdGlvbjoge1xuICAgICAgICAgIHR5cGU6ICd2MycsXG4gICAgICAgICAgdmFsdWU6IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDAsIDApLFxuICAgICAgICB9LFxuICAgICAgICBsaWdodENvbG9yOiB7XG4gICAgICAgICAgdHlwZTogJ2MnLFxuICAgICAgICAgIHZhbHVlOiBuZXcgVEhSRUUuQ29sb3IoJ3doaXRlJyksXG4gICAgICAgIH0sXG4gICAgICAgIG9wYWNpdHk6IHtcbiAgICAgICAgICB0eXBlOiAnZicsXG4gICAgICAgICAgdmFsdWU6IDEuMCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB2ZXJ0ZXhTaGFkZXIsXG4gICAgICBmcmFnbWVudFNoYWRlcixcbiAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlT2JqZWN0cygpIHtcbiAgICBpZiAodGhpcy5oYXNTcG90TGlnaHQpIHtcbiAgICAgIHRoaXMuY3JlYXRlU3BvdGxpZ2h0TWF0ZXJpYWwoKTtcblxuICAgICAgdGhpcy5zcG90TGlnaHQgPSBuZXcgVEhSRUUuU3BvdExpZ2h0KDB4ZmZmZmZmLCA1MDAwMCk7XG4gICAgICB0aGlzLnNwb3RMaWdodC5hbmdsZSA9IDI7XG4gICAgICB0aGlzLnNwb3RMaWdodC5wZW51bWJyYSA9IDE7XG4gICAgICB0aGlzLnNwb3RMaWdodC5kZWNheSA9IDAuMDE7XG4gICAgICB0aGlzLnNwb3RMaWdodC5kaXN0YW5jZSA9IDA7XG4gICAgICB0aGlzLnNwb3RMaWdodC5pbnRlbnNpdHkgPSAxO1xuXG4gICAgICBjb25zdCBzcG90TGlnaHRUYXJnZXQgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcbiAgICAgIHRoaXMuc3BvdExpZ2h0LnRhcmdldCA9IHNwb3RMaWdodFRhcmdldDtcblxuICAgICAgdGhpcy5zcG90bGlnaHRHcm91cCA9IG5ldyBUSFJFRS5PYmplY3QzRCgpO1xuICAgICAgdGhpcy5zcG90bGlnaHRHcm91cC5hZGQodGhpcy5zcG90TGlnaHQpO1xuICAgICAgdGhpcy5zcG90bGlnaHRHcm91cC5hZGQoc3BvdExpZ2h0VGFyZ2V0KTtcbiAgICAgIHRoaXMuc3BvdExpZ2h0LnBvc2l0aW9uLnNldCgwLCAtMS40LCAwKTtcbiAgICAgIHNwb3RMaWdodFRhcmdldC5wb3NpdGlvbi5zZXQoMCwgLTEwLCAwKTtcbiAgICAgIHRoaXMuY3JlYXRlU3BvdExpZ2h0QmVhbSgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDYXBhYmlsaXR5SW5WYWx1ZShjaGFubmVsOiBDYWNoZWRGaXh0dXJlQ2hhbm5lbCwgdmFsdWU6IG51bWJlcik6IENhY2hlZEZpeHR1cmVDYXBhYmlsaXR5IHtcbiAgICBmb3IgKGNvbnN0IGNhcGFiaWxpdHkgb2YgY2hhbm5lbC5jYXBhYmlsaXRpZXMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY2FwYWJpbGl0eS5jYXBhYmlsaXR5LmRteFJhbmdlLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAodmFsdWUgPj0gY2FwYWJpbGl0eS5jYXBhYmlsaXR5LmRteFJhbmdlWzBdICYmIHZhbHVlIDw9IGNhcGFiaWxpdHkuY2FwYWJpbGl0eS5kbXhSYW5nZVsxXSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gY2FwYWJpbGl0eTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gQXBwbHkgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGJhc2UgZml4dHVyZSB0byB0aGUgcHJldmlld1xuICB1cGRhdGVQcmV2aWV3KGNoYW5uZWxWYWx1ZXM6IEZpeHR1cmVDaGFubmVsVmFsdWVbXSwgbWFzdGVyRGltbWVyVmFsdWU6IG51bWJlcikge1xuICAgIC8vIEFwcGx5IGRlZmF1bHQgc2V0dGluZ3NcbiAgICBpZiAodGhpcy5maXh0dXJlSGFzRGltbWVyKSB7XG4gICAgICB0aGlzLmRpbW1lciA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGltbWVyID0gMTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbG9yUmVkID0gMjU1O1xuICAgIHRoaXMuY29sb3JHcmVlbiA9IDI1NTtcbiAgICB0aGlzLmNvbG9yQmx1ZSA9IDI1NTtcblxuICAgIGlmICghdGhpcy5maXh0dXJlSGFzQ29sb3JXaGVlbCAmJiB0aGlzLmZpeHR1cmVIYXNDb2xvcikge1xuICAgICAgdGhpcy5jb2xvclJlZCA9IDA7XG4gICAgICB0aGlzLmNvbG9yR3JlZW4gPSAwO1xuICAgICAgdGhpcy5jb2xvckJsdWUgPSAwO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2hhbm5lbFZhbHVlIG9mIGNoYW5uZWxWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldENoYW5uZWxCeU5hbWUodGhpcy5maXh0dXJlLCBjaGFubmVsVmFsdWUuY2hhbm5lbE5hbWUpO1xuICAgICAgY29uc3QgY2FwYWJpbGl0eSA9IHRoaXMuZ2V0Q2FwYWJpbGl0eUluVmFsdWUoY2hhbm5lbCwgY2hhbm5lbFZhbHVlLnZhbHVlKTtcblxuICAgICAgaWYgKGNhcGFiaWxpdHkpIHtcbiAgICAgICAgc3dpdGNoIChjYXBhYmlsaXR5LmNhcGFiaWxpdHkudHlwZSkge1xuICAgICAgICAgIGNhc2UgRml4dHVyZUNhcGFiaWxpdHlUeXBlLkludGVuc2l0eToge1xuICAgICAgICAgICAgbGV0IHZhbHVlUGVyY2VudGFnZTogbnVtYmVyO1xuICAgICAgICAgICAgaWYgKGNhcGFiaWxpdHkuY2FwYWJpbGl0eS5kbXhSYW5nZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHZhbHVlUGVyY2VudGFnZSA9XG4gICAgICAgICAgICAgICAgKGNoYW5uZWxWYWx1ZS52YWx1ZSAtIGNhcGFiaWxpdHkuY2FwYWJpbGl0eS5kbXhSYW5nZVswXSkgL1xuICAgICAgICAgICAgICAgIChjYXBhYmlsaXR5LmNhcGFiaWxpdHkuZG14UmFuZ2VbMV0gLSBjYXBhYmlsaXR5LmNhcGFiaWxpdHkuZG14UmFuZ2VbMF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFsdWVQZXJjZW50YWdlID0gY2hhbm5lbFZhbHVlLnZhbHVlIC8gY2hhbm5lbC5tYXhWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGltbWVyID0gdmFsdWVQZXJjZW50YWdlICogbWFzdGVyRGltbWVyVmFsdWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuQ29sb3JJbnRlbnNpdHk6IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlUGVyY2VudGFnZSA9ICgyNTUgKiBjaGFubmVsVmFsdWUudmFsdWUpIC8gY2hhbm5lbC5tYXhWYWx1ZTtcbiAgICAgICAgICAgIHN3aXRjaCAoY2FwYWJpbGl0eS5jYXBhYmlsaXR5LmNvbG9yKSB7XG4gICAgICAgICAgICAgIGNhc2UgRml4dHVyZUNhcGFiaWxpdHlDb2xvci5SZWQ6XG4gICAgICAgICAgICAgICAgLy8gUm91bmQgbmVlZGVkIGZvciB0aHJlZWpzXG4gICAgICAgICAgICAgICAgdGhpcy5jb2xvclJlZCA9IE1hdGgucm91bmQodmFsdWVQZXJjZW50YWdlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBGaXh0dXJlQ2FwYWJpbGl0eUNvbG9yLkdyZWVuOlxuICAgICAgICAgICAgICAgIC8vIFJvdW5kIG5lZWRlZCBmb3IgdGhyZWVqc1xuICAgICAgICAgICAgICAgIHRoaXMuY29sb3JHcmVlbiA9IE1hdGgucm91bmQodmFsdWVQZXJjZW50YWdlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBGaXh0dXJlQ2FwYWJpbGl0eUNvbG9yLkJsdWU6XG4gICAgICAgICAgICAgICAgLy8gUm91bmQgbmVlZGVkIGZvciB0aHJlZWpzXG4gICAgICAgICAgICAgICAgdGhpcy5jb2xvckJsdWUgPSBNYXRoLnJvdW5kKHZhbHVlUGVyY2VudGFnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuV2hlZWxTbG90OiB7XG4gICAgICAgICAgICBjb25zdCBtaXhlZENvbG9yID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRNaXhlZFdoZWVsU2xvdENvbG9yKGNhcGFiaWxpdHkud2hlZWwsIGNhcGFiaWxpdHkuY2FwYWJpbGl0eS5zbG90TnVtYmVyKTtcbiAgICAgICAgICAgIGlmIChtaXhlZENvbG9yKSB7XG4gICAgICAgICAgICAgIHRoaXMuY29sb3JSZWQgPSBNYXRoLnJvdW5kKG1peGVkQ29sb3IucmVkKTtcbiAgICAgICAgICAgICAgdGhpcy5jb2xvckdyZWVuID0gTWF0aC5yb3VuZChtaXhlZENvbG9yLmdyZWVuKTtcbiAgICAgICAgICAgICAgdGhpcy5jb2xvckJsdWUgPSBNYXRoLnJvdW5kKG1peGVkQ29sb3IuYmx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBseSB0aGUgY29sb3JzIGFuZCBpbnRlbnNpdGllc1xuICAgIC8vIEFwcGx5IHRoZSBkaW1tZXIgdmFsdWVcbiAgICAvLyBUYWtlIHRoZSBjb2xvciBpbnRvIGFjY291bnQgZm9yIHRoZSBiZWFtIChkb24ndCBzaG93IGEgYmxhY2sgYmVhbSlcbiAgICBjb25zdCBjb2xvciA9IG5ldyBUSFJFRS5Db2xvcigncmdiKCcgKyB0aGlzLmNvbG9yUmVkICsgJywgJyArIHRoaXMuY29sb3JHcmVlbiArICcsICcgKyB0aGlzLmNvbG9yQmx1ZSArICcpJyk7XG4gICAgY29uc3QgaW50ZW5zaXR5Q29sb3IgPSBNYXRoLm1heCh0aGlzLmNvbG9yUmVkLCB0aGlzLmNvbG9yR3JlZW4sIHRoaXMuY29sb3JCbHVlKTtcblxuICAgIGlmICh0aGlzLmhhc1Nwb3RMaWdodCkge1xuICAgICAgdGhpcy5zcG90TGlnaHQuY29sb3IgPSBjb2xvcjtcbiAgICAgIHRoaXMuc3BvdExpZ2h0QmVhbS5tYXRlcmlhbC51bmlmb3Jtcy5saWdodENvbG9yLnZhbHVlID0gY29sb3I7XG5cbiAgICAgIHRoaXMuc3BvdExpZ2h0QmVhbS5tYXRlcmlhbC51bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gTWF0aC5taW4oaW50ZW5zaXR5Q29sb3IsIHRoaXMuZGltbWVyKTtcbiAgICAgIHRoaXMuc3BvdExpZ2h0LmludGVuc2l0eSA9IHRoaXMuc3BvdExpZ2h0TGlnaHRNYXhJbnRlbnNpdHkgKiB0aGlzLmRpbW1lcjtcbiAgICAgIHRoaXMuc3BvdExpZ2h0QmVhbS5tYXRlcmlhbC51bmlmb3Jtcy5zcG90UG9zaXRpb24udmFsdWUgPSB0aGlzLnNwb3RsaWdodEdyb3VwLnBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVQb3NpdGlvbihvYmplY3Q6IFRIUkVFLk9iamVjdDNEKSB7XG4gICAgLy8gVXBkYXRlIHRoZSBwb3NpdGlvblxuICAgIHN3aXRjaCAodGhpcy5maXh0dXJlLmZpeHR1cmUucG9zaXRpb25pbmcpIHtcbiAgICAgIGNhc2UgUG9zaXRpb25pbmcudG9wRnJvbnQ6IHtcbiAgICAgICAgb2JqZWN0LnJvdGF0aW9uLnggPSBUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQoMCk7XG4gICAgICAgIG9iamVjdC5wb3NpdGlvbi5zZXQodGhpcy5maXh0dXJlLmZpeHR1cmUucG9zaXRpb25YLCB0aGlzLmZpeHR1cmUuZml4dHVyZS5wb3NpdGlvblkgLSAxMywgdGhpcy5maXh0dXJlLmZpeHR1cmUucG9zaXRpb25aKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFBvc2l0aW9uaW5nLmJvdHRvbUZyb250OiB7XG4gICAgICAgIG9iamVjdC5yb3RhdGlvbi54ID0gVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKDE4MCk7XG4gICAgICAgIG9iamVjdC5wb3NpdGlvbi5zZXQodGhpcy5maXh0dXJlLmZpeHR1cmUucG9zaXRpb25YLCB0aGlzLmZpeHR1cmUuZml4dHVyZS5wb3NpdGlvblkgKyAxMywgdGhpcy5maXh0dXJlLmZpeHR1cmUucG9zaXRpb25aKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFBvc2l0aW9uaW5nLnRvcEJhY2s6IHtcbiAgICAgICAgb2JqZWN0LnJvdGF0aW9uLnggPSBUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQoMCk7XG4gICAgICAgIG9iamVjdC5wb3NpdGlvbi5zZXQodGhpcy5maXh0dXJlLmZpeHR1cmUucG9zaXRpb25YLCB0aGlzLmZpeHR1cmUuZml4dHVyZS5wb3NpdGlvblkgLSAxMywgdGhpcy5maXh0dXJlLmZpeHR1cmUucG9zaXRpb25aKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFBvc2l0aW9uaW5nLmJvdHRvbUJhY2s6IHtcbiAgICAgICAgb2JqZWN0LnJvdGF0aW9uLnggPSBUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQoMTgwKTtcbiAgICAgICAgb2JqZWN0LnBvc2l0aW9uLnNldCh0aGlzLmZpeHR1cmUuZml4dHVyZS5wb3NpdGlvblgsIHRoaXMuZml4dHVyZS5maXh0dXJlLnBvc2l0aW9uWSArIDEzLCB0aGlzLmZpeHR1cmUuZml4dHVyZS5wb3NpdGlvblopO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgUG9zaXRpb25pbmcubWFudWFsOiB7XG4gICAgICAgIG9iamVjdC5wb3NpdGlvbi5zZXQodGhpcy5maXh0dXJlLmZpeHR1cmUucG9zaXRpb25YLCB0aGlzLmZpeHR1cmUuZml4dHVyZS5wb3NpdGlvblksIHRoaXMuZml4dHVyZS5maXh0dXJlLnBvc2l0aW9uWik7XG4gICAgICAgIG9iamVjdC5yb3RhdGlvbi54ID0gVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKHRoaXMuZml4dHVyZS5maXh0dXJlLnJvdGF0aW9uWCk7XG4gICAgICAgIG9iamVjdC5yb3RhdGlvbi55ID0gVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKHRoaXMuZml4dHVyZS5maXh0dXJlLnJvdGF0aW9uWSk7XG4gICAgICAgIG9iamVjdC5yb3RhdGlvbi56ID0gVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKHRoaXMuZml4dHVyZS5maXh0dXJlLnJvdGF0aW9uWik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVTcG90TGlnaHRCZWFtKCkge1xuICAgIC8vIFRPRE8gc2V0IHRoZSBjb3JyZWN0IGFuZ2xlIGZyb20gdGhlIHByb2ZpbGVcbiAgICBjb25zdCBiZWFtQW5nbGVEZWdyZWVzID0gMTQ7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeSgwLjEsIGJlYW1BbmdsZURlZ3JlZXMgKiAxLjIsIDEwMCwgNjQsIDIwLCBmYWxzZSk7XG4gICAgZ2VvbWV0cnkuYXBwbHlNYXRyaXg0KG5ldyBUSFJFRS5NYXRyaXg0KCkubWFrZVRyYW5zbGF0aW9uKDAsIC1nZW9tZXRyeS5wYXJhbWV0ZXJzLmhlaWdodCAvIDIsIDApKTtcbiAgICBnZW9tZXRyeS5hcHBseU1hdHJpeDQobmV3IFRIUkVFLk1hdHJpeDQoKS5tYWtlUm90YXRpb25YKC1NYXRoLlBJIC8gMikpO1xuXG4gICAgdGhpcy5zcG90TGlnaHRCZWFtID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIHRoaXMuc3BvdGxpZ2h0TWF0ZXJpYWwpO1xuICAgIHRoaXMuc3BvdExpZ2h0QmVhbS5wb3NpdGlvbi5zZXQoMCwgLTAuMDIsIDApO1xuICAgIHRoaXMuc3BvdExpZ2h0QmVhbS5yZWNlaXZlU2hhZG93ID0gZmFsc2U7XG4gICAgdGhpcy5zcG90TGlnaHRCZWFtLmNhc3RTaGFkb3cgPSBmYWxzZTtcblxuICAgIHRoaXMuc3BvdGxpZ2h0R3JvdXAuYWRkKHRoaXMuc3BvdExpZ2h0QmVhbSk7XG4gICAgdGhpcy5zcG90TGlnaHRCZWFtLnJvdGF0aW9uLnggPSBNYXRoLlBJIC8gMjtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuaGFzU3BvdExpZ2h0KSB7XG4gICAgICB0aGlzLnNwb3RsaWdodE1hdGVyaWFsLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,115 +0,0 @@
1
- import { forkJoin } from 'rxjs';
2
- import { map } from 'rxjs/operators';
3
- import * as THREE from 'three';
4
- import { FixtureCapabilityType } from '../../models/fixture-capability';
5
- import { Fixture3d } from './fixture-3d';
6
- export class MovingHead3d extends Fixture3d {
7
- constructor(fixtureService, previewService, previewMeshService, fixture, scene) {
8
- super(fixtureService, previewService, fixture, scene, true);
9
- this.fixtureService = fixtureService;
10
- this.previewService = previewService;
11
- this.headGroup = new THREE.Object3D();
12
- this.armGroup = new THREE.Object3D();
13
- this.objectGroup = new THREE.Object3D();
14
- forkJoin([
15
- previewMeshService.getMesh('moving_head_socket'),
16
- previewMeshService.getMesh('moving_head_arm'),
17
- previewMeshService.getMesh('moving_head_head'),
18
- ])
19
- .pipe(map(([socket, arm, head]) => {
20
- this.socket = socket;
21
- this.arm = arm;
22
- this.head = head;
23
- this.createObjects();
24
- }))
25
- .subscribe();
26
- }
27
- createObjects() {
28
- super.createObjects();
29
- this.socket.material = this.previewService.fixtureMaterial;
30
- this.arm.material = this.previewService.fixtureMaterial;
31
- this.head.material = this.previewService.fixtureMaterial;
32
- // Add the head
33
- this.head.scale.multiplyScalar(0.9);
34
- this.head.position.set(-0.1, 0, 0);
35
- const headPivotGroup = new THREE.Object3D();
36
- headPivotGroup.add(this.head);
37
- this.headGroup.add(headPivotGroup);
38
- this.headGroup.add(this.spotlightGroup);
39
- // Add the arm
40
- this.armGroup.add(this.headGroup);
41
- this.headGroup.position.set(0, -0.6, 0);
42
- this.armGroup.add(this.arm);
43
- // Add the socket
44
- this.objectGroup.add(this.armGroup);
45
- this.objectGroup.add(this.socket);
46
- this.socket.position.set(0, 1.2, 0);
47
- // A moving head has about 32 cm in width
48
- this.objectGroup.scale.multiplyScalar(9);
49
- this.scene.add(this.objectGroup);
50
- this.isLoaded = true;
51
- }
52
- updatePreview(channelValues, masterDimmerValue) {
53
- if (!this.isLoaded) {
54
- return;
55
- }
56
- super.updatePreview(channelValues, masterDimmerValue);
57
- this.updatePosition(this.objectGroup);
58
- // Apply default settings
59
- let panStart = 0;
60
- let panEnd = 255;
61
- let tiltStart = 0;
62
- let tiltEnd = 255;
63
- this.pan = 0;
64
- this.tilt = 0;
65
- // Apply the known property values
66
- for (const channelValue of channelValues) {
67
- const channel = this.fixtureService.getChannelByName(this.fixture, channelValue.channelName);
68
- const capability = this.getCapabilityInValue(channel, channelValue.value);
69
- if (capability) {
70
- switch (capability.capability.type) {
71
- case FixtureCapabilityType.Pan: {
72
- panStart = this.fixtureService.getRotationAngleDeg(capability.capability.angleStart) || 0;
73
- panEnd = this.fixtureService.getRotationAngleDeg(capability.capability.angleEnd) || 540;
74
- this.pan = channelValue.value / channel.maxValue;
75
- break;
76
- }
77
- case FixtureCapabilityType.Tilt: {
78
- tiltStart = this.fixtureService.getRotationAngleDeg(capability.capability.angleStart) || 0;
79
- tiltEnd = this.fixtureService.getRotationAngleDeg(capability.capability.angleEnd) || 2700;
80
- this.tilt = channelValue.value / channel.maxValue;
81
- break;
82
- }
83
- }
84
- }
85
- }
86
- // calculate the y/x rotation in radiants based on pan/tilt (0-1) respecting the max pan/tilt
87
- this.armGroup.rotation.y = THREE.MathUtils.degToRad(panEnd * this.pan + panStart) - THREE.MathUtils.degToRad(panEnd / 2);
88
- this.headGroup.rotation.x = THREE.MathUtils.degToRad(tiltEnd * this.tilt + tiltStart) - THREE.MathUtils.degToRad(tiltEnd / 2);
89
- // Update the angle only on change, because it's expensive
90
- // TODO update the correct angle from the profile
91
- const beamAngleDregrees = 14;
92
- if (this.lastBeamAngleDegrees !== beamAngleDregrees) {
93
- this.spotLight.angle = THREE.MathUtils.degToRad(beamAngleDregrees);
94
- this.lastBeamAngleDegrees = beamAngleDregrees;
95
- }
96
- // Update the material
97
- if (this.lastSelected !== this.isSelected) {
98
- if (this.isSelected) {
99
- this.socket.material = this.previewService.fixtureSelectedMaterial;
100
- this.arm.material = this.previewService.fixtureSelectedMaterial;
101
- this.head.material = this.previewService.fixtureSelectedMaterial;
102
- }
103
- else {
104
- this.socket.material = this.previewService.fixtureMaterial;
105
- this.arm.material = this.previewService.fixtureMaterial;
106
- this.head.material = this.previewService.fixtureMaterial;
107
- }
108
- this.lastSelected = this.isSelected;
109
- }
110
- }
111
- destroy() {
112
- this.scene.remove(this.objectGroup);
113
- }
114
- }
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92aW5nLWhlYWQtM2QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL3ByZXZpZXcvbW9kZWxzL21vdmluZy1oZWFkLTNkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRS9CLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSXhFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHekMsTUFBTSxPQUFPLFlBQWEsU0FBUSxTQUFTO0lBY3pDLFlBQ1MsY0FBOEIsRUFDOUIsY0FBOEIsRUFDckMsa0JBQXNDLEVBQ3RDLE9BQXNCLEVBQ3RCLEtBQVU7UUFFVixLQUFLLENBQUMsY0FBYyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBTnJELG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFSL0IsY0FBUyxHQUFtQixJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqRCxhQUFRLEdBQW1CLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hELGdCQUFXLEdBQW1CLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBYXpELFFBQVEsQ0FBQztZQUNQLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztZQUNoRCxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUM7WUFDN0Msa0JBQWtCLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO1NBQy9DLENBQUM7YUFDQyxJQUFJLENBQ0gs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R0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDO2dCQUNuRSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDO2dCQUNoRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDO1lBQ25FLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUM7Z0JBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDO1lBQzNELENBQUM7WUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBDYWNoZWRGaXh0dXJlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhY2hlZC1maXh0dXJlJztcbmltcG9ydCB7IEZpeHR1cmVDYXBhYmlsaXR5VHlwZSB9IGZyb20gJy4uLy4uL21vZGVscy9maXh0dXJlLWNhcGFiaWxpdHknO1xuaW1wb3J0IHsgRml4dHVyZUNoYW5uZWxWYWx1ZSB9IGZyb20gJy4uLy4uL21vZGVscy9maXh0dXJlLWNoYW5uZWwtdmFsdWUnO1xuaW1wb3J0IHsgRml4dHVyZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9maXh0dXJlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJldmlld01lc2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcHJldmlldy1tZXNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgRml4dHVyZTNkIH0gZnJvbSAnLi9maXh0dXJlLTNkJztcbmltcG9ydCB7IFByZXZpZXdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcHJldmlldy5zZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIE1vdmluZ0hlYWQzZCBleHRlbmRzIEZpeHR1cmUzZCB7XG4gIHByaXZhdGUgcGFuOiBudW1iZXI7XG4gIHByaXZhdGUgdGlsdDogbnVtYmVyO1xuXG4gIHByaXZhdGUgc29ja2V0OiBUSFJFRS5NZXNoO1xuICBwcml2YXRlIGFybTogVEhSRUUuTWVzaDtcbiAgcHJpdmF0ZSBoZWFkOiBUSFJFRS5NZXNoO1xuXG4gIHByaXZhdGUgaGVhZEdyb3VwOiBUSFJFRS5PYmplY3QzRCA9IG5ldyBUSFJFRS5PYmplY3QzRCgpO1xuICBwcml2YXRlIGFybUdyb3VwOiBUSFJFRS5PYmplY3QzRCA9IG5ldyBUSFJFRS5PYmplY3QzRCgpO1xuICBwcml2YXRlIG9iamVjdEdyb3VwOiBUSFJFRS5PYmplY3QzRCA9IG5ldyBUSFJFRS5PYmplY3QzRCgpO1xuXG4gIHByaXZhdGUgbGFzdEJlYW1BbmdsZURlZ3JlZXM6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZml4dHVyZVNlcnZpY2U6IEZpeHR1cmVTZXJ2aWNlLFxuICAgIHB1YmxpYyBwcmV2aWV3U2VydmljZTogUHJldmlld1NlcnZpY2UsXG4gICAgcHJldmlld01lc2hTZXJ2aWNlOiBQcmV2aWV3TWVzaFNlcnZpY2UsXG4gICAgZml4dHVyZTogQ2FjaGVkRml4dHVyZSxcbiAgICBzY2VuZTogYW55XG4gICkge1xuICAgIHN1cGVyKGZpeHR1cmVTZXJ2aWNlLCBwcmV2aWV3U2VydmljZSwgZml4dHVyZSwgc2NlbmUsIHRydWUpO1xuXG4gICAgZm9ya0pvaW4oW1xuICAgICAgcHJldmlld01lc2hTZXJ2aWNlLmdldE1lc2goJ21vdmluZ19oZWFkX3NvY2tldCcpLFxuICAgICAgcHJldmlld01lc2hTZXJ2aWNlLmdldE1lc2goJ21vdmluZ19oZWFkX2FybScpLFxuICAgICAgcHJldmlld01lc2hTZXJ2aWNlLmdldE1lc2goJ21vdmluZ19oZWFkX2hlYWQnKSxcbiAgICBdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoW3NvY2tldCwgYXJtLCBoZWFkXSkgPT4ge1xuICAgICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgICAgICAgIHRoaXMuYXJtID0gYXJtO1xuICAgICAgICAgIHRoaXMuaGVhZCA9IGhlYWQ7XG5cbiAgICAgICAgICB0aGlzLmNyZWF0ZU9iamVjdHMoKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVPYmplY3RzKCkge1xuICAgIHN1cGVyLmNyZWF0ZU9iamVjdHMoKTtcblxuICAgIHRoaXMuc29ja2V0Lm1hdGVyaWFsID0gdGhpcy5wcmV2aWV3U2VydmljZS5maXh0dXJlTWF0ZXJpYWw7XG4gICAgdGhpcy5hcm0ubWF0ZXJpYWwgPSB0aGlzLnByZXZpZXdTZXJ2aWNlLmZpeHR1cmVNYXRlcmlhbDtcbiAgICB0aGlzLmhlYWQubWF0ZXJpYWwgPSB0aGlzLnByZXZpZXdTZXJ2aWNlLmZpeHR1cmVNYXRlcmlhbDtcblxuICAgIC8vIEFkZCB0aGUgaGVhZFxuICAgIHRoaXMuaGVhZC5zY2FsZS5tdWx0aXBseVNjYWxhcigwLjkpO1xuICAgIHRoaXMuaGVhZC5wb3NpdGlvbi5zZXQoLTAuMSwgMCwgMCk7XG4gICAgY29uc3QgaGVhZFBpdm90R3JvdXAgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcbiAgICBoZWFkUGl2b3RHcm91cC5hZGQodGhpcy5oZWFkKTtcbiAgICB0aGlzLmhlYWRHcm91cC5hZGQoaGVhZFBpdm90R3JvdXApO1xuXG4gICAgdGhpcy5oZWFkR3JvdXAuYWRkKHRoaXMuc3BvdGxpZ2h0R3JvdXApO1xuXG4gICAgLy8gQWRkIHRoZSBhcm1cbiAgICB0aGlzLmFybUdyb3VwLmFkZCh0aGlzLmhlYWRHcm91cCk7XG4gICAgdGhpcy5oZWFkR3JvdXAucG9zaXRpb24uc2V0KDAsIC0wLjYsIDApO1xuICAgIHRoaXMuYXJtR3JvdXAuYWRkKHRoaXMuYXJtKTtcblxuICAgIC8vIEFkZCB0aGUgc29ja2V0XG4gICAgdGhpcy5vYmplY3RHcm91cC5hZGQodGhpcy5hcm1Hcm91cCk7XG4gICAgdGhpcy5vYmplY3RHcm91cC5hZGQodGhpcy5zb2NrZXQpO1xuICAgIHRoaXMuc29ja2V0LnBvc2l0aW9uLnNldCgwLCAxLjIsIDApO1xuXG4gICAgLy8gQSBtb3ZpbmcgaGVhZCBoYXMgYWJvdXQgMzIgY20gaW4gd2lkdGhcbiAgICB0aGlzLm9iamVjdEdyb3VwLnNjYWxlLm11bHRpcGx5U2NhbGFyKDkpO1xuXG4gICAgdGhpcy5zY2VuZS5hZGQodGhpcy5vYmplY3RHcm91cCk7XG5cbiAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVQcmV2aWV3KGNoYW5uZWxWYWx1ZXM6IEZpeHR1cmVDaGFubmVsVmFsdWVbXSwgbWFzdGVyRGltbWVyVmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0xvYWRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLnVwZGF0ZVByZXZpZXcoY2hhbm5lbFZhbHVlcywgbWFzdGVyRGltbWVyVmFsdWUpO1xuICAgIHRoaXMudXBkYXRlUG9zaXRpb24odGhpcy5vYmplY3RHcm91cCk7XG5cbiAgICAvLyBBcHBseSBkZWZhdWx0IHNldHRpbmdzXG4gICAgbGV0IHBhblN0YXJ0ID0gMDtcbiAgICBsZXQgcGFuRW5kID0gMjU1O1xuXG4gICAgbGV0IHRpbHRTdGFydCA9IDA7XG4gICAgbGV0IHRpbHRFbmQgPSAyNTU7XG5cbiAgICB0aGlzLnBhbiA9IDA7XG4gICAgdGhpcy50aWx0ID0gMDtcblxuICAgIC8vIEFwcGx5IHRoZSBrbm93biBwcm9wZXJ0eSB2YWx1ZXNcbiAgICBmb3IgKGNvbnN0IGNoYW5uZWxWYWx1ZSBvZiBjaGFubmVsVmFsdWVzKSB7XG4gICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRDaGFubmVsQnlOYW1lKHRoaXMuZml4dHVyZSwgY2hhbm5lbFZhbHVlLmNoYW5uZWxOYW1lKTtcbiAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSB0aGlzLmdldENhcGFiaWxpdHlJblZhbHVlKGNoYW5uZWwsIGNoYW5uZWxWYWx1ZS52YWx1ZSk7XG4gICAgICBpZiAoY2FwYWJpbGl0eSkge1xuICAgICAgICBzd2l0Y2ggKGNhcGFiaWxpdHkuY2FwYWJpbGl0eS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuUGFuOiB7XG4gICAgICAgICAgICBwYW5TdGFydCA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0Um90YXRpb25BbmdsZURlZyhjYXBhYmlsaXR5LmNhcGFiaWxpdHkuYW5nbGVTdGFydCkgfHwgMDtcbiAgICAgICAgICAgIHBhbkVuZCA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0Um90YXRpb25BbmdsZURlZyhjYXBhYmlsaXR5LmNhcGFiaWxpdHkuYW5nbGVFbmQpIHx8IDU0MDtcbiAgICAgICAgICAgIHRoaXMucGFuID0gY2hhbm5lbFZhbHVlLnZhbHVlIC8gY2hhbm5lbC5tYXhWYWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5UaWx0OiB7XG4gICAgICAgICAgICB0aWx0U3RhcnQgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFJvdGF0aW9uQW5nbGVEZWcoY2FwYWJpbGl0eS5jYXBhYmlsaXR5LmFuZ2xlU3RhcnQpIHx8IDA7XG4gICAgICAgICAgICB0aWx0RW5kID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRSb3RhdGlvbkFuZ2xlRGVnKGNhcGFiaWxpdHkuY2FwYWJpbGl0eS5hbmdsZUVuZCkgfHwgMjcwMDtcbiAgICAgICAgICAgIHRoaXMudGlsdCA9IGNoYW5uZWxWYWx1ZS52YWx1ZSAvIGNoYW5uZWwubWF4VmFsdWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgdGhlIHkveCByb3RhdGlvbiBpbiByYWRpYW50cyBiYXNlZCBvbiBwYW4vdGlsdCAoMC0xKSByZXNwZWN0aW5nIHRoZSBtYXggcGFuL3RpbHRcbiAgICB0aGlzLmFybUdyb3VwLnJvdGF0aW9uLnkgPSBUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQocGFuRW5kICogdGhpcy5wYW4gKyBwYW5TdGFydCkgLSBUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQocGFuRW5kIC8gMik7XG4gICAgdGhpcy5oZWFkR3JvdXAucm90YXRpb24ueCA9IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZCh0aWx0RW5kICogdGhpcy50aWx0ICsgdGlsdFN0YXJ0KSAtIFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZCh0aWx0RW5kIC8gMik7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGFuZ2xlIG9ubHkgb24gY2hhbmdlLCBiZWNhdXNlIGl0J3MgZXhwZW5zaXZlXG4gICAgLy8gVE9ETyB1cGRhdGUgdGhlIGNvcnJlY3QgYW5nbGUgZnJvbSB0aGUgcHJvZmlsZVxuICAgIGNvbnN0IGJlYW1BbmdsZURyZWdyZWVzID0gMTQ7XG4gICAgaWYgKHRoaXMubGFzdEJlYW1BbmdsZURlZ3JlZXMgIT09IGJlYW1BbmdsZURyZWdyZWVzKSB7XG4gICAgICB0aGlzLnNwb3RMaWdodC5hbmdsZSA9IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZChiZWFtQW5nbGVEcmVncmVlcyk7XG4gICAgICB0aGlzLmxhc3RCZWFtQW5nbGVEZWdyZWVzID0gYmVhbUFuZ2xlRHJlZ3JlZXM7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBtYXRlcmlhbFxuICAgIGlmICh0aGlzLmxhc3RTZWxlY3RlZCAhPT0gdGhpcy5pc1NlbGVjdGVkKSB7XG4gICAgICBpZiAodGhpcy5pc1NlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMuc29ja2V0Lm1hdGVyaWFsID0gdGhpcy5wcmV2aWV3U2VydmljZS5maXh0dXJlU2VsZWN0ZWRNYXRlcmlhbDtcbiAgICAgICAgdGhpcy5hcm0ubWF0ZXJpYWwgPSB0aGlzLnByZXZpZXdTZXJ2aWNlLmZpeHR1cmVTZWxlY3RlZE1hdGVyaWFsO1xuICAgICAgICB0aGlzLmhlYWQubWF0ZXJpYWwgPSB0aGlzLnByZXZpZXdTZXJ2aWNlLmZpeHR1cmVTZWxlY3RlZE1hdGVyaWFsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zb2NrZXQubWF0ZXJpYWwgPSB0aGlzLnByZXZpZXdTZXJ2aWNlLmZpeHR1cmVNYXRlcmlhbDtcbiAgICAgICAgdGhpcy5hcm0ubWF0ZXJpYWwgPSB0aGlzLnByZXZpZXdTZXJ2aWNlLmZpeHR1cmVNYXRlcmlhbDtcbiAgICAgICAgdGhpcy5oZWFkLm1hdGVyaWFsID0gdGhpcy5wcmV2aWV3U2VydmljZS5maXh0dXJlTWF0ZXJpYWw7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGFzdFNlbGVjdGVkID0gdGhpcy5pc1NlbGVjdGVkO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5zY2VuZS5yZW1vdmUodGhpcy5vYmplY3RHcm91cCk7XG4gIH1cbn1cbiJdfQ==