import * as React from "react"; import { Observable } from "babylonjs/Misc/observable"; import { PBRMaterial } from "babylonjs/Materials/PBR/pbrMaterial"; import { Constants } from "babylonjs/Engines/constants"; import { PropertyChangedEvent } from "../../../../propertyChangedEvent"; import { LineContainerComponent } from "../../../lineContainerComponent"; import { Color3LineComponent } from "../../../lines/color3LineComponent"; import { CheckBoxLineComponent } from "../../../lines/checkBoxLineComponent"; import { Vector2LineComponent } from "../../../lines/vector2LineComponent"; import { SliderLineComponent } from "../../../lines/sliderLineComponent"; import { OptionsLineComponent } from "../../../lines/optionsLineComponent"; import { CommonMaterialPropertyGridComponent } from "./commonMaterialPropertyGridComponent"; import { TextureLinkLineComponent } from "../../../lines/textureLinkLineComponent"; import { LockObject } from "../lockObject"; import { GlobalState } from '../../../../globalState'; interface IPBRMaterialPropertyGridComponentProps { globalState: GlobalState; material: PBRMaterial; lockObject: LockObject; onSelectionChangedObservable?: Observable; onPropertyChangedObservable?: Observable; } export class PBRMaterialPropertyGridComponent extends React.Component { private _onDebugSelectionChangeObservable = new Observable(); constructor(props: IPBRMaterialPropertyGridComponentProps) { super(props); } switchAmbientMode(state: boolean) { this.props.material.debugMode = state ? 21 : 0; } switchMetallicMode(state: boolean) { this.props.material.debugMode = state ? 62 : 0; } switchRoughnessMode(state: boolean) { this.props.material.debugMode = state ? 63 : 0; } renderTextures(onDebugSelectionChangeObservable: Observable) { const material = this.props.material; return ( this.switchMetallicMode(state)} label="Metallic" texture={material.metallicTexture} propertyName="metallicTexture" material={material} onSelectionChangedObservable={this.props.onSelectionChangedObservable} onDebugSelectionChangeObservable={onDebugSelectionChangeObservable} /> this.switchRoughnessMode(state)} label="Roughness" texture={material.metallicTexture} propertyName="metallicTexture" material={material} onSelectionChangedObservable={this.props.onSelectionChangedObservable} onDebugSelectionChangeObservable={onDebugSelectionChangeObservable} /> this.switchAmbientMode(state)} label="Ambient" texture={material.ambientTexture} propertyName="ambientTexture" material={material} onSelectionChangedObservable={this.props.onSelectionChangedObservable} onDebugSelectionChangeObservable={onDebugSelectionChangeObservable} /> material.detailMap.texture = texture} onTextureRemoved={() => material.detailMap.texture = null} onSelectionChangedObservable={this.props.onSelectionChangedObservable} onDebugSelectionChangeObservable={onDebugSelectionChangeObservable} /> ); } render() { const material = this.props.material; const debugMode = [ { label: "None", value: 0 }, // Geometry { label: "Normalized position", value: 1 }, { label: "Normals", value: 2 }, { label: "Tangents", value: 3 }, { label: "Bitangents", value: 4 }, { label: "Bump Normals", value: 5 }, { label: "UV1", value: 6 }, { label: "UV2", value: 7 }, { label: "ClearCoat Normals", value: 8 }, { label: "ClearCoat Tangents", value: 9 }, { label: "ClearCoat Bitangents", value: 10 }, { label: "Anisotropic Normals", value: 11 }, { label: "Anisotropic Tangents", value: 12 }, { label: "Anisotropic Bitangents", value: 13 }, // Maps { label: "Albdeo Map", value: 20 }, { label: "Ambient Map", value: 21 }, { label: "Opacity Map", value: 22 }, { label: "Emissive Map", value: 23 }, { label: "Light Map", value: 24 }, { label: "Metallic Map", value: 25 }, { label: "Reflectivity Map", value: 26 }, { label: "ClearCoat Map", value: 27 }, { label: "ClearCoat Tint Map", value: 28 }, { label: "Sheen Map", value: 29 }, { label: "Anisotropic Map", value: 30 }, { label: "Thickness Map", value: 31 }, // Env { label: "Env Refraction", value: 40 }, { label: "Env Reflection", value: 41 }, { label: "Env Clear Coat", value: 42 }, // Lighting { label: "Direct Diffuse", value: 50 }, { label: "Direct Specular", value: 51 }, { label: "Direct Clear Coat", value: 52 }, { label: "Direct Sheen", value: 53 }, { label: "Env Irradiance", value: 54 }, // Lighting Params { label: "Surface Albedo", value: 60 }, { label: "Reflectance 0", value: 61 }, { label: "Metallic", value: 62 }, { label: "Metallic F0", value: 71 }, { label: "Roughness", value: 63 }, { label: "AlphaG", value: 64 }, { label: "NdotV", value: 65 }, { label: "ClearCoat Color", value: 66 }, { label: "ClearCoat Roughness", value: 67 }, { label: "ClearCoat NdotV", value: 68 }, { label: "Transmittance", value: 69 }, { label: "Refraction Transmittance", value: 70 }, // Misc { label: "SEO", value: 80 }, { label: "EHO", value: 81 }, { label: "Energy Factor", value: 82 }, { label: "Specular Reflectance", value: 83 }, { label: "Clear Coat Reflectance", value: 84 }, { label: "Sheen Reflectance", value: 85 }, { label: "Luminance Over Alpha", value: 86 }, { label: "Alpha", value: 87 }, ]; var realTimeFilteringQualityOptions = [ { label: "Low", value: Constants.TEXTURE_FILTERING_QUALITY_LOW }, { label: "Medium", value: Constants.TEXTURE_FILTERING_QUALITY_MEDIUM }, { label: "High", value: Constants.TEXTURE_FILTERING_QUALITY_HIGH } ]; (material.sheen as any)._useRoughness = (material.sheen as any)._useRoughness ?? material.sheen.roughness !== null; material.sheen.roughness = material.sheen.roughness ?? (material.sheen as any)._saveRoughness ?? 0; if (!(material.sheen as any)._useRoughness) { (material.sheen as any)._saveRoughness = material.sheen.roughness; material.sheen.roughness = null; } return (
{this.renderTextures(this._onDebugSelectionChangeObservable)} material.metallicReflectanceTexture = texture} onTextureRemoved={() => material.metallicReflectanceTexture = null} material={material} onSelectionChangedObservable={this.props.onSelectionChangedObservable} onDebugSelectionChangeObservable={this._onDebugSelectionChangeObservable} /> this.forceUpdate()} onPropertyChangedObservable={this.props.onPropertyChangedObservable} /> { material.clearCoat.isEnabled &&
material.clearCoat.texture = texture} onTextureRemoved={() => material.clearCoat.texture = null} material={material} onSelectionChangedObservable={this.props.onSelectionChangedObservable} onDebugSelectionChangeObservable={this._onDebugSelectionChangeObservable} /> material.clearCoat.bumpTexture = texture} onTextureRemoved={() => material.clearCoat.bumpTexture = null} material={material} onSelectionChangedObservable={this.props.onSelectionChangedObservable} onDebugSelectionChangeObservable={this._onDebugSelectionChangeObservable} /> { material.clearCoat.bumpTexture && } { material.clearCoat.isEnabled && material.clearCoat.isTintEnabled && } { material.clearCoat.isEnabled && material.clearCoat.isTintEnabled && } { material.clearCoat.isEnabled && material.clearCoat.isTintEnabled && } { material.clearCoat.isEnabled && material.clearCoat.isTintEnabled && material.clearCoat.tintTexture = texture} onTextureRemoved={() => material.clearCoat.tintTexture = null} material={material} onSelectionChangedObservable={this.props.onSelectionChangedObservable} onDebugSelectionChangeObservable={this._onDebugSelectionChangeObservable} /> }
}
this.forceUpdate()} onPropertyChangedObservable={this.props.onPropertyChangedObservable} /> { material.anisotropy.isEnabled &&
material.anisotropy.texture = texture} onTextureRemoved={() => material.anisotropy.texture = null} material={material} onSelectionChangedObservable={this.props.onSelectionChangedObservable} onDebugSelectionChangeObservable={this._onDebugSelectionChangeObservable} />
}
this.forceUpdate()} onPropertyChangedObservable={this.props.onPropertyChangedObservable} /> { material.sheen.isEnabled &&
material.sheen.texture = texture} onTextureRemoved={() => material.sheen.texture = null} material={material} onSelectionChangedObservable={this.props.onSelectionChangedObservable} onDebugSelectionChangeObservable={this._onDebugSelectionChangeObservable} /> { (material.sheen as any)._useRoughness && }
}
material.subSurface.thicknessTexture = texture} onTextureRemoved={() => material.subSurface.thicknessTexture = null} material={material} onSelectionChangedObservable={this.props.onSelectionChangedObservable} onDebugSelectionChangeObservable={this._onDebugSelectionChangeObservable} /> this.forceUpdate()} onPropertyChangedObservable={this.props.onPropertyChangedObservable} /> this.forceUpdate()} onPropertyChangedObservable={this.props.onPropertyChangedObservable} /> { (material.subSurface as any).isScatteringEnabled && material.getScene().prePassRenderer && material.getScene().subSurfaceConfiguration && } this.forceUpdate()} onPropertyChangedObservable={this.props.onPropertyChangedObservable} /> { material.subSurface.isRefractionEnabled &&
material.subSurface.refractionTexture = texture} onTextureRemoved={() => material.subSurface.refractionTexture = null} material={material} onSelectionChangedObservable={this.props.onSelectionChangedObservable} onDebugSelectionChangeObservable={this._onDebugSelectionChangeObservable} />
} this.forceUpdate()} onPropertyChangedObservable={this.props.onPropertyChangedObservable} /> { material.subSurface.isTranslucencyEnabled &&
}
{ material.bumpTexture && } { material.ambientTexture && } { material.reflectionTexture && } { material.clearCoat.texture && } { material.clearCoat.bumpTexture && } { material.clearCoat.tintTexture && false && /* level is not used for the clear coat tint texture */ } { material.anisotropy.texture && } { material.sheen.texture && } { material.subSurface.thicknessTexture && } { material.subSurface.refractionTexture && } { material.detailMap.isEnabled && <> } this.forceUpdate()} onPropertyChangedObservable={this.props.onPropertyChangedObservable} /> this.forceUpdate()} onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
); } }