import * as React from "react"; import { Observable } from "babylonjs/Misc/observable"; import { PropertyChangedEvent } from "../../../../propertyChangedEvent"; import { LockObject } from "../../../../../sharedUiComponents/tabs/propertyGrids/lockObject"; import { LineContainerComponent } from '../../../lineContainerComponent'; import { GlobalState } from '../../../../globalState'; import { SpriteManager } from 'babylonjs/Sprites/spriteManager'; import { TextInputLineComponent } from '../../../../../sharedUiComponents/lines/textInputLineComponent'; import { TextLineComponent } from '../../../../../sharedUiComponents/lines/textLineComponent'; import { CheckBoxLineComponent } from '../../../../../sharedUiComponents/lines/checkBoxLineComponent'; import { FloatLineComponent } from '../../../../../sharedUiComponents/lines/floatLineComponent'; import { SliderLineComponent } from '../../../../../sharedUiComponents/lines/sliderLineComponent'; import { RenderingManager } from 'babylonjs/Rendering/renderingManager'; import { TextureLinkLineComponent } from '../../../lines/textureLinkLineComponent'; import { ButtonLineComponent } from '../../../../../sharedUiComponents/lines/buttonLineComponent'; import { Sprite } from 'babylonjs/Sprites/sprite'; import { Tools } from 'babylonjs/Misc/tools'; import { FileButtonLineComponent } from '../../../../../sharedUiComponents/lines/fileButtonLineComponent'; import { Constants } from 'babylonjs/Engines/constants'; import { OptionsLineComponent } from '../../../../../sharedUiComponents/lines/optionsLineComponent'; interface ISpriteManagerPropertyGridComponentProps { globalState: GlobalState; spriteManager: SpriteManager; lockObject: LockObject; onSelectionChangedObservable?: Observable; onPropertyChangedObservable?: Observable } export class SpriteManagerPropertyGridComponent extends React.Component { private _snippetUrl = "https://snippet.babylonjs.com"; constructor(props: ISpriteManagerPropertyGridComponentProps) { super(props); } addNewSprite() { const spriteManager = this.props.spriteManager; var newSprite = new Sprite("new sprite", spriteManager); this.props.onSelectionChangedObservable?.notifyObservers(newSprite); } disposeManager() { const spriteManager = this.props.spriteManager; spriteManager.dispose(); this.props.onSelectionChangedObservable?.notifyObservers(null); } saveToFile() { const spriteManager = this.props.spriteManager; let content = JSON.stringify(spriteManager.serialize(true)); Tools.Download(new Blob([content]), "spriteManager.json"); } loadFromFile(file: File) { const spriteManager = this.props.spriteManager; const scene = spriteManager.scene; Tools.ReadFile(file, (data) => { let decoder = new TextDecoder("utf-8"); let jsonObject = JSON.parse(decoder.decode(data)); spriteManager.dispose(); this.props.globalState.onSelectionChangedObservable.notifyObservers(null); let newManager = SpriteManager.Parse(jsonObject, scene, ""); this.props.globalState.onSelectionChangedObservable.notifyObservers(newManager); }, undefined, true); } loadFromSnippet() { const spriteManager = this.props.spriteManager; const scene = spriteManager.scene; let snippedID = window.prompt("Please enter the snippet ID to use"); if (!snippedID) { return; } spriteManager.dispose(); this.props.globalState.onSelectionChangedObservable.notifyObservers(null); SpriteManager.CreateFromSnippetAsync(snippedID, scene).then((newManager) => { this.props.globalState.onSelectionChangedObservable.notifyObservers(newManager); }).catch(err => { alert("Unable to load your sprite manager: " + err); }); } saveToSnippet() { const spriteManager = this.props.spriteManager; let content = JSON.stringify(spriteManager.serialize(true)); var xmlHttp = new XMLHttpRequest(); xmlHttp.onreadystatechange = () => { if (xmlHttp.readyState == 4) { if (xmlHttp.status == 200) { var snippet = JSON.parse(xmlHttp.responseText); const oldId = spriteManager.snippetId || "_BLANK"; spriteManager.snippetId = snippet.id; if (snippet.version && snippet.version != "0") { spriteManager.snippetId += "#" + snippet.version; } this.forceUpdate(); if (navigator.clipboard) { navigator.clipboard.writeText(spriteManager.snippetId); } let windowAsAny = window as any; if (windowAsAny.Playground && oldId) { windowAsAny.Playground.onRequestCodeChangeObservable.notifyObservers({ regex: new RegExp(`SpriteManager.CreateFromSnippetAsync\\("${oldId}`, "g"), replace: `SpriteManager.CreateFromSnippetAsync("${spriteManager.snippetId}` }); } alert("Sprite manager saved with ID: " + spriteManager.snippetId + " (please note that the id was also saved to your clipboard)"); } else { alert("Unable to save your sprite manager"); } } } xmlHttp.open("POST", this._snippetUrl + (spriteManager.snippetId ? "/" + spriteManager.snippetId : ""), true); xmlHttp.setRequestHeader("Content-Type", "application/json"); var dataToSend = { payload : JSON.stringify({ spriteManager: content }), name: "", description: "", tags: "" }; xmlHttp.send(JSON.stringify(dataToSend)); } render() { const spriteManager = this.props.spriteManager; var alphaModeOptions = [ { label: "Combine", value: Constants.ALPHA_COMBINE }, { label: "One one", value: Constants.ALPHA_ONEONE }, { label: "Add", value: Constants.ALPHA_ADD }, { label: "Subtract", value: Constants.ALPHA_SUBTRACT }, { label: "Multiply", value: Constants.ALPHA_MULTIPLY }, { label: "Maximized", value: Constants.ALPHA_MAXIMIZED }, { label: "Pre-multiplied", value: Constants.ALPHA_PREMULTIPLIED }, ]; return (
{ spriteManager.sprites.length < spriteManager.capacity && this.addNewSprite()} /> } this.disposeManager()} /> this.loadFromFile(file)} accept=".json" /> this.saveToFile()} /> { spriteManager.snippetId && } this.loadFromSnippet()} /> this.saveToSnippet()} /> this.setState({ blendMode: value })} />
); } }