Make some TextureUtilities async

This commit is contained in:
Bill 2023-07-11 21:55:42 -04:00
parent 02f698f8a9
commit ef7dfe9bb8
11 changed files with 42 additions and 47 deletions

View File

@ -1,7 +1,5 @@
import { Resource, Texture } from '@pixi/core'; import { Resource, Texture } from '@pixi/core';
import { Rectangle } from '@pixi/math'; import { Rectangle } from '@pixi/math';
import { Sprite } from '@pixi/sprite';
import { TextureUtils } from '../../pixi-proxy';
import { IGraphicAsset } from './IGraphicAsset'; import { IGraphicAsset } from './IGraphicAsset';
export class GraphicAsset implements IGraphicAsset export class GraphicAsset implements IGraphicAsset
@ -66,11 +64,6 @@ export class GraphicAsset implements IGraphicAsset
this._initialized = true; this._initialized = true;
} }
public getImageUrl(): string
{
return TextureUtils.generateImageUrl(new Sprite(this._texture));
}
public get name(): string public get name(): string
{ {
return this._name; return this._name;

View File

@ -2,8 +2,8 @@ import { RenderTexture } from '@pixi/core';
import { Sprite } from '@pixi/sprite'; import { Sprite } from '@pixi/sprite';
import { IGraphicAsset } from '../../asset'; import { IGraphicAsset } from '../../asset';
import { IDisposable } from '../../common'; import { IDisposable } from '../../common';
import { IAnimationLayerData, IAvatarDataContainer, ISpriteDataContainer } from './animation';
import { IAvatarFigureContainer } from './IAvatarFigureContainer'; import { IAvatarFigureContainer } from './IAvatarFigureContainer';
import { IAnimationLayerData, IAvatarDataContainer, ISpriteDataContainer } from './animation';
import { IPartColor } from './structure'; import { IPartColor } from './structure';
export interface IAvatarImage extends IDisposable export interface IAvatarImage extends IDisposable
@ -17,7 +17,7 @@ export interface IAvatarImage extends IDisposable
getLayerData(_arg_1: ISpriteDataContainer): IAnimationLayerData; getLayerData(_arg_1: ISpriteDataContainer): IAnimationLayerData;
getImage(setType: string, hightlight: boolean, scale?: number, cache?: boolean): RenderTexture; getImage(setType: string, hightlight: boolean, scale?: number, cache?: boolean): RenderTexture;
getImageAsSprite(setType: string, scale?: number): Sprite; getImageAsSprite(setType: string, scale?: number): Sprite;
getCroppedImage(setType: string, scale?: number): HTMLImageElement; getCroppedImage(setType: string, scale?: number): Promise<HTMLImageElement>;
getAsset(_arg_1: string): IGraphicAsset; getAsset(_arg_1: string): IGraphicAsset;
getDirection(): number; getDirection(): number;
getFigure(): IAvatarFigureContainer; getFigure(): IAvatarFigureContainer;

View File

@ -6,7 +6,7 @@ import { IRoomCameraWidgetSelectedEffect } from './IRoomCameraWidgetSelectedEffe
export interface IRoomCameraWidgetManager export interface IRoomCameraWidgetManager
{ {
init(): void; init(): void;
applyEffects(texture: Texture<Resource>, selectedEffects: IRoomCameraWidgetSelectedEffect[], isZoomed: boolean): HTMLImageElement; applyEffects(texture: Texture<Resource>, selectedEffects: IRoomCameraWidgetSelectedEffect[], isZoomed: boolean): Promise<HTMLImageElement>;
events: IEventDispatcher; events: IEventDispatcher;
effects: Map<string, IRoomCameraWidgetEffect>; effects: Map<string, IRoomCameraWidgetEffect>;
isLoaded: boolean; isLoaded: boolean;

View File

@ -5,5 +5,5 @@ export interface IImageResult
id: number; id: number;
data: RenderTexture; data: RenderTexture;
image: HTMLImageElement; image: HTMLImageElement;
getImage(): HTMLImageElement; getImage(): Promise<HTMLImageElement>;
} }

View File

@ -84,7 +84,7 @@ export interface IRoomEngine extends INitroManager
processRoomObjectPlacement(placementSource: string, id: number, category: number, typeId: number, legacyString?: string, stuffData?: IObjectData, state?: number, frameNumber?: number, posture?: string): boolean; processRoomObjectPlacement(placementSource: string, id: number, category: number, typeId: number, legacyString?: string, stuffData?: IObjectData, state?: number, frameNumber?: number, posture?: string): boolean;
dispatchMouseEvent(canvasId: number, x: number, y: number, type: string, altKey: boolean, ctrlKey: boolean, shiftKey: boolean, buttonDown: boolean): void; dispatchMouseEvent(canvasId: number, x: number, y: number, type: string, altKey: boolean, ctrlKey: boolean, shiftKey: boolean, buttonDown: boolean): void;
createTextureFromRoom(roomId: number, canvasId?: number, bounds?: Rectangle): RenderTexture; createTextureFromRoom(roomId: number, canvasId?: number, bounds?: Rectangle): RenderTexture;
saveTextureAsScreenshot(texture: RenderTexture, saveAsThumbnail?: boolean): void; saveTextureAsScreenshot(texture: RenderTexture, saveAsThumbnail?: boolean): Promise<void>;
saveBase64AsScreenshot(base64: string, saveAsThumbnail?: boolean): void; saveBase64AsScreenshot(base64: string, saveAsThumbnail?: boolean): void;
deleteRoomObject(objectId: number, objectCategory: number): boolean; deleteRoomObject(objectId: number, objectCategory: number): boolean;
sessionDataManager: ISessionDataManager; sessionDataManager: ISessionDataManager;

View File

@ -5,12 +5,12 @@ import { Rectangle } from '@pixi/math';
import { Sprite } from '@pixi/sprite'; import { Sprite } from '@pixi/sprite';
import { AdvancedMap, AvatarAction, AvatarDirectionAngle, AvatarScaleType, AvatarSetType, IActionDefinition, IActiveActionData, IAdvancedMap, IAnimationLayerData, IAvatarDataContainer, IAvatarEffectListener, IAvatarFigureContainer, IAvatarImage, IGraphicAsset, IPartColor, ISpriteDataContainer } from '../../api'; import { AdvancedMap, AvatarAction, AvatarDirectionAngle, AvatarScaleType, AvatarSetType, IActionDefinition, IActiveActionData, IAdvancedMap, IAnimationLayerData, IAvatarDataContainer, IAvatarEffectListener, IAvatarFigureContainer, IAvatarImage, IGraphicAsset, IPartColor, ISpriteDataContainer } from '../../api';
import { GetTickerTime, NitroContainer, NitroSprite, PaletteMapFilter, PixiApplicationProxy, TextureUtils } from '../../pixi-proxy'; import { GetTickerTime, NitroContainer, NitroSprite, PaletteMapFilter, PixiApplicationProxy, TextureUtils } from '../../pixi-proxy';
import { ActiveActionData } from './actions';
import { AssetAliasCollection } from './alias';
import { AvatarFigureContainer } from './AvatarFigureContainer'; import { AvatarFigureContainer } from './AvatarFigureContainer';
import { AvatarStructure } from './AvatarStructure'; import { AvatarStructure } from './AvatarStructure';
import { AvatarImageCache } from './cache';
import { EffectAssetDownloadManager } from './EffectAssetDownloadManager'; import { EffectAssetDownloadManager } from './EffectAssetDownloadManager';
import { ActiveActionData } from './actions';
import { AssetAliasCollection } from './alias';
import { AvatarImageCache } from './cache';
export class AvatarImage implements IAvatarImage, IAvatarEffectListener export class AvatarImage implements IAvatarImage, IAvatarEffectListener
{ {
@ -543,7 +543,7 @@ export class AvatarImage implements IAvatarImage, IAvatarEffectListener
return container; return container;
} }
public getCroppedImage(setType: string, scale: number = 1): HTMLImageElement public async getCroppedImage(setType: string, scale: number = 1): Promise<HTMLImageElement>
{ {
if(!this._mainAction) return null; if(!this._mainAction) return null;
@ -604,11 +604,7 @@ export class AvatarImage implements IAvatarImage, IAvatarEffectListener
const texture = TextureUtils.generateTexture(container, new Rectangle(0, 0, avatarCanvas.width, avatarCanvas.height)); const texture = TextureUtils.generateTexture(container, new Rectangle(0, 0, avatarCanvas.width, avatarCanvas.height));
const image = TextureUtils.generateImage(texture); return await TextureUtils.generateImage(texture);
if(!image) return null;
return image;
} }
protected getFullImage(k: string): RenderTexture protected getFullImage(k: string): RenderTexture

View File

@ -50,7 +50,7 @@ export class RoomCameraWidgetManager implements IRoomCameraWidgetManager
this.events.dispatchEvent(new RoomCameraWidgetManagerEvent(RoomCameraWidgetManagerEvent.INITIALIZED)); this.events.dispatchEvent(new RoomCameraWidgetManagerEvent(RoomCameraWidgetManagerEvent.INITIALIZED));
} }
public applyEffects(texture: Texture, selectedEffects: IRoomCameraWidgetSelectedEffect[], isZoomed: boolean): HTMLImageElement public async applyEffects(texture: Texture, selectedEffects: IRoomCameraWidgetSelectedEffect[], isZoomed: boolean): Promise<HTMLImageElement>
{ {
const container = new NitroContainer(); const container = new NitroContainer();
const sprite = new NitroSprite(texture); const sprite = new NitroSprite(texture);
@ -86,7 +86,7 @@ export class RoomCameraWidgetManager implements IRoomCameraWidgetManager
} }
} }
return TextureUtils.generateImage(container); return await TextureUtils.generateImage(container);
} }
public get effects(): Map<string, IRoomCameraWidgetEffect> public get effects(): Map<string, IRoomCameraWidgetEffect>

