@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.
- package/README.md +53 -0
- package/dist/components/arcade-render/background/index.js +33 -0
- package/dist/components/arcade-render/background/scene-elements/customGeometry/index.js +46 -0
- package/dist/components/arcade-render/background/scene-elements/index.js +90 -0
- package/dist/components/arcade-render/element/AnimateElement.js +60 -0
- package/dist/components/arcade-render/element/Projection.js +38 -0
- package/dist/components/arcade-render/element/index.js +134 -0
- package/dist/components/arcade-render/elements-list/ClickableArea.js +76 -0
- package/dist/components/arcade-render/elements-list/Poster.js +80 -0
- package/dist/components/arcade-render/elements-list/index.js +152 -0
- package/dist/components/arcade-render/light/index.js +33 -0
- package/dist/components/arcade-render/light/useLight.js +51 -0
- package/dist/components/arcade-render/loading/Loading.js +55 -0
- package/dist/components/arcade-render/loading/LoadingLogic.js +54 -0
- package/dist/components/arcade-render/loading/index.js +21 -0
- package/dist/components/arcade-render/mocks/index.js +12 -0
- package/dist/components/arcade-render/scene/index.js +152 -0
- package/dist/components/cartel-component/components/CartelComponent.js +102 -0
- package/dist/components/cartel-component/index.js +13 -0
- package/dist/components/comic-component/components/ComicComponent.js +106 -0
- package/dist/components/comic-component/components/Slide.js +74 -0
- package/dist/components/comic-component/components/Vignette.js +29 -0
- package/dist/components/comic-component/index.js +13 -0
- package/dist/components/comic-component/mocks/mockForStory.js +58 -0
- package/dist/components/conversational-component/components/ConversationalComponent.js +116 -0
- package/dist/components/conversational-component/index.js +13 -0
- package/dist/components/conversational-pro-component/components/ConversationalProComponent.js +226 -0
- package/dist/components/conversational-pro-component/components/Message.js +42 -0
- package/dist/components/conversational-pro-component/components/Slot.js +67 -0
- package/dist/components/conversational-pro-component/components/SlotList.js +112 -0
- package/dist/components/conversational-pro-component/components/scene/Panel.js +114 -0
- package/dist/components/conversational-pro-component/components/scene/Panels.js +35 -0
- package/dist/components/conversational-pro-component/components/scene/index.js +90 -0
- package/dist/components/conversational-pro-component/index.js +13 -0
- package/dist/components/conversational-pro-component/mocks/mockForStory.js +591 -0
- package/dist/components/cracker-puzzle-component/components/CrackerPuzzleComponent.js +316 -0
- package/dist/components/cracker-puzzle-component/components/DrawGrid/index.js +44 -0
- package/dist/components/cracker-puzzle-component/components/DrawItem/index.js +53 -0
- package/dist/components/cracker-puzzle-component/components/DrawRow/index.js +48 -0
- package/dist/components/cracker-puzzle-component/components/colors.js +12 -0
- package/dist/components/cracker-puzzle-component/components/helpers.js +168 -0
- package/dist/components/cracker-puzzle-component/index.js +13 -0
- package/dist/components/cracker-puzzle-component/mocks/mockForStory.js +219 -0
- package/dist/components/decision-component/components/DecisionBody.js +167 -0
- package/dist/components/decision-component/components/DecisionComponent.js +231 -0
- package/dist/components/decision-component/components/Feedback.js +83 -0
- package/dist/components/decision-component/components/Options.js +37 -0
- package/dist/components/decision-component/components/Rewards.js +203 -0
- package/dist/components/decision-component/index.js +13 -0
- package/dist/components/decision-component/mocks/mockForStory.js +43 -0
- package/dist/components/hacker-puzzle-component/components/HackerPuzzleComponent.js +294 -0
- package/dist/components/hacker-puzzle-component/components/languages.js +12 -0
- package/dist/components/hacker-puzzle-component/index.js +13 -0
- package/dist/components/hacker-puzzle-component/mocks/mockForStory.js +101 -0
- package/dist/components/image-component/components/ImageComponent.js +66 -0
- package/dist/components/image-component/index.js +13 -0
- package/dist/components/image-component/mocks/mockForStory.js +50 -0
- package/dist/components/index.js +163 -0
- package/dist/components/inventory-item/components/InventoryItem.js +100 -0
- package/dist/components/inventory-item/index.js +13 -0
- package/dist/components/inventory-item/mocks/mockForStory.js +28 -0
- package/dist/components/keyboard-puzzle-component/components/FeedbackMessage.js +30 -0
- package/dist/components/keyboard-puzzle-component/components/KeyboardPuzzleComponent.js +160 -0
- package/dist/components/keyboard-puzzle-component/index.js +13 -0
- package/dist/components/keyboard-puzzle-component/mocks/mockForStory.js +36 -0
- package/dist/components/lectures-component/components/LectureButtons.js +50 -0
- package/dist/components/lectures-component/components/LecturesComponent.js +140 -0
- package/dist/components/lectures-component/index.js +13 -0
- package/dist/components/lectures-component/mocks/mockForStory.js +22 -0
- package/dist/components/login-puzzle-component/components/LoginPuzzleComponent.js +170 -0
- package/dist/components/login-puzzle-component/index.js +13 -0
- package/dist/components/login-puzzle-component/mocks/mockForStory.js +38 -0
- package/dist/components/notice-component/components/NoticeComponent.js +61 -0
- package/dist/components/notice-component/index.js +13 -0
- package/dist/components/notice-component/mocks/mockForStory.js +20 -0
- package/dist/components/pdf-component/components/PdfComponent.js +79 -0
- package/dist/components/pdf-component/components/PdfVisor.js +84 -0
- package/dist/components/pdf-component/index.js +23 -0
- package/dist/components/pdf-component/mocks/mockForProps.js +23 -0
- package/dist/components/pikachu-component/components/PikachuComponent.js +24 -0
- package/dist/components/pikachu-component/index.js +13 -0
- package/dist/components/pikachu-component/mocks/mockForStory.js +15 -0
- package/dist/components/url-component/components/UrlComponent.js +92 -0
- package/dist/components/url-component/index.js +13 -0
- package/dist/components/url-component/mocks/mockForProps.js +1 -0
- package/dist/components/video-component/components/VideoComponent.js +72 -0
- package/dist/components/video-component/index.js +13 -0
- package/dist/components/video-component/mocks/mockForStory.js +84 -0
- package/dist/components/video-visor/components/VideoControllers/BufferBar.js +130 -0
- package/dist/components/video-visor/components/VideoControllers/ControlButtons.js +36 -0
- package/dist/components/video-visor/components/VideoControllers/FinishedVideoButtons.js +45 -0
- package/dist/components/video-visor/components/VideoControllers/PlayInitButton.js +46 -0
- package/dist/components/video-visor/components/VideoControllers/SkipButton.js +44 -0
- package/dist/components/video-visor/components/VideoControllers/Timer.js +42 -0
- package/dist/components/video-visor/components/VideoControllers/VolumeBar.js +108 -0
- package/dist/components/video-visor/components/VideoControllers/index.js +122 -0
- package/dist/components/video-visor/components/VideoVisor.js +308 -0
- package/dist/components/video-visor/index.js +13 -0
- package/dist/components/video-visor/mocks/mockForStory.js +27 -0
- package/dist/helpers/LightSet.js +39 -0
- package/dist/helpers/LodController.js +37 -0
- package/dist/helpers/drawLOD.js +358 -0
- package/dist/helpers/index.js +82 -0
- package/dist/helpers/lodStats.js +51 -0
- package/dist/helpers/useGLB.js +62 -0
- package/dist/index.js +18 -0
- 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
|
+
}
|