mirror of
https://github.com/duckietm/Nitro-Cool-UI.git
synced 2025-06-21 22:36:58 +00:00
876 lines
32 KiB
TypeScript
876 lines
32 KiB
TypeScript
import { RenderTexture, Texture } from '@pixi/core';
|
|
import { Container, DisplayObject } from '@pixi/display';
|
|
import { Point, Rectangle } from '@pixi/math';
|
|
import { Sprite } from '@pixi/sprite';
|
|
import { IGetImageListener, IImageResult, IObjectData, IRoomEngine, IRoomObjectController, IRoomRenderingCanvas, IVector3D, LegacyDataType, RoomObjectCategory, RoomObjectUserType, RoomObjectVariable, Vector3d } from '../../../api';
|
|
import { RoomEngineEvent, RoomEngineObjectEvent } from '../../../events';
|
|
import { GetTickerTime, NitroSprite } from '../../../pixi-proxy';
|
|
import { RoomId } from '../../../room';
|
|
import { FloorHeightMapMessageParser, RoomEntryTileMessageParser } from '../../communication';
|
|
import { ObjectRoomMapUpdateMessage } from '../messages';
|
|
import { RoomPlaneParser } from '../object/RoomPlaneParser';
|
|
import { RoomEngine } from '../RoomEngine';
|
|
import { LegacyWallGeometry } from '../utils/LegacyWallGeometry';
|
|
|
|
export class RoomPreviewer
|
|
{
|
|
public static SCALE_NORMAL: number = 64;
|
|
public static SCALE_SMALL: number = 32;
|
|
public static PREVIEW_COUNTER: number = 0;
|
|
public static PREVIEW_CANVAS_ID: number = 1;
|
|
public static PREVIEW_OBJECT_ID: number = 1;
|
|
public static PREVIEW_OBJECT_LOCATION_X: number = 2;
|
|
public static PREVIEW_OBJECT_LOCATION_Y: number = 2;
|
|
|
|
private static ALLOWED_IMAGE_CUT: number = 0.25;
|
|
private static AUTOMATIC_STATE_CHANGE_INTERVAL: number = 2500;
|
|
private static ZOOM_ENABLED: boolean = true;
|
|
|
|
private _roomEngine: IRoomEngine;
|
|
private _planeParser: RoomPlaneParser;
|
|
private _previewRoomId: number = 1;
|
|
private _currentPreviewObjectType: number = 0;
|
|
private _currentPreviewObjectCategory: number = 0;
|
|
private _currentPreviewObjectData: string = '';
|
|
private _currentPreviewRectangle: Rectangle = null;
|
|
private _currentPreviewCanvasWidth: number = 0;
|
|
private _currentPreviewCanvasHeight: number = 0;
|
|
private _currentPreviewScale: number = 64;
|
|
private _currentPreviewNeedsZoomOut: boolean;
|
|
private _automaticStateChange: boolean;
|
|
private _previousAutomaticStateChangeTime: number;
|
|
private _addViewOffset: Point;
|
|
private _backgroundColor: number = 305148561;
|
|
private _backgroundSprite: Sprite = null;
|
|
private _disableUpdate: boolean = false;
|
|
|
|
constructor(roomEngine: IRoomEngine, roomId: number = 1)
|
|
{
|
|
this._roomEngine = roomEngine;
|
|
this._planeParser = new RoomPlaneParser();
|
|
this._previewRoomId = RoomId.makeRoomPreviewerId(roomId);
|
|
this._addViewOffset = new Point(0, 0);
|
|
|
|
this.onRoomObjectAdded = this.onRoomObjectAdded.bind(this);
|
|
this.onRoomInitializedonRoomInitialized = this.onRoomInitializedonRoomInitialized.bind(this);
|
|
|
|
if(this.isRoomEngineReady && this._roomEngine.events)
|
|
{
|
|
this._roomEngine.events.addEventListener(RoomEngineObjectEvent.ADDED, this.onRoomObjectAdded);
|
|
this._roomEngine.events.addEventListener(RoomEngineObjectEvent.CONTENT_UPDATED, this.onRoomObjectAdded);
|
|
this._roomEngine.events.addEventListener(RoomEngineEvent.INITIALIZED, this.onRoomInitializedonRoomInitialized);
|
|
}
|
|
|
|
this.createRoomForPreview();
|
|
}
|
|
|
|
public dispose(): void
|
|
{
|
|
this.reset(true);
|
|
|
|
if(this.isRoomEngineReady && this._roomEngine.events)
|
|
{
|
|
this._roomEngine.events.removeEventListener(RoomEngineObjectEvent.ADDED, this.onRoomObjectAdded);
|
|
this._roomEngine.events.removeEventListener(RoomEngineObjectEvent.CONTENT_UPDATED, this.onRoomObjectAdded);
|
|
this._roomEngine.events.removeEventListener(RoomEngineEvent.INITIALIZED, this.onRoomInitializedonRoomInitialized);
|
|
}
|
|
|
|
if(this._backgroundSprite)
|
|
{
|
|
this._backgroundSprite.destroy();
|
|
|
|
this._backgroundSprite = null;
|
|
}
|
|
|
|
if(this._planeParser)
|
|
{
|
|
this._planeParser.dispose();
|
|
|
|
this._planeParser = null;
|
|
}
|
|
}
|
|
|
|
private createRoomForPreview(): void
|
|
{
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
const size = 7;
|
|
|
|
const planeParser = new RoomPlaneParser();
|
|
|
|
planeParser.initializeTileMap((size + 2), (size + 2));
|
|
|
|
let y = 1;
|
|
|
|
while(y < (1 + size))
|
|
{
|
|
let x = 1;
|
|
|
|
while(x < (1 + size))
|
|
{
|
|
planeParser.setTileHeight(x, y, 0);
|
|
|
|
x++;
|
|
}
|
|
|
|
y++;
|
|
}
|
|
|
|
planeParser.initializeFromTileData();
|
|
|
|
this._roomEngine.createRoomInstance(this._previewRoomId, planeParser.getMapData());
|
|
|
|
planeParser.dispose();
|
|
}
|
|
}
|
|
|
|
public reset(k: boolean): void
|
|
{
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
this._roomEngine.removeRoomObjectFloor(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID);
|
|
this._roomEngine.removeRoomObjectWall(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID);
|
|
this._roomEngine.removeRoomObjectUser(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID);
|
|
|
|
if(!k) this.updatePreviewRoomView();
|
|
}
|
|
|
|
this._currentPreviewObjectCategory = RoomObjectCategory.MINIMUM;
|
|
}
|
|
|
|
public updatePreviewModel(model: string, wallHeight: number, scale: boolean = true): void
|
|
{
|
|
const parser = new FloorHeightMapMessageParser();
|
|
|
|
parser.flush();
|
|
parser.parseModel(model, wallHeight, scale);
|
|
|
|
//@ts-ignore
|
|
const wallGeometry = (this._roomEngine as IRoomCreator).getLegacyWallGeometry(this._previewRoomId);
|
|
|
|
if(!wallGeometry) return;
|
|
|
|
this._planeParser.reset();
|
|
|
|
const width = parser.width;
|
|
const height = parser.height;
|
|
|
|
this._planeParser.initializeTileMap(width, height);
|
|
|
|
const entryTile: RoomEntryTileMessageParser = null;
|
|
|
|
let doorX = -1;
|
|
let doorY = -1;
|
|
let doorZ = 0;
|
|
let doorDirection = 0;
|
|
|
|
let y = 0;
|
|
|
|
while(y < height)
|
|
{
|
|
let x = 0;
|
|
|
|
while(x < width)
|
|
{
|
|
const tileHeight = parser.getHeight(x, y);
|
|
|
|
if(((((y > 0) && (y < (height - 1))) || ((x > 0) && (x < (width - 1)))) && (!(tileHeight == RoomPlaneParser.TILE_BLOCKED))) && ((entryTile == null) || ((x == entryTile.x) && (y == entryTile.y))))
|
|
{
|
|
if(((parser.getHeight(x, (y - 1)) == RoomPlaneParser.TILE_BLOCKED) && (parser.getHeight((x - 1), y) == RoomPlaneParser.TILE_BLOCKED)) && (parser.getHeight(x, (y + 1)) == RoomPlaneParser.TILE_BLOCKED))
|
|
{
|
|
doorX = (x + 0.5);
|
|
doorY = y;
|
|
doorZ = tileHeight;
|
|
doorDirection = 90;
|
|
}
|
|
|
|
if(((parser.getHeight(x, (y - 1)) == RoomPlaneParser.TILE_BLOCKED) && (parser.getHeight((x - 1), y) == RoomPlaneParser.TILE_BLOCKED)) && (parser.getHeight((x + 1), y) == RoomPlaneParser.TILE_BLOCKED))
|
|
{
|
|
doorX = x;
|
|
doorY = (y + 0.5);
|
|
doorZ = tileHeight;
|
|
doorDirection = 180;
|
|
}
|
|
}
|
|
|
|
this._planeParser.setTileHeight(x, y, tileHeight);
|
|
|
|
x++;
|
|
}
|
|
|
|
y++;
|
|
}
|
|
|
|
this._planeParser.setTileHeight(Math.floor(doorX), Math.floor(doorY), doorZ);
|
|
this._planeParser.initializeFromTileData(parser.wallHeight);
|
|
this._planeParser.setTileHeight(Math.floor(doorX), Math.floor(doorY), (doorZ + this._planeParser.wallHeight));
|
|
|
|
wallGeometry.scale = LegacyWallGeometry.DEFAULT_SCALE;
|
|
wallGeometry.initialize(width, height, this._planeParser.floorHeight);
|
|
|
|
let heightIterator = (parser.height - 1);
|
|
|
|
while(heightIterator >= 0)
|
|
{
|
|
let widthIterator = (parser.width - 1);
|
|
|
|
while(widthIterator >= 0)
|
|
{
|
|
wallGeometry.setHeight(widthIterator, heightIterator, this._planeParser.getTileHeight(widthIterator, heightIterator));
|
|
widthIterator--;
|
|
}
|
|
|
|
heightIterator--;
|
|
}
|
|
|
|
const roomMap = this._planeParser.getMapData();
|
|
|
|
roomMap.doors.push({
|
|
x: doorX,
|
|
y: doorY,
|
|
z: doorZ,
|
|
dir: doorDirection
|
|
});
|
|
|
|
const roomObject = this.getRoomPreviewOwnRoomObject();
|
|
|
|
if(roomObject) roomObject.processUpdateMessage(new ObjectRoomMapUpdateMessage(roomMap));
|
|
}
|
|
|
|
public addFurnitureIntoRoom(classId: number, direction: IVector3D, objectData: IObjectData = null, extra: string = null): number
|
|
{
|
|
if(!objectData) objectData = new LegacyDataType();
|
|
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
this.reset(false);
|
|
|
|
this._currentPreviewObjectType = classId;
|
|
this._currentPreviewObjectCategory = RoomObjectCategory.FLOOR;
|
|
this._currentPreviewObjectData = '';
|
|
|
|
if(this._roomEngine.addFurnitureFloor(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, classId, new Vector3d(RoomPreviewer.PREVIEW_OBJECT_LOCATION_X, RoomPreviewer.PREVIEW_OBJECT_LOCATION_Y, 0), direction, 0, objectData, NaN, -1, 0, -1, '', true, false))
|
|
{
|
|
this._previousAutomaticStateChangeTime = GetTickerTime();
|
|
this._automaticStateChange = true;
|
|
|
|
const roomObject = this._roomEngine.getRoomObject(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, this._currentPreviewObjectCategory);
|
|
|
|
if(roomObject && extra) roomObject.model.setValue(RoomObjectVariable.FURNITURE_EXTRAS, extra);
|
|
|
|
this.updatePreviewRoomView();
|
|
|
|
return RoomPreviewer.PREVIEW_OBJECT_ID;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
public addWallItemIntoRoom(classId: number, direction: IVector3D, objectData: string): number
|
|
{
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
if((this._currentPreviewObjectCategory === RoomObjectCategory.WALL) && (this._currentPreviewObjectType === classId) && (this._currentPreviewObjectData === objectData)) return RoomPreviewer.PREVIEW_OBJECT_ID;
|
|
|
|
this.reset(false);
|
|
|
|
this._currentPreviewObjectType = classId;
|
|
this._currentPreviewObjectCategory = RoomObjectCategory.WALL;
|
|
this._currentPreviewObjectData = objectData;
|
|
|
|
if(this._roomEngine.addFurnitureWall(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, classId, new Vector3d(0.5, 2.3, 1.8), direction, 0, objectData, 0, 0, -1, '', false))
|
|
{
|
|
this._previousAutomaticStateChangeTime = GetTickerTime();
|
|
this._automaticStateChange = true;
|
|
|
|
this.updatePreviewRoomView();
|
|
|
|
return RoomPreviewer.PREVIEW_OBJECT_ID;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
public addAvatarIntoRoom(figure: string, effect: number): number
|
|
{
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
this.reset(false);
|
|
|
|
this._currentPreviewObjectType = 1;
|
|
this._currentPreviewObjectCategory = RoomObjectCategory.UNIT;
|
|
this._currentPreviewObjectData = figure;
|
|
|
|
if(this._roomEngine.addRoomObjectUser(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, new Vector3d(RoomPreviewer.PREVIEW_OBJECT_LOCATION_X, RoomPreviewer.PREVIEW_OBJECT_LOCATION_Y, 0), new Vector3d(90, 0, 0), 135, RoomObjectUserType.getTypeNumber(RoomObjectUserType.USER), figure))
|
|
{
|
|
this._previousAutomaticStateChangeTime = GetTickerTime();
|
|
this._automaticStateChange = true;
|
|
|
|
this.updateUserGesture(1);
|
|
this.updateUserEffect(effect);
|
|
this.updateUserPosture('std');
|
|
}
|
|
|
|
this.updatePreviewRoomView();
|
|
|
|
return RoomPreviewer.PREVIEW_OBJECT_ID;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
public addPetIntoRoom(figure: string): number
|
|
{
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
this.reset(false);
|
|
|
|
this._currentPreviewObjectType = 1;
|
|
this._currentPreviewObjectCategory = RoomObjectCategory.UNIT;
|
|
this._currentPreviewObjectData = figure;
|
|
|
|
if(this._roomEngine.addRoomObjectUser(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, new Vector3d(RoomPreviewer.PREVIEW_OBJECT_LOCATION_X, RoomPreviewer.PREVIEW_OBJECT_LOCATION_Y, 0), new Vector3d(90, 0, 0), 90, RoomObjectUserType.getTypeNumber(RoomObjectUserType.PET), figure))
|
|
{
|
|
this._previousAutomaticStateChangeTime = GetTickerTime();
|
|
this._automaticStateChange = false;
|
|
|
|
this.updateUserGesture(1);
|
|
this.updateUserPosture('std');
|
|
}
|
|
|
|
this.updatePreviewRoomView();
|
|
|
|
return RoomPreviewer.PREVIEW_OBJECT_ID;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
public updateUserPosture(type: string, parameter: string = ''): void
|
|
{
|
|
if(this.isRoomEngineReady) this._roomEngine.updateRoomObjectUserPosture(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, type, parameter);
|
|
}
|
|
|
|
public updateUserGesture(gestureId: number): void
|
|
{
|
|
if(this.isRoomEngineReady) this._roomEngine.updateRoomObjectUserGesture(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, gestureId);
|
|
}
|
|
|
|
public updateUserEffect(effectId: number): void
|
|
{
|
|
if(this.isRoomEngineReady) this._roomEngine.updateRoomObjectUserEffect(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, effectId);
|
|
}
|
|
|
|
public updateObjectUserFigure(figure: string, gender: string = null, subType: string = null, isRiding: boolean = false): boolean
|
|
{
|
|
if(this.isRoomEngineReady) return this._roomEngine.updateRoomObjectUserFigure(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, figure, gender, subType, isRiding);
|
|
|
|
return false;
|
|
}
|
|
|
|
public updateObjectUserAction(action: string, value: number, parameter: string = null): void
|
|
{
|
|
if(this.isRoomEngineReady) this._roomEngine.updateRoomObjectUserAction(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, action, value, parameter);
|
|
}
|
|
|
|
public updateObjectStuffData(stuffData: IObjectData): void
|
|
{
|
|
if(this.isRoomEngineReady) this._roomEngine.updateRoomObjectFloor(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, null, null, stuffData.state, stuffData);
|
|
}
|
|
|
|
public changeRoomObjectState(): void
|
|
{
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
this._automaticStateChange = false;
|
|
|
|
if(this._currentPreviewObjectCategory !== RoomObjectCategory.UNIT) this._roomEngine.changeObjectState(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, this._currentPreviewObjectCategory);
|
|
}
|
|
}
|
|
|
|
public changeRoomObjectDirection(): void
|
|
{
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
const roomObject = this._roomEngine.getRoomObject(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, this._currentPreviewObjectCategory);
|
|
|
|
if(!roomObject) return;
|
|
|
|
const direction = this._roomEngine.objectEventHandler.getValidRoomObjectDirection(roomObject, true);
|
|
|
|
switch(this._currentPreviewObjectCategory)
|
|
{
|
|
case RoomObjectCategory.FLOOR: {
|
|
const floorLocation = new Vector3d(RoomPreviewer.PREVIEW_OBJECT_LOCATION_X, RoomPreviewer.PREVIEW_OBJECT_LOCATION_Y);
|
|
const floorDirection = new Vector3d(direction, direction, direction);
|
|
|
|
this._roomEngine.updateRoomObjectFloor(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, floorLocation, floorDirection, null, null);
|
|
return;
|
|
}
|
|
case RoomObjectCategory.WALL:
|
|
//this._roomEngine.updateRoomObjectWall(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, null, direction, null, null);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
private checkAutomaticRoomObjectStateChange(): void
|
|
{
|
|
if(this._automaticStateChange)
|
|
{
|
|
const time = GetTickerTime();
|
|
|
|
if(time > (this._previousAutomaticStateChangeTime + RoomPreviewer.AUTOMATIC_STATE_CHANGE_INTERVAL))
|
|
{
|
|
this._previousAutomaticStateChangeTime = time;
|
|
|
|
if(this.isRoomEngineReady) this._roomEngine.changeObjectState(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, this._currentPreviewObjectCategory);
|
|
}
|
|
}
|
|
}
|
|
|
|
public getRoomCanvas(width: number, height: number): DisplayObject
|
|
{
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
const displayObject = (this._roomEngine.getRoomInstanceDisplay(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID, width, height, this._currentPreviewScale) as Container);
|
|
|
|
if(displayObject && (this._backgroundColor !== null))
|
|
{
|
|
let backgroundSprite = this._backgroundSprite;
|
|
|
|
if(!backgroundSprite)
|
|
{
|
|
backgroundSprite = new NitroSprite(Texture.WHITE);
|
|
|
|
displayObject.addChildAt(backgroundSprite, 0);
|
|
}
|
|
|
|
backgroundSprite.width = width;
|
|
backgroundSprite.height = height;
|
|
backgroundSprite.tint = this._backgroundColor;
|
|
}
|
|
|
|
this._roomEngine.setRoomInstanceRenderingCanvasMask(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID, true);
|
|
|
|
const geometry = this._roomEngine.getRoomInstanceGeometry(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID);
|
|
|
|
if(geometry) geometry.adjustLocation(new Vector3d(RoomPreviewer.PREVIEW_OBJECT_LOCATION_X, RoomPreviewer.PREVIEW_OBJECT_LOCATION_Y, 0), 30);
|
|
|
|
this._currentPreviewCanvasWidth = width;
|
|
this._currentPreviewCanvasHeight = height;
|
|
|
|
return displayObject;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public modifyRoomCanvas(width: number, height: number): void
|
|
{
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
this._currentPreviewCanvasWidth = width;
|
|
this._currentPreviewCanvasHeight = height;
|
|
|
|
if(this._backgroundSprite)
|
|
{
|
|
this._backgroundSprite.width = width;
|
|
this._backgroundSprite.height = height;
|
|
}
|
|
|
|
this._roomEngine.initializeRoomInstanceRenderingCanvas(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID, width, height);
|
|
}
|
|
}
|
|
|
|
public set addViewOffset(point: Point)
|
|
{
|
|
this._addViewOffset = point;
|
|
}
|
|
|
|
public get addViewOffset(): Point
|
|
{
|
|
return this._addViewOffset;
|
|
}
|
|
|
|
public updatePreviewObjectBoundingRectangle(point: Point): void
|
|
{
|
|
const objectBounds = this._roomEngine.getRoomObjectBoundingRectangle(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, this._currentPreviewObjectCategory, RoomPreviewer.PREVIEW_CANVAS_ID);
|
|
|
|
if(objectBounds && point)
|
|
{
|
|
objectBounds.x += -(this._currentPreviewCanvasWidth >> 1);
|
|
objectBounds.y += -(this._currentPreviewCanvasHeight >> 1);
|
|
|
|
objectBounds.x += -(point.x);
|
|
objectBounds.y += -(point.y);
|
|
|
|
if(!this._currentPreviewRectangle)
|
|
{
|
|
this._currentPreviewRectangle = objectBounds;
|
|
}
|
|
else
|
|
{
|
|
const bounds = this._currentPreviewRectangle.clone().enlarge(objectBounds);
|
|
|
|
if(((((bounds.width - this._currentPreviewRectangle.width) > ((this._currentPreviewCanvasWidth - this._currentPreviewRectangle.width) >> 1)) || ((bounds.height - this._currentPreviewRectangle.height) > ((this._currentPreviewCanvasHeight - this._currentPreviewRectangle.height) >> 1))) || (this._currentPreviewRectangle.width < 1)) || (this._currentPreviewRectangle.height < 1)) this._currentPreviewRectangle = bounds;
|
|
}
|
|
}
|
|
}
|
|
|
|
private validatePreviewSize(point: Point): Point
|
|
{
|
|
if(((this._currentPreviewRectangle.width < 1) || (this._currentPreviewRectangle.height < 1)))
|
|
{
|
|
return point;
|
|
}
|
|
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
const geometry = this._roomEngine.getRoomInstanceGeometry(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID);
|
|
|
|
if((this._currentPreviewRectangle.width > (this._currentPreviewCanvasWidth * (1 + RoomPreviewer.ALLOWED_IMAGE_CUT))) || (this._currentPreviewRectangle.height > (this._currentPreviewCanvasHeight * (1 + RoomPreviewer.ALLOWED_IMAGE_CUT))))
|
|
{
|
|
if(RoomPreviewer.ZOOM_ENABLED)
|
|
{
|
|
if(this._roomEngine.getRoomInstanceRenderingCanvasScale(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID) !== 0.5)
|
|
{
|
|
this._roomEngine.setRoomInstanceRenderingCanvasScale(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID, 0.5, null, null);
|
|
|
|
this._currentPreviewScale = RoomPreviewer.SCALE_SMALL;
|
|
this._currentPreviewNeedsZoomOut = true;
|
|
|
|
point.x = (point.x >> 1);
|
|
point.y = (point.y >> 1);
|
|
|
|
this._currentPreviewRectangle.x = (this._currentPreviewRectangle.x >> 2);
|
|
this._currentPreviewRectangle.y = (this._currentPreviewRectangle.y >> 2);
|
|
this._currentPreviewRectangle.width = (this._currentPreviewRectangle.width >> 2);
|
|
this._currentPreviewRectangle.height = (this._currentPreviewRectangle.height >> 2);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(geometry.isZoomedIn())
|
|
{
|
|
geometry.performZoomOut();
|
|
|
|
this._currentPreviewScale = RoomPreviewer.SCALE_SMALL;
|
|
this._currentPreviewNeedsZoomOut = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
else if(!this._currentPreviewNeedsZoomOut)
|
|
{
|
|
if(RoomPreviewer.ZOOM_ENABLED)
|
|
{
|
|
if(this._roomEngine.getRoomInstanceRenderingCanvasScale(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID) !== 1)
|
|
{
|
|
this._roomEngine.setRoomInstanceRenderingCanvasScale(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID, 1, null, null);
|
|
|
|
this._currentPreviewScale = RoomPreviewer.SCALE_NORMAL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(!geometry.isZoomedIn())
|
|
{
|
|
geometry.performZoomIn();
|
|
|
|
this._currentPreviewScale = RoomPreviewer.SCALE_NORMAL;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return point;
|
|
}
|
|
|
|
public zoomIn(): void
|
|
{
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
if(RoomPreviewer.ZOOM_ENABLED)
|
|
{
|
|
this._roomEngine.setRoomInstanceRenderingCanvasScale(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID, 1);
|
|
}
|
|
else
|
|
{
|
|
const geometry = this._roomEngine.getRoomInstanceGeometry(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID);
|
|
|
|
geometry.performZoomIn();
|
|
}
|
|
}
|
|
|
|
this._currentPreviewScale = RoomPreviewer.SCALE_NORMAL;
|
|
}
|
|
|
|
public zoomOut(): void
|
|
{
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
if(RoomPreviewer.ZOOM_ENABLED)
|
|
{
|
|
this._roomEngine.setRoomInstanceRenderingCanvasScale(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID, 0.5);
|
|
}
|
|
else
|
|
{
|
|
const geometry = this._roomEngine.getRoomInstanceGeometry(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID);
|
|
|
|
geometry.performZoomOut();
|
|
}
|
|
}
|
|
|
|
this._currentPreviewScale = RoomPreviewer.SCALE_SMALL;
|
|
}
|
|
|
|
public updateAvatarDirection(direction: number, headDirection: number): void
|
|
{
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
this._roomEngine.updateRoomObjectUserLocation(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, new Vector3d(RoomPreviewer.PREVIEW_OBJECT_LOCATION_X, RoomPreviewer.PREVIEW_OBJECT_LOCATION_Y, 0), new Vector3d(RoomPreviewer.PREVIEW_OBJECT_LOCATION_X, RoomPreviewer.PREVIEW_OBJECT_LOCATION_Y, 0), false, 0, new Vector3d((direction * 45), 0, 0), (headDirection * 45));
|
|
}
|
|
}
|
|
|
|
public updateObjectRoom(floorType: string = null, wallType: string = null, landscapeType: string = null, _arg_4: boolean = false): boolean
|
|
{
|
|
if(this.isRoomEngineReady) return this._roomEngine.updateRoomInstancePlaneType(this._previewRoomId, floorType, wallType, landscapeType, _arg_4);
|
|
|
|
return false;
|
|
}
|
|
|
|
public updateRoomWallsAndFloorVisibility(wallsVisible: boolean, floorsVisible: boolean = true): void
|
|
{
|
|
if(this.isRoomEngineReady) this._roomEngine.updateRoomInstancePlaneVisibility(this._previewRoomId, wallsVisible, floorsVisible);
|
|
}
|
|
|
|
private getCanvasOffset(point: Point): Point
|
|
{
|
|
if(((this._currentPreviewRectangle.width < 1) || (this._currentPreviewRectangle.height < 1))) return point;
|
|
|
|
let x = (-(this._currentPreviewRectangle.left + this._currentPreviewRectangle.right) >> 1);
|
|
let y = (-(this._currentPreviewRectangle.top + this._currentPreviewRectangle.bottom) >> 1);
|
|
const height = ((this._currentPreviewCanvasHeight - this._currentPreviewRectangle.height) >> 1);
|
|
|
|
if(height > 10)
|
|
{
|
|
y = (y + Math.min(15, (height - 10)));
|
|
}
|
|
else
|
|
{
|
|
if(this._currentPreviewObjectCategory !== RoomObjectCategory.UNIT)
|
|
{
|
|
y = (y + (5 - Math.max(0, (height / 2))));
|
|
}
|
|
else
|
|
{
|
|
y = (y - (5 - Math.min(0, (height / 2))));
|
|
}
|
|
}
|
|
|
|
y = (y + this._addViewOffset.y);
|
|
x = (x + this._addViewOffset.x);
|
|
|
|
const offsetX = (x - point.x);
|
|
const offsetY = (y - point.y);
|
|
|
|
if((offsetX !== 0) || (offsetY !== 0))
|
|
{
|
|
const _local_7 = Math.sqrt(((offsetX * offsetX) + (offsetY * offsetY)));
|
|
|
|
if(_local_7 > 10)
|
|
{
|
|
x = (point.x + ((offsetX * 10) / _local_7));
|
|
y = (point.y + ((offsetY * 10) / _local_7));
|
|
}
|
|
|
|
return new Point(x, y);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public updatePreviewRoomView(k: boolean = false): void
|
|
{
|
|
if(this._disableUpdate && !k) return;
|
|
|
|
this.checkAutomaticRoomObjectStateChange();
|
|
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
let offset = this._roomEngine.getRoomInstanceRenderingCanvasOffset(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID);
|
|
|
|
if(offset)
|
|
{
|
|
this.updatePreviewObjectBoundingRectangle(offset);
|
|
|
|
if(this._currentPreviewRectangle)
|
|
{
|
|
const scale = this._currentPreviewScale;
|
|
|
|
offset = this.validatePreviewSize(offset);
|
|
|
|
const canvasOffset = this.getCanvasOffset(offset);
|
|
|
|
if(canvasOffset)
|
|
{
|
|
this._roomEngine.setRoomInstanceRenderingCanvasOffset(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID, canvasOffset);
|
|
}
|
|
|
|
if(this._currentPreviewScale !== scale) this._currentPreviewRectangle = null;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public set disableUpdate(flag: boolean)
|
|
{
|
|
this._disableUpdate = flag;
|
|
}
|
|
|
|
public set disableRoomEngineUpdate(flag: boolean)
|
|
{
|
|
if(this.isRoomEngineReady) this._roomEngine.disableUpdate(flag);
|
|
}
|
|
|
|
private onRoomInitializedonRoomInitialized(event: RoomEngineEvent): void
|
|
{
|
|
if(!event) return;
|
|
|
|
switch(event.type)
|
|
{
|
|
case RoomEngineEvent.INITIALIZED:
|
|
if((event.roomId === this._previewRoomId) && this.isRoomEngineReady)
|
|
{
|
|
this._roomEngine.updateRoomInstancePlaneType(this._previewRoomId, '110', '99999');
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
|
|
private onRoomObjectAdded(event: RoomEngineObjectEvent): void
|
|
{
|
|
if((event.roomId === this._previewRoomId) && (event.objectId === RoomPreviewer.PREVIEW_OBJECT_ID) && (event.category === this._currentPreviewObjectCategory))
|
|
{
|
|
this._currentPreviewRectangle = null;
|
|
this._currentPreviewNeedsZoomOut = false;
|
|
|
|
const roomObject = this._roomEngine.getRoomObject(event.roomId, event.objectId, event.category);
|
|
|
|
if(roomObject && roomObject.model && (event.category === RoomObjectCategory.WALL))
|
|
{
|
|
const sizeZ = roomObject.model.getValue<number>(RoomObjectVariable.FURNITURE_SIZE_Z);
|
|
const centerZ = roomObject.model.getValue<number>(RoomObjectVariable.FURNITURE_CENTER_Z);
|
|
|
|
if((sizeZ !== null) || (centerZ !== null))
|
|
{
|
|
this._roomEngine.updateRoomObjectWallLocation(event.roomId, event.objectId, new Vector3d(0.5, 2.3, (((3.6 - sizeZ) / 2) + centerZ)));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public updateRoomEngine(): void
|
|
{
|
|
if(this.isRoomEngineReady) this._roomEngine.runUpdate();
|
|
}
|
|
|
|
public getRenderingCanvas(): IRoomRenderingCanvas
|
|
{
|
|
const renderingCanvas = this._roomEngine.getRoomInstanceRenderingCanvas(this._previewRoomId, RoomPreviewer.PREVIEW_CANVAS_ID);
|
|
|
|
if(!renderingCanvas) return null;
|
|
|
|
return renderingCanvas;
|
|
}
|
|
|
|
public getGenericRoomObjectImage(type: string, value: string, direction: IVector3D, scale: number, listener: IGetImageListener, bgColor: number = 0, extras: string = null, objectData: IObjectData = null, state: number = -1, frame: number = -1, posture: string = null): IImageResult
|
|
{
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
return this._roomEngine.getGenericRoomObjectImage(type, value, direction, scale, listener, bgColor, extras, objectData, state, frame, posture);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public getRoomObjectImage(direction: IVector3D, scale: number, listener: IGetImageListener, bgColor: number = 0): IImageResult
|
|
{
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
return this._roomEngine.getRoomObjectImage(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, this._currentPreviewObjectCategory, direction, scale, listener, bgColor);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public getRoomObjectCurrentImage(): RenderTexture
|
|
{
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
const roomObject = this._roomEngine.getRoomObject(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, this._currentPreviewObjectCategory);
|
|
|
|
if(roomObject && roomObject.visualization) return roomObject.visualization.getImage(0xFFFFFF, -1);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public getRoomPreviewObject(): IRoomObjectController
|
|
{
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
const roomObject = this._roomEngine.getRoomObject(this._previewRoomId, RoomPreviewer.PREVIEW_OBJECT_ID, this._currentPreviewObjectCategory);
|
|
|
|
if(roomObject) return roomObject;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public getRoomPreviewOwnRoomObject(): IRoomObjectController
|
|
{
|
|
if(this.isRoomEngineReady)
|
|
{
|
|
const roomObject = this._roomEngine.getRoomObject(this._previewRoomId, RoomEngine.ROOM_OBJECT_ID, RoomObjectCategory.ROOM);
|
|
|
|
if(roomObject) return roomObject;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public get isRoomEngineReady(): boolean
|
|
{
|
|
return (this._roomEngine && this._roomEngine.ready);
|
|
}
|
|
|
|
public get roomId(): number
|
|
{
|
|
return this._previewRoomId;
|
|
}
|
|
|
|
public get backgroundColor(): number
|
|
{
|
|
return this._backgroundColor;
|
|
}
|
|
|
|
public set backgroundColor(color: number)
|
|
{
|
|
this._backgroundColor = color;
|
|
}
|
|
|
|
public get width(): number
|
|
{
|
|
return this._currentPreviewCanvasWidth;
|
|
}
|
|
|
|
public get height(): number
|
|
{
|
|
return this._currentPreviewCanvasHeight;
|
|
}
|
|
}
|