@benjos/create-boilerplate 1.5.2 → 1.5.9

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 -73
  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 +8 -7
  33. package/template-vanilla/package-lock.json +1038 -1483
  34. package/template-vanilla/package.json +14 -11
  35. package/template-vanilla/src/experiences/Experience.ts +1 -1
  36. package/template-vanilla/src/experiences/cameras/threes/DebugThreeCameraController.ts +1 -1
  37. package/template-vanilla/src/experiences/cameras/threes/LoaderThreeCameraController.ts +1 -1
  38. package/template-vanilla/src/experiences/cameras/threes/MainThreeCameraController.ts +1 -1
  39. package/template-vanilla/src/experiences/cameras/threes/bases/ThreeCameraControllerBase.ts +2 -2
  40. package/template-vanilla/src/experiences/composers/threes/MainThreeEffectComposer.ts +20 -0
  41. package/template-vanilla/src/experiences/composers/threes/bases/ThreeEffectComposerBase.ts +54 -0
  42. package/template-vanilla/src/experiences/composers/threes/bases/passes/ThreePassBase.ts +11 -0
  43. package/template-vanilla/src/experiences/composers/threes/passes/TemplateThreePass.ts +22 -0
  44. package/template-vanilla/src/experiences/constants/experiences/ViewId.ts +2 -7
  45. package/template-vanilla/src/experiences/engines/threes/app/LoaderThreeApp.ts +2 -2
  46. package/template-vanilla/src/experiences/engines/threes/app/MainThreeApp.ts +10 -7
  47. package/template-vanilla/src/experiences/engines/threes/app/bases/ThreeAppBase.ts +7 -7
  48. package/template-vanilla/src/experiences/managers/DebugManager.ts +19 -5
  49. package/template-vanilla/src/experiences/managers/LoaderManager.ts +4 -5
  50. package/template-vanilla/src/experiences/managers/threes/ThreeAssetsManager.ts +3 -3
  51. package/template-vanilla/src/experiences/managers/threes/ThreeRaycasterManager.ts +1 -1
  52. package/template-vanilla/src/experiences/materials/threes/loaders/{LoaderMaterial.ts → LoaderThreeMaterial.ts} +12 -9
  53. package/template-vanilla/src/experiences/renderers/threes/LoaderThreeWebGLRenderer.ts +18 -0
  54. package/{template-vue/src/experiences/renderers/threes/Renderer.ts → template-vanilla/src/experiences/renderers/threes/MainThreeWebGLRenderer.ts} +24 -14
  55. package/template-vanilla/src/experiences/renderers/threes/bases/ThreeWebGLRendererBase.ts +60 -0
  56. package/template-vanilla/src/experiences/shaders/threes/composers/templates/TemplatePassFragmentShader.glsl +10 -0
  57. package/template-vanilla/src/experiences/shaders/threes/composers/templates/TemplatePassVertexShader.glsl +6 -0
  58. package/template-vanilla/src/experiences/types/global.d.ts +1 -1
  59. package/template-vanilla/src/experiences/types/styles.d.ts +2 -0
  60. package/template-vanilla/src/experiences/views/threes/bases/ThreeViewBase.ts +2 -2
  61. package/{template-vue/src/experiences/views/threes/worlds/components/actors/bases → template-vanilla/src/experiences/views/threes/bases/components}/ThreeAnimatedModelBase.ts +4 -4
  62. package/{template-vue/src/experiences/views/threes/worlds/components/actors/bases → template-vanilla/src/experiences/views/threes/bases/components}/ThreeModelBase.ts +4 -4
  63. package/template-vanilla/src/experiences/views/threes/loaders/components/TemplateLoaderThreeActor.ts +5 -5
  64. package/template-vanilla/src/experiences/views/threes/worlds/World2ThreeView.ts +5 -5
  65. package/template-vanilla/src/experiences/views/threes/worlds/WorldThreeView.ts +5 -5
  66. package/template-vanilla/src/experiences/views/threes/worlds/components/Environment.ts +2 -2
  67. package/template-vanilla/src/experiences/views/threes/worlds/components/{actors/TemplateFont.ts → TemplateFont.ts} +3 -3
  68. package/{template-vue/src/experiences/views/threes/worlds/components/actors → template-vanilla/src/experiences/views/threes/worlds/components}/TemplateMesh.ts +3 -3
  69. package/template-vanilla/src/experiences/views/threes/worlds/components/{actors/TemplateMesh2.ts → TemplateMesh2.ts} +3 -3
  70. package/{template-vue/src/experiences/views/threes/worlds/components/actors → template-vanilla/src/experiences/views/threes/worlds/components}/TemplateModel.ts +4 -4
  71. package/template-vanilla/tsconfig.json +3 -3
  72. package/template-vue/package-lock.json +711 -1168
  73. package/template-vue/package.json +15 -12
  74. package/template-vue/src/experiences/Experience.ts +1 -1
  75. package/template-vue/src/experiences/cameras/threes/DebugThreeCameraController.ts +1 -1
  76. package/template-vue/src/experiences/cameras/threes/LoaderThreeCameraController.ts +1 -1
  77. package/template-vue/src/experiences/cameras/threes/MainThreeCameraController.ts +1 -1
  78. package/template-vue/src/experiences/cameras/threes/bases/ThreeCameraControllerBase.ts +2 -2
  79. package/template-vue/src/experiences/composers/threes/MainThreeEffectComposer.ts +20 -0
  80. package/template-vue/src/experiences/composers/threes/bases/ThreeEffectComposerBase.ts +54 -0
  81. package/template-vue/src/experiences/composers/threes/bases/passes/ThreePassBase.ts +11 -0
  82. package/template-vue/src/experiences/composers/threes/passes/TemplateThreePass.ts +22 -0
  83. package/template-vue/src/experiences/constants/experiences/ViewId.ts +2 -7
  84. package/template-vue/src/experiences/engines/threes/app/LoaderThreeApp.ts +2 -2
  85. package/template-vue/src/experiences/engines/threes/app/MainThreeApp.ts +10 -7
  86. package/template-vue/src/experiences/engines/threes/app/bases/ThreeAppBase.ts +7 -7
  87. package/template-vue/src/experiences/managers/DebugManager.ts +19 -5
  88. package/template-vue/src/experiences/managers/LoaderManager.ts +4 -5
  89. package/template-vue/src/experiences/managers/threes/ThreeAssetsManager.ts +3 -3
  90. package/template-vue/src/experiences/managers/threes/ThreeRaycasterManager.ts +1 -1
  91. package/template-vue/src/experiences/materials/threes/loaders/{LoaderMaterial.ts → LoaderThreeMaterial.ts} +12 -9
  92. package/template-vue/src/experiences/renderers/threes/LoaderThreeWebGLRenderer.ts +18 -0
  93. package/{template-vanilla/src/experiences/renderers/threes/Renderer.ts → template-vue/src/experiences/renderers/threes/MainThreeWebGLRenderer.ts} +24 -14
  94. package/template-vue/src/experiences/renderers/threes/bases/ThreeWebGLRendererBase.ts +60 -0
  95. package/template-vue/src/experiences/shaders/threes/composers/templates/TemplatePassFragmentShader.glsl +10 -0
  96. package/template-vue/src/experiences/shaders/threes/composers/templates/TemplatePassVertexShader.glsl +6 -0
  97. package/template-vue/src/experiences/types/styles.d.ts +2 -0
  98. package/template-vue/src/experiences/views/threes/bases/ThreeViewBase.ts +2 -2
  99. package/{template-vanilla/src/experiences/views/threes/worlds/components/actors/bases → template-vue/src/experiences/views/threes/bases/components}/ThreeAnimatedModelBase.ts +4 -4
  100. package/{template-vanilla/src/experiences/views/threes/worlds/components/actors/bases → template-vue/src/experiences/views/threes/bases/components}/ThreeModelBase.ts +4 -4
  101. package/template-vue/src/experiences/views/threes/loaders/components/TemplateLoaderThreeActor.ts +5 -5
  102. package/template-vue/src/experiences/views/threes/worlds/World2ThreeView.ts +5 -5
  103. package/template-vue/src/experiences/views/threes/worlds/WorldThreeView.ts +5 -5
  104. package/template-vue/src/experiences/views/threes/worlds/components/Environment.ts +2 -2
  105. package/template-vue/src/experiences/views/threes/worlds/components/{actors/TemplateFont.ts → TemplateFont.ts} +3 -3
  106. package/{template-vanilla/src/experiences/views/threes/worlds/components/actors → template-vue/src/experiences/views/threes/worlds/components}/TemplateMesh.ts +3 -3
  107. package/template-vue/src/experiences/views/threes/worlds/components/{actors/TemplateMesh2.ts → TemplateMesh2.ts} +3 -3
  108. package/{template-vanilla/src/experiences/views/threes/worlds/components/actors → template-vue/src/experiences/views/threes/worlds/components}/TemplateModel.ts +4 -4
  109. package/template-vue/tsconfig.app.json +1 -7
  110. package/template-vue/tsconfig.node.json +0 -1
  111. package/template-react/.prettierignore +0 -6
  112. package/template-react/.prettierrc +0 -10
  113. package/template-react/assets_source/.gitkeep +0 -0
  114. package/template-react/eslint.config.js +0 -23
  115. package/template-react/index.html +0 -17
  116. package/template-react/package-lock.json +0 -4455
  117. package/template-react/package.json +0 -46
  118. package/template-react/public/assets/fonts/LICENSE +0 -13
  119. package/template-react/public/assets/fonts/template.typeface.json +0 -1
  120. package/template-react/public/assets/hdrs/template.hdr +0 -0
  121. package/template-react/public/assets/icons/benjosLogoBlack.svg +0 -5
  122. package/template-react/public/assets/loaders/draco/README.md +0 -32
  123. package/template-react/public/assets/loaders/draco/draco_decoder.js +0 -34
  124. package/template-react/public/assets/loaders/draco/draco_decoder.wasm +0 -0
  125. package/template-react/public/assets/loaders/draco/draco_encoder.js +0 -33
  126. package/template-react/public/assets/loaders/draco/draco_wasm_wrapper.js +0 -117
  127. package/template-react/public/assets/loaders/draco/gltf/draco_decoder.js +0 -33
  128. package/template-react/public/assets/loaders/draco/gltf/draco_decoder.wasm +0 -0
  129. package/template-react/public/assets/loaders/draco/gltf/draco_encoder.js +0 -33
  130. package/template-react/public/assets/loaders/draco/gltf/draco_wasm_wrapper.js +0 -116
  131. package/template-react/public/assets/models/template.glb +0 -0
  132. package/template-react/public/assets/textures/template.jpg +0 -0
  133. package/template-react/readme.md +0 -31
  134. package/template-react/src/App.css +0 -42
  135. package/template-react/src/App.tsx +0 -10
  136. package/template-react/src/index.css +0 -68
  137. package/template-react/src/main.tsx +0 -10
  138. package/template-react/tsconfig.app.json +0 -34
  139. package/template-react/tsconfig.json +0 -7
  140. package/template-react/tsconfig.node.json +0 -26
  141. package/template-react/vite.config.ts +0 -29
  142. package/template-vanilla/src/experiences/renderers/threes/LoaderRenderer.ts +0 -18
  143. package/template-vanilla/src/experiences/renderers/threes/bases/WebGLRendererBase.ts +0 -29
  144. package/template-vue/src/experiences/renderers/threes/LoaderRenderer.ts +0 -18
  145. package/template-vue/src/experiences/renderers/threes/bases/WebGLRendererBase.ts +0 -29
  146. /package/template-vanilla/src/experiences/views/threes/{worlds/components/actors/bases → bases/components}/ThreeActorBase.ts +0 -0
  147. /package/template-vue/src/experiences/views/threes/{worlds/components/actors/bases → bases/components}/ThreeActorBase.ts +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "template-vue",
