@smarterplan/ngx-smarterplan-core 1.4.17 → 1.4.18

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 (98) hide show
  1. package/README.md +24 -24
  2. package/esm2022/lib/components/csv-export/csv-export.component.mjs +3 -3
  3. package/esm2022/lib/components/loader/loader.component.mjs +3 -3
  4. package/esm2022/lib/components/menu-bar/avatar/avatar.component.mjs +1 -1
  5. package/esm2022/lib/components/menu-bar/menu-bar.component.mjs +3 -3
  6. package/esm2022/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +3 -3
  7. package/esm2022/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +3 -3
  8. package/esm2022/lib/components/search-bar/search-bar.component.mjs +3 -3
  9. package/esm2022/lib/components/support-modal/support-modal.component.mjs +3 -3
  10. package/esm2022/lib/config.mjs +1 -1
  11. package/esm2022/lib/helpers.service.mjs +1 -1
  12. package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +1 -1
  13. package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +1 -1
  14. package/esm2022/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +1 -1
  15. package/esm2022/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +1 -1
  16. package/esm2022/lib/matterport-extensions/scene-component/SceneComponent.mjs +1 -1
  17. package/esm2022/lib/matterport-extensions/security-camera/SecurityCamera.mjs +22 -22
  18. package/esm2022/lib/matterport-extensions/tv-player/TvPlayer.mjs +1 -1
  19. package/esm2022/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +22 -22
  20. package/esm2022/lib/mattertagData.mjs +10 -1
  21. package/esm2022/lib/ngx-smarterplan-core.module.mjs +1 -1
  22. package/esm2022/lib/ngx-smarterplan-core.service.mjs +1 -1
  23. package/esm2022/lib/pipes/duration-to-string.pipe.mjs +1 -1
  24. package/esm2022/lib/pipes/format-date-number-to-digits.pipe.mjs +1 -1
  25. package/esm2022/lib/pipes/hashtag-from-id.pipe.mjs +1 -1
  26. package/esm2022/lib/pipes/safe-url.pipe.mjs +1 -1
  27. package/esm2022/lib/pipes/time-date-to-local-string.pipe.mjs +1 -1
  28. package/esm2022/lib/pipes/username-from-id.pipe.mjs +1 -1
  29. package/esm2022/lib/services/amplify-cache.service.mjs +1 -1
  30. package/esm2022/lib/services/base-tab.service.mjs +1 -1
  31. package/esm2022/lib/services/baseVisibility.service.mjs +1 -1
  32. package/esm2022/lib/services/content.service.mjs +1 -1
  33. package/esm2022/lib/services/filter.service.mjs +1 -1
  34. package/esm2022/lib/services/intervention.service.mjs +1 -1
  35. package/esm2022/lib/services/locale.service.mjs +1 -1
  36. package/esm2022/lib/services/matterport-import.service.mjs +10 -3
  37. package/esm2022/lib/services/matterport-measurement.service.mjs +1 -1
  38. package/esm2022/lib/services/matterport-navigation.service.mjs +1 -1
  39. package/esm2022/lib/services/matterport-object3d.service.mjs +1 -1
  40. package/esm2022/lib/services/matterport-pointer.service.mjs +6 -6
  41. package/esm2022/lib/services/matterport-tag-copy.service.mjs +455 -9
  42. package/esm2022/lib/services/matterport-tag.service.mjs +99 -10
  43. package/esm2022/lib/services/matterport.service.mjs +83 -48
  44. package/esm2022/lib/services/models/affectation.service.mjs +1 -1
  45. package/esm2022/lib/services/models/base-object.service.mjs +1 -1
  46. package/esm2022/lib/services/models/capture.service.mjs +1 -1
  47. package/esm2022/lib/services/models/comment.service.mjs +1 -1
  48. package/esm2022/lib/services/models/domain.service.mjs +1 -1
  49. package/esm2022/lib/services/models/equipment.service.mjs +1 -1
  50. package/esm2022/lib/services/models/event.service.mjs +1 -1
  51. package/esm2022/lib/services/models/feature.service.mjs +1 -1
  52. package/esm2022/lib/services/models/hashtag.service.mjs +1 -1
  53. package/esm2022/lib/services/models/layer.service.mjs +1 -1
  54. package/esm2022/lib/services/models/measurement.service.mjs +1 -1
  55. package/esm2022/lib/services/models/mission.service.mjs +1 -1
  56. package/esm2022/lib/services/models/navigation.service.mjs +1 -1
  57. package/esm2022/lib/services/models/node.service.mjs +1 -1
  58. package/esm2022/lib/services/models/object3D.service.mjs +1 -1
  59. package/esm2022/lib/services/models/operation.service.mjs +1 -1
  60. package/esm2022/lib/services/models/organisation.service.mjs +1 -1
  61. package/esm2022/lib/services/models/plan.service.mjs +1 -1
  62. package/esm2022/lib/services/models/poi.service.mjs +62 -50
  63. package/esm2022/lib/services/models/profile.service.mjs +1 -1
  64. package/esm2022/lib/services/models/property.service.mjs +1 -1
  65. package/esm2022/lib/services/models/space.service.mjs +1 -1
  66. package/esm2022/lib/services/models/template.service.mjs +1 -1
  67. package/esm2022/lib/services/models/ticket.service.mjs +1 -1
  68. package/esm2022/lib/services/models/visit.service.mjs +1 -1
  69. package/esm2022/lib/services/models/zone.service.mjs +9 -5
  70. package/esm2022/lib/services/navigator.service.mjs +1 -1
  71. package/esm2022/lib/services/s3.service.mjs +1 -1
  72. package/esm2022/lib/services/search.service.mjs +1 -1
  73. package/esm2022/lib/services/support.service.mjs +1 -1
  74. package/esm2022/lib/services/tag.service.mjs +16 -16
  75. package/esm2022/lib/services/threejs-import.service.mjs +1 -1
  76. package/esm2022/lib/services/threejs.service.mjs +1 -1
  77. package/esm2022/lib/services/user.service.mjs +1 -1
  78. package/esm2022/lib/services/utils/matterport-transform.util.mjs +1 -1
  79. package/esm2022/lib/services/validators.service.mjs +1 -1
  80. package/esm2022/lib/services/viewer.service.mjs +1 -1
  81. package/esm2022/lib/services/zone-drawer.service.mjs +1 -1
  82. package/esm2022/lib/services/zoneChange.service.mjs +1 -1
  83. package/esm2022/lib/tokens/matterport-sdk-key.token.mjs +1 -1
  84. package/esm2022/lib/types.service.mjs +1 -1
  85. package/esm2022/lib/validators/email.directive.mjs +1 -1
  86. package/esm2022/lib/validators/no-empty.directive.mjs +1 -1
  87. package/esm2022/lib/validators/number.directive.mjs +1 -1
  88. package/esm2022/lib/validators/text.directive.mjs +1 -1
  89. package/esm2022/public-api.mjs +1 -1
  90. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +793 -193
  91. package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
  92. package/lib/mattertagData.d.ts +4 -0
  93. package/lib/services/matterport-tag-copy.service.d.ts +128 -2
  94. package/lib/services/matterport-tag.service.d.ts +24 -1
  95. package/lib/services/matterport.service.d.ts +12 -3
  96. package/lib/services/models/poi.service.d.ts +1 -0
  97. package/package.json +1 -1
  98. package/src/assets/vs-app.json +67 -67
