Skip to content

Commit 73c682a

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 9bee41b commit 73c682a

File tree

4 files changed

+44
-5
lines changed

4 files changed

+44
-5
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
@@ -2761,6 +2761,13 @@ class WebGLRenderer {
27612761
*/
27622762
this.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {
27632763

2764+
// Render to base layer instead of canvas in WebXR
2765+
if ( renderTarget === null && this.xr.isPresenting ) {
2766+
2767+
renderTarget = this.xr.getRenderTarget();
2768+
2769+
}
2770+
27642771
_currentRenderTarget = renderTarget;
27652772
_currentActiveCubeFace = activeCubeFace;
27662773
_currentActiveMipmapLevel = activeMipmapLevel;

src/renderers/webxr/WebXRManager.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,8 @@ class WebXRManager extends EventDispatcher {
256256

257257
// restore framebuffer/rendering state
258258

259+
scope.isPresenting = false;
260+
259261
renderer.setRenderTarget( initialRenderTarget );
260262

261263
glBaseLayer = null;
@@ -268,8 +270,6 @@ class WebXRManager extends EventDispatcher {
268270

269271
animation.stop();
270272

271-
scope.isPresenting = false;
272-
273273
renderer.setPixelRatio( currentPixelRatio );
274274
renderer.setSize( currentSize.width, currentSize.height, false );
275275

@@ -385,6 +385,12 @@ class WebXRManager extends EventDispatcher {
385385

386386
};
387387

388+
this.getRenderTarget = function () {
389+
390+
return newRenderTarget;
391+
392+
};
393+
388394
/**
389395
* Returns the current XR session.
390396
*

0 commit comments

Comments
 (0)