propertyGridTabComponent.tsx 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. import * as React from "react";
  2. import { PaneComponent, IPaneComponentProps } from "../paneComponent";
  3. import { ArcRotateCamera } from "babylonjs/Cameras/arcRotateCamera";
  4. import { FreeCamera } from "babylonjs/Cameras/freeCamera";
  5. import { AnimationGroup } from "babylonjs/Animations/animationGroup";
  6. import { Material } from "babylonjs/Materials/material";
  7. import { BackgroundMaterial } from "babylonjs/Materials/Background/backgroundMaterial";
  8. import { StandardMaterial } from "babylonjs/Materials/standardMaterial";
  9. import { PBRMaterial } from "babylonjs/Materials/PBR/pbrMaterial";
  10. import { PBRMetallicRoughnessMaterial } from "babylonjs/Materials/PBR/pbrMetallicRoughnessMaterial";
  11. import { PBRSpecularGlossinessMaterial } from "babylonjs/Materials/PBR/pbrSpecularGlossinessMaterial";
  12. import { Texture } from "babylonjs/Materials/Textures/texture";
  13. import { TransformNode } from "babylonjs/Meshes/transformNode";
  14. import { Mesh } from "babylonjs/Meshes/mesh";
  15. import { HemisphericLight } from "babylonjs/Lights/hemisphericLight";
  16. import { PointLight } from "babylonjs/Lights/pointLight";
  17. import { Scene } from "babylonjs/scene";
  18. import { MaterialPropertyGridComponent } from "./propertyGrids/materials/materialPropertyGridComponent";
  19. import { StandardMaterialPropertyGridComponent } from "./propertyGrids/materials/standardMaterialPropertyGridComponent";
  20. import { TexturePropertyGridComponent } from "./propertyGrids/materials/texturePropertyGridComponent";
  21. import { PBRMaterialPropertyGridComponent } from "./propertyGrids/materials/pbrMaterialPropertyGridComponent";
  22. import { ScenePropertyGridComponent } from "./propertyGrids/scenePropertyGridComponent";
  23. import { HemisphericLightPropertyGridComponent } from "./propertyGrids/lights/hemisphericLightPropertyGridComponent";
  24. import { PointLightPropertyGridComponent } from "./propertyGrids/lights/pointLightPropertyGridComponent";
  25. import { FreeCameraPropertyGridComponent } from "./propertyGrids/cameras/freeCameraPropertyGridComponent";
  26. import { ArcRotateCameraPropertyGridComponent } from "./propertyGrids/cameras/arcRotateCameraPropertyGridComponent";
  27. import { MeshPropertyGridComponent } from "./propertyGrids/meshes/meshPropertyGridComponent";
  28. import { TransformNodePropertyGridComponent } from "./propertyGrids/meshes/transformNodePropertyGridComponent";
  29. import { BackgroundMaterialPropertyGridComponent } from "./propertyGrids/materials/backgroundMaterialPropertyGridComponent";
  30. import { Control } from "babylonjs-gui/2D/controls/control";
  31. import { ControlPropertyGridComponent } from "./propertyGrids/gui/controlPropertyGridComponent";
  32. import { TextBlockPropertyGridComponent } from "./propertyGrids/gui/textBlockPropertyGridComponent";
  33. import { TextBlock } from "babylonjs-gui/2D/controls/textBlock";
  34. import { InputText } from "babylonjs-gui/2D/controls/inputText";
  35. import { InputTextPropertyGridComponent } from "./propertyGrids/gui/inputTextPropertyGridComponent";
  36. import { ColorPicker } from "babylonjs-gui/2D/controls/colorpicker";
  37. import { Image } from "babylonjs-gui/2D/controls/image";
  38. import { Slider } from "babylonjs-gui/2D/controls/sliders/slider";
  39. import { ImageBasedSlider } from "babylonjs-gui/2D/controls/sliders/imageBasedSlider";
  40. import { Rectangle } from "babylonjs-gui/2D/controls/rectangle";
  41. import { Ellipse } from "babylonjs-gui/2D/controls/ellipse";
  42. import { Checkbox } from "babylonjs-gui/2D/controls/checkbox";
  43. import { RadioButton } from "babylonjs-gui/2D/controls/radioButton";
  44. import { Line } from "babylonjs-gui/2D/controls/line";
  45. import { ScrollViewer } from "babylonjs-gui/2D/controls/scrollViewers/scrollViewer";
  46. import { Grid } from "babylonjs-gui/2D/controls/grid";
  47. import { StackPanel } from "babylonjs-gui/2D/controls/stackPanel";
  48. import { ColorPickerPropertyGridComponent } from "./propertyGrids/gui/colorPickerPropertyGridComponent";
  49. import { AnimationGroupGridComponent } from "./propertyGrids/animationGroupPropertyGridComponent";
  50. import { LockObject } from "./propertyGrids/lockObject";
  51. import { ImagePropertyGridComponent } from "./propertyGrids/gui/imagePropertyGridComponent";
  52. import { SliderPropertyGridComponent } from "./propertyGrids/gui/sliderPropertyGridComponent";
  53. import { ImageBasedSliderPropertyGridComponent } from "./propertyGrids/gui/imageBasedSliderPropertyGridComponent";
  54. import { RectanglePropertyGridComponent } from "./propertyGrids/gui/rectanglePropertyGridComponent";
  55. import { EllipsePropertyGridComponent } from "./propertyGrids/gui/ellipsePropertyGridComponent";
  56. import { CheckboxPropertyGridComponent } from "./propertyGrids/gui/checkboxPropertyGridComponent";
  57. import { RadioButtonPropertyGridComponent } from "./propertyGrids/gui/radioButtonPropertyGridComponent";
  58. import { LinePropertyGridComponent } from "./propertyGrids/gui/linePropertyGridComponent";
  59. import { ScrollViewerPropertyGridComponent } from "./propertyGrids/gui/scrollViewerPropertyGridComponent";
  60. import { GridPropertyGridComponent } from "./propertyGrids/gui/gridPropertyGridComponent";
  61. import { PBRMetallicRoughnessMaterialPropertyGridComponent } from "./propertyGrids/materials/pbrMetallicRoughnessMaterialPropertyGridComponent";
  62. import { PBRSpecularGlossinessMaterialPropertyGridComponent } from "./propertyGrids/materials/pbrSpecularGlossinessMaterialPropertyGridComponent";
  63. import { StackPanelPropertyGridComponent } from "./propertyGrids/gui/stackPanelPropertyGridComponent";
  64. import { PostProcess } from 'babylonjs/PostProcesses/postProcess';
  65. import { PostProcessPropertyGridComponent } from './propertyGrids/postProcesses/postProcessPropertyGridComponent';
  66. import { RenderingPipelinePropertyGridComponent } from './propertyGrids/postProcesses/renderingPipelinePropertyGridComponent';
  67. import { PostProcessRenderPipeline } from 'babylonjs/PostProcesses/RenderPipeline/postProcessRenderPipeline';
  68. import { DefaultRenderingPipelinePropertyGridComponent } from './propertyGrids/postProcesses/defaultRenderingPipelinePropertyGridComponent';
  69. import { DefaultRenderingPipeline } from 'babylonjs/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline';
  70. export class PropertyGridTabComponent extends PaneComponent {
  71. private _timerIntervalId: number;
  72. private _lockObject = new LockObject();
  73. constructor(props: IPaneComponentProps) {
  74. super(props);
  75. }
  76. timerRefresh() {
  77. if (!this._lockObject.lock) {
  78. this.forceUpdate();
  79. }
  80. }
  81. componentWillMount() {
  82. this._timerIntervalId = window.setInterval(() => this.timerRefresh(), 500);
  83. }
  84. componentWillUnmount() {
  85. window.clearInterval(this._timerIntervalId);
  86. }
  87. render() {
  88. const entity = this.props.selectedEntity;
  89. if (!entity) {
  90. return (
  91. <div className="infoMessage">
  92. Please select an entity in the scene explorer.
  93. </div>
  94. );
  95. }
  96. if (entity.getClassName) {
  97. const className = entity.getClassName();
  98. if (className.indexOf("Mesh") !== -1) {
  99. const mesh = entity as Mesh;
  100. if (mesh.getTotalVertices() > 0) {
  101. return (<MeshPropertyGridComponent mesh={mesh}
  102. lockObject={this._lockObject}
  103. onSelectionChangedObservable={this.props.onSelectionChangedObservable}
  104. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  105. }
  106. }
  107. if (className.indexOf("FreeCamera") !== -1) {
  108. const freeCamera = entity as FreeCamera;
  109. return (<FreeCameraPropertyGridComponent camera={freeCamera}
  110. lockObject={this._lockObject}
  111. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  112. }
  113. if (className.indexOf("ArcRotateCamera") !== -1) {
  114. const arcRotateCamera = entity as ArcRotateCamera;
  115. return (<ArcRotateCameraPropertyGridComponent camera={arcRotateCamera}
  116. lockObject={this._lockObject}
  117. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  118. }
  119. if (className === "HemisphericLight") {
  120. const hemisphericLight = entity as HemisphericLight;
  121. return (<HemisphericLightPropertyGridComponent
  122. light={hemisphericLight}
  123. lockObject={this._lockObject}
  124. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  125. }
  126. if (className === "PointLight") {
  127. const pointLight = entity as PointLight;
  128. return (<PointLightPropertyGridComponent
  129. light={pointLight}
  130. lockObject={this._lockObject}
  131. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  132. }
  133. if (className.indexOf("TransformNode") !== -1 || className.indexOf("Mesh") !== -1) {
  134. const transformNode = entity as TransformNode;
  135. return (<TransformNodePropertyGridComponent transformNode={transformNode}
  136. lockObject={this._lockObject}
  137. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  138. }
  139. if (className === "StandardMaterial") {
  140. const material = entity as StandardMaterial;
  141. return (<StandardMaterialPropertyGridComponent
  142. material={material}
  143. lockObject={this._lockObject}
  144. onSelectionChangedObservable={this.props.onSelectionChangedObservable}
  145. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  146. }
  147. if (className === "PBRMaterial") {
  148. const material = entity as PBRMaterial;
  149. return (<PBRMaterialPropertyGridComponent
  150. material={material}
  151. lockObject={this._lockObject}
  152. onSelectionChangedObservable={this.props.onSelectionChangedObservable}
  153. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  154. }
  155. if (className === "PBRMetallicRoughnessMaterial") {
  156. const material = entity as PBRMetallicRoughnessMaterial;
  157. return (<PBRMetallicRoughnessMaterialPropertyGridComponent
  158. material={material}
  159. lockObject={this._lockObject}
  160. onSelectionChangedObservable={this.props.onSelectionChangedObservable}
  161. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  162. }
  163. if (className === "PBRSpecularGlossinessMaterial") {
  164. const material = entity as PBRSpecularGlossinessMaterial;
  165. return (<PBRSpecularGlossinessMaterialPropertyGridComponent
  166. material={material}
  167. lockObject={this._lockObject}
  168. onSelectionChangedObservable={this.props.onSelectionChangedObservable}
  169. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  170. }
  171. if (className === "BackgroundMaterial") {
  172. const material = entity as BackgroundMaterial;
  173. return (<BackgroundMaterialPropertyGridComponent
  174. material={material}
  175. lockObject={this._lockObject}
  176. onSelectionChangedObservable={this.props.onSelectionChangedObservable}
  177. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  178. }
  179. if (className === "AnimationGroup") {
  180. const animationGroup = entity as AnimationGroup;
  181. return (<AnimationGroupGridComponent
  182. animationGroup={animationGroup}
  183. scene={this.props.scene}
  184. lockObject={this._lockObject}
  185. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  186. }
  187. if (className.indexOf("Material") !== -1) {
  188. const material = entity as Material;
  189. return (<MaterialPropertyGridComponent material={material}
  190. lockObject={this._lockObject}
  191. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  192. }
  193. if (className.indexOf("DefaultRenderingPipeline") !== -1) {
  194. const renderPipeline = entity as DefaultRenderingPipeline;
  195. return (<DefaultRenderingPipelinePropertyGridComponent renderPipeline={renderPipeline}
  196. lockObject={this._lockObject}
  197. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  198. }
  199. if (className.indexOf("RenderingPipeline") !== -1) {
  200. const renderPipeline = entity as PostProcessRenderPipeline;
  201. return (<RenderingPipelinePropertyGridComponent renderPipeline={renderPipeline}
  202. lockObject={this._lockObject}
  203. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  204. }
  205. if (className.indexOf("PostProcess") !== -1) {
  206. const postProcess = entity as PostProcess;
  207. return (<PostProcessPropertyGridComponent postProcess={postProcess}
  208. lockObject={this._lockObject}
  209. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  210. }
  211. if (className.indexOf("Texture") !== -1) {
  212. const texture = entity as Texture;
  213. return (<TexturePropertyGridComponent texture={texture}
  214. globalState={this.props.globalState}
  215. lockObject={this._lockObject}
  216. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  217. }
  218. if (className === "TextBlock") {
  219. const textBlock = entity as TextBlock;
  220. return (<TextBlockPropertyGridComponent textBlock={textBlock}
  221. lockObject={this._lockObject}
  222. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  223. }
  224. if (className === "InputText") {
  225. const inputText = entity as InputText;
  226. return (<InputTextPropertyGridComponent inputText={inputText}
  227. lockObject={this._lockObject}
  228. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  229. }
  230. if (className === "ColorPicker") {
  231. const colorPicker = entity as ColorPicker;
  232. return (<ColorPickerPropertyGridComponent colorPicker={colorPicker}
  233. lockObject={this._lockObject}
  234. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  235. }
  236. if (className === "Image") {
  237. const image = entity as Image;
  238. return (<ImagePropertyGridComponent image={image}
  239. lockObject={this._lockObject}
  240. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  241. }
  242. if (className === "Slider") {
  243. const slider = entity as Slider;
  244. return (<SliderPropertyGridComponent slider={slider}
  245. lockObject={this._lockObject}
  246. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  247. }
  248. if (className === "ImageBasedSlider") {
  249. const imageBasedSlider = entity as ImageBasedSlider;
  250. return (<ImageBasedSliderPropertyGridComponent imageBasedSlider={imageBasedSlider}
  251. lockObject={this._lockObject}
  252. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  253. }
  254. if (className === "Rectangle") {
  255. const rectangle = entity as Rectangle;
  256. return (<RectanglePropertyGridComponent rectangle={rectangle}
  257. lockObject={this._lockObject}
  258. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  259. }
  260. if (className === "StackPanel") {
  261. const stackPanel = entity as StackPanel;
  262. return (<StackPanelPropertyGridComponent stackPanel={stackPanel}
  263. lockObject={this._lockObject}
  264. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  265. }
  266. if (className === "Grid") {
  267. const grid = entity as Grid;
  268. return (<GridPropertyGridComponent grid={grid}
  269. lockObject={this._lockObject}
  270. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  271. }
  272. if (className === "ScrollViewer") {
  273. const scrollViewer = entity as ScrollViewer;
  274. return (<ScrollViewerPropertyGridComponent scrollViewer={scrollViewer}
  275. lockObject={this._lockObject}
  276. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  277. }
  278. if (className === "Ellipse") {
  279. const ellipse = entity as Ellipse;
  280. return (<EllipsePropertyGridComponent ellipse={ellipse}
  281. lockObject={this._lockObject}
  282. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  283. }
  284. if (className === "Checkbox") {
  285. const checkbox = entity as Checkbox;
  286. return (<CheckboxPropertyGridComponent checkbox={checkbox}
  287. lockObject={this._lockObject}
  288. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  289. }
  290. if (className === "RadioButton") {
  291. const radioButton = entity as RadioButton;
  292. return (<RadioButtonPropertyGridComponent radioButton={radioButton}
  293. lockObject={this._lockObject}
  294. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  295. }
  296. if (className === "Line") {
  297. const line = entity as Line;
  298. return (<LinePropertyGridComponent line={line}
  299. lockObject={this._lockObject}
  300. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  301. }
  302. if (entity._host) {
  303. const control = entity as Control;
  304. return (<ControlPropertyGridComponent control={control}
  305. lockObject={this._lockObject}
  306. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  307. }
  308. } else if (entity.transformNodes) {
  309. const scene = entity as Scene;
  310. return (<ScenePropertyGridComponent scene={scene}
  311. lockObject={this._lockObject}
  312. onSelectionChangedObservable={this.props.onSelectionChangedObservable}
  313. onPropertyChangedObservable={this.props.onPropertyChangedObservable} />);
  314. }
  315. return null;
  316. }
  317. }