@@ -52,6 +52,10 @@ export declare class MattertagData {
52
52
  b: number;
53
53
  };
54
54
  };
55
+ /**
56
+ * Safely retrieves the display name depending on object properties (name, title)
57
+ */
58
+ getDisplayName(): string;
55
59
  /**
56
60
  * Get the descriptor for sdk.Tag.add(...descriptor)
57
61
  * Format : [{ label, description, anchorPosition, stemVector, color, id? }]
@@ -1,5 +1,6 @@
1
1
  import { BehaviorSubject } from 'rxjs';
2
2
  import { TranslateService } from '@ngx-translate/core';
3
+ import { POI } from '../types.service';
3
4
  import { NavigationService } from './models/navigation.service';
4
5
  import { PoiService } from './models/poi.service';
5
6
  import { TicketsService } from './models/ticket.service';
@@ -12,12 +13,13 @@ import { HashtagService } from './models/hashtag.service';
12
13
  import { MissionService } from './models/mission.service';
13
14
  import { OperationService } from './models/operation.service';
14
15
  import { DomainService } from './models/domain.service';
16
+ import { ZoneService } from './models/zone.service';
15
17
  import { BaseUserService } from './user.service';
16
18
  import { Vec3 } from './utils/matterport-transform.util';
17
19
  import * as i0 from "@angular/core";
18
20
  /** Progress snapshot emitted during copyTagsFromVisit(), so the UI can show a live status. */
