Skip to content

Commit f904ccf

Browse files
enzofrancescaHMdmarcos
authored andcommitted
Enable post-processing in VR (#20)
* Update WebXRManager.js * Update WebGLRenderer.js * Update WebGLRenderer.js deleted useless blank lines * Update WebXRManager.js - Deleted useless code and blank lines - refectored _getRenderTarget to getRenderTarget * Update WebGLRenderer.js Reflect the refactoring of getRenderTarget function Improve compatibility of Post-Processing with VR (#23) * Update EffectComposer.js for better compatibility with VR * Update Pass.js for better compatibility with VR
1 parent 26b2ddf commit f904ccf

File tree

4 files changed

+44
-9
lines changed

4 files changed

+44
-9
lines changed

examples/jsm/postprocessing/EffectComposer.js

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ import { ClearMaskPass, MaskPass } from './MaskPass.js';
3939
*
4040
* @three_import import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';
4141
*/
42+
const size = /* @__PURE__ */ new Vector2();
43+
4244
class EffectComposer {
4345

4446
/**
@@ -62,7 +64,7 @@ class EffectComposer {
6264

6365
if ( renderTarget === undefined ) {
6466

65-
const size = renderer.getSize( new Vector2() );
67+
renderer.getSize( size );
6668
this._width = size.width;
6769
this._height = size.height;
6870

@@ -128,6 +130,22 @@ class EffectComposer {
128130
*/
129131
this.clock = new Clock();
130132

133+
this.onSessionStateChange = this.onSessionStateChange.bind( this );
134+
this.renderer.xr.addEventListener( 'sessionstart', this.onSessionStateChange );
135+
this.renderer.xr.addEventListener( 'sessionend', this.onSessionStateChange );
136+
137+
}
138+
139+
onSessionStateChange() {
140+
141+
this.renderer.getSize( size );
142+
this._width = size.width;
143+
this._height = size.height;
144+
145+
this._pixelRatio = this.renderer.xr.isPresenting ? 1 : this.renderer.getPixelRatio();
146+
147+
this.setSize( this._width, this._height );
148+
131149
}
132150

133151
/**
@@ -285,7 +303,7 @@ class EffectComposer {
285303

286304
if ( renderTarget === undefined ) {
287305

288-
const size = this.renderer.getSize( new Vector2() );
306+
this.renderer.getSize( size );
289307
this._pixelRatio = this.renderer.getPixelRatio();
290308
this._width = size.width;
291309
this._height = size.height;
@@ -356,6 +374,9 @@ class EffectComposer {
356374

357375
this.copyPass.dispose();
358376

377+
this.renderer.xr.removeEventListener( 'sessionstart', this.onSessionStateChange );
378+
this.renderer.xr.removeEventListener( 'sessionend', this.onSessionStateChange );
379+
359380
}
360381

361382
}

examples/jsm/postprocessing/Pass.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,13 @@ class FullScreenQuad {
165165
*/
166166
render( renderer ) {
167167

168-
renderer.render( this._mesh, _camera );
168+
// Disable XR projection for fullscreen effects
169+
// https://github.com/mrdoob/three.js/pull/18846
170+
const xrEnabled = renderer.xr.enabled;
169171

172+
renderer.xr.enabled = false;
173+
renderer.render( this._mesh, _camera );
174+
renderer.xr.enabled = xrEnabled;
170175
}
171176

172177
/**

src/renderers/WebGLRenderer.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2747,6 +2747,13 @@ class WebGLRenderer {
27472747
*/
27482748
this.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {
27492749

2750+
// Render to base layer instead of canvas in WebXR
2751+
if ( renderTarget === null && this.xr.isPresenting ) {
2752+
2753+
renderTarget = this.xr.getRenderTarget();
2754+
2755+
}
2756+
27502757
_currentRenderTarget = renderTarget;
27512758
_currentActiveCubeFace = activeCubeFace;
27522759
_currentActiveMipmapLevel = activeMipmapLevel;

src/renderers/webxr/WebXRManager.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,13 @@ import { WebXRDepthSensing } from './WebXRDepthSensing.js';
2424
*/
2525
class WebXRManager extends EventDispatcher {
2626

27-
<<<<<<< HEAD
2827
/**
2928
* Constructs a new WebGL renderer.
3029
*
3130
* @param {WebGLRenderer} renderer - The renderer.
3231
* @param {WebGL2RenderingContext} gl - The rendering context.
3332
*/
34-
constructor( renderer, gl ) {
35-
=======
3633
constructor( renderer, gl, extensions, useMultiview ) {
37-
>>>>>>> 1123347a27 (WebXR: Implement antialiased multiview using OCULUS_multiview (#15))
3834

3935
super();
4036

@@ -250,6 +246,8 @@ class WebXRManager extends EventDispatcher {
250246

251247
// restore framebuffer/rendering state
252248

249+
scope.isPresenting = false;
250+
253251
renderer.setRenderTarget( initialRenderTarget );
254252

255253
glBaseLayer = null;
@@ -262,8 +260,6 @@ class WebXRManager extends EventDispatcher {
262260

263261
animation.stop();
264262

265-
scope.isPresenting = false;
266-
267263
renderer.setPixelRatio( currentPixelRatio );
268264
renderer.setSize( currentSize.width, currentSize.height, false );
269265

@@ -367,6 +363,12 @@ class WebXRManager extends EventDispatcher {
367363

368364
};
369365

366+
this.getRenderTarget = function () {
367+
368+
return newRenderTarget;
369+
370+
};
371+
370372
/**
371373
* Returns the current XR session.
372374
*

0 commit comments

Comments
 (0)