-
-
Notifications
You must be signed in to change notification settings - Fork 35.5k
/
Copy pathWebXRDepthSensing.js
110 lines (66 loc) · 1.96 KB
/
WebXRDepthSensing.js
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
import { PlaneGeometry } from '../../geometries/PlaneGeometry.js';
import { ShaderMaterial } from '../../materials/ShaderMaterial.js';
import { Mesh } from '../../objects/Mesh.js';
import { Texture } from '../../textures/Texture.js';
const _occlusion_vertex = `
void main() {
gl_Position = vec4( position, 1.0 );
}`;
const _occlusion_fragment = `
uniform sampler2DArray depthColor;
uniform float depthWidth;
uniform float depthHeight;
void main() {
vec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight );
if ( coord.x >= 1.0 ) {
gl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;
} else {
gl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;
}
}`;
class WebXRDepthSensing {
constructor() {
this.texture = null;
this.mesh = null;
this.depthNear = 0;
this.depthFar = 0;
}
init( renderer, depthData, renderState ) {
if ( this.texture === null ) {
const texture = new Texture();
const texProps = renderer.properties.get( texture );
texProps.__webglTexture = depthData.texture;
if ( ( depthData.depthNear !== renderState.depthNear ) || ( depthData.depthFar !== renderState.depthFar ) ) {
this.depthNear = depthData.depthNear;
this.depthFar = depthData.depthFar;
}
this.texture = texture;
}
}
getMesh( cameraXR ) {
if ( this.texture !== null ) {
if ( this.mesh === null ) {
const viewport = cameraXR.cameras[ 0 ].viewport;
const material = new ShaderMaterial( {
vertexShader: _occlusion_vertex,
fragmentShader: _occlusion_fragment,
uniforms: {
depthColor: { value: this.texture },
depthWidth: { value: viewport.z },
depthHeight: { value: viewport.w }
}
} );
this.mesh = new Mesh( new PlaneGeometry( 20, 20 ), material );
}
}
return this.mesh;
}
reset() {
this.texture = null;
this.mesh = null;
}
getDepthTexture() {
return this.texture;
}
}
export { WebXRDepthSensing };