@babylonjs/inspector 8.48.1-preview → 8.48.1
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/dist/babylon.inspector.bundle.js +3 -0
- package/dist/babylon.inspector.bundle.js.LICENSE.txt +60 -0
- package/dist/babylon.inspector.bundle.js.map +1 -0
- package/dist/babylon.inspector.bundle.max.js +3 -0
- package/dist/babylon.inspector.module.d.ts +9790 -0
- package/package.json +42 -26
- package/readme.md +17 -14
- package/lib/extensionsListService-B4-L1I2C.js +0 -367
- package/lib/extensionsListService-B4-L1I2C.js.map +0 -1
- package/lib/gif-8Ty35Toc.js +0 -2
- package/lib/gif-8Ty35Toc.js.map +0 -1
- package/lib/index-D3l4X8Gw.js +0 -20186
- package/lib/index-D3l4X8Gw.js.map +0 -1
- package/lib/index.d.ts +0 -73043
- package/lib/index.js +0 -152
- package/lib/index.js.map +0 -1
- package/lib/quickCreateToolsService-CpPuenWN.js +0 -706
- package/lib/quickCreateToolsService-CpPuenWN.js.map +0 -1
- package/lib/reflectorService-BQoH5p1A.js +0 -190
- package/lib/reflectorService-BQoH5p1A.js.map +0 -1
|
@@ -1,706 +0,0 @@
|
|
|
1
|
-
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
-
import { P as Popover, B as Button, T as TextInputPropertyLine, S as SpinButtonPropertyLine, C as CheckboxPropertyLine, V as Vector3PropertyLine, u as useProperty, M as MessageBar, a as ShellServiceIdentity, b as SceneContextIdentity, c as useObservableState, A as Accordion, d as AccordionSection } from './index-D3l4X8Gw.js';
|
|
3
|
-
import { SettingsRegular, CollectionsAdd20Regular } from '@fluentui/react-icons';
|
|
4
|
-
import '@babylonjs/core/Particles/webgl2ParticleSystem.js';
|
|
5
|
-
import { MeshBuilder } from '@babylonjs/core/Meshes/meshBuilder.js';
|
|
6
|
-
import { useState, useRef } from 'react';
|
|
7
|
-
import { FilesInput } from '@babylonjs/core/Misc/filesInput.js';
|
|
8
|
-
import { makeStyles, tokens } from '@fluentui/react-components';
|
|
9
|
-
import { NodeMaterial } from '@babylonjs/core/Materials/Node/nodeMaterial.js';
|
|
10
|
-
import { PBRMaterial } from '@babylonjs/core/Materials/PBR/pbrMaterial.js';
|
|
11
|
-
import { StandardMaterial } from '@babylonjs/core/Materials/standardMaterial.js';
|
|
12
|
-
import { PointLight } from '@babylonjs/core/Lights/pointLight.js';
|
|
13
|
-
import { DirectionalLight } from '@babylonjs/core/Lights/directionalLight.js';
|
|
14
|
-
import { SpotLight } from '@babylonjs/core/Lights/spotLight.js';
|
|
15
|
-
import { Vector3 } from '@babylonjs/core/Maths/math.vector.js';
|
|
16
|
-
import { ArcRotateCamera } from '@babylonjs/core/Cameras/arcRotateCamera.js';
|
|
17
|
-
import { UniversalCamera } from '@babylonjs/core/Cameras/universalCamera.js';
|
|
18
|
-
import { FreeCamera } from '@babylonjs/core/Cameras/freeCamera.js';
|
|
19
|
-
import { FollowCamera } from '@babylonjs/core/Cameras/followCamera.js';
|
|
20
|
-
import { FlyCamera } from '@babylonjs/core/Cameras/flyCamera.js';
|
|
21
|
-
import { GeospatialCamera } from '@babylonjs/core/Cameras/geospatialCamera.js';
|
|
22
|
-
import { ParticleSystem } from '@babylonjs/core/Particles/particleSystem.js';
|
|
23
|
-
import { GPUParticleSystem } from '@babylonjs/core/Particles/gpuParticleSystem.js';
|
|
24
|
-
import { NodeParticleSystemSet } from '@babylonjs/core/Particles/Node/nodeParticleSystemSet.js';
|
|
25
|
-
import { Texture } from '@babylonjs/core/Materials/Textures/texture.js';
|
|
26
|
-
import { DefaultRenderingPipeline } from '@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js';
|
|
27
|
-
import { SSAORenderingPipeline } from '@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js';
|
|
28
|
-
import { SSAO2RenderingPipeline } from '@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js';
|
|
29
|
-
import { SSRRenderingPipeline } from '@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js';
|
|
30
|
-
import { IblShadowsRenderPipeline } from '@babylonjs/core/Rendering/IBLShadows/iblShadowsRenderPipeline.js';
|
|
31
|
-
import { NodeRenderGraph } from '@babylonjs/core/FrameGraph/Node/nodeRenderGraph.js';
|
|
32
|
-
import { SpriteManager } from '@babylonjs/core/Sprites/spriteManager.js';
|
|
33
|
-
import '@babylonjs/core/Maths/math.color.js';
|
|
34
|
-
import '@babylonjs/core/Misc/observable.js';
|
|
35
|
-
import '@babylonjs/core/Misc/typeStore.js';
|
|
36
|
-
import '@fluentui/react-motion-components-preview';
|
|
37
|
-
import 'usehooks-ts';
|
|
38
|
-
import '@babylonjs/core/Misc/asyncLock.js';
|
|
39
|
-
import '@babylonjs/core/Misc/deferred.js';
|
|
40
|
-
import '@babylonjs/core/Misc/logger.js';
|
|
41
|
-
import '@babylonjs/core/Maths/math.scalar.functions.js';
|
|
42
|
-
import '@fluentui-contrib/react-virtualizer';
|
|
43
|
-
import '@babylonjs/addons/msdfText/fontAsset.js';
|
|
44
|
-
import '@babylonjs/addons/msdfText/textRenderer.js';
|
|
45
|
-
import '@babylonjs/core/Debug/physicsViewer.js';
|
|
46
|
-
import '@babylonjs/core/Materials/materialFlags.js';
|
|
47
|
-
import '@babylonjs/core/Meshes/Builders/groundBuilder.js';
|
|
48
|
-
import '@babylonjs/core/Misc/tools.js';
|
|
49
|
-
import '@babylonjs/core/Rendering/utilityLayerRenderer.js';
|
|
50
|
-
import '@babylonjs/materials/grid/gridMaterial.js';
|
|
51
|
-
import '@babylonjs/core/Misc/dataStorage.js';
|
|
52
|
-
import '@babylonjs/core/Instrumentation/engineInstrumentation.js';
|
|
53
|
-
import '@babylonjs/core/Instrumentation/sceneInstrumentation.js';
|
|
54
|
-
import '@babylonjs/core/Engines/AbstractEngine/abstractEngine.timeQuery.js';
|
|
55
|
-
import '@babylonjs/core/Engines/Extensions/engine.query.js';
|
|
56
|
-
import '@babylonjs/core/Engines/WebGPU/Extensions/engine.query.js';
|
|
57
|
-
import '@babylonjs/core/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js';
|
|
58
|
-
import '@babylonjs/core/Misc/PerformanceViewer/performanceViewerSceneExtension.js';
|
|
59
|
-
import '@babylonjs/core/Misc/pressureObserverWrapper.js';
|
|
60
|
-
import '@babylonjs/core/Maths/math.scalar.js';
|
|
61
|
-
import '@babylonjs/core/Misc/PerformanceViewer/performanceViewerCollector.js';
|
|
62
|
-
import '@babylonjs/core/Engines/abstractEngine.js';
|
|
63
|
-
import 'react-dom/client';
|
|
64
|
-
import '@babylonjs/core/FrameGraph/frameGraphUtils.js';
|
|
65
|
-
import '@babylonjs/core/Gizmos/cameraGizmo.js';
|
|
66
|
-
import '@babylonjs/core/Gizmos/lightGizmo.js';
|
|
67
|
-
import '@babylonjs/core/Bones/bone.js';
|
|
68
|
-
import '@babylonjs/core/Cameras/camera.js';
|
|
69
|
-
import '@babylonjs/core/Gizmos/gizmoManager.js';
|
|
70
|
-
import '@babylonjs/core/Lights/light.js';
|
|
71
|
-
import '@babylonjs/core/Meshes/abstractMesh.js';
|
|
72
|
-
import '@babylonjs/core/node.js';
|
|
73
|
-
import '@babylonjs/core/Animations/animationGroup.js';
|
|
74
|
-
import '@babylonjs/core/Animations/animation.js';
|
|
75
|
-
import '@babylonjs/core/Animations/animationPropertiesOverride.js';
|
|
76
|
-
import '@babylonjs/addons/atmosphere/atmosphere.js';
|
|
77
|
-
import '@babylonjs/core/Cameras/targetCamera.js';
|
|
78
|
-
import '@babylonjs/core/scene.js';
|
|
79
|
-
import '@babylonjs/core/FrameGraph/frameGraph.js';
|
|
80
|
-
import '@babylonjs/core/Lights/hemisphericLight.js';
|
|
81
|
-
import '@babylonjs/core/Lights/rectAreaLight.js';
|
|
82
|
-
import '@babylonjs/core/Lights/shadowLight.js';
|
|
83
|
-
import '@babylonjs/core/Lights/Shadows/cascadedShadowGenerator.js';
|
|
84
|
-
import '@babylonjs/core/Debug/directionalLightFrustumViewer.js';
|
|
85
|
-
import '@babylonjs/core/Lights/Shadows/shadowGenerator.js';
|
|
86
|
-
import '@babylonjs/core/Lights/Shadows/shadowGeneratorSceneComponent.js';
|
|
87
|
-
import '@babylonjs/core/Materials/material.js';
|
|
88
|
-
import '@babylonjs/core/Materials/multiMaterial.js';
|
|
89
|
-
import '@babylonjs/core/Materials/PBR/openpbrMaterial.js';
|
|
90
|
-
import '@babylonjs/core/Materials/PBR/pbrBaseMaterial.js';
|
|
91
|
-
import '@babylonjs/materials/sky/skyMaterial.js';
|
|
92
|
-
import '@babylonjs/core/Engines/constants.js';
|
|
93
|
-
import '@babylonjs/core/Engines/engine.js';
|
|
94
|
-
import '@babylonjs/core/Materials/Node/Blocks/gradientBlock.js';
|
|
95
|
-
import '@babylonjs/core/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes.js';
|
|
96
|
-
import '@babylonjs/core/Misc/gradients.js';
|
|
97
|
-
import '@babylonjs/core/Misc/fileTools.js';
|
|
98
|
-
import '@babylonjs/core/Materials/Textures/cubeTexture.js';
|
|
99
|
-
import '@babylonjs/core/Meshes/GaussianSplatting/gaussianSplattingMesh.js';
|
|
100
|
-
import '@babylonjs/core/Meshes/mesh.js';
|
|
101
|
-
import '@babylonjs/core/Debug/skeletonViewer.js';
|
|
102
|
-
import '@babylonjs/core/Meshes/buffer.js';
|
|
103
|
-
import '@babylonjs/core/Meshes/Builders/linesBuilder.js';
|
|
104
|
-
import '@babylonjs/core/Meshes/instancedMesh.js';
|
|
105
|
-
import '@babylonjs/core/Rendering/renderingManager.js';
|
|
106
|
-
import '@babylonjs/core/Rendering/edgesRenderer.js';
|
|
107
|
-
import '@babylonjs/core/Rendering/outlineRenderer.js';
|
|
108
|
-
import '@babylonjs/core/Particles/Node/nodeParticleSystemSet.helper.js';
|
|
109
|
-
import '@babylonjs/core/Particles/particleHelper.js';
|
|
110
|
-
import '@babylonjs/core/Particles/EmitterTypes/boxParticleEmitter.js';
|
|
111
|
-
import '@babylonjs/core/Particles/EmitterTypes/coneParticleEmitter.js';
|
|
112
|
-
import '@babylonjs/core/Particles/EmitterTypes/cylinderParticleEmitter.js';
|
|
113
|
-
import '@babylonjs/core/Particles/EmitterTypes/hemisphericParticleEmitter.js';
|
|
114
|
-
import '@babylonjs/core/Particles/EmitterTypes/meshParticleEmitter.js';
|
|
115
|
-
import '@babylonjs/core/Particles/EmitterTypes/pointParticleEmitter.js';
|
|
116
|
-
import '@babylonjs/core/Particles/EmitterTypes/sphereParticleEmitter.js';
|
|
117
|
-
import '@babylonjs/core/Particles/attractor.js';
|
|
118
|
-
import '@babylonjs/core/Meshes/Builders/sphereBuilder.js';
|
|
119
|
-
import '@babylonjs/core/Particles/Node/Blocks/particleInputBlock.js';
|
|
120
|
-
import '@babylonjs/core/Particles/Node/Blocks/Update/updateAttractorBlock.js';
|
|
121
|
-
import '@babylonjs/core/Particles/Node/Enums/nodeParticleBlockConnectionPointTypes.js';
|
|
122
|
-
import '@babylonjs/core/Meshes/transformNode.js';
|
|
123
|
-
import '@babylonjs/core/Physics/v2/IPhysicsEnginePlugin.js';
|
|
124
|
-
import '@babylonjs/core/Physics/v2/physicsEngineComponent.js';
|
|
125
|
-
import '@babylonjs/core/PostProcesses/postProcess.js';
|
|
126
|
-
import '@babylonjs/core/PostProcesses/RenderPipeline/postProcessRenderPipeline.js';
|
|
127
|
-
import '@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js';
|
|
128
|
-
import '@babylonjs/core/Materials/imageProcessingConfiguration.js';
|
|
129
|
-
import '@babylonjs/core/Bones/skeleton.js';
|
|
130
|
-
import '@babylonjs/core/Sprites/sprite.js';
|
|
131
|
-
import '@babylonjs/core/Misc/textureTools.js';
|
|
132
|
-
import '@babylonjs/core/Materials/Textures/baseTexture.js';
|
|
133
|
-
import '@babylonjs/core/Materials/Textures/multiRenderTarget.js';
|
|
134
|
-
import '@babylonjs/core/Materials/Textures/renderTargetTexture.js';
|
|
135
|
-
import '@babylonjs/core/Materials/Textures/thinTexture.js';
|
|
136
|
-
import '@babylonjs/core/Events/keyboardEvents.js';
|
|
137
|
-
import '@babylonjs/core/Events/pointerEvents.js';
|
|
138
|
-
import '@babylonjs/core/Materials/Textures/htmlElementTexture.js';
|
|
139
|
-
import '@babylonjs/core/Materials/shaderMaterial.js';
|
|
140
|
-
import '@babylonjs/core/Meshes/Builders/planeBuilder.js';
|
|
141
|
-
import '@babylonjs/core/Lights/Clustered/clusteredLightContainer.js';
|
|
142
|
-
import '@babylonjs/core/Rendering/boundingBoxRenderer.js';
|
|
143
|
-
import '@babylonjs/core/PostProcesses/RenderPipeline/postProcessRenderPipelineManagerSceneComponent.js';
|
|
144
|
-
import '@babylonjs/core/Sprites/spriteSceneComponent.js';
|
|
145
|
-
import '@babylonjs/core/Materials/Textures/dynamicTexture.js';
|
|
146
|
-
import '@babylonjs/core/Misc/equirectangularCapture.js';
|
|
147
|
-
import '@babylonjs/core/Misc/sceneRecorder.js';
|
|
148
|
-
import '@babylonjs/core/Misc/screenshotTools.js';
|
|
149
|
-
import '@babylonjs/core/Misc/videoRecorder.js';
|
|
150
|
-
import '@babylonjs/core/Misc/sceneSerializer.js';
|
|
151
|
-
import '@babylonjs/core/Misc/environmentTextureTools.js';
|
|
152
|
-
import '@babylonjs/core/Loading/sceneLoader.js';
|
|
153
|
-
import '@babylonjs/loaders/glTF/glTFFileLoader.js';
|
|
154
|
-
import '@babylonjs/loaders/glTF/glTFValidation.js';
|
|
155
|
-
import '@babylonjs/core/Engines/engineStore.js';
|
|
156
|
-
import '@babylonjs/core/Misc/uniqueIdGenerator.js';
|
|
157
|
-
import '@babylonjs/core/Debug/debugLayer.js';
|
|
158
|
-
import '@babylonjs/core/Misc/lazy.js';
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Settings popover component
|
|
162
|
-
* @param props
|
|
163
|
-
* @returns
|
|
164
|
-
*/
|
|
165
|
-
const SettingsPopover = (props) => {
|
|
166
|
-
return jsxs(Popover, { icon: SettingsRegular, children: [" ", props.children, " "] });
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
const useStyles = makeStyles({
|
|
170
|
-
section: {
|
|
171
|
-
display: "flex",
|
|
172
|
-
flexDirection: "column",
|
|
173
|
-
rowGap: tokens.spacingVerticalM,
|
|
174
|
-
},
|
|
175
|
-
row: { display: "flex", alignItems: "center", gap: "4px" },
|
|
176
|
-
});
|
|
177
|
-
/**
|
|
178
|
-
* Container component for quick create sections that provides consistent column layout with spacing
|
|
179
|
-
* @param props - Component props
|
|
180
|
-
* @returns React component
|
|
181
|
-
*/
|
|
182
|
-
const QuickCreateSection = ({ children }) => {
|
|
183
|
-
const classes = useStyles();
|
|
184
|
-
return jsx("div", { className: classes.section, children: children });
|
|
185
|
-
};
|
|
186
|
-
/**
|
|
187
|
-
* Container component for quick create rows that provides consistent row layout for button + settings popover
|
|
188
|
-
* @param props - Component props
|
|
189
|
-
* @returns React component
|
|
190
|
-
*/
|
|
191
|
-
const QuickCreateRow = ({ children }) => {
|
|
192
|
-
const classes = useStyles();
|
|
193
|
-
return jsx("div", { className: classes.row, children: children });
|
|
194
|
-
};
|
|
195
|
-
|
|
196
|
-
const SetCamera = function (scene) {
|
|
197
|
-
const camera = scene.activeCamera;
|
|
198
|
-
if (camera && camera.radius !== undefined) {
|
|
199
|
-
camera.radius = 5;
|
|
200
|
-
}
|
|
201
|
-
};
|
|
202
|
-
/**
|
|
203
|
-
* @internal
|
|
204
|
-
*/
|
|
205
|
-
const MeshesContent = ({ scene }) => {
|
|
206
|
-
const [sphereParams, setSphereParams] = useState({
|
|
207
|
-
name: "Sphere",
|
|
208
|
-
segments: 32,
|
|
209
|
-
diameter: 1,
|
|
210
|
-
diameterX: 1,
|
|
211
|
-
diameterY: 1,
|
|
212
|
-
diameterZ: 1,
|
|
213
|
-
arc: 1,
|
|
214
|
-
slice: 1,
|
|
215
|
-
uniform: true,
|
|
216
|
-
});
|
|
217
|
-
const handleSphereParamChange = (key, value) => {
|
|
218
|
-
setSphereParams((prev) => ({
|
|
219
|
-
...prev,
|
|
220
|
-
[key]: value,
|
|
221
|
-
}));
|
|
222
|
-
};
|
|
223
|
-
const [boxParams, setBoxParams] = useState({
|
|
224
|
-
name: "Box",
|
|
225
|
-
size: 1,
|
|
226
|
-
width: 1,
|
|
227
|
-
height: 1,
|
|
228
|
-
depth: 1,
|
|
229
|
-
});
|
|
230
|
-
const handleBoxParamChange = (key, value) => {
|
|
231
|
-
setBoxParams((prev) => ({
|
|
232
|
-
...prev,
|
|
233
|
-
[key]: value,
|
|
234
|
-
}));
|
|
235
|
-
};
|
|
236
|
-
const [cylinderParams, setCylinderParams] = useState({
|
|
237
|
-
name: "Cylinder",
|
|
238
|
-
height: 2,
|
|
239
|
-
diameterTop: 1,
|
|
240
|
-
diameterBottom: 1,
|
|
241
|
-
diameter: 1,
|
|
242
|
-
tessellation: 32,
|
|
243
|
-
subdivisions: 1,
|
|
244
|
-
arc: 1,
|
|
245
|
-
});
|
|
246
|
-
const handleCylinderParamChange = (key, value) => {
|
|
247
|
-
setCylinderParams((prev) => ({
|
|
248
|
-
...prev,
|
|
249
|
-
[key]: value,
|
|
250
|
-
}));
|
|
251
|
-
};
|
|
252
|
-
const [coneParams, setConeParams] = useState({
|
|
253
|
-
name: "Cone",
|
|
254
|
-
height: 2,
|
|
255
|
-
diameter: 1,
|
|
256
|
-
diameterTop: 0,
|
|
257
|
-
diameterBottom: 1,
|
|
258
|
-
tessellation: 32,
|
|
259
|
-
subdivisions: 1,
|
|
260
|
-
arc: 1,
|
|
261
|
-
});
|
|
262
|
-
const [coneUp, setConeUp] = useState(true);
|
|
263
|
-
const handleConeParamChange = (key, value) => {
|
|
264
|
-
setConeParams((prev) => ({
|
|
265
|
-
...prev,
|
|
266
|
-
[key]: value,
|
|
267
|
-
}));
|
|
268
|
-
};
|
|
269
|
-
const [groundParams, setGroundParams] = useState({
|
|
270
|
-
name: "Ground",
|
|
271
|
-
width: 10,
|
|
272
|
-
height: 10,
|
|
273
|
-
subdivisions: 1,
|
|
274
|
-
subdivisionsX: 1,
|
|
275
|
-
subdivisionsY: 1,
|
|
276
|
-
});
|
|
277
|
-
const handleGroundParamChange = (key, value) => {
|
|
278
|
-
setGroundParams((prev) => ({
|
|
279
|
-
...prev,
|
|
280
|
-
[key]: value,
|
|
281
|
-
}));
|
|
282
|
-
};
|
|
283
|
-
const fileInputRef = useRef(null);
|
|
284
|
-
const [importMeshName, setImportMeshName] = useState("ImportedMesh");
|
|
285
|
-
const handleLocalMeshImport = (event) => {
|
|
286
|
-
const files = event.target.files;
|
|
287
|
-
if (!files || files.length === 0) {
|
|
288
|
-
return;
|
|
289
|
-
}
|
|
290
|
-
const filesArray = Array.from(files);
|
|
291
|
-
if (importMeshName.trim().length > 0 && filesArray.length > 0) {
|
|
292
|
-
const originalFile = filesArray[0];
|
|
293
|
-
const extensionIndex = originalFile.name.lastIndexOf(".");
|
|
294
|
-
const extension = extensionIndex >= 0 ? originalFile.name.substring(extensionIndex) : "";
|
|
295
|
-
const sanitizedName = importMeshName.trim();
|
|
296
|
-
const desiredFileName = sanitizedName.toLowerCase().endsWith(extension.toLowerCase()) ? sanitizedName : `${sanitizedName}${extension}`;
|
|
297
|
-
filesArray[0] = new File([originalFile], desiredFileName, { type: originalFile.type, lastModified: originalFile.lastModified });
|
|
298
|
-
}
|
|
299
|
-
const filesInput = new FilesInput(scene.getEngine(), scene, null, null, null, null, null, null, (_sceneFile, _scene, message) => {
|
|
300
|
-
alert(message ? `Failed to import mesh: ${message}` : "Failed to import mesh.");
|
|
301
|
-
}, true);
|
|
302
|
-
filesInput.displayLoadingUI = false;
|
|
303
|
-
filesInput.loadFiles({ target: { files: filesArray } });
|
|
304
|
-
filesInput.dispose();
|
|
305
|
-
event.target.value = "";
|
|
306
|
-
};
|
|
307
|
-
return (jsxs(QuickCreateSection, { children: [jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: () => {
|
|
308
|
-
MeshBuilder.CreateSphere("Sphere", {}, scene);
|
|
309
|
-
SetCamera(scene);
|
|
310
|
-
}, label: "Sphere" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: sphereParams.name, onChange: (val) => handleSphereParamChange("name", val) }), jsx(SpinButtonPropertyLine, { label: "Segments", value: sphereParams.segments, min: 0, onChange: (val) => handleSphereParamChange("segments", val) }), jsx(SpinButtonPropertyLine, { label: "Diameter", value: sphereParams.diameter, min: 0, step: 0.1, onChange: (val) => handleSphereParamChange("diameter", val), disabled: !sphereParams.uniform }), jsx(CheckboxPropertyLine, { label: "Uniform", value: sphereParams.uniform, onChange: (checked) => handleSphereParamChange("uniform", checked) }), jsx(SpinButtonPropertyLine, { label: "Diameter X", value: sphereParams.diameterX, min: 0, step: 0.1, onChange: (val) => handleSphereParamChange("diameterX", val), disabled: sphereParams.uniform }), jsx(SpinButtonPropertyLine, { label: "Diameter Y", value: sphereParams.diameterY, min: 0, step: 0.1, onChange: (val) => handleSphereParamChange("diameterY", val), disabled: sphereParams.uniform }), jsx(SpinButtonPropertyLine, { label: "Diameter Z", value: sphereParams.diameterZ, min: 0, step: 0.1, onChange: (val) => handleSphereParamChange("diameterZ", val), disabled: sphereParams.uniform }), jsx(SpinButtonPropertyLine, { label: "Arc", value: sphereParams.arc, min: 0, max: 1, step: 0.1, onChange: (val) => handleSphereParamChange("arc", val) }), jsx(SpinButtonPropertyLine, { label: "Slice", value: sphereParams.slice, min: 0, max: 1, step: 0.1, onChange: (val) => handleSphereParamChange("slice", val) }), jsx("div", { style: { display: "flex", justifyContent: "flex-end", gap: 8, marginTop: 16 }, children: jsx(Button, { appearance: "primary", onClick: () => {
|
|
311
|
-
// Create params object based on uniform checkbox
|
|
312
|
-
const createParams = {
|
|
313
|
-
segments: sphereParams.segments,
|
|
314
|
-
arc: sphereParams.arc,
|
|
315
|
-
slice: sphereParams.slice,
|
|
316
|
-
};
|
|
317
|
-
if (sphereParams.uniform) {
|
|
318
|
-
// If uniform is checked, use diameter
|
|
319
|
-
createParams.diameter = sphereParams.diameter;
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
// If uniform is unchecked, use individual diameters
|
|
323
|
-
createParams.diameterX = sphereParams.diameterX;
|
|
324
|
-
createParams.diameterY = sphereParams.diameterY;
|
|
325
|
-
createParams.diameterZ = sphereParams.diameterZ;
|
|
326
|
-
}
|
|
327
|
-
MeshBuilder.CreateSphere(sphereParams.name, createParams, scene);
|
|
328
|
-
SetCamera(scene);
|
|
329
|
-
}, label: "Create" }) })] })] }), jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: () => {
|
|
330
|
-
MeshBuilder.CreateBox("Box", {}, scene);
|
|
331
|
-
SetCamera(scene);
|
|
332
|
-
}, label: "Box" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: boxParams.name, onChange: (val) => handleBoxParamChange("name", val) }), jsx(SpinButtonPropertyLine, { label: "Size", value: boxParams.size, min: 0, step: 0.1, onChange: (val) => handleBoxParamChange("size", val) }), jsx(SpinButtonPropertyLine, { label: "Width", value: boxParams.width, min: 0, step: 0.1, onChange: (val) => handleBoxParamChange("width", val) }), jsx(SpinButtonPropertyLine, { label: "Height", value: boxParams.height, min: 0, step: 0.1, onChange: (val) => handleBoxParamChange("height", val) }), jsx(SpinButtonPropertyLine, { label: "Depth", value: boxParams.depth, min: 0, step: 0.1, onChange: (val) => handleBoxParamChange("depth", val) }), jsx("div", { style: { display: "flex", justifyContent: "flex-end", gap: 8, marginTop: 16 }, children: jsx(Button, { appearance: "primary", onClick: () => {
|
|
333
|
-
MeshBuilder.CreateBox(boxParams.name, boxParams, scene);
|
|
334
|
-
SetCamera(scene);
|
|
335
|
-
}, label: "Create" }) })] })] }), jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: () => {
|
|
336
|
-
MeshBuilder.CreateCylinder("Cylinder", {}, scene);
|
|
337
|
-
SetCamera(scene);
|
|
338
|
-
}, label: "Cylinder" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: cylinderParams.name, onChange: (val) => handleCylinderParamChange("name", val) }), jsx(SpinButtonPropertyLine, { label: "Height", value: cylinderParams.height, min: 0, step: 0.1, onChange: (val) => handleCylinderParamChange("height", val) }), jsx(SpinButtonPropertyLine, { label: "Diameter Top", value: cylinderParams.diameterTop, min: 0, step: 0.1, onChange: (val) => handleCylinderParamChange("diameterTop", val) }), jsx(SpinButtonPropertyLine, { label: "Diameter Bottom", value: cylinderParams.diameterBottom, min: 0, step: 0.1, onChange: (val) => handleCylinderParamChange("diameterBottom", val) }), jsx(SpinButtonPropertyLine, { label: "Diameter", value: cylinderParams.diameter, min: 0, step: 0.1, onChange: (val) => handleCylinderParamChange("diameter", val) }), jsx(SpinButtonPropertyLine, { label: "Tessellation", value: cylinderParams.tessellation, min: 3, onChange: (val) => handleCylinderParamChange("tessellation", val) }), jsx(SpinButtonPropertyLine, { label: "Subdivisions", value: cylinderParams.subdivisions, min: 1, onChange: (val) => handleCylinderParamChange("subdivisions", val) }), jsx(SpinButtonPropertyLine, { label: "Arc", value: cylinderParams.arc, min: 0, max: 1, step: 0.1, onChange: (val) => handleCylinderParamChange("arc", val) }), jsx("div", { style: { display: "flex", justifyContent: "flex-end", gap: 8, marginTop: 16 }, children: jsx(Button, { appearance: "primary", onClick: () => {
|
|
339
|
-
MeshBuilder.CreateCylinder(cylinderParams.name, cylinderParams, scene);
|
|
340
|
-
SetCamera(scene);
|
|
341
|
-
}, label: "Create" }) })] })] }), jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: () => {
|
|
342
|
-
MeshBuilder.CreateCylinder("Cone", { diameterTop: 0 }, scene);
|
|
343
|
-
SetCamera(scene);
|
|
344
|
-
}, label: "Cone" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: coneParams.name, onChange: (val) => handleConeParamChange("name", val) }), jsx(SpinButtonPropertyLine, { label: "Height", value: coneParams.height, min: 0, step: 0.1, onChange: (val) => handleConeParamChange("height", val) }), jsx(SpinButtonPropertyLine, { label: "Diameter", value: coneParams.diameter, min: 0, step: 0.1, onChange: (val) => handleConeParamChange("diameter", val) }), jsx(SpinButtonPropertyLine, { label: "Tessellation", value: coneParams.tessellation, min: 3, onChange: (val) => handleConeParamChange("tessellation", val) }), jsx(SpinButtonPropertyLine, { label: "Subdivisions", value: coneParams.subdivisions, min: 1, onChange: (val) => handleConeParamChange("subdivisions", val) }), jsx(SpinButtonPropertyLine, { label: "Arc", value: coneParams.arc, min: 0, max: 1, step: 0.1, onChange: (val) => handleConeParamChange("arc", val) }), jsx(CheckboxPropertyLine, { label: "Up", value: coneUp, onChange: (val) => setConeUp(val) }), jsx("div", { style: { display: "flex", justifyContent: "flex-end", gap: 8, marginTop: 16 }, children: jsx(Button, { appearance: "primary", onClick: () => {
|
|
345
|
-
const coneParamsToUse = {
|
|
346
|
-
...coneParams,
|
|
347
|
-
diameterTop: coneUp ? 0 : coneParams.diameterTop,
|
|
348
|
-
diameterBottom: coneUp ? coneParams.diameterBottom : 0,
|
|
349
|
-
};
|
|
350
|
-
MeshBuilder.CreateCylinder(coneParams.name, coneParamsToUse, scene);
|
|
351
|
-
SetCamera(scene);
|
|
352
|
-
}, label: "Create" }) })] })] }), jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: () => {
|
|
353
|
-
MeshBuilder.CreateGround("Ground", {}, scene);
|
|
354
|
-
SetCamera(scene);
|
|
355
|
-
}, label: "Ground" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: groundParams.name, onChange: (val) => handleGroundParamChange("name", val) }), jsx(SpinButtonPropertyLine, { label: "Width", value: groundParams.width, min: 0, step: 0.1, onChange: (val) => handleGroundParamChange("width", val) }), jsx(SpinButtonPropertyLine, { label: "Height", value: groundParams.height, min: 0, step: 0.1, onChange: (val) => handleGroundParamChange("height", val) }), jsx(SpinButtonPropertyLine, { label: "Subdivisions", value: groundParams.subdivisions, min: 1, onChange: (val) => handleGroundParamChange("subdivisions", val) }), jsx(SpinButtonPropertyLine, { label: "Subdivisions X", value: groundParams.subdivisionsX, min: 1, onChange: (val) => handleGroundParamChange("subdivisionsX", val) }), jsx(SpinButtonPropertyLine, { label: "Subdivisions Y", value: groundParams.subdivisionsY, min: 1, onChange: (val) => handleGroundParamChange("subdivisionsY", val) }), jsx("div", { style: { display: "flex", justifyContent: "flex-end", gap: 8, marginTop: 16 }, children: jsx(Button, { appearance: "primary", onClick: () => {
|
|
356
|
-
MeshBuilder.CreateGround(groundParams.name, groundParams, scene);
|
|
357
|
-
SetCamera(scene);
|
|
358
|
-
}, label: "Create" }) })] })] }), jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: () => {
|
|
359
|
-
fileInputRef.current?.click();
|
|
360
|
-
}, label: "Import Mesh" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: importMeshName, onChange: (val) => setImportMeshName(val) }), jsx("div", { style: { display: "flex", justifyContent: "flex-end", gap: 8 }, children: jsx(Button, { appearance: "primary", onClick: () => {
|
|
361
|
-
fileInputRef.current?.click();
|
|
362
|
-
}, label: "Import" }) })] }), jsx("input", { ref: fileInputRef, type: "file", accept: ".babylon,.glb,.gltf,.obj,.stl,.ply,.mesh,.babylonmeshdata", multiple: true, style: { display: "none" }, onChange: handleLocalMeshImport })] })] }));
|
|
363
|
-
};
|
|
364
|
-
|
|
365
|
-
/**
|
|
366
|
-
* Materials content component
|
|
367
|
-
* @param props - Component props
|
|
368
|
-
* @returns React component
|
|
369
|
-
*/
|
|
370
|
-
const MaterialsContent = ({ scene }) => {
|
|
371
|
-
// Node Material state
|
|
372
|
-
const [nodeMaterialName, setNodeMaterialName] = useState("Node Material");
|
|
373
|
-
const [nodeMaterialSnippetId, setNodeMaterialSnippetId] = useState("");
|
|
374
|
-
// PBR Material state
|
|
375
|
-
const [pbrMaterialName, setPbrMaterialName] = useState("PBR Material");
|
|
376
|
-
// Standard Material state
|
|
377
|
-
const [standardMaterialName, setStandardMaterialName] = useState("Standard Material");
|
|
378
|
-
const handleCreateNodeMaterialAsync = async () => {
|
|
379
|
-
if (nodeMaterialSnippetId) {
|
|
380
|
-
try {
|
|
381
|
-
const nodeMaterial = await NodeMaterial.ParseFromSnippetAsync(nodeMaterialSnippetId, scene);
|
|
382
|
-
nodeMaterial.name = nodeMaterialName;
|
|
383
|
-
}
|
|
384
|
-
catch (e) {
|
|
385
|
-
alert("Failed to load Node Material from snippet: " + e);
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
else {
|
|
389
|
-
const nodeMaterial = new NodeMaterial(nodeMaterialName, scene);
|
|
390
|
-
nodeMaterial.build();
|
|
391
|
-
}
|
|
392
|
-
};
|
|
393
|
-
const handleCreatePBRMaterial = () => {
|
|
394
|
-
new PBRMaterial(pbrMaterialName, scene);
|
|
395
|
-
};
|
|
396
|
-
const handleCreateStandardMaterial = () => {
|
|
397
|
-
new StandardMaterial(standardMaterialName, scene);
|
|
398
|
-
};
|
|
399
|
-
return (jsxs(QuickCreateSection, { children: [jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateNodeMaterialAsync, label: "Node Material" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: nodeMaterialName, onChange: (value) => setNodeMaterialName(value) }), jsx(TextInputPropertyLine, { label: "Snippet ID", value: nodeMaterialSnippetId, onChange: (value) => setNodeMaterialSnippetId(value) }), jsx(Button, { appearance: "primary", onClick: handleCreateNodeMaterialAsync, label: "Create" })] })] }), jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreatePBRMaterial, label: "PBR Material" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: pbrMaterialName, onChange: (value) => setPbrMaterialName(value) }), jsx(Button, { appearance: "primary", onClick: handleCreatePBRMaterial, label: "Create" })] })] }), jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateStandardMaterial, label: "Standard Material" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: standardMaterialName, onChange: (value) => setStandardMaterialName(value) }), jsx(Button, { appearance: "primary", onClick: handleCreateStandardMaterial, label: "Create" })] })] })] }));
|
|
400
|
-
};
|
|
401
|
-
|
|
402
|
-
/**
|
|
403
|
-
* Lights content component
|
|
404
|
-
* @param props - Component props
|
|
405
|
-
* @returns React component
|
|
406
|
-
*/
|
|
407
|
-
const LightsContent = ({ scene }) => {
|
|
408
|
-
// Point Light state
|
|
409
|
-
const [pointLightName, setPointLightName] = useState("Point Light");
|
|
410
|
-
const [pointLightPosition, setPointLightPosition] = useState(new Vector3(0, 5, 0));
|
|
411
|
-
// Directional Light state
|
|
412
|
-
const [directionalLightName, setDirectionalLightName] = useState("Directional Light");
|
|
413
|
-
const [directionalLightDirection, setDirectionalLightDirection] = useState(new Vector3(1, -1, 0));
|
|
414
|
-
// Spotlight state
|
|
415
|
-
const [spotlightName, setSpotlightName] = useState("Spotlight");
|
|
416
|
-
const [spotlightPosition, setSpotlightPosition] = useState(new Vector3(0, 5, 0));
|
|
417
|
-
const [spotlightDirection, setSpotlightDirection] = useState(new Vector3(0, -1, 0));
|
|
418
|
-
const [spotlightAngle, setSpotlightAngle] = useState(1);
|
|
419
|
-
const [spotlightExponent, setSpotlightExponent] = useState(1);
|
|
420
|
-
const handleCreatePointLight = () => {
|
|
421
|
-
const light = new PointLight(pointLightName, pointLightPosition, scene);
|
|
422
|
-
light.intensity = 1.0;
|
|
423
|
-
};
|
|
424
|
-
const handleCreateDirectionalLight = () => {
|
|
425
|
-
const dirLight = new DirectionalLight(directionalLightName, directionalLightDirection, scene);
|
|
426
|
-
dirLight.intensity = 1.0;
|
|
427
|
-
};
|
|
428
|
-
const handleCreateSpotlight = () => {
|
|
429
|
-
const spotlight = new SpotLight(spotlightName, spotlightPosition, spotlightDirection, spotlightAngle, spotlightExponent, scene);
|
|
430
|
-
spotlight.intensity = 1.0;
|
|
431
|
-
};
|
|
432
|
-
return (jsxs(QuickCreateSection, { children: [jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreatePointLight, label: "Point Light" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: pointLightName, onChange: (value) => setPointLightName(value) }), jsx(Vector3PropertyLine, { label: "Position", value: pointLightPosition, onChange: (value) => setPointLightPosition(value) }), jsx(Button, { appearance: "primary", onClick: handleCreatePointLight, label: "Create" })] })] }), jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateDirectionalLight, label: "Directional Light" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: directionalLightName, onChange: (value) => setDirectionalLightName(value) }), jsx(Vector3PropertyLine, { label: "Direction", value: directionalLightDirection, onChange: (value) => setDirectionalLightDirection(value) }), jsx(Button, { appearance: "primary", onClick: handleCreateDirectionalLight, label: "Create" })] })] }), jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateSpotlight, label: "Spotlight" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: spotlightName, onChange: (value) => setSpotlightName(value) }), jsx(Vector3PropertyLine, { label: "Position", value: spotlightPosition, onChange: (value) => setSpotlightPosition(value) }), jsx(Vector3PropertyLine, { label: "Direction", value: spotlightDirection, onChange: (value) => setSpotlightDirection(value) }), jsx(SpinButtonPropertyLine, { label: "Angle", value: spotlightAngle, onChange: (value) => setSpotlightAngle(value), min: 0, max: Math.PI, step: 0.1 }), jsx(SpinButtonPropertyLine, { label: "Exponent", value: spotlightExponent, onChange: (value) => setSpotlightExponent(value), min: 0, max: 10, step: 0.1 }), jsx(Button, { appearance: "primary", onClick: handleCreateSpotlight, label: "Create" })] })] })] }));
|
|
433
|
-
};
|
|
434
|
-
|
|
435
|
-
/**
|
|
436
|
-
* Cameras content component
|
|
437
|
-
* @param props - Component props
|
|
438
|
-
* @returns React component
|
|
439
|
-
*/
|
|
440
|
-
const CamerasContent = ({ scene }) => {
|
|
441
|
-
// ArcRotate Camera state
|
|
442
|
-
const [arcRotateCameraName, setArcRotateCameraName] = useState("ArcRotate Camera");
|
|
443
|
-
const [arcRotateCameraTarget, setArcRotateCameraTarget] = useState(new Vector3(0, 0, 0));
|
|
444
|
-
const [arcRotateCameraRadius, setArcRotateCameraRadius] = useState(10);
|
|
445
|
-
const [arcRotateCameraAlpha, setArcRotateCameraAlpha] = useState(0);
|
|
446
|
-
const [arcRotateCameraBeta, setArcRotateCameraBeta] = useState(45);
|
|
447
|
-
const [arcRotateCameraUseRadians, setArcRotateCameraUseRadians] = useState(false);
|
|
448
|
-
// Universal Camera state
|
|
449
|
-
const [universalCameraName, setUniversalCameraName] = useState("Universal Camera");
|
|
450
|
-
const [universalCameraPosition, setUniversalCameraPosition] = useState(new Vector3(0, 1, -10));
|
|
451
|
-
// Free Camera state
|
|
452
|
-
const [freeCameraName, setFreeCameraName] = useState("Free Camera");
|
|
453
|
-
const [freeCameraPosition, setFreeCameraPosition] = useState(new Vector3(0, 1, -10));
|
|
454
|
-
// Follow Camera state
|
|
455
|
-
const [followCameraName, setFollowCameraName] = useState("Follow Camera");
|
|
456
|
-
const [followCameraPosition, setFollowCameraPosition] = useState(new Vector3(0, 5, -10));
|
|
457
|
-
const [followCameraRadius, setFollowCameraRadius] = useState(10);
|
|
458
|
-
const [followCameraHeightOffset, setFollowCameraHeightOffset] = useState(4);
|
|
459
|
-
const [followCameraRotationOffset, setFollowCameraRotationOffset] = useState(0);
|
|
460
|
-
// Fly Camera state
|
|
461
|
-
const [flyCameraName, setFlyCameraName] = useState("Fly Camera");
|
|
462
|
-
const [flyCameraPosition, setFlyCameraPosition] = useState(new Vector3(0, 1, -10));
|
|
463
|
-
// Geospatial Camera state
|
|
464
|
-
const [geospatialCameraName, setGeospatialCameraName] = useState("Geospatial Camera");
|
|
465
|
-
const [geospatialCameraPlanetRadius, setGeospatialCameraPlanetRadius] = useState(6371000);
|
|
466
|
-
const handleCreateArcRotateCamera = () => {
|
|
467
|
-
const alpha = arcRotateCameraUseRadians ? arcRotateCameraAlpha : (arcRotateCameraAlpha * Math.PI) / 180;
|
|
468
|
-
const beta = arcRotateCameraUseRadians ? arcRotateCameraBeta : (arcRotateCameraBeta * Math.PI) / 180;
|
|
469
|
-
const camera = new ArcRotateCamera(arcRotateCameraName, alpha, beta, arcRotateCameraRadius, arcRotateCameraTarget, scene);
|
|
470
|
-
camera.attachControl(scene.getEngine().getRenderingCanvas(), true);
|
|
471
|
-
if (!scene.activeCamera) {
|
|
472
|
-
scene.activeCamera = camera;
|
|
473
|
-
}
|
|
474
|
-
};
|
|
475
|
-
const handleCreateUniversalCamera = () => {
|
|
476
|
-
const camera = new UniversalCamera(universalCameraName, universalCameraPosition, scene);
|
|
477
|
-
camera.attachControl(scene.getEngine().getRenderingCanvas(), true);
|
|
478
|
-
if (!scene.activeCamera) {
|
|
479
|
-
scene.activeCamera = camera;
|
|
480
|
-
}
|
|
481
|
-
};
|
|
482
|
-
const handleCreateFreeCamera = () => {
|
|
483
|
-
const camera = new FreeCamera(freeCameraName, freeCameraPosition, scene);
|
|
484
|
-
camera.attachControl(scene.getEngine().getRenderingCanvas(), true);
|
|
485
|
-
if (!scene.activeCamera) {
|
|
486
|
-
scene.activeCamera = camera;
|
|
487
|
-
}
|
|
488
|
-
};
|
|
489
|
-
const handleCreateFollowCamera = () => {
|
|
490
|
-
const camera = new FollowCamera(followCameraName, followCameraPosition, scene);
|
|
491
|
-
camera.radius = followCameraRadius;
|
|
492
|
-
camera.heightOffset = followCameraHeightOffset;
|
|
493
|
-
camera.rotationOffset = followCameraRotationOffset;
|
|
494
|
-
camera.attachControl(true);
|
|
495
|
-
if (!scene.activeCamera) {
|
|
496
|
-
scene.activeCamera = camera;
|
|
497
|
-
}
|
|
498
|
-
};
|
|
499
|
-
const handleCreateFlyCamera = () => {
|
|
500
|
-
const camera = new FlyCamera(flyCameraName, flyCameraPosition, scene);
|
|
501
|
-
camera.attachControl(true);
|
|
502
|
-
if (!scene.activeCamera) {
|
|
503
|
-
scene.activeCamera = camera;
|
|
504
|
-
}
|
|
505
|
-
};
|
|
506
|
-
const handleCreateGeospatialCamera = () => {
|
|
507
|
-
const camera = new GeospatialCamera(geospatialCameraName, scene, { planetRadius: geospatialCameraPlanetRadius });
|
|
508
|
-
camera.attachControl(true);
|
|
509
|
-
if (!scene.activeCamera) {
|
|
510
|
-
scene.activeCamera = camera;
|
|
511
|
-
}
|
|
512
|
-
};
|
|
513
|
-
return (jsxs(QuickCreateSection, { children: [jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateArcRotateCamera, label: "ArcRotate Camera" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: arcRotateCameraName, onChange: (value) => setArcRotateCameraName(value) }), jsx(Vector3PropertyLine, { label: "Target", value: arcRotateCameraTarget, onChange: (value) => setArcRotateCameraTarget(value) }), jsx(SpinButtonPropertyLine, { label: "Radius", value: arcRotateCameraRadius, onChange: (value) => setArcRotateCameraRadius(value), min: 0.1, max: 1000, step: 0.5 }), jsx(SpinButtonPropertyLine, { label: `Alpha ${arcRotateCameraUseRadians ? "(rad)" : "(deg)"}`, value: arcRotateCameraAlpha, onChange: (value) => setArcRotateCameraAlpha(value), min: arcRotateCameraUseRadians ? -Math.PI * 2 : -360, max: arcRotateCameraUseRadians ? Math.PI * 2 : 360, step: arcRotateCameraUseRadians ? 0.1 : 5 }), jsx(SpinButtonPropertyLine, { label: `Beta ${arcRotateCameraUseRadians ? "(rad)" : "(deg)"}`, value: arcRotateCameraBeta, onChange: (value) => setArcRotateCameraBeta(value), min: arcRotateCameraUseRadians ? 0 : 0, max: arcRotateCameraUseRadians ? Math.PI : 180, step: arcRotateCameraUseRadians ? 0.1 : 5 }), jsx(CheckboxPropertyLine, { label: "Use Radians", value: arcRotateCameraUseRadians, onChange: (value) => setArcRotateCameraUseRadians(value) }), jsx(Button, { appearance: "primary", onClick: handleCreateArcRotateCamera, label: "Create" })] })] }), jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateUniversalCamera, label: "Universal Camera" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: universalCameraName, onChange: (value) => setUniversalCameraName(value) }), jsx(Vector3PropertyLine, { label: "Position", value: universalCameraPosition, onChange: (value) => setUniversalCameraPosition(value) }), jsx(Button, { appearance: "primary", onClick: handleCreateUniversalCamera, label: "Create" })] })] }), jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateFreeCamera, label: "Free Camera" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: freeCameraName, onChange: (value) => setFreeCameraName(value) }), jsx(Vector3PropertyLine, { label: "Position", value: freeCameraPosition, onChange: (value) => setFreeCameraPosition(value) }), jsx(Button, { appearance: "primary", onClick: handleCreateFreeCamera, label: "Create" })] })] }), jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateFollowCamera, label: "Follow Camera" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: followCameraName, onChange: (value) => setFollowCameraName(value) }), jsx(Vector3PropertyLine, { label: "Position", value: followCameraPosition, onChange: (value) => setFollowCameraPosition(value) }), jsx(SpinButtonPropertyLine, { label: "Radius", value: followCameraRadius, onChange: (value) => setFollowCameraRadius(value), min: 0.1, max: 1000, step: 0.5 }), jsx(SpinButtonPropertyLine, { label: "Height Offset", value: followCameraHeightOffset, onChange: (value) => setFollowCameraHeightOffset(value), min: -100, max: 100, step: 0.5 }), jsx(SpinButtonPropertyLine, { label: "Rotation Offset (deg)", value: followCameraRotationOffset, onChange: (value) => setFollowCameraRotationOffset(value), min: -180, max: 180, step: 5 }), jsx(Button, { appearance: "primary", onClick: handleCreateFollowCamera, label: "Create" })] })] }), jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateFlyCamera, label: "Fly Camera" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: flyCameraName, onChange: (value) => setFlyCameraName(value) }), jsx(Vector3PropertyLine, { label: "Position", value: flyCameraPosition, onChange: (value) => setFlyCameraPosition(value) }), jsx(Button, { appearance: "primary", onClick: handleCreateFlyCamera, label: "Create" })] })] }), jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateGeospatialCamera, label: "Geospatial Camera" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: geospatialCameraName, onChange: (value) => setGeospatialCameraName(value) }), jsx(SpinButtonPropertyLine, { label: "Planet Radius (m)", value: geospatialCameraPlanetRadius, onChange: (value) => setGeospatialCameraPlanetRadius(value), min: 1000, max: 100000000, step: 1000 }), jsx(Button, { appearance: "primary", onClick: handleCreateGeospatialCamera, label: "Create" })] })] })] }));
|
|
514
|
-
};
|
|
515
|
-
|
|
516
|
-
/**
|
|
517
|
-
* Particles content component
|
|
518
|
-
* @param props - Component props
|
|
519
|
-
* @returns React component
|
|
520
|
-
*/
|
|
521
|
-
const ParticlesContent = ({ scene }) => {
|
|
522
|
-
// CPU Particle System state
|
|
523
|
-
const [cpuParticleSystemName, setCpuParticleSystemName] = useState("Particle System");
|
|
524
|
-
const [cpuParticleSystemCapacity, setCpuParticleSystemCapacity] = useState(2000);
|
|
525
|
-
// GPU Particle System state
|
|
526
|
-
const [gpuParticleSystemName, setGpuParticleSystemName] = useState("GPU Particle System");
|
|
527
|
-
const [gpuParticleSystemCapacity, setGpuParticleSystemCapacity] = useState(2000);
|
|
528
|
-
// Node Particle System state
|
|
529
|
-
const [nodeParticleSystemName, setNodeParticleSystemName] = useState("Node Particle System");
|
|
530
|
-
const [nodeParticleSystemSnippetId, setNodeParticleSystemSnippetId] = useState("");
|
|
531
|
-
const handleCreateCPUParticleSystem = () => {
|
|
532
|
-
setTimeout(() => {
|
|
533
|
-
const system = new ParticleSystem(cpuParticleSystemName, cpuParticleSystemCapacity, scene);
|
|
534
|
-
system.particleTexture = new Texture("https://assets.babylonjs.com/textures/flare.png", scene);
|
|
535
|
-
system.start();
|
|
536
|
-
}, 0);
|
|
537
|
-
};
|
|
538
|
-
const handleCreateGPUParticleSystem = () => {
|
|
539
|
-
if (GPUParticleSystem.IsSupported) {
|
|
540
|
-
setTimeout(() => {
|
|
541
|
-
const system = new GPUParticleSystem(gpuParticleSystemName, { capacity: gpuParticleSystemCapacity }, scene);
|
|
542
|
-
system.particleTexture = new Texture("https://assets.babylonjs.com/textures/flare.png", scene);
|
|
543
|
-
system.start();
|
|
544
|
-
}, 0);
|
|
545
|
-
}
|
|
546
|
-
else {
|
|
547
|
-
alert("GPU Particle System is not supported.");
|
|
548
|
-
}
|
|
549
|
-
};
|
|
550
|
-
const handleCreateNodeParticleSystemAsync = async () => {
|
|
551
|
-
try {
|
|
552
|
-
let nodeParticleSet;
|
|
553
|
-
const snippetId = nodeParticleSystemSnippetId.trim();
|
|
554
|
-
if (snippetId) {
|
|
555
|
-
nodeParticleSet = await NodeParticleSystemSet.ParseFromSnippetAsync(snippetId);
|
|
556
|
-
nodeParticleSet.name = nodeParticleSystemName;
|
|
557
|
-
}
|
|
558
|
-
else {
|
|
559
|
-
nodeParticleSet = NodeParticleSystemSet.CreateDefault(nodeParticleSystemName);
|
|
560
|
-
}
|
|
561
|
-
const particleSystemSet = await nodeParticleSet.buildAsync(scene);
|
|
562
|
-
for (const system of particleSystemSet.systems) {
|
|
563
|
-
system.name = nodeParticleSystemName;
|
|
564
|
-
}
|
|
565
|
-
particleSystemSet.start();
|
|
566
|
-
}
|
|
567
|
-
catch (e) {
|
|
568
|
-
global.console.error("Error creating Node Particle System:", e);
|
|
569
|
-
alert("Failed to create Node Particle System: " + e);
|
|
570
|
-
}
|
|
571
|
-
};
|
|
572
|
-
return (jsxs(QuickCreateSection, { children: [jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateCPUParticleSystem, label: "CPU Particle System" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: cpuParticleSystemName, onChange: (value) => setCpuParticleSystemName(value) }), jsx(SpinButtonPropertyLine, { label: "Capacity", value: cpuParticleSystemCapacity, onChange: (value) => setCpuParticleSystemCapacity(value), min: 1, max: 100000, step: 100 }), jsx(Button, { appearance: "primary", onClick: handleCreateCPUParticleSystem, label: "Create" })] })] }), jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateGPUParticleSystem, label: "GPU Particle System" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: gpuParticleSystemName, onChange: (value) => setGpuParticleSystemName(value) }), jsx(SpinButtonPropertyLine, { label: "Capacity", value: gpuParticleSystemCapacity, onChange: (value) => setGpuParticleSystemCapacity(value), min: 1, max: 1000000, step: 1000 }), jsx(Button, { appearance: "primary", onClick: handleCreateGPUParticleSystem, label: "Create" })] })] }), jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateNodeParticleSystemAsync, label: "Node Particle System" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: nodeParticleSystemName, onChange: (value) => setNodeParticleSystemName(value) }), jsx(TextInputPropertyLine, { label: "Snippet ID", value: nodeParticleSystemSnippetId, onChange: (value) => setNodeParticleSystemSnippetId(value) }), jsx(Button, { appearance: "primary", onClick: handleCreateNodeParticleSystemAsync, label: "Create" })] })] })] }));
|
|
573
|
-
};
|
|
574
|
-
|
|
575
|
-
const GetUniquePipelineName = (baseName, scene) => {
|
|
576
|
-
const pipelines = scene.postProcessRenderPipelineManager.supportedPipelines;
|
|
577
|
-
const existingNames = new Set(pipelines.map((p) => p._name));
|
|
578
|
-
if (!existingNames.has(baseName)) {
|
|
579
|
-
return baseName;
|
|
580
|
-
}
|
|
581
|
-
let counter = 1;
|
|
582
|
-
let uniqueName = `${baseName} ${counter}`;
|
|
583
|
-
while (existingNames.has(uniqueName)) {
|
|
584
|
-
counter++;
|
|
585
|
-
uniqueName = `${baseName} ${counter}`;
|
|
586
|
-
}
|
|
587
|
-
return uniqueName;
|
|
588
|
-
};
|
|
589
|
-
/**
|
|
590
|
-
* Rendering Pipelines content component
|
|
591
|
-
* @param props - Component props
|
|
592
|
-
* @returns React component
|
|
593
|
-
*/
|
|
594
|
-
const RenderingPipelinesContent = ({ scene }) => {
|
|
595
|
-
// Default Rendering Pipeline state
|
|
596
|
-
const [defaultPipelineName, setDefaultPipelineName] = useState("Default rendering pipeline");
|
|
597
|
-
// SSAO Pipeline state
|
|
598
|
-
const [ssaoPipelineName, setSsaoPipelineName] = useState("SSAO rendering pipeline");
|
|
599
|
-
// SSAO2 Pipeline state
|
|
600
|
-
const [ssao2PipelineName, setSsao2PipelineName] = useState("SSAO2 rendering pipeline");
|
|
601
|
-
// SSR Pipeline state
|
|
602
|
-
const [ssrPipelineName, setSsrPipelineName] = useState("SSR rendering pipeline");
|
|
603
|
-
// IBL Shadows Pipeline state
|
|
604
|
-
const [iblShadowsPipelineName, setIblShadowsPipelineName] = useState("IBL Shadows rendering pipeline");
|
|
605
|
-
const handleCreateDefaultPipeline = () => {
|
|
606
|
-
const name = GetUniquePipelineName(defaultPipelineName, scene);
|
|
607
|
-
new DefaultRenderingPipeline(name, true, scene, scene.cameras);
|
|
608
|
-
};
|
|
609
|
-
const handleCreateSSAOPipeline = () => {
|
|
610
|
-
const name = GetUniquePipelineName(ssaoPipelineName, scene);
|
|
611
|
-
new SSAORenderingPipeline(name, scene, 1, scene.cameras);
|
|
612
|
-
};
|
|
613
|
-
const handleCreateSSAO2Pipeline = () => {
|
|
614
|
-
const name = GetUniquePipelineName(ssao2PipelineName, scene);
|
|
615
|
-
new SSAO2RenderingPipeline(name, scene, 1, scene.cameras);
|
|
616
|
-
};
|
|
617
|
-
const handleCreateSSRPipeline = () => {
|
|
618
|
-
const name = GetUniquePipelineName(ssrPipelineName, scene);
|
|
619
|
-
new SSRRenderingPipeline(name, scene, scene.cameras);
|
|
620
|
-
};
|
|
621
|
-
const handleCreateIBLShadowsPipeline = () => {
|
|
622
|
-
const name = GetUniquePipelineName(iblShadowsPipelineName, scene);
|
|
623
|
-
new IblShadowsRenderPipeline(name, scene, {}, scene.cameras);
|
|
624
|
-
};
|
|
625
|
-
const caps = scene.getEngine().getCaps();
|
|
626
|
-
const hasDrawBuffers = caps.drawBuffersExtension;
|
|
627
|
-
const hasTexelFetch = caps.texelFetch;
|
|
628
|
-
const camera = useProperty(scene, "activeCamera");
|
|
629
|
-
return (jsx(QuickCreateSection, { children: !camera ? (jsx(MessageBar, { message: "Cannot create rendering pipeline without an active camera.", title: "No active camera", intent: "info" })) : (jsxs(Fragment, { children: [jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateDefaultPipeline, label: "Default Pipeline" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: defaultPipelineName, onChange: (value) => setDefaultPipelineName(value) }), jsx(Button, { appearance: "primary", onClick: handleCreateDefaultPipeline, label: "Create" })] })] }), jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateSSAOPipeline, label: "SSAO Pipeline" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: ssaoPipelineName, onChange: (value) => setSsaoPipelineName(value) }), jsx(Button, { appearance: "primary", onClick: handleCreateSSAOPipeline, label: "Create" })] })] }), hasDrawBuffers && (jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateSSAO2Pipeline, label: "SSAO2 Pipeline" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: ssao2PipelineName, onChange: (value) => setSsao2PipelineName(value) }), jsx(Button, { appearance: "primary", onClick: handleCreateSSAO2Pipeline, label: "Create" })] })] })), hasDrawBuffers && hasTexelFetch && (jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateSSRPipeline, label: "SSR Pipeline" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: ssrPipelineName, onChange: (value) => setSsrPipelineName(value) }), jsx(Button, { appearance: "primary", onClick: handleCreateSSRPipeline, label: "Create" })] })] })), hasDrawBuffers && hasTexelFetch && (jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateIBLShadowsPipeline, label: "IBL Shadows Pipeline" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: iblShadowsPipelineName, onChange: (value) => setIblShadowsPipelineName(value) }), jsx(Button, { appearance: "primary", onClick: handleCreateIBLShadowsPipeline, label: "Create" })] })] }))] })) }));
|
|
630
|
-
};
|
|
631
|
-
|
|
632
|
-
/**
|
|
633
|
-
* Helper to generate a unique frame graph name
|
|
634
|
-
* @param baseName - The base name to use
|
|
635
|
-
* @param scene - The scene to check for existing frame graphs
|
|
636
|
-
* @returns A unique name
|
|
637
|
-
*/
|
|
638
|
-
function GetUniqueName(baseName, scene) {
|
|
639
|
-
let name = baseName;
|
|
640
|
-
let idSubscript = 1;
|
|
641
|
-
while (scene.getFrameGraphByName(name)) {
|
|
642
|
-
name = baseName + " " + idSubscript++;
|
|
643
|
-
}
|
|
644
|
-
return name;
|
|
645
|
-
}
|
|
646
|
-
/**
|
|
647
|
-
* Frame Graphs content component
|
|
648
|
-
* @param props - Component props
|
|
649
|
-
* @returns React component
|
|
650
|
-
*/
|
|
651
|
-
const FrameGraphsContent = ({ scene }) => {
|
|
652
|
-
// Node Render Graph state
|
|
653
|
-
const [frameGraphName, setFrameGraphName] = useState("Frame Graph");
|
|
654
|
-
const handleCreateFrameGraph = () => {
|
|
655
|
-
const uniqueName = GetUniqueName(frameGraphName, scene);
|
|
656
|
-
const newNodeRenderGraph = new NodeRenderGraph(uniqueName, scene);
|
|
657
|
-
newNodeRenderGraph.setToDefault();
|
|
658
|
-
void newNodeRenderGraph.buildAsync();
|
|
659
|
-
};
|
|
660
|
-
return (jsx(QuickCreateSection, { children: jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateFrameGraph, label: "Frame Graph" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: frameGraphName, onChange: (value) => setFrameGraphName(value) }), jsx(Button, { appearance: "primary", onClick: handleCreateFrameGraph, label: "Create" })] })] }) }));
|
|
661
|
-
};
|
|
662
|
-
|
|
663
|
-
/**
|
|
664
|
-
* Sprite Managers content component
|
|
665
|
-
* @param props - Component props
|
|
666
|
-
* @returns React component
|
|
667
|
-
*/
|
|
668
|
-
const SpriteManagersContent = ({ scene }) => {
|
|
669
|
-
// Sprite Manager state
|
|
670
|
-
const [spriteManagerName, setSpriteManagerName] = useState("Sprite Manager");
|
|
671
|
-
const [spriteManagerCapacity, setSpriteManagerCapacity] = useState(500);
|
|
672
|
-
const [spriteManagerCellSize, setSpriteManagerCellSize] = useState(64);
|
|
673
|
-
const [spriteManagerTextureUrl, setSpriteManagerTextureUrl] = useState("https://assets.babylonjs.com/textures/player.png");
|
|
674
|
-
const handleCreateSpriteManager = () => {
|
|
675
|
-
new SpriteManager(spriteManagerName, spriteManagerTextureUrl, spriteManagerCapacity, spriteManagerCellSize, scene);
|
|
676
|
-
};
|
|
677
|
-
return (jsx(QuickCreateSection, { children: jsxs(QuickCreateRow, { children: [jsx(Button, { onClick: handleCreateSpriteManager, label: "Sprite Manager" }), jsxs(SettingsPopover, { children: [jsx(TextInputPropertyLine, { label: "Name", value: spriteManagerName, onChange: (value) => setSpriteManagerName(value) }), jsx(TextInputPropertyLine, { label: "Texture URL", value: spriteManagerTextureUrl, onChange: (value) => setSpriteManagerTextureUrl(value) }), jsx(SpinButtonPropertyLine, { label: "Capacity", value: spriteManagerCapacity, onChange: (value) => setSpriteManagerCapacity(value), min: 1, max: 10000, step: 100 }), jsx(SpinButtonPropertyLine, { label: "Cell Size", value: spriteManagerCellSize, onChange: (value) => setSpriteManagerCellSize(value), min: 1, max: 1024, step: 1 }), jsx(Button, { appearance: "primary", onClick: handleCreateSpriteManager, label: "Create" })] })] }) }));
|
|
678
|
-
};
|
|
679
|
-
|
|
680
|
-
// TODO: This is just a placeholder for a dynamically installed extension that brings in asset creation tools (node materials, etc.).
|
|
681
|
-
const CreateToolsServiceDefinition = {
|
|
682
|
-
friendlyName: "Creation Tools",
|
|
683
|
-
consumes: [ShellServiceIdentity, SceneContextIdentity],
|
|
684
|
-
factory: (shellService, sceneContext) => {
|
|
685
|
-
const registration = shellService.addSidePane({
|
|
686
|
-
key: "Create",
|
|
687
|
-
title: "Creation Tools",
|
|
688
|
-
icon: CollectionsAdd20Regular,
|
|
689
|
-
horizontalLocation: "left",
|
|
690
|
-
verticalLocation: "top",
|
|
691
|
-
content: () => {
|
|
692
|
-
const scene = useObservableState(() => sceneContext.currentScene, sceneContext.currentSceneObservable);
|
|
693
|
-
return (scene && (jsx(Fragment, { children: jsxs(Accordion, { children: [jsx(AccordionSection, { title: "Meshes", children: jsx(MeshesContent, { scene: scene }) }), jsx(AccordionSection, { title: "Materials", children: jsx(MaterialsContent, { scene: scene }) }), jsx(AccordionSection, { title: "Lights", children: jsx(LightsContent, { scene: scene }) }), jsx(AccordionSection, { title: "Particles", children: jsx(ParticlesContent, { scene: scene }) }), jsx(AccordionSection, { title: "Cameras", children: jsx(CamerasContent, { scene: scene }) }), jsx(AccordionSection, { title: "Rendering Pipelines", children: jsx(RenderingPipelinesContent, { scene: scene }) }), jsx(AccordionSection, { title: "Frame Graphs", children: jsx(FrameGraphsContent, { scene: scene }) }), jsx(AccordionSection, { title: "Sprite Managers", children: jsx(SpriteManagersContent, { scene: scene }) })] }) })));
|
|
694
|
-
},
|
|
695
|
-
});
|
|
696
|
-
return {
|
|
697
|
-
dispose: () => registration.dispose(),
|
|
698
|
-
};
|
|
699
|
-
},
|
|
700
|
-
};
|
|
701
|
-
var quickCreateToolsService = {
|
|
702
|
-
serviceDefinitions: [CreateToolsServiceDefinition],
|
|
703
|
-
};
|
|
704
|
-
|
|
705
|
-
export { CreateToolsServiceDefinition, quickCreateToolsService as default };
|
|
706
|
-
//# sourceMappingURL=quickCreateToolsService-CpPuenWN.js.map
|