@combeenation/3d-viewer 3.1.1-alpha7 → 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +111 -111
- package/dist/lib-cjs/api/classes/animationInterface.d.ts +8 -8
- package/dist/lib-cjs/api/classes/animationInterface.js +1 -1
- package/dist/lib-cjs/api/classes/dottedPath.d.ts +79 -79
- package/dist/lib-cjs/api/classes/dottedPath.js +190 -190
- package/dist/lib-cjs/api/classes/element.d.ts +125 -126
- package/dist/lib-cjs/api/classes/element.js +678 -674
- package/dist/lib-cjs/api/classes/element.js.map +1 -1
- package/dist/lib-cjs/api/classes/elementParameterizable.d.ts +14 -14
- package/dist/lib-cjs/api/classes/elementParameterizable.js +134 -134
- package/dist/lib-cjs/api/classes/event.d.ts +312 -312
- package/dist/lib-cjs/api/classes/event.js +357 -357
- package/dist/lib-cjs/api/classes/eventBroadcaster.d.ts +26 -26
- package/dist/lib-cjs/api/classes/eventBroadcaster.js +53 -53
- package/dist/lib-cjs/api/classes/parameter.d.ts +165 -165
- package/dist/lib-cjs/api/classes/parameter.js +267 -267
- package/dist/lib-cjs/api/classes/parameterObservable.d.ts +36 -36
- package/dist/lib-cjs/api/classes/parameterObservable.js +126 -126
- package/dist/lib-cjs/api/classes/parameterizable.d.ts +15 -15
- package/dist/lib-cjs/api/classes/parameterizable.js +149 -149
- package/dist/lib-cjs/api/classes/placementAnimation.d.ts +38 -38
- package/dist/lib-cjs/api/classes/placementAnimation.js +138 -138
- package/dist/lib-cjs/api/classes/variant.d.ts +180 -190
- package/dist/lib-cjs/api/classes/variant.js +863 -873
- package/dist/lib-cjs/api/classes/variant.js.map +1 -1
- package/dist/lib-cjs/api/classes/variantInstance.d.ts +41 -41
- package/dist/lib-cjs/api/classes/variantInstance.js +98 -98
- package/dist/lib-cjs/api/classes/variantParameterizable.d.ts +17 -17
- package/dist/lib-cjs/api/classes/variantParameterizable.js +92 -92
- package/dist/lib-cjs/api/classes/viewer.d.ts +128 -128
- package/dist/lib-cjs/api/classes/viewer.js +486 -486
- package/dist/lib-cjs/api/classes/viewerLight.d.ts +65 -66
- package/dist/lib-cjs/api/classes/viewerLight.js +322 -389
- package/dist/lib-cjs/api/classes/viewerLight.js.map +1 -1
- package/dist/lib-cjs/api/internal/debugViewer.d.ts +13 -13
- package/dist/lib-cjs/api/internal/debugViewer.js +87 -87
- package/dist/lib-cjs/api/internal/lensRendering.d.ts +8 -8
- package/dist/lib-cjs/api/internal/lensRendering.js +11 -11
- package/dist/lib-cjs/api/internal/sceneSetup.d.ts +6 -6
- package/dist/lib-cjs/api/internal/sceneSetup.js +227 -227
- package/dist/lib-cjs/api/manager/animationManager.d.ts +29 -29
- package/dist/lib-cjs/api/manager/animationManager.js +121 -121
- package/dist/lib-cjs/api/manager/sceneManager.d.ts +32 -32
- package/dist/lib-cjs/api/manager/sceneManager.js +132 -132
- package/dist/lib-cjs/api/manager/variantInstanceManager.d.ts +90 -90
- package/dist/lib-cjs/api/manager/variantInstanceManager.js +321 -321
- package/dist/lib-cjs/api/store/specStorage.d.ts +24 -24
- package/dist/lib-cjs/api/store/specStorage.js +51 -51
- package/dist/lib-cjs/api/util/babylonHelper.d.ts +125 -125
- package/dist/lib-cjs/api/util/babylonHelper.js +368 -368
- package/dist/lib-cjs/api/util/globalTypes.d.ts +275 -275
- package/dist/lib-cjs/api/util/globalTypes.js +1 -1
- package/dist/lib-cjs/api/util/resourceHelper.d.ts +30 -30
- package/dist/lib-cjs/api/util/resourceHelper.js +247 -203
- package/dist/lib-cjs/api/util/resourceHelper.js.map +1 -1
- package/dist/lib-cjs/api/util/stringHelper.d.ts +9 -9
- package/dist/lib-cjs/api/util/stringHelper.js +25 -25
- package/dist/lib-cjs/buildinfo.json +3 -3
- package/dist/lib-cjs/index.d.ts +46 -46
- package/dist/lib-cjs/index.js +82 -82
- package/dist/webpack-stats.json +0 -0
- package/package.json +83 -83
- package/src/api/classes/animationInterface.ts +11 -11
- package/src/api/classes/dottedPath.ts +189 -189
- package/src/api/classes/element.ts +608 -606
- package/src/api/classes/elementParameterizable.ts +78 -78
- package/src/api/classes/event.ts +355 -355
- package/src/api/classes/eventBroadcaster.ts +54 -54
- package/src/api/classes/parameter.ts +277 -277
- package/src/api/classes/parameterObservable.ts +121 -121
- package/src/api/classes/placementAnimation.ts +133 -133
- package/src/api/classes/variant.ts +659 -670
- package/src/api/classes/variantInstance.ts +81 -81
- package/src/api/classes/viewer.ts +421 -421
- package/src/api/internal/debugViewer.ts +81 -81
- package/src/api/internal/lensRendering.ts +10 -10
- package/src/api/internal/sceneSetup.ts +203 -203
- package/src/api/manager/animationManager.ts +116 -116
- package/src/api/manager/sceneManager.ts +105 -105
- package/src/api/manager/variantInstanceManager.ts +236 -236
- package/src/api/store/specStorage.ts +53 -53
- package/src/api/util/babylonHelper.ts +392 -392
- package/src/api/util/globalTypes.ts +314 -314
- package/src/api/util/resourceHelper.ts +168 -155
- package/src/buildinfo.json +2 -2
- package/src/commonjs.tsconfig.json +13 -13
- package/src/declaration.tsconfig.json +10 -10
- package/src/dev.ts +44 -46
- package/src/es6.tsconfig.json +13 -13
- package/src/index.ts +87 -87
- package/src/pagesconfig.json +47 -47
- package/src/tsconfig.json +43 -43
- package/src/tsconfig.types.json +9 -9
- package/src/types.d.ts +4 -4
|
@@ -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,204 +1,204 @@
|
|
|
1
|
-
|
|
2
|
-
import { Engine } from '@babylonjs/core/Engines/engine';
|
|
3
|
-
import '@babylonjs/core/Materials/Textures/Loaders/ddsTextureLoader';
|
|
4
|
-
import '@babylonjs/core/Helpers/sceneHelpers';
|
|
5
|
-
import { StandardMaterial } from '@babylonjs/core/Materials/standardMaterial';
|
|
6
|
-
import { HDRCubeTexture } from '@babylonjs/core/Materials/Textures/hdrCubeTexture';
|
|
7
|
-
import { Texture } from '@babylonjs/core/Materials/Textures/texture';
|
|
8
|
-
import { Color3, Color4 } from '@babylonjs/core/Maths/math.color';
|
|
9
|
-
import { Vector3 } from '@babylonjs/core/Maths/math.vector';
|
|
10
|
-
import { MeshBuilder } from '@babylonjs/core/Meshes/meshBuilder';
|
|
11
|
-
import { DefaultRenderingPipeline } from '@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline';
|
|
12
|
-
import { Scene } from '@babylonjs/core/scene';
|
|
13
|
-
import type { HemisphericLight } from '@babylonjs/core/Lights/hemisphericLight';
|
|
14
|
-
import { Camera } from '@babylonjs/core/Cameras/camera';
|
|
15
|
-
import { Light } from '@babylonjs/core/Lights/light';
|
|
16
|
-
import { Parameter } from '../classes/parameter';
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const defaultLightning = async function(scene: Scene) {
|
|
20
|
-
const defaultSetup: LightDefinition = {
|
|
21
|
-
type: 'hemispheric',
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
const defaultLight = await processLight(scene, 'default_light', defaultSetup) as HemisphericLight;
|
|
25
|
-
defaultLight.groundColor = Color3.Black();
|
|
26
|
-
defaultLight.diffuse = Color3.White();
|
|
27
|
-
|
|
28
|
-
return defaultLight;
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const processLight = async function(scene: Scene, name: string, lightSetup: LightDefinition) {
|
|
33
|
-
|
|
34
|
-
let light: Light;
|
|
35
|
-
|
|
36
|
-
switch(lightSetup.type ) {
|
|
37
|
-
case 'hemispheric':
|
|
38
|
-
// @ts-ignore
|
|
39
|
-
const hemisphericLightModule = await import(/* webpackChunkName: "hemispheric-light" */ '@babylonjs/core/Lights/hemisphericLight');
|
|
40
|
-
light = new hemisphericLightModule.HemisphericLight( name, Vector3.Up(), scene);
|
|
41
|
-
break;
|
|
42
|
-
case 'point':
|
|
43
|
-
// @ts-ignore
|
|
44
|
-
const pointLightModule = await import(/* webpackChunkName: "point-light" */ '@babylonjs/core/Lights/pointLight');
|
|
45
|
-
light = new pointLightModule.PointLight( name, Vector3.Up(), scene);
|
|
46
|
-
break;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return light;
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const defaultCamera = async function(scene: Scene) {
|
|
54
|
-
|
|
55
|
-
const cameraSetup: CameraDefinition = {
|
|
56
|
-
type: 'arc',
|
|
57
|
-
active: true,
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
const defaultCamera = await processCamera(scene, 'default_camera', cameraSetup);
|
|
61
|
-
|
|
62
|
-
return defaultCamera;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
const processCamera = async function(scene: Scene, name: string, cameraSetup: CameraDefinition) {
|
|
66
|
-
|
|
67
|
-
let camera: Camera;
|
|
68
|
-
|
|
69
|
-
let target = Vector3.Zero();
|
|
70
|
-
if(cameraSetup.target) {
|
|
71
|
-
target = Parameter.parseVector(cameraSetup.target);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
switch(cameraSetup.type ) {
|
|
75
|
-
case 'arc':
|
|
76
|
-
// @ts-ignore
|
|
77
|
-
const arcCameraModule = await import(/* webpackChunkName: "arc-rotate-camera" */ '@babylonjs/core/Cameras/arcRotateCamera');
|
|
78
|
-
camera = new arcCameraModule.ArcRotateCamera(name, Math.PI / 4, Math.PI / 4, 2, target, scene );
|
|
79
|
-
camera.metadata = {
|
|
80
|
-
alpha: Math.PI / 4,
|
|
81
|
-
beta: Math.PI / 4,
|
|
82
|
-
radius: 2
|
|
83
|
-
};
|
|
84
|
-
break;
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
if(cameraSetup.active) {
|
|
89
|
-
camera.attachControl( scene.getEngine().getRenderingCanvas()!, true );
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
if( cameraSetup.fov ) {
|
|
93
|
-
camera.fov = cameraSetup.fov;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
camera.storeState();
|
|
97
|
-
return camera;
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
const sceneSetup = async function(engine: Engine, sceneJson: SceneJson) {
|
|
101
|
-
const scene = new Scene( engine );
|
|
102
|
-
scene.clearColor = new Color4(0, 0, 0, 0);
|
|
103
|
-
|
|
104
|
-
let cameras: Camera[] = [];
|
|
105
|
-
//there is either no "cameras" or "cameras" is empty
|
|
106
|
-
if( ! sceneJson.scene.hasOwnProperty('cameras') || (sceneJson.scene.cameras && ! Object.keys(sceneJson.scene.cameras).length ) ) {
|
|
107
|
-
const camera = await defaultCamera(scene);
|
|
108
|
-
|
|
109
|
-
cameras.push(camera);
|
|
110
|
-
} else {
|
|
111
|
-
for(let camera in sceneJson.scene.cameras) {
|
|
112
|
-
cameras.push(await processCamera(scene, camera, sceneJson.scene.cameras[camera]));
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
//there is either no "lights" or "lights" is empty
|
|
118
|
-
if( ! sceneJson.scene.hasOwnProperty('lights') || (sceneJson.scene.lights && ! Object.keys(sceneJson.scene.lights).length ) ) {
|
|
119
|
-
// await defaultLightning(scene);
|
|
120
|
-
} else {
|
|
121
|
-
for(let light in sceneJson.scene.lights) {
|
|
122
|
-
await processLight(scene, light, sceneJson.scene.lights[light]);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
// TODO: try to split this away from the default rendering pipeline to save module imports
|
|
128
|
-
// The "hdr" setting had negative effect on rendering in Safari. Everything looked a little "edgy". I'm not completely
|
|
129
|
-
// sure if disabling it comes with other negative side effects I don't see right now, so we should probably
|
|
130
|
-
// investigate this a little more in detail at some point.
|
|
131
|
-
const defaultPipeline = new DefaultRenderingPipeline( 'default-rendering-pipeline', false, scene );
|
|
132
|
-
|
|
133
|
-
/* DISABLED: causes problems with Internet Explorer
|
|
134
|
-
defaultPipeline.imageProcessingEnabled = true;
|
|
135
|
-
*/
|
|
136
|
-
|
|
137
|
-
if( sceneJson.scene.globals.aa ) {
|
|
138
|
-
defaultPipeline.fxaaEnabled = true; //implicitly does FxaaPostProcess()
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// Set samples regardless of fxaa setting since we don't want to use fxaa but still increase the sample count
|
|
142
|
-
defaultPipeline.samples = 8;
|
|
143
|
-
|
|
144
|
-
if( sceneJson.scene.globals['camera-settings'] ) {
|
|
145
|
-
if( sceneJson.scene.globals['camera-settings'].sharpen && sceneJson.scene.globals['camera-settings'].sharpen.enabled ) {
|
|
146
|
-
defaultPipeline.sharpenEnabled = true; //implicitly does SharpenPostProcess()
|
|
147
|
-
//defaultPipeline.sharpen.colorAmount = 1;
|
|
148
|
-
//defaultPipeline.sharpen.edgeAmount = 0;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
if( sceneJson.scene.globals['camera-settings'].bloom && sceneJson.scene.globals['camera-settings'].bloom.enabled ) {
|
|
152
|
-
defaultPipeline.bloomEnabled = true;
|
|
153
|
-
|
|
154
|
-
if( sceneJson.scene.globals['camera-settings'].bloom.size ) {
|
|
155
|
-
defaultPipeline.bloomScale = sceneJson.scene.globals['camera-settings'].bloom.size;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
if( sceneJson.scene.globals['camera-settings'].bloom.threshold ) {
|
|
159
|
-
defaultPipeline.bloomThreshold = sceneJson.scene.globals['camera-settings'].bloom.threshold;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
if( sceneJson.scene.globals['camera-settings'].contrast ) {
|
|
164
|
-
scene.imageProcessingConfiguration.contrast = sceneJson.scene.globals['camera-settings'].contrast;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
if( sceneJson.scene.globals['camera-settings'].exposure ) {
|
|
168
|
-
scene.imageProcessingConfiguration.exposure = sceneJson.scene.globals['camera-settings'].exposure;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
if( sceneJson.scene.globals['camera-settings'].dof && sceneJson.scene.globals['camera-settings'].dof.enabled ) {
|
|
172
|
-
//@ts-ignore
|
|
173
|
-
const module = await import(/* webpackChunkName: "lens-rendering" */ './lensRendering');
|
|
174
|
-
new module.LensRenderingPipeline( 'lens-rendering', sceneJson.scene.globals['camera-settings'].dof!.settings, scene, 1.0, 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
|
-
|
|
199
|
-
return scene;
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
export {
|
|
203
|
-
sceneSetup
|
|
1
|
+
|
|
2
|
+
import { Engine } from '@babylonjs/core/Engines/engine';
|
|
3
|
+
import '@babylonjs/core/Materials/Textures/Loaders/ddsTextureLoader';
|
|
4
|
+
import '@babylonjs/core/Helpers/sceneHelpers';
|
|
5
|
+
import { StandardMaterial } from '@babylonjs/core/Materials/standardMaterial';
|
|
6
|
+
import { HDRCubeTexture } from '@babylonjs/core/Materials/Textures/hdrCubeTexture';
|
|
7
|
+
import { Texture } from '@babylonjs/core/Materials/Textures/texture';
|
|
8
|
+
import { Color3, Color4 } from '@babylonjs/core/Maths/math.color';
|
|
9
|
+
import { Vector3 } from '@babylonjs/core/Maths/math.vector';
|
|
10
|
+
import { MeshBuilder } from '@babylonjs/core/Meshes/meshBuilder';
|
|
11
|
+
import { DefaultRenderingPipeline } from '@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline';
|
|
12
|
+
import { Scene } from '@babylonjs/core/scene';
|
|
13
|
+
import type { HemisphericLight } from '@babylonjs/core/Lights/hemisphericLight';
|
|
14
|
+
import { Camera } from '@babylonjs/core/Cameras/camera';
|
|
15
|
+
import { Light } from '@babylonjs/core/Lights/light';
|
|
16
|
+
import { Parameter } from '../classes/parameter';
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
const defaultLightning = async function(scene: Scene) {
|
|
20
|
+
const defaultSetup: LightDefinition = {
|
|
21
|
+
type: 'hemispheric',
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const defaultLight = await processLight(scene, 'default_light', defaultSetup) as HemisphericLight;
|
|
25
|
+
defaultLight.groundColor = Color3.Black();
|
|
26
|
+
defaultLight.diffuse = Color3.White();
|
|
27
|
+
|
|
28
|
+
return defaultLight;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
const processLight = async function(scene: Scene, name: string, lightSetup: LightDefinition) {
|
|
33
|
+
|
|
34
|
+
let light: Light;
|
|
35
|
+
|
|
36
|
+
switch(lightSetup.type ) {
|
|
37
|
+
case 'hemispheric':
|
|
38
|
+
// @ts-ignore
|
|
39
|
+
const hemisphericLightModule = await import(/* webpackChunkName: "hemispheric-light" */ '@babylonjs/core/Lights/hemisphericLight');
|
|
40
|
+
light = new hemisphericLightModule.HemisphericLight( name, Vector3.Up(), scene);
|
|
41
|
+
break;
|
|
42
|
+
case 'point':
|
|
43
|
+
// @ts-ignore
|
|
44
|
+
const pointLightModule = await import(/* webpackChunkName: "point-light" */ '@babylonjs/core/Lights/pointLight');
|
|
45
|
+
light = new pointLightModule.PointLight( name, Vector3.Up(), scene);
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return light;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
const defaultCamera = async function(scene: Scene) {
|
|
54
|
+
|
|
55
|
+
const cameraSetup: CameraDefinition = {
|
|
56
|
+
type: 'arc',
|
|
57
|
+
active: true,
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const defaultCamera = await processCamera(scene, 'default_camera', cameraSetup);
|
|
61
|
+
|
|
62
|
+
return defaultCamera;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const processCamera = async function(scene: Scene, name: string, cameraSetup: CameraDefinition) {
|
|
66
|
+
|
|
67
|
+
let camera: Camera;
|
|
68
|
+
|
|
69
|
+
let target = Vector3.Zero();
|
|
70
|
+
if(cameraSetup.target) {
|
|
71
|
+
target = Parameter.parseVector(cameraSetup.target);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
switch(cameraSetup.type ) {
|
|
75
|
+
case 'arc':
|
|
76
|
+
// @ts-ignore
|
|
77
|
+
const arcCameraModule = await import(/* webpackChunkName: "arc-rotate-camera" */ '@babylonjs/core/Cameras/arcRotateCamera');
|
|
78
|
+
camera = new arcCameraModule.ArcRotateCamera(name, Math.PI / 4, Math.PI / 4, 2, target, scene );
|
|
79
|
+
camera.metadata = {
|
|
80
|
+
alpha: Math.PI / 4,
|
|
81
|
+
beta: Math.PI / 4,
|
|
82
|
+
radius: 2
|
|
83
|
+
};
|
|
84
|
+
break;
|
|
85
|
+
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if(cameraSetup.active) {
|
|
89
|
+
camera.attachControl( scene.getEngine().getRenderingCanvas()!, true );
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if( cameraSetup.fov ) {
|
|
93
|
+
camera.fov = cameraSetup.fov;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
camera.storeState();
|
|
97
|
+
return camera;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const sceneSetup = async function(engine: Engine, sceneJson: SceneJson) {
|
|
101
|
+
const scene = new Scene( engine );
|
|
102
|
+
scene.clearColor = new Color4(0, 0, 0, 0);
|
|
103
|
+
|
|
104
|
+
let cameras: Camera[] = [];
|
|
105
|
+
//there is either no "cameras" or "cameras" is empty
|
|
106
|
+
if( ! sceneJson.scene.hasOwnProperty('cameras') || (sceneJson.scene.cameras && ! Object.keys(sceneJson.scene.cameras).length ) ) {
|
|
107
|
+
const camera = await defaultCamera(scene);
|
|
108
|
+
|
|
109
|
+
cameras.push(camera);
|
|
110
|
+
} else {
|
|
111
|
+
for(let camera in sceneJson.scene.cameras) {
|
|
112
|
+
cameras.push(await processCamera(scene, camera, sceneJson.scene.cameras[camera]));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
//there is either no "lights" or "lights" is empty
|
|
118
|
+
if( ! sceneJson.scene.hasOwnProperty('lights') || (sceneJson.scene.lights && ! Object.keys(sceneJson.scene.lights).length ) ) {
|
|
119
|
+
// await defaultLightning(scene);
|
|
120
|
+
} else {
|
|
121
|
+
for(let light in sceneJson.scene.lights) {
|
|
122
|
+
await processLight(scene, light, sceneJson.scene.lights[light]);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
// TODO: try to split this away from the default rendering pipeline to save module imports
|
|
128
|
+
// The "hdr" setting had negative effect on rendering in Safari. Everything looked a little "edgy". I'm not completely
|
|
129
|
+
// sure if disabling it comes with other negative side effects I don't see right now, so we should probably
|
|
130
|
+
// investigate this a little more in detail at some point.
|
|
131
|
+
const defaultPipeline = new DefaultRenderingPipeline( 'default-rendering-pipeline', false, scene );
|
|
132
|
+
|
|
133
|
+
/* DISABLED: causes problems with Internet Explorer
|
|
134
|
+
defaultPipeline.imageProcessingEnabled = true;
|
|
135
|
+
*/
|
|
136
|
+
|
|
137
|
+
if( sceneJson.scene.globals.aa ) {
|
|
138
|
+
defaultPipeline.fxaaEnabled = true; //implicitly does FxaaPostProcess()
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Set samples regardless of fxaa setting since we don't want to use fxaa but still increase the sample count
|
|
142
|
+
defaultPipeline.samples = 8;
|
|
143
|
+
|
|
144
|
+
if( sceneJson.scene.globals['camera-settings'] ) {
|
|
145
|
+
if( sceneJson.scene.globals['camera-settings'].sharpen && sceneJson.scene.globals['camera-settings'].sharpen.enabled ) {
|
|
146
|
+
defaultPipeline.sharpenEnabled = true; //implicitly does SharpenPostProcess()
|
|
147
|
+
//defaultPipeline.sharpen.colorAmount = 1;
|
|
148
|
+
//defaultPipeline.sharpen.edgeAmount = 0;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if( sceneJson.scene.globals['camera-settings'].bloom && sceneJson.scene.globals['camera-settings'].bloom.enabled ) {
|
|
152
|
+
defaultPipeline.bloomEnabled = true;
|
|
153
|
+
|
|
154
|
+
if( sceneJson.scene.globals['camera-settings'].bloom.size ) {
|
|
155
|
+
defaultPipeline.bloomScale = sceneJson.scene.globals['camera-settings'].bloom.size;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if( sceneJson.scene.globals['camera-settings'].bloom.threshold ) {
|
|
159
|
+
defaultPipeline.bloomThreshold = sceneJson.scene.globals['camera-settings'].bloom.threshold;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if( sceneJson.scene.globals['camera-settings'].contrast ) {
|
|
164
|
+
scene.imageProcessingConfiguration.contrast = sceneJson.scene.globals['camera-settings'].contrast;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if( sceneJson.scene.globals['camera-settings'].exposure ) {
|
|
168
|
+
scene.imageProcessingConfiguration.exposure = sceneJson.scene.globals['camera-settings'].exposure;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if( sceneJson.scene.globals['camera-settings'].dof && sceneJson.scene.globals['camera-settings'].dof.enabled ) {
|
|
172
|
+
//@ts-ignore
|
|
173
|
+
const module = await import(/* webpackChunkName: "lens-rendering" */ './lensRendering');
|
|
174
|
+
new module.LensRenderingPipeline( 'lens-rendering', sceneJson.scene.globals['camera-settings'].dof!.settings, scene, 1.0, 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
|
+
|
|
199
|
+
return scene;
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
export {
|
|
203
|
+
sceneSetup
|
|
204
204
|
}
|