import {ObjectUtil} from '../../../runtime/common/lang/ObjectUtil';
import {MathUtil} from '../../../runtime/math/MathUtil';
import {Matrix3x3} from '../../../runtime/math/Matrix3x3';
import {Quaternion} from '../../../runtime/math/Quaternion';
import {Vector3} from '../../../runtime/math/Vector3';
import {Camera} from './Camera';
import {PerspectiveProjection} from './PerspectiveProjection';
import {Projection} from './Projection';
//==========================================================
// 渲染相机。
//
// @author maocy
// @history 141231
//==========================================================
export class PerspectiveCamera extends Camera {
// 投影
public projection: Projection;
// 四元数
public rotation: Vector3;
public rotationMatrix: Matrix3x3;
public quaternion: Quaternion;
public quaternionX: Quaternion;
public quaternionY: Quaternion;
public quaternionZ: Quaternion;
//==========================================================
// 构造处理。
//
// @method
//==========================================================
public constructor() {
super();
// 初始化变量
this.projection = new PerspectiveProjection();
this.rotation = new Vector3();
this.rotationMatrix = new Matrix3x3();
this.quaternion = new Quaternion();
this.quaternionX = new Quaternion();
this.quaternionY = new Quaternion();
this.quaternionZ = new Quaternion();
}
//==========================================================
// X轴移动。
//
// @method
// @param value:Number 距离
//==========================================================
public doMoveX(value) {
this.position.x += value;
}
//==========================================================
// Y轴移动。
//
// @method
// @param value:Number 距离
//==========================================================
public doMoveY(value) {
this.position.y += value;
}
//==========================================================
// Z轴移动。
//
// @method
// @param value:Number 距离
//==========================================================
public doMoveZ(value) {
this.position.z += value;
}
//==========================================================
// 向前/向后移动。
//
// @method
// @param p:radian:Number 弧度
//==========================================================
public doForward(value) {
this.position.x += this.direction.x * value;
this.position.y += this.direction.y * value;
this.position.z += this.direction.z * value;
}
//==========================================================
// 向上/向下旋转。
//
// @method
// @param p:radian:Number 弧度
//==========================================================
public doPitch(p) {
this.rotation.x += p;
}
//==========================================================
// 向左/向右旋转。
//
// @method
// @param p:radian:Number 弧度
//==========================================================
public doYaw(p) {
this.rotation.y += p;
}
//==========================================================
// 向左/向右转向。
//
// @method
// @param p:radian:Number 弧度
//==========================================================
public doRoll(p) {
this.rotation.z += p;
}
//==========================================================
// 加载资源。
//
// @method
// @param resource:FE3sCamera 资源
//==========================================================
public loadResource(resource) {
// var resourceProjection = resource.projection();
// this._resource = resource;
// // 加载设置
// this.position().assign(resource.position());
// this.setDirection(resource.direction().x, resource.direction().y, resource.direction().z);
// this.update();
// // 设置投影
// var projection = this.projection();
// projection._angle = resourceProjection.angle();
// projection._znear = resourceProjection.znear();
// projection._zfar = resourceProjection.zfar();
// projection.update();
//cameraProjection.loadResource(rcv);
}
//==========================================================
// 提交资源。
//
// @method
//==========================================================
public commitResource() {
// var resource = this._resource;
// resource._position.assign(this._position);
// resource._direction.assign(this._direction);
}
//==========================================================
// 更新相机信息。
//
// @method
//==========================================================
public update() {
// 计算旋转分量
var rotation = this.rotation;
// this.quaternionX.fromAxisAngle(MathUtil.vectorAxisX, rotation.x);
// this.quaternionY.fromAxisAngle(MathUtil.vectorAxisY, rotation.y);
// this.quaternionZ.fromAxisAngle(MathUtil.vectorAxisZ, rotation.z);
this.quaternionX.fromAxisAngle(new Vector3(1, 0, 0), rotation.x);
this.quaternionY.fromAxisAngle(new Vector3(0, 1, 0), rotation.y);
this.quaternionZ.fromAxisAngle(new Vector3(0, 0, 1), rotation.z);
// 计算旋转
var quaternion = this.quaternion.identity();
quaternion.mul(this.quaternionX);
quaternion.mul(this.quaternionY);
quaternion.mul(this.quaternionZ);
// 转换为矩阵
var matrix = this.rotationMatrix;
matrix.build(quaternion);
// 计算目标
var direction = this.direction;
matrix.transformPoint3(this.directionTarget, direction);
direction.normalize();
// 父更新矩阵
super.update();
}
//==========================================================
// 释放处理。
//
// @method
//==========================================================
public dispose() {
// 释放属性
this.projection = ObjectUtil.dispose(this.projection);
// 父处理
super.dispose();
}
}