valueGradientGridComponent.tsx 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import * as React from "react";
  2. import { GlobalState } from '../../../../globalState';
  3. import { IValueGradient, FactorGradient, ColorGradient, Color3Gradient } from 'babylonjs/Misc/gradients';
  4. import { LockObject } from '../lockObject';
  5. import { ButtonLineComponent } from '../../../../../sharedUiComponents/lines/buttonLineComponent';
  6. import { FactorGradientStepGridComponent } from './factorGradientStepGridComponent';
  7. import { Nullable } from 'babylonjs/types';
  8. import { ColorGradientStepGridComponent } from './colorGradientStepGridComponent';
  9. import { Color4, Color3 } from 'babylonjs/Maths/math.color';
  10. import { LinkButtonComponent } from '../../../lines/linkButtonComponent';
  11. import { IParticleSystem } from 'babylonjs/Particles/IParticleSystem';
  12. import { faTrash } from '@fortawesome/free-solid-svg-icons';
  13. export enum GradientGridMode {
  14. Factor,
  15. Color3,
  16. Color4
  17. }
  18. interface IValueGradientGridComponent {
  19. globalState: GlobalState;
  20. label: string;
  21. gradients: Nullable<Array<IValueGradient>>,
  22. lockObject: LockObject,
  23. docLink?: string,
  24. mode: GradientGridMode,
  25. host: IParticleSystem,
  26. codeRecorderPropertyName: string,
  27. onCreateRequired: () => void
  28. }
  29. export class ValueGradientGridComponent extends React.Component<IValueGradientGridComponent> {
  30. constructor(props: IValueGradientGridComponent) {
  31. super(props)
  32. }
  33. deleteStep(step: IValueGradient) {
  34. let gradients = this.props.gradients as Array<IValueGradient>;
  35. let index = gradients.indexOf(step);
  36. if (index > -1) {
  37. gradients.splice(index, 1);
  38. this.updateAndSync();
  39. }
  40. }
  41. addNewStep() {
  42. let gradients = this.props.gradients as Array<IValueGradient>;
  43. switch(this.props.mode) {
  44. case GradientGridMode.Factor:
  45. let newStep = new FactorGradient(1, 1, 1);
  46. gradients.push(newStep);
  47. break;
  48. case GradientGridMode.Color4:
  49. let newStepColor = new ColorGradient(1, new Color4(1, 1, 1, 1), new Color4(1, 1, 1, 1));
  50. gradients.push(newStepColor);
  51. break;
  52. case GradientGridMode.Color3:
  53. let newStepColor3 = new Color3Gradient(1, Color3.White());
  54. gradients.push(newStepColor3);
  55. break;
  56. }
  57. this.props.host.forceRefreshGradients();
  58. this.forceUpdate();
  59. }
  60. checkForReOrder() {
  61. let gradients = this.props.gradients as Array<IValueGradient>;
  62. gradients.sort((a, b) => {
  63. if (a.gradient === b.gradient) {
  64. return 0;
  65. }
  66. if (a.gradient > b.gradient) {
  67. return 1;
  68. }
  69. return -1;
  70. });
  71. this.forceUpdate();
  72. }
  73. updateAndSync() {
  74. this.props.host.forceRefreshGradients();
  75. this.forceUpdate();
  76. }
  77. render() {
  78. let gradients = this.props.gradients as Nullable<Array<IValueGradient>>;
  79. return (
  80. <div>
  81. {
  82. gradients && gradients.length > 0 &&
  83. <div className="gradient-container">
  84. <LinkButtonComponent label={this.props.label} url={this.props.docLink}
  85. icon={faTrash}
  86. onIconClick={() => {
  87. gradients!.length = 0;
  88. this.updateAndSync();
  89. }}
  90. buttonLabel="Add new step" onClick={() => this.addNewStep()} />
  91. {
  92. gradients.map((g, i) => {
  93. let codeRecorderPropertyName = this.props.codeRecorderPropertyName + `[${i}]`;
  94. switch(this.props.mode) {
  95. case GradientGridMode.Factor:
  96. return (
  97. <FactorGradientStepGridComponent globalState={this.props.globalState}
  98. lockObject={this.props.lockObject}
  99. onCheckForReOrder={() => this.checkForReOrder()}
  100. onUpdateGradient={() => this.updateAndSync()}
  101. host={this.props.host}
  102. codeRecorderPropertyName={codeRecorderPropertyName}
  103. key={"step-" + i} lineIndex={i} gradient={g as FactorGradient} onDelete={() => this.deleteStep(g)}/>
  104. );
  105. case GradientGridMode.Color4:
  106. return (
  107. <ColorGradientStepGridComponent globalState={this.props.globalState}
  108. host={this.props.host}
  109. codeRecorderPropertyName={codeRecorderPropertyName}
  110. lockObject={this.props.lockObject}
  111. isColor3={false}
  112. onCheckForReOrder={() => this.checkForReOrder()}
  113. onUpdateGradient={() => this.updateAndSync()}
  114. key={"step-" + i} lineIndex={i} gradient={g as ColorGradient} onDelete={() => this.deleteStep(g)}/>
  115. );
  116. case GradientGridMode.Color3:
  117. return (
  118. <ColorGradientStepGridComponent globalState={this.props.globalState}
  119. host={this.props.host}
  120. codeRecorderPropertyName={codeRecorderPropertyName}
  121. lockObject={this.props.lockObject}
  122. isColor3={true}
  123. onCheckForReOrder={() => this.checkForReOrder()}
  124. onUpdateGradient={() => this.updateAndSync()}
  125. key={"step-" + i} lineIndex={i} gradient={g as Color3Gradient} onDelete={() => this.deleteStep(g)}/>
  126. );
  127. }
  128. })
  129. }
  130. </div>
  131. }
  132. {
  133. (!gradients || gradients.length === 0) &&
  134. <ButtonLineComponent label={"Use " + this.props.label} onClick={() => {
  135. this.props.onCreateRequired();
  136. this.forceUpdate();
  137. }} />
  138. }
  139. </div>
  140. );
  141. }
  142. }