import * as React from "react"; import { Nullable } from "babylonjs/types"; import { Observable } from "babylonjs/Misc/observable"; import { Tools } from "babylonjs/Misc/tools"; import { Vector3 } from "babylonjs/Maths/math.vector"; import { BaseTexture } from "babylonjs/Materials/Textures/baseTexture"; import { CubeTexture } from "babylonjs/Materials/Textures/cubeTexture"; import { ImageProcessingConfiguration } from "babylonjs/Materials/imageProcessingConfiguration"; import { Scene } from "babylonjs/scene"; import { PropertyChangedEvent } from "../../../propertyChangedEvent"; import { LineContainerComponent } from "../../lineContainerComponent"; import { RadioButtonLineComponent } from "../../../../sharedUiComponents/lines/radioLineComponent"; import { Color3LineComponent } from "../../lines/color3LineComponent"; import { CheckBoxLineComponent } from "../../../../sharedUiComponents/lines/checkBoxLineComponent"; import { FogPropertyGridComponent } from "./fogPropertyGridComponent"; import { FileButtonLineComponent } from "../../../../sharedUiComponents/lines/fileButtonLineComponent"; import { TextureLinkLineComponent } from "../../lines/textureLinkLineComponent"; import { Vector3LineComponent } from "../../lines/vector3LineComponent"; import { FloatLineComponent } from "../../lines/floatLineComponent"; import { SliderLineComponent } from "../../lines/sliderLineComponent"; import { OptionsLineComponent } from "../../lines/optionsLineComponent"; import { LockObject } from "./lockObject"; import { GlobalState } from '../../../globalState'; import { ButtonLineComponent } from '../../../../sharedUiComponents/lines/buttonLineComponent'; import { AnimationGridComponent } from './animations/animationPropertyGridComponent'; interface IScenePropertyGridComponentProps { globalState: GlobalState; scene: Scene; lockObject: LockObject; onPropertyChangedObservable?: Observable; onSelectionChangedObservable?: Observable; } export class ScenePropertyGridComponent extends React.Component { private _storedEnvironmentTexture: Nullable; private _renderingModeGroupObservable = new Observable(); constructor(props: IScenePropertyGridComponentProps) { super(props); } setRenderingModes(point: boolean, wireframe: boolean) { const scene = this.props.scene; scene.forcePointsCloud = point; scene.forceWireframe = wireframe; } switchIBL() { const scene = this.props.scene; if (scene.environmentTexture) { this._storedEnvironmentTexture = scene.environmentTexture; scene.environmentTexture = null; } else { scene.environmentTexture = this._storedEnvironmentTexture; this._storedEnvironmentTexture = null; } } updateEnvironmentTexture(file: File) { let isFileDDS = file.name.toLowerCase().indexOf(".dds") > 0; let isFileEnv = file.name.toLowerCase().indexOf(".env") > 0; if (!isFileDDS && !isFileEnv) { console.error("Unable to update environment texture. Please select a dds or env file."); return; } const scene = this.props.scene; Tools.ReadFile(file, (data) => { var blob = new Blob([data], { type: "octet/stream" }); var url = URL.createObjectURL(blob); if (isFileDDS) { scene.environmentTexture = CubeTexture.CreateFromPrefilteredData(url, scene, ".dds"); } else { scene.environmentTexture = new CubeTexture(url, scene, undefined, undefined, undefined, () => { }, (message) => { if (message) { console.error(message); } }, undefined, undefined, ".env"); } }, undefined, true); } updateGravity(newValue: Vector3) { const scene = this.props.scene; const physicsEngine = scene.getPhysicsEngine()!; physicsEngine.setGravity(newValue); } updateTimeStep(newValue: number) { const scene = this.props.scene; const physicsEngine = scene.getPhysicsEngine()!; physicsEngine.setTimeStep(newValue); } normalizeScene() { const scene = this.props.scene; scene.meshes.forEach((mesh) => { mesh.normalizeToUnitCube(true); mesh.computeWorldMatrix(true); }); } render() { const scene = this.props.scene; const physicsEngine = scene.getPhysicsEngine(); let dummy: Nullable<{ gravity: Vector3, timeStep: number }> = null; if (physicsEngine) { dummy = { gravity: physicsEngine.gravity, timeStep: physicsEngine.getTimeStep() }; } const imageProcessing = scene.imageProcessingConfiguration; var toneMappingOptions = [ { label: "Standard", value: ImageProcessingConfiguration.TONEMAPPING_STANDARD }, { label: "ACES", value: ImageProcessingConfiguration.TONEMAPPING_ACES } ]; var vignetteModeOptions = [ { label: "Multiply", value: ImageProcessingConfiguration.VIGNETTEMODE_MULTIPLY }, { label: "Opaque", value: ImageProcessingConfiguration.VIGNETTEMODE_OPAQUE } ]; return (
scene.forcePointsCloud} onSelect={() => this.setRenderingModes(true, false)} /> scene.forceWireframe} onSelect={() => this.setRenderingModes(false, true)} /> !scene.forcePointsCloud && !scene.forceWireframe} onSelect={() => this.setRenderingModes(false, false)} /> scene.environmentTexture != null} onSelect={() => this.switchIBL()} /> { scene.environmentTexture && } this.updateEnvironmentTexture(file)} accept=".dds, .env" /> this.setState({ mode: value })} /> this.setState({ mode: value })} /> { dummy !== null && this.updateTimeStep(newValue)} onPropertyChangedObservable={this.props.onPropertyChangedObservable} /> this.updateGravity(newValue)} onPropertyChangedObservable={this.props.onPropertyChangedObservable} /> } this.normalizeScene()} />
); } }