import * as React from "react"; import { Scene } from "babylonjs/scene"; import { LineContainerComponent } from "../../../../sharedUiComponents/lines/lineContainerComponent"; import { CheckBoxLineComponent } from "../../../../sharedUiComponents/lines/checkBoxLineComponent"; import { GlobalState } from "../../../globalState"; import { FloatLineComponent } from "../../../../sharedUiComponents/lines/floatLineComponent"; import { OptionsLineComponent } from "../../../../sharedUiComponents/lines/optionsLineComponent"; import { MessageLineComponent } from "../../../../sharedUiComponents/lines/messageLineComponent"; import { faCheck, faTimesCircle } from "@fortawesome/free-solid-svg-icons"; import { TextLineComponent } from "../../../../sharedUiComponents/lines/textLineComponent"; import { GLTFLoaderCoordinateSystemMode, GLTFLoaderAnimationStartMode } from "babylonjs-loaders/glTF/index"; import { Nullable } from "babylonjs/types"; import { Observer } from "babylonjs/Misc/observable"; import { IGLTFValidationResults } from "babylonjs-gltf2interface"; interface IGLTFComponentProps { scene: Scene; globalState: GlobalState; } export class GLTFComponent extends React.Component { private _onValidationResultsUpdatedObserver: Nullable>> = null; openValidationDetails() { const validationResults = this.props.globalState.validationResults; const win = window.open("", "_blank"); if (win) { // TODO: format this better and use generator registry (https://github.com/KhronosGroup/glTF-Generator-Registry) win.document.title = "glTF Validation Results"; win.document.body.innerText = JSON.stringify(validationResults, null, 2); win.document.body.style.whiteSpace = "pre"; win.document.body.style.fontFamily = `monospace`; win.document.body.style.fontSize = `14px`; win.focus(); } } prepareText(singularForm: string, count: number) { if (count) { return `${count} ${singularForm}s`; } return `${singularForm}`; } componentDidMount() { if (this.props.globalState) { this._onValidationResultsUpdatedObserver = this.props.globalState.onValidationResultsUpdatedObservable.add(() => { this.forceUpdate(); }); } } componentWillUnmount() { if (this.props.globalState) { if (this._onValidationResultsUpdatedObserver) { this.props.globalState.onValidationResultsUpdatedObservable.remove(this._onValidationResultsUpdatedObserver); } } } renderValidation() { const validationResults = this.props.globalState.validationResults; if (!validationResults) { return null; } const issues = validationResults.issues; return ( {issues.numErrors !== 0 && } {issues.numErrors === 0 && } this.openValidationDetails()} /> ); } render() { const extensionStates = this.props.globalState.glTFLoaderExtensionDefaults; const loaderState = this.props.globalState.glTFLoaderDefaults; var animationStartMode = (typeof GLTFLoaderAnimationStartMode !== "undefined" ? [ { label: "None", value: GLTFLoaderAnimationStartMode.NONE }, { label: "First", value: GLTFLoaderAnimationStartMode.FIRST }, { label: "ALL", value: GLTFLoaderAnimationStartMode.ALL }, ] : [ { label: "None", value: 0 }, { label: "First", value: 1 }, { label: "ALL", value: 2 }, ]); var coordinateSystemMode = typeof GLTFLoaderCoordinateSystemMode !== "undefined" ? [ { label: "Auto", value: GLTFLoaderCoordinateSystemMode.AUTO }, { label: "Right handed", value: GLTFLoaderCoordinateSystemMode.FORCE_RIGHT_HANDED }, ] : [ { label: "Auto", value: 0 }, { label: "Right handed", value: 1 }, ]; return (
extensionStates["EXT_lights_image_based"].enabled} onSelect={(value) => (extensionStates["EXT_lights_image_based"].enabled = value)} /> extensionStates["EXT_mesh_gpu_instancing"].enabled} onSelect={(value) => (extensionStates["EXT_mesh_gpu_instancing"].enabled = value)} /> extensionStates["EXT_texture_webp"].enabled} onSelect={(value) => (extensionStates["EXT_texture_webp"].enabled = value)} /> extensionStates["KHR_draco_mesh_compression"].enabled} onSelect={(value) => (extensionStates["KHR_draco_mesh_compression"].enabled = value)} /> extensionStates["KHR_materials_pbrSpecularGlossiness"].enabled} onSelect={(value) => (extensionStates["KHR_materials_pbrSpecularGlossiness"].enabled = value)} /> extensionStates["KHR_materials_clearcoat"].enabled} onSelect={(value) => (extensionStates["KHR_materials_clearcoat"].enabled = value)} /> extensionStates["KHR_materials_ior"].enabled} onSelect={(value) => (extensionStates["KHR_materials_ior"].enabled = value)} /> extensionStates["KHR_materials_sheen"].enabled} onSelect={(value) => (extensionStates["KHR_materials_sheen"].enabled = value)} /> extensionStates["KHR_materials_specular"].enabled} onSelect={(value) => (extensionStates["KHR_materials_specular"].enabled = value)} /> extensionStates["KHR_materials_unlit"].enabled} onSelect={(value) => (extensionStates["KHR_materials_unlit"].enabled = value)} /> extensionStates["KHR_materials_variants"].enabled} onSelect={(value) => (extensionStates["KHR_materials_variants"].enabled = value)} /> extensionStates["KHR_materials_transmission"].enabled} onSelect={(value) => (extensionStates["KHR_materials_transmission"].enabled = value)} /> extensionStates["KHR_materials_translucency"].enabled} onSelect={(value) => (extensionStates["KHR_materials_translucency"].enabled = value)} /> extensionStates["KHR_mesh_quantization"].enabled} onSelect={(value) => (extensionStates["KHR_mesh_quantization"].enabled = value)} /> extensionStates["KHR_lights_punctual"].enabled} onSelect={(value) => (extensionStates["KHR_lights_punctual"].enabled = value)} /> extensionStates["KHR_texture_basisu"].enabled} onSelect={(value) => (extensionStates["KHR_texture_basisu"].enabled = value)} /> extensionStates["KHR_texture_transform"].enabled} onSelect={(value) => (extensionStates["KHR_texture_transform"].enabled = value)} /> extensionStates["KHR_xmp_json_ld"].enabled} onSelect={(value) => (extensionStates["KHR_xmp_json_ld"].enabled = value)} /> extensionStates["MSFT_lod"].enabled} onSelect={(value) => (extensionStates["MSFT_lod"].enabled = value)} /> extensionStates["MSFT_minecraftMesh"].enabled} onSelect={(value) => (extensionStates["MSFT_minecraftMesh"].enabled = value)} /> extensionStates["MSFT_sRGBFactors"].enabled} onSelect={(value) => (extensionStates["MSFT_sRGBFactors"].enabled = value)} /> extensionStates["MSFT_audio_emitter"].enabled} onSelect={(value) => (extensionStates["MSFT_audio_emitter"].enabled = value)} /> {loaderState["validate"] && this.props.globalState.validationResults && this.renderValidation()}
); } }