-
Notifications
You must be signed in to change notification settings - Fork 42
/
Copy pathrenderer-api.ts
78 lines (72 loc) · 2.05 KB
/
renderer-api.ts
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
import { config } from './config'
import { Vector2, WebGLRenderer, Scene, Camera } from 'three'
import { invalidate } from '@react-three/fiber'
import { setAllCulled } from './utils/helpers'
import { useCanvasStore } from './store'
const viewportSize = new Vector2()
// Flag that we need global rendering (full screen)
export const requestRender = (layers = [0]) => {
useCanvasStore.getState().globalRenderQueue = useCanvasStore.getState().globalRenderQueue || [0]
useCanvasStore.getState().globalRenderQueue = [...(useCanvasStore.getState().globalRenderQueue || []), ...layers]
}
export const renderScissor = ({
gl,
scene,
camera,
left,
top,
width,
height,
layer = 0,
autoClear = false,
clearDepth = false,
}: any) => {
if (!scene || !camera) return
gl.autoClear = autoClear
gl.setScissor(left, top, width, height)
gl.setScissorTest(true)
camera.layers.set(layer)
clearDepth && gl.clearDepth()
gl.render(scene, camera)
gl.setScissorTest(false)
}
export const renderViewport = ({
gl,
scene,
camera,
left,
top,
width,
height,
layer = 0,
scissor = true,
autoClear = false,
clearDepth = false,
}: any) => {
if (!scene || !camera) return
gl.getSize(viewportSize)
gl.autoClear = autoClear
gl.setViewport(left, top, width, height)
gl.setScissor(left, top, width, height)
gl.setScissorTest(scissor)
camera.layers.set(layer)
clearDepth && gl.clearDepth()
gl.render(scene, camera)
gl.setScissorTest(false)
gl.setViewport(0, 0, viewportSize.x, viewportSize.y)
}
export const preloadScene = (
{ scene, camera, layer = 0 }: { scene?: Scene; camera?: Camera; layer?: number },
callback?: () => void
) => {
config.preloadQueue.push((gl: WebGLRenderer, globalScene: Scene, globalCamera: Camera) => {
gl.setScissorTest(false)
setAllCulled(scene || globalScene, false)
;(camera || globalCamera).layers.set(layer)
gl.render(scene || globalScene, camera || globalCamera)
setAllCulled(scene || globalScene, true)
callback && callback()
})
// auto trigger a new frame for the preload
invalidate()
}