@babylonjs/inspector 8.31.3 → 8.31.4-preview
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/lib/captureService-BZVSfioR.js +190 -0
- package/lib/captureService-BZVSfioR.js.map +1 -0
- package/lib/exportService-C7h0qYdM.js +236 -0
- package/lib/exportService-C7h0qYdM.js.map +1 -0
- package/lib/importService-BBWfTnVO.js +172 -0
- package/lib/importService-BBWfTnVO.js.map +1 -0
- package/lib/index.d.ts +71669 -0
- package/lib/index.js +9212 -0
- package/lib/index.js.map +1 -0
- package/package.json +20 -36
- package/readme.md +14 -17
- package/dist/babylon.inspector.bundle.js +0 -3
- package/dist/babylon.inspector.bundle.js.LICENSE.txt +0 -72
- package/dist/babylon.inspector.bundle.js.map +0 -1
- package/dist/babylon.inspector.bundle.max.js +0 -3
- package/dist/babylon.inspector.module.d.ts +0 -9201
@@ -0,0 +1,190 @@
|
|
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
|
@@ -0,0 +1 @@
|
|
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":"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"}
|
@@ -0,0 +1,236 @@
|
|
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
|
@@ -0,0 +1 @@
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,MAAM,mBAAmB,GAAG;IACxB,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE;IAClD,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE;CAC9C;AAQH,MAAM,kBAAkB,GAAwC,CAAC,EAAE,KAAK,EAAE,KAAI;AACjF,IAAA,MAAM,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,GAAG,QAAQ,CAAuC;AACnG,QAAA,cAAc,EAAE,CAAC;AACjB,QAAA,YAAY,EAAE,GAAG;AACjB,QAAA,UAAU,EAAE,KAAK;AACpB,KAAA,CAAC;AAEF,IAAA,MAAM,aAAa,GAAG,WAAW,CAAC,YAAW;AACzC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AACjE,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;AAC3D,QAAA,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;AACzC,KAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AAEX,IAAA,MAAM,gBAAgB,GAAG,WAAW,CAAC,YAAW;AAC5C,QAAA,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE;YAC3B;;AAGJ,QAAA,IAAI;YACA,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,qBAAqB,CAAC,KAAK,CAAC,kBAAiC,EAAE;gBACxG,SAAS,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC,SAAS;gBAC7E,YAAY,EAAE,oBAAoB,CAAC,YAAY;AAC/C,gBAAA,wBAAwB,EAAE,CAAC,oBAAoB,CAAC,UAAU;AAC7D,aAAA,CAAC;AACF,YAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;AACzD,YAAA,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;;QACzC,OAAO,KAAU,EAAE;AACjB,YAAA,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YACnB,KAAK,CAAC,KAAK,CAAC;;AAEpB,KAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;AAEjC,IAAA,QACIA,IACI,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CAAAC,GAAA,CAAC,UAAU,EAAC,EAAA,KAAK,EAAC,mBAAmB,EAAC,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,aAAa,EAAA,CAAI,EAC3F,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,kBAAkB,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,KAC7HF,IACI,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CAAAC,GAAA,CAAC,UAAU,EAAA,EAAC,KAAK,EAAC,uBAAuB,EAAC,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,gBAAgB,EAAA,CAAI,EAClG,KAAK,CAAC,kBAAkB,CAAC,iBAAiB,KACvCA,GAAA,CAAC,kBAAkB,EAAA,EAEf,KAAK,EAAC,iBAAiB,EACvB,WAAW,EAAC,gCAAgC,EAC5C,KAAK,EAAE,oBAAoB,CAAC,UAAU,EACtC,QAAQ,EAAE,CAAC,KAAc,KAAI;AACzB,4BAAA,uBAAuB,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;yBACtE,EAAA,EANG,YAAY,CAOlB,CACL,EACDA,GAAC,CAAA,0BAA0B,EACvB,EAAA,KAAK,EAAC,YAAY,EAClB,OAAO,EAAE,mBAAmB,EAC5B,KAAK,EAAE,oBAAoB,CAAC,cAAc,EAC1C,QAAQ,EAAE,CAAC,GAAG,KAAI;AACd,4BAAA,uBAAuB,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,GAAa,EAAE,CAAC,CAAC;AACnF,yBAAC,EACH,CAAA,EACFA,GAAC,CAAA,QAAQ,EAAC,EAAA,OAAO,EAAE,oBAAoB,CAAC,cAAc,GAAG,CAAC,YACtDA,GAAC,CAAA,wBAAwB,EACrB,EAAA,KAAK,EAAC,SAAS,EACf,KAAK,EAAE,oBAAoB,CAAC,YAAY,EACxC,QAAQ,EAAE,CAAC,KAAK,KAAK,uBAAuB,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,EAC1F,GAAG,EAAE,CAAC,EACN,GAAG,EAAE,CAAC,EAAA,CACR,EACK,CAAA,CAAA,EAAA,CACZ,CACN,CAAA,EAAA,CACF;AAEX,CAAC;AASM,MAAM,eAAe,GAAG,iBAAiB,CAAC,YAAW;;AAExD,IAAA,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,2DAA6C;IAE3E,OAAO,CAAC,KAAuB,KAAI;QAC/B,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;AAC7D,QAAA,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAoC;AAC1F,YAAA,mBAAmB,EAAE,KAAK;AAC1B,YAAA,cAAc,EAAE,KAAK;AACrB,YAAA,aAAa,EAAE,KAAK;AACpB,YAAA,YAAY,EAAE,KAAK;AACtB,SAAA,CAAC;AAEF,QAAA,MAAM,UAAU,GAAG,WAAW,CAAC,YAAW;YACtC,kBAAkB,CAAC,IAAI,CAAC;AAExB,YAAA,MAAM,YAAY,GAAG,CAAC,IAAU,KAAa;AACzC,gBAAA,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,EAAE;AACxC,oBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;AACnB,wBAAA,OAAO,KAAK;;;AAIpB,gBAAA,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE;AACnC,oBAAA,IAAI,IAAI,YAAY,IAAI,EAAE;AACtB,wBAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACf,4BAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAA+D;AACrF,4BAAA,MAAM,iBAAiB,GAAG,QAAQ,CAAC,iBAAiB;4BACpD,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,eAAe,KAAK,OAAO,CAAC,WAAW,EAAE;AAChF,gCAAA,OAAO,KAAK;;;;;AAM5B,gBAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;AAClC,oBAAA,IAAI,IAAI,YAAY,MAAM,EAAE;AACxB,wBAAA,OAAO,KAAK;;;AAIpB,gBAAA,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE;AACjC,oBAAA,IAAI,IAAI,YAAY,KAAK,EAAE;AACvB,wBAAA,OAAO,KAAK;;;AAIpB,gBAAA,OAAO,IAAI;AACf,aAAC;AAED,YAAA,IAAI;gBACA,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,gBAAgB,EAAE,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChH,GAAG,CAAC,aAAa,EAAE;;YACrB,OAAO,MAAM,EAAE;AACb,gBAAA,MAAM,CAAC,KAAK,CAAC,yBAAyB,MAAM,CAAA,CAAE,CAAC;;oBACzC;gBACN,kBAAkB,CAAC,KAAK,CAAC;;SAEhC,EAAE,CAAC,iBAAiB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AAEpC,QAAA,QACIF,IACI,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CAAAC,GAAA,CAAC,kBAAkB,EAEf,EAAA,KAAK,EAAC,uBAAuB,EAC7B,WAAW,EAAC,yDAAyD,EACrE,KAAK,EAAE,iBAAiB,CAAC,mBAAmB,EAC5C,QAAQ,EAAE,CAAC,OAAgB,KAAK,oBAAoB,CAAC,EAAE,GAAG,iBAAiB,EAAE,mBAAmB,EAAE,OAAO,EAAE,CAAC,IAJxG,yBAAyB,CAK/B,EACFA,GAAC,CAAA,kBAAkB,EAEf,EAAA,KAAK,EAAC,iBAAiB,EACvB,WAAW,EAAC,8CAA8C,EAC1D,KAAK,EAAE,iBAAiB,CAAC,cAAc,EACvC,QAAQ,EAAE,CAAC,OAAgB,KAAK,oBAAoB,CAAC,EAAE,GAAG,iBAAiB,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAA,EAJnG,oBAAoB,CAK1B,EACFA,IAAC,kBAAkB,EAAA,EAEf,KAAK,EAAC,gBAAgB,EACtB,WAAW,EAAC,yCAAyC,EACrD,KAAK,EAAE,iBAAiB,CAAC,aAAa,EACtC,QAAQ,EAAE,CAAC,OAAgB,KAAK,oBAAoB,CAAC,EAAE,GAAG,iBAAiB,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,EAJlG,EAAA,mBAAmB,CAKzB,EACFA,GAAA,CAAC,kBAAkB,EAEf,EAAA,KAAK,EAAC,eAAe,EACrB,WAAW,EAAC,wCAAwC,EACpD,KAAK,EAAE,iBAAiB,CAAC,YAAY,EACrC,QAAQ,EAAE,CAAC,OAAgB,KAAK,oBAAoB,CAAC,EAAE,GAAG,iBAAiB,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAA,EAJjG,kBAAkB,CAKxB,EACFA,GAAC,CAAA,UAAU,IAAC,KAAK,EAAC,eAAe,EAAC,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAI,CAAA,CAAA,EAAA,CACjH;AAEX,KAAC;AACL,CAAC,CAAC;;AC3MW,MAAA,uBAAuB,GAA2C;AAC3E,IAAA,YAAY,EAAE,cAAc;IAC5B,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,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;;AAGD,QAAA,oBAAoB,CAAC,IAAI,CACrB,YAAY,CAAC,iBAAiB,CAAC;AAC3B,YAAA,GAAG,EAAE,gBAAgB;AACrB,YAAA,OAAO,EAAE,gBAAgB;AACzB,YAAA,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,KAAKA,GAAA,CAAC,kBAAkB,EAAA,EAAC,KAAK,EAAE,OAAO,EAAI,CAAA;AACrE,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,oBAAe;IACX,kBAAkB,EAAE,CAAC,uBAAuB,CAAC;CACvC;;;;"}
|