gltfComponent.tsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import * as React from "react";
  2. import { Scene } from "babylonjs/scene";
  3. import { LineContainerComponent } from "../../lineContainerComponent";
  4. import { CheckBoxLineComponent } from "../../lines/checkBoxLineComponent";
  5. import { GlobalState } from "../../../globalState";
  6. import { FloatLineComponent } from "../../lines/floatLineComponent";
  7. import { OptionsLineComponent } from "../../lines/optionsLineComponent";
  8. import { MessageLineComponent } from "../../lines/messageLineComponent";
  9. import { faCheck, faTimesCircle } from "@fortawesome/free-solid-svg-icons";
  10. import { TextLineComponent } from "../../lines/textLineComponent";
  11. import { GLTFLoaderCoordinateSystemMode, GLTFLoaderAnimationStartMode } from "babylonjs-loaders/glTF/index";
  12. interface IGLTFComponentProps {
  13. scene: Scene;
  14. globalState: GlobalState;
  15. }
  16. export class GLTFComponent extends React.Component<IGLTFComponentProps> {
  17. constructor(props: IGLTFComponentProps) {
  18. super(props);
  19. const extensionStates = this.props.globalState.glTFLoaderExtensionDefaults;
  20. extensionStates["MSFT_lod"] = extensionStates["MSFT_lod"] || { enabled: true, maxLODsToLoad: 10 };
  21. extensionStates["MSFT_minecraftMesh"] = extensionStates["MSFT_minecraftMesh"] || { enabled: true };
  22. extensionStates["MSFT_sRGBFactors"] = extensionStates["MSFT_sRGBFactors"] || { enabled: true };
  23. extensionStates["MSFT_audio_emitter"] = extensionStates["MSFT_audio_emitter"] || { enabled: true };
  24. extensionStates["KHR_draco_mesh_compression"] = extensionStates["KHR_draco_mesh_compression"] || { enabled: true };
  25. extensionStates["KHR_materials_pbrSpecularGlossiness"] = extensionStates["KHR_materials_pbrSpecularGlossiness"] || { enabled: true };
  26. extensionStates["KHR_materials_clearcoat"] = extensionStates["KHR_materials_clearcoat"] || { enabled: true };
  27. extensionStates["KHR_materials_sheen"] = extensionStates["KHR_materials_sheen"] || { enabled: true };
  28. extensionStates["KHR_materials_specular"] = extensionStates["KHR_materials_specular"] || { enabled: true };
  29. extensionStates["KHR_materials_unlit"] = extensionStates["KHR_materials_unlit"] || { enabled: true };
  30. extensionStates["KHR_lights_punctual"] = extensionStates["KHR_lights_punctual"] || { enabled: true };
  31. extensionStates["KHR_texture_transform"] = extensionStates["KHR_texture_transform"] || { enabled: true };
  32. extensionStates["EXT_lights_image_based"] = extensionStates["EXT_lights_image_based"] || { enabled: true };
  33. const loaderState = this.props.globalState.glTFLoaderDefaults;
  34. if (loaderState["animationStartMode"] === undefined) {
  35. loaderState["animationStartMode"] = GLTFLoaderAnimationStartMode.FIRST;
  36. }
  37. loaderState["capturePerformanceCounters"] = loaderState["capturePerformanceCounters"] || false;
  38. loaderState["compileMaterials"] = loaderState["compileMaterials"] || false;
  39. loaderState["compileShadowGenerators"] = loaderState["compileShadowGenerators"] || false;
  40. loaderState["coordinateSystemMode"] = loaderState["coordinateSystemMode"] || GLTFLoaderCoordinateSystemMode.AUTO;
  41. loaderState["loggingEnabled"] = loaderState["loggingEnabled"] || false;
  42. loaderState["transparencyAsCoverage"] = loaderState["transparencyAsCoverage"] || false;
  43. loaderState["useClipPlane"] = loaderState["useClipPlane"] || false;
  44. loaderState["validate"] = loaderState["validate"] || true;
  45. }
  46. openValidationDetails() {
  47. const validationResults = this.props.globalState.validationResults;
  48. const win = window.open("", "_blank");
  49. if (win) {
  50. // TODO: format this better and use generator registry (https://github.com/KhronosGroup/glTF-Generator-Registry)
  51. win.document.title = "glTF Validation Results";
  52. win.document.body.innerText = JSON.stringify(validationResults, null, 2);
  53. win.document.body.style.whiteSpace = "pre";
  54. win.document.body.style.fontFamily = `monospace`;
  55. win.document.body.style.fontSize = `14px`;
  56. win.focus();
  57. }
  58. }
  59. prepareText(singularForm: string, count: number) {
  60. if (count) {
  61. return `${count} ${singularForm}s`;
  62. }
  63. return `${singularForm}`;
  64. }
  65. renderValidation() {
  66. const validationResults = this.props.globalState.validationResults;
  67. const issues = validationResults.issues;
  68. return (
  69. <LineContainerComponent globalState={this.props.globalState} title="GLTF VALIDATION" closed={!issues.numErrors && !issues.numWarnings}>
  70. {
  71. issues.numErrors !== 0 &&
  72. <MessageLineComponent text="Your file has some validation issues" icon={faTimesCircle} color="Red" />
  73. }
  74. {
  75. issues.numErrors === 0 &&
  76. <MessageLineComponent text="Your file is a valid glTF file" icon={faCheck} color="Green" />
  77. }
  78. <TextLineComponent label="Errors" value={issues.numErrors.toString()} />
  79. <TextLineComponent label="Warnings" value={issues.numWarnings.toString()} />
  80. <TextLineComponent label="Infos" value={issues.numInfos.toString()} />
  81. <TextLineComponent label="Hints" value={issues.numHints.toString()} />
  82. <TextLineComponent label="More details" value="Click here" onLink={() => this.openValidationDetails()} />
  83. </LineContainerComponent>
  84. )
  85. }
  86. render() {
  87. const extensionStates = this.props.globalState.glTFLoaderExtensionDefaults;
  88. const loaderState = this.props.globalState.glTFLoaderDefaults;
  89. var animationStartMode = [
  90. { label: "None", value: GLTFLoaderAnimationStartMode.NONE },
  91. { label: "First", value: GLTFLoaderAnimationStartMode.FIRST },
  92. { label: "ALL", value: GLTFLoaderAnimationStartMode.ALL }
  93. ];
  94. var coordinateSystemMode = [
  95. { label: "Auto", value: GLTFLoaderCoordinateSystemMode.AUTO },
  96. { label: "Right handed", value: GLTFLoaderCoordinateSystemMode.FORCE_RIGHT_HANDED }
  97. ];
  98. return (
  99. <div>
  100. <LineContainerComponent globalState={this.props.globalState} title="GLTF LOADER" closed={true}>
  101. <OptionsLineComponent label="Animation start mode" options={animationStartMode} target={loaderState} propertyName="animationStartMode" />
  102. <CheckBoxLineComponent label="Capture performance counters" target={loaderState} propertyName="capturePerformanceCounters" />
  103. <CheckBoxLineComponent label="Compile materials" target={loaderState} propertyName="compileMaterials" />
  104. <CheckBoxLineComponent label="Compile shadow generators" target={loaderState} propertyName="compileShadowGenerators" />
  105. <OptionsLineComponent label="Coordinate system" options={coordinateSystemMode} target={loaderState} propertyName="coordinateSystemMode" />
  106. <CheckBoxLineComponent label="Enable logging" target={loaderState} propertyName="loggingEnabled" />
  107. <CheckBoxLineComponent label="Transparency as coverage" target={loaderState} propertyName="transparencyAsCoverage" />
  108. <CheckBoxLineComponent label="Use clip plane" target={loaderState} propertyName="useClipPlane" />
  109. <CheckBoxLineComponent label="Validate" target={loaderState} propertyName="validate" />
  110. <MessageLineComponent text="You need to reload your file to see these changes" />
  111. </LineContainerComponent>
  112. <LineContainerComponent globalState={this.props.globalState} title="GLTF EXTENSIONS" closed={true}>
  113. <CheckBoxLineComponent label="MSFT_lod" isSelected={() => extensionStates["MSFT_lod"].enabled} onSelect={value => extensionStates["MSFT_lod"].enabled = value} />
  114. <FloatLineComponent label="Maximum LODs" target={extensionStates["MSFT_lod"]} propertyName="maxLODsToLoad" additionalClass="gltf-extension-property" isInteger={true} />
  115. <CheckBoxLineComponent label="MSFT_minecraftMesh" isSelected={() => extensionStates["MSFT_minecraftMesh"].enabled} onSelect={value => extensionStates["MSFT_minecraftMesh"].enabled = value} />
  116. <CheckBoxLineComponent label="MSFT_sRGBFactors" isSelected={() => extensionStates["MSFT_sRGBFactors"].enabled} onSelect={value => extensionStates["MSFT_sRGBFactors"].enabled = value} />
  117. <CheckBoxLineComponent label="MSFT_audio_emitter" isSelected={() => extensionStates["MSFT_audio_emitter"].enabled} onSelect={value => extensionStates["MSFT_audio_emitter"].enabled = value} />
  118. <CheckBoxLineComponent label="KHR_draco_mesh_compression" isSelected={() => extensionStates["KHR_draco_mesh_compression"].enabled} onSelect={value => extensionStates["KHR_draco_mesh_compression"].enabled = value} />
  119. <CheckBoxLineComponent label="KHR_materials_pbrSpecularGlossiness" isSelected={() => extensionStates["KHR_materials_pbrSpecularGlossiness"].enabled} onSelect={value => extensionStates["KHR_materials_pbrSpecularGlossiness"].enabled = value} />
  120. <CheckBoxLineComponent label="KHR_materials_clearcoat" isSelected={() => extensionStates["KHR_materials_clearcoat"].enabled} onSelect={value => extensionStates["KHR_materials_clearcoat"].enabled = value} />
  121. <CheckBoxLineComponent label="KHR_materials_sheen" isSelected={() => extensionStates["KHR_materials_sheen"].enabled} onSelect={value => extensionStates["KHR_materials_sheen"].enabled = value} />
  122. <CheckBoxLineComponent label="KHR_materials_specular" isSelected={() => extensionStates["KHR_materials_specular"].enabled} onSelect={value => extensionStates["KHR_materials_specular"].enabled = value} />
  123. <CheckBoxLineComponent label="KHR_materials_unlit" isSelected={() => extensionStates["KHR_materials_unlit"].enabled} onSelect={value => extensionStates["KHR_materials_unlit"].enabled = value} />
  124. <CheckBoxLineComponent label="KHR_lights_punctual" isSelected={() => extensionStates["KHR_lights_punctual"].enabled} onSelect={value => extensionStates["KHR_lights_punctual"].enabled = value} />
  125. <CheckBoxLineComponent label="KHR_texture_transform" isSelected={() => extensionStates["KHR_texture_transform"].enabled} onSelect={value => extensionStates["KHR_texture_transform"].enabled = value} />
  126. <CheckBoxLineComponent label="EXT_lights_image_based" isSelected={() => extensionStates["EXT_lights_image_based"].enabled} onSelect={value => extensionStates["EXT_lights_image_based"].enabled = value} />
  127. <MessageLineComponent text="You need to reload your file to see these changes" />
  128. </LineContainerComponent>
  129. {
  130. loaderState["validate"] && this.props.globalState.validationResults &&
  131. this.renderValidation()
  132. }
  133. </div>
  134. );
  135. }
  136. }