From 828e07bb7bdc3f2ea8025b26a8b73bbfe96b225f Mon Sep 17 00:00:00 2001 From: Bill Date: Tue, 11 May 2021 15:08:18 -0400 Subject: [PATCH] Add FurniImageView --- src/views/Styles.scss | 1 + src/views/furni-image/FurniImageView.scss | 7 +++ src/views/furni-image/FurniImageView.tsx | 60 +++++++++++++++++++ src/views/furni-image/FurniImageView.types.ts | 8 +++ 4 files changed, 76 insertions(+) create mode 100644 src/views/furni-image/FurniImageView.scss create mode 100644 src/views/furni-image/FurniImageView.tsx create mode 100644 src/views/furni-image/FurniImageView.types.ts diff --git a/src/views/Styles.scss b/src/views/Styles.scss index 159653cb..54cbbd9a 100644 --- a/src/views/Styles.scss +++ b/src/views/Styles.scss @@ -3,6 +3,7 @@ @import './catalog/CatalogView'; @import './catalog-icon/CatalogIconView'; @import './friend-list/FriendListView'; +@import './furni-image/FurniImageView'; @import './hotel-view/HotelView'; @import './inventory/InventoryView'; @import './limited-edition/LimitedEdition'; diff --git a/src/views/furni-image/FurniImageView.scss b/src/views/furni-image/FurniImageView.scss new file mode 100644 index 00000000..6bf1551b --- /dev/null +++ b/src/views/furni-image/FurniImageView.scss @@ -0,0 +1,7 @@ +.furni-image { + position: relative; + width: 100%; + height: 100%; + background-repeat: no-repeat; + background-position: center; +} diff --git a/src/views/furni-image/FurniImageView.tsx b/src/views/furni-image/FurniImageView.tsx new file mode 100644 index 00000000..e4c9bdd6 --- /dev/null +++ b/src/views/furni-image/FurniImageView.tsx @@ -0,0 +1,60 @@ +import { IGetImageListener, ImageResult, TextureUtils, Vector3d } from 'nitro-renderer'; +import { RenderTexture } from 'pixi.js'; +import { FC, useCallback, useEffect, useState } from 'react'; +import { GetRoomEngine } from '../../api'; +import { ProductTypeEnum } from '../catalog/enums/ProductTypeEnum'; +import { FurniImageViewProps } from './FurniImageView.types'; + +export const FurniImageView: FC = props => +{ + const { type = 's', spriteId = -1, direction = 0, extras = '', scale = 1 } = props; + const [ imageElement, setImageElement ] = useState(null); + + const buildImage = useCallback(() => + { + let imageResult: ImageResult = null; + + const furniType = type.toLocaleLowerCase(); + + const listener: IGetImageListener = { + imageReady: (id: number, texture: RenderTexture, image: HTMLImageElement) => + { + if(!image && texture) + { + image = TextureUtils.generateImage(texture); + } + + image.onload = () => setImageElement(image); + }, + imageFailed: null + }; + + switch(furniType) + { + case ProductTypeEnum.FLOOR: + imageResult = GetRoomEngine().getFurnitureFloorImage(spriteId, new Vector3d(direction), 64, listener, 0, extras); + break; + case ProductTypeEnum.WALL: + imageResult = GetRoomEngine().getFurnitureWallImage(spriteId, new Vector3d(direction), 64, listener, 0, extras); + break; + } + + if(imageResult) + { + const image = imageResult.getImage(); + + image.onload = () => setImageElement(image); + } + }, [ type, spriteId, direction, extras ]); + + useEffect(() => + { + buildImage(); + }, [ buildImage ]); + + if(!imageElement) return null; + + const imageUrl = `url('${ imageElement.src }')`; + + return
; +} diff --git a/src/views/furni-image/FurniImageView.types.ts b/src/views/furni-image/FurniImageView.types.ts new file mode 100644 index 00000000..63f1cb7a --- /dev/null +++ b/src/views/furni-image/FurniImageView.types.ts @@ -0,0 +1,8 @@ +export interface FurniImageViewProps +{ + type: string; + spriteId: number; + direction?: number; + extras?: string; + scale?: number; +}