import * as React from "react"; import { GlobalState } from '../../../globalState'; import { BaseTexture } from 'babylonjs/Materials/Textures/baseTexture'; import { FileButtonLineComponent } from '../../../sharedComponents/fileButtonLineComponent'; import { Tools } from 'babylonjs/Misc/tools'; import { TextureNodeModel } from './textureNodeModel'; import { TextLineComponent } from '../../../sharedComponents/textLineComponent'; import { LineContainerComponent } from '../../../sharedComponents/lineContainerComponent'; import { TextInputLineComponent } from '../../../sharedComponents/textInputLineComponent'; import { CheckBoxLineComponent } from '../../../sharedComponents/checkBoxLineComponent'; import { Texture } from 'babylonjs/Materials/Textures/texture'; import { SliderLineComponent } from '../../../sharedComponents/sliderLineComponent'; import { FloatLineComponent } from '../../../sharedComponents/floatLineComponent'; import { ButtonLineComponent } from '../../../sharedComponents/buttonLineComponent'; interface ITexturePropertyTabComponentProps { globalState: GlobalState; node: TextureNodeModel; } export class TexturePropertyTabComponent extends React.Component { constructor(props: ITexturePropertyTabComponentProps) { super(props); let texture = this.props.node.texture as BaseTexture; this.state = {isEmbedded: !texture || texture.name.substring(0, 4) !== "http"}; } UNSAFE_componentWillUpdate(nextProps: ITexturePropertyTabComponentProps, nextState: {isEmbedded: boolean}) { if (nextProps.node !== this.props.node) { let texture = nextProps.node.texture as BaseTexture; nextState.isEmbedded = !texture || texture.name.substring(0, 4) !== "http"; } } private _generateRandomForCache() { return 'xxxxxxxxxxxxxxxxxxxx'.replace(/[x]/g, (c) => { var r = Math.random() * 10 | 0; return r.toString(); }); } updateAftertextureLoad() { this.props.globalState.onUpdateRequiredObservable.notifyObservers(); this.props.globalState.onRebuildRequiredObservable.notifyObservers(); } /** * Replaces the texture of the node * @param file the file of the texture to use */ replaceTexture(file: File) { if (!this.props.node) { return; } let texture = this.props.node.texture as BaseTexture; if (!texture) { this.props.node.texture = new Texture(null, this.props.globalState.nodeMaterial.getScene(), false, false); texture = this.props.node.texture; } Tools.ReadFile(file, (data) => { var blob = new Blob([data], { type: "octet/stream" }); var reader = new FileReader(); reader.readAsDataURL(blob); reader.onloadend = () => { let base64data = reader.result as string; if (texture.isCube) { let extension: string | undefined = undefined; if (file.name.toLowerCase().indexOf(".dds") > 0) { extension = ".dds"; } else if (file.name.toLowerCase().indexOf(".env") > 0) { extension = ".env"; } (texture as Texture).updateURL(base64data, extension, () => this.updateAftertextureLoad()); } else { (texture as Texture).updateURL(base64data, null, () => this.updateAftertextureLoad()); } } }, undefined, true); } replaceTextureWithUrl(url: string) { let texture = this.props.node.texture as BaseTexture; if (!texture) { this.props.node.texture = new Texture(url, this.props.globalState.nodeMaterial.getScene(), false, false, undefined, () => { this.updateAftertextureLoad(); }); return; } (texture as Texture).updateURL(url, null, () => this.updateAftertextureLoad()); } render() { let url = ""; let texture = this.props.node.texture as BaseTexture; if (texture && texture.name && texture.name.substring(0, 4) === "http") { url = texture.name; } url = url.replace(/\?nocache=\d+/, ""); return (
this.props.globalState.onUpdateRequiredObservable.notifyObservers()} /> { this.props.globalState.onUpdateRequiredObservable.notifyObservers(); }}/> { texture && { this.props.globalState.onUpdateRequiredObservable.notifyObservers(); }}/> } { texture && texture.wrapU === Texture.CLAMP_ADDRESSMODE} onSelect={(value) => { texture.wrapU = value ? Texture.CLAMP_ADDRESSMODE : Texture.WRAP_ADDRESSMODE; this.props.globalState.onUpdateRequiredObservable.notifyObservers(); }} /> } { texture && texture.wrapV === Texture.CLAMP_ADDRESSMODE} onSelect={(value) => { texture.wrapV = value ? Texture.CLAMP_ADDRESSMODE : Texture.WRAP_ADDRESSMODE; this.props.globalState.onUpdateRequiredObservable.notifyObservers(); }} /> } { texture && { this.props.globalState.onUpdateRequiredObservable.notifyObservers(); }} /> } { texture && { this.props.globalState.onUpdateRequiredObservable.notifyObservers(); }} /> } { texture && { this.props.globalState.onUpdateRequiredObservable.notifyObservers(); }} /> } { texture && { this.props.globalState.onUpdateRequiredObservable.notifyObservers(); }} /> } { texture && { this.props.globalState.onUpdateRequiredObservable.notifyObservers(); }} /> } { texture && { this.props.globalState.onUpdateRequiredObservable.notifyObservers(); }} /> } { texture && { this.props.globalState.onUpdateRequiredObservable.notifyObservers(); }} /> } this.state.isEmbedded} onSelect={value => { this.setState({isEmbedded: value}); this.props.node.texture = null; this.updateAftertextureLoad(); }}/> { this.state.isEmbedded && this.replaceTexture(file)} accept=".jpg, .png, .tga, .dds, .env" /> } { !this.state.isEmbedded && this.replaceTextureWithUrl(newUrl)}/> } { !this.state.isEmbedded && url && this.replaceTextureWithUrl(url + "?nocache=" + this._generateRandomForCache())}/> }
); } }