@combeenation/3d-viewer 5.0.1 → 5.0.3-beta2

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 (109) hide show
  1. package/README.md +111 -114
  2. package/dist/lib-cjs/api/classes/animationInterface.d.ts +8 -8
  3. package/dist/lib-cjs/api/classes/animationInterface.js +1 -1
  4. package/dist/lib-cjs/api/classes/dottedPath.d.ts +79 -79
  5. package/dist/lib-cjs/api/classes/dottedPath.js +187 -187
  6. package/dist/lib-cjs/api/classes/element.d.ts +139 -139
  7. package/dist/lib-cjs/api/classes/element.js +794 -794
  8. package/dist/lib-cjs/api/classes/element.js.map +1 -1
  9. package/dist/lib-cjs/api/classes/elementParameterizable.d.ts +14 -0
  10. package/dist/lib-cjs/api/classes/elementParameterizable.js +135 -0
  11. package/dist/lib-cjs/api/classes/elementParameterizable.js.map +1 -0
  12. package/dist/lib-cjs/api/classes/event.d.ts +326 -326
  13. package/dist/lib-cjs/api/classes/event.js +371 -371
  14. package/dist/lib-cjs/api/classes/eventBroadcaster.d.ts +26 -26
  15. package/dist/lib-cjs/api/classes/eventBroadcaster.js +53 -53
  16. package/dist/lib-cjs/api/classes/parameter.d.ts +316 -259
  17. package/dist/lib-cjs/api/classes/parameter.js +451 -388
  18. package/dist/lib-cjs/api/classes/parameter.js.map +1 -1
  19. package/dist/lib-cjs/api/classes/parameterObservable.d.ts +36 -36
  20. package/dist/lib-cjs/api/classes/parameterObservable.js +101 -101
  21. package/dist/lib-cjs/api/classes/parameterizable.d.ts +15 -15
  22. package/dist/lib-cjs/api/classes/parameterizable.js +149 -149
  23. package/dist/lib-cjs/api/classes/placementAnimation.d.ts +44 -44
  24. package/dist/lib-cjs/api/classes/placementAnimation.js +163 -163
  25. package/dist/lib-cjs/api/classes/variant.d.ts +234 -234
  26. package/dist/lib-cjs/api/classes/variant.js +1154 -1154
  27. package/dist/lib-cjs/api/classes/variantInstance.d.ts +45 -45
  28. package/dist/lib-cjs/api/classes/variantInstance.js +108 -108
  29. package/dist/lib-cjs/api/classes/variantParameterizable.d.ts +17 -17
  30. package/dist/lib-cjs/api/classes/variantParameterizable.js +99 -99
  31. package/dist/lib-cjs/api/classes/viewer.d.ts +177 -175
  32. package/dist/lib-cjs/api/classes/viewer.js +717 -701
  33. package/dist/lib-cjs/api/classes/viewer.js.map +1 -1
  34. package/dist/lib-cjs/api/classes/viewerLight.d.ts +66 -66
  35. package/dist/lib-cjs/api/classes/viewerLight.js +392 -392
  36. package/dist/lib-cjs/api/internal/debugViewer.d.ts +13 -13
  37. package/dist/lib-cjs/api/internal/debugViewer.js +86 -86
  38. package/dist/lib-cjs/api/internal/lensRendering.d.ts +8 -8
  39. package/dist/lib-cjs/api/internal/lensRendering.js +11 -11
  40. package/dist/lib-cjs/api/internal/sceneSetup.d.ts +13 -10
  41. package/dist/lib-cjs/api/internal/sceneSetup.js +238 -234
  42. package/dist/lib-cjs/api/internal/sceneSetup.js.map +1 -1
  43. package/dist/lib-cjs/api/manager/animationManager.d.ts +29 -29
  44. package/dist/lib-cjs/api/manager/animationManager.js +130 -130
  45. package/dist/lib-cjs/api/manager/gltfExportManager.d.ts +65 -65
  46. package/dist/lib-cjs/api/manager/gltfExportManager.js +223 -222
  47. package/dist/lib-cjs/api/manager/gltfExportManager.js.map +1 -1
  48. package/dist/lib-cjs/api/manager/sceneManager.d.ts +31 -32
  49. package/dist/lib-cjs/api/manager/sceneManager.js +153 -132
  50. package/dist/lib-cjs/api/manager/sceneManager.js.map +1 -1
  51. package/dist/lib-cjs/api/manager/variantInstanceManager.d.ts +92 -92
  52. package/dist/lib-cjs/api/manager/variantInstanceManager.js +335 -335
  53. package/dist/lib-cjs/api/store/specStorage.d.ts +24 -24
  54. package/dist/lib-cjs/api/store/specStorage.js +51 -51
  55. package/dist/lib-cjs/api/util/babylonHelper.d.ts +174 -166
  56. package/dist/lib-cjs/api/util/babylonHelper.js +575 -497
  57. package/dist/lib-cjs/api/util/babylonHelper.js.map +1 -1
  58. package/dist/lib-cjs/api/util/globalTypes.d.ts +366 -356
  59. package/dist/lib-cjs/api/util/globalTypes.js +1 -1
  60. package/dist/lib-cjs/api/util/resourceHelper.d.ts +58 -53
  61. package/dist/lib-cjs/api/util/resourceHelper.js +257 -242
  62. package/dist/lib-cjs/api/util/resourceHelper.js.map +1 -1
  63. package/dist/lib-cjs/api/util/stringHelper.d.ts +9 -9
  64. package/dist/lib-cjs/api/util/stringHelper.js +25 -25
  65. package/dist/lib-cjs/api/util/structureHelper.d.ts +9 -9
  66. package/dist/lib-cjs/api/util/structureHelper.js +48 -44
  67. package/dist/lib-cjs/api/util/structureHelper.js.map +1 -1
  68. package/dist/lib-cjs/buildinfo.json +3 -3
  69. package/dist/lib-cjs/index.d.ts +49 -49
  70. package/dist/lib-cjs/index.js +89 -89
  71. package/dist/webpack-stats.json +0 -0
  72. package/package.json +87 -87
  73. package/src/api/classes/animationInterface.ts +10 -10
  74. package/src/api/classes/dottedPath.ts +181 -181
  75. package/src/api/classes/element.ts +690 -692
  76. package/src/api/classes/event.ts +367 -367
  77. package/src/api/classes/eventBroadcaster.ts +52 -52
  78. package/src/api/classes/parameter.ts +474 -405
  79. package/src/api/classes/parameterObservable.ts +100 -100
  80. package/src/api/classes/parameterizable.ts +87 -87
  81. package/src/api/classes/placementAnimation.ts +160 -160
  82. package/src/api/classes/variant.ts +845 -845
  83. package/src/api/classes/variantInstance.ts +97 -97
  84. package/src/api/classes/variantParameterizable.ts +85 -85
  85. package/src/api/classes/viewer.ts +650 -624
  86. package/src/api/classes/viewerLight.ts +334 -334
  87. package/src/api/internal/debugViewer.ts +90 -90
  88. package/src/api/internal/lensRendering.ts +10 -10
  89. package/src/api/internal/sceneSetup.ts +204 -201
  90. package/src/api/manager/animationManager.ts +142 -142
  91. package/src/api/manager/gltfExportManager.ts +191 -191
  92. package/src/api/manager/sceneManager.ts +128 -102
  93. package/src/api/manager/variantInstanceManager.ts +265 -265
  94. package/src/api/store/specStorage.ts +51 -51
  95. package/src/api/util/babylonHelper.ts +628 -538
  96. package/src/api/util/globalTypes.ts +413 -402
  97. package/src/api/util/resourceHelper.ts +189 -173
  98. package/src/api/util/stringHelper.ts +23 -23
  99. package/src/api/util/structureHelper.ts +49 -43
  100. package/src/buildinfo.json +3 -3
  101. package/src/commonjs.tsconfig.json +10 -10
  102. package/src/declaration.tsconfig.json +8 -8
  103. package/src/dev.ts +42 -42
  104. package/src/es6.tsconfig.json +10 -10
  105. package/src/index.ts +94 -94
  106. package/src/pagesconfig.json +77 -73
  107. package/src/tsconfig.json +32 -32
  108. package/src/tsconfig.types.json +9 -9
  109. package/src/types.d.ts +3 -3
