architwin 1.0.19 → 1.0.20
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/lib/architwin.js +1750 -0
- package/lib/architwin.min.js +1 -2
- package/lib/types.js +1 -0
- package/package.json +5 -6
- package/tsconfig.json +2 -2
- package/webpack.config.js +1 -4
- package/index.js +0 -40
package/lib/architwin.js
ADDED
|
@@ -0,0 +1,1750 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
+
function step(op) {
|
|
15
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
+
switch (op[0]) {
|
|
20
|
+
case 0: case 1: t = op; break;
|
|
21
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
+
default:
|
|
25
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
+
if (t[2]) _.ops.pop();
|
|
30
|
+
_.trys.pop(); continue;
|
|
31
|
+
}
|
|
32
|
+
op = body.call(thisArg, _);
|
|
33
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
import axios from "axios";
|
|
38
|
+
import { distance } from "mathjs";
|
|
39
|
+
// @ts-ignore
|
|
40
|
+
// import * as _config from './config.json'
|
|
41
|
+
import JSZip from "jszip";
|
|
42
|
+
import JSZipUtils from "jszip-utils";
|
|
43
|
+
var _config = {
|
|
44
|
+
aws: {
|
|
45
|
+
region: "ap-northeast-1",
|
|
46
|
+
accessKeyId: "AKIAVVUXZ66KW7GBSW7A",
|
|
47
|
+
secretAccessKey: "fpJd3lBEERU1fWZ/TXhWz5muK1KI5GqLtljkNuK4'",
|
|
48
|
+
},
|
|
49
|
+
mp: {
|
|
50
|
+
sdkKey: "a3ae8341bd8f44899eba16df86307d7d",
|
|
51
|
+
urlParams: [
|
|
52
|
+
"help",
|
|
53
|
+
"play",
|
|
54
|
+
"nt",
|
|
55
|
+
"play",
|
|
56
|
+
"qs",
|
|
57
|
+
"brand",
|
|
58
|
+
"dh",
|
|
59
|
+
"tour",
|
|
60
|
+
"gt",
|
|
61
|
+
"hr",
|
|
62
|
+
"mls",
|
|
63
|
+
"mt",
|
|
64
|
+
"tagNav",
|
|
65
|
+
"pin",
|
|
66
|
+
"portal",
|
|
67
|
+
"f",
|
|
68
|
+
"fp",
|
|
69
|
+
"lang",
|
|
70
|
+
"kb",
|
|
71
|
+
"lp",
|
|
72
|
+
"st",
|
|
73
|
+
"title",
|
|
74
|
+
"tourcta",
|
|
75
|
+
"wts",
|
|
76
|
+
"ts",
|
|
77
|
+
"hl",
|
|
78
|
+
"vr",
|
|
79
|
+
"nozoom",
|
|
80
|
+
"search",
|
|
81
|
+
"wh",
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
var apiURL = "http://localhost:5173/api/v1/";
|
|
86
|
+
var sdkKey = _config.mp.sdkKey;
|
|
87
|
+
var urlParams = _config.mp.urlParams;
|
|
88
|
+
console.log("apiURL...", apiURL);
|
|
89
|
+
// start here
|
|
90
|
+
var _api = {};
|
|
91
|
+
var _space = {};
|
|
92
|
+
var _atwin = {};
|
|
93
|
+
var _tags = [];
|
|
94
|
+
var tags = [];
|
|
95
|
+
var sweeps = [];
|
|
96
|
+
var _allSlideShow = [];
|
|
97
|
+
var _slideShowImage = [];
|
|
98
|
+
var _currentSlideShowID = 0;
|
|
99
|
+
var _currentSlideIndex = 0;
|
|
100
|
+
var _currentSlideShow = null;
|
|
101
|
+
var _timer = null;
|
|
102
|
+
var _videos = [];
|
|
103
|
+
var _currentViewMode = "";
|
|
104
|
+
var _3DXObject = [];
|
|
105
|
+
var _unrenderedObjects = [];
|
|
106
|
+
var _transformControlNode;
|
|
107
|
+
var _inputControlComponent = null;
|
|
108
|
+
var _selectedObject = {};
|
|
109
|
+
var previousTimestamp = 0;
|
|
110
|
+
var _currentSweep = {};
|
|
111
|
+
var _currentCameraPose = {};
|
|
112
|
+
var _sweeps = [];
|
|
113
|
+
// end here
|
|
114
|
+
var _atwinSrc = "/bundle/showcase.html?m=''&applicationKey=".concat(sdkKey, "&newtags=1");
|
|
115
|
+
// =========================================== INITIALIZATION ===========================================
|
|
116
|
+
// initialization: loginUser, iframe, space, tags, objects
|
|
117
|
+
function connectSpace(url, auth, config) {
|
|
118
|
+
var _a;
|
|
119
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
120
|
+
var api, showcase, spaceId, space, tags, objects, showcaseWindow;
|
|
121
|
+
var _this = this;
|
|
122
|
+
return __generator(this, function (_b) {
|
|
123
|
+
switch (_b.label) {
|
|
124
|
+
case 0:
|
|
125
|
+
console.log("connectSpace()");
|
|
126
|
+
console.log("__config", config);
|
|
127
|
+
api = axios.create({
|
|
128
|
+
baseURL: apiURL,
|
|
129
|
+
headers: {
|
|
130
|
+
"Access-Control-Allow-Origin": "*",
|
|
131
|
+
"Content-Type": "application/json",
|
|
132
|
+
Authorization: auth.apiKey,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
_api = api;
|
|
136
|
+
showcase = document.getElementById(config.iframeId);
|
|
137
|
+
spaceId = getSpaceId(url);
|
|
138
|
+
if (!spaceId) {
|
|
139
|
+
console.error("spaceId is undefined");
|
|
140
|
+
return [2 /*return*/];
|
|
141
|
+
}
|
|
142
|
+
return [4 /*yield*/, loginUser(auth.user)];
|
|
143
|
+
case 1:
|
|
144
|
+
_b.sent();
|
|
145
|
+
return [4 /*yield*/, getSpace(spaceId)];
|
|
146
|
+
case 2:
|
|
147
|
+
space = _b.sent();
|
|
148
|
+
if (!space) {
|
|
149
|
+
console.error("space is undefined");
|
|
150
|
+
return [2 /*return*/];
|
|
151
|
+
}
|
|
152
|
+
setSpace(space);
|
|
153
|
+
_atwinSrc = getIframeSrc(config);
|
|
154
|
+
console.log("__atwinSrc", _atwinSrc);
|
|
155
|
+
showcase.src = _atwinSrc;
|
|
156
|
+
return [4 /*yield*/, getTags(space)];
|
|
157
|
+
case 3:
|
|
158
|
+
tags = _b.sent();
|
|
159
|
+
if (!tags) {
|
|
160
|
+
console.log("tags is undefined");
|
|
161
|
+
return [2 /*return*/];
|
|
162
|
+
}
|
|
163
|
+
setTags(tags);
|
|
164
|
+
return [4 /*yield*/, get3DObjects(spaceId)];
|
|
165
|
+
case 4:
|
|
166
|
+
objects = _b.sent();
|
|
167
|
+
if (!objects) {
|
|
168
|
+
console.log("objects is undefined");
|
|
169
|
+
return [2 /*return*/];
|
|
170
|
+
}
|
|
171
|
+
//setObjects(objects);
|
|
172
|
+
(_a = showcase.contentWindow) === null || _a === void 0 ? void 0 : _a.location.reload(); // force reload iframe
|
|
173
|
+
showcaseWindow = showcase.contentWindow;
|
|
174
|
+
showcase.addEventListener("load", function () { return __awaiter(_this, void 0, void 0, function () {
|
|
175
|
+
var e_1;
|
|
176
|
+
return __generator(this, function (_a) {
|
|
177
|
+
switch (_a.label) {
|
|
178
|
+
case 0:
|
|
179
|
+
console.log('iframe.addEventListener("load")');
|
|
180
|
+
console.log("showcaseWindow", showcaseWindow);
|
|
181
|
+
_a.label = 1;
|
|
182
|
+
case 1:
|
|
183
|
+
_a.trys.push([1, 3, , 4]);
|
|
184
|
+
return [4 /*yield*/, showcaseWindow.MP_SDK.connect(showcaseWindow)];
|
|
185
|
+
case 2:
|
|
186
|
+
_atwin = _a.sent();
|
|
187
|
+
console.log("Hello Bundle SDK", _atwin);
|
|
188
|
+
onShowcaseConnect();
|
|
189
|
+
return [3 /*break*/, 4];
|
|
190
|
+
case 3:
|
|
191
|
+
e_1 = _a.sent();
|
|
192
|
+
console.error(e_1);
|
|
193
|
+
return [3 /*break*/, 4];
|
|
194
|
+
case 4: return [2 /*return*/];
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
}); });
|
|
198
|
+
return [2 /*return*/];
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
// start here
|
|
204
|
+
// After connectSpace it will render: tags, objects, and listeners
|
|
205
|
+
function onShowcaseConnect() {
|
|
206
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
207
|
+
var modelData, e_2;
|
|
208
|
+
var _this = this;
|
|
209
|
+
return __generator(this, function (_a) {
|
|
210
|
+
switch (_a.label) {
|
|
211
|
+
case 0:
|
|
212
|
+
console.log("onShowcaseConnect()");
|
|
213
|
+
_a.label = 1;
|
|
214
|
+
case 1:
|
|
215
|
+
_a.trys.push([1, 3, , 4]);
|
|
216
|
+
return [4 /*yield*/, _atwin.Model.getData()];
|
|
217
|
+
case 2:
|
|
218
|
+
modelData = _a.sent();
|
|
219
|
+
console.log("Model sid:" + modelData.sid);
|
|
220
|
+
_atwin.App.state.subscribe(function (appState) { return __awaiter(_this, void 0, void 0, function () {
|
|
221
|
+
return __generator(this, function (_a) {
|
|
222
|
+
switch (_a.label) {
|
|
223
|
+
case 0:
|
|
224
|
+
console.log("appState", appState);
|
|
225
|
+
if (!(appState.phase === _atwin.App.Phase.LOADING)) return [3 /*break*/, 2];
|
|
226
|
+
console.log("App is loading...");
|
|
227
|
+
return [4 /*yield*/, hideTags()];
|
|
228
|
+
case 1:
|
|
229
|
+
_a.sent();
|
|
230
|
+
return [3 /*break*/, 7];
|
|
231
|
+
case 2:
|
|
232
|
+
if (!(appState.phase === _atwin.App.Phase.STARTING)) return [3 /*break*/, 4];
|
|
233
|
+
console.log("App is starting...");
|
|
234
|
+
return [4 /*yield*/, showTags(_tags)];
|
|
235
|
+
case 3:
|
|
236
|
+
_a.sent();
|
|
237
|
+
return [3 /*break*/, 7];
|
|
238
|
+
case 4:
|
|
239
|
+
if (!(appState.phase === _atwin.App.Phase.PLAYING)) return [3 /*break*/, 7];
|
|
240
|
+
console.log("App is playing...");
|
|
241
|
+
return [4 /*yield*/, getSweeps()];
|
|
242
|
+
case 5:
|
|
243
|
+
_a.sent();
|
|
244
|
+
return [4 /*yield*/, setLighting()];
|
|
245
|
+
case 6:
|
|
246
|
+
_a.sent();
|
|
247
|
+
_atwin.Sweep.current.subscribe(function (currentSweep) {
|
|
248
|
+
// Change to the current sweep has occurred.
|
|
249
|
+
if (currentSweep.sid === "") {
|
|
250
|
+
console.log("Not currently stationed at a sweep position");
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
_currentSweep = currentSweep;
|
|
254
|
+
console.log("Currently at sweep", _currentSweep.id);
|
|
255
|
+
// check auto play
|
|
256
|
+
videoAutoPlay();
|
|
257
|
+
// console.log("_3DXObject "+_3DXObject.length)
|
|
258
|
+
// _3DXObject.forEach(obj => {
|
|
259
|
+
// console.log("3D Position "+ JSON.stringify(obj.position))
|
|
260
|
+
// })
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
_atwin.Camera.pose.subscribe(function (pose) {
|
|
264
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
265
|
+
var hasElapsed;
|
|
266
|
+
return __generator(this, function (_a) {
|
|
267
|
+
switch (_a.label) {
|
|
268
|
+
case 0:
|
|
269
|
+
// Changes to the Camera pose have occurred.
|
|
270
|
+
_currentCameraPose = pose;
|
|
271
|
+
console.log("Current Camera Pose", _currentCameraPose);
|
|
272
|
+
hasElapsed = hasTimeElapsed(300);
|
|
273
|
+
if (!hasElapsed) return [3 /*break*/, 2];
|
|
274
|
+
console.log("_unrenderedObjects " + _unrenderedObjects.length);
|
|
275
|
+
return [4 /*yield*/, renderOnDemand()];
|
|
276
|
+
case 1:
|
|
277
|
+
_a.sent();
|
|
278
|
+
_a.label = 2;
|
|
279
|
+
case 2:
|
|
280
|
+
if (hasTimeElapsed(1000)) {
|
|
281
|
+
getNearbyObjects({ type: 'ALL', distance: 2 });
|
|
282
|
+
}
|
|
283
|
+
return [2 /*return*/];
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
_atwin.Mode.current.subscribe(function (mode) {
|
|
289
|
+
_currentViewMode = mode;
|
|
290
|
+
});
|
|
291
|
+
_a.label = 7;
|
|
292
|
+
case 7: return [2 /*return*/];
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
}); });
|
|
296
|
+
return [3 /*break*/, 4];
|
|
297
|
+
case 3:
|
|
298
|
+
e_2 = _a.sent();
|
|
299
|
+
console.error(e_2);
|
|
300
|
+
return [3 /*break*/, 4];
|
|
301
|
+
case 4: return [2 /*return*/];
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
// end here
|
|
307
|
+
/**
|
|
308
|
+
* Super light weight alternative to lodash's debounce
|
|
309
|
+
* This function will allow you to debounce a function a set amoint in milliseconds
|
|
310
|
+
* Useful for improving performance if your function is inside a subscribe method
|
|
311
|
+
* @param maxTime milliseconds
|
|
312
|
+
* @returns {boolean}
|
|
313
|
+
*/
|
|
314
|
+
function hasTimeElapsed(maxTime) {
|
|
315
|
+
var currentTimestamp = Date.now();
|
|
316
|
+
// Difference in milliseconds
|
|
317
|
+
var differenceInMilliseconds = (currentTimestamp - previousTimestamp) % 1000;
|
|
318
|
+
previousTimestamp = currentTimestamp;
|
|
319
|
+
if (differenceInMilliseconds >= maxTime) {
|
|
320
|
+
console.log("Elapsed more than ".concat(maxTime));
|
|
321
|
+
return true;
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
console.log("Elapsed less than ".concat(maxTime));
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* This function detects and return objects fetched from the API that have NOT been rendered yet
|
|
330
|
+
* Not to be confused with getNearbyObjects which returns INodes that have already been rendered
|
|
331
|
+
* @constructor
|
|
332
|
+
* @param payload
|
|
333
|
+
* @type {NearbyPayload}
|
|
334
|
+
* @returns {Array<IShowcaseObject>}
|
|
335
|
+
*/
|
|
336
|
+
function getNearbyUnrenderedObjects(payload) {
|
|
337
|
+
var toBeRendered = [];
|
|
338
|
+
var currentPose = {
|
|
339
|
+
x: _currentCameraPose.position.x,
|
|
340
|
+
y: _currentCameraPose.position.y
|
|
341
|
+
};
|
|
342
|
+
toBeRendered = _unrenderedObjects.filter(function (obj) {
|
|
343
|
+
var obj_pos = {
|
|
344
|
+
x: obj.object_position.x,
|
|
345
|
+
y: obj.object_position.y,
|
|
346
|
+
};
|
|
347
|
+
var distance = calculateDistance(currentPose, obj_pos);
|
|
348
|
+
return distance < payload.distance;
|
|
349
|
+
});
|
|
350
|
+
var filtered = _unrenderedObjects.filter(function (obj) {
|
|
351
|
+
return toBeRendered.indexOf(obj) === -1;
|
|
352
|
+
});
|
|
353
|
+
_unrenderedObjects = filtered;
|
|
354
|
+
console.log("render toBeRendered " + toBeRendered.length);
|
|
355
|
+
return toBeRendered;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* This function returns an object that returns an array of 3D, video, and slideshow objects
|
|
359
|
+
* You can pass a object type as a object parameter to set what the contents of the returned objects will be
|
|
360
|
+
* @constructor
|
|
361
|
+
* @param payload
|
|
362
|
+
* @type {NearbyPayload}
|
|
363
|
+
* @returns {NearbyObjects}
|
|
364
|
+
*/
|
|
365
|
+
function getNearbyObjects(payload) {
|
|
366
|
+
if (payload.type === undefined || payload.type === '') {
|
|
367
|
+
payload.type = 'ALL';
|
|
368
|
+
}
|
|
369
|
+
if (payload.distance === undefined) {
|
|
370
|
+
payload.distance = 2;
|
|
371
|
+
}
|
|
372
|
+
var pos1 = {
|
|
373
|
+
x: _currentCameraPose.position.x,
|
|
374
|
+
y: _currentCameraPose.position.y
|
|
375
|
+
};
|
|
376
|
+
var three_d = [];
|
|
377
|
+
var videos = [];
|
|
378
|
+
var slideshows = [];
|
|
379
|
+
if (payload.type === 'ALL' || '3DX') {
|
|
380
|
+
three_d = _3DXObject.filter(function (obj) {
|
|
381
|
+
var pos2 = {
|
|
382
|
+
x: obj.position.x,
|
|
383
|
+
y: obj.position.y
|
|
384
|
+
};
|
|
385
|
+
var distance = calculateDistance(pos1, pos2);
|
|
386
|
+
console.log("3DX Distance: " + distance);
|
|
387
|
+
return distance < payload.distance;
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
if (payload.type === 'ALL' || 'VIDEO') {
|
|
391
|
+
videos = _videos.filter(function (vid) {
|
|
392
|
+
var pos2 = {
|
|
393
|
+
x: vid.node.position.x,
|
|
394
|
+
y: vid.node.position.y
|
|
395
|
+
};
|
|
396
|
+
var distance = calculateDistance(pos1, pos2);
|
|
397
|
+
console.log("Video Distance: " + distance);
|
|
398
|
+
return distance < payload.distance;
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
if (payload.type === 'ALL' || 'SLIDESHOW') {
|
|
402
|
+
slideshows = _allSlideShow.filter(function (slide) {
|
|
403
|
+
var pos2 = {
|
|
404
|
+
x: slide.node.position.x,
|
|
405
|
+
y: slide.node.position.y
|
|
406
|
+
};
|
|
407
|
+
var distance = calculateDistance(pos1, pos2);
|
|
408
|
+
console.log("Slideshow Distance: " + distance);
|
|
409
|
+
return distance < payload.distance;
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
console.log("nearby3DXObjects " + three_d.length);
|
|
413
|
+
console.log("nearbyVideos " + videos.length);
|
|
414
|
+
console.log("nearbySlideshows " + slideshows.length);
|
|
415
|
+
return {
|
|
416
|
+
x3d: three_d,
|
|
417
|
+
videos: videos,
|
|
418
|
+
slideshows: slideshows
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
function show3DObjects(object) {
|
|
422
|
+
var _a;
|
|
423
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
424
|
+
var sceneObject, id, modelNode, component;
|
|
425
|
+
return __generator(this, function (_b) {
|
|
426
|
+
switch (_b.label) {
|
|
427
|
+
case 0: return [4 /*yield*/, _atwin.Scene.createObjects(1)];
|
|
428
|
+
case 1:
|
|
429
|
+
sceneObject = (_b.sent())[0];
|
|
430
|
+
id = Math.floor(Math.random() * 20);
|
|
431
|
+
modelNode = sceneObject.addNode(id.toString());
|
|
432
|
+
component = modelNode.addComponent(getComponentLoader(object), {
|
|
433
|
+
url: (_a = object.object_data) === null || _a === void 0 ? void 0 : _a.amazon_uri,
|
|
434
|
+
});
|
|
435
|
+
if (!component.inputs) {
|
|
436
|
+
console.error("component.inputs is undefined");
|
|
437
|
+
return [2 /*return*/];
|
|
438
|
+
}
|
|
439
|
+
component.inputs.localScale = {
|
|
440
|
+
x: object.object_scale.x,
|
|
441
|
+
y: object.object_scale.y,
|
|
442
|
+
z: object.object_scale.z,
|
|
443
|
+
};
|
|
444
|
+
// @ts-ignore
|
|
445
|
+
modelNode.obj3D.position.set(object.object_position.x, object.object_position.y, object.object_position.z);
|
|
446
|
+
// @ts-ignore
|
|
447
|
+
modelNode.obj3D.rotation.set(object.object_rotation.x, object.object_rotation.y, object.object_rotation.z);
|
|
448
|
+
_3DXObject.push(modelNode);
|
|
449
|
+
console.log("_3DXObject " + _3DXObject.length);
|
|
450
|
+
modelNode.start();
|
|
451
|
+
//Spy on component
|
|
452
|
+
component.spyOnEvent(new ClickSpy(object, modelNode, component));
|
|
453
|
+
return [2 /*return*/];
|
|
454
|
+
}
|
|
455
|
+
});
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Renders objects if within set range
|
|
460
|
+
* This function SHOULD be debounced for better performance
|
|
461
|
+
* @constructor
|
|
462
|
+
*/
|
|
463
|
+
function renderOnDemand() {
|
|
464
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
465
|
+
var objects;
|
|
466
|
+
var _this = this;
|
|
467
|
+
return __generator(this, function (_a) {
|
|
468
|
+
if (_unrenderedObjects.length !== 0) {
|
|
469
|
+
console.log("renderOnDemand()");
|
|
470
|
+
objects = getNearbyUnrenderedObjects({ type: '', distance: 2 });
|
|
471
|
+
objects.forEach(function (obj) { return __awaiter(_this, void 0, void 0, function () {
|
|
472
|
+
var _a, _b, _c, _d;
|
|
473
|
+
return __generator(this, function (_e) {
|
|
474
|
+
switch (_e.label) {
|
|
475
|
+
case 0:
|
|
476
|
+
if (!(((_a = obj.object_data) === null || _a === void 0 ? void 0 : _a.object_type) === "FBX" ||
|
|
477
|
+
((_b = obj.object_data) === null || _b === void 0 ? void 0 : _b.object_type) === "GLB")) return [3 /*break*/, 2];
|
|
478
|
+
return [4 /*yield*/, show3DObjects(obj)];
|
|
479
|
+
case 1:
|
|
480
|
+
_e.sent();
|
|
481
|
+
return [3 /*break*/, 6];
|
|
482
|
+
case 2:
|
|
483
|
+
if (!(((_c = obj.object_data) === null || _c === void 0 ? void 0 : _c.object_type) === "MP4")) return [3 /*break*/, 4];
|
|
484
|
+
return [4 /*yield*/, showVideoObjects(obj)];
|
|
485
|
+
case 3:
|
|
486
|
+
_e.sent();
|
|
487
|
+
return [3 /*break*/, 6];
|
|
488
|
+
case 4:
|
|
489
|
+
if (!(((_d = obj.object_data) === null || _d === void 0 ? void 0 : _d.object_type) === "ZIP")) return [3 /*break*/, 6];
|
|
490
|
+
return [4 /*yield*/, showSlideScreenModel(obj)];
|
|
491
|
+
case 5:
|
|
492
|
+
_e.sent();
|
|
493
|
+
_e.label = 6;
|
|
494
|
+
case 6: return [2 /*return*/];
|
|
495
|
+
}
|
|
496
|
+
});
|
|
497
|
+
}); });
|
|
498
|
+
}
|
|
499
|
+
return [2 /*return*/];
|
|
500
|
+
});
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
// get iframe src with configurations (mp url parameters)
|
|
504
|
+
function getIframeSrc(config) {
|
|
505
|
+
console.log("getIframeSrc()", config);
|
|
506
|
+
var modelId = _space.space_url.split("?m=")[1];
|
|
507
|
+
if (!modelId) {
|
|
508
|
+
console.error("modelId is undefined");
|
|
509
|
+
return "";
|
|
510
|
+
}
|
|
511
|
+
var src = "";
|
|
512
|
+
src += "architwin/bundle/showcase.html?m=".concat(modelId, "&applicationKey=").concat(sdkKey, "&newtags=1");
|
|
513
|
+
for (var _i = 0, urlParams_1 = urlParams; _i < urlParams_1.length; _i++) {
|
|
514
|
+
var param = urlParams_1[_i];
|
|
515
|
+
if (param in config) {
|
|
516
|
+
// @ts-ignore
|
|
517
|
+
src += "&".concat(param, "=").concat(config[param]);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
return src;
|
|
521
|
+
}
|
|
522
|
+
// login user to fix cors error
|
|
523
|
+
function loginUser(user) {
|
|
524
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
525
|
+
var response;
|
|
526
|
+
return __generator(this, function (_a) {
|
|
527
|
+
switch (_a.label) {
|
|
528
|
+
case 0:
|
|
529
|
+
console.log("loginUser(user)", user);
|
|
530
|
+
return [4 /*yield*/, _api.post("/cas/tickets?email=" + user.email + "&password=" + user.password)];
|
|
531
|
+
case 1:
|
|
532
|
+
response = _a.sent();
|
|
533
|
+
console.log("loginUser, response", response.status, response.data);
|
|
534
|
+
if (response.status == 200) {
|
|
535
|
+
return [2 /*return*/, response.data];
|
|
536
|
+
}
|
|
537
|
+
else {
|
|
538
|
+
return [2 /*return*/, response];
|
|
539
|
+
}
|
|
540
|
+
return [2 /*return*/];
|
|
541
|
+
}
|
|
542
|
+
});
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
// get showcase/space data in api
|
|
546
|
+
function getSpace(spaceId) {
|
|
547
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
548
|
+
var response;
|
|
549
|
+
return __generator(this, function (_a) {
|
|
550
|
+
switch (_a.label) {
|
|
551
|
+
case 0:
|
|
552
|
+
console.log("getShowcase(spaceId: string)", spaceId);
|
|
553
|
+
return [4 /*yield*/, _api.get("showcases/id/".concat(spaceId))];
|
|
554
|
+
case 1:
|
|
555
|
+
response = _a.sent();
|
|
556
|
+
console.log("response", response);
|
|
557
|
+
if (response.status === 200) {
|
|
558
|
+
if (response.data.data.length === 0) {
|
|
559
|
+
console.error("No data");
|
|
560
|
+
}
|
|
561
|
+
return [2 /*return*/, response.data.data[0]];
|
|
562
|
+
}
|
|
563
|
+
else {
|
|
564
|
+
console.error("Error in fetchShowcase()" + response);
|
|
565
|
+
}
|
|
566
|
+
return [2 /*return*/, null];
|
|
567
|
+
}
|
|
568
|
+
});
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
function getSpaceId(url) {
|
|
572
|
+
var urlArray = url.split(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/);
|
|
573
|
+
var path = urlArray[5];
|
|
574
|
+
var spaceId = path.split("/")[3];
|
|
575
|
+
console.log("urlArray", urlArray);
|
|
576
|
+
console.log("path", path);
|
|
577
|
+
if (!spaceId) {
|
|
578
|
+
console.error("spaceId is undefined");
|
|
579
|
+
return;
|
|
580
|
+
}
|
|
581
|
+
return spaceId;
|
|
582
|
+
}
|
|
583
|
+
function setSpace(space) {
|
|
584
|
+
console.log("setSpace(space: ISpace)", space);
|
|
585
|
+
_space = space;
|
|
586
|
+
}
|
|
587
|
+
// get tags from api
|
|
588
|
+
function getTags(space) {
|
|
589
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
590
|
+
var response, tags_1, error_1;
|
|
591
|
+
return __generator(this, function (_a) {
|
|
592
|
+
switch (_a.label) {
|
|
593
|
+
case 0:
|
|
594
|
+
console.log("getTags()");
|
|
595
|
+
_a.label = 1;
|
|
596
|
+
case 1:
|
|
597
|
+
_a.trys.push([1, 3, , 4]);
|
|
598
|
+
return [4 /*yield*/, _api.get("tags/showcase-id/".concat(space.id))];
|
|
599
|
+
case 2:
|
|
600
|
+
response = _a.sent();
|
|
601
|
+
console.log("response", response);
|
|
602
|
+
if (response.status === 200) {
|
|
603
|
+
tags_1 = response.data.data;
|
|
604
|
+
if (!tags_1) {
|
|
605
|
+
console.error("tags is undefined");
|
|
606
|
+
}
|
|
607
|
+
return [2 /*return*/, tags_1];
|
|
608
|
+
}
|
|
609
|
+
else {
|
|
610
|
+
console.error("Custom Error: Unable to fetch tags");
|
|
611
|
+
}
|
|
612
|
+
return [3 /*break*/, 4];
|
|
613
|
+
case 3:
|
|
614
|
+
error_1 = _a.sent();
|
|
615
|
+
console.error(error_1);
|
|
616
|
+
return [3 /*break*/, 4];
|
|
617
|
+
case 4: return [2 /*return*/, null];
|
|
618
|
+
}
|
|
619
|
+
});
|
|
620
|
+
});
|
|
621
|
+
}
|
|
622
|
+
function setTags(tags) {
|
|
623
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
624
|
+
return __generator(this, function (_a) {
|
|
625
|
+
console.log("setTags()", tags);
|
|
626
|
+
_tags = tags.map(function (tag) {
|
|
627
|
+
//@ts-ignore
|
|
628
|
+
tag.json_data = JSON.parse(tag.json_data);
|
|
629
|
+
//@ts-ignore
|
|
630
|
+
tag.json_data.id = tag.json_data.sid;
|
|
631
|
+
return tag;
|
|
632
|
+
});
|
|
633
|
+
mapTags(_tags);
|
|
634
|
+
return [2 /*return*/];
|
|
635
|
+
});
|
|
636
|
+
});
|
|
637
|
+
}
|
|
638
|
+
// get objects from api
|
|
639
|
+
function get3DObjects(showcase_id) {
|
|
640
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
641
|
+
var id, response, showcase_objects, getRequests, response_1, object_data_1, threed_objects, error_2, error_3;
|
|
642
|
+
return __generator(this, function (_a) {
|
|
643
|
+
switch (_a.label) {
|
|
644
|
+
case 0:
|
|
645
|
+
if (!showcase_id) return [3 /*break*/, 8];
|
|
646
|
+
_a.label = 1;
|
|
647
|
+
case 1:
|
|
648
|
+
_a.trys.push([1, 7, , 8]);
|
|
649
|
+
id = parseInt(showcase_id);
|
|
650
|
+
console.log("showcase_id " + id);
|
|
651
|
+
return [4 /*yield*/, _api.get("showcase-objects/showcase-id/".concat(id))];
|
|
652
|
+
case 2:
|
|
653
|
+
response = _a.sent();
|
|
654
|
+
showcase_objects = response.data.data;
|
|
655
|
+
console.log("showcase_objects " + JSON.stringify(showcase_objects));
|
|
656
|
+
getRequests = showcase_objects.map(function (obj) {
|
|
657
|
+
return _api.get("objects/id/".concat(obj.object_id));
|
|
658
|
+
});
|
|
659
|
+
_a.label = 3;
|
|
660
|
+
case 3:
|
|
661
|
+
_a.trys.push([3, 5, , 6]);
|
|
662
|
+
return [4 /*yield*/, axios.all(getRequests)];
|
|
663
|
+
case 4:
|
|
664
|
+
response_1 = _a.sent();
|
|
665
|
+
object_data_1 = response_1.map(function (res) {
|
|
666
|
+
return res.data.data[0];
|
|
667
|
+
});
|
|
668
|
+
console.log("object_data" + JSON.stringify(object_data_1));
|
|
669
|
+
threed_objects = showcase_objects.map(function (showcase) {
|
|
670
|
+
var target = object_data_1.find(function (obj) { return obj.id === showcase.object_id; });
|
|
671
|
+
if (target) {
|
|
672
|
+
showcase.object_data = target;
|
|
673
|
+
}
|
|
674
|
+
//parse string back to an object
|
|
675
|
+
if (showcase.object_position) {
|
|
676
|
+
showcase.object_position =
|
|
677
|
+
typeof showcase.object_position === "string"
|
|
678
|
+
? JSON.parse(showcase.object_position)
|
|
679
|
+
: showcase.object_position;
|
|
680
|
+
}
|
|
681
|
+
if (showcase.object_rotation) {
|
|
682
|
+
showcase.object_rotation =
|
|
683
|
+
typeof showcase.object_rotation === "string"
|
|
684
|
+
? JSON.parse(showcase.object_rotation)
|
|
685
|
+
: showcase.object_rotation;
|
|
686
|
+
}
|
|
687
|
+
if (showcase.object_scale) {
|
|
688
|
+
showcase.object_scale =
|
|
689
|
+
typeof showcase.object_scale === "string"
|
|
690
|
+
? JSON.parse(showcase.object_scale)
|
|
691
|
+
: showcase.object_scale;
|
|
692
|
+
}
|
|
693
|
+
return showcase;
|
|
694
|
+
});
|
|
695
|
+
console.log("get3DObjectsByShowcaseId " + JSON.stringify(threed_objects));
|
|
696
|
+
_unrenderedObjects = threed_objects;
|
|
697
|
+
return [2 /*return*/, threed_objects];
|
|
698
|
+
case 5:
|
|
699
|
+
error_2 = _a.sent();
|
|
700
|
+
console.error("threed_objects " + error_2);
|
|
701
|
+
return [3 /*break*/, 6];
|
|
702
|
+
case 6: return [3 /*break*/, 8];
|
|
703
|
+
case 7:
|
|
704
|
+
error_3 = _a.sent();
|
|
705
|
+
console.error("get3DObjectsByShowcaseId " + error_3);
|
|
706
|
+
return [3 /*break*/, 8];
|
|
707
|
+
case 8: return [2 /*return*/, []];
|
|
708
|
+
}
|
|
709
|
+
});
|
|
710
|
+
});
|
|
711
|
+
}
|
|
712
|
+
// function setObjects(objects: IShowcaseObject[]) {
|
|
713
|
+
// console.log("setObjects()", objects);
|
|
714
|
+
// _objects = objects;
|
|
715
|
+
// }
|
|
716
|
+
// =========================================== END INITIALIZATION ===========================================
|
|
717
|
+
// =========================================== TAGS FUNCTIONALITY ===========================================
|
|
718
|
+
// navigate to tag
|
|
719
|
+
function gotoTag(tag_id) {
|
|
720
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
721
|
+
var tag, error_4;
|
|
722
|
+
return __generator(this, function (_a) {
|
|
723
|
+
switch (_a.label) {
|
|
724
|
+
case 0:
|
|
725
|
+
console.log("gotoTag(tag: tag_id)", tag_id);
|
|
726
|
+
if (!tag_id) {
|
|
727
|
+
console.error("tag is undefined");
|
|
728
|
+
return [2 /*return*/];
|
|
729
|
+
}
|
|
730
|
+
_a.label = 1;
|
|
731
|
+
case 1:
|
|
732
|
+
_a.trys.push([1, 3, , 4]);
|
|
733
|
+
tag = _tags.find(function (i) { return i.id === tag_id; });
|
|
734
|
+
if (!tag) {
|
|
735
|
+
console.error("tag is not found");
|
|
736
|
+
return [2 /*return*/];
|
|
737
|
+
}
|
|
738
|
+
return [4 /*yield*/, _atwin.Mattertag.navigateToTag(tag.json_data.id, _atwin.Mattertag.Transition.FLY)];
|
|
739
|
+
case 2:
|
|
740
|
+
_a.sent();
|
|
741
|
+
return [3 /*break*/, 4];
|
|
742
|
+
case 3:
|
|
743
|
+
error_4 = _a.sent();
|
|
744
|
+
console.error(error_4);
|
|
745
|
+
return [3 /*break*/, 4];
|
|
746
|
+
case 4: return [2 /*return*/];
|
|
747
|
+
}
|
|
748
|
+
});
|
|
749
|
+
});
|
|
750
|
+
}
|
|
751
|
+
// render tags to space
|
|
752
|
+
function showTags(tags) {
|
|
753
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
754
|
+
var _this = this;
|
|
755
|
+
return __generator(this, function (_a) {
|
|
756
|
+
tags.forEach(function (tag, indx) { return __awaiter(_this, void 0, void 0, function () {
|
|
757
|
+
var mpData, tagIds, attachmentId1, error_5;
|
|
758
|
+
return __generator(this, function (_a) {
|
|
759
|
+
switch (_a.label) {
|
|
760
|
+
case 0:
|
|
761
|
+
mpData = tag.json_data;
|
|
762
|
+
if (!mpData) {
|
|
763
|
+
console.error("tag.json_data/mpData is undefined");
|
|
764
|
+
return [2 /*return*/];
|
|
765
|
+
}
|
|
766
|
+
return [4 /*yield*/, _atwin.Tag.add({
|
|
767
|
+
anchorPosition: mpData.anchorPosition,
|
|
768
|
+
color: mpData.color,
|
|
769
|
+
description: mpData.description,
|
|
770
|
+
//@ts-ignore
|
|
771
|
+
id: mpData.sid,
|
|
772
|
+
label: mpData.label,
|
|
773
|
+
stemVector: mpData.stemVector,
|
|
774
|
+
stemVisible: mpData.stemVisible,
|
|
775
|
+
})];
|
|
776
|
+
case 1:
|
|
777
|
+
tagIds = _a.sent();
|
|
778
|
+
if (!tagIds) return [3 /*break*/, 6];
|
|
779
|
+
//@ts-ignore
|
|
780
|
+
tag.json_data.id = tagIds[0];
|
|
781
|
+
if (!
|
|
782
|
+
// @ts-ignore
|
|
783
|
+
(tag.json_data.media &&
|
|
784
|
+
// @ts-ignore
|
|
785
|
+
// @ts-ignore
|
|
786
|
+
tag.json_data.media.src.trim() !== ""))
|
|
787
|
+
// @ts-ignore
|
|
788
|
+
return [3 /*break*/, 6];
|
|
789
|
+
_a.label = 2;
|
|
790
|
+
case 2:
|
|
791
|
+
_a.trys.push([2, 5, , 6]);
|
|
792
|
+
console.log("Attaching media...");
|
|
793
|
+
return [4 /*yield*/, _atwin.Tag.registerAttachment(
|
|
794
|
+
// @ts-ignore
|
|
795
|
+
tag.json_data.media.src)];
|
|
796
|
+
case 3:
|
|
797
|
+
attachmentId1 = (_a.sent())[0];
|
|
798
|
+
tag.json_data["attachments"] = [attachmentId1];
|
|
799
|
+
//@ts-ignore
|
|
800
|
+
return [4 /*yield*/, _atwin.Tag.attach(tag.json_data.sid, attachmentId1)];
|
|
801
|
+
case 4:
|
|
802
|
+
//@ts-ignore
|
|
803
|
+
_a.sent();
|
|
804
|
+
console.log("Media successfully attached");
|
|
805
|
+
return [3 /*break*/, 6];
|
|
806
|
+
case 5:
|
|
807
|
+
error_5 = _a.sent();
|
|
808
|
+
console.warn("Custom warn: Media not attached: Invalid media src link: " + error_5);
|
|
809
|
+
//@ts-ignore
|
|
810
|
+
console.warn(
|
|
811
|
+
// @ts-ignore
|
|
812
|
+
"mediaSrc: ".concat(tag.json_data.media.src, " | tag index: ").concat(indx));
|
|
813
|
+
return [3 /*break*/, 6];
|
|
814
|
+
case 6: return [2 /*return*/];
|
|
815
|
+
}
|
|
816
|
+
});
|
|
817
|
+
}); });
|
|
818
|
+
console.log("tags", _tags);
|
|
819
|
+
return [2 /*return*/];
|
|
820
|
+
});
|
|
821
|
+
});
|
|
822
|
+
}
|
|
823
|
+
// remove built in tags
|
|
824
|
+
function hideTags() {
|
|
825
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
826
|
+
var tags, tagIds;
|
|
827
|
+
return __generator(this, function (_a) {
|
|
828
|
+
switch (_a.label) {
|
|
829
|
+
case 0:
|
|
830
|
+
console.log("hideTags()");
|
|
831
|
+
return [4 /*yield*/, _atwin.Mattertag.getData()];
|
|
832
|
+
case 1:
|
|
833
|
+
tags = _a.sent();
|
|
834
|
+
if (!tags) return [3 /*break*/, 3];
|
|
835
|
+
tagIds = tags.map(function (i) { return i.sid; });
|
|
836
|
+
return [4 /*yield*/, _atwin.Mattertag.remove(tagIds)];
|
|
837
|
+
case 2:
|
|
838
|
+
_a.sent();
|
|
839
|
+
console.log("Tags removed in space: ", tagIds);
|
|
840
|
+
_a.label = 3;
|
|
841
|
+
case 3: return [2 /*return*/];
|
|
842
|
+
}
|
|
843
|
+
});
|
|
844
|
+
});
|
|
845
|
+
}
|
|
846
|
+
// only expose tag id and name for the tags array
|
|
847
|
+
function mapTags($tags) {
|
|
848
|
+
console.log("mapTags()", $tags);
|
|
849
|
+
tags = $tags.map(function (i) {
|
|
850
|
+
var x = {};
|
|
851
|
+
x.id = i.id;
|
|
852
|
+
x.name = i.json_data.label;
|
|
853
|
+
return x;
|
|
854
|
+
});
|
|
855
|
+
console.log("tags", tags);
|
|
856
|
+
}
|
|
857
|
+
// =========================================== END TAGS FUNCTIONALITY ===========================================
|
|
858
|
+
// =========================================== SWEEP FUNCTIONALITY ===========================================
|
|
859
|
+
// get explicit location for currentSweep
|
|
860
|
+
function getCurrentSweep() {
|
|
861
|
+
return _currentSweep;
|
|
862
|
+
}
|
|
863
|
+
// get explicit location for currentPose
|
|
864
|
+
function getCurrentCameraPose() {
|
|
865
|
+
return _currentCameraPose;
|
|
866
|
+
}
|
|
867
|
+
// get explicit location for currentPose's position
|
|
868
|
+
function getCameraPosition() {
|
|
869
|
+
return _currentCameraPose.position;
|
|
870
|
+
}
|
|
871
|
+
// get explicit location for currentSweep's position
|
|
872
|
+
function getCurrentSweepPosition() {
|
|
873
|
+
return _currentSweep.position;
|
|
874
|
+
}
|
|
875
|
+
// gets all Sweeps in loaded Space
|
|
876
|
+
function getSweeps() {
|
|
877
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
878
|
+
return __generator(this, function (_a) {
|
|
879
|
+
console.log("Getting Sweeps in Space");
|
|
880
|
+
// original implementation
|
|
881
|
+
_atwin.Sweep.data.subscribe({
|
|
882
|
+
onCollectionUpdated: function (collection) {
|
|
883
|
+
console.log("Sweeps In Space", collection);
|
|
884
|
+
if (!collection) {
|
|
885
|
+
console.log("No Sweeps in loaded Space");
|
|
886
|
+
}
|
|
887
|
+
_sweeps = collection;
|
|
888
|
+
var sw = Object.values(_sweeps);
|
|
889
|
+
sweeps = sw.map(function (item) {
|
|
890
|
+
return {
|
|
891
|
+
id: item.uuid,
|
|
892
|
+
position: item.position,
|
|
893
|
+
neighbors: item.neighbors,
|
|
894
|
+
};
|
|
895
|
+
});
|
|
896
|
+
},
|
|
897
|
+
});
|
|
898
|
+
return [2 /*return*/, null];
|
|
899
|
+
});
|
|
900
|
+
});
|
|
901
|
+
}
|
|
902
|
+
// moves to selected Sweep
|
|
903
|
+
function moveToSweep(sweepId) {
|
|
904
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
905
|
+
var transition, transitionTime;
|
|
906
|
+
return __generator(this, function (_a) {
|
|
907
|
+
transition = _atwin.Sweep.Transition.FLY;
|
|
908
|
+
transitionTime = 2000;
|
|
909
|
+
console.log("Sweep Move", sweepId);
|
|
910
|
+
_atwin.Sweep.moveTo(sweepId, {
|
|
911
|
+
// position: position,
|
|
912
|
+
transition: transition,
|
|
913
|
+
transitionTime: transitionTime,
|
|
914
|
+
})
|
|
915
|
+
.then(function () {
|
|
916
|
+
// Move successful.
|
|
917
|
+
console.log("Sweep Arrived at sweep " + sweepId);
|
|
918
|
+
// getNearbySweeps(sweepId);
|
|
919
|
+
})
|
|
920
|
+
.catch(function (error) {
|
|
921
|
+
// Error with moveTo command
|
|
922
|
+
console.log("Sweep Error on Arriving", error);
|
|
923
|
+
});
|
|
924
|
+
return [2 /*return*/];
|
|
925
|
+
});
|
|
926
|
+
});
|
|
927
|
+
}
|
|
928
|
+
// returns nearby Sweeps
|
|
929
|
+
function getNearbySweeps(sweepId) {
|
|
930
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
931
|
+
var nearby;
|
|
932
|
+
return __generator(this, function (_a) {
|
|
933
|
+
switch (_a.label) {
|
|
934
|
+
case 0:
|
|
935
|
+
if (!sweepId) return [3 /*break*/, 2];
|
|
936
|
+
return [4 /*yield*/, sweeps.find(function (item) { return item.id == sweepId; })
|
|
937
|
+
.neighbors];
|
|
938
|
+
case 1:
|
|
939
|
+
nearby = _a.sent();
|
|
940
|
+
console.log("Nearby Sweeps", nearby);
|
|
941
|
+
return [2 /*return*/, nearby];
|
|
942
|
+
case 2:
|
|
943
|
+
console.log("No Nearby Sweeps");
|
|
944
|
+
_a.label = 3;
|
|
945
|
+
case 3: return [2 /*return*/];
|
|
946
|
+
}
|
|
947
|
+
});
|
|
948
|
+
});
|
|
949
|
+
}
|
|
950
|
+
// =========================================== END SWEEP FUNCTIONALITY ===========================================
|
|
951
|
+
// =========================================== OBJECTS FUNCTIONALITY ===========================================
|
|
952
|
+
function getComponentLoader(object) {
|
|
953
|
+
if (object && object.object_data) {
|
|
954
|
+
var index = object.object_data.object_type;
|
|
955
|
+
var component = {
|
|
956
|
+
FBX: _atwin.Scene.Component.FBX_LOADER,
|
|
957
|
+
GLB: _atwin.Scene.Component.GLTF_LOADER,
|
|
958
|
+
MP4: "liveVideo",
|
|
959
|
+
ZIP: "slideScreenModel",
|
|
960
|
+
};
|
|
961
|
+
return component[index] || "";
|
|
962
|
+
}
|
|
963
|
+
return "";
|
|
964
|
+
}
|
|
965
|
+
function setSelectedObject(data, node, component) {
|
|
966
|
+
_selectedObject = {
|
|
967
|
+
object: data,
|
|
968
|
+
component: component,
|
|
969
|
+
node: node
|
|
970
|
+
};
|
|
971
|
+
console.log("setSelectedObject()");
|
|
972
|
+
}
|
|
973
|
+
function setLighting() {
|
|
974
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
975
|
+
var sceneObject, lights;
|
|
976
|
+
return __generator(this, function (_a) {
|
|
977
|
+
switch (_a.label) {
|
|
978
|
+
case 0: return [4 /*yield*/, _atwin.Scene.createObjects(1)];
|
|
979
|
+
case 1:
|
|
980
|
+
sceneObject = (_a.sent())[0];
|
|
981
|
+
lights = sceneObject.addNode();
|
|
982
|
+
lights.addComponent("mp.directionalLight", {
|
|
983
|
+
intensity: 0.6,
|
|
984
|
+
color: { r: 1.0, g: 1.0, b: 1.0 },
|
|
985
|
+
});
|
|
986
|
+
lights.addComponent("mp.ambientLight", {
|
|
987
|
+
intensity: 0.6,
|
|
988
|
+
color: { r: 1.0, g: 1.0, b: 1.0 },
|
|
989
|
+
});
|
|
990
|
+
lights.start();
|
|
991
|
+
return [2 /*return*/];
|
|
992
|
+
}
|
|
993
|
+
});
|
|
994
|
+
});
|
|
995
|
+
}
|
|
996
|
+
function clearTransformControls() {
|
|
997
|
+
if (!_transformControlNode) {
|
|
998
|
+
console.error('_transformControlNode is undefined');
|
|
999
|
+
return;
|
|
1000
|
+
}
|
|
1001
|
+
if (_inputControlComponent == null || !_inputControlComponent) {
|
|
1002
|
+
console.error('_inputControlComponent is undefined');
|
|
1003
|
+
return;
|
|
1004
|
+
}
|
|
1005
|
+
_transformControlNode.stop();
|
|
1006
|
+
//_inputControlComponent.stop()
|
|
1007
|
+
console.log('clearTransformControls()');
|
|
1008
|
+
}
|
|
1009
|
+
function setTransformControls(selectedObject, mode) {
|
|
1010
|
+
if (mode === void 0) { mode = 'translate'; }
|
|
1011
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1012
|
+
var sceneObject, transformNode, transformComponent, inputComponent;
|
|
1013
|
+
return __generator(this, function (_a) {
|
|
1014
|
+
switch (_a.label) {
|
|
1015
|
+
case 0:
|
|
1016
|
+
console.log("Object to be transformed " + selectedObject.object.object_data.name);
|
|
1017
|
+
clearTransformControls();
|
|
1018
|
+
return [4 /*yield*/, _atwin.Scene.createObjects(1)];
|
|
1019
|
+
case 1:
|
|
1020
|
+
sceneObject = (_a.sent())[0];
|
|
1021
|
+
transformNode = sceneObject.addNode();
|
|
1022
|
+
transformComponent = transformNode.addComponent('mp.transformControls');
|
|
1023
|
+
_transformControlNode = transformNode;
|
|
1024
|
+
inputComponent = transformNode.addComponent('mp.input', {
|
|
1025
|
+
eventsEnabled: true,
|
|
1026
|
+
userNavigationEnabled: true,
|
|
1027
|
+
});
|
|
1028
|
+
_inputControlComponent = inputComponent.spyOnEvent(new ClickSpy(selectedObject.object, selectedObject.node, selectedObject.component));
|
|
1029
|
+
transformNode.start();
|
|
1030
|
+
transformComponent.inputs.selection = selectedObject.node;
|
|
1031
|
+
transformComponent.inputs.mode = mode;
|
|
1032
|
+
return [2 /*return*/];
|
|
1033
|
+
}
|
|
1034
|
+
});
|
|
1035
|
+
});
|
|
1036
|
+
}
|
|
1037
|
+
// async function testObject() {
|
|
1038
|
+
// const [ sceneObject ] = await _atwin.Scene.createObjects(1);
|
|
1039
|
+
// const modelNode = sceneObject.addNode();
|
|
1040
|
+
// const component = modelNode.addComponent(_atwin.Scene.Component.FBX_LOADER, {
|
|
1041
|
+
// url: "https://cdn.jsdelivr.net/gh/mrdoob/three.js@dev/examples/models/fbx/stanford-bunny.fbx",
|
|
1042
|
+
// });
|
|
1043
|
+
// // Create a scene node with a transform control component.
|
|
1044
|
+
// const node = sceneObject.addNode();
|
|
1045
|
+
// const myControl = node.addComponent('mp.transformControls');
|
|
1046
|
+
// node.start();
|
|
1047
|
+
// component.inputs.localScale = {
|
|
1048
|
+
// x: 0.00002,
|
|
1049
|
+
// y: 0.00002,
|
|
1050
|
+
// z: 0.00002
|
|
1051
|
+
// };
|
|
1052
|
+
// modelNode.obj3D.position.set(0,-1,0);
|
|
1053
|
+
// modelNode.start()
|
|
1054
|
+
// // Attach the model to the transform control
|
|
1055
|
+
// myControl.inputs.selection = modelNode;
|
|
1056
|
+
// // Make the transform control visible so that the user can manipulate the control selection.
|
|
1057
|
+
// myControl.inputs.visible = true;
|
|
1058
|
+
// // set 'translate' mode to position the selection.
|
|
1059
|
+
// myControl.inputs.mode = 'translate';
|
|
1060
|
+
// }
|
|
1061
|
+
function calculateDistance(pos1, pos2) {
|
|
1062
|
+
var dx = pos2.x - pos1.x;
|
|
1063
|
+
var dy = pos2.y - pos1.y;
|
|
1064
|
+
return Math.sqrt(dx * dx + dy * dy);
|
|
1065
|
+
}
|
|
1066
|
+
function showVideoObjects(object) {
|
|
1067
|
+
var _a, _b;
|
|
1068
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1069
|
+
var sceneObject, liveStreamNode, liveStreamComponent;
|
|
1070
|
+
return __generator(this, function (_c) {
|
|
1071
|
+
switch (_c.label) {
|
|
1072
|
+
case 0: return [4 /*yield*/, createVideoComponent()];
|
|
1073
|
+
case 1:
|
|
1074
|
+
_c.sent();
|
|
1075
|
+
return [4 /*yield*/, _atwin.Scene.createObjects(1)];
|
|
1076
|
+
case 2:
|
|
1077
|
+
sceneObject = (_c.sent())[0];
|
|
1078
|
+
liveStreamNode = sceneObject.addNode();
|
|
1079
|
+
return [4 /*yield*/, liveStreamNode.addComponent(getComponentLoader(object), {
|
|
1080
|
+
url: (_a = object.object_data) === null || _a === void 0 ? void 0 : _a.amazon_uri,
|
|
1081
|
+
})];
|
|
1082
|
+
case 3:
|
|
1083
|
+
liveStreamComponent = _c.sent();
|
|
1084
|
+
liveStreamNode.position.set(object.object_position.x, object.object_position.y, object.object_position.z);
|
|
1085
|
+
// @ts-ignore
|
|
1086
|
+
liveStreamNode.obj3D.rotation.set(object.object_rotation.x, object.object_rotation.y, object.object_rotation.z);
|
|
1087
|
+
liveStreamNode.scale.set(object.object_scale.x, object.object_scale.y, object.object_scale.z);
|
|
1088
|
+
if (liveStreamComponent.outputs.loadingState != "Error") {
|
|
1089
|
+
liveStreamNode.start();
|
|
1090
|
+
}
|
|
1091
|
+
liveStreamComponent.inputs.src = (_b = object.object_data) === null || _b === void 0 ? void 0 : _b.amazon_uri;
|
|
1092
|
+
_videos.push({
|
|
1093
|
+
data: object,
|
|
1094
|
+
component: liveStreamComponent,
|
|
1095
|
+
node: liveStreamNode,
|
|
1096
|
+
type: 'VIDEO',
|
|
1097
|
+
});
|
|
1098
|
+
return [2 /*return*/];
|
|
1099
|
+
}
|
|
1100
|
+
});
|
|
1101
|
+
});
|
|
1102
|
+
}
|
|
1103
|
+
function playVideo(videoId) {
|
|
1104
|
+
var videoObject = _videos.find(function (object) { return object.data.id == videoId; });
|
|
1105
|
+
if (videoObject) {
|
|
1106
|
+
// @ts-ignore
|
|
1107
|
+
videoObject.component.video.play();
|
|
1108
|
+
}
|
|
1109
|
+
else {
|
|
1110
|
+
console.error("Unable to find video object using that id");
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1113
|
+
function pauseVideo(videoId) {
|
|
1114
|
+
var videoObject = _videos.find(function (object) { return object.data.id == videoId; });
|
|
1115
|
+
if (videoObject) {
|
|
1116
|
+
// @ts-ignore
|
|
1117
|
+
videoObject.component.video.pause();
|
|
1118
|
+
}
|
|
1119
|
+
else {
|
|
1120
|
+
console.error("Unable to find video object using that id");
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
function videoAutoPlay() {
|
|
1124
|
+
function nearestVideo(videoObject) {
|
|
1125
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1126
|
+
var videoPosition, cameraPosition, computedDistance;
|
|
1127
|
+
return __generator(this, function (_a) {
|
|
1128
|
+
videoPosition = videoObject.data.object_position;
|
|
1129
|
+
cameraPosition = getCurrentSweepPosition();
|
|
1130
|
+
computedDistance = distance([cameraPosition.x, cameraPosition.y, cameraPosition.z], [videoPosition.x, videoPosition.y, videoPosition.z]);
|
|
1131
|
+
try {
|
|
1132
|
+
if (videoObject.data.autoplay &&
|
|
1133
|
+
videoObject.data.autoplay_distance &&
|
|
1134
|
+
computedDistance < videoObject.data.autoplay_distance) {
|
|
1135
|
+
// @ts-ignore
|
|
1136
|
+
videoObject.component.video.play();
|
|
1137
|
+
}
|
|
1138
|
+
else {
|
|
1139
|
+
// @ts-ignore
|
|
1140
|
+
videoObject.component.video.pause();
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
catch (e) {
|
|
1144
|
+
console.error("Unable to play or stop video");
|
|
1145
|
+
}
|
|
1146
|
+
return [2 /*return*/];
|
|
1147
|
+
});
|
|
1148
|
+
});
|
|
1149
|
+
}
|
|
1150
|
+
_videos.forEach(function (videoObject) { return nearestVideo(videoObject); });
|
|
1151
|
+
}
|
|
1152
|
+
function createVideoComponent() {
|
|
1153
|
+
function videoRenderer() {
|
|
1154
|
+
this.inputs = {
|
|
1155
|
+
visible: true,
|
|
1156
|
+
userNavigationEnabled: true,
|
|
1157
|
+
eventsEnabled: true,
|
|
1158
|
+
colliderEnabled: true,
|
|
1159
|
+
src: null,
|
|
1160
|
+
};
|
|
1161
|
+
this.outputs = {
|
|
1162
|
+
texture: null,
|
|
1163
|
+
video: null,
|
|
1164
|
+
aspect: 720 / 480,
|
|
1165
|
+
};
|
|
1166
|
+
this.onInit = function () {
|
|
1167
|
+
this.video;
|
|
1168
|
+
this.texture;
|
|
1169
|
+
};
|
|
1170
|
+
this.onEvent = function (eventType, eventData) { };
|
|
1171
|
+
this.onInputsUpdated = function (previous) {
|
|
1172
|
+
this.releaseTexture();
|
|
1173
|
+
var THREE = this.context.three;
|
|
1174
|
+
if (!this.inputs.src) {
|
|
1175
|
+
this.video.src = "";
|
|
1176
|
+
return;
|
|
1177
|
+
}
|
|
1178
|
+
if (this.inputs.src instanceof HTMLVideoElement) {
|
|
1179
|
+
this.video = this.inputs.src;
|
|
1180
|
+
}
|
|
1181
|
+
else {
|
|
1182
|
+
this.video = this.createVideoElement();
|
|
1183
|
+
if (typeof this.inputs.src === "string") {
|
|
1184
|
+
this.video.src = this.inputs.src;
|
|
1185
|
+
}
|
|
1186
|
+
else {
|
|
1187
|
+
this.video.srcObject = this.inputs.src;
|
|
1188
|
+
}
|
|
1189
|
+
this.video.load();
|
|
1190
|
+
}
|
|
1191
|
+
this.texture = new THREE.VideoTexture(this.video);
|
|
1192
|
+
this.texture.minFilter = THREE.LinearFilter;
|
|
1193
|
+
this.texture.magFilter = THREE.LinearFilter;
|
|
1194
|
+
this.texture.format = THREE.RGBFormat;
|
|
1195
|
+
var geometry = new THREE.PlaneGeometry(1, 1);
|
|
1196
|
+
geometry.scale(1, 480 / 720, 1);
|
|
1197
|
+
geometry.translate(0, 0.33, 0);
|
|
1198
|
+
this.material = new THREE.MeshBasicMaterial({
|
|
1199
|
+
map: this.texture,
|
|
1200
|
+
side: THREE.DoubleSide,
|
|
1201
|
+
});
|
|
1202
|
+
var mesh = new THREE.Mesh(geometry, this.material);
|
|
1203
|
+
this.outputs.objectRoot = mesh;
|
|
1204
|
+
this.outputs.collider = mesh;
|
|
1205
|
+
mesh.visible = this.inputs.visible;
|
|
1206
|
+
this.outputs.texture = this.texture;
|
|
1207
|
+
this.outputs.video = this.video;
|
|
1208
|
+
};
|
|
1209
|
+
this.releaseTexture = function () {
|
|
1210
|
+
if (this.texture) {
|
|
1211
|
+
this.outputs.texture = null;
|
|
1212
|
+
this.texture.dispose();
|
|
1213
|
+
}
|
|
1214
|
+
};
|
|
1215
|
+
this.createVideoElement = function () {
|
|
1216
|
+
var video = document.createElement("video");
|
|
1217
|
+
video.setAttribute("id", "htmlLivestreamVideo");
|
|
1218
|
+
video.crossOrigin = "anonymous";
|
|
1219
|
+
video.setAttribute("height", "480");
|
|
1220
|
+
video.setAttribute("width", "720");
|
|
1221
|
+
video.setAttribute("webkit-playsinline", "webkit-playsinline");
|
|
1222
|
+
video.setAttribute("controls", "controls");
|
|
1223
|
+
video.muted = false;
|
|
1224
|
+
video.loop = true;
|
|
1225
|
+
video.volume = 1;
|
|
1226
|
+
return video;
|
|
1227
|
+
};
|
|
1228
|
+
this.onTick = function (tickDelta) { };
|
|
1229
|
+
this.onDestroy = function () {
|
|
1230
|
+
this.material.dispose();
|
|
1231
|
+
};
|
|
1232
|
+
this.spyOnEvent = function (payload) {
|
|
1233
|
+
console.log("payload", payload);
|
|
1234
|
+
};
|
|
1235
|
+
}
|
|
1236
|
+
function makeVideoRender() {
|
|
1237
|
+
return new videoRenderer();
|
|
1238
|
+
}
|
|
1239
|
+
_atwin.Scene.register("liveVideo", makeVideoRender);
|
|
1240
|
+
}
|
|
1241
|
+
//This function is for registering the custom component
|
|
1242
|
+
function createSlideScreenModel() {
|
|
1243
|
+
function SlideScreenModelRenderer() {
|
|
1244
|
+
this.inputs = {
|
|
1245
|
+
src: null,
|
|
1246
|
+
userNavigationEnabled: true,
|
|
1247
|
+
eventsEnabled: true,
|
|
1248
|
+
colliderEnabled: true,
|
|
1249
|
+
visible: true,
|
|
1250
|
+
};
|
|
1251
|
+
this.outputs = {
|
|
1252
|
+
texture: null,
|
|
1253
|
+
t_image: null,
|
|
1254
|
+
};
|
|
1255
|
+
this.onInit = function () {
|
|
1256
|
+
this.texture;
|
|
1257
|
+
this.t_image;
|
|
1258
|
+
this.material;
|
|
1259
|
+
this.mesh;
|
|
1260
|
+
};
|
|
1261
|
+
//This is commented out since the slideshow must not be clicked yet
|
|
1262
|
+
this.events = {
|
|
1263
|
+
"INTERACTION.CLICK": true,
|
|
1264
|
+
};
|
|
1265
|
+
this.onEvent = function (eventType, eventData) {
|
|
1266
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1267
|
+
var slideshow_1, mousePosition, planePosition;
|
|
1268
|
+
var _this = this;
|
|
1269
|
+
return __generator(this, function (_a) {
|
|
1270
|
+
switch (_a.label) {
|
|
1271
|
+
case 0:
|
|
1272
|
+
console.log("onEventSlideShow", eventType, eventData);
|
|
1273
|
+
if (!(eventType == "INTERACTION.CLICK")) return [3 /*break*/, 2];
|
|
1274
|
+
if (!(_allSlideShow.length > 0)) return [3 /*break*/, 2];
|
|
1275
|
+
slideshow_1 = _allSlideShow.filter(function (l) { var _a, _b, _c, _d; return (_d = ((_b = (_a = l.collider) === null || _a === void 0 ? void 0 : _a.collider) === null || _b === void 0 ? void 0 : _b.uuid) == ((_c = eventData.collider) === null || _c === void 0 ? void 0 : _c.uuid)) !== null && _d !== void 0 ? _d : false; })[0];
|
|
1276
|
+
console.log("slideShow eventData", slideshow_1);
|
|
1277
|
+
if (!(slideshow_1 != null)) return [3 /*break*/, 2];
|
|
1278
|
+
console.log("slideShow eventData", slideshow_1);
|
|
1279
|
+
return [4 /*yield*/, getMousePosition()];
|
|
1280
|
+
case 1:
|
|
1281
|
+
mousePosition = _a.sent();
|
|
1282
|
+
planePosition = slideshow_1.node.obj3D.position;
|
|
1283
|
+
console.log("MOUSE POSITION", mousePosition);
|
|
1284
|
+
console.log("PLANE POSITION", planePosition);
|
|
1285
|
+
if (slideshow_1.object.object_type == "ZIP") {
|
|
1286
|
+
if (slideshow_1.id != _currentSlideShowID) {
|
|
1287
|
+
_currentSlideIndex = _slideShowImage.find(function (elem) { return elem.id === slideshow_1.id; }).idx;
|
|
1288
|
+
console.log("CURRENT INDEX", _currentSlideIndex);
|
|
1289
|
+
_currentSlideShow = _slideShowImage.find(function (elem) { return elem.id === slideshow_1.id; }).images;
|
|
1290
|
+
console.log("CURRENT SLIDE", _currentSlideShow);
|
|
1291
|
+
}
|
|
1292
|
+
if (slideshow_1.id == _currentSlideShowID) {
|
|
1293
|
+
console.log("ChangeImage", slideshow_1, _currentSlideShowID);
|
|
1294
|
+
if (planePosition.x < mousePosition.x) {
|
|
1295
|
+
console.log("LEFT SIDE");
|
|
1296
|
+
clearInterval(_timer);
|
|
1297
|
+
// model.pause()
|
|
1298
|
+
this.inputs.src = imageStream("prev");
|
|
1299
|
+
}
|
|
1300
|
+
else if (planePosition.y < mousePosition.y) {
|
|
1301
|
+
console.log("RIGHT SIDE");
|
|
1302
|
+
// model.pause()
|
|
1303
|
+
clearInterval(_timer);
|
|
1304
|
+
this.inputs.src = imageStream("next");
|
|
1305
|
+
}
|
|
1306
|
+
else if (planePosition.y > mousePosition.y) {
|
|
1307
|
+
console.log("AUTOPLAY");
|
|
1308
|
+
_timer = setInterval(function () {
|
|
1309
|
+
_currentSlideIndex =
|
|
1310
|
+
(_currentSlideIndex + 1) % _currentSlideShow.length;
|
|
1311
|
+
console.log("CURRENT INDEX", _currentSlideIndex);
|
|
1312
|
+
_this.inputs.src = imageStream("next");
|
|
1313
|
+
}, 2000);
|
|
1314
|
+
}
|
|
1315
|
+
}
|
|
1316
|
+
else {
|
|
1317
|
+
_currentSlideShowID = slideshow_1.id;
|
|
1318
|
+
}
|
|
1319
|
+
}
|
|
1320
|
+
_a.label = 2;
|
|
1321
|
+
case 2: return [2 /*return*/];
|
|
1322
|
+
}
|
|
1323
|
+
});
|
|
1324
|
+
});
|
|
1325
|
+
};
|
|
1326
|
+
this.onInputsUpdated = function (previous) {
|
|
1327
|
+
var _this = this;
|
|
1328
|
+
this.releaseTexture();
|
|
1329
|
+
var three = this.context.three;
|
|
1330
|
+
// Create IMAGE
|
|
1331
|
+
this.t_image = document.createElement("IMG");
|
|
1332
|
+
this.t_image.src = this.inputs.src;
|
|
1333
|
+
this.t_image.setAttribute("width", "auto");
|
|
1334
|
+
this.t_image.setAttribute("height", "auto");
|
|
1335
|
+
this.t_image.crossOrigin = "anonymous";
|
|
1336
|
+
var planeGeo = new three.PlaneGeometry(1.5, 1.5);
|
|
1337
|
+
// planeGeo.scale(1, 480/720, 1);
|
|
1338
|
+
planeGeo.translate(0, 0.33, 0);
|
|
1339
|
+
// this.texture = new THREE.Texture(this.t_image);
|
|
1340
|
+
// used texture loader for onLoad callback
|
|
1341
|
+
if (previous.src != this.inputs.src) {
|
|
1342
|
+
console.log("this.inputs.src", this.inputs.src);
|
|
1343
|
+
this.texture = new three.TextureLoader().load(this.t_image.src, function (tex) {
|
|
1344
|
+
if (tex === void 0) { tex = _this.texture; }
|
|
1345
|
+
// onLoad callback function
|
|
1346
|
+
tex.minFilter = three.LinearFilter;
|
|
1347
|
+
tex.magFilter = three.LinearFilter;
|
|
1348
|
+
tex.format = three.RGBAFormat;
|
|
1349
|
+
tex.needsUpdate = true; //This should be true in order to update the texture
|
|
1350
|
+
tex.onUpdate = _this.textureUpdated;
|
|
1351
|
+
_this.material = new three.MeshBasicMaterial({
|
|
1352
|
+
map: _this.texture,
|
|
1353
|
+
side: three.DoubleSide,
|
|
1354
|
+
transparent: true,
|
|
1355
|
+
// color: 0xFF0000,
|
|
1356
|
+
alphaTest: 0.5,
|
|
1357
|
+
});
|
|
1358
|
+
_this.mesh = new three.Mesh(planeGeo, _this.material); //Create a mesh for the Plane
|
|
1359
|
+
_this.mesh.scale.set(1.0, _this.texture.image.height / _this.texture.image.width, 1.0); // setting the aspect ratio of image as the scale of mesh
|
|
1360
|
+
_this.outputs.objectRoot = _this.mesh;
|
|
1361
|
+
_this.outputs.collider = _this.mesh;
|
|
1362
|
+
_this.outputs.texture = _this.texture;
|
|
1363
|
+
_this.outputs.t_image = _this.t_image;
|
|
1364
|
+
});
|
|
1365
|
+
}
|
|
1366
|
+
if (this.mesh != null) {
|
|
1367
|
+
this.mesh.visible = this.inputs.visible;
|
|
1368
|
+
}
|
|
1369
|
+
};
|
|
1370
|
+
this.textureUpdated = function (params) {
|
|
1371
|
+
console.log("Update Callback", params);
|
|
1372
|
+
};
|
|
1373
|
+
this.releaseTexture = function () {
|
|
1374
|
+
if (this.texture) {
|
|
1375
|
+
this.outputs.texture = null;
|
|
1376
|
+
}
|
|
1377
|
+
};
|
|
1378
|
+
this.onTick = function (tickDelta) { };
|
|
1379
|
+
this.onDestroy = function () {
|
|
1380
|
+
this.material.dispose();
|
|
1381
|
+
this.texture.dispose();
|
|
1382
|
+
};
|
|
1383
|
+
}
|
|
1384
|
+
function makeSlideScreenModelRenderer() {
|
|
1385
|
+
return new SlideScreenModelRenderer();
|
|
1386
|
+
}
|
|
1387
|
+
// Registering the component with the sdk
|
|
1388
|
+
_atwin.Scene.register("slideScreenModel", makeSlideScreenModelRenderer);
|
|
1389
|
+
}
|
|
1390
|
+
//This is the function for rendering the slidescreen model
|
|
1391
|
+
function showSlideScreenModel(object) {
|
|
1392
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1393
|
+
var sceneObject, modelNode, component, slideShow;
|
|
1394
|
+
return __generator(this, function (_a) {
|
|
1395
|
+
switch (_a.label) {
|
|
1396
|
+
case 0:
|
|
1397
|
+
createSlideScreenModel();
|
|
1398
|
+
return [4 /*yield*/, _atwin.Scene.createObjects(1)];
|
|
1399
|
+
case 1:
|
|
1400
|
+
sceneObject = (_a.sent())[0];
|
|
1401
|
+
modelNode = sceneObject.addNode();
|
|
1402
|
+
component = modelNode.addComponent("slideScreenModel");
|
|
1403
|
+
console.log("COMPONENT", component);
|
|
1404
|
+
modelNode.scale.set = {
|
|
1405
|
+
x: object.object_scale.x,
|
|
1406
|
+
y: object.object_scale.y,
|
|
1407
|
+
z: object.object_scale.z,
|
|
1408
|
+
};
|
|
1409
|
+
//@ts-ignore
|
|
1410
|
+
modelNode.obj3D.position.set(object.object_position.x, object.object_position.y, object.object_position.z);
|
|
1411
|
+
//@ts-ignore
|
|
1412
|
+
modelNode.obj3D.rotation.set(object.object_rotation.x, object.object_rotation.y, object.object_rotation.z);
|
|
1413
|
+
// modelNode.scale.set(1, 1, 1)
|
|
1414
|
+
// modelNode.position.set(-3.32,0.01 ,3.33)
|
|
1415
|
+
modelNode.start();
|
|
1416
|
+
return [4 /*yield*/, addImageToSlideShow(object.object_data, component, object.id)];
|
|
1417
|
+
case 2:
|
|
1418
|
+
_a.sent();
|
|
1419
|
+
console.log("SLIDE OUTPUT", component.outputs);
|
|
1420
|
+
slideShow = {
|
|
1421
|
+
id: object.id,
|
|
1422
|
+
collider: component.outputs,
|
|
1423
|
+
object: object.object_data,
|
|
1424
|
+
node: modelNode,
|
|
1425
|
+
component: component,
|
|
1426
|
+
type: 'ZIP'
|
|
1427
|
+
};
|
|
1428
|
+
_allSlideShow.push(slideShow);
|
|
1429
|
+
console.log("ALL SLIDESHOW", _allSlideShow);
|
|
1430
|
+
return [2 /*return*/];
|
|
1431
|
+
}
|
|
1432
|
+
});
|
|
1433
|
+
});
|
|
1434
|
+
}
|
|
1435
|
+
//This function is accessing the zip files and place it inside the slidescreen
|
|
1436
|
+
function addImageToSlideShow(data, component, objectID) {
|
|
1437
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1438
|
+
var dataList;
|
|
1439
|
+
return __generator(this, function (_a) {
|
|
1440
|
+
switch (_a.label) {
|
|
1441
|
+
case 0:
|
|
1442
|
+
dataList = [];
|
|
1443
|
+
return [4 /*yield*/, new JSZip.external.Promise(function (resolve, reject) {
|
|
1444
|
+
JSZipUtils.getBinaryContent(data.amazon_uri, function (err, data) {
|
|
1445
|
+
if (err) {
|
|
1446
|
+
console.log("getBI error", err);
|
|
1447
|
+
reject(err);
|
|
1448
|
+
}
|
|
1449
|
+
else {
|
|
1450
|
+
console.log("getBI success", data);
|
|
1451
|
+
resolve(data);
|
|
1452
|
+
}
|
|
1453
|
+
});
|
|
1454
|
+
})
|
|
1455
|
+
.then(function (data) {
|
|
1456
|
+
console.log("data from getBI", data);
|
|
1457
|
+
//@ts-ignore
|
|
1458
|
+
return JSZip.loadAsync(data);
|
|
1459
|
+
})
|
|
1460
|
+
.then(function (data) {
|
|
1461
|
+
console.log("data from loadAsync", data);
|
|
1462
|
+
var _loop_1 = function (key) {
|
|
1463
|
+
// determine whether it is a directory
|
|
1464
|
+
if (key.includes("__MACOSX"))
|
|
1465
|
+
return "continue";
|
|
1466
|
+
if (key.includes(".DS_Store"))
|
|
1467
|
+
return "continue";
|
|
1468
|
+
if (data.files[key].dir)
|
|
1469
|
+
return "continue";
|
|
1470
|
+
var base = data.file(data.files[key].name).async("base64"); // will be converted to base64 format picture
|
|
1471
|
+
base.then(function (res) {
|
|
1472
|
+
dataList.push({
|
|
1473
|
+
name: data.files[key].name,
|
|
1474
|
+
path: "data:image/png;base64,".concat(res),
|
|
1475
|
+
});
|
|
1476
|
+
if (dataList.length == 1) {
|
|
1477
|
+
component.inputs.src = "data:image/png;base64,".concat(res);
|
|
1478
|
+
}
|
|
1479
|
+
});
|
|
1480
|
+
};
|
|
1481
|
+
for (var key in data.files) {
|
|
1482
|
+
_loop_1(key);
|
|
1483
|
+
}
|
|
1484
|
+
_slideShowImage.push({
|
|
1485
|
+
id: objectID,
|
|
1486
|
+
images: dataList,
|
|
1487
|
+
idx: 0,
|
|
1488
|
+
playID: null,
|
|
1489
|
+
play: false,
|
|
1490
|
+
comp: component,
|
|
1491
|
+
});
|
|
1492
|
+
})];
|
|
1493
|
+
case 1:
|
|
1494
|
+
_a.sent();
|
|
1495
|
+
return [2 /*return*/];
|
|
1496
|
+
}
|
|
1497
|
+
});
|
|
1498
|
+
});
|
|
1499
|
+
}
|
|
1500
|
+
function getMousePosition() {
|
|
1501
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1502
|
+
var planePosition;
|
|
1503
|
+
return __generator(this, function (_a) {
|
|
1504
|
+
switch (_a.label) {
|
|
1505
|
+
case 0: return [4 /*yield*/, _atwin.Pointer.intersection.subscribe(function (intersection) {
|
|
1506
|
+
planePosition = intersection.position;
|
|
1507
|
+
// console.log("This is intersection mouse position", planePosition);
|
|
1508
|
+
})];
|
|
1509
|
+
case 1:
|
|
1510
|
+
_a.sent();
|
|
1511
|
+
// pointer.cancel();
|
|
1512
|
+
return [2 /*return*/, planePosition];
|
|
1513
|
+
}
|
|
1514
|
+
});
|
|
1515
|
+
});
|
|
1516
|
+
}
|
|
1517
|
+
//This is the function to change the image in the slideshow
|
|
1518
|
+
function imageStream(direction) {
|
|
1519
|
+
var diff = direction === "prev" ? -1 : 1;
|
|
1520
|
+
var length = _currentSlideShow.length;
|
|
1521
|
+
var index = _currentSlideIndex + diff;
|
|
1522
|
+
if (index === -1) {
|
|
1523
|
+
index = length - 1;
|
|
1524
|
+
}
|
|
1525
|
+
if (index === length) {
|
|
1526
|
+
index = 0;
|
|
1527
|
+
}
|
|
1528
|
+
_currentSlideIndex = index;
|
|
1529
|
+
_slideShowImage.find(function (elem) { return elem.id === _currentSlideShowID; }).idx = index;
|
|
1530
|
+
return _currentSlideShow[_currentSlideIndex].path;
|
|
1531
|
+
}
|
|
1532
|
+
// ===== END OBJECTS FUNCTIONALITY =====
|
|
1533
|
+
// ===== NAVIGATION AND CAMERA CONTROL =====
|
|
1534
|
+
function cameraRotate(x, y, speed) {
|
|
1535
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1536
|
+
return __generator(this, function (_a) {
|
|
1537
|
+
switch (_a.label) {
|
|
1538
|
+
case 0:
|
|
1539
|
+
// x and y is rotation in horizontal and vertical rotation in degrees
|
|
1540
|
+
// speed, speed of rotation
|
|
1541
|
+
return [4 /*yield*/, _atwin.Camera.rotate(x, y, { speed: speed })
|
|
1542
|
+
.then(function () {
|
|
1543
|
+
console.log("camera rotate success.", x, y);
|
|
1544
|
+
})
|
|
1545
|
+
.catch(function (error) {
|
|
1546
|
+
console.log("camera rotate error.", error);
|
|
1547
|
+
})];
|
|
1548
|
+
case 1:
|
|
1549
|
+
// x and y is rotation in horizontal and vertical rotation in degrees
|
|
1550
|
+
// speed, speed of rotation
|
|
1551
|
+
_a.sent();
|
|
1552
|
+
return [2 /*return*/];
|
|
1553
|
+
}
|
|
1554
|
+
});
|
|
1555
|
+
});
|
|
1556
|
+
}
|
|
1557
|
+
function cameraPan(x, z) {
|
|
1558
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1559
|
+
var mode;
|
|
1560
|
+
return __generator(this, function (_a) {
|
|
1561
|
+
switch (_a.label) {
|
|
1562
|
+
case 0:
|
|
1563
|
+
mode = getViewMode();
|
|
1564
|
+
if (!(mode == _atwin.Mode.Mode.FLOORPLAN ||
|
|
1565
|
+
mode == _atwin.Mode.Mode.DOLLHOUSE)) return [3 /*break*/, 2];
|
|
1566
|
+
// x is pan (look sideways left and right) in degrees
|
|
1567
|
+
// z is tilt (look up and down) in degrees
|
|
1568
|
+
return [4 /*yield*/, _atwin.Camera.pan({ x: x, z: z })
|
|
1569
|
+
.then(function () {
|
|
1570
|
+
console.log("camera pan success.");
|
|
1571
|
+
})
|
|
1572
|
+
.catch(function (error) {
|
|
1573
|
+
console.log("camera rotate error:", error);
|
|
1574
|
+
})];
|
|
1575
|
+
case 1:
|
|
1576
|
+
// x is pan (look sideways left and right) in degrees
|
|
1577
|
+
// z is tilt (look up and down) in degrees
|
|
1578
|
+
_a.sent();
|
|
1579
|
+
return [3 /*break*/, 3];
|
|
1580
|
+
case 2:
|
|
1581
|
+
console.error("Incorrect view mode.");
|
|
1582
|
+
_a.label = 3;
|
|
1583
|
+
case 3: return [2 /*return*/];
|
|
1584
|
+
}
|
|
1585
|
+
});
|
|
1586
|
+
});
|
|
1587
|
+
}
|
|
1588
|
+
function cameraLookAt(x, y) {
|
|
1589
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1590
|
+
return __generator(this, function (_a) {
|
|
1591
|
+
switch (_a.label) {
|
|
1592
|
+
case 0:
|
|
1593
|
+
// set camera view at coordinate in SCREEN
|
|
1594
|
+
// x and y is PIXEL from upper left corner
|
|
1595
|
+
return [4 /*yield*/, _atwin.Camera.lookAtScreenCoords(x, y)
|
|
1596
|
+
.then(function () {
|
|
1597
|
+
console.log("camera looking at...", x, y);
|
|
1598
|
+
})
|
|
1599
|
+
.catch(function (error) {
|
|
1600
|
+
console.log("camera looking at error:", error);
|
|
1601
|
+
})];
|
|
1602
|
+
case 1:
|
|
1603
|
+
// set camera view at coordinate in SCREEN
|
|
1604
|
+
// x and y is PIXEL from upper left corner
|
|
1605
|
+
_a.sent();
|
|
1606
|
+
return [2 /*return*/];
|
|
1607
|
+
}
|
|
1608
|
+
});
|
|
1609
|
+
});
|
|
1610
|
+
}
|
|
1611
|
+
/**
|
|
1612
|
+
* Moves the camera position in the direction of the argument provided.
|
|
1613
|
+
* @constructor
|
|
1614
|
+
* @param direction FORWARD,BACKWARD,LEFT,RIGHT,UP,DOWN
|
|
1615
|
+
* @type {string}
|
|
1616
|
+
*/
|
|
1617
|
+
function moveInDirection(direction) {
|
|
1618
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1619
|
+
var nextDirection;
|
|
1620
|
+
return __generator(this, function (_a) {
|
|
1621
|
+
switch (_a.label) {
|
|
1622
|
+
case 0:
|
|
1623
|
+
nextDirection = _atwin.Camera.Direction.LEFT;
|
|
1624
|
+
switch (direction.toUpperCase()) {
|
|
1625
|
+
case "LEFT":
|
|
1626
|
+
nextDirection = _atwin.Camera.Direction.LEFT;
|
|
1627
|
+
break;
|
|
1628
|
+
case "RIGHT":
|
|
1629
|
+
nextDirection = _atwin.Camera.Direction.RIGHT;
|
|
1630
|
+
break;
|
|
1631
|
+
case "UP":
|
|
1632
|
+
nextDirection = _atwin.Camera.Direction.UP;
|
|
1633
|
+
break;
|
|
1634
|
+
case "DOWN":
|
|
1635
|
+
nextDirection = _atwin.Camera.Direction.DOWN;
|
|
1636
|
+
break;
|
|
1637
|
+
case "BACK":
|
|
1638
|
+
nextDirection = _atwin.Camera.Direction.BACK;
|
|
1639
|
+
break;
|
|
1640
|
+
case "FORWARD":
|
|
1641
|
+
nextDirection = _atwin.Camera.Direction.FORWARD;
|
|
1642
|
+
break;
|
|
1643
|
+
default:
|
|
1644
|
+
nextDirection = _atwin.Camera.Direction.LEFT;
|
|
1645
|
+
break;
|
|
1646
|
+
}
|
|
1647
|
+
return [4 /*yield*/, _atwin.Camera.moveInDirection(nextDirection)
|
|
1648
|
+
.then(function () {
|
|
1649
|
+
console.log("Move to...", nextDirection);
|
|
1650
|
+
})
|
|
1651
|
+
.catch(function () {
|
|
1652
|
+
console.warn("An error occured while moving in that direction.", nextDirection);
|
|
1653
|
+
})];
|
|
1654
|
+
case 1:
|
|
1655
|
+
_a.sent();
|
|
1656
|
+
return [2 /*return*/];
|
|
1657
|
+
}
|
|
1658
|
+
});
|
|
1659
|
+
});
|
|
1660
|
+
}
|
|
1661
|
+
// =========================================== END NAVIGATION AND CAMERA CONTROL ===================================
|
|
1662
|
+
// =========================================== MODE FUNCTIONALITY ==================================================
|
|
1663
|
+
function getViewMode() {
|
|
1664
|
+
return _currentViewMode;
|
|
1665
|
+
}
|
|
1666
|
+
function setViewMode(mode) {
|
|
1667
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1668
|
+
var modeType;
|
|
1669
|
+
return __generator(this, function (_a) {
|
|
1670
|
+
switch (_a.label) {
|
|
1671
|
+
case 0:
|
|
1672
|
+
console.log("=== get Mode Type ===", _getModeType(mode));
|
|
1673
|
+
modeType = _getModeType(mode);
|
|
1674
|
+
return [4 /*yield*/, _atwin.Mode.moveTo(modeType)
|
|
1675
|
+
.then(function (nextMode) {
|
|
1676
|
+
// Move successful.
|
|
1677
|
+
console.log("Arrived at new view mode " + nextMode);
|
|
1678
|
+
})
|
|
1679
|
+
.catch(function (error) {
|
|
1680
|
+
// Error with moveTo command
|
|
1681
|
+
console.error("Error occur on:", error);
|
|
1682
|
+
})];
|
|
1683
|
+
case 1:
|
|
1684
|
+
_a.sent();
|
|
1685
|
+
return [2 /*return*/];
|
|
1686
|
+
}
|
|
1687
|
+
});
|
|
1688
|
+
});
|
|
1689
|
+
}
|
|
1690
|
+
function _getModeType(mode) {
|
|
1691
|
+
var modes = {
|
|
1692
|
+
DOLLHOUSE: "mode.dollhouse",
|
|
1693
|
+
FLOORPLAN: "mode.floorplan",
|
|
1694
|
+
INSIDE: "mode.inside",
|
|
1695
|
+
OUTSIDE: "mode.outside",
|
|
1696
|
+
TRANSITIONING: "mode.transitioning",
|
|
1697
|
+
};
|
|
1698
|
+
return modes[mode.toUpperCase()] || "";
|
|
1699
|
+
}
|
|
1700
|
+
// ================== INPUT EVENT CLASSES ======================= //
|
|
1701
|
+
var ClickSpy = /** @class */ (function () {
|
|
1702
|
+
function ClickSpy(data, node, component) {
|
|
1703
|
+
this.eventType = 'INTERACTION.CLICK';
|
|
1704
|
+
this.object_data = data;
|
|
1705
|
+
this.node = node;
|
|
1706
|
+
this.component = component;
|
|
1707
|
+
}
|
|
1708
|
+
ClickSpy.prototype.onEvent = function (payload) {
|
|
1709
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1710
|
+
var selectedObj;
|
|
1711
|
+
return __generator(this, function (_a) {
|
|
1712
|
+
switch (_a.label) {
|
|
1713
|
+
case 0:
|
|
1714
|
+
console.log('INTERACTION.CLICK', payload);
|
|
1715
|
+
selectedObj = {
|
|
1716
|
+
object: this.object_data,
|
|
1717
|
+
node: this.node,
|
|
1718
|
+
component: this.component
|
|
1719
|
+
};
|
|
1720
|
+
setSelectedObject(this.object_data, this.node, this.component);
|
|
1721
|
+
return [4 /*yield*/, setTransformControls(selectedObj)];
|
|
1722
|
+
case 1:
|
|
1723
|
+
_a.sent();
|
|
1724
|
+
return [2 /*return*/];
|
|
1725
|
+
}
|
|
1726
|
+
});
|
|
1727
|
+
});
|
|
1728
|
+
};
|
|
1729
|
+
return ClickSpy;
|
|
1730
|
+
}());
|
|
1731
|
+
export default {
|
|
1732
|
+
tags: tags,
|
|
1733
|
+
sweeps: sweeps,
|
|
1734
|
+
connectSpace: connectSpace,
|
|
1735
|
+
gotoTag: gotoTag,
|
|
1736
|
+
getCurrentSweep: getCurrentSweep,
|
|
1737
|
+
getCurrentSweepPosition: getCurrentSweepPosition,
|
|
1738
|
+
moveToSweep: moveToSweep,
|
|
1739
|
+
getNearbySweeps: getNearbySweeps,
|
|
1740
|
+
pauseVideo: pauseVideo,
|
|
1741
|
+
playVideo: playVideo,
|
|
1742
|
+
getCurrentCameraPose: getCurrentCameraPose,
|
|
1743
|
+
getCameraPosition: getCameraPosition,
|
|
1744
|
+
moveInDirection: moveInDirection,
|
|
1745
|
+
cameraLookAt: cameraLookAt,
|
|
1746
|
+
cameraPan: cameraPan,
|
|
1747
|
+
cameraRotate: cameraRotate,
|
|
1748
|
+
getViewMode: getViewMode,
|
|
1749
|
+
setViewMode: setViewMode,
|
|
1750
|
+
};
|