textureLinkLineComponent.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import * as React from "react";
  2. import { BaseTexture, Observable, Material, Observer, Nullable } from "babylonjs";
  3. import { TextLineComponent } from "./textLineComponent";
  4. import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
  5. import { faWrench } from '@fortawesome/free-solid-svg-icons';
  6. export interface ITextureLinkLineComponentProps {
  7. label: string,
  8. texture: Nullable<BaseTexture>,
  9. material?: Material,
  10. onSelectionChangedObservable?: Observable<any>,
  11. onDebugSelectionChangeObservable?: Observable<BaseTexture>
  12. }
  13. export class TextureLinkLineComponent extends React.Component<ITextureLinkLineComponentProps, { isDebugSelected: boolean }> {
  14. private _onDebugSelectionChangeObserver: Nullable<Observer<BaseTexture>>;
  15. constructor(props: ITextureLinkLineComponentProps) {
  16. super(props);
  17. const material = this.props.material;
  18. const texture = this.props.texture;
  19. this.state = { isDebugSelected: material && material.metadata && material.metadata.debugTexture === texture };
  20. }
  21. componentWillMount() {
  22. if (!this.props.onDebugSelectionChangeObservable) {
  23. return;
  24. }
  25. this._onDebugSelectionChangeObserver = this.props.onDebugSelectionChangeObservable.add((texture) => {
  26. if (this.props.texture !== texture) {
  27. this.setState({ isDebugSelected: false });
  28. }
  29. });
  30. }
  31. componentWillUnmount() {
  32. if (this.props.onDebugSelectionChangeObservable && this._onDebugSelectionChangeObserver) {
  33. this.props.onDebugSelectionChangeObservable.remove(this._onDebugSelectionChangeObserver);
  34. }
  35. }
  36. debugTexture() {
  37. const texture = this.props.texture;
  38. const material = this.props.material;
  39. if (!material) {
  40. return;
  41. }
  42. const scene = material.getScene();
  43. if (material.metadata && material.metadata.debugTexture === texture) {
  44. const debugMaterial = material.metadata.debugMaterial;
  45. for (var mesh of scene.meshes) {
  46. if (mesh.material === debugMaterial) {
  47. mesh.material = material;
  48. }
  49. }
  50. debugMaterial.dispose();
  51. material.metadata.debugTexture = null;
  52. material.metadata.debugMaterial = null;
  53. this.setState({ isDebugSelected: false });
  54. return;
  55. }
  56. let checkMaterial = material;
  57. let needToDisposeCheckMaterial = false;
  58. if (material.metadata && material.metadata.debugTexture) {
  59. checkMaterial = material.metadata.debugMaterial;
  60. needToDisposeCheckMaterial = true;
  61. }
  62. var debugMaterial = new BABYLON.StandardMaterial("debugMaterial", scene);
  63. debugMaterial.disableLighting = true;
  64. debugMaterial.sideOrientation = material.sideOrientation;
  65. debugMaterial.emissiveTexture = texture!;
  66. debugMaterial.forceDepthWrite = true;
  67. debugMaterial.metadata = { hidden: true };
  68. for (var mesh of scene.meshes) {
  69. if (mesh.material === checkMaterial) {
  70. mesh.material = debugMaterial;
  71. }
  72. }
  73. if (!material.metadata) {
  74. material.metadata = {};
  75. }
  76. material.metadata.debugTexture = texture;
  77. material.metadata.debugMaterial = debugMaterial;
  78. if (this.props.onDebugSelectionChangeObservable) {
  79. this.props.onDebugSelectionChangeObservable.notifyObservers(texture!);
  80. }
  81. if (needToDisposeCheckMaterial) {
  82. checkMaterial.dispose();
  83. }
  84. this.setState({ isDebugSelected: true });
  85. }
  86. onLink() {
  87. if (!this.props.onSelectionChangedObservable) {
  88. return;
  89. }
  90. const texture = this.props.texture;
  91. this.props.onSelectionChangedObservable.notifyObservers(texture!);
  92. }
  93. render() {
  94. const texture = this.props.texture;
  95. if (!texture) {
  96. return null;
  97. }
  98. return (
  99. <div className="textureLinkLine">
  100. {
  101. !texture.isCube && this.props.material &&
  102. <div className={this.state.isDebugSelected ? "debug selected" : "debug"} onClick={() => this.debugTexture()} title="Render as main texture">
  103. <FontAwesomeIcon icon={faWrench} />
  104. </div>
  105. }
  106. <TextLineComponent label={this.props.label} value={texture.name} onLink={() => this.onLink()} />
  107. </div>
  108. );
  109. }
  110. }