@@ -1,90 +1,90 @@
1
- /**
2
- * @internal
3
- */
4
- import { Scene } from '@babylonjs/core/scene';
5
- import { VariantInstance } from '../classes/variantInstance';
6
- import { Viewer } from '../classes/viewer';
7
- import { Event } from '../classes/event';
8
-
9
- export class DebugViewer extends Viewer {
10
- constructor(canvas: HTMLCanvasElement, data: string | StructureJson) {
11
- super(canvas, data);
12
- }
13
-
14
- public async bootstrap(): Promise<Viewer> {
15
- for (const event of Event.all) {
16
- this.eventEmitter.addListener(event, (...args) => console.debug(`Emitting ${event}`, ...args));
17
- }
18
- for (const event of [
19
- Event.VARIANT_INSTANCE_DESTROYED,
20
- Event.VARIANT_INSTANCE_CREATED,
21
- Event.VARIANT_INSTANCE_CLONED,
22
- Event.VARIANT_PARAMETER_COMMITTED,
23
- ]) {
24
- this.eventEmitter.addListener(event, this.instanceDebugger.bind(this));
25
- }
26
- return super.bootstrap();
27
- }
28
-
29
- protected async initScene(): Promise<Scene> {
30
- const scene = await super.initScene();
31
-
32
- scene.getEngine().runRenderLoop(() => {
33
- this.fpsDebugger();
34
- });
35
-
36
- return scene;
37
- }
38
-
39
- protected instanceDebugger(instance: VariantInstance) {
40
- const instances: string[] = [];
41
- this.variantInstances.all.forEach(variantInstance => {
42
- instances.push(
43
- `${variantInstance.name}${variantInstance.variant.visible ? '' : ' [hidden]'}${
44
- variantInstance.variant.highlighted ? ' [highlighted]' : ''
45
- }`
46
- );
47
- });
48
- let debugContainer = document.getElementById('cyledge-combeenation-3d-viewer-instance-debugger');
49
- if (!debugContainer) {
50
- debugContainer = document.createElement('pre');
51
- debugContainer.setAttribute('id', 'cyledge-combeenation-3d-viewer-instance-debugger');
52
- debugContainer.setAttribute(
53
- 'style',
54
- `
55
- background: #454545;
56
- color: #fff;
57
- position: absolute;
58
- bottom: 0;
59
- right: 0;
60
- padding: 10px;
61
- margin: 0;
62
- `
63
- );
64
- document.body.appendChild(debugContainer);
65
- }
66
- debugContainer.innerHTML = JSON.stringify(instances, null, 2);
67
- }
68
-
69
- protected fpsDebugger() {
70
- let debugContainer = document.getElementById('cyledge-combeenation-3d-viewer-fps-debugger');
71
- if (!debugContainer) {
72
- debugContainer = document.createElement('pre');
73
- debugContainer.setAttribute('id', 'cyledge-combeenation-3d-viewer-fps-debugger');
74
- debugContainer.setAttribute(
75
- 'style',
76
- `
77
- background: #454545;
78
- color: #fff;
79
- position: absolute;
80
- bottom: 0;
81
- left: 0;
82
- padding: 10px;
83
- margin: 0;
84
- `
85
- );
86
- document.body.appendChild(debugContainer);
87
- }
88
- debugContainer.innerHTML = `${this.engine.getFps().toFixed(2)} fps`;
89
- }
90
- }
1
+ /**
2
+ * @internal
3
+ */
4
+ import { Scene } from '@babylonjs/core/scene';
5
+ import { VariantInstance } from '../classes/variantInstance';
6
+ import { Viewer } from '../classes/viewer';
7
+ import { Event } from '../classes/event';
8
+
9
+ export class DebugViewer extends Viewer {
10
+ constructor(canvas: HTMLCanvasElement, data: string | StructureJson) {
11
+ super(canvas, data);
12
+ }
13
+
14
+ public async bootstrap(): Promise<Viewer> {
15
+ for (const event of Event.all) {
16
+ this.eventEmitter.addListener(event, (...args) => console.debug(`Emitting ${event}`, ...args));
17
+ }
18
+ for (const event of [
19
+ Event.VARIANT_INSTANCE_DESTROYED,
20
+ Event.VARIANT_INSTANCE_CREATED,
21
+ Event.VARIANT_INSTANCE_CLONED,
22
+ Event.VARIANT_PARAMETER_COMMITTED,
23
+ ]) {
24
+ this.eventEmitter.addListener(event, this.instanceDebugger.bind(this));
25
+ }
26
+ return super.bootstrap();
27
+ }
28
+
29
+ protected async initScene(): Promise<Scene> {
30
+ const scene = await super.initScene();
31
+
32
+ scene.getEngine().runRenderLoop(() => {
33
+ this.fpsDebugger();
34
+ });
35
+
36
+ return scene;
37
+ }
38
+
39
+ protected instanceDebugger(instance: VariantInstance) {
40
+ const instances: string[] = [];
41
+ this.variantInstances.all.forEach(variantInstance => {
42
+ instances.push(
43
+ `${variantInstance.name}${variantInstance.variant.visible ? '' : ' [hidden]'}${
44
+ variantInstance.variant.highlighted ? ' [highlighted]' : ''
45
+ }`
46
+ );
47
+ });
48
+ let debugContainer = document.getElementById('cyledge-combeenation-3d-viewer-instance-debugger');
49
+ if (!debugContainer) {
50
+ debugContainer = document.createElement('pre');
51
+ debugContainer.setAttribute('id', 'cyledge-combeenation-3d-viewer-instance-debugger');
52
+ debugContainer.setAttribute(
53
+ 'style',
54
+ `
55
+ background: #454545;
56
+ color: #fff;
57
+ position: absolute;
58
+ bottom: 0;
59
+ right: 0;
60
+ padding: 10px;
61
+ margin: 0;
62
+ `
63
+ );
64
+ document.body.appendChild(debugContainer);
65
+ }
66
+ debugContainer.innerHTML = JSON.stringify(instances, null, 2);
67
+ }
68
+
69
+ protected fpsDebugger() {
70
+ let debugContainer = document.getElementById('cyledge-combeenation-3d-viewer-fps-debugger');
71
+ if (!debugContainer) {
72
+ debugContainer = document.createElement('pre');
73
+ debugContainer.setAttribute('id', 'cyledge-combeenation-3d-viewer-fps-debugger');
74
+ debugContainer.setAttribute(
75
+ 'style',
76
+ `
77
+ background: #454545;
78
+ color: #fff;
79
+ position: absolute;
80
+ bottom: 0;
81
+ left: 0;
82
+ padding: 10px;
83
+ margin: 0;
84
+ `
85
+ );
86
+ document.body.appendChild(debugContainer);
87
+ }
88
+ debugContainer.innerHTML = `${this.engine.getFps().toFixed(2)} fps`;
89
+ }
90
+ }
@@ -1,10 +1,10 @@
1
- /**
2
- * Group the required LensRendering dependencies into a single file to allow a single "import"
3
- *
4
- * @internal
5
- */
6
-
7
- import '@babylonjs/core/Rendering/depthRendererSceneComponent';
8
- import { LensRenderingPipeline } from '@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline';
9
-
10
- export { LensRenderingPipeline };
1
+ /**
2
+ * Group the required LensRendering dependencies into a single file to allow a single "import"
3
+ *
4
+ * @internal
5
+ */
6
+
7
+ import '@babylonjs/core/Rendering/depthRendererSceneComponent';
8
+ import { LensRenderingPipeline } from '@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline';
9
+
10
+ export { LensRenderingPipeline };
@@ -1,201 +1,204 @@
1
- import { Camera } from '@babylonjs/core/Cameras/camera';
2
- import { Engine } from '@babylonjs/core/Engines/engine';
3
- import '@babylonjs/core/Helpers/sceneHelpers';
4
- import '@babylonjs/core/Materials/Textures/Loaders/ddsTextureLoader';
5
- import { Color4 } from '@babylonjs/core/Maths/math.color';
6
- import { Vector3 } from '@babylonjs/core/Maths/math.vector';
7
- import { GroundMesh } from '@babylonjs/core/Meshes/groundMesh';
8
- import { MeshBuilder } from '@babylonjs/core/Meshes/meshBuilder';
9
- import { DefaultRenderingPipeline } from '@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline';
10
- import { Scene } from '@babylonjs/core/scene';
11
- import { get, isEmpty, set } from 'lodash-es';
12
- import { Parameter } from '../classes/parameter';
13
-
14
- /**
15
- * @param scene
16
- * @param name
17
- * @param definition
18
- */
19
- const processGround = async function (
20
- scene: Scene,
21
- name: string,
22
- definition: GroundDefinition
23
- ): Promise<Mesh | GroundMesh> {
24
- return new Promise(resolve => {
25
- const _resolve = (ground: Mesh) => {
26
- if (definition.receiveShadows !== undefined) {
27
- ground.receiveShadows = definition.receiveShadows;
28
- }
29
- resolve(ground);
30
- };
31
- switch (definition.type) {
32
- case 'baked':
33
- if (!definition.meshId) {
34
- throw new Error(`A baked ground must define a "meshId".`);
35
- }
36
- _resolve(scene.getMeshByID(definition.meshId) as Mesh);
37
- break;
38
- case 'ground':
39
- _resolve(MeshBuilder.CreateGround(name, definition, scene));
40
- break;
41
- case 'heightmap':
42
- if (!definition.url) {
43
- throw new Error(`A heightmap ground must define an "url".`);
44
- }
45
- definition.onReady = (_ground: GroundMesh) => {
46
- _resolve(_ground);
47
- };
48
- MeshBuilder.CreateGroundFromHeightMap(name, definition.url, definition, scene);
49
- break;
50
- default:
51
- throw new Error(`Ground of type "${definition.type}" not implemented (yet).`);
52
- }
53
- });
54
- };
55
-
56
- /**
57
- * @param scene
58
- */
59
- const defaultCamera = async function (scene: Scene): Promise<Camera> {
60
- return await processCamera(scene, 'default_camera', {
61
- type: 'arc',
62
- active: true,
63
- });
64
- };
65
-
66
- /**
67
- * @param scene
68
- * @param name
69
- * @param cameraSetup
70
- */
71
- const processCamera = async function (scene: Scene, name: string, cameraSetup: CameraDefinition): Promise<Camera> {
72
- let camera: Camera;
73
- let target = Vector3.Zero();
74
- if (cameraSetup.target) {
75
- target = Parameter.parseVector(cameraSetup.target);
76
- }
77
- switch (cameraSetup.type) {
78
- case 'arc':
79
- // @ts-ignore
80
- const arcCameraModule = await import(
81
- /* webpackChunkName: "arc-rotate-camera" */ '@babylonjs/core/Cameras/arcRotateCamera'
82
- );
83
- camera = new arcCameraModule.ArcRotateCamera(name, Math.PI / 4, Math.PI / 4, 2, target, scene);
84
- camera.metadata = {
85
- alpha: Math.PI / 4,
86
- beta: Math.PI / 4,
87
- radius: 2,
88
- };
89
- break;
90
- }
91
- if (cameraSetup.active) {
92
- camera.attachControl(scene.getEngine().getRenderingCanvas()!, true);
93
- }
94
- if (cameraSetup.fov) {
95
- camera.fov = cameraSetup.fov;
96
- }
97
- camera.storeState();
98
- return camera;
99
- };
100
-
101
- /**
102
- * @param engine
103
- * @param sceneJson
104
- */
105
- const sceneSetup = async function (engine: Engine, sceneJson: SceneJson): Promise<Scene> {
106
- const scene = new Scene(engine);
107
- scene.clearColor = new Color4(0, 0, 0, 0);
108
- // cameras
109
- const cameras: Camera[] = [];
110
- const cameraDefinitions = get(sceneJson.scene, 'cameras') as CameraDefinitions;
111
- if (!isEmpty(cameraDefinitions)) {
112
- for (let cameraName in cameraDefinitions) {
113
- cameras.push(await processCamera(scene, cameraName, cameraDefinitions[cameraName]));
114
- }
115
- } else {
116
- const camera = await defaultCamera(scene);
117
- cameras.push(camera);
118
- }
119
- // grounds
120
- const groundDefinitions = get(sceneJson.scene, 'grounds') as GroundDefinitions;
121
- if (!isEmpty(groundDefinitions)) {
122
- for (const groundName in groundDefinitions) {
123
- await processGround(scene, groundName, groundDefinitions[groundName]);
124
- }
125
- }
126
- // TODO: try to split this away from the default rendering pipeline to save module imports
127
- // The "hdr" setting had negative effect on rendering in Safari. Everything looked a little "edgy". I'm not completely
128
- // sure if disabling it comes with other negative side effects I don't see right now, so we should probably
129
- // investigate this a little more in detail at some point.
130
- const defaultPipeline = new DefaultRenderingPipeline('default-rendering-pipeline', false, scene);
131
- /* DISABLED: causes problems with Internet Explorer
132
- defaultPipeline.imageProcessingEnabled = true;
133
- */
134
- if (sceneJson.scene.globals.aa) {
135
- defaultPipeline.fxaaEnabled = true; //implicitly does FxaaPostProcess()
136
- }
137
- // Set samples regardless of fxaa setting since we don't want to use fxaa but still increase the sample count
138
- defaultPipeline.samples = 8;
139
- if (sceneJson.scene.globals['camera-settings']) {
140
- if (
141
- sceneJson.scene.globals['camera-settings']!.sharpen &&
142
- sceneJson.scene.globals['camera-settings']!.sharpen.enabled
143
- ) {
144
- defaultPipeline.sharpenEnabled = true; //implicitly does SharpenPostProcess()
145
- //defaultPipeline.sharpen.colorAmount = 1;
146
- //defaultPipeline.sharpen.edgeAmount = 0;
147
- }
148
- if (
149
- sceneJson.scene.globals['camera-settings']!.bloom &&
150
- sceneJson.scene.globals['camera-settings']!.bloom.enabled
151
- ) {
152
- defaultPipeline.bloomEnabled = true;
153
- if (sceneJson.scene.globals['camera-settings']!.bloom.size) {
154
- defaultPipeline.bloomScale = sceneJson.scene.globals['camera-settings']!.bloom.size;
155
- }
156
- if (sceneJson.scene.globals['camera-settings']!.bloom.threshold) {
157
- defaultPipeline.bloomThreshold = sceneJson.scene.globals['camera-settings']!.bloom.threshold;
158
- }
159
- }
160
- if (sceneJson.scene.globals['camera-settings']!.contrast) {
161
- scene.imageProcessingConfiguration.contrast = sceneJson.scene.globals['camera-settings']!.contrast;
162
- }
163
- if (sceneJson.scene.globals['camera-settings']!.exposure) {
164
- scene.imageProcessingConfiguration.exposure = sceneJson.scene.globals['camera-settings']!.exposure;
165
- }
166
- if (sceneJson.scene.globals['camera-settings']!.dof && sceneJson.scene.globals['camera-settings']!.dof.enabled) {
167
- //@ts-ignore
168
- const module = await import(/* webpackChunkName: "lens-rendering" */ './lensRendering');
169
- new module.LensRenderingPipeline(
170
- 'lens-rendering',
171
- sceneJson.scene.globals['camera-settings']!.dof.settings,
172
- scene,
173
- 1.0,
174
- cameras
175
- );
176
- }
177
- }
178
- // TODO: make this dynamic
179
- /*
180
- const texture = new HDRCubeTexture("/assets/small_cave_1k.hdr", scene, 256);
181
- texture.gammaSpace = false;
182
- scene.environmentTexture = texture;
183
- // scene.environmentTexture.
184
-
185
- const skyboxMaterial = new StandardMaterial("skyBox", scene);
186
- skyboxMaterial.backFaceCulling = false;
187
- skyboxMaterial.reflectionTexture = texture;
188
- skyboxMaterial.reflectionTexture.coordinatesMode = Texture.SKYBOX_MODE;
189
- skyboxMaterial.disableLighting = false;
190
- // TODO: replace with BoxBuilder
191
- const skybox = MeshBuilder.CreateBox("skyBox", {size: 1000.0}, scene);
192
- skybox.isPickable = false; //never pick a skybox
193
- skybox.infiniteDistance = true;
194
- skybox.material = skyboxMaterial;
195
- */
196
-
197
- // TODO: shadows don't work with HemishpericLight
198
- return scene;
199
- };
200
-
201
- export { sceneSetup };
1
+ import { Camera } from '@babylonjs/core/Cameras/camera';
2
+ import { Engine } from '@babylonjs/core/Engines/engine';
3
+ import '@babylonjs/core/Helpers/sceneHelpers';
4
+ import '@babylonjs/core/Materials/Textures/Loaders/ddsTextureLoader';
5
+ import { Color4 } from '@babylonjs/core/Maths/math.color';
6
+ import { Vector3 } from '@babylonjs/core/Maths/math.vector';
7
+ import { GroundMesh } from '@babylonjs/core/Meshes/groundMesh';
8
+ import { MeshBuilder } from '@babylonjs/core/Meshes/meshBuilder';
9
+ import { DefaultRenderingPipeline } from '@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline';
10
+ import { Scene } from '@babylonjs/core/scene';
11
+ import { get, isEmpty, set } from 'lodash-es';
12
+ import { Parameter } from '../classes/parameter';
13
+
14
+ const defaultSceneClearColor = new Color4(0, 0, 0, 0);
15
+ const defaultEnvHelperColor = new Color4(0, 0, 0.5, 0);
16
+
17
+ /**
18
+ * @param scene
19
+ * @param name
20
+ * @param definition
21
+ */
22
+ const processGround = async function (
23
+ scene: Scene,
24
+ name: string,
25
+ definition: GroundDefinition
26
+ ): Promise<Mesh | GroundMesh> {
27
+ return new Promise(resolve => {
28
+ const _resolve = (ground: Mesh) => {
29
+ if (definition.receiveShadows !== undefined) {
30
+ ground.receiveShadows = definition.receiveShadows;
31
+ }
32
+ resolve(ground);
33
+ };
34
+ switch (definition.type) {
35
+ case 'baked':
36
+ if (!definition.meshId) {
37
+ throw new Error(`A baked ground must define a "meshId".`);
38
+ }
39
+ _resolve(scene.getMeshByID(definition.meshId) as Mesh);
40
+ break;
41
+ case 'ground':
42
+ _resolve(MeshBuilder.CreateGround(name, definition, scene));
43
+ break;
44
+ case 'heightmap':
45
+ if (!definition.url) {
46
+ throw new Error(`A heightmap ground must define an "url".`);
47
+ }
48
+ definition.onReady = (_ground: GroundMesh) => {
49
+ _resolve(_ground);
50
+ };
51
+ MeshBuilder.CreateGroundFromHeightMap(name, definition.url, definition, scene);
52
+ break;
53
+ default:
54
+ throw new Error(`Ground of type "${definition.type}" not implemented (yet).`);
55
+ }
56
+ });
57
+ };
58
+
59
+ /**
60
+ * @param scene
61
+ */
62
+ const defaultCamera = async function (scene: Scene): Promise<Camera> {
63
+ return await processCamera(scene, 'default_camera', {
64
+ type: 'arc',
65
+ active: true,
66
+ });
67
+ };
68
+
69
+ /**
70
+ * @param scene
71
+ * @param name
72
+ * @param cameraSetup
73
+ */
74
+ const processCamera = async function (scene: Scene, name: string, cameraSetup: CameraDefinition): Promise<Camera> {
75
+ let camera: Camera;
76
+ let target = Vector3.Zero();
77
+ if (cameraSetup.target) {
78
+ target = Parameter.parseVector(cameraSetup.target);
79
+ }
80
+ switch (cameraSetup.type) {
81
+ case 'arc':
82
+ // @ts-ignore
83
+ const arcCameraModule = await import(
84
+ /* webpackChunkName: "arc-rotate-camera" */ '@babylonjs/core/Cameras/arcRotateCamera'
85
+ );
86
+ camera = new arcCameraModule.ArcRotateCamera(name, Math.PI / 4, Math.PI / 4, 2, target, scene);
87
+ camera.metadata = {
88
+ alpha: Math.PI / 4,
89
+ beta: Math.PI / 4,
90
+ radius: 2,
91
+ };
92
+ break;
93
+ }
94
+ if (cameraSetup.active) {
95
+ camera.attachControl(scene.getEngine().getRenderingCanvas()!, true);
96
+ }
97
+ if (cameraSetup.fov) {
98
+ camera.fov = cameraSetup.fov;
99
+ }
100
+ camera.storeState();
101
+ return camera;
102
+ };
103
+
104
+ /**
105
+ * @param engine
106
+ * @param sceneJson
107
+ */
108
+ const sceneSetup = async function (engine: Engine, sceneJson: SceneJson): Promise<Scene> {
109
+ const scene = new Scene(engine);
110
+ scene.clearColor = defaultSceneClearColor;
111
+ // cameras
112
+ const cameras: Camera[] = [];
113
+ const cameraDefinitions = get(sceneJson.scene, 'cameras') as CameraDefinitions;
114
+ if (!isEmpty(cameraDefinitions)) {
115
+ for (let cameraName in cameraDefinitions) {
116
+ cameras.push(await processCamera(scene, cameraName, cameraDefinitions[cameraName]));
117
+ }
118
+ } else {
119
+ const camera = await defaultCamera(scene);
120
+ cameras.push(camera);
121
+ }
122
+ // grounds
123
+ const groundDefinitions = get(sceneJson.scene, 'grounds') as GroundDefinitions;
124
+ if (!isEmpty(groundDefinitions)) {
125
+ for (const groundName in groundDefinitions) {
126
+ await processGround(scene, groundName, groundDefinitions[groundName]);
127
+ }
128
+ }
129
+ // TODO: try to split this away from the default rendering pipeline to save module imports
130
+ // The "hdr" setting had negative effect on rendering in Safari. Everything looked a little "edgy". I'm not completely
131
+ // sure if disabling it comes with other negative side effects I don't see right now, so we should probably
132
+ // investigate this a little more in detail at some point.
133
+ const defaultPipeline = new DefaultRenderingPipeline('default-rendering-pipeline', false, scene);
134
+ /* DISABLED: causes problems with Internet Explorer
135
+ defaultPipeline.imageProcessingEnabled = true;
136
+ */
137
+ if (sceneJson.scene.globals.aa) {
138
+ defaultPipeline.fxaaEnabled = true; //implicitly does FxaaPostProcess()
139
+ }
140
+ // Set samples regardless of fxaa setting since we don't want to use fxaa but still increase the sample count
141
+ defaultPipeline.samples = 8;
142
+ if (sceneJson.scene.globals['camera-settings']) {
143
+ if (
144
+ sceneJson.scene.globals['camera-settings']!.sharpen &&
145
+ sceneJson.scene.globals['camera-settings']!.sharpen.enabled
146
+ ) {
147
+ defaultPipeline.sharpenEnabled = true; //implicitly does SharpenPostProcess()
148
+ //defaultPipeline.sharpen.colorAmount = 1;
149
+ //defaultPipeline.sharpen.edgeAmount = 0;
150
+ }
151
+ if (
152
+ sceneJson.scene.globals['camera-settings']!.bloom &&
153
+ sceneJson.scene.globals['camera-settings']!.bloom.enabled
154
+ ) {
155
+ defaultPipeline.bloomEnabled = true;
156
+ if (sceneJson.scene.globals['camera-settings']!.bloom.size) {
157
+ defaultPipeline.bloomScale = sceneJson.scene.globals['camera-settings']!.bloom.size;
158
+ }
159
+ if (sceneJson.scene.globals['camera-settings']!.bloom.threshold) {
160
+ defaultPipeline.bloomThreshold = sceneJson.scene.globals['camera-settings']!.bloom.threshold;
161
+ }
162
+ }
163
+ if (sceneJson.scene.globals['camera-settings']!.contrast) {
164
+ scene.imageProcessingConfiguration.contrast = sceneJson.scene.globals['camera-settings']!.contrast;
165
+ }
166
+ if (sceneJson.scene.globals['camera-settings']!.exposure) {
167
+ scene.imageProcessingConfiguration.exposure = sceneJson.scene.globals['camera-settings']!.exposure;
168
+ }
169
+ if (sceneJson.scene.globals['camera-settings']!.dof && sceneJson.scene.globals['camera-settings']!.dof.enabled) {
170
+ //@ts-ignore
171
+ const module = await import(/* webpackChunkName: "lens-rendering" */ './lensRendering');
172
+ new module.LensRenderingPipeline(
173
+ 'lens-rendering',
174
+ sceneJson.scene.globals['camera-settings']!.dof.settings,
175
+ scene,
176
+ 1.0,
177
+ cameras
178
+ );
179
+ }
180
+ }
181
+ // TODO: make this dynamic
182
+ /*
183
+ const texture = new HDRCubeTexture("/assets/small_cave_1k.hdr", scene, 256);
184
+ texture.gammaSpace = false;
185
+ scene.environmentTexture = texture;
186
+ // scene.environmentTexture.
187
+
188
+ const skyboxMaterial = new StandardMaterial("skyBox", scene);
189
+ skyboxMaterial.backFaceCulling = false;
190
+ skyboxMaterial.reflectionTexture = texture;
191
+ skyboxMaterial.reflectionTexture.coordinatesMode = Texture.SKYBOX_MODE;
192
+ skyboxMaterial.disableLighting = false;
193
+ // TODO: replace with BoxBuilder
194
+ const skybox = MeshBuilder.CreateBox("skyBox", {size: 1000.0}, scene);
195
+ skybox.isPickable = false; //never pick a skybox
196
+ skybox.infiniteDistance = true;
197
+ skybox.material = skyboxMaterial;
198
+ */
199
+
200
+ // TODO: shadows don't work with HemishpericLight
201
+ return scene;
202
+ };
203
+
204
+ export { sceneSetup, defaultSceneClearColor, defaultEnvHelperColor };