Skip to content

Commit 1fefdb2

Browse files
committed
Wrap render method in case of spectator camera to render spectator view after vrDisplay.submitFrame (fix #3541)
1 parent 93f1a4a commit 1fefdb2

File tree

1 file changed

+33
-5
lines changed

1 file changed

+33
-5
lines changed

src/systems/camera.js

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
var bind = require('../utils/bind');
21
var constants = require('../constants/');
32
var registerSystem = require('../core/system').registerSystem;
43

@@ -12,10 +11,18 @@ var DEFAULT_CAMERA_ATTR = 'data-aframe-default-camera';
1211
module.exports.System = registerSystem('camera', {
1312
init: function () {
1413
this.activeCameraEl = null;
14+
this.bindMethods();
1515
// Wait for all entities to fully load before checking for existence of camera.
1616
// Since entities wait for <a-assets> to load, any cameras attaching to the scene
1717
// will do so asynchronously.
18-
this.sceneEl.addEventListener('loaded', bind(this.setupDefaultCamera, this));
18+
this.sceneEl.addEventListener('loaded', this.setupDefaultCamera);
19+
},
20+
21+
bindMethods: function () {
22+
this.setupDefaultCamera = this.setupDefaultCamera.bind(this);
23+
this.wrapRender = this.wrapRender.bind(this);
24+
this.unwrapRender = this.unwrapRender.bind(this);
25+
this.render = this.render.bind(this);
1926
},
2027

2128
/**
@@ -131,6 +138,10 @@ module.exports.System = registerSystem('camera', {
131138
}
132139

133140
spectatorCameraEl = this.spectatorCameraEl = newCameraEl;
141+
142+
sceneEl.addEventListener('enter-vr', this.wrapRender);
143+
sceneEl.addEventListener('exit-vr', this.unwrapRender);
144+
134145
spectatorCameraEl.setAttribute('camera', 'active', false);
135146
spectatorCameraEl.play();
136147

@@ -144,14 +155,31 @@ module.exports.System = registerSystem('camera', {
144155
this.spectatorCameraEl = undefined;
145156
},
146157

147-
tock: function () {
158+
/**
159+
* Wrap the render method of the renderer to render
160+
* the spectator camera after vrDisplay.submitFrame.
161+
*/
162+
wrapRender: function () {
163+
if (!this.spectatorCameraEl) { return; }
164+
this.originalRender = this.sceneEl.renderer.render;
165+
this.sceneEl.renderer.render = this.render;
166+
},
167+
168+
unwrapRender: function () {
169+
if (!this.originalRender) { return; }
170+
this.sceneEl.renderer.render = this.originalRender;
171+
this.originalRender = undefined;
172+
},
173+
174+
render: function (scene, camera, renderTarget) {
148175
var spectatorCamera;
149176
var sceneEl = this.sceneEl;
150177
var isVREnabled = sceneEl.renderer.vr.enabled;
151-
if (!this.spectatorCameraEl || sceneEl.isMobile) { return; }
178+
this.originalRender.call(sceneEl.renderer, scene, camera, renderTarget);
179+
if (!this.spectatorCameraEl || sceneEl.isMobile || !isVREnabled) { return; }
152180
spectatorCamera = this.spectatorCameraEl.components.camera.camera;
153181
sceneEl.renderer.vr.enabled = false;
154-
sceneEl.renderer.render(sceneEl.object3D, spectatorCamera);
182+
this.originalRender.call(sceneEl.renderer, scene, spectatorCamera);
155183
sceneEl.renderer.vr.enabled = isVREnabled;
156184
}
157185
});

0 commit comments

Comments
 (0)