@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.
Files changed (49) hide show
  1. package/dist/index.js +2 -2
  2. package/dist/index.js.map +1 -1
  3. package/package.json +1 -1
  4. package/template-react/package-lock.json +3 -18
  5. package/template-react/package.json +1 -1
  6. package/template-vanilla/eslint.config.js +5 -11
  7. package/template-vanilla/index.html +18 -20
  8. package/template-vanilla/package-lock.json +3 -13
  9. package/template-vanilla/package.json +1 -1
  10. package/template-vanilla/src/experiences/Experience.ts +10 -5
  11. package/template-vanilla/src/experiences/cameras/threes/DebugThreeCameraController.ts +3 -3
  12. package/template-vanilla/src/experiences/cameras/threes/LoaderThreeCameraController.ts +2 -2
  13. package/template-vanilla/src/experiences/cameras/threes/bases/ThreeCameraControllerBase.ts +2 -2
  14. package/template-vanilla/src/experiences/commands/InitCommand.ts +4 -4
  15. package/template-vanilla/src/experiences/constants/experiences/DebugGuiTitle.ts +6 -0
  16. package/template-vanilla/src/experiences/constants/experiences/ViewId.ts +2 -1
  17. package/template-vanilla/src/experiences/engines/threes/MainThree.ts +6 -91
  18. package/template-vanilla/src/experiences/engines/threes/app/LoaderThreeApp.ts +49 -0
  19. package/template-vanilla/src/experiences/engines/threes/app/MainThreeApp.ts +109 -0
  20. package/template-vanilla/src/experiences/engines/threes/{bases/ThreeBase.ts → app/bases/ThreeAppBase.ts} +49 -11
  21. package/template-vanilla/src/experiences/managers/DebugManager.ts +13 -2
  22. package/template-vanilla/src/experiences/managers/LoaderManager.ts +97 -7
  23. package/template-vanilla/src/experiences/managers/threes/ThreeRaycasterManager.ts +2 -2
  24. package/template-vanilla/src/experiences/materials/threes/loaders/LoaderMaterial.ts +4 -4
  25. package/template-vanilla/src/experiences/renderers/threes/LoaderRenderer.ts +2 -2
  26. package/template-vanilla/src/experiences/renderers/threes/Renderer.ts +2 -1
  27. package/template-vanilla/src/experiences/shaders/threes/loaders/LoaderFragmentShader.glsl +2 -0
  28. package/template-vanilla/src/experiences/styles/commons/main.scss +5 -30
  29. package/template-vanilla/src/experiences/styles/style.scss +1 -1
  30. package/template-vanilla/src/experiences/styles/views/loader.scss +1 -4
  31. package/template-vanilla/src/experiences/types/global.d.ts +2 -2
  32. package/template-vanilla/src/experiences/views/htmls/bases/HTMLViewBase.ts +0 -3
  33. package/template-vanilla/src/experiences/views/htmls/loaders/LoaderHTMLView.ts +7 -8
  34. package/template-vanilla/src/experiences/views/threes/bases/ThreeViewBase.ts +29 -6
  35. package/template-vanilla/src/experiences/views/threes/loaders/LoaderThreeView.ts +9 -19
  36. package/template-vanilla/src/experiences/views/threes/loaders/components/{ThreeTemplateLoader.ts → TemplateLoaderThreeActor.ts} +6 -12
  37. package/template-vanilla/src/experiences/views/threes/worlds/World2ThreeView.ts +35 -0
  38. package/template-vanilla/src/experiences/views/threes/worlds/WorldThreeView.ts +12 -20
  39. package/template-vanilla/src/experiences/views/threes/worlds/components/Environment.ts +25 -9
  40. package/template-vanilla/src/experiences/views/threes/worlds/components/actors/TemplateFont.ts +2 -8
  41. package/template-vanilla/src/experiences/views/threes/worlds/components/actors/TemplateMesh.ts +4 -6
  42. package/template-vanilla/src/experiences/views/threes/worlds/components/actors/TemplateMesh2.ts +71 -0
  43. package/template-vanilla/src/experiences/views/threes/worlds/components/actors/TemplateModel.ts +9 -3
  44. package/template-vanilla/src/experiences/views/threes/worlds/components/actors/bases/ThreeActorBase.ts +44 -0
  45. package/template-vanilla/src/experiences/views/threes/worlds/components/actors/bases/{AnimatedModelBase.ts → ThreeAnimatedModelBase.ts} +3 -3
  46. package/template-vanilla/src/experiences/views/threes/worlds/components/actors/bases/{ModelBase.ts → ThreeModelBase.ts} +2 -16
  47. package/template-vanilla/tsconfig.json +3 -8
  48. package/template-vanilla/src/experiences/engines/threes/LoaderThree.ts +0 -39
  49. 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 '../../../cameras/threes/bases/ThreeCameraControllerBase';
4
- import WebGLRendererBase from '../../../renderers/threes/bases/WebGLRendererBase';
5
- import ThreeViewBase from '../../../views/threes/bases/ThreeViewBase';
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 ThreeBase {
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(domElementContainer: HTMLElement) {
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._generateViews();
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 _generateViews(): void {
52
+ protected _declareViews(): void {
45
53
  //
46
54
  }
47
55
 
48
- protected _setCurrentView(view: ThreeViewBase): void {
49
- if (this._currentView === view) return;
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.update(dt);
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 MainThree from '../engines/threes/MainThree';
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: MainThree.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._onProgress);
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._onProgress);
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
- public loadAllAssets(): void {
38
- if (this._checkIsFinished()) return;
39
- this._beginLoad();
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 _onProgress = (): void => {
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 MainThree from '../../engines/threes/MainThree';
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, MainThree.cameraController.camera);
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, LinearSRGBColorSpace, NoToneMapping, Scene, type WebGLRendererParameters } from 'three';
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 = LinearSRGBColorSpace;
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.gui.addFolder('Renderer');
41
+ const rendererFolder = DebugManager.getGuiFolder(DebugGuiTitle.THREE_RENDERER)
41
42
  rendererFolder
42
43
  .add(this, 'toneMapping', {
43
44
  NoToneMapping,
@@ -3,4 +3,6 @@ uniform float uAlpha;
3
3
 
4
4
  void main() {
5
5
  gl_FragColor = vec4(uColor, uAlpha);
6
+ #include <tonemapping_fragment>
7
+ #include <colorspace_fragment>
6
8
  }
@@ -16,13 +16,13 @@ body {
16
16
  padding: 0;
17
17
  overflow: hidden;
18
18
 
19
- >#app,
20
- >#root {
19
+ > #app,
20
+ > #root {
21
21
  position: relative;
22
22
  width: 100%;
23
23
  height: 100%;
24
24
 
25
- >#loader {
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
+ }
@@ -4,4 +4,4 @@
4
4
  @use './commons/texts.scss';
5
5
  @use './commons/fonts.scss';
6
6
 
7
- @use './views/loader.scss';
7
+ @use './views/loader.scss';
@@ -8,9 +8,7 @@ body {
8
8
  >#root {
9
9
  >#loader {
10
10
  .html-view {
11
- &.hidden {
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,8 +1,8 @@
1
- import { MainThree } from '../engines/threes/MainThree';
1
+ import { MainThreeApp } from '../engines/threes/app/MainThreeApp';
2
2
 
3
3
  declare global {
4
4
  interface Window {
5
- mainThree: MainThree;
5
+ mainThreeApp: MainThreeApp;
6
6
  }
7
7
  }
8
8
 
@@ -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
  }