@combeenation/3d-viewer 4.0.0-rc1 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +114 -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 +190 -190
  6. package/dist/lib-cjs/api/classes/element.d.ts +130 -130
  7. package/dist/lib-cjs/api/classes/element.js +746 -743
  8. package/dist/lib-cjs/api/classes/element.js.map +1 -1
  9. package/dist/lib-cjs/api/classes/elementParameterizable.d.ts +14 -14
  10. package/dist/lib-cjs/api/classes/elementParameterizable.js +134 -134
  11. package/dist/lib-cjs/api/classes/event.d.ts +326 -326
  12. package/dist/lib-cjs/api/classes/event.js +371 -371
  13. package/dist/lib-cjs/api/classes/eventBroadcaster.d.ts +26 -26
  14. package/dist/lib-cjs/api/classes/eventBroadcaster.js +53 -53
  15. package/dist/lib-cjs/api/classes/parameter.d.ts +259 -259
  16. package/dist/lib-cjs/api/classes/parameter.js +387 -387
  17. package/dist/lib-cjs/api/classes/parameter.js.map +1 -1
  18. package/dist/lib-cjs/api/classes/parameterObservable.d.ts +36 -36
  19. package/dist/lib-cjs/api/classes/parameterObservable.js +101 -101
  20. package/dist/lib-cjs/api/classes/parameterizable.d.ts +15 -15
  21. package/dist/lib-cjs/api/classes/parameterizable.js +149 -149
  22. package/dist/lib-cjs/api/classes/placementAnimation.d.ts +43 -38
  23. package/dist/lib-cjs/api/classes/placementAnimation.js +160 -149
  24. package/dist/lib-cjs/api/classes/placementAnimation.js.map +1 -1
  25. package/dist/lib-cjs/api/classes/variant.d.ts +234 -234
  26. package/dist/lib-cjs/api/classes/variant.js +1147 -1147
  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 -92
  31. package/dist/lib-cjs/api/classes/variantParameterizable.js.map +1 -1
  32. package/dist/lib-cjs/api/classes/viewer.d.ts +131 -131
  33. package/dist/lib-cjs/api/classes/viewer.js +567 -567
  34. package/dist/lib-cjs/api/classes/viewer.js.map +1 -1
  35. package/dist/lib-cjs/api/classes/viewerLight.d.ts +66 -66
  36. package/dist/lib-cjs/api/classes/viewerLight.js +392 -389
  37. package/dist/lib-cjs/api/classes/viewerLight.js.map +1 -1
  38. package/dist/lib-cjs/api/internal/debugViewer.d.ts +13 -13
  39. package/dist/lib-cjs/api/internal/debugViewer.js +87 -87
  40. package/dist/lib-cjs/api/internal/lensRendering.d.ts +8 -8
  41. package/dist/lib-cjs/api/internal/lensRendering.js +11 -11
  42. package/dist/lib-cjs/api/internal/sceneSetup.d.ts +10 -10
  43. package/dist/lib-cjs/api/internal/sceneSetup.js +231 -231
  44. package/dist/lib-cjs/api/manager/animationManager.d.ts +29 -29
  45. package/dist/lib-cjs/api/manager/animationManager.js +121 -121
  46. package/dist/lib-cjs/api/manager/gltfExportManager.d.ts +35 -0
  47. package/dist/lib-cjs/api/manager/gltfExportManager.js +108 -0
  48. package/dist/lib-cjs/api/manager/gltfExportManager.js.map +1 -0
  49. package/dist/lib-cjs/api/manager/sceneManager.d.ts +32 -32
  50. package/dist/lib-cjs/api/manager/sceneManager.js +132 -132
  51. package/dist/lib-cjs/api/manager/variantInstanceManager.d.ts +90 -90
  52. package/dist/lib-cjs/api/manager/variantInstanceManager.js +321 -321
  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 +166 -175
  56. package/dist/lib-cjs/api/util/babylonHelper.js +500 -520
  57. package/dist/lib-cjs/api/util/babylonHelper.js.map +1 -1
  58. package/dist/lib-cjs/api/util/globalTypes.d.ts +338 -333
  59. package/dist/lib-cjs/api/util/globalTypes.js +1 -1
  60. package/dist/lib-cjs/api/util/resourceHelper.d.ts +53 -53
  61. package/dist/lib-cjs/api/util/resourceHelper.js +240 -240
  62. package/dist/lib-cjs/api/util/stringHelper.d.ts +9 -9
  63. package/dist/lib-cjs/api/util/stringHelper.js +25 -25
  64. package/dist/lib-cjs/buildinfo.json +3 -3
  65. package/dist/lib-cjs/index.d.ts +48 -48
  66. package/dist/lib-cjs/index.js +86 -86
  67. package/package.json +83 -83
  68. package/src/api/classes/animationInterface.ts +11 -11
  69. package/src/api/classes/dottedPath.ts +189 -189
  70. package/src/api/classes/element.ts +648 -644
  71. package/src/api/classes/event.ts +370 -370
  72. package/src/api/classes/eventBroadcaster.ts +54 -54
  73. package/src/api/classes/parameter.ts +408 -408
  74. package/src/api/classes/parameterObservable.ts +99 -99
  75. package/src/api/classes/parameterizable.ts +89 -89
  76. package/src/api/classes/placementAnimation.ts +157 -143
  77. package/src/api/classes/variant.ts +817 -817
  78. package/src/api/classes/variantInstance.ts +88 -88
  79. package/src/api/classes/variantParameterizable.ts +80 -73
  80. package/src/api/classes/viewer.ts +487 -487
  81. package/src/api/classes/viewerLight.ts +334 -330
  82. package/src/api/internal/debugViewer.ts +81 -81
  83. package/src/api/internal/lensRendering.ts +10 -10
  84. package/src/api/internal/sceneSetup.ts +193 -193
  85. package/src/api/manager/animationManager.ts +116 -116
  86. package/src/api/manager/sceneManager.ts +105 -105
  87. package/src/api/manager/variantInstanceManager.ts +236 -236
  88. package/src/api/store/specStorage.ts +53 -53
  89. package/src/api/util/babylonHelper.ts +534 -555
  90. package/src/api/util/globalTypes.ts +385 -379
  91. package/src/api/util/resourceHelper.ts +184 -184
  92. package/src/api/util/stringHelper.ts +25 -25
  93. package/src/buildinfo.json +2 -2
  94. package/src/commonjs.tsconfig.json +13 -13
  95. package/src/declaration.tsconfig.json +10 -10
  96. package/src/dev.ts +42 -42
  97. package/src/es6.tsconfig.json +13 -13
  98. package/src/index.ts +91 -91
  99. package/src/pagesconfig.json +65 -61
  100. package/src/tsconfig.json +43 -43
  101. package/src/tsconfig.types.json +9 -9
  102. package/src/types.d.ts +4 -4
  103. package/dist/webpack-stats.json +0 -0
