-
Notifications
You must be signed in to change notification settings - Fork 43
Expand file tree
/
Copy pathFoundObject.tsx
More file actions
122 lines (104 loc) · 3.27 KB
/
FoundObject.tsx
File metadata and controls
122 lines (104 loc) · 3.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import React, { useEffect, useState, useRef } from 'react';
import '../styles/inventory.scss';
import {
createOverlayClock,
createOverlayRenderer,
createOverlayCanvas,
loadSceneInventoryModel,
createOverlayScene
} from './overlay';
const FoundObject = ({ foundObject }) => {
const itemRef = useRef(null);
const [model, setModel] = useState(null);
const [scene, setScene] = useState(null);
const [clock, setClock] = useState(null);
const [canvas, setCanvas] = useState(null);
const [renderer, setRenderer] = useState(null);
const renderLoop = (time, sce, m, item) => {
if (!item || !item.current || !m) {
return;
}
const canvasClip = canvas.getBoundingClientRect();
const { left, bottom, width, height } = item.current.getBoundingClientRect();
// set canvas size once with same aspect ratio as the found object item area
if (canvas.width === 0) {
canvas.width = canvas.style.width = width * 5;
canvas.height = canvas.style.height = height * 5;
renderer.resize(canvas.width, canvas.height);
}
const itemLeft = left - canvasClip.left;
const itemBottom = canvasClip.bottom - bottom;
renderer.stats.begin();
renderer.setViewport(itemLeft, itemBottom, width, height);
renderer.setScissor(itemLeft, itemBottom, width, height);
renderer.setScissorTest(true);
sce.camera.update(
m,
true,
{ x: 0, y: 0},
2.5,
time,
);
renderer.render(sce);
renderer.stats.end();
};
useEffect(() => {
setClock(createOverlayClock());
setCanvas(createOverlayCanvas('foundObject-canvas'));
setScene(createOverlayScene(3));
}, []);
useEffect(() => {
if (scene) {
setModel(loadSceneInventoryModel(scene, foundObject));
}
}, [scene]);
useEffect(() => {
if (clock) {
clock.start();
}
return () => {
if (clock) {
clock.stop();
}
};
}, [clock]);
useEffect(() => {
if (canvas) {
if (renderer === null) {
setRenderer(createOverlayRenderer(canvas, 'foundObject'));
}
itemRef.current.appendChild(canvas);
}
return () => { };
}, [canvas]);
useEffect(() => {
return () => {
if (renderer) {
renderer.dispose();
}
};
}, [renderer]);
useEffect(() => {
if (renderer) {
renderer.threeRenderer.setAnimationLoop(() => {
if (scene && model) {
const time = {
delta: Math.min(clock.getDelta(), 0.05),
elapsed: clock.getElapsedTime(),
};
renderLoop(time, scene, model, itemRef);
}
});
}
return () => {
if (renderer) {
renderer.threeRenderer.setAnimationLoop(null);
}
};
}, [renderer]);
if (foundObject !== null) {
return <div ref={itemRef} className="foundObject" />;
}
return null;
};
export default FoundObject;