nitro-react/src/views/room/RoomView.tsx

100 lines
4.1 KiB
TypeScript
Raw Normal View History

2021-04-18 06:58:57 +02:00
import { Nitro, RoomGeometry, RoomVariableEnum, Vector3d } from 'nitro-renderer';
import { useEffect, useState } from 'react';
import { createPortal } from 'react-dom';
import { DispatchMouseEvent } from '../../api/nitro/room/DispatchMouseEvent';
import { WindowResizeEvent } from '../../api/nitro/room/DispatchResizeEvent';
import { DispatchTouchEvent } from '../../api/nitro/room/DispatchTouchEvent';
import { GetRoomEngine } from '../../api/nitro/room/GetRoomEngine';
import { RoomViewProps } from './RoomView.types';
2021-04-22 08:45:47 +02:00
import { ChatInputView } from './widgets/chat-input/ChatInputView';
2021-05-15 22:28:59 +02:00
import { ChatWidgetView } from './widgets/chat/ChatWidgetView';
2021-04-19 18:34:31 +02:00
import { FurnitureWidgetsView } from './widgets/furniture/FurnitureWidgetsView';
2021-04-18 06:58:57 +02:00
export function RoomView(props: RoomViewProps): JSX.Element
{
const { roomSession = null, events = null } = props;
const [ roomCanvas, setRoomCanvas ] = useState<HTMLCanvasElement>(null);
useEffect(() =>
{
if(!roomSession || !events)
{
window.onresize = null;
setRoomCanvas(null);
return;
}
2021-05-10 19:11:16 +02:00
Nitro.instance.renderer.resize(window.innerWidth, window.innerHeight);
2021-04-18 06:58:57 +02:00
const canvasId = 1;
const displayObject = GetRoomEngine().getRoomInstanceDisplay(roomSession.roomId, canvasId, Nitro.instance.width, Nitro.instance.height, RoomGeometry.SCALE_ZOOMED_IN);
if(!displayObject) return;
const geometry = (GetRoomEngine().getRoomInstanceGeometry(roomSession.roomId, canvasId) as RoomGeometry);
if(geometry)
{
const minX = (GetRoomEngine().getRoomInstanceVariable<number>(roomSession.roomId, RoomVariableEnum.ROOM_MIN_X) || 0);
const maxX = (GetRoomEngine().getRoomInstanceVariable<number>(roomSession.roomId, RoomVariableEnum.ROOM_MAX_X) || 0);
const minY = (GetRoomEngine().getRoomInstanceVariable<number>(roomSession.roomId, RoomVariableEnum.ROOM_MIN_Y) || 0);
const maxY = (GetRoomEngine().getRoomInstanceVariable<number>(roomSession.roomId, RoomVariableEnum.ROOM_MAX_Y) || 0);
let x = ((minX + maxX) / 2);
let y = ((minY + maxY) / 2);
const offset = 20;
x = (x + (offset - 1));
y = (y + (offset - 1));
const z = (Math.sqrt(((offset * offset) + (offset * offset))) * Math.tan(((30 / 180) * Math.PI)));
geometry.location = new Vector3d(x, y, z);
}
const stage = Nitro.instance.stage;
if(!stage) return;
stage.addChild(displayObject);
const canvas = Nitro.instance.renderer.view;
if(!canvas) return;
canvas.onclick = event => DispatchMouseEvent(roomSession.roomId, canvasId, event);
canvas.onmousemove = event => DispatchMouseEvent(roomSession.roomId, canvasId, event);
canvas.onmousedown = event => DispatchMouseEvent(roomSession.roomId, canvasId, event);
canvas.onmouseup = event => DispatchMouseEvent(roomSession.roomId, canvasId, event);
canvas.ontouchstart = event => DispatchTouchEvent(roomSession.roomId, canvasId, event);
canvas.ontouchmove = event => DispatchTouchEvent(roomSession.roomId, canvasId, event);
canvas.ontouchend = event => DispatchTouchEvent(roomSession.roomId, canvasId, event);
canvas.ontouchcancel = event => DispatchTouchEvent(roomSession.roomId, canvasId, event);
window.onresize = event => WindowResizeEvent(roomSession.roomId, canvasId);
setRoomCanvas(canvas);
}, [ roomSession, events ]);
if(!roomSession) return null;
return (
2021-04-21 22:32:31 +02:00
<div className="nitro-room w-100 h-100">
2021-04-19 18:34:31 +02:00
{ roomSession && <div id="room-view" className="nitro-room-container"></div> }
2021-04-18 06:58:57 +02:00
{ roomSession && events && roomCanvas &&
createPortal(props.children, document.getElementById('room-view').appendChild(roomCanvas)) &&
2021-04-22 00:52:06 +02:00
<>
2021-04-22 08:45:47 +02:00
<ChatInputView />
2021-04-22 00:52:06 +02:00
<FurnitureWidgetsView events={ events } />
2021-05-15 22:28:59 +02:00
<ChatWidgetView />
2021-04-22 00:52:06 +02:00
</> }
2021-04-18 06:58:57 +02:00
</div>
);
}