meshPickerComponent.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import * as React from "react";
  2. import { GlobalState } from '../../globalState';
  3. import { Observable } from 'babylonjs/Misc/observable';
  4. import { PropertyChangedEvent } from '../../propertyChangedEvent';
  5. import { Scene } from 'babylonjs/scene';
  6. import { OptionsLineComponent } from './optionsLineComponent';
  7. import { AbstractMesh } from 'babylonjs/Meshes/abstractMesh';
  8. interface IMeshPickerComponentProps {
  9. globalState: GlobalState;
  10. target: any,
  11. property: string,
  12. scene: Scene,
  13. label: string,
  14. onPropertyChangedObservable?: Observable<PropertyChangedEvent>
  15. }
  16. export class MeshPickerComponent extends React.Component<IMeshPickerComponentProps> {
  17. constructor(props: IMeshPickerComponentProps) {
  18. super(props);
  19. }
  20. render() {
  21. var meshEmitters = this.props.scene.meshes.filter(m => !!m.name);
  22. meshEmitters.sort((a, b) => a.name.localeCompare(b.name));
  23. var emitterOptions = [
  24. { label: "None", value: -1 },
  25. ];
  26. meshEmitters.sort((a, b) => a.name.localeCompare(b.name));
  27. emitterOptions.push(...meshEmitters.map((v, i) => {
  28. return {label: v.name, value: i}
  29. }));
  30. return (
  31. <>
  32. <OptionsLineComponent
  33. label={this.props.label}
  34. options={emitterOptions}
  35. target={this.props.target}
  36. propertyName={this.props.property}
  37. noDirectUpdate={true}
  38. onSelect={(value: number) => {
  39. const currentState = this.props.target[this.props.property];
  40. switch(value) {
  41. case -1:
  42. this.props.target[this.props.property] = null;
  43. break;
  44. default:
  45. this.props.target[this.props.property] = meshEmitters[value];
  46. }
  47. if (this.props.onPropertyChangedObservable) {
  48. this.props.onPropertyChangedObservable.notifyObservers({
  49. object: this.props.target,
  50. property: this.props.property,
  51. value: this.props.target[this.props.property],
  52. initialValue: currentState
  53. });
  54. }
  55. this.forceUpdate();
  56. }}
  57. extractValue={() => {
  58. if (!this.props.target[this.props.property]) {
  59. return -1;
  60. }
  61. let meshIndex = meshEmitters.indexOf(this.props.target[this.props.property] as AbstractMesh)
  62. if (meshIndex > -1) {
  63. return meshIndex;
  64. }
  65. return -1;
  66. }}
  67. />
  68. </>
  69. );
  70. }
  71. }