@gamelearn/arcade-components 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +53 -0
  2. package/dist/components/arcade-render/background/index.js +33 -0
  3. package/dist/components/arcade-render/background/scene-elements/customGeometry/index.js +46 -0
  4. package/dist/components/arcade-render/background/scene-elements/index.js +90 -0
  5. package/dist/components/arcade-render/element/AnimateElement.js +60 -0
  6. package/dist/components/arcade-render/element/Projection.js +38 -0
  7. package/dist/components/arcade-render/element/index.js +134 -0
  8. package/dist/components/arcade-render/elements-list/ClickableArea.js +76 -0
  9. package/dist/components/arcade-render/elements-list/Poster.js +80 -0
  10. package/dist/components/arcade-render/elements-list/index.js +152 -0
  11. package/dist/components/arcade-render/light/index.js +33 -0
  12. package/dist/components/arcade-render/light/useLight.js +51 -0
  13. package/dist/components/arcade-render/loading/Loading.js +55 -0
  14. package/dist/components/arcade-render/loading/LoadingLogic.js +54 -0
  15. package/dist/components/arcade-render/loading/index.js +21 -0
  16. package/dist/components/arcade-render/mocks/index.js +12 -0
  17. package/dist/components/arcade-render/scene/index.js +152 -0
  18. package/dist/components/cartel-component/components/CartelComponent.js +102 -0
  19. package/dist/components/cartel-component/index.js +13 -0
  20. package/dist/components/comic-component/components/ComicComponent.js +106 -0
  21. package/dist/components/comic-component/components/Slide.js +74 -0
  22. package/dist/components/comic-component/components/Vignette.js +29 -0
  23. package/dist/components/comic-component/index.js +13 -0
  24. package/dist/components/comic-component/mocks/mockForStory.js +58 -0
  25. package/dist/components/conversational-component/components/ConversationalComponent.js +116 -0
  26. package/dist/components/conversational-component/index.js +13 -0
  27. package/dist/components/conversational-pro-component/components/ConversationalProComponent.js +226 -0
  28. package/dist/components/conversational-pro-component/components/Message.js +42 -0
  29. package/dist/components/conversational-pro-component/components/Slot.js +67 -0
  30. package/dist/components/conversational-pro-component/components/SlotList.js +112 -0
  31. package/dist/components/conversational-pro-component/components/scene/Panel.js +114 -0
  32. package/dist/components/conversational-pro-component/components/scene/Panels.js +35 -0
  33. package/dist/components/conversational-pro-component/components/scene/index.js +90 -0
  34. package/dist/components/conversational-pro-component/index.js +13 -0
  35. package/dist/components/conversational-pro-component/mocks/mockForStory.js +591 -0
  36. package/dist/components/cracker-puzzle-component/components/CrackerPuzzleComponent.js +316 -0
  37. package/dist/components/cracker-puzzle-component/components/DrawGrid/index.js +44 -0
  38. package/dist/components/cracker-puzzle-component/components/DrawItem/index.js +53 -0
  39. package/dist/components/cracker-puzzle-component/components/DrawRow/index.js +48 -0
  40. package/dist/components/cracker-puzzle-component/components/colors.js +12 -0
  41. package/dist/components/cracker-puzzle-component/components/helpers.js +168 -0
  42. package/dist/components/cracker-puzzle-component/index.js +13 -0
  43. package/dist/components/cracker-puzzle-component/mocks/mockForStory.js +219 -0
  44. package/dist/components/decision-component/components/DecisionBody.js +167 -0
  45. package/dist/components/decision-component/components/DecisionComponent.js +231 -0
  46. package/dist/components/decision-component/components/Feedback.js +83 -0
  47. package/dist/components/decision-component/components/Options.js +37 -0
  48. package/dist/components/decision-component/components/Rewards.js +203 -0
  49. package/dist/components/decision-component/index.js +13 -0
  50. package/dist/components/decision-component/mocks/mockForStory.js +43 -0
  51. package/dist/components/hacker-puzzle-component/components/HackerPuzzleComponent.js +294 -0
  52. package/dist/components/hacker-puzzle-component/components/languages.js +12 -0
  53. package/dist/components/hacker-puzzle-component/index.js +13 -0
  54. package/dist/components/hacker-puzzle-component/mocks/mockForStory.js +101 -0
  55. package/dist/components/image-component/components/ImageComponent.js +66 -0
  56. package/dist/components/image-component/index.js +13 -0
  57. package/dist/components/image-component/mocks/mockForStory.js +50 -0
  58. package/dist/components/index.js +163 -0
  59. package/dist/components/inventory-item/components/InventoryItem.js +100 -0
  60. package/dist/components/inventory-item/index.js +13 -0
  61. package/dist/components/inventory-item/mocks/mockForStory.js +28 -0
  62. package/dist/components/keyboard-puzzle-component/components/FeedbackMessage.js +30 -0
  63. package/dist/components/keyboard-puzzle-component/components/KeyboardPuzzleComponent.js +160 -0
  64. package/dist/components/keyboard-puzzle-component/index.js +13 -0
  65. package/dist/components/keyboard-puzzle-component/mocks/mockForStory.js +36 -0
  66. package/dist/components/lectures-component/components/LectureButtons.js +50 -0
  67. package/dist/components/lectures-component/components/LecturesComponent.js +140 -0
  68. package/dist/components/lectures-component/index.js +13 -0
  69. package/dist/components/lectures-component/mocks/mockForStory.js +22 -0
  70. package/dist/components/login-puzzle-component/components/LoginPuzzleComponent.js +170 -0
  71. package/dist/components/login-puzzle-component/index.js +13 -0
  72. package/dist/components/login-puzzle-component/mocks/mockForStory.js +38 -0
  73. package/dist/components/notice-component/components/NoticeComponent.js +61 -0
  74. package/dist/components/notice-component/index.js +13 -0
  75. package/dist/components/notice-component/mocks/mockForStory.js +20 -0
  76. package/dist/components/pdf-component/components/PdfComponent.js +79 -0
  77. package/dist/components/pdf-component/components/PdfVisor.js +84 -0
  78. package/dist/components/pdf-component/index.js +23 -0
  79. package/dist/components/pdf-component/mocks/mockForProps.js +23 -0
  80. package/dist/components/pikachu-component/components/PikachuComponent.js +24 -0
  81. package/dist/components/pikachu-component/index.js +13 -0
  82. package/dist/components/pikachu-component/mocks/mockForStory.js +15 -0
  83. package/dist/components/url-component/components/UrlComponent.js +92 -0
  84. package/dist/components/url-component/index.js +13 -0
  85. package/dist/components/url-component/mocks/mockForProps.js +1 -0
  86. package/dist/components/video-component/components/VideoComponent.js +72 -0
  87. package/dist/components/video-component/index.js +13 -0
  88. package/dist/components/video-component/mocks/mockForStory.js +84 -0
  89. package/dist/components/video-visor/components/VideoControllers/BufferBar.js +130 -0
  90. package/dist/components/video-visor/components/VideoControllers/ControlButtons.js +36 -0
  91. package/dist/components/video-visor/components/VideoControllers/FinishedVideoButtons.js +45 -0
  92. package/dist/components/video-visor/components/VideoControllers/PlayInitButton.js +46 -0
  93. package/dist/components/video-visor/components/VideoControllers/SkipButton.js +44 -0
  94. package/dist/components/video-visor/components/VideoControllers/Timer.js +42 -0
  95. package/dist/components/video-visor/components/VideoControllers/VolumeBar.js +108 -0
  96. package/dist/components/video-visor/components/VideoControllers/index.js +122 -0
  97. package/dist/components/video-visor/components/VideoVisor.js +308 -0
  98. package/dist/components/video-visor/index.js +13 -0
  99. package/dist/components/video-visor/mocks/mockForStory.js +27 -0
  100. package/dist/helpers/LightSet.js +39 -0
  101. package/dist/helpers/LodController.js +37 -0
  102. package/dist/helpers/drawLOD.js +358 -0
  103. package/dist/helpers/index.js +82 -0
  104. package/dist/helpers/lodStats.js +51 -0
  105. package/dist/helpers/useGLB.js +62 -0
  106. package/dist/index.js +18 -0
  107. package/package.json +75 -0