@@ -1,82 +1,82 @@
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
-
11
- constructor( canvas: HTMLCanvasElement, data: string | StructureJson ) {
12
- super( canvas, data );
13
- }
14
-
15
- public async bootstrap(): Promise<Viewer> {
16
- for( const event of Event.all ) {
17
- this.eventEmitter.addListener( event, ( ...args ) => console.debug( `Emitting ${event}`, ...args ) );
18
- }
19
- for( const event of [
20
- Event.VARIANT_INSTANCE_DESTROYED,
21
- Event.VARIANT_INSTANCE_CREATED,
22
- Event.VARIANT_INSTANCE_CLONED,
23
- Event.VARIANT_PARAMETER_COMMITTED
24
- ] ) {
25
- this.eventEmitter.addListener( event, this.instanceDebugger.bind( this ) );
26
- }
27
- return super.bootstrap();
28
- }
29
-
30
- protected async initScene(): Promise<Scene> {
31
- const scene = await super.initScene();
32
-
33
- scene.getEngine().runRenderLoop( () => {
34
- this.fpsDebugger();
35
- } );
36
-
37
- return scene;
38
- }
39
-
40
- protected instanceDebugger( instance: VariantInstance ) {
41
- const instances: string[] = [];
42
- this.variantInstances.all.forEach( variantInstance => {
43
- instances.push( `${variantInstance.name}${variantInstance.variant.visible ? '' : ' [hidden]'}${variantInstance.variant.highlighted ? ' [highlighted]' : ''}` );
44
- } );
45
- let debugContainer = document.getElementById( 'cyledge-combeenation-3d-viewer-instance-debugger' );
46
- if( !debugContainer ) {
47
- debugContainer = document.createElement( 'pre' );
48
- debugContainer.setAttribute( 'id', 'cyledge-combeenation-3d-viewer-instance-debugger' );
49
- debugContainer.setAttribute( 'style', `
50
- background: #454545;
51
- color: #fff;
52
- position: absolute;
53
- bottom: 0;
54
- right: 0;
55
- padding: 10px;
56
- margin: 0;
57
- ` );
58
- document.body.appendChild( debugContainer );
59
- }
60
- debugContainer.innerHTML = JSON.stringify( instances, null, 2 );
61
- };
62
-
63
- protected fpsDebugger() {
64
- let debugContainer = document.getElementById( 'cyledge-combeenation-3d-viewer-fps-debugger' );
65
- if( !debugContainer ) {
66
- debugContainer = document.createElement( 'pre' );
67
- debugContainer.setAttribute( 'id', 'cyledge-combeenation-3d-viewer-fps-debugger' );
68
- debugContainer.setAttribute( 'style', `
69
- background: #454545;
70
- color: #fff;
71
- position: absolute;
72
- bottom: 0;
73
- left: 0;
74
- padding: 10px;
75
- margin: 0;
76
- ` );
77
- document.body.appendChild( debugContainer );
78
- }
79
- debugContainer.innerHTML = `${this.engine.getFps().toFixed( 2 )} fps`;
80
- }
81
-
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
+
11
+ constructor( canvas: HTMLCanvasElement, data: string | StructureJson ) {
12
+ super( canvas, data );
13
+ }
14
+
15
+ public async bootstrap(): Promise<Viewer> {
16
+ for( const event of Event.all ) {
17
+ this.eventEmitter.addListener( event, ( ...args ) => console.debug( `Emitting ${event}`, ...args ) );
18
+ }
19
+ for( const event of [
20
+ Event.VARIANT_INSTANCE_DESTROYED,
21
+ Event.VARIANT_INSTANCE_CREATED,
22
+ Event.VARIANT_INSTANCE_CLONED,
23
+ Event.VARIANT_PARAMETER_COMMITTED
24
+ ] ) {
25
+ this.eventEmitter.addListener( event, this.instanceDebugger.bind( this ) );
26
+ }
27
+ return super.bootstrap();
28
+ }
29
+
30
+ protected async initScene(): Promise<Scene> {
31
+ const scene = await super.initScene();
32
+
33
+ scene.getEngine().runRenderLoop( () => {
34
+ this.fpsDebugger();
35
+ } );
36
+
37
+ return scene;
38
+ }
39
+
40
+ protected instanceDebugger( instance: VariantInstance ) {
41
+ const instances: string[] = [];
42
+ this.variantInstances.all.forEach( variantInstance => {
43
+ instances.push( `${variantInstance.name}${variantInstance.variant.visible ? '' : ' [hidden]'}${variantInstance.variant.highlighted ? ' [highlighted]' : ''}` );
44
+ } );
45
+ let debugContainer = document.getElementById( 'cyledge-combeenation-3d-viewer-instance-debugger' );
46
+ if( !debugContainer ) {
47
+ debugContainer = document.createElement( 'pre' );
48
+ debugContainer.setAttribute( 'id', 'cyledge-combeenation-3d-viewer-instance-debugger' );
49
+ debugContainer.setAttribute( 'style', `
50
+ background: #454545;
51
+ color: #fff;
52
+ position: absolute;
53
+ bottom: 0;
54
+ right: 0;
55
+ padding: 10px;
56
+ margin: 0;
57
+ ` );
58
+ document.body.appendChild( debugContainer );
59
+ }
60
+ debugContainer.innerHTML = JSON.stringify( instances, null, 2 );
61
+ };
62
+
63
+ protected fpsDebugger() {
64
+ let debugContainer = document.getElementById( 'cyledge-combeenation-3d-viewer-fps-debugger' );
65
+ if( !debugContainer ) {
66
+ debugContainer = document.createElement( 'pre' );
67
+ debugContainer.setAttribute( 'id', 'cyledge-combeenation-3d-viewer-fps-debugger' );
68
+ debugContainer.setAttribute( 'style', `
69
+ background: #454545;
70
+ color: #fff;
71
+ position: absolute;
72
+ bottom: 0;
73
+ left: 0;
74
+ padding: 10px;
75
+ margin: 0;
76
+ ` );
77
+ document.body.appendChild( debugContainer );
78
+ }
79
+ debugContainer.innerHTML = `${this.engine.getFps().toFixed( 2 )} fps`;
80
+ }
81
+
82
82
  }
