123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- import * as React from 'react';
- import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
- import { faTrash } from '@fortawesome/free-solid-svg-icons';
- import { GlobalState } from '../../../../globalState';
- import { FactorGradient } from 'babylonjs/Misc/gradients';
- import { LockObject } from '../lockObject';
- import { IParticleSystem } from 'babylonjs/Particles/IParticleSystem';
- import { ParticleSystem } from 'babylonjs/Particles/particleSystem';
- interface IFactorGradientStepGridComponent {
- globalState: GlobalState;
- gradient: FactorGradient;
- lockObject: LockObject;
- lineIndex: number;
- onDelete: () => void;
- onUpdateGradient: () => void;
- onCheckForReOrder: () => void;
- host: IParticleSystem,
- codeRecorderPropertyName: string,
- }
- export class FactorGradientStepGridComponent extends React.Component<IFactorGradientStepGridComponent, {gradient: number}> {
- constructor(props: IFactorGradientStepGridComponent) {
- super(props);
- this.state={gradient: props.gradient.gradient};
- }
- updateFactor1(factor: number) {
- this.props.gradient.factor1 = factor;
- this.props.globalState.onCodeChangedObservable.notifyObservers({
- object: this.props.host,
- code: `TARGET.${this.props.codeRecorderPropertyName}.factor1 = ${factor};`
- });
- this.props.onUpdateGradient();
- this.forceUpdate();
- }
- updateFactor2(factor: number) {
- this.props.gradient.factor2 = factor;
- this.props.globalState.onCodeChangedObservable.notifyObservers({
- object: this.props.host,
- code: `TARGET.${this.props.codeRecorderPropertyName}.factor2 = ${factor};`
- });
- this.props.onUpdateGradient();
- this.forceUpdate();
- }
-
- updateGradient(gradient: number) {
- this.props.gradient.gradient = gradient;
- this.setState({gradient: gradient});
- this.props.globalState.onCodeChangedObservable.notifyObservers({
- object: this.props.host,
- code: `TARGET.${this.props.codeRecorderPropertyName}.gradient = ${gradient};`
- });
- this.props.onUpdateGradient();
- }
- onPointerUp() {
- this.props.onCheckForReOrder();
- }
- lock() {
- if (this.props.lockObject) {
- this.props.lockObject.lock = true;
- }
- }
- unlock() {
- if (this.props.lockObject) {
- this.props.lockObject.lock = false;
- }
- }
- render() {
- let gradient = this.props.gradient;
- return (
- <div className="gradient-step">
- <div className="step">
- {`#${this.props.lineIndex}`}
- </div>
- <div className="factor1">
- <input type="number" step={"0.01"} className="numeric-input" value={gradient.factor1} onBlur={() => this.unlock()} onFocus={() => this.lock()}
- onChange={evt => this.updateFactor1(parseFloat(evt.target.value))} />
- </div>
- {
- this.props.host instanceof ParticleSystem &&
- <div className="factor2">
- <input type="number" step={"0.01"} className={"numeric-input" + ((gradient.factor1 === gradient.factor2 || gradient.factor2 === undefined) ? " grayed" : "")} value={gradient.factor2} onBlur={() => this.unlock()} onFocus={() => this.lock()}
- onChange={evt => this.updateFactor2(parseFloat(evt.target.value))} />
- </div>
- }
- <div className="step-value">
- {gradient.gradient.toFixed(2)}
- </div>
- <div className="step-slider">
- <input className="range" type="range" step={0.01} min={0} max={1.0} value={gradient.gradient}
- onPointerUp={evt => this.onPointerUp()}
- onChange={evt => this.updateGradient(parseFloat(evt.target.value))} />
- </div>
- <div className="gradient-delete" onClick={() => this.props.onDelete()}>
- <FontAwesomeIcon icon={faTrash} />
- </div>
- </div>
- )
- }
- }
|