@@ -0,0 +1,358 @@
1
+ "use strict";
2
+
3
+ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var THREE = _interopRequireWildcard(require("three"));
11
+
12
+ var _lodStats = _interopRequireDefault(require("./lodStats"));
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
17
+
18
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
+
20
+ var loadingManager = new THREE.LoadingManager();
21
+ var imgLoader = new THREE.ImageLoader(loadingManager);
22
+ var pureGlbMode = false;
23
+ var pureGeometryMode = false;
24
+ var currentLOD = 'original';
25
+ var progressiveMode = true;
26
+ var rgbSimulation = false;
27
+ var texturesFrustum = true;
28
+ var texturesDistance = false;
29
+ var showHelpers = false;
30
+ var showStats = false;
31
+ var progressiveOrder = ['divideby64', 'divideby16', 'divideby4', 'original'];
32
+ var lodDistances = {
33
+ divideby64: Infinity,
34
+ divideby16: 200,
35
+ divideby4: 100,
36
+ original: 50
37
+ };
38
+ var redImage = new Image();
39
+ redImage.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg==';
40
+ var greenImage = new Image();
41
+ greenImage.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M/wHwAEBgIApD5fRAAAAABJRU5ErkJggg==';
42
+ var blueImage = new Image();
43
+ blueImage.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPj/HwADBwIAMCbHYQAAAABJRU5ErkJggg==';
44
+ var whiteImage = new Image();
45
+ whiteImage.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+ip1sAAAAASUVORK5CYII=';
46
+
47
+ function roundedRectangle(ctx, rect, radius) {
48
+ var pi = Math.PI;
49
+ var x1 = rect[0];
50
+ var y1 = rect[1];
51
+ var x2 = rect[2] + x1;
52
+ var y2 = rect[3] + y1;
53
+ var cr = radius;
54
+ ctx.beginPath();
55
+ ctx.arc(x1 + cr, y1 + cr, cr, pi, 1.5 * pi); // upper left corner
56
+
57
+ ctx.arc(x2 - cr, y1 + cr, cr, 1.5 * pi, 0); // upper right corner
58
+
59
+ ctx.arc(x2 - cr, y2 - cr, cr, 0, 0.5 * pi); // lower right corner
60
+
61
+ ctx.arc(x1 + cr, y2 - cr, cr, 0.5 * pi, pi); // lower left corner
62
+
63
+ ctx.closePath();
64
+ ctx.strokeStyle = 'rgba(255,255,255,1.0)';
65
+ ctx.lineWidth = 20;
66
+ ctx.stroke();
67
+ }
68
+
69
+ function makeTextSprite(message, opts) {
70
+ var parameters = opts || {};
71
+ var fontface = parameters.fontface || 'Helvetica';
72
+ var fontsize = parameters.fontsize || 120;
73
+ var canvas = document.createElement('canvas');
74
+ var context = canvas.getContext('2d');
75
+ context.font = fontsize + "px " + fontface; // get size data (height depends only on font size)
76
+ // var metrics = context.measureText(message);
77
+ // var textWidth = metrics.width;
78
+ // text color
79
+
80
+ context.fillStyle = 'rgba(255,255,255,1.0)';
81
+ roundedRectangle(context, [0, 0, canvas.width, canvas.height], 25);
82
+ context.fillStyle = 'rgba(255, 255, 255, 1.0)';
83
+ context.fillText(message, 0, fontsize); // canvas contents will be used for a texture
84
+
85
+ var texture = new THREE.Texture(canvas);
86
+ texture.minFilter = THREE.LinearFilter;
87
+ texture.needsUpdate = true;
88
+ var spriteMaterial = new THREE.SpriteMaterial({
89
+ map: texture,
90
+ opacity: 0.5
91
+ });
92
+ var sprite = new THREE.Sprite(spriteMaterial);
93
+ sprite.scale.set(10, 5, 1.0);
94
+ sprite.center.set(0.5, 0.5);
95
+ return sprite;
96
+ }
97
+
98
+ var texturablesDone = function texturablesDone(params) {
99
+ params._texturableElements.forEach(function (elem) {
100
+ elem._isDone = true;
101
+ });
102
+ };
103
+
104
+ var materialize = function materialize(params, lod) {
105
+ var totalLods = 0;
106
+ var doneLods = 0;
107
+
108
+ var checkPromises = function checkPromises() {
109
+ if (doneLods >= totalLods) {
110
+ if (progressiveMode) {
111
+ var currentIndex = progressiveOrder.indexOf(lod);
112
+ var lastIndex = progressiveOrder.indexOf(currentLOD);
113
+
114
+ if (currentIndex < lastIndex) {
115
+ materialize(params, progressiveOrder[currentIndex + 1]);
116
+ } else {
117
+ params._scene._isDone = true;
118
+ texturablesDone(params);
119
+ }
120
+ } else {
121
+ texturablesDone(params);
122
+ }
123
+ }
124
+ };
125
+
126
+ params._texturableElements.forEach(function (elem) {
127
+ if (params._texturesDistance && elem.distanceToCam > lodDistances[lod]) {
128
+ return;
129
+ }
130
+
131
+ if (elem._isDone) return;
132
+ var jsonUrl = elem.url.replace('.glb', '.json');
133
+ fetch(jsonUrl).then(function (response) {
134
+ return response.json();
135
+ }).then(function (materials) {
136
+ elem.traverse(function (obj) {
137
+ if (obj.isMesh || obj.isSkinnedMesh) {
138
+ obj.material.wireframe = false;
139
+
140
+ if (materials[obj.material.name]) {
141
+ materials[obj.material.name].forEach(function (item) {
142
+ var imgSrc = "".concat(elem.url, ".textures.").concat(lod, ".").concat(item.positionInArray, ".png");
143
+ imgLoader.load(imgSrc, function (result) {
144
+ if (showStats) {
145
+ statsTextures(lod, imgSrc, result);
146
+ }
147
+
148
+ obj.material[item.key].image = result;
149
+
150
+ if (rgbSimulation) {
151
+ var image;
152
+
153
+ switch (lod) {
154
+ case 'divideby64':
155
+ image = redImage;
156
+ break;
157
+
158
+ case 'divideby16':
159
+ image = greenImage;
160
+ break;
161
+
162
+ case 'divideby4':
163
+ image = blueImage;
164
+ break;
165
+
166
+ default:
167
+ image = result;
168
+ }
169
+
170
+ obj.material[item.key].image = image;
171
+ }
172
+
173
+ obj.material[item.key].needsUpdate = true;
174
+ doneLods += 1;
175
+ checkPromises();
176
+ });
177
+ totalLods += 1;
178
+ });
179
+ }
180
+ }
181
+ });
182
+ });
183
+ });
184
+ };
185
+
186
+ var updateSceneLods = function updateSceneLods(params) {
187
+ if (!pureGlbMode && !pureGeometryMode
188
+ /*&& !params._scene._isDone*/
189
+ ) {
190
+ if (progressiveMode) {
191
+ materialize(params, progressiveOrder[0]);
192
+ } else {
193
+ materialize(params, currentLOD);
194
+ }
195
+ }
196
+ };
197
+
198
+ var getPerspectiveCamera = function getPerspectiveCamera(params) {
199
+ params._scene.children.forEach(function (item) {
200
+ if (item.type === 'PerspectiveCamera') {
201
+ params._camera = item;
202
+
203
+ if (showHelpers) {
204
+ var helper = new THREE.CameraHelper(params._camera.clone());
205
+
206
+ params._helpers.add(helper);
207
+
208
+ helper.update();
209
+ }
210
+
211
+ ;
212
+ return;
213
+ }
214
+ });
215
+ };
216
+
217
+ var invalidateOutOfFrustum = function invalidateOutOfFrustum(params) {
218
+ params._texturableElements = params._texturableElements.filter(function (elem) {
219
+ var bbox = new THREE.Box3().setFromObject(elem);
220
+
221
+ var insideFrustum = params._frustum.intersectsBox(bbox);
222
+
223
+ elem.bbox = bbox;
224
+
225
+ if (showHelpers) {
226
+ var boundingHelper = new THREE.Box3Helper(bbox, insideFrustum ? 0x00ff00 : 0xff0000);
227
+
228
+ params._helpers.add(boundingHelper);
229
+ }
230
+
231
+ return insideFrustum;
232
+ });
233
+ };
234
+
235
+ var checkDistances = function checkDistances(params) {
236
+ params._texturableElements.forEach(function (elem) {
237
+ var center = new THREE.Vector3();
238
+ elem.bbox.getCenter(center);
239
+ var bsphere = elem.bbox.getBoundingSphere(new THREE.Sphere(center));
240
+ var distance = params._camera.position.distanceTo(center) - bsphere.radius;
241
+ elem.distanceToCam = distance;
242
+
243
+ if (showHelpers) {
244
+ var sphere = new THREE.Mesh(new THREE.SphereGeometry(bsphere.radius, 32, 32), new THREE.MeshStandardMaterial({
245
+ color: 0xffffff,
246
+ opacity: 0.3,
247
+ transparent: true,
248
+ wireframe: true
249
+ }));
250
+ sphere.position.copy(center);
251
+
252
+ params._helpers.add(sphere);
253
+
254
+ var sprite = makeTextSprite(distance);
255
+ sprite.position.copy(sphere.position);
256
+ sprite.position.y = sphere.position.y + bsphere.radius + 2;
257
+
258
+ params._helpers.add(sprite);
259
+ }
260
+ });
261
+ };
262
+
263
+ var statsGeometries = function statsGeometries(params) {
264
+ params._texturableElements.forEach(function (item) {
265
+ var url = item.url.replace('.glb', '.geometry.glb');
266
+ fetch(url).then(function (response) {
267
+ return response.blob();
268
+ }).then(function (blob) {
269
+ var size = blob.size;
270
+ (0, _lodStats.default)({
271
+ geometries: size
272
+ });
273
+ });
274
+ });
275
+ };
276
+
277
+ var statsTextures = function statsTextures(lod, url, image) {
278
+ fetch(url).then(function (response) {
279
+ return response.blob();
280
+ }).then(function (blob) {
281
+ var size = blob.size;
282
+ var obj = {};
283
+ obj[lod] = size;
284
+ (0, _lodStats.default)(obj);
285
+ });
286
+ };
287
+
288
+ var setTexturableElements = function setTexturableElements(params) {
289
+ params._texturableElements = [];
290
+
291
+ params._scene.traverse(function (item) {
292
+ if (item.url) {
293
+ params._texturableElements.push(item);
294
+ }
295
+ });
296
+
297
+ (0, _lodStats.default)({
298
+ reset: true
299
+ });
300
+
301
+ if (showStats) {
302
+ statsGeometries(params);
303
+ }
304
+ };
305
+
306
+ var getHelpers = function getHelpers(scene) {
307
+ var helper = null;
308
+ scene.children.forEach(function (item) {
309
+ if (item.userData.isHelper) {
310
+ helper = item;
311
+ }
312
+ });
313
+ return helper;
314
+ };
315
+
316
+ var drawLOD = function drawLOD(scene) {
317
+ var params = {};
318
+ params._texturesFrustum = texturesFrustum;
319
+ params._texturesDistance = texturesDistance;
320
+ params._scene = scene;
321
+
322
+ params._scene.remove(getHelpers(params._scene));
323
+
324
+ params._helpers = new THREE.Group();
325
+ params._helpers.userData.isHelper = true;
326
+
327
+ params._scene.add(params._helpers);
328
+
329
+ params._camera = null;
330
+ params._frustum = null;
331
+
332
+ if (params._texturesFrustum || params._texturesDistance) {
333
+ getPerspectiveCamera(params);
334
+
335
+ if (params._camera) {
336
+ params._frustum = new THREE.Frustum();
337
+
338
+ params._frustum.setFromProjectionMatrix(new THREE.Matrix4().multiplyMatrices(params._camera.projectionMatrix, params._camera.matrixWorldInverse));
339
+ } else {
340
+ params._texturesFrustum = params._texturesDistance = false;
341
+ }
342
+ }
343
+
344
+ setTexturableElements(params);
345
+
346
+ if (params._texturesFrustum) {
347
+ invalidateOutOfFrustum(params);
348
+ }
349
+
350
+ if (params._texturesDistance) {
351
+ checkDistances(params);
352
+ }
353
+
354
+ updateSceneLods(params);
355
+ };
356
+
357
+ var _default = drawLOD;
358
+ exports.default = _default;
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getObjectPosition = exports.cameraFitAnyObject = exports.usePrevious = exports.formatMessage = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ var _three = require("three");
11
+
12
+ var formatMessage = function formatMessage(text) {
13
+ var values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
14
+ var result = text;
15
+ Object.keys(values).forEach(function (currentValue) {
16
+ result = result.replace("{".concat(currentValue, "}"), values[currentValue]);
17
+ });
18
+ return result;
19
+ };
20
+
21
+ exports.formatMessage = formatMessage;
22
+
23
+ var usePrevious = function usePrevious(value) {
24
+ var ref = (0, _react.useRef)();
25
+ (0, _react.useEffect)(function () {
26
+ ref.current = value;
27
+ }, [value]);
28
+ return ref.current;
29
+ };
30
+
31
+ exports.usePrevious = usePrevious;
32
+
33
+ var cameraFitAnyObject = function cameraFitAnyObject(object, camera) {
34
+ var uOff = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
35
+ var controls = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
36
+ var offset = uOff || 1.25;
37
+ var boundingBox = new _three.Box3();
38
+ boundingBox.setFromObject(object);
39
+ var boundingBoxCenter = boundingBox.getCenter(new _three.Vector3());
40
+ var center = new _three.Vector3(0, boundingBoxCenter.y, 0);
41
+ var size = boundingBox.getSize(new _three.Vector3());
42
+ var maxDim = Math.max(size.x, size.y, size.z);
43
+ var fov = camera.fov * (Math.PI / 180);
44
+ var cameraZ = Math.abs(maxDim * Math.sqrt(2) / 2 * Math.tan(fov * 2));
45
+ cameraZ *= offset;
46
+ var objectWorldPosition = new _three.Vector3();
47
+ objectWorldPosition.setFromMatrixPosition(object.matrixWorld);
48
+ var directionVector = new _three.Vector3(1, 1, 1);
49
+ var unitDirectionVector = directionVector.normalize();
50
+ camera.position.copy(unitDirectionVector.multiplyScalar(cameraZ));
51
+ camera.lookAt(objectWorldPosition);
52
+ var minZ = boundingBox.min.z;
53
+ var cameraToFarEdge = minZ < 0 ? -minZ + cameraZ : cameraZ - minZ;
54
+ camera.far = cameraToFarEdge * 3;
55
+ camera.near = 0.01;
56
+ camera.updateProjectionMatrix();
57
+ camera.lookAt(center);
58
+
59
+ if (controls) {
60
+ controls.target = center;
61
+ controls.maxDistance = cameraToFarEdge * 2;
62
+ controls.saveState();
63
+ }
64
+ };
65
+
66
+ exports.cameraFitAnyObject = cameraFitAnyObject;
67
+
68
+ var getObjectPosition = function getObjectPosition(object, camera, canvas) {
69
+ if (!object) return;
70
+ var point = new _three.Vector3();
71
+ var boundingBox = new _three.Box3().setFromObject(object);
72
+ boundingBox.getCenter(point);
73
+ var p = point.clone();
74
+ camera.updateMatrixWorld();
75
+ p.project(camera);
76
+ var clientHeight = canvas.clientHeight,
77
+ clientWidth = canvas.clientWidth;
78
+ var position = new _three.Vector2((p.x * clientWidth + clientWidth) / 2, (-p.y * clientHeight + clientHeight) / 2);
79
+ return position;
80
+ };
81
+
82
+ exports.getObjectPosition = getObjectPosition;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _root = null;
8
+ var _geo = 0;
9
+ var _divideby64 = 0;
10
+ var _divideby16 = 0;
11
+ var _divideby4 = 0;
12
+ var _original = 0;
13
+ var style = "float:left;margin:5px;padding:5px;";
14
+
15
+ function formatBytes(a) {
16
+ var b = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;
17
+ if (0 === a) return "0 Bytes";
18
+ var c = 0 > b ? 0 : b,
19
+ d = Math.floor(Math.log(a) / Math.log(1024));
20
+ return parseFloat((a / Math.pow(1024, d)).toFixed(c)) + " " + ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"][d];
21
+ }
22
+
23
+ var lodStats = function lodStats(obj) {
24
+ if (!_root) {
25
+ var root = document.getElementById('root');
26
+ var previous = document.getElementById('lodStats');
27
+ if (previous) root.removeChild(previous);
28
+ var div = document.createElement('div');
29
+ div.style = "border-radius:5px;color:white; background-color:black;position: fixed; top: 0px; left: 100px; opacity: 0.5; z-index: 10001;";
30
+ div.id = "lodStats";
31
+ root.appendChild(div);
32
+ _root = div;
33
+ }
34
+
35
+ if (obj.reset) {
36
+ _root.innerHTML = '';
37
+ _root = null;
38
+ _geo = _divideby64 = _divideby16 = _divideby4 = _original = 0;
39
+ } else {
40
+ _geo += obj.geometries ? obj.geometries : 0;
41
+ _divideby64 += obj.divideby64 ? obj.divideby64 : 0;
42
+ _divideby16 += obj.divideby16 ? obj.divideby16 : 0;
43
+ _divideby4 += obj.divideby4 ? obj.divideby4 : 0;
44
+ _original += obj.original ? obj.original : 0; // _root.innerHTML = `Geo: ${_geo} d64: ${_divideby64} d16: ${_divideby16} d4: ${_divideby4} original: ${_original}`;
45
+
46
+ _root.innerHTML = "\n <div style=\"".concat(style, "\"> \n <div>Geometries</div>\n <div>").concat(formatBytes(_geo), "</div>\n </div>\n <div style=\"").concat(style, "\"> \n <div style=\"color:red\">DivideBy64</div>\n <div>").concat(formatBytes(_divideby64), "</div>\n </div>\n <div style=\"").concat(style, "\"> \n <div style=\"color:green\">DivideBy16</div>\n <div>").concat(formatBytes(_divideby16), "</div>\n </div>\n <div style=\"").concat(style, "\"> \n <div style=\"color:blue\">DivideBy4</div>\n <div>").concat(formatBytes(_divideby4), "</div>\n </div>\n <div style=\"").concat(style, "\"> \n <div>Original</div>\n <div>").concat(formatBytes(_original), "</div>\n </div>\n ");
47
+ }
48
+ };
49
+
50
+ var _default = lodStats;
51
+ exports.default = _default;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _reactPromiseSuspense = _interopRequireDefault(require("react-promise-suspense"));
9
+
10
+ var _GLTFLoader = require("three/examples/jsm/loaders/GLTFLoader");
11
+
12
+ var _DRACOLoader = require("three/examples/jsm/loaders/DRACOLoader");
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ // We need this to reuse GLTF and DRACO loaders for Arcade working
17
+ // in Mobile devices, drei.useGLTF instances new loaders every time is
18
+ // used
19
+ var dracoDecoderPath = 'https://www.gstatic.com/draco/versioned/decoders/1.4.1/'; // TODO: Maybe download those files to statics.gamelearn
20
+
21
+ var whiteImage = new Image();
22
+ whiteImage.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+ip1sAAAAASUVORK5CYII=';
23
+ var dracoLoader = new _DRACOLoader.DRACOLoader();
24
+ var gltfLoader = new _GLTFLoader.GLTFLoader();
25
+ dracoLoader.setDecoderPath(dracoDecoderPath);
26
+ gltfLoader.setDRACOLoader(dracoLoader);
27
+
28
+ var treatGeometry = function treatGeometry(res) {
29
+ res.scene.traverse(function (obj) {
30
+ if (obj.isMesh || obj.isSkinnedMesh) {
31
+ var keys = Object.keys(obj.material);
32
+ keys.forEach(function (key) {
33
+ var value = obj.material[key];
34
+
35
+ if (value && value.isTexture) {
36
+ obj.material[key].image = whiteImage;
37
+ }
38
+ });
39
+ obj.material.needsUpdate = true;
40
+ }
41
+ });
42
+ };
43
+
44
+ var fetchGlb = function fetchGlb(originalUrl) {
45
+ var isTexturableObject = originalUrl.includes('/character/') || originalUrl.includes('/object/');
46
+ var url = isTexturableObject ? originalUrl.replace('.glb', '.geometry.glb') : originalUrl;
47
+ return new Promise(function (resolve, reject) {
48
+ gltfLoader.load(url, function (result) {
49
+ treatGeometry(result);
50
+ resolve(result);
51
+ }, null, function (error) {
52
+ return reject(error);
53
+ });
54
+ });
55
+ };
56
+
57
+ var useGLB = function useGLB(url) {
58
+ return (0, _reactPromiseSuspense.default)(fetchGlb, [url]);
59
+ };
60
+
61
+ var _default = useGLB;
62
+ exports.default = _default;
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+
7
+ var _components = require("./components");
8
+
9
+ Object.keys(_components).forEach(function (key) {
10
+ if (key === "default" || key === "__esModule") return;
11
+ if (key in exports && exports[key] === _components[key]) return;
12
+ Object.defineProperty(exports, key, {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _components[key];
16
+ }
17
+ });
18
+ });
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "@gamelearn/arcade-components",
3
+ "version": "0.2.0",
4
+ "main": "dist/index.js",
5
+ "files": [
6
+ "dist",
7
+ "README.md"
8
+ ],
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/gamelearn/arcade-components"
12
+ },
13
+ "dependencies": {
14
+ "@react-three/drei": "4.3.2",
15
+ "@react-three/fiber": "6.0.16",
16
+ "@testing-library/jest-dom": "5.11.4",
17
+ "@testing-library/react": "11.1.0",
18
+ "@testing-library/user-event": "12.1.10",
19
+ "hls.js": "0.12.4",
20
+ "prop-types": "15.7.2",
21
+ "react-pdf": "5.2.0",
22
+ "react-promise-suspense": "0.3.3",
23
+ "react-typist": "^2.0.5",
24
+ "three": "0.128.0",
25
+ "use-sound": "2.0.1",
26
+ "web-vitals": "0.2.4"
27
+ },
28
+ "scripts": {
29
+ "start": "npm run storybook",
30
+ "clean": "rimraf dist",
31
+ "compile": "npm run clean && cross-env NODE_ENV=production babel src -d dist --ignore src/**/*.stories.js,src/**/*.test.js,src/setupTests.js",
32
+ "test": "react-scripts test --transformIgnorePatterns 'node_modules/(?!(three)/)'",
33
+ "eject": "react-scripts eject",
34
+ "storybook": "start-storybook -p 6006 -s public",
35
+ "build-storybook": "build-storybook -s public",
36
+ "generate": "plop"
37
+ },
38
+ "browserslist": {
39
+ "production": [
40
+ ">0.2%",
41
+ "not dead",
42
+ "not op_mini all"
43
+ ],
44
+ "development": [
45
+ "last 1 chrome version",
46
+ "last 1 firefox version",
47
+ "last 1 safari version"
48
+ ]
49
+ },
50
+ "devDependencies": {
51
+ "@babel/cli": "7.12.10",
52
+ "@babel/preset-env": "7.12.11",
53
+ "@babel/preset-react": "7.12.10",
54
+ "@gamelearn/ui-components-core": "5.10.1",
55
+ "@react-three/test-renderer": "6.0.6",
56
+ "@storybook/addon-actions": "6.1.11",
57
+ "@storybook/addon-essentials": "6.1.11",
58
+ "@storybook/addon-links": "6.1.11",
59
+ "@storybook/node-logger": "6.1.11",
60
+ "@storybook/preset-create-react-app": "3.1.5",
61
+ "@storybook/react": "6.1.11",
62
+ "babel-loader": "8.2.2",
63
+ "cross-env": "7.0.3",
64
+ "plop": "^2.7.4",
65
+ "react": "0.0.0-experimental-27659559e",
66
+ "react-dom": "0.0.0-experimental-27659559e",
67
+ "react-scripts": "4.0.1",
68
+ "rimraf": "3.0.2"
69
+ },
70
+ "jest": {
71
+ "moduleNameMapper": {
72
+ "^react-pdf$": "react-pdf/dist/umd/entry.jest"
73
+ }
74
+ }
75
+ }