Skip to content

Commit 01b059e

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 07ce6a5 commit 01b059e

File tree

4 files changed

+47
-9
lines changed

4 files changed

+47
-9
lines changed

examples/jsm/postprocessing/EffectComposer.js

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { CopyShader } from '../shaders/CopyShader.js';
99
import { ShaderPass } from './ShaderPass.js';
1010
import { ClearMaskPass, MaskPass } from './MaskPass.js';
1111

12+
<<<<<<< HEAD
1213
/**
1314
* Used to implement post-processing effects in three.js.
1415
* The class manages a chain of post-processing passes to produce the final visual result.
@@ -37,6 +38,10 @@ import { ClearMaskPass, MaskPass } from './MaskPass.js';
3738
* }
3839
* ```
3940
*/
41+
=======
42+
const size = /* @__PURE__ */ new Vector2();
43+
44+
>>>>>>> d575277f70 (Enable post-processing in VR (#20))
4045
class EffectComposer {
4146

4247
/**
@@ -60,7 +65,7 @@ class EffectComposer {
6065

6166
if ( renderTarget === undefined ) {
6267

63-
const size = renderer.getSize( new Vector2() );
68+
renderer.getSize( size );
6469
this._width = size.width;
6570
this._height = size.height;
6671

@@ -125,6 +130,22 @@ class EffectComposer {
125130
* @type {Clock}
126131
*/
127132
this.clock = new Clock();
133+
134+
this.onSessionStateChange = this.onSessionStateChange.bind( this );
135+
this.renderer.xr.addEventListener( 'sessionstart', this.onSessionStateChange );
136+
this.renderer.xr.addEventListener( 'sessionend', this.onSessionStateChange );
137+
138+
}
139+
140+
onSessionStateChange() {
141+
142+
this.renderer.getSize( size );
143+
this._width = size.width;
144+
this._height = size.height;
145+
146+
this._pixelRatio = this.renderer.xr.isPresenting ? 1 : this.renderer.getPixelRatio();
147+
148+
this.setSize( this._width, this._height );
128149

129150
}
130151

@@ -283,7 +304,7 @@ class EffectComposer {
283304

284305
if ( renderTarget === undefined ) {
285306

286-
const size = this.renderer.getSize( new Vector2() );
307+
this.renderer.getSize( size );
287308
this._pixelRatio = this.renderer.getPixelRatio();
288309
this._width = size.width;
289310
this._height = size.height;
@@ -354,6 +375,9 @@ class EffectComposer {
354375

355376
this.copyPass.dispose();
356377

378+
this.renderer.xr.removeEventListener( 'sessionstart', this.onSessionStateChange );
379+
this.renderer.xr.removeEventListener( 'sessionend', this.onSessionStateChange );
380+
357381
}
358382

359383
}

examples/jsm/postprocessing/Pass.js

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

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

170+
renderer.xr.enabled = false;
171+
renderer.render( this._mesh, _camera );
172+
renderer.xr.enabled = xrEnabled;
168173
}
169174

170175
/**

src/renderers/WebGLRenderer.js

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

2756+
// Render to base layer instead of canvas in WebXR
2757+
if ( renderTarget === null && this.xr.isPresenting ) {
2758+
2759+
renderTarget = this.xr.getRenderTarget();
2760+
2761+
}
2762+
27562763
_currentRenderTarget = renderTarget;
27572764
_currentActiveCubeFace = activeCubeFace;
27582765
_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

@@ -366,6 +362,12 @@ class WebXRManager extends EventDispatcher {
366362

367363
};
368364

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

0 commit comments

Comments
 (0)