3
3
  "private": true,
4
- "version": "1.4.7",
4
+ "version": "1.5.9",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "vite",
@@ -13,31 +13,34 @@
13
13
  "format:check": "prettier --check ."
14
14
  },
15
15
  "devDependencies": {
16
- "@eslint/js": "^9.39.2",
16
+ "@eslint/js": "^10.0.1",
17
17
  "@types/howler": "^2.2.12",
18
- "@types/three": "^0.182.0",
18
+ "@types/three": "^0.183.1",
19
19
  "@vitejs/plugin-vue": "^6.0.5",
20
20
  "@vue/tsconfig": "^0.9.0",
21
- "eslint": "^9.39.2",
21
+ "eslint": "^10.1.0",
22
22
  "eslint-config-prettier": "^10.1.8",
23
- "eslint-plugin-prettier": "^5.5.4",
24
- "prettier": "^3.7.4",
25
- "sass-embedded": "^1.97.1",
23
+ "eslint-plugin-prettier": "^5.5.5",
24
+ "prettier": "^3.8.1",
25
+ "sass-embedded": "^1.98.0",
26
26
  "three-perf": "^1.0.11",
27
27
  "typescript": "~5.9.3",
28
- "typescript-eslint": "^8.50.1",
29
- "vite": "^7.3.0",
30
- "vite-plugin-glsl": "^1.5.5",
31
- "vue-tsc": "^3.2.5"
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
32
  },
