Skip to content

Commit fced7c5

Browse files
committed
wait for camera to be active before rendering (fixes #1733, fixes #1754)
1 parent f6953d4 commit fced7c5

File tree

3 files changed

+43
-19
lines changed

3 files changed

+43
-19
lines changed

‎src/core/scene/a-scene.js‎

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -313,19 +313,29 @@ module.exports = registerElement('a-scene', {
313313
}
314314

315315
this.addEventListener('loaded', function () {
316-
if (this.renderStarted) { return; }
316+
AEntity.prototype.play.call(this); // .play() *before* render.
317317

318-
AEntity.prototype.play.call(this);
319-
this.resize();
318+
// Wait for camera if necessary before rendering.
319+
if (this.camera) {
320+
startRender(this);
321+
return;
322+
}
323+
this.addEventListener('camera-set-active', function () { startRender(this); });
320324

321-
// Kick off render loop.
322-
if (this.renderer) {
323-
if (window.performance) {
324-
window.performance.mark('render-started');
325+
function startRender (sceneEl) {
326+
if (sceneEl.renderStarted) { return; }
327+
328+
sceneEl.resize();
329+
330+
// Kick off render loop.
331+
if (sceneEl.renderer) {
332+
if (window.performance) {
333+
window.performance.mark('render-started');
334+
}
335+
sceneEl.render(0);
336+
sceneEl.renderStarted = true;
337+
sceneEl.emit('renderstart');
325338
}
326-
this.render(0);
327-
this.renderStarted = true;
328-
this.emit('renderstart');
329339
}
330340
});
331341

@@ -388,11 +398,10 @@ module.exports = registerElement('a-scene', {
388398
*/
389399
render: {
390400
value: function (time) {
391-
var camera = this.camera;
392401
var timeDelta = time - this.time;
393402

394403
if (this.isPlaying) { this.tick(time, timeDelta); }
395-
this.effect.render(this.object3D, camera);
404+
this.effect.render(this.object3D, this.camera);
396405

397406
this.time = time;
398407
this.animationFrameID = window.requestAnimationFrame(this.render.bind(this));

‎src/systems/camera.js‎

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
var registerSystem = require('../core/system').registerSystem;
21
var constants = require('../constants/');
2+
var registerSystem = require('../core/system').registerSystem;
33

44
var DEFAULT_CAMERA_ATTR = 'data-aframe-default-camera';
55
var DEFAULT_USER_HEIGHT = 1.6;
@@ -29,11 +29,13 @@ module.exports.System = registerSystem('camera', {
2929
// Since entities wait for <a-assets> to load, any cameras attaching to the scene
3030
// will do so asynchronously.
3131
sceneEl.addEventListener('loaded', function checkForCamera () {
32-
var currentCamera = sceneEl.camera;
33-
if (currentCamera) {
34-
sceneEl.emit('camera-ready', {cameraEl: currentCamera.el});
32+
// Camera already defined.
33+
if (sceneEl.camera) {
34+
sceneEl.emit('camera-ready', {cameraEl: sceneEl.camera.el});
3535
return;
3636
}
37+
38+
// Set up default camera.
3739
defaultCameraEl = document.createElement('a-entity');
3840
defaultCameraEl.setAttribute('position', '0 0 0');
3941
defaultCameraEl.setAttribute(DEFAULT_CAMERA_ATTR, '');
@@ -69,16 +71,21 @@ module.exports.System = registerSystem('camera', {
6971
*/
7072
setActiveCamera: function (newCameraEl) {
7173
var cameraEl;
72-
var cameraEls = this.sceneEl.querySelectorAll('[camera]');
74+
var cameraEls;
7375
var i;
74-
var sceneEl = this.sceneEl;
75-
var newCamera = newCameraEl.getObject3D('camera');
76+
var newCamera;
7677
var previousCamera = this.activeCameraEl;
78+
var sceneEl = this.sceneEl;
79+
80+
// Same camera.
81+
newCamera = newCameraEl.getObject3D('camera');
7782
if (!newCamera || newCameraEl === this.activeCameraEl) { return; }
83+
7884
// Grab the default camera.
7985
var defaultCameraWrapper = sceneEl.querySelector('[' + DEFAULT_CAMERA_ATTR + ']');
8086
var defaultCameraEl = defaultCameraWrapper &&
8187
defaultCameraWrapper.querySelector('[camera]');
88+
8289
// Remove default camera if new camera is not the default camera.
8390
if (newCameraEl !== defaultCameraEl) { removeDefaultCamera(sceneEl); }
8491

@@ -91,7 +98,9 @@ module.exports.System = registerSystem('camera', {
9198
if (previousCamera) {
9299
previousCamera.setAttribute('camera', 'active', false);
93100
}
101+
94102
// Disable other cameras in the scene
103+
cameraEls = sceneEl.querySelectorAll('[camera]');
95104
for (i = 0; i < cameraEls.length; i++) {
96105
cameraEl = cameraEls[i];
97106
if (newCameraEl === cameraEl) { continue; }

‎tests/core/scene/a-scene.test.js‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,12 @@ helpers.getSkipCISuite()('a-scene (with renderer)', function () {
155155
});
156156
});
157157

158+
suite('play', function () {
159+
test('has camera on renderstart', function () {
160+
assert.ok(this.el.camera);
161+
});
162+
});
163+
158164
test('calls behaviors', function () {
159165
var scene = this.el;
160166
var Component = { el: { isPlaying: true }, tick: function () {} };

0 commit comments

Comments
 (0)