/** * 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, apiCamera.parentEntity ); 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(), GameLib.Utils.IdOrNull(this.parentEntity) ); }; /** * 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 = GameLib.D3.API.Camera.FromObjectCamera(objectCamera); return new GameLib.D3.Camera( graphics, apiCamera ); };