19
21
  export interface CopyProgress {
20
- phase: 'collecting' | 'tickets' | 'equipments' | 'pois' | 'objects3d' | 'features' | 'measurements' | 'done';
22
+ phase: 'collecting' | 'tickets' | 'equipments' | 'pois' | 'objects3d' | 'features' | 'measurements' | 'recalibrating' | 'done';
21
23
  processedInPhase: number;
22
24
  totalInPhase: number;
23
25
  processedOverall: number;
@@ -36,6 +38,44 @@ export interface CopyLogEntry {
36
38
  type: 'step' | 'error' | 'healed';
37
39
  text: string;
38
40
  }
41
+ /** A tag listed for recalibration, with what the UI needs to identify it. */
42
+ export type RecalibrationTag = POI & {
43
+ elementName: string;
44
+ elementDescription?: string;
45
+ /** pass to getTagImageUrl() to get a displayable (signed) URL */
46
+ elementImageKey?: string;
47
+ /** floor zone (layer FLOOR) of the tag's sweep in the target space */
48
+ floorName?: string;
49
+ /** most specific other zone of the tag's sweep in the target space */
50
+ zoneName?: string;
51
+ };
52
+ /**
53
+ * Which tags of a space (location) a recalibration lists. A tag belongs to a location (the
54
+ * space of the element it points at; a standalone tag belongs to every location showing it)
55
+ * and is displayed in one or several virtual visits of that location. Tags of another
56
+ * location are never listed, even when both locations use the same visit.
57
+ * - SPACE: every tag of the location, whichever of its visits it sits in;
58
+ * - VISIT: the tags of the location placed on the sweeps of the selected visit.
59
+ */
60
+ export type RecalibrationTagScope = 'SPACE' | 'VISIT';
61
+ /** Both lists getRecalibrationTagSets() offers, see there. */
62
+ export interface RecalibrationTagSets {
63
+ space: RecalibrationTag[];
64
+ visit: RecalibrationTag[];
65
+ }
66
+ export interface RecalibrationTagOptions {
67
+ /** Node of the selected target visit (visit.node.id): drives the VISIT list. */
68
+ targetNodeId?: string | null;
69
+ /** Only keep the tags that also exist in the source location (ignored when source = target). */
70
+ onlyTagsInSource?: boolean;
71
+ }
72
+ /** Outcome of recalibrateTagsFromVisit(): how many of the selected tags were moved. */
73
+ export interface RecalibrationResult {
74
+ updated: number;
75
+ /** selected tags not found anymore, or without a position to move */
76
+ skipped: number;
77
+ failed: number;
78
+ }
39
79
  export declare class MatterportTagCopyService {
40
80
  private navigationService;
41
81
  private userService;
@@ -51,6 +91,7 @@ export declare class MatterportTagCopyService {
51
91
  private operationService;
52
92
  private domainService;
53
93
  private translate;
94
+ private zoneService;
54
95
  copyProgress$: BehaviorSubject<CopyProgress | null>;
55
96
  copyLog$: BehaviorSubject<CopyLogEntry[]>;
56
97
  private spModule;
@@ -91,7 +132,7 @@ export declare class MatterportTagCopyService {
91
132
  private targetDomainIdsByTypeAndName;
92
133
  /** Target space id of the run in progress — used to re-home copied tag icons. */
93
134
  private targetSpaceId;
94
- constructor(navigationService: NavigationService, userService: BaseUserService, poiService: PoiService, ticketService: TicketsService, equipmentService: EquipmentService, object3DService: Object3DService, featureService: FeatureService, measurementService: MeasurementService, commentService: CommentService, hashtagService: HashtagService, missionService: MissionService, operationService: OperationService, domainService: DomainService, translate: TranslateService);
135
+ constructor(navigationService: NavigationService, userService: BaseUserService, poiService: PoiService, ticketService: TicketsService, equipmentService: EquipmentService, object3DService: Object3DService, featureService: FeatureService, measurementService: MeasurementService, commentService: CommentService, hashtagService: HashtagService, missionService: MissionService, operationService: OperationService, domainService: DomainService, translate: TranslateService, zoneService: ZoneService);
95
136
  copyTagsFromVisit(sourceSpaceId: string, targetSpaceId: string, landmarkSourceA: Vec3, landmarkTargetA: Vec3, landmarkSourceB: Vec3, landmarkTargetB: Vec3): Promise<boolean>;
96
137
  /**
97
138
  * Serialises the current copy log (step lines as last emitted, plus every error and
@@ -362,6 +403,13 @@ export declare class MatterportTagCopyService {
362
403
  private buildNavigationPositionMap;
363
404
  /** Applies the rigid transform to a POI coordinate (position + orientation). */
364
405
  private getAdjustedCoordinates;
406
+ /**
407
+ * Reads a stored coordinate (JSON string or object, whatever its spacing) as a position.
408
+ * Null for a virtual POI or an unreadable value.
409
+ */
410
+ private parseCoordinate;
411
+ /** Two positions within 1 cm are the same (two virtual POIs, both null, are too). */
412
+ private isSamePosition;
365
413
  /**
366
414
  * Applies the rigid transform's translation+rotation to a plain {x,y,z} position,
367
415
  * WITHOUT adding xRotation/yRotation keys. Used for measurements, whose stored
@@ -425,6 +473,84 @@ export declare class MatterportTagCopyService {
425
473
  * existed on S3, resulting in a NoSuchKey error.
426
474
  */
427
475
  private extractS3KeyFromValue;
476
+ /**
477
+ * Both tag lists a recalibration can offer for a target space, computed in one pass. Only
478
+ * the target location's own tags are ever listed (see RecalibrationTagScope); tags whose
479
+ * element was deleted — orphan POIs — never are.
480
+ * - `space`: every tag of the location, in any of its visits;
481
+ * - `visit`: the tags of the location sitting on the sweeps of the selected target visit
482
+ * (`options.targetNodeId`); empty when no visit is given.
483
+ * With `options.onlyTagsInSource` and a source other than the target, both lists only keep
484
+ * the tags that also exist in the source location (same identity as the copy's duplicate
485
+ * detection): typically the tags an earlier copy brought over.
486
+ *
487
+ * A POI carries no name of its own: each tag gets `elementName`, the name of the element
488
+ * it points at (ticket title, equipment name, ...).
489
+ */
490
+ getRecalibrationTagSets(sourceSpaceId: string, targetSpaceId: string, options?: RecalibrationTagOptions): Promise<RecalibrationTagSets>;
491
+ /**
492
+ * Signed, displayable URL of a tag's picture (`elementImageKey`). Meant to be called on
493
+ * demand — when the tag is previewed — rather than for the whole list.
494
+ */
495
+ getTagImageUrl(imageKey: string): Promise<string | null>;
496
+ /**
497
+ * Loads the POIs placed on the sweeps of a space whose element still exists, each with a
498
+ * display name, an identity key and whether its element belongs to that space. The key
499
+ * follows the same rules as the copy's duplicate detection (findExisting), so a tag and its
500
+ * copy in another space share the same key. With a visit node, `inVisit` tells whether the
501
+ * tag sits on one of that visit's sweeps.
502
+ */
503
+ private loadLiveTagsForSpace;
504
+ /**
505
+ * Sweeps of a virtual visit (a Node): those of the space's zones attached to that node,
506
+ * else — zones not filled in for this visit — the sweeps of the node's navigations.
507
+ */
508
+ private getSweepsOfVisit;
509
+ /**
510
+ * Maps each sweep of a space to the names of its floor (zone of layer FLOOR) and of its
511
+ * most specific other zone (the one holding the fewest sweeps, typically a room, else the
512
+ * visit's BUILDING zone).
513
+ */
514
+ private getSweepZones;
515
+ /**
516
+ * Indexes, by ID, every element of a space a POI can point at. Each list is fetched
517
+ * independently: one failing (module not enabled, missing permission) must not hide the
518
+ * others — their POIs are then resolved one by one by fetchTagElementsById().
519
+ */
520
+ private getTagElementsForSpace;
521
+ /**
522
+ * Fetches by ID the elements the space-wide lists did not return. The IDs are packed into
523
+ * a few GraphQL requests using aliases (`e0: getTicket(id: ...) e1: getEquipment(...)`),
524
+ * instead of one request per element: a space can hold over a thousand orphan POIs.
525
+ * An element that no longer exists comes back as null and is simply not indexed.
526
+ */
527
+ private fetchTagElementsById;
528
+ /**
529
+ * Moves a stored coordinate. Only the position and the horizontal orientation change:
530
+ * every other key is kept as is. A coordinate often carries the tag's orientation next to
531
+ * its position ({x, y, z, xRotation, yRotation}); rebuilding it from the position alone
532
+ * silently erased that orientation.
533
+ */
534
+ private getRecalibratedCoordinate;
535
+ /**
536
+ * Reads POIs by ID, 100 per GraphQL request (aliases). Missing POIs are skipped. Amplify
537
+ * rejects a request when ANY alias errors, but still hands over the data of the others:
538
+ * those are kept, so one unreadable POI does not hide the 99 others of its batch.
539
+ */
540
+ private fetchPoisById;
541
+ private tagElementTypeOf;
542
+ /** Display name + identity fields of an element, per the copy's duplicate-detection rules. */
543
+ private toTagElement;
544
+ private stripHtml;
545
+ /**
546
+ * Recalibrates a specific list of existing tags in the target space by applying the rigid
547
+ * transformation calculated from the selected landmark points.
548
+ *
549
+ * Each tag is updated on its own: a failing update is logged and counted, it no longer
550
+ * stops the remaining tags. Progress and log go through copyProgress$ / copyLog$, like a
551
+ * copy (phase 'recalibrating'). `tagLabels` (tag id -> name) only makes the log readable.
552
+ */
553
+ recalibrateTagsFromVisit(targetSpaceId: string, selectedTagIds: string[], landmarkSourceA: Vec3, landmarkTargetA: Vec3, landmarkSourceB: Vec3, landmarkTargetB: Vec3, tagLabels?: Record<string, string>): Promise<RecalibrationResult>;
428
554
  static ɵfac: i0.ɵɵFactoryDeclaration<MatterportTagCopyService, never>;
429
555
  static ɵprov: i0.ɵɵInjectableDeclaration<MatterportTagCopyService>;
430
556
  }
@@ -18,6 +18,13 @@ export declare class MatterportTagService {
18
18
  tagService: BaseTagService | null;
19
19
  private tagsCurrentOpacity;
20
20
  private tagsCurrentEnabled;
21
+ /** tagId -> icon name last applied, so an unchanged icon is not re-applied. */
22
+ private tagsCurrentIcon;
23
+ /** Ids of the global SDK Tag collection, and the tags waiting to appear in it, see waitForTagInSdk(). */
24
+ private sdkTagIds;
25
+ private sdkTagWaiters;
26
+ private sdkTagSubscription;
27
+ private sdkTagSubscriptionSdk;
21
28
  /**
22
29
  * Single layer holding every Smarterplan tag, added to every view of the space so a
23
30
  * tag stays in place — same sid, same content — when the user switches between the
@@ -45,9 +52,25 @@ export declare class MatterportTagService {
45
52
  * A layer-scoped Tag module only exposes the *replayable* mutations, meant to build
46
53
  * the layer's own content; applying them to an already-created tag silently does
47
54
  * nothing — which is what left every pin white instead of carrying its icon. Only
48
- * `add` has to go through the layer, see getTagCreationModule().
55
+ * `add` has to go through the layer, see getTagCreationModule(). The global module
56
+ * only knows a layer-created pin once it is rendered: see waitForTagInSdk().
49
57
  */
50
58
  getTagModule(sdk: any, tagId: string): any;
59
+ /** Icon name last applied to a tag, if any. */
60
+ getCachedTagIcon(tagId: string): string | undefined;
61
+ /** Applies an icon to a tag through its own module and remembers it on success. */
62
+ editTagIcon(sdk: any, tagId: string, iconName: string): Promise<void>;
63
+ /**
64
+ * Resolves once the global SDK Tag collection — the one edits go through — contains the
65
+ * tag, so edits do not hit a pin that is not rendered yet ("setPinRenderOverrides on a pin
66
+ * that doesn't exist"). Gives up after `timeoutMs` and resolves anyway; falls back to a
67
+ * short wait when the collection cannot be observed. One subscription is shared by every
68
+ * waiting tag: a space loads hundreds of them.
69
+ */
70
+ private waitForTagInSdk;
71
+ /** Keeps sdkTagIds in sync with the global SDK Tag collection; false when it cannot be observed. */
72
+ private observeSdkTags;
73
+ private stopObservingSdkTags;
51
74
  /**
52
75
  * Returns the Tag module every new tag must be created through: the shared layer
53
76
  * when the View API is available, the global sdk.Tag otherwise.
@@ -106,6 +106,12 @@ export declare class MatterportService {
106
106
  }>;
107
107
  /** Views (furnished, defurnished...) exposed by the SDK for the current space. */
108
108
  private viewsByType;
109
+ /** Settles once every static icon texture has been registered (or failed). */
110
+ private iconsRegistered;
111
+ /** Names of the textures successfully registered in the current SDK session. */
112
+ private registeredIcons;
113
+ /** tagId -> signed source last registered as a custom texture, and its texture name. */
114
+ private customIconCache;
109
115
  private currentView;
110
116
  private viewSubscriptions;
111
117
  /** Emits the active view every time the user switches between furnished/defurnished. */
@@ -193,11 +199,14 @@ export declare class MatterportService {
193
199
  addNewIconAndSetForTag(mattertagID: string, iconPath: string): Promise<void>;
194
200
  /** Applies a pre-registered icon to a Mattertag. */
195
201
  setRegistredIconForTag(mattertagID: string, iconName: string): Promise<void>;
196
- /** Sets the appropriate icon and opacity for a tag based on its type and POI metadata. */
202
+ /** Registers a static texture and remembers its name once the SDK accepted it. */
203
+ private registerIcon;
204
+ /** Sets the appropriate icon for a tag based on its type and POI metadata. */
197
205
  setTagIconAndOpacity(mattertagID: string, mattertagData: MattertagData): Promise<void>;
198
206
  /**
199
- * Applies an icon to a tag. The call is awaited and its rejection reported: a
200
- * silently dropped promise here leaves the pin with its default white look.
207
+ * Applies an icon to a tag, unless that icon is already the one applied. The call is
208
+ * awaited and its rejection reported: a silently dropped promise here leaves the pin
209
+ * with its default white look.
201
210
  */
202
211
  private editTagIcon;
203
212
  /** Navigates the camera to the most recently created tag. */
@@ -33,6 +33,7 @@ export declare class PoiService {
33
33
  * splitting keeps each request well within safe limits regardless of space size.
34
34
  */
35
35
  getPoisByMatterportSweeps(sweeps: string[]): Promise<POI[]>;
36
+ private scanPoisForSweepChunk;
36
37
  unsubscribe(): void;
37
38
  static ɵfac: i0.ɵɵFactoryDeclaration<PoiService, never>;
38
39
  static ɵprov: i0.ɵɵInjectableDeclaration<PoiService>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smarterplan/ngx-smarterplan-core",
3
- "version": "1.4.17",
3
+ "version": "1.4.18",
4
4
  "dependencies": {
5
5
  "tslib": "^2.5.0"
6
6
  },
@@ -1,67 +1,67 @@
1
- {
2
- "version": "1.0",
3
- "payload": {
4
- "objects": [
5
- {
6
- "name": "slot_camera",
7
- "position": {
8
- "x": 2.8,
9
- "y": 2.4,
10
- "z": 10.71
11
- },
12
- "rotation": {
13
- "x": 0,
14
- "y": -22,
15
- "z": 0
16
- },
17
- "scale": {
18
- "x": 1,
19
- "y": 1,
20
- "z": 1
21
- },
22
- "components": [
23
- {
24
- "type": "mp.gltfLoader",
25
- "inputs": {
26
- "url": "https://static.matterport.com/showcase-sdk/examples/assets-1.0-2-g6b74572/assets/models/camera-1/scene.gltf",
27
- "localScale": { "x": 0.0008, "y": 0.0008, "z": 0.0008 },
28
- "localRotation": { "x": 0, "y": 90, "z": 0 }
29
- },
30
- "events": {
31
- "INTERACTION.CLICK": false,
32
- "INTERACTION.HOVER": false,
33
- "INTERACTION.DRAG": false
34
- }
35
- },
36
- {
37
- "type": "mp.securityCamera",
38
- "inputs": {
39
- "nearPlane": 0.1,
40
- "farPlane": 10,
41
- "horizontalFOV": 52,
42
- "aspect": 1.7777777777777777,
43
- "localPosition": {
44
- "x": 0,
45
- "y": 0.18,
46
- "z": -0.3
47
- },
48
- "localRotation": {
49
- "x": -15,
50
- "y": 0,
51
- "z": 0
52
- },
53
- "color": 65280,
54
- "panPeriod": 5,
55
- "panAngle": -45
56
- },
57
- "events": {
58
- "INTERACTION.CLICK": false,
59
- "INTERACTION.HOVER": false,
60
- "INTERACTION.DRAG": false
61
- }
62
- }
63
- ]
64
- }
65
- ]
66
- }
67
- }
1
+ {
2
+ "version": "1.0",
3
+ "payload": {
4
+ "objects": [
5
+ {
6
+ "name": "slot_camera",
7
+ "position": {
8
+ "x": 2.8,
9
+ "y": 2.4,
10
+ "z": 10.71
11
+ },
12
+ "rotation": {
13
+ "x": 0,
14
+ "y": -22,
15
+ "z": 0
16
+ },
17
+ "scale": {
18
+ "x": 1,
19
+ "y": 1,
20
+ "z": 1
21
+ },
22
+ "components": [
23
+ {
24
+ "type": "mp.gltfLoader",
25
+ "inputs": {
26
+ "url": "https://static.matterport.com/showcase-sdk/examples/assets-1.0-2-g6b74572/assets/models/camera-1/scene.gltf",
27
+ "localScale": { "x": 0.0008, "y": 0.0008, "z": 0.0008 },
28
+ "localRotation": { "x": 0, "y": 90, "z": 0 }
29
+ },
30
+ "events": {
31
+ "INTERACTION.CLICK": false,
32
+ "INTERACTION.HOVER": false,
33
+ "INTERACTION.DRAG": false
34
+ }
35
+ },
36
+ {
37
+ "type": "mp.securityCamera",
38
+ "inputs": {
39
+ "nearPlane": 0.1,
40
+ "farPlane": 10,
41
+ "horizontalFOV": 52,
42
+ "aspect": 1.7777777777777777,
43
+ "localPosition": {
44
+ "x": 0,
45
+ "y": 0.18,
46
+ "z": -0.3
47
+ },
48
+ "localRotation": {
49
+ "x": -15,
50
+ "y": 0,
51
+ "z": 0
52
+ },
53
+ "color": 65280,
54
+ "panPeriod": 5,
55
+ "panAngle": -45
56
+ },
57
+ "events": {
58
+ "INTERACTION.CLICK": false,
59
+ "INTERACTION.HOVER": false,
60
+ "INTERACTION.DRAG": false
61
+ }
62
+ }
63
+ ]
64
+ }
65
+ ]
66
+ }
67
+ }