33
33
  "dependencies": {
34
34
  "@benjos/cookware": "^1.0.4",
35
35
  "@benjos/spices": "^1.0.1",
36
36
  "@dimforge/rapier3d": "^0.19.3",
37
+ "@types/stats.js": "^0.17.4",
37
38
  "gsap": "^3.14.2",
38
39
  "howler": "^2.2.4",
39
40
  "lil-gui": "^0.21.0",
40
- "three": "^0.182.0",
41
+ "stats.js": "^0.17.0",
42
+ "three": "^0.183.2",
43
+ "three-custom-shader-material": "^6.4.0",
41
44
  "vue": "^3.5.30"
42
45
  }
43
46
  }
@@ -20,7 +20,7 @@ class Experience {
20
20
  }
21
21
 
22
22
  private readonly _onReady = async (): Promise<void> => {
23
- await MainThreeApp.setCurrentView(ViewId.THREE_VIEW_WORLD_1);
23
+ await MainThreeApp.setCurrentView(ViewId.THREE_WORLD_1);
24
24
  };
25
25
  }
26
26
 
@@ -5,7 +5,7 @@ import { OrbitControls } from 'three/examples/jsm/Addons.js';
5
5
  import { CameraId } from '../../constants/experiences/CameraId';
6
6
  import MainThreeApp from '../../engines/threes/app/MainThreeApp';
7
7
  import ThreeRaycasterManager from '../../managers/threes/ThreeRaycasterManager';
8
- import { ThreeCameraOptions, ThreeCameraType } from '../../types/cameraTypes';
8
+ import { ThreeCameraType, type ThreeCameraOptions } from '../../types/cameraTypes';
9
9
  import ThreeCameraControllerBase from './bases/ThreeCameraControllerBase';
10
10
 
