meshPropertyGridComponent.tsx 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import * as React from "react";
  2. import { Mesh, Observable } from "babylonjs";
  3. import { PropertyChangedEvent } from "../../../../propertyChangedEvent";
  4. import { LineContainerComponent } from "../../../lineContainerComponent";
  5. import { TextLineComponent } from "../../../lines/textLineComponent";
  6. import { CheckBoxLineComponent } from "../../../lines/checkBoxLineComponent";
  7. import { Vector3LineComponent } from "../../../lines/vector3LineComponent";
  8. import { SliderLineComponent } from "../../../lines/sliderLineComponent";
  9. interface IMeshPropertyGridComponentProps {
  10. mesh: Mesh,
  11. onSelectionChangeObservable?: Observable<any>,
  12. onPropertyChangedObservable?: Observable<PropertyChangedEvent>
  13. }
  14. export class MeshPropertyGridComponent extends React.Component<IMeshPropertyGridComponentProps, { paintNormals: boolean }> {
  15. constructor(props: IMeshPropertyGridComponentProps) {
  16. super(props);
  17. this.state = { paintNormals: false }
  18. }
  19. paintNormals() {
  20. const mesh = this.props.mesh;
  21. const scene = mesh.getScene();
  22. if (!mesh.material) {
  23. return;
  24. }
  25. if (mesh.material.getClassName() === "NormalMaterial") {
  26. mesh.material.dispose();
  27. mesh.material = mesh.metadata.originalMaterial;
  28. mesh.metadata.originalMaterial = null;
  29. this.setState({ paintNormals: false });
  30. } else {
  31. if (!(BABYLON as any).NormalMaterial) {
  32. this.setState({ paintNormals: true });
  33. BABYLON.Tools.LoadScript("https://preview.babylonjs.com/materialsLibrary/babylonjs.materials.js", () => {
  34. this.paintNormals();
  35. });
  36. return;
  37. }
  38. if (!mesh.metadata) {
  39. mesh.metadata = {};
  40. }
  41. mesh.metadata.originalMaterial = mesh.material;
  42. const normalMaterial = new (BABYLON as any).NormalMaterial("normalMaterial", scene);
  43. normalMaterial.disableLighting = true;
  44. normalMaterial.sideOrientation = mesh.material.sideOrientation;
  45. normalMaterial.metadata = { hidden: true };
  46. mesh.material = normalMaterial;
  47. this.setState({ paintNormals: true });
  48. }
  49. }
  50. onMaterialLink() {
  51. if (!this.props.onSelectionChangeObservable) {
  52. return;
  53. }
  54. const mesh = this.props.mesh;
  55. this.props.onSelectionChangeObservable.notifyObservers(mesh.material)
  56. }
  57. render() {
  58. const mesh = this.props.mesh;
  59. const scene = mesh.getScene();
  60. const paintNormals = mesh.material != null && mesh.material.getClassName() === "NormalMaterial";
  61. return (
  62. <div className="pane">
  63. <LineContainerComponent title="GENERAL">
  64. <TextLineComponent label="ID" value={mesh.id} />
  65. <TextLineComponent label="Unique ID" value={mesh.uniqueId.toString()} />
  66. <TextLineComponent label="Class" value={mesh.getClassName()} />
  67. <TextLineComponent label="Vertices" value={mesh.getTotalVertices().toString()} />
  68. <TextLineComponent label="Faces" value={(mesh.getTotalIndices() / 3).toFixed(0)} />
  69. <TextLineComponent label="Sub-meshes" value={mesh.subMeshes ? mesh.subMeshes.length.toString() : "0"} />
  70. <TextLineComponent label="Has skeleton" value={mesh.skeleton ? "Yes" : "No"} />
  71. <CheckBoxLineComponent label="IsEnabled" isSelected={() => mesh.isEnabled()} onSelect={(value) => mesh.setEnabled(value)} />
  72. <CheckBoxLineComponent label="IsPickable" target={mesh} propertyName="isPickable" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  73. {
  74. mesh.material &&
  75. <TextLineComponent label="Material" value={mesh.material.name} onLink={() => this.onMaterialLink()} />
  76. }
  77. </LineContainerComponent>
  78. <LineContainerComponent title="TRANSFORMS">
  79. <Vector3LineComponent label="Position" target={mesh} propertyName="position" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  80. <Vector3LineComponent label="Rotation" target={mesh} propertyName="rotation" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  81. <Vector3LineComponent label="Scaling" target={mesh} propertyName="scaling" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  82. </LineContainerComponent>
  83. <LineContainerComponent title="DISPLAY" closed={true}>
  84. <SliderLineComponent label="Visibility" target={mesh} propertyName="visibility" minimum={0} maximum={1} step={0.01} onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  85. <CheckBoxLineComponent label="Receive shadows" target={mesh} propertyName="receiveShadows" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  86. {
  87. mesh.isVerticesDataPresent(BABYLON.VertexBuffer.ColorKind) &&
  88. <CheckBoxLineComponent label="Use vertex colors" target={mesh} propertyName="useVertexColors" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  89. }
  90. {
  91. scene.fogMode !== BABYLON.Scene.FOGMODE_NONE &&
  92. <CheckBoxLineComponent label="Apply fog" target={mesh} propertyName="applyFog" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  93. }
  94. {
  95. !mesh.parent &&
  96. <CheckBoxLineComponent label="Infinite distance" target={mesh} propertyName="infiniteDistance" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  97. }
  98. </LineContainerComponent>
  99. <LineContainerComponent title="ADVANCED" closed={true}>
  100. {
  101. mesh.useBones &&
  102. <CheckBoxLineComponent label="Compute bones using shaders" target={mesh} propertyName="computeBonesUsingShaders" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  103. }
  104. <CheckBoxLineComponent label="Collisions" target={mesh} propertyName="checkCollisions" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  105. <TextLineComponent label="Has normals" value={mesh.isVerticesDataPresent(BABYLON.VertexBuffer.NormalKind) ? "Yes" : "No"} />
  106. <TextLineComponent label="Has vertex colors" value={mesh.isVerticesDataPresent(BABYLON.VertexBuffer.ColorKind) ? "Yes" : "No"} />
  107. <TextLineComponent label="has UV set 0" value={mesh.isVerticesDataPresent(BABYLON.VertexBuffer.UVKind) ? "Yes" : "No"} />
  108. <TextLineComponent label="has UV set 1" value={mesh.isVerticesDataPresent(BABYLON.VertexBuffer.UV2Kind) ? "Yes" : "No"} />
  109. <TextLineComponent label="has UV set 2" value={mesh.isVerticesDataPresent(BABYLON.VertexBuffer.UV3Kind) ? "Yes" : "No"} />
  110. <TextLineComponent label="has UV set 3" value={mesh.isVerticesDataPresent(BABYLON.VertexBuffer.UV4Kind) ? "Yes" : "No"} />
  111. <TextLineComponent label="has tangents" value={mesh.isVerticesDataPresent(BABYLON.VertexBuffer.TangentKind) ? "Yes" : "No"} />
  112. <TextLineComponent label="has matrix weights" value={mesh.isVerticesDataPresent(BABYLON.VertexBuffer.MatricesWeightsKind) ? "Yes" : "No"} />
  113. <TextLineComponent label="has matrix indices" value={mesh.isVerticesDataPresent(BABYLON.VertexBuffer.MatricesIndicesKind) ? "Yes" : "No"} />
  114. </LineContainerComponent>
  115. <LineContainerComponent title="DEBUG" closed={true}>
  116. <CheckBoxLineComponent label="Show bounding box" target={mesh} propertyName="showBoundingBox" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
  117. <CheckBoxLineComponent label="Paint normals" isSelected={() => paintNormals} onSelect={() => this.paintNormals()} />
  118. </LineContainerComponent>
  119. </div>
  120. );
  121. }
  122. }