@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.
- package/README.md +0 -4
- package/dist/constants.d.ts +8 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +18 -0
- package/dist/constants.js.map +1 -0
- package/dist/constants.test.d.ts +2 -0
- package/dist/constants.test.d.ts.map +1 -0
- package/dist/constants.test.js +30 -0
- package/dist/constants.test.js.map +1 -0
- package/dist/createProject.d.ts +2 -0
- package/dist/createProject.d.ts.map +1 -0
- package/dist/createProject.js +52 -0
- package/dist/createProject.js.map +1 -0
- package/dist/createProject.test.d.ts +2 -0
- package/dist/createProject.test.d.ts.map +1 -0
- package/dist/createProject.test.js +85 -0
- package/dist/createProject.test.js.map +1 -0
- package/dist/index.js +16 -69
- package/dist/index.js.map +1 -1
- package/dist/prompts.d.ts +4 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +26 -0
- package/dist/prompts.js.map +1 -0
- package/dist/prompts.test.d.ts +2 -0
- package/dist/prompts.test.d.ts.map +1 -0
- package/dist/prompts.test.js +50 -0
- package/dist/prompts.test.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +10 -8
- package/template-vanilla/package-lock.json +1000 -1476
- package/template-vanilla/package.json +11 -11
- package/template-vanilla/src/experiences/Experience.ts +1 -1
- package/template-vanilla/src/experiences/constants/experiences/ViewId.ts +2 -7
- package/template-vanilla/src/experiences/engines/threes/app/MainThreeApp.ts +8 -5
- package/template-vanilla/src/experiences/managers/LoaderManager.ts +4 -5
- package/template-vanilla/src/experiences/materials/threes/loaders/LoaderMaterial.ts +8 -5
- package/template-vanilla/src/experiences/views/threes/bases/ThreeViewBase.ts +1 -1
- package/template-vanilla/src/experiences/views/threes/{worlds/components/actors/bases → bases/components}/ThreeAnimatedModelBase.ts +3 -3
- package/template-vanilla/src/experiences/views/threes/{worlds/components/actors/bases → bases/components}/ThreeModelBase.ts +3 -3
- package/template-vanilla/src/experiences/views/threes/loaders/components/TemplateLoaderThreeActor.ts +1 -1
- package/template-vanilla/src/experiences/views/threes/worlds/World2ThreeView.ts +5 -5
- package/template-vanilla/src/experiences/views/threes/worlds/WorldThreeView.ts +5 -5
- package/template-vanilla/src/experiences/views/threes/worlds/components/Environment.ts +1 -1
- package/template-vanilla/src/experiences/views/threes/worlds/components/{actors/TemplateFont.ts → TemplateFont.ts} +3 -3
- package/template-vanilla/src/experiences/views/threes/worlds/components/{actors/TemplateMesh.ts → TemplateMesh.ts} +3 -3
- package/template-vanilla/src/experiences/views/threes/worlds/components/{actors/TemplateMesh2.ts → TemplateMesh2.ts} +3 -3
- package/template-vanilla/src/experiences/views/threes/worlds/components/{actors/TemplateModel.ts → TemplateModel.ts} +4 -4
- package/template-vanilla/tsconfig.json +3 -3
- package/template-vue/eslint.config.js +130 -0
- package/template-vue/index.html +17 -0
- package/{template-react → template-vue}/package-lock.json +1260 -2121
- package/template-vue/package.json +43 -0
- package/template-vue/readme.md +34 -0
- package/template-vue/src/experiences/Experience.ts +27 -0
- package/template-vue/src/experiences/cameras/threes/DebugThreeCameraController.ts +55 -0
- package/template-vue/src/experiences/cameras/threes/LoaderThreeCameraController.ts +25 -0
- package/template-vue/src/experiences/cameras/threes/MainThreeCameraController.ts +24 -0
- package/template-vue/src/experiences/cameras/threes/bases/ThreeCameraControllerBase.ts +90 -0
- package/template-vue/src/experiences/commands/InitCommand.ts +50 -0
- package/template-vue/src/experiences/constants/experiences/AnimationId.ts +3 -0
- package/template-vue/src/experiences/constants/experiences/AssetId.ts +8 -0
- package/template-vue/src/experiences/constants/experiences/CameraId.ts +7 -0
- package/template-vue/src/experiences/constants/experiences/DebugGuiTitle.ts +6 -0
- package/template-vue/src/experiences/constants/experiences/Object3dId.ts +3 -0
- package/template-vue/src/experiences/constants/experiences/ViewId.ts +11 -0
- package/template-vue/src/experiences/constants/experiences/ViewType.ts +6 -0
- package/template-vue/src/experiences/engines/threes/MainThree.ts +11 -0
- package/template-vue/src/experiences/engines/threes/app/LoaderThreeApp.ts +49 -0
- package/template-vue/src/experiences/engines/threes/app/MainThreeApp.ts +112 -0
- package/template-vue/src/experiences/engines/threes/app/bases/ThreeAppBase.ts +128 -0
- package/template-vue/src/experiences/engines/vues/MainVue.vue +9 -0
- package/template-vue/src/experiences/managers/DebugManager.ts +87 -0
- package/template-vue/src/experiences/managers/LoaderManager.ts +176 -0
- package/template-vue/src/experiences/managers/threes/ThreeAssetsManager.ts +263 -0
- package/template-vue/src/experiences/managers/threes/ThreeCameraControllerManager.ts +46 -0
- package/template-vue/src/experiences/managers/threes/ThreeRaycasterManager.ts +21 -0
- package/template-vue/src/experiences/materials/threes/loaders/LoaderMaterial.ts +47 -0
- package/template-vue/src/experiences/renderers/threes/LoaderRenderer.ts +18 -0
- package/template-vue/src/experiences/renderers/threes/Renderer.ts +71 -0
- package/template-vue/src/experiences/renderers/threes/bases/WebGLRendererBase.ts +29 -0
- package/template-vue/src/experiences/shaders/threes/loaders/LoaderFragmentShader.glsl +8 -0
- package/template-vue/src/experiences/shaders/threes/loaders/LoaderVertexShader.glsl +3 -0
- package/template-vue/src/experiences/styles/abstracts/_import.scss +5 -0
- package/template-vue/src/experiences/styles/abstracts/functions.scss +3 -0
- package/template-vue/src/experiences/styles/abstracts/variables.scss +7 -0
- package/template-vue/src/experiences/styles/commons/fonts.scss +10 -0
- package/template-vue/src/experiences/styles/commons/main.scss +59 -0
- package/template-vue/src/experiences/styles/commons/texts.scss +1 -0
- package/template-vue/src/experiences/styles/style.scss +7 -0
- package/template-vue/src/experiences/styles/views/loader.scss +70 -0
- package/template-vue/src/experiences/types/assetTypes.ts +8 -0
- package/template-vue/src/experiences/types/cameraTypes.ts +37 -0
- package/template-vue/src/experiences/types/global.d.ts +9 -0
- package/template-vue/src/experiences/types/shaders.d.ts +4 -0
- package/template-vue/src/experiences/views/threes/bases/ThreeViewBase.ts +49 -0
- package/template-vue/src/experiences/views/threes/bases/components/ThreeActorBase.ts +44 -0
- package/template-vue/src/experiences/views/threes/bases/components/ThreeAnimatedModelBase.ts +63 -0
- package/template-vue/src/experiences/views/threes/bases/components/ThreeModelBase.ts +48 -0
- package/template-vue/src/experiences/views/threes/loaders/LoaderThreeView.ts +28 -0
- package/template-vue/src/experiences/views/threes/loaders/components/TemplateLoaderThreeActor.ts +49 -0
- package/template-vue/src/experiences/views/threes/worlds/World2ThreeView.ts +35 -0
- package/template-vue/src/experiences/views/threes/worlds/WorldThreeView.ts +35 -0
- package/template-vue/src/experiences/views/threes/worlds/components/Environment.ts +89 -0
- package/template-vue/src/experiences/views/threes/worlds/components/TemplateFont.ts +58 -0
- package/template-vue/src/experiences/views/threes/worlds/components/TemplateMesh.ts +65 -0
- package/template-vue/src/experiences/views/threes/worlds/components/TemplateMesh2.ts +71 -0
- package/template-vue/src/experiences/views/threes/worlds/components/TemplateModel.ts +33 -0
- package/template-vue/src/experiences/views/vues/LoaderView.vue +55 -0
- package/template-vue/src/main.ts +7 -0
- package/template-vue/tsconfig.app.json +8 -0
- package/template-vue/tsconfig.json +7 -0
- package/template-vue/tsconfig.node.json +16 -0
- package/template-vue/vite.config.ts +16 -0
- package/template-react/eslint.config.js +0 -23
- package/template-react/index.html +0 -17
- package/template-react/package.json +0 -46
- package/template-react/readme.md +0 -31
- package/template-react/src/App.css +0 -42
- package/template-react/src/App.tsx +0 -10
- package/template-react/src/index.css +0 -68
- package/template-react/src/main.tsx +0 -10
- package/template-react/tsconfig.app.json +0 -34
- package/template-react/tsconfig.json +0 -7
- package/template-react/tsconfig.node.json +0 -26
- package/template-react/vite.config.ts +0 -29
- /package/template-vanilla/src/experiences/views/threes/{worlds/components/actors/bases → bases/components}/ThreeActorBase.ts +0 -0
- /package/{template-react → template-vue}/.prettierignore +0 -0
- /package/{template-react → template-vue}/.prettierrc +0 -0
- /package/{template-react → template-vue}/public/assets/fonts/LICENSE +0 -0
- /package/{template-react → template-vue}/public/assets/fonts/template.typeface.json +0 -0
- /package/{template-react → template-vue}/public/assets/hdrs/template.hdr +0 -0
- /package/{template-react → template-vue}/public/assets/icons/benjosLogoBlack.svg +0 -0
- /package/{template-react → template-vue}/public/assets/loaders/draco/README.md +0 -0
- /package/{template-react → template-vue}/public/assets/loaders/draco/draco_decoder.js +0 -0
- /package/{template-react → template-vue}/public/assets/loaders/draco/draco_decoder.wasm +0 -0
- /package/{template-react → template-vue}/public/assets/loaders/draco/draco_encoder.js +0 -0
- /package/{template-react → template-vue}/public/assets/loaders/draco/draco_wasm_wrapper.js +0 -0
- /package/{template-react → template-vue}/public/assets/loaders/draco/gltf/draco_decoder.js +0 -0
- /package/{template-react → template-vue}/public/assets/loaders/draco/gltf/draco_decoder.wasm +0 -0
- /package/{template-react → template-vue}/public/assets/loaders/draco/gltf/draco_encoder.js +0 -0
- /package/{template-react → template-vue}/public/assets/loaders/draco/gltf/draco_wasm_wrapper.js +0 -0
- /package/{template-react → template-vue}/public/assets/models/template.glb +0 -0
- /package/{template-react → template-vue}/public/assets/textures/template.jpg +0 -0
- /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,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,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,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();
|