/** * Creates a camera object * @param graphics GameLib.D3.Graphics * @param apiCamera GameLib.D3.API.Camera * @constructor */ GameLib.D3.Camera = function Camera( graphics, apiCamera ) { this.graphics = graphics; this.graphics.isNotThreeThrow(); GameLib.D3.API.Camera.call( this, apiCamera.id, apiCamera.cameraType, apiCamera.name, apiCamera.fov, apiCamera.aspect, apiCamera.near, apiCamera.far, apiCamera.position, apiCamera.lookAt, apiCamera.minX, apiCamera.maxX, apiCamera.minY, apiCamera.maxY, apiCamera.minZ, apiCamera.maxZ, apiCamera.quaternion ); this.position = new GameLib.Vector3( graphics, this, this.position ); this.quaternion = new GameLib.Quaternion( graphics, this, this.quaternion ); this.lookAt = new GameLib.Vector3( graphics, this, this.lookAt ); this.instance = this.createInstance(); this.needsUpdate = false; } ; GameLib.D3.Camera.prototype = Object.create(GameLib.D3.API.Camera.prototype); GameLib.D3.Camera.prototype.constructor = GameLib.D3.Camera; /** * Camera types * @type {number} */ GameLib.D3.Camera.CAMERA_TYPE_PERSPECTIVE = 0x1; GameLib.D3.Camera.CAMERA_TYPE_ORTHOGONAL = 0x2; GameLib.D3.Camera.CAMERA_TYPE_STEREO = 0x3; /** * Creates a camera instance of 'graphics' type (only THREE for now) * @returns {THREE.Camera} */ GameLib.D3.Camera.prototype.createInstance = function(update) { var instance = null; if (update) { instance = this.instance; } if (!instance) { if (this.cameraType == GameLib.D3.Camera.CAMERA_TYPE_PERSPECTIVE) { instance = new this.graphics.instance.PerspectiveCamera( this.fov, this.aspect, this.near, this.far ); } else if (this.cameraType == GameLib.D3.Camera.CAMERA_TYPE_ORTHOGONAL) { instance = new this.graphics.instance.OrthographicCamera( this.minX, this.maxX, this.minY, this.maxY, this.minZ, this.maxZ ); } } if (update) { instance.minX = this.minX; instance.maxX = this.maxX; instance.minY = this.minY; instance.maxY = this.maxY; instance.minZ = this.minZ; instance.maxZ = this.maxZ; instance.fov = this.fov; instance.aspect = this.aspect; instance.near = this.near; instance.far = this.far; } instance.position.x = this.position.x; instance.position.y = this.position.y; instance.position.z = this.position.z; instance.quaternion.x = this.quaternion.x; instance.quaternion.y = this.quaternion.y; instance.quaternion.z = this.quaternion.z; instance.quaternion.w = this.quaternion.w; if (!update) { instance.lookAt(this.lookAt.instance); } instance.updateProjectionMatrix(); return instance; }; /** * Updates the instance with the current state */ GameLib.D3.Camera.prototype.updateInstance = function() { this.instance = this.createInstance(true); }; /** * Converts a GameLib.D3.Camera to a new GameLib.D3.API.Camera * @returns {GameLib.D3.API.Camera} */ GameLib.D3.Camera.prototype.toApiCamera = function() { return new GameLib.D3.API.Camera( this.id, this.cameraType, this.name, this.fov, this.aspect, this.near, this.far, this.position.toApiVector(), this.lookAt.toApiVector(), this.minX, this.maxX, this.minY, this.maxY, this.minZ, this.maxZ, this.quaternion.toApiQuaternion() ); }; /** * Converts from an Object camera to a GameLib.D3.Camera * @param graphics GameLib.D3.Graphics * @param objectCamera Object * @returns {GameLib.D3.Camera} * @constructor */ GameLib.D3.Camera.FromObjectCamera = function(graphics, objectCamera) { var apiCamera = new GameLib.D3.API.Camera( objectCamera.id, objectCamera.cameraType, objectCamera.name, objectCamera.fov, objectCamera.aspect, objectCamera.near, objectCamera.far, new GameLib.API.Vector3( objectCamera.position.x, objectCamera.position.y, objectCamera.position.z ), new GameLib.API.Vector3( objectCamera.lookAt.x, objectCamera.lookAt.y, objectCamera.lookAt.z ), objectCamera.minX, objectCamera.maxX, objectCamera.minY, objectCamera.maxY, objectCamera.minZ, objectCamera.maxZ, new GameLib.API.Quaternion( objectCamera.quaternion.x, objectCamera.quaternion.y, objectCamera.quaternion.z, objectCamera.quaternion.w, new GameLib.API.Vector3( objectCamera.quaternion.axis.x, objectCamera.quaternion.axis.y, objectCamera.quaternion.axis.z ), objectCamera.quaternion.angle ) ); return new GameLib.D3.Camera( graphics, apiCamera ); };