@babylonjs/inspector 8.32.1-preview → 8.32.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/package.json CHANGED
@@ -1,43 +1,59 @@
1
1
  {
2
2
  "name": "@babylonjs/inspector",
3
- "version": "8.32.1-preview",
4
- "type": "module",
5
- "main": "lib/index.js",
6
- "module": "lib/index.js",
7
- "esnext": "lib/index.js",
8
- "types": "lib/index.d.ts",
3
+ "version": "8.32.2",
4
+ "module": "dist/babylon.inspector.bundle.js",
5
+ "main": "dist/babylon.inspector.bundle.js",
6
+ "esnext": "dist/babylon.inspector.bundle.js",
7
+ "typings": "dist/babylon.inspector.module.d.ts",
9
8
  "files": [
10
- "lib/**/*.js",
11
- "lib/**/*.d.ts",
12
- "lib/**/*.map",
9
+ "dist/**/*.*",
13
10
  "readme.md",
14
11
  "license.md"
15
12
  ],
13
+ "scripts": {
14
+ "build": "npm run clean && npm run build:prod && npm run build:declaration",
15
+ "build:dev": "webpack --env development",
16
+ "build:prod": "webpack --env production",
17
+ "build:declaration": "build-tools -c pud --config ./config.json",
18
+ "clean": "rimraf dist"
19
+ },
20
+ "dependencies": {
21
+ "@fortawesome/fontawesome-svg-core": "^6.1.0",
22
+ "@fortawesome/free-regular-svg-icons": "^6.0.0",
23
+ "@fortawesome/free-solid-svg-icons": "^6.0.0"
24
+ },
16
25
  "peerDependencies": {
17
26
  "@babylonjs/addons": "^8.0.0",
18
27
  "@babylonjs/core": "^8.0.0",
19
28
  "@babylonjs/gui": "^8.0.0",
29
+ "@babylonjs/gui-editor": "^8.0.0",
20
30
  "@babylonjs/loaders": "^8.0.0",
21
31
  "@babylonjs/materials": "^8.0.0",
22
32
  "@babylonjs/serializers": "^8.0.0",
23
- "@fluentui-contrib/react-virtualizer": "^0.3.0",
24
- "@fluentui/react-components": "^9.70.0",
25
- "@fluentui/react-icons": "^2.0.310",
26
- "react": ">=16.14.0 <20.0.0",
27
- "react-dom": ">=16.14.0 <20.0.0",
28
- "usehooks-ts": "^3.1.1"
33
+ "@types/react": ">=16.7.3",
34
+ "@types/react-dom": ">=16.0.9"
35
+ },
36
+ "devDependencies": {
37
+ "@babylonjs/addons": "^8.32.2",
38
+ "@babylonjs/core": "^8.32.2",
39
+ "@babylonjs/gui": "^8.32.2",
40
+ "@babylonjs/gui-editor": "^8.32.2",
41
+ "@babylonjs/loaders": "^8.32.2",
42
+ "@babylonjs/materials": "^8.32.2",
43
+ "@babylonjs/serializers": "^8.32.2",
44
+ "@lts/gui": "1.0.0",
45
+ "react": "^18.2.0",
46
+ "react-dom": "^18.2.0"
29
47
  },
30
48
  "keywords": [
31
49
  "3D",
32
50
  "javascript",
33
51
  "html5",
34
52
  "webgl",
35
- "babylon.js",
36
- "inspector",
37
- "diagnostic",
38
- "debug"
53
+ "babylon.js"
39
54
  ],
40
55
  "license": "Apache-2.0",
56
+ "sideEffects": true,
41
57
  "homepage": "https://www.babylonjs.com",
42
58
  "repository": {
43
59
  "type": "git",
@@ -46,4 +62,4 @@
46
62
  "bugs": {
47
63
  "url": "https://github.com/BabylonJS/Babylon.js/issues"
48
64
  }
49
- }
65
+ }
package/readme.md CHANGED
@@ -1,23 +1,26 @@
1
- # BabylonJS Inspector
1
+ # Babylon.js inspector module
2
2
 
3
- The Babylon Inspector is a diagnostic tool that makes it possible to view and edit the scene graph, properties of entities within the scene, and more.
3
+ For usage documentation please visit https://doc.babylonjs.com/how_to/debug_layer.
4
4
 
5
- Documentation and samples coming soon!
5
+ # Installation instructions
6
6
 
7
- ## Installation
7
+ To install using npm :
8
8
 
9
- Install the package using npm:
10
-
11
- ```bash
12
- npm install @babylonjs/inspector@preview
9
+ ```shell
10
+ npm install @babylonjs/core @babylonjs/inspector
13
11
  ```
14
12
 
15
- The simplest way to use the `Inspector` is to call the `ShowInspector` function, passing in your scene:
16
-
17
- ```ts
18
- import { ShowInspector } from "@babylonjs/inspector";
13
+ # How to use
19
14
 
20
- // Your code that sets up a Babylon.js scene
15
+ Afterwards it can be imported to your project using:
21
16
 
22
- ShowInspector(scene);
17
+ ```javascript
18
+ import "@babylonjs/core/Debug/debugLayer";
19
+ import "@babylonjs/inspector";
23
20
  ```
