You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
3.0 KiB
TypeScript
110 lines
3.0 KiB
TypeScript
// Copyright (C) 2021 Intel Corporation
|
|
//
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
import React, { ReactElement, useEffect, useRef } from 'react';
|
|
import { GlobalHotKeys } from 'react-hotkeys';
|
|
import Layout from 'antd/lib/layout/layout';
|
|
|
|
import { Workspace } from 'reducers/interfaces';
|
|
import { Canvas3d } from 'cvat-canvas3d-wrapper';
|
|
import ContextImage from '../standard3D-workspace/context-image/context-image';
|
|
|
|
interface Props {
|
|
canvasInstance: Canvas3d;
|
|
jobInstance: any;
|
|
frameData: any;
|
|
curZLayer: number;
|
|
contextImageHide: boolean;
|
|
loaded: boolean;
|
|
data: string;
|
|
annotations: any[];
|
|
onSetupCanvas: () => void;
|
|
getContextImage(): void;
|
|
workspace: Workspace;
|
|
animateID: any;
|
|
automaticBordering: boolean;
|
|
showObjectsTextAlways: boolean;
|
|
}
|
|
|
|
const CanvasWrapperComponent = (props: Props): ReactElement => {
|
|
const animateId = useRef(0);
|
|
const cvatCanvasContainerRef = useRef();
|
|
|
|
const {
|
|
frameData, contextImageHide, getContextImage, loaded, data, annotations, curZLayer,
|
|
} = props;
|
|
|
|
const fitCanvas = (): void => {
|
|
const { canvasInstance } = props;
|
|
canvasInstance.fitCanvas();
|
|
};
|
|
|
|
const onCanvasSetup = (): void => {
|
|
const { onSetupCanvas } = props;
|
|
onSetupCanvas();
|
|
};
|
|
|
|
const animateCanvas = (): void => {
|
|
const { canvasInstance } = props;
|
|
|
|
canvasInstance.render();
|
|
animateId.current = requestAnimationFrame(animateCanvas);
|
|
};
|
|
|
|
const updateCanvas = (): void => {
|
|
const { canvasInstance } = props;
|
|
|
|
if (frameData !== null) {
|
|
canvasInstance.setup(frameData);
|
|
}
|
|
};
|
|
|
|
const initialSetup = (): void => {
|
|
const { canvasInstance } = props;
|
|
|
|
// Size
|
|
window.addEventListener('resize', fitCanvas);
|
|
fitCanvas();
|
|
|
|
// Events
|
|
canvasInstance.html().addEventListener('canvas.setup', onCanvasSetup);
|
|
};
|
|
|
|
useEffect(() => {
|
|
const { canvasInstance } = props;
|
|
|
|
cvatCanvasContainerRef.current.appendChild(canvasInstance.html());
|
|
|
|
initialSetup();
|
|
updateCanvas();
|
|
animateCanvas();
|
|
|
|
return () => {
|
|
canvasInstance.html().removeEventListener('canvas.setup', onCanvasSetup);
|
|
window.removeEventListener('resize', fitCanvas);
|
|
cancelAnimationFrame(animateId.current);
|
|
};
|
|
});
|
|
|
|
useEffect(() => {
|
|
updateCanvas();
|
|
}, [frameData, annotations, curZLayer]);
|
|
|
|
return (
|
|
<Layout.Content style={{ position: 'relative' }}>
|
|
<GlobalHotKeys />
|
|
<ContextImage
|
|
frame={frameData}
|
|
contextImageHide={contextImageHide}
|
|
getContextImage={getContextImage}
|
|
loaded={loaded}
|
|
data={data}
|
|
/>
|
|
<div ref={cvatCanvasContainerRef} className='cvat-canvas-container cvat-canvas-container-overflow' />
|
|
</Layout.Content>
|
|
);
|
|
};
|
|
|
|
export default React.memo(CanvasWrapperComponent);
|