var registerComponent = require('../core/component').registerComponent; var THREE = require('../lib/three'); /** * Camera component. * Pairs along with camera system to handle tracking the active camera. */ module.exports.Component = registerComponent('camera', { schema: { active: {default: true}, far: {default: 10000}, fov: {default: 80, min: 0}, near: {default: 0.005, min: 0}, spectator: {default: false}, zoom: {default: 1, min: 0} }, /** * Initialize three.js camera and add it to the entity. * Add reference from scene to this entity as the camera. */ init: function () { var camera; var el = this.el; // Create camera. camera = this.camera = new THREE.PerspectiveCamera(); el.setObject3D('camera', camera); }, /** * Update three.js camera. */ update: function (oldData) { var data = this.data; var camera = this.camera; // Update properties. camera.aspect = data.aspect || (window.innerWidth / window.innerHeight); camera.far = data.far; camera.fov = data.fov; camera.near = data.near; camera.zoom = data.zoom; camera.updateProjectionMatrix(); this.updateActiveCamera(oldData); this.updateSpectatorCamera(oldData); }, updateActiveCamera: function (oldData) { var data = this.data; var el = this.el; var system = this.system; // Active property did not change. if (oldData && oldData.active === data.active || data.spectator) { return; } // If `active` property changes, or first update, handle active camera with system. if (data.active && system.activeCameraEl !== el) { // Camera enabled. Set camera to this camera. system.setActiveCamera(el); } else if (!data.active && system.activeCameraEl === el) { // Camera disabled. Set camera to another camera. system.disableActiveCamera(); } }, updateSpectatorCamera: function (oldData) { var data = this.data; var el = this.el; var system = this.system; // spectator property did not change. if (oldData && oldData.spectator === data.spectator) { return; } // If `spectator` property changes, or first update, handle spectator camera with system. if (data.spectator && system.spectatorCameraEl !== el) { // Camera enabled. Set camera to this camera. system.setSpectatorCamera(el); } else if (!data.spectator && system.spectatorCameraEl === el) { // Camera disabled. Set camera to another camera. system.disableSpectatorCamera(); } }, /** * Remove camera on remove (callback). */ remove: function () { this.el.removeObject3D('camera'); } });