21
+
22
+ The first line will ensure you can access the property debugLayer of the scene while the second will ensure the inspector can be used within your scene.
23
+
24
+ This is a great example where code splitting or conditional loading could be used to ensure you are not delivering the inspector if not part of your final app.
25
+
26
+ For more information you can have a look at our [ES6 dedicated documentation](https://doc.babylonjs.com/features/es6_support).
@@ -1,190 +0,0 @@
1
- import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
- import { ButtonLine, SyncedSliderPropertyLine, SwitchPropertyLine, Collapse, ToolsServiceIdentity } from './index.js';
3
- import { useState, useRef, useCallback } from 'react';
4
- import { Tools } from '@babylonjs/core/Misc/tools.js';
5
- import { VideoRecorder } from '@babylonjs/core/Misc/videoRecorder.js';
6
- import { captureEquirectangularFromScene } from '@babylonjs/core/Misc/equirectangularCapture.js';
7
- import { CameraRegular, RecordStopRegular, RecordRegular } from '@fluentui/react-icons';
8
- import { FrameGraphUtils } from '@babylonjs/core/FrameGraph/frameGraphUtils.js';
9
- import '@babylonjs/core/Maths/math.color.js';
10
- import '@babylonjs/core/Maths/math.vector.js';
11
- import '@babylonjs/core/Misc/observable.js';
12
- import '@fluentui/react-components';
13
- import '@fluentui/react-motion-components-preview';
14
- import '@babylonjs/core/Misc/typeStore.js';
15
- import 'usehooks-ts';
16
- import '@babylonjs/core/Misc/asyncLock.js';
17
- import '@babylonjs/core/Misc/deferred.js';
18
- import '@babylonjs/core/Maths/math.scalar.functions.js';
19
- import '@fluentui-contrib/react-virtualizer';
20
- import '@babylonjs/addons/msdfText/fontAsset.js';
21
- import '@babylonjs/addons/msdfText/textRenderer.js';
22
- import '@babylonjs/core/Debug/physicsViewer.js';
23
- import '@babylonjs/core/Materials/Textures/texture.js';
24
- import '@babylonjs/core/Materials/materialFlags.js';
25
- import '@babylonjs/core/Materials/standardMaterial.js';
26
- import '@babylonjs/core/Meshes/Builders/groundBuilder.js';
27
- import '@babylonjs/core/Rendering/utilityLayerRenderer.js';
28
- import '@babylonjs/materials/grid/gridMaterial.js';
29
- import '@babylonjs/core/Misc/dataStorage.js';
30
- import '@babylonjs/core/Instrumentation/engineInstrumentation.js';
31
- import '@babylonjs/core/Instrumentation/sceneInstrumentation.js';
32
- import '@babylonjs/core/Engines/AbstractEngine/abstractEngine.timeQuery.js';
33
- import '@babylonjs/core/Engines/Extensions/engine.query.js';
34
- import '@babylonjs/core/Engines/WebGPU/Extensions/engine.query.js';
35
- import '@babylonjs/core/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js';
36
- import '@babylonjs/core/Misc/PerformanceViewer/performanceViewerSceneExtension.js';
37
- import '@babylonjs/core/Misc/pressureObserverWrapper.js';
38
- import '@babylonjs/core/Engines/abstractEngine.js';
39
- import '@babylonjs/core/Engines/engineStore.js';
40
- import 'react-dom/client';
41
- import '@babylonjs/core/Misc/logger.js';
42
- import '@babylonjs/core/Gizmos/cameraGizmo.js';
43
- import '@babylonjs/core/Gizmos/lightGizmo.js';
44
- import '@babylonjs/core/Bones/bone.js';
45
- import '@babylonjs/core/Cameras/camera.js';
46
- import '@babylonjs/core/Gizmos/gizmoManager.js';
47
- import '@babylonjs/core/Lights/light.js';
48
- import '@babylonjs/core/Meshes/abstractMesh.js';
49
- import '@babylonjs/core/node.js';
50
- import '@babylonjs/core/Animations/animationGroup.js';
51
- import '@babylonjs/core/Animations/animationPropertiesOverride.js';
52
- import '@babylonjs/addons/atmosphere/atmosphere.js';
53
- import '@babylonjs/core/Cameras/arcRotateCamera.js';
54
- import '@babylonjs/core/Cameras/followCamera.js';
55
- import '@babylonjs/core/Cameras/freeCamera.js';
56
- import '@babylonjs/core/Cameras/targetCamera.js';
57
- import '@babylonjs/core/scene.js';
58
- import '@babylonjs/core/FrameGraph/frameGraph.js';
59
- import '@babylonjs/core/Lights/directionalLight.js';
60
- import '@babylonjs/core/Lights/hemisphericLight.js';
61
- import '@babylonjs/core/Lights/pointLight.js';
62
- import '@babylonjs/core/Lights/rectAreaLight.js';
63
- import '@babylonjs/core/Lights/shadowLight.js';
64
- import '@babylonjs/core/Lights/spotLight.js';
65
- import '@babylonjs/core/Lights/Shadows/cascadedShadowGenerator.js';
66
- import '@babylonjs/core/Lights/Shadows/shadowGenerator.js';
67
- import '@babylonjs/core/Lights/Shadows/shadowGeneratorSceneComponent.js';
68
- import '@babylonjs/core/Materials/material.js';
69
- import '@babylonjs/core/Materials/multiMaterial.js';
70
- import '@babylonjs/core/Materials/PBR/pbrBaseMaterial.js';
71
- import '@babylonjs/core/Materials/PBR/pbrBaseSimpleMaterial.js';
72
- import '@babylonjs/core/Materials/PBR/pbrMaterial.js';
73
- import '@babylonjs/materials/sky/skyMaterial.js';
74
- import '@babylonjs/core/Engines/engine.js';
75
- import '@babylonjs/core/Engines/constants.js';
76
- import '@babylonjs/core/Particles/particleSystem.js';
77
- import '@babylonjs/core/Misc/fileTools.js';
78
- import '@babylonjs/core/Meshes/mesh.js';
79
- import '@babylonjs/core/Debug/skeletonViewer.js';
80
- import '@babylonjs/core/Meshes/buffer.js';
81
- import '@babylonjs/core/Meshes/Builders/linesBuilder.js';
82
- import '@babylonjs/core/Meshes/instancedMesh.js';
83
- import '@babylonjs/core/Rendering/renderingManager.js';
84
- import '@babylonjs/core/Rendering/edgesRenderer.js';
85
- import '@babylonjs/core/Rendering/outlineRenderer.js';
86
- import '@babylonjs/core/Meshes/GaussianSplatting/gaussianSplattingMesh.js';
87
- import '@babylonjs/core/Misc/gradients.js';
88
- import '@babylonjs/core/Materials/Node/Blocks/gradientBlock.js';
89
- import '@babylonjs/core/Particles/attractor.js';
90
- import '@babylonjs/core/Meshes/Builders/sphereBuilder.js';
91
- import '@babylonjs/core/Meshes/transformNode.js';
92
- import '@babylonjs/core/Physics/v2/IPhysicsEnginePlugin.js';
93
- import '@babylonjs/core/Physics/v2/physicsEngineComponent.js';
94
- import '@babylonjs/core/PostProcesses/postProcess.js';
95
- import '@babylonjs/core/Materials/Textures/cubeTexture.js';
96
- import '@babylonjs/core/Materials/imageProcessingConfiguration.js';
97
- import '@babylonjs/core/Bones/skeleton.js';
98
- import '@babylonjs/core/Sprites/sprite.js';
99
- import '@babylonjs/core/Sprites/spriteManager.js';
100
- import '@babylonjs/core/Materials/Textures/baseTexture.js';
101
- import '@babylonjs/core/Materials/Textures/multiRenderTarget.js';
102
- import '@babylonjs/core/Materials/Textures/renderTargetTexture.js';
103
- import '@babylonjs/core/Materials/Textures/thinTexture.js';
104
- import '@babylonjs/core/Misc/textureTools.js';
105
- import '@babylonjs/core/Rendering/boundingBoxRenderer.js';
106
- import '@babylonjs/core/PostProcesses/RenderPipeline/postProcessRenderPipelineManagerSceneComponent.js';
107
- import '@babylonjs/core/Sprites/spriteSceneComponent.js';
108
- import '@babylonjs/core/Materials/Textures/dynamicTexture.js';
109
- import '@babylonjs/core/Events/pointerEvents.js';
110
-
111
- const CaptureRttTools = ({ scene }) => {
112
- const [useWidthHeight, setUseWidthHeight] = useState(false);
113
- const [screenshotSize, setScreenshotSize] = useState({ precision: 1 });
114
- const captureRender = useCallback(async () => {
115
- const sizeToUse = { ...screenshotSize };
116
- if (!useWidthHeight) {
117
- sizeToUse.width = undefined;
118
- sizeToUse.height = undefined;
119
- }
120
- if (scene.activeCamera) {
121
- Tools.CreateScreenshotUsingRenderTarget(scene.getEngine(), scene.activeCamera, sizeToUse, undefined, undefined, 4);
122
- }
123
- }, [scene, screenshotSize, useWidthHeight]);
124
- return (jsxs(Fragment, { children: [jsx(ButtonLine, { label: "Capture", icon: CameraRegular, onClick: captureRender }), jsx(SyncedSliderPropertyLine, { label: "Precision", value: screenshotSize.precision ?? 1, onChange: (value) => setScreenshotSize({ ...screenshotSize, precision: value ?? 1 }), min: 0.1, max: 10, step: 0.1 }), jsx(SwitchPropertyLine, { label: "Use Custom Width/Height", value: useWidthHeight, onChange: (value) => setUseWidthHeight(value) }), jsxs(Collapse, { visible: useWidthHeight, children: [jsx(SyncedSliderPropertyLine, { label: "Width", value: screenshotSize.width ?? 512, onChange: (data) => setScreenshotSize({ ...screenshotSize, width: data ?? 512 }), min: 1, step: 1 }), jsx(SyncedSliderPropertyLine, { label: "Height", value: screenshotSize.height ?? 512, onChange: (data) => setScreenshotSize({ ...screenshotSize, height: data ?? 512 }), min: 1, step: 1 })] })] }));
125
- };
126
- const CaptureScreenshotTools = ({ scene }) => {
127
- const [isRecording, setIsRecording] = useState(false);
128
- const videoRecorder = useRef();
129
- const captureScreenshot = useCallback(() => {
130
- const camera = scene.frameGraph ? FrameGraphUtils.FindMainCamera(scene.frameGraph) : scene.activeCamera;
131
- if (camera) {
132
- Tools.CreateScreenshot(scene.getEngine(), camera, { precision: 1 });
133
- }
134
- }, [scene]);
135
- const captureEquirectangularAsync = useCallback(async () => {
136
- const currentActiveCamera = scene.activeCamera;
137
- if (!currentActiveCamera && scene.frameGraph) {
138
- scene.activeCamera = FrameGraphUtils.FindMainCamera(scene.frameGraph);
139
- }
140
- if (scene.activeCamera) {
141
- await captureEquirectangularFromScene(scene, { size: 1024, filename: "equirectangular_capture.png" });
142
- }
143
- // eslint-disable-next-line require-atomic-updates
144
- scene.activeCamera = currentActiveCamera;
145
- }, [scene]);
146
- const recordVideoAsync = useCallback(async () => {
147
- if (videoRecorder.current && videoRecorder.current.isRecording) {
148
- videoRecorder.current.stopRecording();
149
- setIsRecording(false);
150
- return;
151
- }
152
- if (!videoRecorder.current) {
153
- videoRecorder.current = new VideoRecorder(scene.getEngine());
154
- }
155
- void videoRecorder.current.startRecording();
156
- setIsRecording(true);
157
- }, [scene]);
158
- return (jsxs(Fragment, { children: [jsx(ButtonLine, { label: "Capture", icon: CameraRegular, onClick: captureScreenshot }), jsx(ButtonLine, { label: "Capture Equirectangular", icon: CameraRegular, onClick: captureEquirectangularAsync }), jsx(ButtonLine, { label: isRecording ? "Stop Recording" : "Record Video", icon: isRecording ? RecordStopRegular : RecordRegular, onClick: recordVideoAsync })] }));
159
- };
160
-
161
- const CaptureServiceDefinition = {
162
- friendlyName: "Capture Tools",
163
- consumes: [ToolsServiceIdentity],
164
- factory: (toolsService) => {
165
- const contentRegistrations = [];
166
- // Screenshot capture content
167
- contentRegistrations.push(toolsService.addSectionContent({
168
- key: "Screenshot Capture",
169
- section: "Screenshot Capture",
170
- component: ({ context }) => jsx(CaptureScreenshotTools, { scene: context }),
171
- }));
172
- // RTT capture content
173
- contentRegistrations.push(toolsService.addSectionContent({
174
- key: "RTT Capture",
175
- section: "RTT Capture",
176
- component: ({ context }) => jsx(CaptureRttTools, { scene: context }),
177
- }));
178
- return {
179
- dispose: () => {
180
- contentRegistrations.forEach((registration) => registration.dispose());
181
- },
182
- };
183
- },
184
- };
185
- var captureService = {
186
- serviceDefinitions: [CaptureServiceDefinition],
187
- };
188
-
189
- export { CaptureServiceDefinition, captureService as default };
190
- //# sourceMappingURL=captureService-BZVSfioR.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"captureService-BZVSfioR.js","sources":["../../../../../../../../dev/inspector-v2/src/components/tools/captureTools.tsx","../../../../../../../../dev/inspector-v2/src/services/panes/tools/captureService.tsx"],"sourcesContent":["import { ButtonLine } from \"shared-ui-components/fluent/hoc/buttonLine\";\r\nimport { useState, useRef, useCallback } from \"react\";\r\nimport type { FunctionComponent } from \"react\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { Scene } from \"core/scene\";\r\nimport { SyncedSliderPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/syncedSliderPropertyLine\";\r\nimport type { IScreenshotSize } from \"core/Misc/interfaces/screenshotSize\";\r\nimport { SwitchPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/switchPropertyLine\";\r\nimport { VideoRecorder } from \"core/Misc/videoRecorder\";\r\nimport { captureEquirectangularFromScene } from \"core/Misc/equirectangularCapture\";\r\nimport { Collapse } from \"shared-ui-components/fluent/primitives/collapse\";\r\nimport { CameraRegular, RecordRegular, RecordStopRegular } from \"@fluentui/react-icons\";\r\nimport { FrameGraphUtils } from \"core/FrameGraph/frameGraphUtils\";\r\n\r\nexport const CaptureRttTools: FunctionComponent<{ scene: Scene }> = ({ scene }) => {\r\n const [useWidthHeight, setUseWidthHeight] = useState(false);\r\n const [screenshotSize, setScreenshotSize] = useState<IScreenshotSize>({ precision: 1 });\r\n\r\n const captureRender = useCallback(async () => {\r\n const sizeToUse: IScreenshotSize = { ...screenshotSize };\r\n if (!useWidthHeight) {\r\n sizeToUse.width = undefined;\r\n sizeToUse.height = undefined;\r\n }\r\n\r\n if (scene.activeCamera) {\r\n Tools.CreateScreenshotUsingRenderTarget(scene.getEngine(), scene.activeCamera, sizeToUse, undefined, undefined, 4);\r\n }\r\n }, [scene, screenshotSize, useWidthHeight]);\r\n\r\n return (\r\n <>\r\n <ButtonLine label=\"Capture\" icon={CameraRegular} onClick={captureRender} />\r\n <SyncedSliderPropertyLine\r\n label=\"Precision\"\r\n value={screenshotSize.precision ?? 1}\r\n onChange={(value) => setScreenshotSize({ ...screenshotSize, precision: value ?? 1 })}\r\n min={0.1}\r\n max={10}\r\n step={0.1}\r\n />\r\n <SwitchPropertyLine label=\"Use Custom Width/Height\" value={useWidthHeight} onChange={(value) => setUseWidthHeight(value)} />\r\n <Collapse visible={useWidthHeight}>\r\n <SyncedSliderPropertyLine\r\n label=\"Width\"\r\n value={screenshotSize.width ?? 512}\r\n onChange={(data) => setScreenshotSize({ ...screenshotSize, width: data ?? 512 })}\r\n min={1}\r\n step={1}\r\n />\r\n <SyncedSliderPropertyLine\r\n label=\"Height\"\r\n value={screenshotSize.height ?? 512}\r\n onChange={(data) => setScreenshotSize({ ...screenshotSize, height: data ?? 512 })}\r\n min={1}\r\n step={1}\r\n />\r\n </Collapse>\r\n </>\r\n );\r\n};\r\n\r\nexport const CaptureScreenshotTools: FunctionComponent<{ scene: Scene }> = ({ scene }) => {\r\n const [isRecording, setIsRecording] = useState(false);\r\n const videoRecorder = useRef<VideoRecorder>();\r\n\r\n const captureScreenshot = useCallback(() => {\r\n const camera = scene.frameGraph ? FrameGraphUtils.FindMainCamera(scene.frameGraph) : scene.activeCamera;\r\n if (camera) {\r\n Tools.CreateScreenshot(scene.getEngine(), camera, { precision: 1 });\r\n }\r\n }, [scene]);\r\n\r\n const captureEquirectangularAsync = useCallback(async () => {\r\n const currentActiveCamera = scene.activeCamera;\r\n if (!currentActiveCamera && scene.frameGraph) {\r\n scene.activeCamera = FrameGraphUtils.FindMainCamera(scene.frameGraph);\r\n }\r\n if (scene.activeCamera) {\r\n await captureEquirectangularFromScene(scene, { size: 1024, filename: \"equirectangular_capture.png\" });\r\n }\r\n // eslint-disable-next-line require-atomic-updates\r\n scene.activeCamera = currentActiveCamera;\r\n }, [scene]);\r\n\r\n const recordVideoAsync = useCallback(async () => {\r\n if (videoRecorder.current && videoRecorder.current.isRecording) {\r\n videoRecorder.current.stopRecording();\r\n setIsRecording(false);\r\n return;\r\n }\r\n\r\n if (!videoRecorder.current) {\r\n videoRecorder.current = new VideoRecorder(scene.getEngine());\r\n }\r\n\r\n void videoRecorder.current.startRecording();\r\n setIsRecording(true);\r\n }, [scene]);\r\n\r\n return (\r\n <>\r\n <ButtonLine label=\"Capture\" icon={CameraRegular} onClick={captureScreenshot} />\r\n <ButtonLine label=\"Capture Equirectangular\" icon={CameraRegular} onClick={captureEquirectangularAsync} />\r\n <ButtonLine label={isRecording ? \"Stop Recording\" : \"Record Video\"} icon={isRecording ? RecordStopRegular : RecordRegular} onClick={recordVideoAsync} />\r\n </>\r\n );\r\n};\r\n","import type { ServiceDefinition } from \"../../../modularity/serviceDefinition\";\r\nimport { ToolsServiceIdentity } from \"../toolsService\";\r\nimport type { IToolsService } from \"../toolsService\";\r\nimport type { IDisposable } from \"core/scene\";\r\nimport { CaptureRttTools, CaptureScreenshotTools } from \"../../../components/tools/captureTools\";\r\n\r\nexport const CaptureServiceDefinition: ServiceDefinition<[], [IToolsService]> = {\r\n friendlyName: \"Capture Tools\",\r\n consumes: [ToolsServiceIdentity],\r\n factory: (toolsService) => {\r\n const contentRegistrations: IDisposable[] = [];\r\n\r\n // Screenshot capture content\r\n contentRegistrations.push(\r\n toolsService.addSectionContent({\r\n key: \"Screenshot Capture\",\r\n section: \"Screenshot Capture\",\r\n component: ({ context }) => <CaptureScreenshotTools scene={context} />,\r\n })\r\n );\r\n\r\n // RTT capture content\r\n contentRegistrations.push(\r\n toolsService.addSectionContent({\r\n key: \"RTT Capture\",\r\n section: \"RTT Capture\",\r\n component: ({ context }) => <CaptureRttTools scene={context} />,\r\n })\r\n );\r\n\r\n return {\r\n dispose: () => {\r\n contentRegistrations.forEach((registration) => registration.dispose());\r\n },\r\n };\r\n },\r\n};\r\n\r\nexport default {\r\n serviceDefinitions: [CaptureServiceDefinition],\r\n} as const;\r\n"],"names":["_jsxs","_jsx","_Fragment"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcO,MAAM,eAAe,GAAwC,CAAC,EAAE,KAAK,EAAE,KAAI;IAC9E,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;AAC3D,IAAA,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAkB,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;AAEvF,IAAA,MAAM,aAAa,GAAG,WAAW,CAAC,YAAW;AACzC,QAAA,MAAM,SAAS,GAAoB,EAAE,GAAG,cAAc,EAAE;QACxD,IAAI,CAAC,cAAc,EAAE;AACjB,YAAA,SAAS,CAAC,KAAK,GAAG,SAAS;AAC3B,YAAA,SAAS,CAAC,MAAM,GAAG,SAAS;;AAGhC,QAAA,IAAI,KAAK,CAAC,YAAY,EAAE;YACpB,KAAK,CAAC,iCAAiC,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,KAAK,CAAC,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;;KAEzH,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;IAE3C,QACIA,4BACIC,GAAC,CAAA,UAAU,IAAC,KAAK,EAAC,SAAS,EAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,GAAI,EAC3EA,GAAA,CAAC,wBAAwB,EACrB,EAAA,KAAK,EAAC,WAAW,EACjB,KAAK,EAAE,cAAc,CAAC,SAAS,IAAI,CAAC,EACpC,QAAQ,EAAE,CAAC,KAAK,KAAK,iBAAiB,CAAC,EAAE,GAAG,cAAc,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,EACpF,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,EAAE,EACP,IAAI,EAAE,GAAG,EACX,CAAA,EACFA,IAAC,kBAAkB,EAAA,EAAC,KAAK,EAAC,yBAAyB,EAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,KAAK,KAAK,iBAAiB,CAAC,KAAK,CAAC,EAAI,CAAA,EAC5HD,IAAC,CAAA,QAAQ,EAAC,EAAA,OAAO,EAAE,cAAc,EAAA,QAAA,EAAA,CAC7BC,IAAC,wBAAwB,EAAA,EACrB,KAAK,EAAC,OAAO,EACb,KAAK,EAAE,cAAc,CAAC,KAAK,IAAI,GAAG,EAClC,QAAQ,EAAE,CAAC,IAAI,KAAK,iBAAiB,CAAC,EAAE,GAAG,cAAc,EAAE,KAAK,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC,EAChF,GAAG,EAAE,CAAC,EACN,IAAI,EAAE,CAAC,EACT,CAAA,EACFA,IAAC,wBAAwB,EAAA,EACrB,KAAK,EAAC,QAAQ,EACd,KAAK,EAAE,cAAc,CAAC,MAAM,IAAI,GAAG,EACnC,QAAQ,EAAE,CAAC,IAAI,KAAK,iBAAiB,CAAC,EAAE,GAAG,cAAc,EAAE,MAAM,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC,EACjF,GAAG,EAAE,CAAC,EACN,IAAI,EAAE,CAAC,EACT,CAAA,CAAA,EAAA,CACK,CACZ,EAAA,CAAA;AAEX,CAAC;AAEM,MAAM,sBAAsB,GAAwC,CAAC,EAAE,KAAK,EAAE,KAAI;IACrF,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;AACrD,IAAA,MAAM,aAAa,GAAG,MAAM,EAAiB;AAE7C,IAAA,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAK;QACvC,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,GAAG,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,YAAY;QACvG,IAAI,MAAM,EAAE;AACR,YAAA,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;;AAE3E,KAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AAEX,IAAA,MAAM,2BAA2B,GAAG,WAAW,CAAC,YAAW;AACvD,QAAA,MAAM,mBAAmB,GAAG,KAAK,CAAC,YAAY;AAC9C,QAAA,IAAI,CAAC,mBAAmB,IAAI,KAAK,CAAC,UAAU,EAAE;YAC1C,KAAK,CAAC,YAAY,GAAG,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC;;AAEzE,QAAA,IAAI,KAAK,CAAC,YAAY,EAAE;AACpB,YAAA,MAAM,+BAA+B,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,6BAA6B,EAAE,CAAC;;;AAGzG,QAAA,KAAK,CAAC,YAAY,GAAG,mBAAmB;AAC5C,KAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AAEX,IAAA,MAAM,gBAAgB,GAAG,WAAW,CAAC,YAAW;QAC5C,IAAI,aAAa,CAAC,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE;AAC5D,YAAA,aAAa,CAAC,OAAO,CAAC,aAAa,EAAE;YACrC,cAAc,CAAC,KAAK,CAAC;YACrB;;AAGJ,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;YACxB,aAAa,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;;AAGhE,QAAA,KAAK,aAAa,CAAC,OAAO,CAAC,cAAc,EAAE;QAC3C,cAAc,CAAC,IAAI,CAAC;AACxB,KAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AAEX,IAAA,QACID,IAAA,CAAAE,QAAA,EAAA,EAAA,QAAA,EAAA,CACID,GAAC,CAAA,UAAU,EAAC,EAAA,KAAK,EAAC,SAAS,EAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,EAAA,CAAI,EAC/EA,GAAA,CAAC,UAAU,EAAA,EAAC,KAAK,EAAC,yBAAyB,EAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,2BAA2B,EAAA,CAAI,EACzGA,GAAA,CAAC,UAAU,EAAA,EAAC,KAAK,EAAE,WAAW,GAAG,gBAAgB,GAAG,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,iBAAiB,GAAG,aAAa,EAAE,OAAO,EAAE,gBAAgB,EAAI,CAAA,CAAA,EAAA,CACzJ;AAEX,CAAC;;ACrGY,MAAA,wBAAwB,GAA2C;AAC5E,IAAA,YAAY,EAAE,eAAe;IAC7B,QAAQ,EAAE,CAAC,oBAAoB,CAAC;AAChC,IAAA,OAAO,EAAE,CAAC,YAAY,KAAI;QACtB,MAAM,oBAAoB,GAAkB,EAAE;;AAG9C,QAAA,oBAAoB,CAAC,IAAI,CACrB,YAAY,CAAC,iBAAiB,CAAC;AAC3B,YAAA,GAAG,EAAE,oBAAoB;AACzB,YAAA,OAAO,EAAE,oBAAoB;AAC7B,YAAA,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,KAAKA,GAAA,CAAC,sBAAsB,EAAA,EAAC,KAAK,EAAE,OAAO,EAAI,CAAA;AACzE,SAAA,CAAC,CACL;;AAGD,QAAA,oBAAoB,CAAC,IAAI,CACrB,YAAY,CAAC,iBAAiB,CAAC;AAC3B,YAAA,GAAG,EAAE,aAAa;AAClB,YAAA,OAAO,EAAE,aAAa;AACtB,YAAA,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,KAAKA,GAAA,CAAC,eAAe,EAAA,EAAC,KAAK,EAAE,OAAO,EAAI,CAAA;AAClE,SAAA,CAAC,CACL;QAED,OAAO;YACH,OAAO,EAAE,MAAK;AACV,gBAAA,oBAAoB,CAAC,OAAO,CAAC,CAAC,YAAY,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;aACzE;SACJ;KACJ;;AAGL,qBAAe;IACX,kBAAkB,EAAE,CAAC,wBAAwB,CAAC;CACxC;;;;"}
@@ -1,236 +0,0 @@
1
- import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
- import { MakeLazyComponent, ButtonLine, SwitchPropertyLine, NumberDropdownPropertyLine, Collapse, SyncedSliderPropertyLine, ToolsServiceIdentity } from './index.js';
3
- import { SceneSerializer } from '@babylonjs/core/Misc/sceneSerializer.js';
4
- import { Tools } from '@babylonjs/core/Misc/tools.js';
5
- import { EnvironmentTextureTools } from '@babylonjs/core/Misc/environmentTextureTools.js';
6
- import { Logger } from '@babylonjs/core/Misc/logger.js';
7
- import { useState, useCallback } from 'react';
8
- import { Mesh } from '@babylonjs/core/Meshes/mesh.js';
9
- import { Texture } from '@babylonjs/core/Materials/Textures/texture.js';
10
- import { Camera } from '@babylonjs/core/Cameras/camera.js';
11
- import { Light } from '@babylonjs/core/Lights/light.js';
12
- import { ArrowDownloadRegular } from '@fluentui/react-icons';
13
- import '@babylonjs/core/Maths/math.color.js';
14
- import '@babylonjs/core/Maths/math.vector.js';
15
- import '@babylonjs/core/Misc/observable.js';
16
- import '@fluentui/react-components';
17
- import '@fluentui/react-motion-components-preview';
18
- import '@babylonjs/core/Misc/typeStore.js';
19
- import 'usehooks-ts';
20
- import '@babylonjs/core/Misc/asyncLock.js';
21
- import '@babylonjs/core/Misc/deferred.js';
22
- import '@babylonjs/core/Maths/math.scalar.functions.js';
23
- import '@fluentui-contrib/react-virtualizer';
24
- import '@babylonjs/addons/msdfText/fontAsset.js';
25
- import '@babylonjs/addons/msdfText/textRenderer.js';
26
- import '@babylonjs/core/Debug/physicsViewer.js';
27
- import '@babylonjs/core/Materials/materialFlags.js';
28
- import '@babylonjs/core/Materials/standardMaterial.js';
29
- import '@babylonjs/core/Meshes/Builders/groundBuilder.js';
30
- import '@babylonjs/core/Rendering/utilityLayerRenderer.js';
31
- import '@babylonjs/materials/grid/gridMaterial.js';
32
- import '@babylonjs/core/Misc/dataStorage.js';
33
- import '@babylonjs/core/Instrumentation/engineInstrumentation.js';
34
- import '@babylonjs/core/Instrumentation/sceneInstrumentation.js';
35
- import '@babylonjs/core/Engines/AbstractEngine/abstractEngine.timeQuery.js';
36
- import '@babylonjs/core/Engines/Extensions/engine.query.js';
37
- import '@babylonjs/core/Engines/WebGPU/Extensions/engine.query.js';
38
- import '@babylonjs/core/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js';
39
- import '@babylonjs/core/Misc/PerformanceViewer/performanceViewerSceneExtension.js';
40
- import '@babylonjs/core/Misc/pressureObserverWrapper.js';
41
- import '@babylonjs/core/Engines/abstractEngine.js';
42
- import '@babylonjs/core/Engines/engineStore.js';
43
- import 'react-dom/client';
44
- import '@babylonjs/core/FrameGraph/frameGraphUtils.js';
45
- import '@babylonjs/core/Gizmos/cameraGizmo.js';
46
- import '@babylonjs/core/Gizmos/lightGizmo.js';
47
- import '@babylonjs/core/Bones/bone.js';
48
- import '@babylonjs/core/Gizmos/gizmoManager.js';
49
- import '@babylonjs/core/Meshes/abstractMesh.js';
50
- import '@babylonjs/core/node.js';
51
- import '@babylonjs/core/Animations/animationGroup.js';
52
- import '@babylonjs/core/Animations/animationPropertiesOverride.js';
53
- import '@babylonjs/addons/atmosphere/atmosphere.js';
54
- import '@babylonjs/core/Cameras/arcRotateCamera.js';
55
- import '@babylonjs/core/Cameras/followCamera.js';
56
- import '@babylonjs/core/Cameras/freeCamera.js';
57
- import '@babylonjs/core/Cameras/targetCamera.js';
58
- import '@babylonjs/core/scene.js';
59
- import '@babylonjs/core/FrameGraph/frameGraph.js';
60
- import '@babylonjs/core/Lights/directionalLight.js';
61
- import '@babylonjs/core/Lights/hemisphericLight.js';
62
- import '@babylonjs/core/Lights/pointLight.js';
63
- import '@babylonjs/core/Lights/rectAreaLight.js';
64
- import '@babylonjs/core/Lights/shadowLight.js';
65
- import '@babylonjs/core/Lights/spotLight.js';
66
- import '@babylonjs/core/Lights/Shadows/cascadedShadowGenerator.js';
67
- import '@babylonjs/core/Lights/Shadows/shadowGenerator.js';
68
- import '@babylonjs/core/Lights/Shadows/shadowGeneratorSceneComponent.js';
69
- import '@babylonjs/core/Materials/material.js';
70
- import '@babylonjs/core/Materials/multiMaterial.js';
71
- import '@babylonjs/core/Materials/PBR/pbrBaseMaterial.js';
72
- import '@babylonjs/core/Materials/PBR/pbrBaseSimpleMaterial.js';
73
- import '@babylonjs/core/Materials/PBR/pbrMaterial.js';
74
- import '@babylonjs/materials/sky/skyMaterial.js';
75
- import '@babylonjs/core/Engines/engine.js';
76
- import '@babylonjs/core/Engines/constants.js';
77
- import '@babylonjs/core/Particles/particleSystem.js';
78
- import '@babylonjs/core/Misc/fileTools.js';
79
- import '@babylonjs/core/Debug/skeletonViewer.js';
80
- import '@babylonjs/core/Meshes/buffer.js';
81
- import '@babylonjs/core/Meshes/Builders/linesBuilder.js';
82
- import '@babylonjs/core/Meshes/instancedMesh.js';
83
- import '@babylonjs/core/Rendering/renderingManager.js';
84
- import '@babylonjs/core/Rendering/edgesRenderer.js';
85
- import '@babylonjs/core/Rendering/outlineRenderer.js';
86
- import '@babylonjs/core/Meshes/GaussianSplatting/gaussianSplattingMesh.js';
87
- import '@babylonjs/core/Misc/gradients.js';
88
- import '@babylonjs/core/Materials/Node/Blocks/gradientBlock.js';
89
- import '@babylonjs/core/Particles/attractor.js';
90
- import '@babylonjs/core/Meshes/Builders/sphereBuilder.js';
91
- import '@babylonjs/core/Meshes/transformNode.js';
92
- import '@babylonjs/core/Physics/v2/IPhysicsEnginePlugin.js';
93
- import '@babylonjs/core/Physics/v2/physicsEngineComponent.js';
94
- import '@babylonjs/core/PostProcesses/postProcess.js';
95
- import '@babylonjs/core/Materials/Textures/cubeTexture.js';
96
- import '@babylonjs/core/Materials/imageProcessingConfiguration.js';
97
- import '@babylonjs/core/Bones/skeleton.js';
98
- import '@babylonjs/core/Sprites/sprite.js';
99
- import '@babylonjs/core/Sprites/spriteManager.js';
100
- import '@babylonjs/core/Materials/Textures/baseTexture.js';
101
- import '@babylonjs/core/Materials/Textures/multiRenderTarget.js';
102
- import '@babylonjs/core/Materials/Textures/renderTargetTexture.js';
103
- import '@babylonjs/core/Materials/Textures/thinTexture.js';
104
- import '@babylonjs/core/Misc/textureTools.js';
105
- import '@babylonjs/core/Rendering/boundingBoxRenderer.js';
106
- import '@babylonjs/core/PostProcesses/RenderPipeline/postProcessRenderPipelineManagerSceneComponent.js';
107
- import '@babylonjs/core/Sprites/spriteSceneComponent.js';
108
- import '@babylonjs/core/Materials/Textures/dynamicTexture.js';
109
- import '@babylonjs/core/Events/pointerEvents.js';
110
-
111
- const EnvExportImageTypes = [
112
- { label: "PNG", value: 0, imageType: "image/png" },
113
- { label: "WebP", value: 1, imageType: "image/webp" },
114
- ];
115
- const ExportBabylonTools = ({ scene }) => {
116
- const [babylonExportOptions, setBabylonExportOptions] = useState({
117
- imageTypeIndex: 0,
118
- imageQuality: 0.8,
119
- iblDiffuse: false,
120
- });
121
- const exportBabylon = useCallback(async () => {
122
- const strScene = JSON.stringify(SceneSerializer.Serialize(scene));
123
- const blob = new Blob([strScene], { type: "octet/stream" });
124
- Tools.Download(blob, "scene.babylon");
125
- }, [scene]);
126
- const createEnvTexture = useCallback(async () => {
127
- if (!scene.environmentTexture) {
128
- return;
129
- }
130
- try {
131
- const buffer = await EnvironmentTextureTools.CreateEnvTextureAsync(scene.environmentTexture, {
132
- imageType: EnvExportImageTypes[babylonExportOptions.imageTypeIndex].imageType,
133
- imageQuality: babylonExportOptions.imageQuality,
134
- disableIrradianceTexture: !babylonExportOptions.iblDiffuse,
135
- });
136
- const blob = new Blob([buffer], { type: "octet/stream" });
137
- Tools.Download(blob, "environment.env");
138
- }
139
- catch (error) {
140
- Logger.Error(error);
141
- alert(error);
142
- }
143
- }, [scene, babylonExportOptions]);
144
- return (jsxs(Fragment, { children: [jsx(ButtonLine, { label: "Export to Babylon", icon: ArrowDownloadRegular, onClick: exportBabylon }), !scene.getEngine().premultipliedAlpha && scene.environmentTexture && scene.environmentTexture._prefiltered && scene.activeCamera && (jsxs(Fragment, { children: [jsx(ButtonLine, { label: "Generate .env texture", icon: ArrowDownloadRegular, onClick: createEnvTexture }), scene.environmentTexture.irradianceTexture && (jsx(SwitchPropertyLine, { label: "Diffuse Texture", description: "Export diffuse texture for IBL", value: babylonExportOptions.iblDiffuse, onChange: (value) => {
145
- setBabylonExportOptions((prev) => ({ ...prev, iblDiffuse: value }));
146
- } }, "iblDiffuse")), jsx(NumberDropdownPropertyLine, { label: "Image type", options: EnvExportImageTypes, value: babylonExportOptions.imageTypeIndex, onChange: (val) => {
147
- setBabylonExportOptions((prev) => ({ ...prev, imageTypeIndex: val }));
148
- } }), jsx(Collapse, { visible: babylonExportOptions.imageTypeIndex > 0, children: jsx(SyncedSliderPropertyLine, { label: "Quality", value: babylonExportOptions.imageQuality, onChange: (value) => setBabylonExportOptions((prev) => ({ ...prev, imageQuality: value })), min: 0, max: 1 }) })] }))] }));
149
- };
150
- const ExportGltfTools = MakeLazyComponent(async () => {
151
- // Defer importing anything from the serializers package until this component is actually mounted.
152
- const { GLTF2Export } = await import('@babylonjs/serializers/glTF/2.0/glTFSerializer.js');
153
- return (props) => {
154
- const [isExportingGltf, setIsExportingGltf] = useState(false);
155
- const [gltfExportOptions, setGltfExportOptions] = useState({
156
- exportDisabledNodes: false,
157
- exportSkyboxes: false,
158
- exportCameras: false,
159
- exportLights: false,
160
- });
161
- const exportGLTF = useCallback(async () => {
162
- setIsExportingGltf(true);
163
- const shouldExport = (node) => {
164
- if (!gltfExportOptions.exportDisabledNodes) {
165
- if (!node.isEnabled()) {
166
- return false;
167
- }
168
- }
169
- if (!gltfExportOptions.exportSkyboxes) {
170
- if (node instanceof Mesh) {
171
- if (node.material) {
172
- const material = node.material;
173
- const reflectionTexture = material.reflectionTexture;
174
- if (reflectionTexture && reflectionTexture.coordinatesMode === Texture.SKYBOX_MODE) {
175
- return false;
176
- }
177
- }
178
- }
179
- }
180
- if (!gltfExportOptions.exportCameras) {
181
- if (node instanceof Camera) {
182
- return false;
183
- }
184
- }
185
- if (!gltfExportOptions.exportLights) {
186
- if (node instanceof Light) {
187
- return false;
188
- }
189
- }
190
- return true;
191
- };
192
- try {
193
- const glb = await GLTF2Export.GLBAsync(props.scene, "scene", { shouldExportNode: (node) => shouldExport(node) });
194
- glb.downloadFiles();
195
- }
196
- catch (reason) {
197
- Logger.Error(`Failed to export GLB: ${reason}`);
198
- }
199
- finally {
200
- setIsExportingGltf(false);
201
- }
202
- }, [gltfExportOptions, props.scene]);
203
- return (jsxs(Fragment, { children: [jsx(SwitchPropertyLine, { label: "Export Disabled Nodes", description: "Whether to export nodes that are disabled in the scene.", value: gltfExportOptions.exportDisabledNodes, onChange: (checked) => setGltfExportOptions({ ...gltfExportOptions, exportDisabledNodes: checked }) }, "GLTFExportDisabledNodes"), jsx(SwitchPropertyLine, { label: "Export Skyboxes", description: "Whether to export skybox nodes in the scene.", value: gltfExportOptions.exportSkyboxes, onChange: (checked) => setGltfExportOptions({ ...gltfExportOptions, exportSkyboxes: checked }) }, "GLTFExportSkyboxes"), jsx(SwitchPropertyLine, { label: "Export Cameras", description: "Whether to export cameras in the scene.", value: gltfExportOptions.exportCameras, onChange: (checked) => setGltfExportOptions({ ...gltfExportOptions, exportCameras: checked }) }, "GLTFExportCameras"), jsx(SwitchPropertyLine, { label: "Export Lights", description: "Whether to export lights in the scene.", value: gltfExportOptions.exportLights, onChange: (checked) => setGltfExportOptions({ ...gltfExportOptions, exportLights: checked }) }, "GLTFExportLights"), jsx(ButtonLine, { label: "Export to GLB", icon: ArrowDownloadRegular, onClick: exportGLTF, disabled: isExportingGltf })] }));
204
- };
205
- });
206
-
207
- const ExportServiceDefinition = {
208
- friendlyName: "Export Tools",
209
- consumes: [ToolsServiceIdentity],
210
- factory: (toolsService) => {
211
- const contentRegistrations = [];
212
- // glTF export content
213
- contentRegistrations.push(toolsService.addSectionContent({
214
- key: "glTF Export",
215
- section: "glTF Export",
216
- component: ({ context }) => jsx(ExportGltfTools, { scene: context }),
217
- }));
218
- // Babylon export content
219
- contentRegistrations.push(toolsService.addSectionContent({
220
- key: "Babylon Export",
221
- section: "Babylon Export",
222
- component: ({ context }) => jsx(ExportBabylonTools, { scene: context }),
223
- }));
224
- return {
225
- dispose: () => {
226
- contentRegistrations.forEach((registration) => registration.dispose());
227
- },
228
- };
229
- },
230
- };
231
- var exportService = {
232
- serviceDefinitions: [ExportServiceDefinition],
233
- };
234
-
235
- export { ExportServiceDefinition, exportService as default };
236
- //# sourceMappingURL=exportService-C7h0qYdM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exportService-C7h0qYdM.js","sources":["../../../../../../../../dev/inspector-v2/src/components/tools/exportTools.tsx","../../../../../../../../dev/inspector-v2/src/services/panes/tools/exportService.tsx"],"sourcesContent":["import { NumberDropdownPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/dropdownPropertyLine\";\r\nimport { SceneSerializer } from \"core/Misc/sceneSerializer\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { EnvironmentTextureTools } from \"core/Misc/environmentTextureTools\";\r\nimport type { CubeTexture } from \"core/Materials/Textures/cubeTexture\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { useCallback, useState } from \"react\";\r\nimport type { FunctionComponent } from \"react\";\r\nimport type { Scene } from \"core/scene\";\r\nimport { ButtonLine } from \"shared-ui-components/fluent/hoc/buttonLine\";\r\nimport { SyncedSliderPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/syncedSliderPropertyLine\";\r\nimport type { Node } from \"core/node\";\r\nimport { Mesh } from \"core/Meshes/mesh\";\r\nimport type { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport type { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport type { BackgroundMaterial } from \"core/Materials/Background/backgroundMaterial\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { Camera } from \"core/Cameras/camera\";\r\nimport { Light } from \"core/Lights/light\";\r\nimport { SwitchPropertyLine } from \"shared-ui-components/fluent/hoc/propertyLines/switchPropertyLine\";\r\n\r\nimport { MakeLazyComponent } from \"shared-ui-components/fluent/primitives/lazyComponent\";\r\nimport { Collapse } from \"shared-ui-components/fluent/primitives/collapse\";\r\nimport { ArrowDownloadRegular } from \"@fluentui/react-icons\";\r\n\r\nconst EnvExportImageTypes = [\r\n { label: \"PNG\", value: 0, imageType: \"image/png\" },\r\n { label: \"WebP\", value: 1, imageType: \"image/webp\" },\r\n] as const;\r\n\r\ninterface IBabylonExportOptionsState {\r\n imageTypeIndex: number;\r\n imageQuality: number;\r\n iblDiffuse: boolean;\r\n}\r\n\r\nexport const ExportBabylonTools: FunctionComponent<{ scene: Scene }> = ({ scene }) => {\r\n const [babylonExportOptions, setBabylonExportOptions] = useState<Readonly<IBabylonExportOptionsState>>({\r\n imageTypeIndex: 0,\r\n imageQuality: 0.8,\r\n iblDiffuse: false,\r\n });\r\n\r\n const exportBabylon = useCallback(async () => {\r\n const strScene = JSON.stringify(SceneSerializer.Serialize(scene));\r\n const blob = new Blob([strScene], { type: \"octet/stream\" });\r\n Tools.Download(blob, \"scene.babylon\");\r\n }, [scene]);\r\n\r\n const createEnvTexture = useCallback(async () => {\r\n if (!scene.environmentTexture) {\r\n return;\r\n }\r\n\r\n try {\r\n const buffer = await EnvironmentTextureTools.CreateEnvTextureAsync(scene.environmentTexture as CubeTexture, {\r\n imageType: EnvExportImageTypes[babylonExportOptions.imageTypeIndex].imageType,\r\n imageQuality: babylonExportOptions.imageQuality,\r\n disableIrradianceTexture: !babylonExportOptions.iblDiffuse,\r\n });\r\n const blob = new Blob([buffer], { type: \"octet/stream\" });\r\n Tools.Download(blob, \"environment.env\");\r\n } catch (error: any) {\r\n Logger.Error(error);\r\n alert(error);\r\n }\r\n }, [scene, babylonExportOptions]);\r\n\r\n return (\r\n <>\r\n <ButtonLine label=\"Export to Babylon\" icon={ArrowDownloadRegular} onClick={exportBabylon} />\r\n {!scene.getEngine().premultipliedAlpha && scene.environmentTexture && scene.environmentTexture._prefiltered && scene.activeCamera && (\r\n <>\r\n <ButtonLine label=\"Generate .env texture\" icon={ArrowDownloadRegular} onClick={createEnvTexture} />\r\n {scene.environmentTexture.irradianceTexture && (\r\n <SwitchPropertyLine\r\n key=\"iblDiffuse\"\r\n label=\"Diffuse Texture\"\r\n description=\"Export diffuse texture for IBL\"\r\n value={babylonExportOptions.iblDiffuse}\r\n onChange={(value: boolean) => {\r\n setBabylonExportOptions((prev) => ({ ...prev, iblDiffuse: value }));\r\n }}\r\n />\r\n )}\r\n <NumberDropdownPropertyLine\r\n label=\"Image type\"\r\n options={EnvExportImageTypes}\r\n value={babylonExportOptions.imageTypeIndex}\r\n onChange={(val) => {\r\n setBabylonExportOptions((prev) => ({ ...prev, imageTypeIndex: val as number }));\r\n }}\r\n />\r\n <Collapse visible={babylonExportOptions.imageTypeIndex > 0}>\r\n <SyncedSliderPropertyLine\r\n label=\"Quality\"\r\n value={babylonExportOptions.imageQuality}\r\n onChange={(value) => setBabylonExportOptions((prev) => ({ ...prev, imageQuality: value }))}\r\n min={0}\r\n max={1}\r\n />\r\n </Collapse>\r\n </>\r\n )}\r\n </>\r\n );\r\n};\r\n\r\ninterface IGltfExportOptionsState {\r\n exportDisabledNodes: boolean;\r\n exportSkyboxes: boolean;\r\n exportCameras: boolean;\r\n exportLights: boolean;\r\n}\r\n\r\nexport const ExportGltfTools = MakeLazyComponent(async () => {\r\n // Defer importing anything from the serializers package until this component is actually mounted.\r\n const { GLTF2Export } = await import(\"serializers/glTF/2.0/glTFSerializer\");\r\n\r\n return (props: { scene: Scene }) => {\r\n const [isExportingGltf, setIsExportingGltf] = useState(false);\r\n const [gltfExportOptions, setGltfExportOptions] = useState<Readonly<IGltfExportOptionsState>>({\r\n exportDisabledNodes: false,\r\n exportSkyboxes: false,\r\n exportCameras: false,\r\n exportLights: false,\r\n });\r\n\r\n const exportGLTF = useCallback(async () => {\r\n setIsExportingGltf(true);\r\n\r\n const shouldExport = (node: Node): boolean => {\r\n if (!gltfExportOptions.exportDisabledNodes) {\r\n if (!node.isEnabled()) {\r\n return false;\r\n }\r\n }\r\n\r\n if (!gltfExportOptions.exportSkyboxes) {\r\n if (node instanceof Mesh) {\r\n if (node.material) {\r\n const material = node.material as PBRMaterial | StandardMaterial | BackgroundMaterial;\r\n const reflectionTexture = material.reflectionTexture;\r\n if (reflectionTexture && reflectionTexture.coordinatesMode === Texture.SKYBOX_MODE) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!gltfExportOptions.exportCameras) {\r\n if (node instanceof Camera) {\r\n return false;\r\n }\r\n }\r\n\r\n if (!gltfExportOptions.exportLights) {\r\n if (node instanceof Light) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n try {\r\n const glb = await GLTF2Export.GLBAsync(props.scene, \"scene\", { shouldExportNode: (node) => shouldExport(node) });\r\n glb.downloadFiles();\r\n } catch (reason) {\r\n Logger.Error(`Failed to export GLB: ${reason}`);\r\n } finally {\r\n setIsExportingGltf(false);\r\n }\r\n }, [gltfExportOptions, props.scene]);\r\n\r\n return (\r\n <>\r\n <SwitchPropertyLine\r\n key=\"GLTFExportDisabledNodes\"\r\n label=\"Export Disabled Nodes\"\r\n description=\"Whether to export nodes that are disabled in the scene.\"\r\n value={gltfExportOptions.exportDisabledNodes}\r\n onChange={(checked: boolean) => setGltfExportOptions({ ...gltfExportOptions, exportDisabledNodes: checked })}\r\n />\r\n <SwitchPropertyLine\r\n key=\"GLTFExportSkyboxes\"\r\n label=\"Export Skyboxes\"\r\n description=\"Whether to export skybox nodes in the scene.\"\r\n value={gltfExportOptions.exportSkyboxes}\r\n onChange={(checked: boolean) => setGltfExportOptions({ ...gltfExportOptions, exportSkyboxes: checked })}\r\n />\r\n <SwitchPropertyLine\r\n key=\"GLTFExportCameras\"\r\n label=\"Export Cameras\"\r\n description=\"Whether to export cameras in the scene.\"\r\n value={gltfExportOptions.exportCameras}\r\n onChange={(checked: boolean) => setGltfExportOptions({ ...gltfExportOptions, exportCameras: checked })}\r\n />\r\n <SwitchPropertyLine\r\n key=\"GLTFExportLights\"\r\n label=\"Export Lights\"\r\n description=\"Whether to export lights in the scene.\"\r\n value={gltfExportOptions.exportLights}\r\n onChange={(checked: boolean) => setGltfExportOptions({ ...gltfExportOptions, exportLights: checked })}\r\n />\r\n <ButtonLine label=\"Export to GLB\" icon={ArrowDownloadRegular} onClick={exportGLTF} disabled={isExportingGltf} />\r\n </>\r\n );\r\n };\r\n});\r\n","import type { ServiceDefinition } from \"../../../modularity/serviceDefinition\";\r\nimport { ToolsServiceIdentity } from \"../toolsService\";\r\nimport type { IToolsService } from \"../toolsService\";\r\nimport type { IDisposable } from \"core/scene\";\r\nimport { ExportBabylonTools, ExportGltfTools } from \"../../../components/tools/exportTools\";\r\n\r\nexport const ExportServiceDefinition: ServiceDefinition<[], [IToolsService]> = {\r\n friendlyName: \"Export Tools\",\r\n consumes: [ToolsServiceIdentity],\r\n factory: (toolsService) => {\r\n const contentRegistrations: IDisposable[] = [];\r\n\r\n // glTF export content\r\n contentRegistrations.push(\r\n toolsService.addSectionContent({\r\n key: \"glTF Export\",\r\n section: \"glTF Export\",\r\n component: ({ context }) => <ExportGltfTools scene={context} />,\r\n })\r\n );\r\n\r\n // Babylon export content\r\n contentRegistrations.push(\r\n toolsService.addSectionContent({\r\n key: \"Babylon Export\",\r\n section: \"Babylon Export\",\r\n component: ({ context }) => <ExportBabylonTools scene={context} />,\r\n })\r\n );\r\n\r\n return {\r\n dispose: () => {\r\n contentRegistrations.forEach((registration) => registration.dispose());\r\n },\r\n };\r\n },\r\n};\r\n\r\nexport default {\r\n serviceDefinitions: [ExportServiceDefinition],\r\n} as const;\r\n"],"names":["_jsxs","_Fragment","_jsx"],"mappings":"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"}