r3-legacy/src/r3-d3-camera-a.js

111 lines
2.7 KiB
JavaScript

/**
* 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
);
};