@@ -1,11 +1,11 @@
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
-
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
+
11
11
  export { LensRenderingPipeline };
@@ -1,194 +1,194 @@
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( scene: Scene, name: string, definition: GroundDefinition ): Promise<Mesh | GroundMesh> {
20
- return new Promise( resolve => {
21
- const _resolve = ( ground: Mesh ) => {
22
- if( definition.receiveShadows !== undefined ) {
23
- ground.receiveShadows = definition.receiveShadows;
24
- }
25
- resolve( ground );
26
- };
27
- switch( definition.type ) {
28
- case 'baked':
29
- if( !definition.meshId ) {
30
- throw new Error( `A baked ground must define a "meshId".` );
31
- }
32
- _resolve( scene.getMeshByID( definition.meshId ) as Mesh );
33
- break;
34
- case 'ground':
35
- _resolve( MeshBuilder.CreateGround(
36
- name,
37
- definition,
38
- scene
39
- ) );
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(
49
- name,
50
- definition.url,
51
- definition,
52
- scene,
53
- );
54
- break;
55
- default:
56
- throw new Error( `Ground of type "${definition.type}" not implemented (yet).` );
57
- }
58
- } );
59
- };
60
-
61
- /**
62
- * @param scene
63
- */
64
- const defaultCamera = async function( scene: Scene ): Promise<Camera> {
65
- return await processCamera( scene, 'default_camera', {
66
- type: 'arc',
67
- active: true,
68
- } );
69
- };
70
-
71
- /**
72
- * @param scene
73
- * @param name
74
- * @param cameraSetup
75
- */
76
- const processCamera = async function( scene: Scene, name: string, cameraSetup: CameraDefinition ): Promise<Camera> {
77
- let camera: Camera;
78
- let target = Vector3.Zero();
79
- if( cameraSetup.target ) {
80
- target = Parameter.parseVector( cameraSetup.target );
81
- }
82
- switch( cameraSetup.type ) {
83
- case 'arc':
84
- // @ts-ignore
85
- const arcCameraModule = await import(/* webpackChunkName: "arc-rotate-camera" */ '@babylonjs/core/Cameras/arcRotateCamera');
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 = new Color4(0, 0, 0, 0);
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( sceneJson.scene.globals['camera-settings']!.sharpen && sceneJson.scene.globals['camera-settings']!.sharpen.enabled ) {
144
- defaultPipeline.sharpenEnabled = true; //implicitly does SharpenPostProcess()
145
- //defaultPipeline.sharpen.colorAmount = 1;
146
- //defaultPipeline.sharpen.edgeAmount = 0;
147
- }
148
- if( sceneJson.scene.globals['camera-settings']!.bloom && sceneJson.scene.globals['camera-settings']!.bloom.enabled ) {
149
- defaultPipeline.bloomEnabled = true;
150
- if( sceneJson.scene.globals['camera-settings']!.bloom.size ) {
151
- defaultPipeline.bloomScale = sceneJson.scene.globals['camera-settings']!.bloom.size;
152
- }
153
- if( sceneJson.scene.globals['camera-settings']!.bloom.threshold ) {
154
- defaultPipeline.bloomThreshold = sceneJson.scene.globals['camera-settings']!.bloom.threshold;
155
- }
156
- }
157
- if( sceneJson.scene.globals['camera-settings']!.contrast ) {
158
- scene.imageProcessingConfiguration.contrast = sceneJson.scene.globals['camera-settings']!.contrast;
159
- }
160
- if( sceneJson.scene.globals['camera-settings']!.exposure ) {
161
- scene.imageProcessingConfiguration.exposure = sceneJson.scene.globals['camera-settings']!.exposure;
162
- }
163
- if( sceneJson.scene.globals['camera-settings']!.dof && sceneJson.scene.globals['camera-settings']!.dof.enabled ) {
164
- //@ts-ignore
165
- const module = await import(/* webpackChunkName: "lens-rendering" */ './lensRendering');
166
- new module.LensRenderingPipeline( 'lens-rendering', sceneJson.scene.globals['camera-settings']!.dof.settings, scene, 1.0, cameras );
167
- }
168
- }
169
- // TODO: make this dynamic
170
- /*
171
- const texture = new HDRCubeTexture("/assets/small_cave_1k.hdr", scene, 256);
172
- texture.gammaSpace = false;
173
- scene.environmentTexture = texture;
174
- // scene.environmentTexture.
175
-
176
- const skyboxMaterial = new StandardMaterial("skyBox", scene);
177
- skyboxMaterial.backFaceCulling = false;
178
- skyboxMaterial.reflectionTexture = texture;
179
- skyboxMaterial.reflectionTexture.coordinatesMode = Texture.SKYBOX_MODE;
180
- skyboxMaterial.disableLighting = false;
181
- // TODO: replace with BoxBuilder
182
- const skybox = MeshBuilder.CreateBox("skyBox", {size: 1000.0}, scene);
183
- skybox.isPickable = false; //never pick a skybox
184
- skybox.infiniteDistance = true;
185
- skybox.material = skyboxMaterial;
186
- */
187
-
188
- // TODO: shadows don't work with HemishpericLight
189
- return scene;
190
- };
191
-
192
- export {
193
- 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
+ /**
15
+ * @param scene
16
+ * @param name
17
+ * @param definition
18
+ */
19
+ const processGround = async function( scene: Scene, name: string, definition: GroundDefinition ): Promise<Mesh | GroundMesh> {
20
+ return new Promise( resolve => {
21
+ const _resolve = ( ground: Mesh ) => {
22
+ if( definition.receiveShadows !== undefined ) {
23
+ ground.receiveShadows = definition.receiveShadows;
24
+ }
25
+ resolve( ground );
26
+ };
27
+ switch( definition.type ) {
28
+ case 'baked':
29
+ if( !definition.meshId ) {
30
+ throw new Error( `A baked ground must define a "meshId".` );
31
+ }
32
+ _resolve( scene.getMeshByID( definition.meshId ) as Mesh );
33
+ break;
34
+ case 'ground':
35
+ _resolve( MeshBuilder.CreateGround(
36
+ name,
37
+ definition,
38
+ scene
39
+ ) );
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(
49
+ name,
50
+ definition.url,
51
+ definition,
52
+ scene,
53
+ );
54
+ break;
55
+ default:
56
+ throw new Error( `Ground of type "${definition.type}" not implemented (yet).` );
57
+ }
58
+ } );
59
+ };
60
+
61
+ /**
62
+ * @param scene
63
+ */
64
+ const defaultCamera = async function( scene: Scene ): Promise<Camera> {
65
+ return await processCamera( scene, 'default_camera', {
66
+ type: 'arc',
67
+ active: true,
68
+ } );
69
+ };
70
+
71
+ /**
72
+ * @param scene
73
+ * @param name
74
+ * @param cameraSetup
75
+ */
76
+ const processCamera = async function( scene: Scene, name: string, cameraSetup: CameraDefinition ): Promise<Camera> {
77
+ let camera: Camera;
78
+ let target = Vector3.Zero();
79
+ if( cameraSetup.target ) {
80
+ target = Parameter.parseVector( cameraSetup.target );
81
+ }
82
+ switch( cameraSetup.type ) {
83
+ case 'arc':
84
+ // @ts-ignore
85
+ const arcCameraModule = await import(/* webpackChunkName: "arc-rotate-camera" */ '@babylonjs/core/Cameras/arcRotateCamera');
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 = new Color4(0, 0, 0, 0);
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( sceneJson.scene.globals['camera-settings']!.sharpen && sceneJson.scene.globals['camera-settings']!.sharpen.enabled ) {
144
+ defaultPipeline.sharpenEnabled = true; //implicitly does SharpenPostProcess()
145
+ //defaultPipeline.sharpen.colorAmount = 1;
146
+ //defaultPipeline.sharpen.edgeAmount = 0;
147
+ }
148
+ if( sceneJson.scene.globals['camera-settings']!.bloom && sceneJson.scene.globals['camera-settings']!.bloom.enabled ) {
149
+ defaultPipeline.bloomEnabled = true;
150
+ if( sceneJson.scene.globals['camera-settings']!.bloom.size ) {
151
+ defaultPipeline.bloomScale = sceneJson.scene.globals['camera-settings']!.bloom.size;
152
+ }
153
+ if( sceneJson.scene.globals['camera-settings']!.bloom.threshold ) {
154
+ defaultPipeline.bloomThreshold = sceneJson.scene.globals['camera-settings']!.bloom.threshold;
155
+ }
156
+ }
157
+ if( sceneJson.scene.globals['camera-settings']!.contrast ) {
158
+ scene.imageProcessingConfiguration.contrast = sceneJson.scene.globals['camera-settings']!.contrast;
159
+ }
160
+ if( sceneJson.scene.globals['camera-settings']!.exposure ) {
161
+ scene.imageProcessingConfiguration.exposure = sceneJson.scene.globals['camera-settings']!.exposure;
162
+ }
163
+ if( sceneJson.scene.globals['camera-settings']!.dof && sceneJson.scene.globals['camera-settings']!.dof.enabled ) {
164
+ //@ts-ignore
165
+ const module = await import(/* webpackChunkName: "lens-rendering" */ './lensRendering');
166
+ new module.LensRenderingPipeline( 'lens-rendering', sceneJson.scene.globals['camera-settings']!.dof.settings, scene, 1.0, cameras );
167
+ }
168
+ }
169
+ // TODO: make this dynamic
170
+ /*
171
+ const texture = new HDRCubeTexture("/assets/small_cave_1k.hdr", scene, 256);
172
+ texture.gammaSpace = false;
173
+ scene.environmentTexture = texture;
174
+ // scene.environmentTexture.
175
+
176
+ const skyboxMaterial = new StandardMaterial("skyBox", scene);
177
+ skyboxMaterial.backFaceCulling = false;
178
+ skyboxMaterial.reflectionTexture = texture;
179
+ skyboxMaterial.reflectionTexture.coordinatesMode = Texture.SKYBOX_MODE;
180
+ skyboxMaterial.disableLighting = false;
181
+ // TODO: replace with BoxBuilder
182
+ const skybox = MeshBuilder.CreateBox("skyBox", {size: 1000.0}, scene);
183
+ skybox.isPickable = false; //never pick a skybox
184
+ skybox.infiniteDistance = true;
185
+ skybox.material = skyboxMaterial;
186
+ */
187
+
188
+ // TODO: shadows don't work with HemishpericLight
189
+ return scene;
190
+ };
191
+
192
+ export {
193
+ sceneSetup
194
194
  };