123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- import * as React from "react";
- import { Observable } from "babylonjs/Misc/observable";
- import { NodeMaterial } from "babylonjs/Materials/Node/nodeMaterial";
- import { PropertyChangedEvent } from "../../../../propertyChangedEvent";
- import { LineContainerComponent } from "../../../lineContainerComponent";
- import { CommonMaterialPropertyGridComponent } from "./commonMaterialPropertyGridComponent";
- import { LockObject } from "../lockObject";
- import { GlobalState } from '../../../../globalState';
- import { ButtonLineComponent } from '../../../lines/buttonLineComponent';
- import { CheckBoxLineComponent } from '../../../lines/checkBoxLineComponent';
- import { FloatLineComponent } from '../../../lines/floatLineComponent';
- import { Color3LineComponent } from '../../../lines/color3LineComponent';
- import { Vector3LineComponent } from '../../../lines/vector3LineComponent';
- import { Vector4LineComponent } from '../../../lines/vector4LineComponent';
- import { Vector2LineComponent } from '../../../lines/vector2LineComponent';
- import { TextureLinkLineComponent } from '../../../lines/textureLinkLineComponent';
- import { SliderLineComponent } from '../../../lines/sliderLineComponent';
- import { NodeMaterialBlockConnectionPointTypes } from 'babylonjs/Materials/Node/Enums/nodeMaterialBlockConnectionPointTypes';
- import { InputBlock } from 'babylonjs/Materials/Node/Blocks/Input/inputBlock';
- interface INodeMaterialPropertyGridComponentProps {
- globalState: GlobalState;
- material: NodeMaterial;
- lockObject: LockObject;
- onSelectionChangedObservable?: Observable<any>;
- onPropertyChangedObservable?: Observable<PropertyChangedEvent>;
- }
- export class NodeMaterialPropertyGridComponent extends React.Component<INodeMaterialPropertyGridComponentProps> {
- private _onDebugSelectionChangeObservable = new Observable<TextureLinkLineComponent>();
-
- constructor(props: INodeMaterialPropertyGridComponentProps) {
- super(props);
- }
- edit() {
- this.props.material.edit();
- }
- renderTextures() {
- const material = this.props.material;
- const onDebugSelectionChangeObservable = this._onDebugSelectionChangeObservable;
- let textureBlocks = material.getTextureBlocks();
- if (!textureBlocks || textureBlocks.length === 0) {
- return null;
- }
- return (
- <LineContainerComponent globalState={this.props.globalState} title="TEXTURES">
- {
- textureBlocks.map((textureBlock, i) => {
- return (
- <TextureLinkLineComponent label={textureBlock.name}
- key={"nodematText" + i}
- texture={textureBlock.texture}
- material={material}
- onTextureCreated={texture => textureBlock.texture = texture}
- onSelectionChangedObservable={this.props.onSelectionChangedObservable}
- onDebugSelectionChangeObservable={onDebugSelectionChangeObservable} />
- )
- })
- }
- </LineContainerComponent>
- );
- }
- renderInputBlock(block: InputBlock) {
- switch (block.type) {
- case NodeMaterialBlockConnectionPointTypes.Float:
- let cantDisplaySlider = (isNaN(block.min) || isNaN(block.max) || block.min === block.max);
- return (
- <>
- {
- cantDisplaySlider &&
- <FloatLineComponent key={block.name} lockObject={this.props.lockObject} label={block.name} target={block} propertyName="value"
- onPropertyChangedObservable={this.props.onPropertyChangedObservable}
- />
- }
- {
- !cantDisplaySlider &&
- <SliderLineComponent key={block.name} label={block.name} target={block} propertyName="value" step={(block.max - block.min) / 100.0} minimum={block.min} maximum={block.max} onPropertyChangedObservable={this.props.onPropertyChangedObservable}/>
- }
- </>
- );
- case NodeMaterialBlockConnectionPointTypes.Color3:
- case NodeMaterialBlockConnectionPointTypes.Color4:
- return (
- <Color3LineComponent key={block.name} label={block.name} target={block} propertyName="value"
- onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
- )
- case NodeMaterialBlockConnectionPointTypes.Vector2:
- return (
- <Vector2LineComponent key={block.name} label={block.name} target={block} propertyName="value"
- onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
- )
- case NodeMaterialBlockConnectionPointTypes.Vector3:
- return (
- <Vector3LineComponent key={block.name} label={block.name} target={block} propertyName="value"
- onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
- )
- case NodeMaterialBlockConnectionPointTypes.Vector4:
- return (
- <Vector4LineComponent key={block.name} label={block.name} target={block} propertyName="value"
- onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
- )
- }
- return null;
- }
- renderInputValues() {
- let configurableInputBlocks = this.props.material.getInputBlocks().filter(block => {
- return block.visibleInInspector && block.isUniform && !block.isSystemValue
- }).sort( (a, b) => {
- return a.name.localeCompare(b.name);
- });
- if (configurableInputBlocks.length === 0) {
- return null;
- }
- let namedGroups: string[] = [];
- configurableInputBlocks.forEach(block => {
- if (!block.groupInInspector) {
- return;
- }
- if (namedGroups.indexOf(block.groupInInspector) === -1) {
- namedGroups.push(block.groupInInspector);
- }
- });
- namedGroups.sort();
- return (
- <>
- <LineContainerComponent globalState={this.props.globalState} title="INPUTS">
- {
- configurableInputBlocks.filter(block => !block.groupInInspector).map(block => {
- return this.renderInputBlock(block);
- })
- }
- </LineContainerComponent>
- {
- namedGroups.map((name, i) => {
- return (
- <LineContainerComponent key={"inputValue" + i} globalState={this.props.globalState} title={name.toUpperCase()}>
- {
- configurableInputBlocks.filter(block => block.groupInInspector === name).map(block => {
- return this.renderInputBlock(block);
- })
- }
- </LineContainerComponent>
- )
- })
- }
- </>
- );
- }
- render() {
- const material = this.props.material;
- return (
- <div className="pane">
- <CommonMaterialPropertyGridComponent globalState={this.props.globalState} lockObject={this.props.lockObject} material={material} onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
- <LineContainerComponent globalState={this.props.globalState} title="CONFIGURATION">
- <CheckBoxLineComponent label="Ignore alpha" target={material} propertyName="ignoreAlpha" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
- <ButtonLineComponent label="Node Material Editor" onClick={() => this.edit()} />
- </LineContainerComponent>
- {
- this.renderInputValues()
- }
- {
- this.renderTextures()
- }
- </div>
- );
- }
- }
|