import * as React from "react"; import { Observable } from "babylonjs/Misc/observable"; import { PropertyChangedEvent } from "../../../../propertyChangedEvent"; import { LockObject } from "../lockObject"; import { LineContainerComponent } from '../../../lineContainerComponent'; import { GlobalState } from '../../../../globalState'; import { TextInputLineComponent } from '../../../lines/textInputLineComponent'; import { TextLineComponent } from '../../../../../sharedUiComponents/lines/textLineComponent'; import { Sprite } from 'babylonjs/Sprites/sprite'; import { CheckBoxLineComponent } from '../../../lines/checkBoxLineComponent'; import { Vector3LineComponent } from '../../../lines/vector3LineComponent'; import { Color4LineComponent } from '../../../lines/color4LineComponent'; import { FloatLineComponent } from '../../../lines/floatLineComponent'; import { SliderLineComponent } from '../../../lines/sliderLineComponent'; import { ButtonLineComponent } from '../../../../../sharedUiComponents/lines/buttonLineComponent'; import { TextureHelper } from '../../../../../textureHelper'; import { Nullable } from 'babylonjs/types'; interface ISpritePropertyGridComponentProps { globalState: GlobalState; sprite: Sprite; lockObject: LockObject; onPropertyChangedObservable?: Observable; onSelectionChangedObservable?: Observable; } export class SpritePropertyGridComponent extends React.Component { private canvasRef: React.RefObject; private imageData: Nullable = null; private cachedCellIndex = -1; constructor(props: ISpritePropertyGridComponentProps) { super(props); this.canvasRef = React.createRef(); } onManagerLink() { if (!this.props.onSelectionChangedObservable) { return; } const sprite = this.props.sprite; this.props.onSelectionChangedObservable.notifyObservers(sprite.manager); } switchPlayStopState() { const sprite = this.props.sprite; if (sprite.animationStarted) { sprite.stopAnimation(); } else { sprite.playAnimation(sprite.fromIndex, sprite.toIndex, sprite.loopAnimation, sprite.delay, () => {}); } this.forceUpdate(); } disposeSprite() { const sprite = this.props.sprite; sprite.dispose(); this.props.onSelectionChangedObservable?.notifyObservers(null); } componentDidMount() { this.updatePreview(); } componentDidUpdate() { this.updatePreview(); } shouldComponentUpdate(nextProps: ISpritePropertyGridComponentProps) { if (nextProps.sprite !== this.props.sprite) { this.imageData = null; } return true; } updatePreview() { const sprite = this.props.sprite; const manager = sprite.manager; var texture = manager.texture; var size = texture.getSize(); if (!this.imageData) { TextureHelper.GetTextureDataAsync(texture, size.width, size.height, 0, {R: true, G:true, B:true, A:true}, this.props.globalState).then(data => { this.imageData = data; this.forceUpdate(); }); return; } if (this.cachedCellIndex === sprite.cellIndex) { return; } this.cachedCellIndex = sprite.cellIndex; const previewCanvas = this.canvasRef.current as HTMLCanvasElement; previewCanvas.width = manager.cellWidth; previewCanvas.height = manager.cellHeight; var context = previewCanvas.getContext('2d'); if (context) { // Copy the pixels to the preview canvas var imageData = context.createImageData(manager.cellWidth, manager.cellHeight); var castData = imageData.data; let rowLength = size.width / manager.cellWidth | 0; let offsetY = sprite.cellIndex / rowLength | 0; let offsetX = sprite.cellIndex - offsetY * rowLength; let offset = (offsetX + offsetY * size.width) * 4 * manager.cellWidth ; for (var x = 0; x < manager.cellWidth; x++) { for (var y = 0; y < manager.cellHeight; y++) { let targetCoord = (x + y * manager.cellWidth) * 4; let sourceCoord = (x + y * size.width) * 4 castData[targetCoord] = this.imageData[offset + sourceCoord]; castData[targetCoord + 1] = this.imageData[offset + sourceCoord + 1]; castData[targetCoord + 2] = this.imageData[offset + sourceCoord + 2]; castData[targetCoord + 3] = this.imageData[offset + sourceCoord + 3]; } } context.putImageData(imageData, 0, 0); } } render() { const sprite = this.props.sprite; const manager = sprite.manager; const textureSize = manager.texture.getSize(); let maxCellCount = 0; if (!textureSize.width || !textureSize.height) { maxCellCount = Math.max(sprite.fromIndex, sprite.toIndex); } else { maxCellCount = (textureSize.width / manager.cellWidth) * (textureSize.height / manager.cellHeight); } return (
this.onManagerLink()} /> this.disposeSprite()} /> this.forceUpdate()} /> this.switchPlayStopState()} />
); } }