@benjos/create-boilerplate 1.5.1 → 1.5.6

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 (147) hide show
  1. package/README.md +0 -4
  2. package/dist/constants.d.ts +8 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/constants.js +18 -0
  5. package/dist/constants.js.map +1 -0
  6. package/dist/constants.test.d.ts +2 -0
  7. package/dist/constants.test.d.ts.map +1 -0
  8. package/dist/constants.test.js +30 -0
  9. package/dist/constants.test.js.map +1 -0
  10. package/dist/createProject.d.ts +2 -0
  11. package/dist/createProject.d.ts.map +1 -0
  12. package/dist/createProject.js +52 -0
  13. package/dist/createProject.js.map +1 -0
  14. package/dist/createProject.test.d.ts +2 -0
  15. package/dist/createProject.test.d.ts.map +1 -0
  16. package/dist/createProject.test.js +85 -0
  17. package/dist/createProject.test.js.map +1 -0
  18. package/dist/index.js +16 -69
  19. package/dist/index.js.map +1 -1
  20. package/dist/prompts.d.ts +4 -0
  21. package/dist/prompts.d.ts.map +1 -0
  22. package/dist/prompts.js +26 -0
  23. package/dist/prompts.js.map +1 -0
  24. package/dist/prompts.test.d.ts +2 -0
  25. package/dist/prompts.test.d.ts.map +1 -0
  26. package/dist/prompts.test.js +50 -0
  27. package/dist/prompts.test.js.map +1 -0
  28. package/dist/types.d.ts +13 -0
  29. package/dist/types.d.ts.map +1 -0
  30. package/dist/types.js +7 -0
  31. package/dist/types.js.map +1 -0
  32. package/package.json +10 -8
  33. package/template-vanilla/package-lock.json +1000 -1476
  34. package/template-vanilla/package.json +11 -11
  35. package/template-vanilla/src/experiences/Experience.ts +1 -1
  36. package/template-vanilla/src/experiences/constants/experiences/ViewId.ts +2 -7
  37. package/template-vanilla/src/experiences/engines/threes/app/MainThreeApp.ts +8 -5
  38. package/template-vanilla/src/experiences/managers/LoaderManager.ts +4 -5
  39. package/template-vanilla/src/experiences/materials/threes/loaders/LoaderMaterial.ts +8 -5
  40. package/template-vanilla/src/experiences/views/threes/bases/ThreeViewBase.ts +1 -1
  41. package/template-vanilla/src/experiences/views/threes/{worlds/components/actors/bases → bases/components}/ThreeAnimatedModelBase.ts +3 -3
  42. package/template-vanilla/src/experiences/views/threes/{worlds/components/actors/bases → bases/components}/ThreeModelBase.ts +3 -3
  43. package/template-vanilla/src/experiences/views/threes/loaders/components/TemplateLoaderThreeActor.ts +1 -1
  44. package/template-vanilla/src/experiences/views/threes/worlds/World2ThreeView.ts +5 -5
  45. package/template-vanilla/src/experiences/views/threes/worlds/WorldThreeView.ts +5 -5
  46. package/template-vanilla/src/experiences/views/threes/worlds/components/Environment.ts +1 -1
  47. package/template-vanilla/src/experiences/views/threes/worlds/components/{actors/TemplateFont.ts → TemplateFont.ts} +3 -3
  48. package/template-vanilla/src/experiences/views/threes/worlds/components/{actors/TemplateMesh.ts → TemplateMesh.ts} +3 -3
  49. package/template-vanilla/src/experiences/views/threes/worlds/components/{actors/TemplateMesh2.ts → TemplateMesh2.ts} +3 -3
  50. package/template-vanilla/src/experiences/views/threes/worlds/components/{actors/TemplateModel.ts → TemplateModel.ts} +4 -4
  51. package/template-vanilla/tsconfig.json +3 -3
  52. package/template-vue/eslint.config.js +130 -0
  53. package/template-vue/index.html +17 -0
  54. package/{template-react → template-vue}/package-lock.json +1260 -2121
  55. package/template-vue/package.json +43 -0
  56. package/template-vue/readme.md +34 -0
  57. package/template-vue/src/experiences/Experience.ts +27 -0
  58. package/template-vue/src/experiences/cameras/threes/DebugThreeCameraController.ts +55 -0
  59. package/template-vue/src/experiences/cameras/threes/LoaderThreeCameraController.ts +25 -0
  60. package/template-vue/src/experiences/cameras/threes/MainThreeCameraController.ts +24 -0
  61. package/template-vue/src/experiences/cameras/threes/bases/ThreeCameraControllerBase.ts +90 -0
  62. package/template-vue/src/experiences/commands/InitCommand.ts +50 -0
  63. package/template-vue/src/experiences/constants/experiences/AnimationId.ts +3 -0
  64. package/template-vue/src/experiences/constants/experiences/AssetId.ts +8 -0
  65. package/template-vue/src/experiences/constants/experiences/CameraId.ts +7 -0
  66. package/template-vue/src/experiences/constants/experiences/DebugGuiTitle.ts +6 -0
  67. package/template-vue/src/experiences/constants/experiences/Object3dId.ts +3 -0
  68. package/template-vue/src/experiences/constants/experiences/ViewId.ts +11 -0
  69. package/template-vue/src/experiences/constants/experiences/ViewType.ts +6 -0
  70. package/template-vue/src/experiences/engines/threes/MainThree.ts +11 -0
  71. package/template-vue/src/experiences/engines/threes/app/LoaderThreeApp.ts +49 -0
  72. package/template-vue/src/experiences/engines/threes/app/MainThreeApp.ts +112 -0
  73. package/template-vue/src/experiences/engines/threes/app/bases/ThreeAppBase.ts +128 -0
  74. package/template-vue/src/experiences/engines/vues/MainVue.vue +9 -0
  75. package/template-vue/src/experiences/managers/DebugManager.ts +87 -0
  76. package/template-vue/src/experiences/managers/LoaderManager.ts +176 -0
  77. package/template-vue/src/experiences/managers/threes/ThreeAssetsManager.ts +263 -0
  78. package/template-vue/src/experiences/managers/threes/ThreeCameraControllerManager.ts +46 -0
  79. package/template-vue/src/experiences/managers/threes/ThreeRaycasterManager.ts +21 -0
  80. package/template-vue/src/experiences/materials/threes/loaders/LoaderMaterial.ts +47 -0
  81. package/template-vue/src/experiences/renderers/threes/LoaderRenderer.ts +18 -0
  82. package/template-vue/src/experiences/renderers/threes/Renderer.ts +71 -0
  83. package/template-vue/src/experiences/renderers/threes/bases/WebGLRendererBase.ts +29 -0
  84. package/template-vue/src/experiences/shaders/threes/loaders/LoaderFragmentShader.glsl +8 -0
  85. package/template-vue/src/experiences/shaders/threes/loaders/LoaderVertexShader.glsl +3 -0
  86. package/template-vue/src/experiences/styles/abstracts/_import.scss +5 -0
  87. package/template-vue/src/experiences/styles/abstracts/functions.scss +3 -0
  88. package/template-vue/src/experiences/styles/abstracts/variables.scss +7 -0
  89. package/template-vue/src/experiences/styles/commons/fonts.scss +10 -0
  90. package/template-vue/src/experiences/styles/commons/main.scss +59 -0
  91. package/template-vue/src/experiences/styles/commons/texts.scss +1 -0
  92. package/template-vue/src/experiences/styles/style.scss +7 -0
  93. package/template-vue/src/experiences/styles/views/loader.scss +70 -0
  94. package/template-vue/src/experiences/types/assetTypes.ts +8 -0
  95. package/template-vue/src/experiences/types/cameraTypes.ts +37 -0
  96. package/template-vue/src/experiences/types/global.d.ts +9 -0
  97. package/template-vue/src/experiences/types/shaders.d.ts +4 -0
  98. package/template-vue/src/experiences/views/threes/bases/ThreeViewBase.ts +49 -0
  99. package/template-vue/src/experiences/views/threes/bases/components/ThreeActorBase.ts +44 -0
  100. package/template-vue/src/experiences/views/threes/bases/components/ThreeAnimatedModelBase.ts +63 -0
  101. package/template-vue/src/experiences/views/threes/bases/components/ThreeModelBase.ts +48 -0
  102. package/template-vue/src/experiences/views/threes/loaders/LoaderThreeView.ts +28 -0
  103. package/template-vue/src/experiences/views/threes/loaders/components/TemplateLoaderThreeActor.ts +49 -0
  104. package/template-vue/src/experiences/views/threes/worlds/World2ThreeView.ts +35 -0
  105. package/template-vue/src/experiences/views/threes/worlds/WorldThreeView.ts +35 -0
  106. package/template-vue/src/experiences/views/threes/worlds/components/Environment.ts +89 -0
  107. package/template-vue/src/experiences/views/threes/worlds/components/TemplateFont.ts +58 -0
  108. package/template-vue/src/experiences/views/threes/worlds/components/TemplateMesh.ts +65 -0
  109. package/template-vue/src/experiences/views/threes/worlds/components/TemplateMesh2.ts +71 -0
  110. package/template-vue/src/experiences/views/threes/worlds/components/TemplateModel.ts +33 -0
  111. package/template-vue/src/experiences/views/vues/LoaderView.vue +55 -0
  112. package/template-vue/src/main.ts +7 -0
  113. package/template-vue/tsconfig.app.json +8 -0
  114. package/template-vue/tsconfig.json +7 -0
  115. package/template-vue/tsconfig.node.json +16 -0
  116. package/template-vue/vite.config.ts +16 -0
  117. package/template-react/eslint.config.js +0 -23
  118. package/template-react/index.html +0 -17
  119. package/template-react/package.json +0 -46
  120. package/template-react/readme.md +0 -31
  121. package/template-react/src/App.css +0 -42
  122. package/template-react/src/App.tsx +0 -10
  123. package/template-react/src/index.css +0 -68
  124. package/template-react/src/main.tsx +0 -10
  125. package/template-react/tsconfig.app.json +0 -34
  126. package/template-react/tsconfig.json +0 -7
  127. package/template-react/tsconfig.node.json +0 -26
  128. package/template-react/vite.config.ts +0 -29
  129. /package/template-vanilla/src/experiences/views/threes/{worlds/components/actors/bases → bases/components}/ThreeActorBase.ts +0 -0
  130. /package/{template-react → template-vue}/.prettierignore +0 -0
  131. /package/{template-react → template-vue}/.prettierrc +0 -0
  132. /package/{template-react → template-vue}/public/assets/fonts/LICENSE +0 -0
  133. /package/{template-react → template-vue}/public/assets/fonts/template.typeface.json +0 -0
  134. /package/{template-react → template-vue}/public/assets/hdrs/template.hdr +0 -0
  135. /package/{template-react → template-vue}/public/assets/icons/benjosLogoBlack.svg +0 -0
  136. /package/{template-react → template-vue}/public/assets/loaders/draco/README.md +0 -0
  137. /package/{template-react → template-vue}/public/assets/loaders/draco/draco_decoder.js +0 -0
  138. /package/{template-react → template-vue}/public/assets/loaders/draco/draco_decoder.wasm +0 -0
  139. /package/{template-react → template-vue}/public/assets/loaders/draco/draco_encoder.js +0 -0
  140. /package/{template-react → template-vue}/public/assets/loaders/draco/draco_wasm_wrapper.js +0 -0
  141. /package/{template-react → template-vue}/public/assets/loaders/draco/gltf/draco_decoder.js +0 -0
  142. /package/{template-react → template-vue}/public/assets/loaders/draco/gltf/draco_decoder.wasm +0 -0
  143. /package/{template-react → template-vue}/public/assets/loaders/draco/gltf/draco_encoder.js +0 -0
  144. /package/{template-react → template-vue}/public/assets/loaders/draco/gltf/draco_wasm_wrapper.js +0 -0
  145. /package/{template-react → template-vue}/public/assets/models/template.glb +0 -0
  146. /package/{template-react → template-vue}/public/assets/textures/template.jpg +0 -0
  147. /package/{template-react/assets_source/.gitkeep → template-vue/src/experiences/styles/abstracts/mixins.scss} +0 -0
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "template-vue",
3
+ "private": true,
4
+ "version": "1.5.6",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vue-tsc -b && vite build",
9
+ "preview": "vite preview",
10
+ "lint": "eslint . --max-warnings 0",
11
+ "lint:fix": "eslint . --fix",
12
+ "format": "prettier --write .",
13
+ "format:check": "prettier --check ."
14
+ },
15
+ "devDependencies": {
16
+ "@eslint/js": "^10.0.1",
17
+ "@types/howler": "^2.2.12",
18
+ "@types/three": "^0.183.1",
19
+ "@vitejs/plugin-vue": "^6.0.5",
20
+ "@vue/tsconfig": "^0.9.0",
21
+ "eslint": "^10.1.0",
22
+ "eslint-config-prettier": "^10.1.8",
23
+ "eslint-plugin-prettier": "^5.5.5",
24
+ "prettier": "^3.8.1",
25
+ "sass-embedded": "^1.98.0",
26
+ "three-perf": "^1.0.11",
27
+ "typescript": "~5.9.3",
28
+ "typescript-eslint": "^8.57.1",
29
+ "vite": "^8.0.1",
30
+ "vite-plugin-glsl": "^1.5.6",
31
+ "vue-tsc": "^3.2.6"
32
+ },
33
+ "dependencies": {
34
+ "@benjos/cookware": "^1.0.4",
35
+ "@benjos/spices": "^1.0.1",
36
+ "@dimforge/rapier3d": "^0.19.3",
37
+ "gsap": "^3.14.2",
38
+ "howler": "^2.2.4",
39
+ "lil-gui": "^0.21.0",
40
+ "three": "^0.183.2",
41
+ "vue": "^3.5.30"
42
+ }
43
+ }
@@ -0,0 +1,34 @@
1
+ # 🎨 Three.js Vue Boilerplate
2
+
3
+ Three.js + Vue + Vite + TypeScript boilerplate with a singleton-based architecture.
4
+
5
+ ## 🚀 Quick Start
6
+
7
+ ```bash
8
+ npm i
9
+ npm run dev
10
+ ```
11
+
12
+ ## ✨ Features
13
+
14
+ - Three.js + Vue 3 + Vite + TypeScript
15
+ - GLSL shader support (vite-plugin-glsl)
16
+ - Singleton-based manager architecture (DebugManager, LoaderManager, ThreeAssetsManager, etc.)
17
+ - Lazy loading with animated transitions between views
18
+ - Multi-view system with Vue components and Three.js views (init/reset/dispose lifecycle)
19
+ - ThreeApp layer (LoaderThreeApp, MainThreeApp) for scene orchestration
20
+ - Camera controller system with base classes (MainThreeCameraController, DebugThreeCameraController)
21
+ - ESLint + Prettier
22
+
23
+ ## 🐛 Debug Mode
24
+
25
+ Add `#debug` to URL: `http://localhost:5173/#debug`
26
+
27
+ - `Shift + H` → Toggle debug UI + perf monitor
28
+ - `Shift + C` → Toggle debug camera (OrbitControls)
29
+ - `Shift + W` → Toggle wireframe
30
+ - `Ctrl + Click` → Center camera on object
31
+
32
+ ## 📄 License
33
+
34
+ MIT
@@ -0,0 +1,27 @@
1
+ import './styles/style.scss';
2
+
3
+ import InitCommand from './commands/InitCommand';
4
+ import { ViewId } from './constants/experiences/ViewId';
5
+ import MainThree from './engines/threes/MainThree';
6
+ import MainThreeApp from './engines/threes/app/MainThreeApp';
7
+ import LoaderManager from './managers/LoaderManager';
8
+
9
+ class Experience {
10
+ private _isInitialized = false;
11
+
12
+ public async init(): Promise<void> {
13
+ if (this._isInitialized) return;
14
+ this._isInitialized = true;
15
+
16
+ InitCommand.init();
17
+ MainThree.init();
18
+
19
+ await LoaderManager.loadAssetsWithTransition(this._onReady);
20
+ }
21
+
22
+ private readonly _onReady = async (): Promise<void> => {
23
+ await MainThreeApp.setCurrentView(ViewId.THREE_WORLD_1);
24
+ };
25
+ }
26
+
27
+ export default new Experience();
@@ -0,0 +1,55 @@
1
+ import { DomKeyboardManager, DomPointerManager } from '@benjos/cookware';
2
+ import { KeyboardConstant } from '@benjos/spices';
3
+ import { Vector3 } from 'three';
4
+ import { OrbitControls } from 'three/examples/jsm/Addons.js';
5
+ import { CameraId } from '../../constants/experiences/CameraId';
6
+ import MainThreeApp from '../../engines/threes/app/MainThreeApp';
7
+ import ThreeRaycasterManager from '../../managers/threes/ThreeRaycasterManager';
8
+ import { type ThreeCameraOptions, ThreeCameraType } from '../../types/cameraTypes';
9
+ import ThreeCameraControllerBase from './bases/ThreeCameraControllerBase';
10
+
11
+ export default class DebugThreeCameraController extends ThreeCameraControllerBase<OrbitControls> {
12
+ private static readonly _DEBUG_CAMERA_OPTIONS: ThreeCameraOptions = {
13
+ type: ThreeCameraType.PERSPECTIVE,
14
+ fov: 75,
15
+ aspect: window.innerWidth / window.innerHeight,
16
+ near: 0.1,
17
+ far: 1000,
18
+ };
19
+ private static readonly _DEFAULT_CAMERA_POSITION: Vector3 = new Vector3(0, 1.5, 3);
20
+ private static readonly _CONTROLS_DAMPING_FACTOR: number = 0.05;
21
+ private static readonly _CONTROLS_CENTER_KEY: string = KeyboardConstant.CODES.CONTROL_LEFT;
22
+
23
+ constructor() {
24
+ super(CameraId.THREE_DEBUG, DebugThreeCameraController._DEBUG_CAMERA_OPTIONS);
25
+ this._camera.position.copy(DebugThreeCameraController._DEFAULT_CAMERA_POSITION);
26
+ this._setControls();
27
+ this.disable();
28
+ }
29
+
30
+ public override enable(): void {
31
+ super.enable();
32
+ DomPointerManager.onPointerDown.add(this._onMouseDown);
33
+ }
34
+
35
+ public override disable(): void {
36
+ super.disable();
37
+ DomPointerManager.onPointerDown.remove(this._onMouseDown);
38
+ }
39
+
40
+ private _setControls(): void {
41
+ this._controls = new OrbitControls(this._camera, MainThreeApp.domElementContainer);
42
+ this._controls.enableDamping = true;
43
+ this._controls.dampingFactor = DebugThreeCameraController._CONTROLS_DAMPING_FACTOR;
44
+ }
45
+
46
+ private readonly _onMouseDown = (): void => {
47
+ if (DomKeyboardManager.isKeyDown(DebugThreeCameraController._CONTROLS_CENTER_KEY)) {
48
+ const intersect = ThreeRaycasterManager.castFromCameraToPointer(MainThreeApp.scene.children);
49
+ if (intersect.length > 0) {
50
+ this._controls.target.copy(intersect[0].point);
51
+ this._controls.update();
52
+ }
53
+ }
54
+ };
55
+ }
@@ -0,0 +1,25 @@
1
+ import { Vector3 } from 'three';
2
+ import { CameraId } from '../../constants/experiences/CameraId';
3
+ import LoaderThreeApp from '../../engines/threes/app/LoaderThreeApp';
4
+ import { type ThreeCameraOptions, ThreeCameraType } from '../../types/cameraTypes';
5
+ import ThreeCameraControllerBase from './bases/ThreeCameraControllerBase';
6
+
7
+ export default class LoaderThreeCameraController extends ThreeCameraControllerBase {
8
+ private static readonly _LOADER_CAMERA_OPTIONS: ThreeCameraOptions = {
9
+ type: ThreeCameraType.PERSPECTIVE,
10
+ fov: 75,
11
+ aspect: window.innerWidth / window.innerHeight,
12
+ near: 0.1,
13
+ far: 1,
14
+ };
15
+ private static readonly _DEFAULT_CONTAINER_POSITION: Vector3 = new Vector3(0, 0, 0);
16
+
17
+ constructor() {
18
+ super(CameraId.THREE_LOADER, LoaderThreeCameraController._LOADER_CAMERA_OPTIONS, LoaderThreeApp.scene);
19
+ this._container.position.copy(LoaderThreeCameraController._DEFAULT_CONTAINER_POSITION);
20
+ }
21
+
22
+ public override update(dt: number): void {
23
+ super.update(dt);
24
+ }
25
+ }
@@ -0,0 +1,24 @@
1
+ import { Vector3 } from 'three';
2
+ import { CameraId } from '../../constants/experiences/CameraId';
3
+ import { type ThreeCameraOptions, ThreeCameraType } from '../../types/cameraTypes';
4
+ import ThreeCameraControllerBase from './bases/ThreeCameraControllerBase';
5
+
6
+ export default class MainThreeCameraController extends ThreeCameraControllerBase {
7
+ private static readonly _MAIN_CAMERA_OPTIONS: ThreeCameraOptions = {
8
+ type: ThreeCameraType.PERSPECTIVE,
9
+ fov: 75,
10
+ aspect: window.innerWidth / window.innerHeight,
11
+ near: 0.1,
12
+ far: 1000,
13
+ };
14
+ private static readonly _DEFAULT_CONTAINER_POSITION: Vector3 = new Vector3(0, 1.5, 3);
15
+
16
+ constructor() {
17
+ super(CameraId.THREE_MAIN, MainThreeCameraController._MAIN_CAMERA_OPTIONS);
18
+ this._container.position.copy(MainThreeCameraController._DEFAULT_CONTAINER_POSITION);
19
+ }
20
+
21
+ public override update(dt: number): void {
22
+ super.update(dt);
23
+ }
24
+ }
@@ -0,0 +1,90 @@
1
+ import { DomResizeManager } from '@benjos/cookware';
2
+ import { Object3D, OrthographicCamera, PerspectiveCamera, Scene } from 'three';
3
+ import type { CameraId } from '../../../constants/experiences/CameraId';
4
+ import MainThreeApp from '../../../engines/threes/app/MainThreeApp';
5
+ import { type ThreeCameraOptions, ThreeCameraType, type ThreeControls } from '../../../types/cameraTypes';
6
+
7
+ export default abstract class ThreeCameraControllerBase<T extends ThreeControls = ThreeControls> extends Object3D {
8
+ private static readonly _DEFAULT_CAMERA_OPTIONS: ThreeCameraOptions = {
9
+ type: ThreeCameraType.PERSPECTIVE,
10
+ fov: 75,
11
+ aspect: window.innerWidth / window.innerHeight,
12
+ near: 0.1,
13
+ far: 1000,
14
+ };
15
+
16
+ protected readonly _cameraId: CameraId;
17
+ declare protected _camera: PerspectiveCamera | OrthographicCamera;
18
+ declare protected _container: Object3D;
19
+ declare protected _controls: T;
20
+
21
+ constructor(
22
+ cameraId: CameraId,
23
+ cameraOptions: ThreeCameraOptions = ThreeCameraControllerBase._DEFAULT_CAMERA_OPTIONS,
24
+ scene: Scene = MainThreeApp.scene
25
+ ) {
26
+ super();
27
+ this._cameraId = cameraId;
28
+
29
+ this._generateContainer();
30
+ this._generateCamera(cameraOptions);
31
+
32
+ scene.add(this);
33
+ }
34
+
35
+ private _generateContainer(): void {
36
+ this._container = new Object3D();
37
+ this.add(this._container);
38
+ }
39
+
40
+ private _generateCamera(cameraOptions: ThreeCameraOptions): void {
41
+ if (cameraOptions.type === ThreeCameraType.PERSPECTIVE) {
42
+ this._camera = new PerspectiveCamera(
43
+ cameraOptions.fov,
44
+ cameraOptions.aspect,
45
+ cameraOptions.near,
46
+ cameraOptions.far
47
+ );
48
+ } else {
49
+ this._camera = new OrthographicCamera(
50
+ cameraOptions.left,
51
+ cameraOptions.right,
52
+ cameraOptions.top,
53
+ cameraOptions.bottom,
54
+ cameraOptions.near,
55
+ cameraOptions.far
56
+ );
57
+ }
58
+ this._container.add(this._camera);
59
+ }
60
+
61
+ public enable(): void {
62
+ if (this._controls) this._controls.enabled = true;
63
+ }
64
+
65
+ public disable(): void {
66
+ if (this._controls) this._controls.enabled = false;
67
+ }
68
+
69
+ public resize(): void {
70
+ if (this._camera instanceof PerspectiveCamera) {
71
+ this._camera.aspect = DomResizeManager.width / DomResizeManager.height;
72
+ }
73
+ this._camera.updateProjectionMatrix();
74
+ }
75
+
76
+ public update(_dt: number): void {
77
+ if (this._controls) this._controls.update();
78
+ }
79
+
80
+ //#region Getters
81
+ //
82
+ public get cameraId(): CameraId {
83
+ return this._cameraId;
84
+ }
85
+ public get camera(): PerspectiveCamera | OrthographicCamera {
86
+ return this._camera;
87
+ }
88
+ //
89
+ //#endregion
90
+ }
@@ -0,0 +1,50 @@
1
+ import { AssetUtils, DomKeyboardManager, DomPointerManager, DomResizeManager, TickerManager } from '@benjos/cookware';
2
+ import { AssetId } from '../constants/experiences/AssetId';
3
+ import DebugManager from '../managers/DebugManager';
4
+ import LoaderManager from '../managers/LoaderManager';
5
+ import ThreeAssetsManager from '../managers/threes/ThreeAssetsManager';
6
+ import ThreeCameraControllerManager from '../managers/threes/ThreeCameraControllerManager';
7
+ import ThreeRaycasterManager from '../managers/threes/ThreeRaycasterManager';
8
+
9
+ class InitCommand {
10
+ public init(): void {
11
+ this._initUtils();
12
+ this._initProxies();
13
+ this._initManagers();
14
+ this._initCommonAssets();
15
+ this._initThreeSharedAssets();
16
+ }
17
+
18
+ private _initUtils(): void {
19
+ AssetUtils.Init();
20
+ }
21
+
22
+ private _initProxies(): void {
23
+ //
24
+ }
25
+
26
+ private _initManagers(): void {
27
+ TickerManager.init();
28
+ DomKeyboardManager.init();
29
+ DomPointerManager.init();
30
+ ThreeAssetsManager.init();
31
+ ThreeCameraControllerManager.init();
32
+ DomResizeManager.init();
33
+ DebugManager.init();
34
+ ThreeRaycasterManager.init();
35
+ LoaderManager.init();
36
+ }
37
+
38
+ private _initCommonAssets(): void {
39
+ //
40
+ }
41
+
42
+ private _initThreeSharedAssets(): void {
43
+ ThreeAssetsManager.addHDR(AssetId.THREE_HDR_TEMPLATE, AssetUtils.GetPath('hdrs/template.hdr'));
44
+ ThreeAssetsManager.addModel(AssetId.THREE_GLTF_TEMPLATE, AssetUtils.GetPath('models/template.glb'));
45
+ ThreeAssetsManager.addTexture(AssetId.THREE_TEXTURE_TEMPLATE, AssetUtils.GetPath('textures/template.jpg'));
46
+ ThreeAssetsManager.addFont(AssetId.THREE_FONT_TEMPLATE, AssetUtils.GetPath('fonts/template.typeface.json'));
47
+ }
48
+ }
49
+
50
+ export default new InitCommand();
@@ -0,0 +1,3 @@
1
+ export const AnimationId = {} as const;
2
+
3
+ export type AnimationId = (typeof AnimationId)[keyof typeof AnimationId];
@@ -0,0 +1,8 @@
1
+ export const AssetId = {
2
+ THREE_TEXTURE_TEMPLATE: 'THREE_TEXTURE_TEMPLATE',
3
+ THREE_HDR_TEMPLATE: 'THREE_HDR_TEMPLATE',
4
+ THREE_GLTF_TEMPLATE: 'THREE_GLTF_TEMPLATE',
5
+ THREE_FONT_TEMPLATE: 'THREE_FONT_TEMPLATE',
6
+ } as const;
7
+
8
+ export type AssetId = (typeof AssetId)[keyof typeof AssetId];
@@ -0,0 +1,7 @@
1
+ export const CameraId = {
2
+ THREE_DEBUG: 'THREE_DEBUG',
3
+ THREE_MAIN: 'THREE_MAIN',
4
+ THREE_LOADER: 'THREE_LOADER',
5
+ } as const;
6
+
7
+ export type CameraId = (typeof CameraId)[keyof typeof CameraId];
@@ -0,0 +1,6 @@
1
+ export const DebugGuiTitle = {
2
+ THREE_RENDERER: 'Three Renderer',
3
+ THREE_VIEWS: 'Three Views',
4
+ } as const;
5
+
6
+ export type DebugGuiTitle = (typeof DebugGuiTitle)[keyof typeof DebugGuiTitle];
@@ -0,0 +1,3 @@
1
+ export const Object3DId = {} as const;
2
+
3
+ export type Object3DId = (typeof Object3DId)[keyof typeof Object3DId];
@@ -0,0 +1,11 @@
1
+ const ThreeViewId = {
2
+ THREE_LOADER: 'THREE_LOADER',
3
+ THREE_WORLD_1: 'THREE_WORLD_1',
4
+ THREE_WORLD_2: 'THREE_WORLD_2',
5
+ } as const;
6
+
7
+ export const ViewId = {
8
+ ...ThreeViewId,
9
+ } as const;
10
+
11
+ export type ViewId = (typeof ViewId)[keyof typeof ViewId];
@@ -0,0 +1,6 @@
1
+ export const ViewType = {
2
+ HTML: 'HTML',
3
+ THREE: 'THREE',
4
+ } as const;
5
+
6
+ export type ViewType = (typeof ViewType)[keyof typeof ViewType];
@@ -0,0 +1,11 @@
1
+ import LoaderThreeApp from './app/LoaderThreeApp';
2
+ import MainThreeApp from './app/MainThreeApp';
3
+
4
+ class MainThree {
5
+ public init(): void {
6
+ LoaderThreeApp.init();
7
+ MainThreeApp.init();
8
+ }
9
+ }
10
+
11
+ export default new MainThree();
@@ -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,112 @@
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
+ declare private _debugPreviousCameraId: CameraId;
29
+
30
+ constructor() {
31
+ super();
32
+ }
33
+
34
+ public override init(): void {
35
+ super.init();
36
+
37
+ if (DebugManager.isActive) {
38
+ window.mainThreeApp = this;
39
+ DomKeyboardManager.onKeyDown.add(this._onKeyDown);
40
+ }
41
+ }
42
+
43
+ protected override _setDomElementContainer(): void {
44
+ this._domElementContainer = DomUtils.GetApp();
45
+ }
46
+
47
+ protected override _generateScenes(): void {
48
+ this._scene = new Scene();
49
+
50
+ if (DebugManager.isActive) {
51
+ this._debugWireframeMaterial = new MeshStandardMaterial({
52
+ wireframe: true,
53
+ color: MainThreeApp._DEBUG_WIREFRAME_MATERIAL_COLOR,
54
+ });
55
+ }
56
+ }
57
+
58
+ protected override _generateCameras(): void {
59
+ ThreeCameraControllerManager.add(new MainThreeCameraController(), true);
60
+ this._cameraController = ThreeCameraControllerManager.get(CameraId.THREE_MAIN);
61
+
62
+ if (DebugManager.isActive) {
63
+ this._debugPreviousCameraId = this._cameraController.cameraId;
64
+ ThreeCameraControllerManager.add(new DebugThreeCameraController());
65
+ }
66
+
67
+ ThreeCameraControllerManager.onActiveThreeCameraControllerChange.add(this._onActiveCameraControllerChange);
68
+ }
69
+
70
+ protected override _generateRenderers(): void {
71
+ this._renderer = new Renderer(this._scene, this._cameraController.camera, { antialias: true });
72
+ this._domElementContainer.appendChild(this._renderer.domElement);
73
+ }
74
+
75
+ protected override _declareViews(): void {
76
+ this._viewBuilder.set(ViewId.THREE_WORLD_1, WorldThreeView);
77
+ this._viewBuilder.set(ViewId.THREE_WORLD_2, World2ThreeView);
78
+
79
+ if (DebugManager.isActive) {
80
+ const viewsDebug = DebugManager.getGuiFolder(DebugGuiTitle.THREE_VIEWS)
81
+ viewsDebug.add({ resetCurrentView: () => this._currentView.reset() }, 'resetCurrentView');
82
+ viewsDebug.add({ createWorld1: () => this.setCurrentView(ViewId.THREE_WORLD_1) }, 'createWorld1');
83
+ viewsDebug.add({ createWorld2: () => this.setCurrentView(ViewId.THREE_WORLD_2) }, 'createWorld2');
84
+ }
85
+ }
86
+
87
+ private _onActiveCameraControllerChange = (): void => {
88
+ this._cameraController = ThreeCameraControllerManager.activeThreeCameraController;
89
+ this._renderer.setCamera(this._cameraController.camera);
90
+ this._onResize();
91
+ };
92
+
93
+ private readonly _onKeyDown = (_e: KeyboardEvent): void => {
94
+ if (DebugManager.isActive) {
95
+ if (DomKeyboardManager.areAllKeysDown(MainThreeApp._TOGGLE_SWITCH_TO_DEBUG_CAMERA_KEYS)) {
96
+ if (this._cameraController.cameraId !== CameraId.THREE_DEBUG) this._debugPreviousCameraId = this._cameraController.cameraId;
97
+ ThreeCameraControllerManager.setActiveCamera(
98
+ this._cameraController.cameraId === CameraId.THREE_DEBUG ? this._debugPreviousCameraId : CameraId.THREE_DEBUG
99
+ );
100
+ } else if (DomKeyboardManager.areAllKeysDown(MainThreeApp._TOGGLE_WIREFRAME_KEYS)) {
101
+ if (this._scene.overrideMaterial === null) {
102
+ this._scene.overrideMaterial = this._debugWireframeMaterial;
103
+ } else {
104
+ this._scene.overrideMaterial = null;
105
+ }
106
+ }
107
+ }
108
+ };
109
+ }
110
+
111
+ export type { MainThreeApp };
112
+ export default new MainThreeApp();