variantsPropertyGridComponent.tsx 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import * as React from "react";
  2. import { Observable } from "babylonjs/Misc/observable";
  3. import { Nullable } from 'babylonjs/types';
  4. import { PropertyChangedEvent } from "../../../propertyChangedEvent";
  5. import { LineContainerComponent } from "../../lineContainerComponent";
  6. import { LockObject } from "../../../../sharedUiComponents/tabs/propertyGrids/lockObject";
  7. import { GlobalState } from "../../../globalState";
  8. import { OptionsLineComponent } from '../../../../sharedUiComponents/lines/optionsLineComponent';
  9. declare type KHR_materials_variants = import("babylonjs-loaders/glTF/2.0/Extensions/KHR_materials_variants").KHR_materials_variants;
  10. interface IVariantsPropertyGridComponentProps {
  11. globalState: GlobalState;
  12. host: any;
  13. lockObject: LockObject;
  14. onPropertyChangedObservable?: Observable<PropertyChangedEvent>;
  15. }
  16. export class VariantsPropertyGridComponent extends React.Component<IVariantsPropertyGridComponentProps> {
  17. constructor(props: IVariantsPropertyGridComponentProps) {
  18. super(props);
  19. }
  20. private _getVariantsExtension(): Nullable<KHR_materials_variants> {
  21. return this.props.globalState?.glTFLoaderExtensions["KHR_materials_variants"] as KHR_materials_variants;
  22. }
  23. render() {
  24. const extension = this._getVariantsExtension();
  25. if (!extension) {
  26. return null;
  27. }
  28. let variants: string[] = extension.getAvailableVariants(this.props.host);
  29. if (!variants || variants.length === 0) {
  30. return null;
  31. }
  32. let options = variants.sort().map((v: string, i: number) => {
  33. return {label: v, value: i + 1}
  34. });
  35. options.splice(0, 0, {label: "Original", value: 0})
  36. return (
  37. <div>
  38. <LineContainerComponent globalState={this.props.globalState} title="VARIANTS">
  39. <OptionsLineComponent
  40. label="Active variant" options={options} noDirectUpdate={true}
  41. target={this.props.host}
  42. propertyName=""
  43. onSelect={(value: number) => {
  44. if (value === 0) {
  45. extension.reset(this.props.host);
  46. } else {
  47. extension.selectVariant(this.props.host, variants[value - 1]);
  48. }
  49. this.forceUpdate();
  50. }}
  51. extractValue={() => {
  52. let lastPickedVariant = extension.getLastSelectedVariant(this.props.host) || 0;
  53. let index = 0;
  54. if (lastPickedVariant && Object.prototype.toString.call(lastPickedVariant) === '[object String]') {
  55. index = variants.indexOf(lastPickedVariant as string);
  56. if (index > -1) {
  57. index = index + 1;
  58. }
  59. }
  60. return index;
  61. }}
  62. />
  63. </LineContainerComponent>
  64. </div>
  65. );
  66. }
  67. }