@benjos/create-boilerplate 1.4.0 → 1.5.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/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/template-react/package-lock.json +3 -18
- package/template-react/package.json +1 -1
- package/template-vanilla/eslint.config.js +5 -11
- package/template-vanilla/index.html +18 -20
- package/template-vanilla/package-lock.json +3 -13
- package/template-vanilla/package.json +1 -1
- package/template-vanilla/src/experiences/Experience.ts +10 -5
- package/template-vanilla/src/experiences/cameras/threes/DebugThreeCameraController.ts +3 -3
- package/template-vanilla/src/experiences/cameras/threes/LoaderThreeCameraController.ts +2 -2
- package/template-vanilla/src/experiences/cameras/threes/bases/ThreeCameraControllerBase.ts +2 -2
- package/template-vanilla/src/experiences/commands/InitCommand.ts +4 -4
- package/template-vanilla/src/experiences/constants/experiences/DebugGuiTitle.ts +6 -0
- package/template-vanilla/src/experiences/constants/experiences/ViewId.ts +2 -1
- package/template-vanilla/src/experiences/engines/threes/MainThree.ts +6 -91
- package/template-vanilla/src/experiences/engines/threes/app/LoaderThreeApp.ts +49 -0
- package/template-vanilla/src/experiences/engines/threes/app/MainThreeApp.ts +109 -0
- package/template-vanilla/src/experiences/engines/threes/{bases/ThreeBase.ts → app/bases/ThreeAppBase.ts} +49 -11
- package/template-vanilla/src/experiences/managers/DebugManager.ts +13 -2
- package/template-vanilla/src/experiences/managers/LoaderManager.ts +97 -7
- package/template-vanilla/src/experiences/managers/threes/ThreeRaycasterManager.ts +2 -2
- package/template-vanilla/src/experiences/materials/threes/loaders/LoaderMaterial.ts +4 -4
- package/template-vanilla/src/experiences/renderers/threes/LoaderRenderer.ts +2 -2
- package/template-vanilla/src/experiences/renderers/threes/Renderer.ts +2 -1
- package/template-vanilla/src/experiences/shaders/threes/loaders/LoaderFragmentShader.glsl +2 -0
- package/template-vanilla/src/experiences/styles/commons/main.scss +5 -30
- package/template-vanilla/src/experiences/styles/style.scss +1 -1
- package/template-vanilla/src/experiences/styles/views/loader.scss +1 -4
- package/template-vanilla/src/experiences/types/global.d.ts +2 -2
- package/template-vanilla/src/experiences/views/htmls/bases/HTMLViewBase.ts +0 -3
- package/template-vanilla/src/experiences/views/htmls/loaders/LoaderHTMLView.ts +7 -8
- package/template-vanilla/src/experiences/views/threes/bases/ThreeViewBase.ts +29 -6
- package/template-vanilla/src/experiences/views/threes/loaders/LoaderThreeView.ts +9 -19
- package/template-vanilla/src/experiences/views/threes/loaders/components/{ThreeTemplateLoader.ts → TemplateLoaderThreeActor.ts} +6 -12
- package/template-vanilla/src/experiences/views/threes/worlds/World2ThreeView.ts +35 -0
- package/template-vanilla/src/experiences/views/threes/worlds/WorldThreeView.ts +12 -20
- package/template-vanilla/src/experiences/views/threes/worlds/components/Environment.ts +25 -9
- package/template-vanilla/src/experiences/views/threes/worlds/components/actors/TemplateFont.ts +2 -8
- package/template-vanilla/src/experiences/views/threes/worlds/components/actors/TemplateMesh.ts +4 -6
- package/template-vanilla/src/experiences/views/threes/worlds/components/actors/TemplateMesh2.ts +71 -0
- package/template-vanilla/src/experiences/views/threes/worlds/components/actors/TemplateModel.ts +9 -3
- package/template-vanilla/src/experiences/views/threes/worlds/components/actors/bases/ThreeActorBase.ts +44 -0
- package/template-vanilla/src/experiences/views/threes/worlds/components/actors/bases/{AnimatedModelBase.ts → ThreeAnimatedModelBase.ts} +3 -3
- package/template-vanilla/src/experiences/views/threes/worlds/components/actors/bases/{ModelBase.ts → ThreeModelBase.ts} +2 -16
- package/template-vanilla/tsconfig.json +3 -8
- package/template-vanilla/src/experiences/engines/threes/LoaderThree.ts +0 -39
- package/template-vanilla/src/experiences/views/threes/worlds/components/actors/bases/ActorBase.ts +0 -13
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { DomUtils } from '@benjos/cookware';
|
|
2
|
+
import { Scene } from 'three';
|
|
3
|
+
import LoaderThreeCameraController from '../../../cameras/threes/LoaderThreeCameraController';
|
|
4
|
+
import { CameraId } from '../../../constants/experiences/CameraId';
|
|
5
|
+
import LoaderManager from '../../../managers/LoaderManager';
|
|
6
|
+
import ThreeCameraControllerManager from '../../../managers/threes/ThreeCameraControllerManager';
|
|
7
|
+
import LoaderRenderer from '../../../renderers/threes/LoaderRenderer';
|
|
8
|
+
import LoaderThreeView from '../../../views/threes/loaders/LoaderThreeView';
|
|
9
|
+
import ThreeAppBase from './bases/ThreeAppBase';
|
|
10
|
+
|
|
11
|
+
class LoaderThreeApp extends ThreeAppBase {
|
|
12
|
+
constructor() {
|
|
13
|
+
super();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
protected override _setDomElementContainer(): void {
|
|
17
|
+
this._domElementContainer = DomUtils.GetLoader();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
protected override _generateScenes(): void {
|
|
21
|
+
this._scene = new Scene();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
protected override _generateCameras(): void {
|
|
25
|
+
ThreeCameraControllerManager.add(new LoaderThreeCameraController());
|
|
26
|
+
this._cameraController = ThreeCameraControllerManager.get(CameraId.THREE_LOADER);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
protected override _generateRenderers(): void {
|
|
30
|
+
this._renderer = new LoaderRenderer(
|
|
31
|
+
this._scene,
|
|
32
|
+
ThreeCameraControllerManager.get(CameraId.THREE_LOADER).camera
|
|
33
|
+
);
|
|
34
|
+
this._domElementContainer.appendChild(this._renderer.domElement);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
protected override _declareViews(): void {
|
|
38
|
+
const loaderThreeView = new LoaderThreeView();
|
|
39
|
+
this._views.push(loaderThreeView);
|
|
40
|
+
this._currentView = loaderThreeView;
|
|
41
|
+
loaderThreeView.init();
|
|
42
|
+
this._scene.add(loaderThreeView);
|
|
43
|
+
|
|
44
|
+
LoaderManager.setShowTransition(loaderThreeView.show);
|
|
45
|
+
LoaderManager.setHideTransition(loaderThreeView.hide);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export default new LoaderThreeApp();
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { DomKeyboardManager, DomUtils } from '@benjos/cookware';
|
|
2
|
+
import { KeyboardConstant } from '@benjos/spices';
|
|
3
|
+
import { MeshStandardMaterial, Scene } from 'three';
|
|
4
|
+
import DebugThreeCameraController from '../../../cameras/threes/DebugThreeCameraController';
|
|
5
|
+
import MainThreeCameraController from '../../../cameras/threes/MainThreeCameraController';
|
|
6
|
+
import { CameraId } from '../../../constants/experiences/CameraId';
|
|
7
|
+
import { DebugGuiTitle } from '../../../constants/experiences/DebugGuiTitle';
|
|
8
|
+
import { ViewId } from '../../../constants/experiences/ViewId';
|
|
9
|
+
import DebugManager from '../../../managers/DebugManager';
|
|
10
|
+
import ThreeCameraControllerManager from '../../../managers/threes/ThreeCameraControllerManager';
|
|
11
|
+
import Renderer from '../../../renderers/threes/Renderer';
|
|
12
|
+
import World2ThreeView from '../../../views/threes/worlds/World2ThreeView';
|
|
13
|
+
import WorldThreeView from '../../../views/threes/worlds/WorldThreeView';
|
|
14
|
+
import ThreeAppBase from './bases/ThreeAppBase';
|
|
15
|
+
|
|
16
|
+
class MainThreeApp extends ThreeAppBase {
|
|
17
|
+
private static readonly _DEBUG_WIREFRAME_MATERIAL_COLOR: number = 0x3f79f3;
|
|
18
|
+
private static readonly _TOGGLE_SWITCH_TO_DEBUG_CAMERA_KEYS: string[] = [
|
|
19
|
+
KeyboardConstant.CODES.SHIFT_LEFT,
|
|
20
|
+
KeyboardConstant.CODES.KEY_C,
|
|
21
|
+
];
|
|
22
|
+
private static readonly _TOGGLE_WIREFRAME_KEYS: string[] = [
|
|
23
|
+
KeyboardConstant.CODES.SHIFT_LEFT,
|
|
24
|
+
KeyboardConstant.CODES.KEY_W,
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
declare private _debugWireframeMaterial: MeshStandardMaterial;
|
|
28
|
+
|
|
29
|
+
constructor() {
|
|
30
|
+
super();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public override init(): void {
|
|
34
|
+
super.init();
|
|
35
|
+
|
|
36
|
+
if (DebugManager.isActive) {
|
|
37
|
+
window.mainThreeApp = this;
|
|
38
|
+
DomKeyboardManager.onKeyDown.add(this._onKeyDown);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
protected override _setDomElementContainer(): void {
|
|
43
|
+
this._domElementContainer = DomUtils.GetApp();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
protected override _generateScenes(): void {
|
|
47
|
+
this._scene = new Scene();
|
|
48
|
+
|
|
49
|
+
if (DebugManager.isActive) {
|
|
50
|
+
this._debugWireframeMaterial = new MeshStandardMaterial({
|
|
51
|
+
wireframe: true,
|
|
52
|
+
color: MainThreeApp._DEBUG_WIREFRAME_MATERIAL_COLOR,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
protected override _generateCameras(): void {
|
|
58
|
+
ThreeCameraControllerManager.add(new MainThreeCameraController(), true);
|
|
59
|
+
this._cameraController = ThreeCameraControllerManager.get(CameraId.THREE_MAIN);
|
|
60
|
+
|
|
61
|
+
if (DebugManager.isActive) {
|
|
62
|
+
ThreeCameraControllerManager.add(new DebugThreeCameraController());
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
ThreeCameraControllerManager.onActiveThreeCameraControllerChange.add(this._onActiveCameraControllerChange);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
protected override _generateRenderers(): void {
|
|
69
|
+
this._renderer = new Renderer(this._scene, this._cameraController.camera, { antialias: true });
|
|
70
|
+
this._domElementContainer.appendChild(this._renderer.domElement);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
protected override _declareViews(): void {
|
|
74
|
+
this._viewBuilder.set(ViewId.THREE_VIEW_WORLD_1, WorldThreeView);
|
|
75
|
+
this._viewBuilder.set(ViewId.THREE_VIEW_WORLD_2, World2ThreeView);
|
|
76
|
+
|
|
77
|
+
if (DebugManager.isActive) {
|
|
78
|
+
const viewsDebug = DebugManager.getGuiFolder(DebugGuiTitle.THREE_VIEWS)
|
|
79
|
+
viewsDebug.add({ resetCurrentView: () => this._currentView.reset() }, 'resetCurrentView');
|
|
80
|
+
viewsDebug.add({ createWorld1: () => this.setCurrentView(ViewId.THREE_VIEW_WORLD_1) }, 'createWorld1');
|
|
81
|
+
viewsDebug.add({ createWorld2: () => this.setCurrentView(ViewId.THREE_VIEW_WORLD_2) }, 'createWorld2');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private _onActiveCameraControllerChange = (): void => {
|
|
86
|
+
this._cameraController = ThreeCameraControllerManager.activeThreeCameraController;
|
|
87
|
+
this._renderer.setCamera(this._cameraController.camera);
|
|
88
|
+
this._onResize();
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
private readonly _onKeyDown = (_e: KeyboardEvent): void => {
|
|
92
|
+
if (DebugManager.isActive) {
|
|
93
|
+
if (DomKeyboardManager.areAllKeysDown(MainThreeApp._TOGGLE_SWITCH_TO_DEBUG_CAMERA_KEYS)) {
|
|
94
|
+
ThreeCameraControllerManager.setActiveCamera(
|
|
95
|
+
this._cameraController.cameraId === CameraId.THREE_MAIN ? CameraId.THREE_DEBUG : CameraId.THREE_MAIN
|
|
96
|
+
);
|
|
97
|
+
} else if (DomKeyboardManager.areAllKeysDown(MainThreeApp._TOGGLE_WIREFRAME_KEYS)) {
|
|
98
|
+
if (this._scene.overrideMaterial === null) {
|
|
99
|
+
this._scene.overrideMaterial = this._debugWireframeMaterial;
|
|
100
|
+
} else {
|
|
101
|
+
this._scene.overrideMaterial = null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export type { MainThreeApp };
|
|
109
|
+
export default new MainThreeApp();
|
|
@@ -1,34 +1,42 @@
|
|
|
1
1
|
import { DomResizeManager, TickerManager } from '@benjos/cookware';
|
|
2
2
|
import { Scene } from 'three';
|
|
3
|
-
import ThreeCameraControllerBase from '
|
|
4
|
-
import
|
|
5
|
-
import
|
|
3
|
+
import ThreeCameraControllerBase from '../../../../cameras/threes/bases/ThreeCameraControllerBase';
|
|
4
|
+
import { ViewId } from '../../../../constants/experiences/ViewId';
|
|
5
|
+
import LoaderManager from '../../../../managers/LoaderManager';
|
|
6
|
+
import WebGLRendererBase from '../../../../renderers/threes/bases/WebGLRendererBase';
|
|
7
|
+
import ThreeViewBase from '../../../../views/threes/bases/ThreeViewBase';
|
|
6
8
|
|
|
7
|
-
export default abstract class
|
|
9
|
+
export default abstract class ThreeAppBase {
|
|
8
10
|
declare protected _domElementContainer: HTMLElement;
|
|
9
11
|
declare protected _scene: Scene;
|
|
10
12
|
declare protected _cameraController: ThreeCameraControllerBase;
|
|
11
13
|
declare protected _renderer: WebGLRendererBase;
|
|
12
14
|
protected readonly _views: ThreeViewBase[];
|
|
15
|
+
protected readonly _viewBuilder: Map<ViewId, new () => ThreeViewBase>;
|
|
13
16
|
declare protected _currentView: ThreeViewBase;
|
|
14
17
|
|
|
15
|
-
constructor(
|
|
16
|
-
this._domElementContainer = domElementContainer;
|
|
18
|
+
constructor() {
|
|
17
19
|
this._views = [];
|
|
20
|
+
this._viewBuilder = new Map();
|
|
18
21
|
}
|
|
19
22
|
|
|
20
23
|
public init(): void {
|
|
21
24
|
TickerManager.add(this._update);
|
|
22
25
|
|
|
26
|
+
this._setDomElementContainer();
|
|
23
27
|
this._generateScenes();
|
|
24
28
|
this._generateCameras();
|
|
25
29
|
this._generateRenderers();
|
|
26
|
-
this.
|
|
30
|
+
this._declareViews();
|
|
27
31
|
|
|
28
32
|
this._onResize();
|
|
29
33
|
DomResizeManager.onResize.add(this._onResize);
|
|
30
34
|
}
|
|
31
35
|
|
|
36
|
+
protected _setDomElementContainer(): void {
|
|
37
|
+
//
|
|
38
|
+
}
|
|
39
|
+
|
|
32
40
|
protected _generateScenes(): void {
|
|
33
41
|
//
|
|
34
42
|
}
|
|
@@ -41,20 +49,50 @@ export default abstract class ThreeBase {
|
|
|
41
49
|
//
|
|
42
50
|
}
|
|
43
51
|
|
|
44
|
-
protected
|
|
52
|
+
protected _declareViews(): void {
|
|
45
53
|
//
|
|
46
54
|
}
|
|
47
55
|
|
|
48
|
-
protected
|
|
49
|
-
|
|
56
|
+
protected _generateView(viewId: ViewId): ThreeViewBase {
|
|
57
|
+
const ViewConstructor = this._viewBuilder.get(viewId);
|
|
58
|
+
if (!ViewConstructor) {
|
|
59
|
+
throw new Error(`View constructor for ID '${viewId}' not found.`);
|
|
60
|
+
}
|
|
61
|
+
const view = new ViewConstructor();
|
|
62
|
+
this._views.push(view);
|
|
63
|
+
return view;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public async setCurrentView(viewId: ViewId): Promise<void> {
|
|
67
|
+
if (this._currentView?.viewId === viewId) return;
|
|
68
|
+
|
|
69
|
+
let view = this._getViewById(viewId);
|
|
70
|
+
if (!view) view = this._generateView(viewId);
|
|
71
|
+
|
|
72
|
+
view.declareAssets();
|
|
73
|
+
|
|
74
|
+
await LoaderManager.loadAssetsWithTransition(this._swapView.bind(this, view));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private readonly _swapView = (view: ThreeViewBase): void => {
|
|
50
78
|
if (this._currentView) this._removeOldView(this._currentView);
|
|
51
79
|
this._currentView = view;
|
|
80
|
+
view.init();
|
|
52
81
|
this.scene.add(this._currentView);
|
|
53
82
|
}
|
|
54
83
|
|
|
84
|
+
private _getViewById(viewId: ViewId): ThreeViewBase | null {
|
|
85
|
+
let view;
|
|
86
|
+
for (const v of this._views) {
|
|
87
|
+
if (v.viewId === viewId) view = v;
|
|
88
|
+
}
|
|
89
|
+
return view || null;
|
|
90
|
+
}
|
|
91
|
+
|
|
55
92
|
private _removeOldView(view: ThreeViewBase): void {
|
|
56
93
|
this.scene.remove(view);
|
|
57
94
|
view.dispose();
|
|
95
|
+
view.reset();
|
|
58
96
|
}
|
|
59
97
|
|
|
60
98
|
protected _onResize = (): void => {
|
|
@@ -67,7 +105,7 @@ export default abstract class ThreeBase {
|
|
|
67
105
|
|
|
68
106
|
private _update = (dt: number): void => {
|
|
69
107
|
this._cameraController.update(dt);
|
|
70
|
-
this._currentView
|
|
108
|
+
this._currentView?.update(dt);
|
|
71
109
|
this._renderer.update(dt);
|
|
72
110
|
};
|
|
73
111
|
|
|
@@ -2,7 +2,8 @@ import { DomKeyboardManager } from '@benjos/cookware';
|
|
|
2
2
|
import { KeyboardConstant } from '@benjos/spices';
|
|
3
3
|
import GUI from 'lil-gui';
|
|
4
4
|
import { ThreePerf } from 'three-perf';
|
|
5
|
-
import
|
|
5
|
+
import { DebugGuiTitle } from '../constants/experiences/DebugGuiTitle';
|
|
6
|
+
import MainThreeApp from '../engines/threes/app/MainThreeApp';
|
|
6
7
|
|
|
7
8
|
class DebugManager {
|
|
8
9
|
private static readonly _IS_ACTIVE_STRING: string = '#debug';
|
|
@@ -40,11 +41,21 @@ class DebugManager {
|
|
|
40
41
|
anchorX: DebugManager._THREE_PERF_ANCHOR_X,
|
|
41
42
|
anchorY: DebugManager._THREE_PERF_ANCHOR_Y,
|
|
42
43
|
domElement: document.body,
|
|
43
|
-
renderer:
|
|
44
|
+
renderer: MainThreeApp.renderer,
|
|
44
45
|
showGraph: false,
|
|
45
46
|
});
|
|
46
47
|
};
|
|
47
48
|
|
|
49
|
+
private _addGuiFolder(title: DebugGuiTitle): GUI {
|
|
50
|
+
return this._gui.addFolder(title);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public getGuiFolder(title: DebugGuiTitle): GUI {
|
|
54
|
+
let gui = this._gui.folders.find(gui => gui._title === title);
|
|
55
|
+
if (!gui) gui = this._addGuiFolder(title);
|
|
56
|
+
return gui;
|
|
57
|
+
}
|
|
58
|
+
|
|
48
59
|
public beginThreePerf(): void {
|
|
49
60
|
if (!this._threePerf) this._initThreePerf();
|
|
50
61
|
this._threePerf.begin();
|
|
@@ -1,27 +1,47 @@
|
|
|
1
|
-
import { Action } from '@benjos/cookware';
|
|
1
|
+
import { Action, TickerManager } from '@benjos/cookware';
|
|
2
2
|
import ThreeAssetsManager from './threes/ThreeAssetsManager';
|
|
3
3
|
|
|
4
4
|
class LoaderManager {
|
|
5
|
+
private static readonly _MIN_LOAD_DURATION: number = 0.5;
|
|
6
|
+
|
|
5
7
|
private _totalSize = 0;
|
|
6
8
|
private _loadedSize = 0;
|
|
9
|
+
private _progress = 0;
|
|
10
|
+
private _isTransitioning = false;
|
|
11
|
+
private _elapsed = 0;
|
|
12
|
+
private _hasAssetsToLoad = false;
|
|
13
|
+
private _assetsFinished = false;
|
|
14
|
+
private _transitionResolve: (() => void) | null = null;
|
|
15
|
+
private _showTransition: (() => Promise<void>) | null = null;
|
|
16
|
+
private _hideTransition: (() => Promise<void>) | null = null;
|
|
7
17
|
|
|
8
18
|
public readonly onBeginLoad = new Action();
|
|
9
19
|
public readonly onProgress = new Action();
|
|
10
20
|
public readonly onFinishLoad = new Action();
|
|
21
|
+
public readonly onShow = new Action();
|
|
22
|
+
public readonly onHide = new Action();
|
|
11
23
|
|
|
12
24
|
public init(): void {
|
|
13
25
|
this._addCallbacks();
|
|
14
26
|
}
|
|
15
27
|
|
|
28
|
+
public setShowTransition(callback: () => Promise<void>): void {
|
|
29
|
+
this._showTransition = callback;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public setHideTransition(callback: () => Promise<void>): void {
|
|
33
|
+
this._hideTransition = callback;
|
|
34
|
+
}
|
|
35
|
+
|
|
16
36
|
private _addCallbacks(): void {
|
|
17
37
|
this._removeCallbacks();
|
|
18
38
|
ThreeAssetsManager.onLoad.add(this._onLoad);
|
|
19
|
-
ThreeAssetsManager.onProgress.add(this.
|
|
39
|
+
ThreeAssetsManager.onProgress.add(this._onAssetProgress);
|
|
20
40
|
}
|
|
21
41
|
|
|
22
42
|
private _removeCallbacks(): void {
|
|
23
43
|
ThreeAssetsManager.onLoad.remove(this._onLoad);
|
|
24
|
-
ThreeAssetsManager.onProgress.remove(this.
|
|
44
|
+
ThreeAssetsManager.onProgress.remove(this._onAssetProgress);
|
|
25
45
|
}
|
|
26
46
|
|
|
27
47
|
private _beginLoad = (): void => {
|
|
@@ -34,9 +54,75 @@ class LoaderManager {
|
|
|
34
54
|
this.onFinishLoad.execute();
|
|
35
55
|
};
|
|
36
56
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
this.
|
|
57
|
+
private async _showLoader(): Promise<void> {
|
|
58
|
+
this.onShow.execute();
|
|
59
|
+
if (this._showTransition) await this._showTransition();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
private async _hideLoader(): Promise<void> {
|
|
63
|
+
this.onHide.execute();
|
|
64
|
+
if (this._hideTransition) await this._hideTransition();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
private readonly _onAssetsFinish = (): void => {
|
|
68
|
+
this._assetsFinished = true;
|
|
69
|
+
this.onFinishLoad.remove(this._onAssetsFinish);
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
private readonly _onTransitionTick = (dt: number): void => {
|
|
73
|
+
this._elapsed += dt;
|
|
74
|
+
const timerProgress = Math.min(this._elapsed / LoaderManager._MIN_LOAD_DURATION, 1);
|
|
75
|
+
|
|
76
|
+
let assetProgress = 1;
|
|
77
|
+
if (this._hasAssetsToLoad && !this._assetsFinished) {
|
|
78
|
+
assetProgress = this._totalSize > 0 ? Math.min(this._loadedSize / this._totalSize, 1) : 0;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
this._progress = Math.min(timerProgress, assetProgress);
|
|
82
|
+
this.onProgress.execute();
|
|
83
|
+
|
|
84
|
+
if (timerProgress >= 1 && this._assetsFinished) {
|
|
85
|
+
this._progress = 1;
|
|
86
|
+
this.onProgress.execute();
|
|
87
|
+
TickerManager.remove(this._onTransitionTick);
|
|
88
|
+
if (this._transitionResolve) this._transitionResolve();
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
public async loadAssetsWithTransition(onReady?: () => void | Promise<void>): Promise<void> {
|
|
93
|
+
const isNested = this._isTransitioning;
|
|
94
|
+
if (!isNested) {
|
|
95
|
+
this._isTransitioning = true;
|
|
96
|
+
await this._showLoader();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
this._hasAssetsToLoad = !this._checkIsFinished();
|
|
100
|
+
|
|
101
|
+
if (this._hasAssetsToLoad || !isNested) {
|
|
102
|
+
this._progress = 0;
|
|
103
|
+
this._elapsed = 0;
|
|
104
|
+
this._assetsFinished = !this._hasAssetsToLoad;
|
|
105
|
+
this.onProgress.execute();
|
|
106
|
+
|
|
107
|
+
if (this._hasAssetsToLoad) {
|
|
108
|
+
this.onFinishLoad.add(this._onAssetsFinish);
|
|
109
|
+
this._beginLoad();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
await new Promise<void>((resolve) => {
|
|
113
|
+
this._transitionResolve = resolve;
|
|
114
|
+
TickerManager.add(this._onTransitionTick);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
this._transitionResolve = null;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (onReady) await onReady();
|
|
121
|
+
|
|
122
|
+
if (!isNested) {
|
|
123
|
+
this._isTransitioning = false;
|
|
124
|
+
await this._hideLoader();
|
|
125
|
+
}
|
|
40
126
|
}
|
|
41
127
|
|
|
42
128
|
private _onLoad = (): void => {
|
|
@@ -49,8 +135,9 @@ class LoaderManager {
|
|
|
49
135
|
return true;
|
|
50
136
|
};
|
|
51
137
|
|
|
52
|
-
private
|
|
138
|
+
private _onAssetProgress = (): void => {
|
|
53
139
|
this._refreshSizes();
|
|
140
|
+
this._progress = this._totalSize > 0 ? Math.min(this._loadedSize / this._totalSize, 1) : 0;
|
|
54
141
|
this.onProgress.execute();
|
|
55
142
|
};
|
|
56
143
|
|
|
@@ -74,6 +161,9 @@ class LoaderManager {
|
|
|
74
161
|
public get isLoaded(): boolean {
|
|
75
162
|
return this._checkIsFinished();
|
|
76
163
|
}
|
|
164
|
+
public get progress(): number {
|
|
165
|
+
return this._progress;
|
|
166
|
+
}
|
|
77
167
|
public get totalSize(): number {
|
|
78
168
|
return this._totalSize;
|
|
79
169
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DomPointerManager } from '@benjos/cookware';
|
|
2
2
|
import { Object3D, Raycaster, Vector2, type Intersection, type Object3DEventMap } from 'three';
|
|
3
|
-
import
|
|
3
|
+
import MainThreeApp from '../../engines/threes/app/MainThreeApp';
|
|
4
4
|
|
|
5
5
|
class ThreeRaycasterManager {
|
|
6
6
|
private readonly _raycaster = new Raycaster();
|
|
@@ -12,7 +12,7 @@ class ThreeRaycasterManager {
|
|
|
12
12
|
|
|
13
13
|
public castFromCameraToPointer(objects: Object3D[], recursive = true): Intersection<Object3D<Object3DEventMap>>[] {
|
|
14
14
|
this._pointerPosition.set(DomPointerManager.ndcX, DomPointerManager.ndcY);
|
|
15
|
-
this._raycaster.setFromCamera(this._pointerPosition,
|
|
15
|
+
this._raycaster.setFromCamera(this._pointerPosition, MainThreeApp.cameraController.camera);
|
|
16
16
|
const intersects = this._raycaster.intersectObjects(objects, recursive);
|
|
17
17
|
return intersects;
|
|
18
18
|
}
|
|
@@ -23,19 +23,19 @@ export default class LoaderMaterial extends ShaderMaterial {
|
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
public show(): void {
|
|
26
|
+
public async show(): Promise<void> {
|
|
27
27
|
gsap.killTweensOf(this.uniforms.uAlpha);
|
|
28
|
-
gsap.to(this.uniforms.uAlpha, {
|
|
28
|
+
await gsap.to(this.uniforms.uAlpha, {
|
|
29
29
|
value: 1,
|
|
30
30
|
duration: LoaderMaterial._GSAP_DURATION_FADE_IN,
|
|
31
31
|
ease: LoaderMaterial._GSAP_EASE_FADE_IN,
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
public hide(): void {
|
|
35
|
+
public async hide(): Promise<void> {
|
|
36
36
|
gsap.killTweensOf(this.uniforms.uAlpha);
|
|
37
37
|
this.uniforms.uAlpha.value = 1;
|
|
38
|
-
gsap.to(this.uniforms.uAlpha, {
|
|
38
|
+
await gsap.to(this.uniforms.uAlpha, {
|
|
39
39
|
value: 0,
|
|
40
40
|
duration: LoaderMaterial._GSAP_DURATION_FADE_OUT,
|
|
41
41
|
ease: LoaderMaterial._GSAP_EASE_FADE_OUT,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { Camera,
|
|
1
|
+
import { Camera, NoToneMapping, Scene, SRGBColorSpace, type WebGLRendererParameters } from 'three';
|
|
2
2
|
import WebGLRendererBase from './bases/WebGLRendererBase';
|
|
3
3
|
|
|
4
4
|
export default class LoaderRenderer extends WebGLRendererBase {
|
|
5
5
|
private static readonly _DEFAULT_TONE_MAPPING = NoToneMapping;
|
|
6
|
-
private static readonly _DEFAULT_OUTPUT_COLOR_SPACE =
|
|
6
|
+
private static readonly _DEFAULT_OUTPUT_COLOR_SPACE = SRGBColorSpace;
|
|
7
7
|
private static readonly _DEFAULT_TONE_MAPPING_EXPOSURE = 1;
|
|
8
8
|
private static readonly _DEFAULT_CLEAR_COLOR = 0x000000;
|
|
9
9
|
private static readonly _DEFAULT_CLEAR_ALPHA = 0;
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
type ToneMapping,
|
|
17
17
|
type WebGLRendererParameters,
|
|
18
18
|
} from 'three';
|
|
19
|
+
import { DebugGuiTitle } from '../../constants/experiences/DebugGuiTitle';
|
|
19
20
|
import DebugManager from '../../managers/DebugManager';
|
|
20
21
|
import WebGLRendererBase from './bases/WebGLRendererBase';
|
|
21
22
|
|
|
@@ -37,7 +38,7 @@ export default class Renderer extends WebGLRendererBase {
|
|
|
37
38
|
this.setClearColor(Renderer._DEFAULT_CLEAR_COLOR, Renderer._DEFAULT_CLEAR_ALPHA);
|
|
38
39
|
|
|
39
40
|
if (DebugManager.isActive) {
|
|
40
|
-
const rendererFolder = DebugManager.
|
|
41
|
+
const rendererFolder = DebugManager.getGuiFolder(DebugGuiTitle.THREE_RENDERER)
|
|
41
42
|
rendererFolder
|
|
42
43
|
.add(this, 'toneMapping', {
|
|
43
44
|
NoToneMapping,
|
|
@@ -16,13 +16,13 @@ body {
|
|
|
16
16
|
padding: 0;
|
|
17
17
|
overflow: hidden;
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
> #app,
|
|
20
|
+
> #root {
|
|
21
21
|
position: relative;
|
|
22
22
|
width: 100%;
|
|
23
23
|
height: 100%;
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
> #loader {
|
|
26
26
|
position: absolute;
|
|
27
27
|
top: 0;
|
|
28
28
|
left: 0;
|
|
@@ -44,35 +44,10 @@ body {
|
|
|
44
44
|
width: 100%;
|
|
45
45
|
height: 100%;
|
|
46
46
|
opacity: 0;
|
|
47
|
+
transition: opacity $viewTransition ease;
|
|
47
48
|
|
|
48
49
|
&.show {
|
|
49
|
-
opacity: 0;
|
|
50
|
-
animation: showView $viewTransition ease forwards;
|
|
51
|
-
|
|
52
|
-
@keyframes showView {
|
|
53
|
-
0% {
|
|
54
|
-
opacity: 0;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
100% {
|
|
58
|
-
opacity: 1;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
&.hidden {
|
|
64
50
|
opacity: 1;
|
|
65
|
-
animation: hideView $viewTransition ease forwards;
|
|
66
|
-
|
|
67
|
-
@keyframes hideView {
|
|
68
|
-
0% {
|
|
69
|
-
opacity: 1;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
100% {
|
|
73
|
-
opacity: 0;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
51
|
}
|
|
77
52
|
}
|
|
78
53
|
}
|
|
@@ -81,4 +56,4 @@ body {
|
|
|
81
56
|
#three-perf-ui {
|
|
82
57
|
z-index: 999999;
|
|
83
58
|
}
|
|
84
|
-
}
|
|
59
|
+
}
|
|
@@ -8,9 +8,7 @@ body {
|
|
|
8
8
|
>#root {
|
|
9
9
|
>#loader {
|
|
10
10
|
.html-view {
|
|
11
|
-
|
|
12
|
-
animation-duration: $outroFadeOutDuration;
|
|
13
|
-
}
|
|
11
|
+
transition: opacity $outroFadeOutDuration ease;
|
|
14
12
|
}
|
|
15
13
|
}
|
|
16
14
|
}
|
|
@@ -39,7 +37,6 @@ body {
|
|
|
39
37
|
display: flex;
|
|
40
38
|
align-items: center;
|
|
41
39
|
gap: 0.25rem;
|
|
42
|
-
color: $white;
|
|
43
40
|
}
|
|
44
41
|
|
|
45
42
|
.loading-bar {
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
export default abstract class HTMLViewBase {
|
|
3
2
|
declare protected _htmlElement: HTMLDivElement;
|
|
4
3
|
|
|
@@ -12,11 +11,9 @@ export default abstract class HTMLViewBase {
|
|
|
12
11
|
|
|
13
12
|
public show(): void {
|
|
14
13
|
this._htmlElement.classList.add('show');
|
|
15
|
-
this._htmlElement.classList.remove('hidden');
|
|
16
14
|
}
|
|
17
15
|
|
|
18
16
|
public hide(): void {
|
|
19
|
-
this._htmlElement.classList.add('hidden');
|
|
20
17
|
this._htmlElement.classList.remove('show');
|
|
21
18
|
}
|
|
22
19
|
}
|