View File

@ -21,9 +21,9 @@ export class RenderRoomMessageComposer implements IMessageComposer<ConstructorPa
this._data = []; this._data = [];
} }
public assignBitmap(texture: RenderTexture): void public async assignBitmap(texture: RenderTexture): Promise<void>
{ {
const url = TextureUtils.generateImageUrl(texture); const url = await TextureUtils.generateImageUrl(texture);
if(!url) return; if(!url) return;

View File

@ -8,12 +8,12 @@ export class ImageResult implements IImageResult
public data: RenderTexture = null; public data: RenderTexture = null;
public image: HTMLImageElement = null; public image: HTMLImageElement = null;
public getImage(): HTMLImageElement public async getImage(): Promise<HTMLImageElement>
{ {
if(this.image) return this.image; if(this.image) return this.image;
if(!this.data) return null; if(!this.data) return null;
return TextureUtils.generateImage(this.data); return await TextureUtils.generateImage(this.data);
} }
} }

View File

@ -10,13 +10,13 @@ import { PetFigureData } from '../avatar';
import { RenderRoomMessageComposer, RenderRoomThumbnailMessageComposer } from '../communication'; import { RenderRoomMessageComposer, RenderRoomThumbnailMessageComposer } from '../communication';
import { FurniId } from '../utils'; import { FurniId } from '../utils';
import { ImageResult } from './ImageResult'; import { ImageResult } from './ImageResult';
import { ObjectAvatarCarryObjectUpdateMessage, ObjectAvatarChatUpdateMessage, ObjectAvatarDanceUpdateMessage, ObjectAvatarEffectUpdateMessage, ObjectAvatarExperienceUpdateMessage, ObjectAvatarExpressionUpdateMessage, ObjectAvatarFigureUpdateMessage, ObjectAvatarFlatControlUpdateMessage, ObjectAvatarGestureUpdateMessage, ObjectAvatarGuideStatusUpdateMessage, ObjectAvatarMutedUpdateMessage, ObjectAvatarOwnMessage, ObjectAvatarPetGestureUpdateMessage, ObjectAvatarPlayerValueUpdateMessage, ObjectAvatarPlayingGameUpdateMessage, ObjectAvatarPostureUpdateMessage, ObjectAvatarSignUpdateMessage, ObjectAvatarSleepUpdateMessage, ObjectAvatarTypingUpdateMessage, ObjectAvatarUpdateMessage, ObjectAvatarUseObjectUpdateMessage, ObjectDataUpdateMessage, ObjectGroupBadgeUpdateMessage, ObjectHeightUpdateMessage, ObjectItemDataUpdateMessage, ObjectModelDataUpdateMessage, ObjectMoveUpdateMessage, ObjectRoomColorUpdateMessage, ObjectRoomFloorHoleUpdateMessage, ObjectRoomMaskUpdateMessage, ObjectRoomPlanePropertyUpdateMessage, ObjectRoomPlaneVisibilityUpdateMessage, ObjectRoomUpdateMessage, ObjectStateUpdateMessage } from './messages';
import { RoomLogic, RoomMapData, RoomObjectVisualizationFactory } from './object';
import { RoomContentLoader } from './RoomContentLoader'; import { RoomContentLoader } from './RoomContentLoader';
import { RoomMessageHandler } from './RoomMessageHandler'; import { RoomMessageHandler } from './RoomMessageHandler';
import { RoomObjectEventHandler } from './RoomObjectEventHandler'; import { RoomObjectEventHandler } from './RoomObjectEventHandler';
import { RoomObjectLogicFactory } from './RoomObjectLogicFactory'; import { RoomObjectLogicFactory } from './RoomObjectLogicFactory';
import { RoomVariableEnum } from './RoomVariableEnum'; import { RoomVariableEnum } from './RoomVariableEnum';
import { ObjectAvatarCarryObjectUpdateMessage, ObjectAvatarChatUpdateMessage, ObjectAvatarDanceUpdateMessage, ObjectAvatarEffectUpdateMessage, ObjectAvatarExperienceUpdateMessage, ObjectAvatarExpressionUpdateMessage, ObjectAvatarFigureUpdateMessage, ObjectAvatarFlatControlUpdateMessage, ObjectAvatarGestureUpdateMessage, ObjectAvatarGuideStatusUpdateMessage, ObjectAvatarMutedUpdateMessage, ObjectAvatarOwnMessage, ObjectAvatarPetGestureUpdateMessage, ObjectAvatarPlayerValueUpdateMessage, ObjectAvatarPlayingGameUpdateMessage, ObjectAvatarPostureUpdateMessage, ObjectAvatarSignUpdateMessage, ObjectAvatarSleepUpdateMessage, ObjectAvatarTypingUpdateMessage, ObjectAvatarUpdateMessage, ObjectAvatarUseObjectUpdateMessage, ObjectDataUpdateMessage, ObjectGroupBadgeUpdateMessage, ObjectHeightUpdateMessage, ObjectItemDataUpdateMessage, ObjectModelDataUpdateMessage, ObjectMoveUpdateMessage, ObjectRoomColorUpdateMessage, ObjectRoomFloorHoleUpdateMessage, ObjectRoomMaskUpdateMessage, ObjectRoomPlanePropertyUpdateMessage, ObjectRoomPlaneVisibilityUpdateMessage, ObjectRoomUpdateMessage, ObjectStateUpdateMessage } from './messages';
import { RoomLogic, RoomMapData, RoomObjectVisualizationFactory } from './object';
import { RoomCamera, RoomData, RoomFurnitureData, RoomInstanceData, RoomObjectBadgeImageAssetListener, SpriteDataCollector } from './utils'; import { RoomCamera, RoomData, RoomFurnitureData, RoomInstanceData, RoomObjectBadgeImageAssetListener, SpriteDataCollector } from './utils';
export class RoomEngine extends NitroManager implements IRoomEngine, IRoomCreator, IRoomEngineServices, IRoomManagerListener, IRoomContentListener, IUpdateReceiver, IDisposable export class RoomEngine extends NitroManager implements IRoomEngine, IRoomCreator, IRoomEngineServices, IRoomManagerListener, IRoomContentListener, IUpdateReceiver, IDisposable
@ -1745,16 +1745,19 @@ export class RoomEngine extends NitroManager implements IRoomEngine, IRoomCreato
if(icon) if(icon)
{ {
const image = TextureUtils.generateImage(icon); (async () =>
if(this.events)
{ {
const event = new NitroToolbarAnimateIconEvent(image, screenLocation.x, screenLocation.y); const image = await TextureUtils.generateImage(icon);
event.iconName = ToolbarIconEnum.INVENTORY; if(this.events)
{
const event = new NitroToolbarAnimateIconEvent(image, screenLocation.x, screenLocation.y);
this.events.dispatchEvent(event); event.iconName = ToolbarIconEnum.INVENTORY;
}
this.events.dispatchEvent(event);
}
})();
} }
} }
} }
@ -1790,16 +1793,19 @@ export class RoomEngine extends NitroManager implements IRoomEngine, IRoomCreato
if(icon) if(icon)
{ {
const image = TextureUtils.generateImage(icon); (async () =>
if(this.events)
{ {
const event = new NitroToolbarAnimateIconEvent(image, screenLocation.x, screenLocation.y); const image = await TextureUtils.generateImage(icon);
event.iconName = ToolbarIconEnum.INVENTORY; if(this.events)
{
const event = new NitroToolbarAnimateIconEvent(image, screenLocation.x, screenLocation.y);
this.events.dispatchEvent(event); event.iconName = ToolbarIconEnum.INVENTORY;
}
this.events.dispatchEvent(event);
}
})();
} }
} }
} }
@ -3400,14 +3406,14 @@ export class RoomEngine extends NitroManager implements IRoomEngine, IRoomCreato
return texture; return texture;
} }
public saveTextureAsScreenshot(texture: RenderTexture, saveAsThumbnail: boolean = false): void public async saveTextureAsScreenshot(texture: RenderTexture, saveAsThumbnail: boolean = false): Promise<void>
{ {
let composer: RenderRoomMessageComposer = null; let composer: RenderRoomMessageComposer = null;
if(saveAsThumbnail) composer = new RenderRoomThumbnailMessageComposer(); if(saveAsThumbnail) composer = new RenderRoomThumbnailMessageComposer();
else composer = new RenderRoomMessageComposer(); else composer = new RenderRoomMessageComposer();
composer.assignBitmap(texture); await composer.assignBitmap(texture);
this._communication.connection.send(composer); this._communication.connection.send(composer);
} }

View File

@ -28,14 +28,14 @@ export class TextureUtils
return Texture.from(image); return Texture.from(image);
} }
public static generateImage(target: DisplayObject | RenderTexture): HTMLImageElement public static async generateImage(target: DisplayObject | RenderTexture): Promise<HTMLImageElement>
{ {
if(!target) return null; if(!target) return null;
return this.getExtractor().image(target); return this.getExtractor().image(target);
} }
public static generateImageUrl(target: DisplayObject | RenderTexture): string public static async generateImageUrl(target: DisplayObject | RenderTexture): Promise<string>
{ {
if(!target) return null; if(!target) return null;