11
11
  export default class DebugThreeCameraController extends ThreeCameraControllerBase<OrbitControls> {
@@ -1,7 +1,7 @@
1
1
  import { Vector3 } from 'three';
2
2
  import { CameraId } from '../../constants/experiences/CameraId';
3
3
  import LoaderThreeApp from '../../engines/threes/app/LoaderThreeApp';
4
- import { ThreeCameraOptions, ThreeCameraType } from '../../types/cameraTypes';
4
+ import { ThreeCameraType, type ThreeCameraOptions } from '../../types/cameraTypes';
5
5
  import ThreeCameraControllerBase from './bases/ThreeCameraControllerBase';
6
6
 
7
7
  export default class LoaderThreeCameraController extends ThreeCameraControllerBase {
@@ -1,6 +1,6 @@
1
1
  import { Vector3 } from 'three';
2
2
  import { CameraId } from '../../constants/experiences/CameraId';
3
- import { ThreeCameraOptions, ThreeCameraType } from '../../types/cameraTypes';
3
+ import { ThreeCameraType, type ThreeCameraOptions } from '../../types/cameraTypes';
4
4
  import ThreeCameraControllerBase from './bases/ThreeCameraControllerBase';
5
5
 
6
6
  export default class MainThreeCameraController extends ThreeCameraControllerBase {
@@ -1,8 +1,8 @@
1
1
  import { DomResizeManager } from '@benjos/cookware';
2
- import { Object3D, OrthographicCamera, PerspectiveCamera, Scene } from 'three';
2
+ import { Object3D, OrthographicCamera, PerspectiveCamera, type Scene } from 'three';
3
3
  import type { CameraId } from '../../../constants/experiences/CameraId';
4
4
  import MainThreeApp from '../../../engines/threes/app/MainThreeApp';
5
- import { ThreeCameraOptions, ThreeCameraType, ThreeControls } from '../../../types/cameraTypes';
5
+ import { ThreeCameraType, type ThreeCameraOptions, type ThreeControls } from '../../../types/cameraTypes';
6
6
 
7
7
  export default abstract class ThreeCameraControllerBase<T extends ThreeControls = ThreeControls> extends Object3D {
8
8
  private static readonly _DEFAULT_CAMERA_OPTIONS: ThreeCameraOptions = {
@@ -0,0 +1,20 @@
1
+ import type { Camera, Scene, WebGLRenderer } from "three";
2
+ import { GlitchPass } from "three/examples/jsm/Addons.js";
3
+ import ThreeEffectComposerBase from "./bases/ThreeEffectComposerBase";
4
+ import TemplateThreePass from "./passes/TemplateThreePass";
5
+
6
+ export default class MainThreeEffectComposer extends ThreeEffectComposerBase {
7
+ constructor(renderer: WebGLRenderer, scene: Scene, camera: Camera) {
8
+ super(renderer, scene, camera);
9
+ }
10
+
11
+ protected override _addPasses(): void {
12
+ super._addPasses();
13
+ this._addPass(new TemplateThreePass());
14
+ this._addPass(new GlitchPass());
15
+ }
16
+
17
+ public override update(dt: number): void {
18
+ super.update(dt);
19
+ }
20
+ }
@@ -0,0 +1,54 @@
1
+ import { DomResizeManager } from "@benjos/cookware";
2
+ import { HalfFloatType, WebGLRenderTarget, type Camera, type Scene, type TextureDataType, type WebGLRenderer } from "three";
3
+ import { EffectComposer, OutputPass, RenderPass, type Pass } from "three/examples/jsm/Addons.js";
4
+ import ThreePassBase from "./passes/ThreePassBase";
5
+
6
+ export default abstract class ThreeEffectComposerBase extends EffectComposer {
7
+ protected static readonly _DEFAULT_RENDER_TARGET_SAMPLES = 4;
8
+ protected static readonly _DEFAULT_RENDER_TARGET_TYPE = HalfFloatType;
9
+
10
+ protected readonly _passes: Pass[];
11
+ private declare _renderPass: RenderPass;
12
+
13
+ constructor(renderer: WebGLRenderer, scene: Scene, camera: Camera, options: { samples?: number, type?: TextureDataType } = {}) {
14
+ const samples = options.samples ?? ThreeEffectComposerBase._DEFAULT_RENDER_TARGET_SAMPLES;
15
+ const type = options.type ?? ThreeEffectComposerBase._DEFAULT_RENDER_TARGET_TYPE;
16
+ super(renderer, new WebGLRenderTarget(DomResizeManager.width, DomResizeManager.height, { samples, type }));
17
+
18
+ this._createRenderPass(scene, camera);
19
+ this._passes = [];
20
+ this._addPasses();
21
+ this._addPass(new OutputPass());
22
+ this.resize();
23
+ }
24
+
25
+ public setCamera(camera: Camera): void {
26
+ this._renderPass.camera = camera;
27
+ }
28
+
29
+ public resize(): void {
30
+ this.setSize(DomResizeManager.width, DomResizeManager.height);
31
+ this.setPixelRatio(DomResizeManager.pixelRatio);
32
+ }
33
+
34
+ private _createRenderPass(scene: Scene, camera: Camera): void {
35
+ this._renderPass = new RenderPass(scene, camera);
36
+ this.addPass(this._renderPass);
37
+ }
38
+
39
+ protected _addPasses(): void {
40
+ //
41
+ }
42
+
43
+ protected _addPass(pass: Pass): void {
44
+ this.addPass(pass);
45
+ this._passes.push(pass);
46
+ }
47
+
48
+ public update(dt: number): void {
49
+ for (const pass of this._passes) {
50
+ if (pass instanceof ThreePassBase) pass.update(dt);
51
+ }
52
+ this.render(dt);
53
+ }
54
+ }
@@ -0,0 +1,11 @@
1
+ import { ShaderPass } from "three/examples/jsm/Addons.js";
2
+
3
+ export default abstract class ThreePassBase extends ShaderPass {
4
+ constructor(shader: any) {
5
+ super(shader);
6
+ }
7
+
8
+ public update(_dt: number): void {
9
+
10
+ }
11
+ }
@@ -0,0 +1,22 @@
1
+ import TemplatePassFragmentShader from '../../../shaders/threes/composers/templates/TemplatePassFragmentShader.glsl';
2
+ import TemplatePassVertexShader from '../../../shaders/threes/composers/templates/TemplatePassVertexShader.glsl';
3
+ import ThreePassBase from "../bases/passes/ThreePassBase";
4
+
5
+ export default class TemplateThreePass extends ThreePassBase {
6
+ constructor() {
7
+ super({
8
+ uniforms: {
9
+ tDiffuse: { value: null },
10
+ uTime: { value: null },
11
+ },
12
+ vertexShader: TemplatePassVertexShader,
13
+ fragmentShader: TemplatePassFragmentShader,
14
+ });
15
+
16
+ this.uniforms.uTime.value = 0;
17
+ }
18
+
19
+ public update(dt: number): void {
20
+ this.uniforms.uTime.value += dt;
21
+ }
22
+ }
@@ -1,15 +1,10 @@
1
- const HTMLViewId = {
2
- HTML_LOADER: 'HTML_LOADER',
3
- } as const;
4
-
5
1
  const ThreeViewId = {
6
2
  THREE_LOADER: 'THREE_LOADER',
7
- THREE_VIEW_WORLD_1: 'THREE_VIEW_WORLD_1',
8
- THREE_VIEW_WORLD_2: 'THREE_VIEW_WORLD_2',
3
+ THREE_WORLD_1: 'THREE_WORLD_1',
4
+ THREE_WORLD_2: 'THREE_WORLD_2',
9
5
  } as const;
10
6
 
11
7
  export const ViewId = {
12
- ...HTMLViewId,
13
8
  ...ThreeViewId,
14
9
  } as const;
15
10
 
@@ -4,7 +4,7 @@ import LoaderThreeCameraController from '../../../cameras/threes/LoaderThreeCame
4
4
  import { CameraId } from '../../../constants/experiences/CameraId';
5
5
  import LoaderManager from '../../../managers/LoaderManager';
6
6
  import ThreeCameraControllerManager from '../../../managers/threes/ThreeCameraControllerManager';
7
- import LoaderRenderer from '../../../renderers/threes/LoaderRenderer';
7
+ import LoaderThreeWebGLRenderer from '../../../renderers/threes/LoaderThreeWebGLRenderer';
8
8
  import LoaderThreeView from '../../../views/threes/loaders/LoaderThreeView';
9
9
  import ThreeAppBase from './bases/ThreeAppBase';
10
10
 
@@ -27,7 +27,7 @@ class LoaderThreeApp extends ThreeAppBase {
27
27
  }
28
28
 
29
29
  protected override _generateRenderers(): void {
30
- this._renderer = new LoaderRenderer(
30
+ this._renderer = new LoaderThreeWebGLRenderer(
31
31
  this._scene,
32
32
  ThreeCameraControllerManager.get(CameraId.THREE_LOADER).camera
33
33
  );
@@ -8,7 +8,7 @@ import { DebugGuiTitle } from '../../../constants/experiences/DebugGuiTitle';
8
8
  import { ViewId } from '../../../constants/experiences/ViewId';
9
9
  import DebugManager from '../../../managers/DebugManager';
10
10
  import ThreeCameraControllerManager from '../../../managers/threes/ThreeCameraControllerManager';
11
- import Renderer from '../../../renderers/threes/Renderer';
11
+ import MainThreeWebGLRenderer from '../../../renderers/threes/MainThreeWebGLRenderer';
12
12
  import World2ThreeView from '../../../views/threes/worlds/World2ThreeView';
13
13
  import WorldThreeView from '../../../views/threes/worlds/WorldThreeView';
14
14
  import ThreeAppBase from './bases/ThreeAppBase';
@@ -25,6 +25,7 @@ class MainThreeApp extends ThreeAppBase {
25
25
  ];
26
26
 
27
27
  declare private _debugWireframeMaterial: MeshStandardMaterial;
28
+ declare private _debugPreviousCameraId: CameraId;
28
29
 
29
30
  constructor() {
30
31
  super();
@@ -59,6 +60,7 @@ class MainThreeApp extends ThreeAppBase {
59
60
  this._cameraController = ThreeCameraControllerManager.get(CameraId.THREE_MAIN);
60
61
 
61
62
  if (DebugManager.isActive) {
63
+ this._debugPreviousCameraId = this._cameraController.cameraId;
62
64
  ThreeCameraControllerManager.add(new DebugThreeCameraController());
63
65
  }
64
66
 
@@ -66,19 +68,19 @@ class MainThreeApp extends ThreeAppBase {
66
68
  }
67
69
 
68
70
  protected override _generateRenderers(): void {
69
- this._renderer = new Renderer(this._scene, this._cameraController.camera, { antialias: true });
71
+ this._renderer = new MainThreeWebGLRenderer(this._scene, this._cameraController.camera, { antialias: true });
70
72
  this._domElementContainer.appendChild(this._renderer.domElement);
71
73
  }
72
74
 
73
75
  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
+ this._viewBuilder.set(ViewId.THREE_WORLD_1, WorldThreeView);
77
+ this._viewBuilder.set(ViewId.THREE_WORLD_2, World2ThreeView);
76
78
 
77
79
  if (DebugManager.isActive) {
78
80
  const viewsDebug = DebugManager.getGuiFolder(DebugGuiTitle.THREE_VIEWS)
79
81
  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
+ viewsDebug.add({ createWorld1: () => this.setCurrentView(ViewId.THREE_WORLD_1) }, 'createWorld1');
83
+ viewsDebug.add({ createWorld2: () => this.setCurrentView(ViewId.THREE_WORLD_2) }, 'createWorld2');
82
84
  }
83
85
  }
84
86
 
@@ -91,8 +93,9 @@ class MainThreeApp extends ThreeAppBase {
91
93
  private readonly _onKeyDown = (_e: KeyboardEvent): void => {
92
94
  if (DebugManager.isActive) {
93
95
  if (DomKeyboardManager.areAllKeysDown(MainThreeApp._TOGGLE_SWITCH_TO_DEBUG_CAMERA_KEYS)) {
96
+ if (this._cameraController.cameraId !== CameraId.THREE_DEBUG) this._debugPreviousCameraId = this._cameraController.cameraId;
94
97
  ThreeCameraControllerManager.setActiveCamera(
95
- this._cameraController.cameraId === CameraId.THREE_MAIN ? CameraId.THREE_DEBUG : CameraId.THREE_MAIN
98
+ this._cameraController.cameraId === CameraId.THREE_DEBUG ? this._debugPreviousCameraId : CameraId.THREE_DEBUG
96
99
  );
97
100
  } else if (DomKeyboardManager.areAllKeysDown(MainThreeApp._TOGGLE_WIREFRAME_KEYS)) {
98
101
  if (this._scene.overrideMaterial === null) {
@@ -1,16 +1,16 @@
1
1
  import { DomResizeManager, TickerManager } from '@benjos/cookware';
2
- import { Scene } from 'three';
3
- import ThreeCameraControllerBase from '../../../../cameras/threes/bases/ThreeCameraControllerBase';
4
- import { ViewId } from '../../../../constants/experiences/ViewId';
2
+ import type { Scene } from 'three';
3
+ import type ThreeCameraControllerBase from '../../../../cameras/threes/bases/ThreeCameraControllerBase';
4
+ import type { ViewId } from '../../../../constants/experiences/ViewId';
5
5
  import LoaderManager from '../../../../managers/LoaderManager';
6
- import WebGLRendererBase from '../../../../renderers/threes/bases/WebGLRendererBase';
7
- import ThreeViewBase from '../../../../views/threes/bases/ThreeViewBase';
6
+ import type ThreeWebGLRendererBase from '../../../../renderers/threes/bases/ThreeWebGLRendererBase';
7
+ import type ThreeViewBase from '../../../../views/threes/bases/ThreeViewBase';
8
8
 
9
9
  export default abstract class ThreeAppBase {
10
10
  declare protected _domElementContainer: HTMLElement;
11
11
  declare protected _scene: Scene;
12
12
  declare protected _cameraController: ThreeCameraControllerBase;
13
- declare protected _renderer: WebGLRendererBase;
13
+ declare protected _renderer: ThreeWebGLRendererBase;
14
14
  protected readonly _views: ThreeViewBase[];
15
15
  protected readonly _viewBuilder: Map<ViewId, new () => ThreeViewBase>;
16
16
  declare protected _currentView: ThreeViewBase;
@@ -117,7 +117,7 @@ export default abstract class ThreeAppBase {
117
117
  public get scene(): Scene {
118
118
  return this._scene;
119
119
  }
120
- public get renderer(): WebGLRendererBase {
120
+ public get renderer(): ThreeWebGLRendererBase {
121
121
  return this._renderer;
122
122
  }
123
123
  public get cameraController(): ThreeCameraControllerBase {
@@ -1,8 +1,9 @@
1
1
  import { DomKeyboardManager } from '@benjos/cookware';
2
2
  import { KeyboardConstant } from '@benjos/spices';
3
3
  import GUI from 'lil-gui';
4
+ import Stats from 'stats.js';
4
5
  import { ThreePerf } from 'three-perf';
5
- import { DebugGuiTitle } from '../constants/experiences/DebugGuiTitle';
6
+ import type { DebugGuiTitle } from '../constants/experiences/DebugGuiTitle';
6
7
  import MainThreeApp from '../engines/threes/app/MainThreeApp';
7
8
 
8
9
  class DebugManager {
@@ -16,8 +17,10 @@ class DebugManager {
16
17
  KeyboardConstant.CODES.KEY_H,
17
18
  ];
18
19
 
20
+ private _isDebugVisible: boolean = true;
19
21
  declare private _gui: GUI;
20
22
  declare private _threePerf: ThreePerf;
23
+ declare private _stats: Stats;
21
24
 
22
25
  public init(): void {
23
26
  if (this.isActive) {
@@ -46,6 +49,12 @@ class DebugManager {
46
49
  });
47
50
  };
48
51
 
52
+ private _initStats = (): void => {
53
+ this._stats = new Stats();
54
+ this._stats.showPanel(0);
55
+ document.body.appendChild(this._stats.dom);
56
+ };
57
+
49
58
  private _addGuiFolder(title: DebugGuiTitle): GUI {
50
59
  return this._gui.addFolder(title);
51
60
  }
@@ -56,19 +65,24 @@ class DebugManager {
56
65
  return gui;
57
66
  }
58
67
 
59
- public beginThreePerf(): void {
68
+ public beginPerf(): void {
60
69
  if (!this._threePerf) this._initThreePerf();
70
+ if (!this._stats) this._initStats();
71
+ this._stats.begin();
61
72
  this._threePerf.begin();
62
73
  }
63
74
 
64
- public endThreePerf(): void {
75
+ public endPerf(): void {
76
+ this._stats.end();
65
77
  this._threePerf.end();
66
78
  }
67
79
 
68
80
  private readonly _onKeyDown = (_e: KeyboardEvent): void => {
69
81
  if (DomKeyboardManager.areAllKeysDown(DebugManager._TOGGLE_HIDDEN_KEYS)) {
70
- this._gui.show(this._gui._hidden);
71
- this._threePerf.visible = !this._threePerf.visible;
82
+ this._isDebugVisible = !this._isDebugVisible;
83
+ this._gui.show(this._isDebugVisible);
84
+ if (this._threePerf) this._threePerf.visible = this._isDebugVisible;
85
+ if (this._stats) this._stats.dom.style.display = this._isDebugVisible ? 'block' : 'none';
72
86
  }
73
87
  };
74
88
 
@@ -11,7 +11,7 @@ class LoaderManager {
11
11
  private _elapsed = 0;
12
12
  private _hasAssetsToLoad = false;
13
13
  private _assetsFinished = false;
14
- private _transitionResolve: (() => void) | null = null;
14
+ private _transitionResolves: (() => void)[] = [];
15
15
  private _showTransition: (() => Promise<void>) | null = null;
16
16
  private _hideTransition: (() => Promise<void>) | null = null;
17
17
 
@@ -85,7 +85,8 @@ class LoaderManager {
85
85
  this._progress = 1;
86
86
  this.onProgress.execute();
87
87
  TickerManager.remove(this._onTransitionTick);
88
- if (this._transitionResolve) this._transitionResolve();
88
+ this._transitionResolves.forEach((resolve) => resolve());
89
+ this._transitionResolves.length = 0;
89
90
  }
90
91
  };
91
92
 
@@ -110,11 +111,9 @@ class LoaderManager {
110
111
  }
111
112
 
112
113
  await new Promise<void>((resolve) => {
113
- this._transitionResolve = resolve;
114
+ this._transitionResolves.push(resolve);
114
115
  TickerManager.add(this._onTransitionTick);
115
116
  });
116
-
117
- this._transitionResolve = null;
118
117
  }
119
118
 
120
119
  if (onReady) await onReady();
@@ -1,16 +1,16 @@
1
1
  import { Action, AssetUtils } from '@benjos/cookware';
2
2
  import {
3
- DataTexture,
4
3
  EquirectangularRefractionMapping,
5
4
  LinearSRGBColorSpace,
6
5
  RepeatWrapping,
7
- Texture,
8
6
  TextureLoader,
9
7
  type ColorSpace,
8
+ type DataTexture,
10
9
  type Mapping,
10
+ type Texture,
11
11
  type Wrapping,
12
12
  } from 'three';
13
- import { DRACOLoader, Font, FontLoader, GLTFLoader, HDRLoader, type GLTF } from 'three/examples/jsm/Addons.js';
13
+ import { DRACOLoader, FontLoader, GLTFLoader, HDRLoader, type Font, type GLTF } from 'three/examples/jsm/Addons.js';
14
14
  import type { AssetId } from '../../constants/experiences/AssetId';
15
15
  import { AssetType } from '../../types/assetTypes';
16
16
 
@@ -1,5 +1,5 @@
1
1
  import { DomPointerManager } from '@benjos/cookware';
2
- import { Object3D, Raycaster, Vector2, type Intersection, type Object3DEventMap } from 'three';
2
+ import { Raycaster, Vector2, type Intersection, type Object3D, type Object3DEventMap } from 'three';
3
3
  import MainThreeApp from '../../engines/threes/app/MainThreeApp';
4
4
 
5
5
  class ThreeRaycasterManager {
@@ -1,22 +1,23 @@
1
1
  import gsap from 'gsap';
2
- import { Color, ShaderMaterial } from 'three';
2
+ import { Color, ShaderMaterial, Uniform } from 'three';
3
3
  import LoaderFragmentShader from '../../../shaders/threes/loaders/LoaderFragmentShader.glsl';
4
4
  import LoaderVertexShader from '../../../shaders/threes/loaders/LoaderVertexShader.glsl';
5
5
 
6
- export default class LoaderMaterial extends ShaderMaterial {
7
- private static readonly _DEFAULT_UNIFORMS_ALPHA: number = 1;
6
+ export default class LoaderThreeMaterial extends ShaderMaterial {
8
7
  private static readonly _DEFAULT_UNIFORMS_COLOR: number = 0x3f79f3;
9
8
  private static readonly _GSAP_DURATION_FADE_IN: number = 0.5;
10
9
  private static readonly _GSAP_EASE_FADE_IN: string = 'power2.out';
11
10
  private static readonly _GSAP_DURATION_FADE_OUT: number = 1.5;
12
11
  private static readonly _GSAP_EASE_FADE_OUT: string = 'power2.in';
13
12
 
13
+ private _isFirstLoad: boolean = true;
14
+
14
15
  constructor() {
15
16
  super({
16
17
  transparent: true,
17
18
  uniforms: {
18
- uAlpha: { value: LoaderMaterial._DEFAULT_UNIFORMS_ALPHA },
19
- uColor: { value: new Color(LoaderMaterial._DEFAULT_UNIFORMS_COLOR) },
19
+ uAlpha: new Uniform(1),
20
+ uColor: new Uniform(new Color(LoaderThreeMaterial._DEFAULT_UNIFORMS_COLOR)),
20
21
  },
21
22
  vertexShader: LoaderVertexShader,
22
23
  fragmentShader: LoaderFragmentShader,
@@ -25,11 +26,13 @@ export default class LoaderMaterial extends ShaderMaterial {
25
26
 
26
27
  public async show(): Promise<void> {
27
28
  gsap.killTweensOf(this.uniforms.uAlpha);
29
+ this.uniforms.uAlpha.value = this._isFirstLoad ? 1 : 0;
28
30
  await gsap.to(this.uniforms.uAlpha, {
29
31
  value: 1,
30
- duration: LoaderMaterial._GSAP_DURATION_FADE_IN,
31
- ease: LoaderMaterial._GSAP_EASE_FADE_IN,
32
+ duration: this._isFirstLoad ? 0 : LoaderThreeMaterial._GSAP_DURATION_FADE_IN,
33
+ ease: LoaderThreeMaterial._GSAP_EASE_FADE_IN,
32
34
  });
35
+ this._isFirstLoad = false;
33
36
  }
34
37
 
35
38
  public async hide(): Promise<void> {
@@ -37,8 +40,8 @@ export default class LoaderMaterial extends ShaderMaterial {
37
40
  this.uniforms.uAlpha.value = 1;
38
41
  await gsap.to(this.uniforms.uAlpha, {
39
42
  value: 0,
40
- duration: LoaderMaterial._GSAP_DURATION_FADE_OUT,
41
- ease: LoaderMaterial._GSAP_EASE_FADE_OUT,
43
+ duration: LoaderThreeMaterial._GSAP_DURATION_FADE_OUT,
44
+ ease: LoaderThreeMaterial._GSAP_EASE_FADE_OUT,
42
45
  });
43
46
  }
44
47
  }
@@ -0,0 +1,18 @@
1
+ import { NoToneMapping, SRGBColorSpace, type Camera, type Scene, type WebGLRendererParameters } from 'three';
2
+ import ThreeWebGLRendererBase from './bases/ThreeWebGLRendererBase';
3
+
4
+ export default class LoaderThreeWebGLRenderer extends ThreeWebGLRendererBase {
5
+ private static readonly _DEFAULT_TONE_MAPPING = NoToneMapping;
6
+ private static readonly _DEFAULT_OUTPUT_COLOR_SPACE = SRGBColorSpace;
7
+ private static readonly _DEFAULT_TONE_MAPPING_EXPOSURE = 1;
8
+ private static readonly _DEFAULT_CLEAR_COLOR = 0x000000;
9
+ private static readonly _DEFAULT_CLEAR_ALPHA = 0;
10
+
11
+ constructor(scene: Scene, camera: Camera, parameters: WebGLRendererParameters = {}) {
12
+ super(scene, camera, parameters);
13
+ this.toneMapping = LoaderThreeWebGLRenderer._DEFAULT_TONE_MAPPING;
14
+ this.toneMappingExposure = LoaderThreeWebGLRenderer._DEFAULT_TONE_MAPPING_EXPOSURE;
15
+ this.outputColorSpace = LoaderThreeWebGLRenderer._DEFAULT_OUTPUT_COLOR_SPACE;
16
+ this.setClearColor(LoaderThreeWebGLRenderer._DEFAULT_CLEAR_COLOR, LoaderThreeWebGLRenderer._DEFAULT_CLEAR_ALPHA);
17
+ }
18
+ }
@@ -1,41 +1,42 @@
1
1
  import {
2
2
  ACESFilmicToneMapping,
3
3
  AgXToneMapping,
4
- Camera,
5
4
  CineonToneMapping,
6
5
  CustomToneMapping,
7
6
  LinearSRGBColorSpace,
8
7
  LinearToneMapping,
9
8
  NeutralToneMapping,
10
9
  NoToneMapping,
11
- PCFSoftShadowMap,
10
+ PCFShadowMap,
12
11
  ReinhardToneMapping,
13
- Scene,
14
12
  SRGBColorSpace,
13
+ type Camera,
15
14
  type ColorSpace,
15
+ type Scene,
16
16
  type ToneMapping,
17
- type WebGLRendererParameters,
17
+ type WebGLRendererParameters
18
18
  } from 'three';
19
+ import MainThreeEffectComposer from '../../composers/threes/MainThreeEffectComposer';
19
20
  import { DebugGuiTitle } from '../../constants/experiences/DebugGuiTitle';
20
21
  import DebugManager from '../../managers/DebugManager';
21
- import WebGLRendererBase from './bases/WebGLRendererBase';
22
+ import ThreeWebGLRendererBase from './bases/ThreeWebGLRendererBase';
22
23
 
23
- export default class Renderer extends WebGLRendererBase {
24
+ export default class MainThreeWebGLRenderer extends ThreeWebGLRendererBase {
24
25
  private static readonly _DEFAULT_TONE_MAPPING = CineonToneMapping;
25
26
  private static readonly _DEFAULT_OUTPUT_COLOR_SPACE = SRGBColorSpace;
26
- private static readonly _DEFAULT_SHADOW_MAP_TYPE = PCFSoftShadowMap;
27
+ private static readonly _DEFAULT_SHADOW_MAP_TYPE = PCFShadowMap;
27
28
  private static readonly _DEFAULT_TONE_MAPPING_EXPOSURE = 1;
28
29
  private static readonly _DEFAULT_CLEAR_COLOR = 0xfafafa;
29
30
  private static readonly _DEFAULT_CLEAR_ALPHA = 0;
30
31
 
31
32
  constructor(scene: Scene, camera: Camera, parameters: WebGLRendererParameters = {}) {
32
33
  super(scene, camera, parameters);
33
- this.toneMapping = Renderer._DEFAULT_TONE_MAPPING;
34
- this.toneMappingExposure = Renderer._DEFAULT_TONE_MAPPING_EXPOSURE;
35
- this.outputColorSpace = Renderer._DEFAULT_OUTPUT_COLOR_SPACE;
34
+ this.toneMapping = MainThreeWebGLRenderer._DEFAULT_TONE_MAPPING;
35
+ this.toneMappingExposure = MainThreeWebGLRenderer._DEFAULT_TONE_MAPPING_EXPOSURE;
36
+ this.outputColorSpace = MainThreeWebGLRenderer._DEFAULT_OUTPUT_COLOR_SPACE;
36
37
  this.shadowMap.enabled = true;
37
- this.shadowMap.type = Renderer._DEFAULT_SHADOW_MAP_TYPE;
38
- this.setClearColor(Renderer._DEFAULT_CLEAR_COLOR, Renderer._DEFAULT_CLEAR_ALPHA);
38
+ this.shadowMap.type = MainThreeWebGLRenderer._DEFAULT_SHADOW_MAP_TYPE;
39
+ this.setClearColor(MainThreeWebGLRenderer._DEFAULT_CLEAR_COLOR, MainThreeWebGLRenderer._DEFAULT_CLEAR_ALPHA);
39
40
 
40
41
  if (DebugManager.isActive) {
41
42
  const rendererFolder = DebugManager.getGuiFolder(DebugGuiTitle.THREE_RENDERER)
@@ -59,13 +60,22 @@ export default class Renderer extends WebGLRendererBase {
59
60
  .onChange((value: ColorSpace) => {
60
61
  this.outputColorSpace = value;
61
62
  });
63
+ const postProcProxy = { active: this._isPostProcessingActive };
64
+ rendererFolder
65
+ .add(postProcProxy, 'active')
66
+ .name('post-processing')
67
+ .onChange((value: boolean) => this.setIsPostProcessingActive(value));
62
68
  }
63
69
  }
64
70
 
71
+ protected override _generateComposers(): void {
72
+ this._composer = new MainThreeEffectComposer(this, this._scene, this._camera);
73
+ }
74
+
65
75
  public override update(dt: number): void {
66
76
  const isDebug = DebugManager.isActive;
67
- if (isDebug) DebugManager.beginThreePerf();
77
+ if (isDebug) DebugManager.beginPerf();
68
78
  super.update(dt);
69
- if (isDebug) DebugManager.endThreePerf();
79
+ if (isDebug) DebugManager.endPerf();
70
80
  }
71
81
  }