/** * R3.D3.Camera * @param graphics R3.GraphicsRuntime * @param apiD3ObjectCamera GR3.D3.API.Object * @constructor */ R3.D3.Camera = function( graphics, apiD3ObjectCamera ) { this.graphics = graphics; this.graphics.isNotThreeThrow(); if (R3.Utils.UndefinedOrNull(apiD3ObjectCamera)) { apiD3ObjectCamera = { objectType : R3.D3.API.Object.OBJECT_TYPE_CAMERA }; } R3.D3.API.Camera.call( this, apiD3ObjectCamera, apiD3ObjectCamera.aspect ); R3.D3.Object.call( this, this.graphics, this ); }; R3.D3.Camera.prototype = Object.create(R3.D3.Object.prototype); R3.D3.Camera.prototype.constructor = R3.D3.Camera; /** * Creates a camera instance of 'graphics' type (only THREE for now) * @returns {THREE.Camera} */ R3.D3.Camera.prototype.createInstance = function() { /** * Not all implementations of camera has aspect ratio, we, however do have an aspect ratio for all our cameras */ if (R3.Utils.Defined(this.instance.aspect)) { var size = R3.Utils.GetWindowSize(); this.aspect = size.width / size.height; this.instance.aspect = this.aspect; } R3.D3.Object.prototype.createInstance.call(this); }; /** * Updates the instance with the current state */ R3.D3.Camera.prototype.updateInstance = function(property) { if (property === 'aspect') { if (R3.Utils.Defined(this.instance.aspect)) { this.instance.aspect = this.aspect; if (R3.Utils.Defined(this.instance.updateProjectionMatrix)) { this.instance.updateProjectionMatrix(); } } else { console.warn('updating the aspect ratio of this type of camera has no effect.'); } return; } R3.D3.Object.prototype.updateInstance.call(this, property); }; /** * Update R3.D3.Camera from instance */ R3.D3.Camera.prototype.updateFromInstance = function() { this.aspect = this.instance.aspect; this.position.x = this.instance.position.x; this.position.y = this.instance.position.y; this.position.z = this.instance.position.z; if (this.instance.target) { this.lookAt.x = this.instance.target.position.x; this.lookAt.y = this.instance.target.position.y; this.lookAt.z = this.instance.target.position.z; } else { console.warn('todo: update lookAt somehow...'); } }; /** * Converts a R3.D3.Camera to a new R3.D3.API.Camera * @returns {R3.D3.API.Camera} */ R3.D3.Camera.prototype.toApiObject = function() { var apiD3Object = R3.D3.Object.prototype.toApiObject.call(this); return new R3.D3.API.Camera( apiD3Object, this.aspect ); };