158 lines
3.1 KiB
C++
158 lines
3.1 KiB
C++
#include "Camera.h"
|
|
//Hack: temp include, calc proj matrix properly later
|
|
#include "..\Core\CoreIncludes.h"
|
|
|
|
using namespace Oyster;
|
|
using namespace Render;
|
|
using namespace Oyster::Math;
|
|
Camera::Camera(void)
|
|
{
|
|
}
|
|
|
|
|
|
Camera::~Camera(void)
|
|
{
|
|
}
|
|
|
|
Math::Float3 Camera::GetPosition() {return pos;}
|
|
void Camera::SetPosition(Math::Float3 p){ pos=p;}
|
|
|
|
//axis
|
|
Math::Float3 Camera::GetRight() {return right;}
|
|
Math::Float3 Camera::GetUp() {return up;}
|
|
Math::Float3 Camera::GetLook() {return look;}
|
|
|
|
//frustrum
|
|
float Camera::GetNearZ(){return nearZ;}
|
|
float Camera::GetFarZ(){return farZ;}
|
|
float Camera::GetAspect(){return aspect;}
|
|
float Camera::GetFovY(){return fovY;}
|
|
float Camera::GetFovX(){return fovX;}
|
|
|
|
//set frustrum
|
|
void Camera::SetLens(float fovY, float aspect, float zn, float zf)
|
|
{
|
|
this->fovY=fovY;
|
|
this->aspect=aspect;
|
|
nearZ=zn;
|
|
farZ=zf;
|
|
D3DXMATRIX P;
|
|
D3DXMatrixPerspectiveFovLH(&P,fovY,aspect,zn,zf);
|
|
mProj = Math::Float4x4(P);
|
|
}
|
|
|
|
//normal LookAt
|
|
void Camera::LookAt(Math::Float3 pos, Math::Float3 target, Math::Float3 worldUp)
|
|
{
|
|
look=target;
|
|
up=worldUp;
|
|
this->pos=pos;
|
|
right = up.cross(look);
|
|
}
|
|
|
|
//Get Matrices
|
|
Matrix Camera::View(){return mView;}
|
|
Matrix Camera::Proj(){return mProj;}
|
|
Matrix Camera::ViewProj()
|
|
{
|
|
return (mView * mProj).transpose(); // edited by Dan 04-19
|
|
}
|
|
|
|
//Move Camera
|
|
//FIX: Multiply Add not working
|
|
//FIX: Single Float Duplicate Creation
|
|
void Camera::Strafe(float d)
|
|
{
|
|
Math::Float3 s= Math::Float3(d,d,d);
|
|
pos= (Math::operator*(s,right)) + pos;
|
|
}
|
|
void Camera::Walk(float d)
|
|
{
|
|
Math::Float3 s= Math::Float3(d,d,d);
|
|
pos= (Math::operator*(s,look)) + pos;
|
|
}
|
|
void Camera::Fly(float d)
|
|
{
|
|
Math::Float3 s= Math::Float3(d,d,d);
|
|
pos= (Math::operator*(s,up)) + pos;
|
|
}
|
|
|
|
//Rotate Camera
|
|
//FIX: Float3 * float4x4
|
|
void Camera::Pitch(float angle)
|
|
{
|
|
Matrix m;
|
|
Math::rotationMatrix(m,angle,right);
|
|
m = m.getAdjoint().getInverse();
|
|
|
|
up = (Math::Float4(up,0) * m).xyz;
|
|
look = (Math::Float4(look,0) * m).xyz;
|
|
}
|
|
void Camera::Yaw(float angle)
|
|
{
|
|
|
|
Matrix m;
|
|
Math::rotationMatrix(m,angle,up);
|
|
m = m.getAdjoint().getInverse();
|
|
|
|
right = (Math::Float4(right,0) * m).xyz;
|
|
look = (Math::Float4(look,0) * m).xyz;
|
|
}
|
|
void Camera::Roll(float angle)
|
|
{
|
|
Matrix m;
|
|
Math::rotationMatrix(m, angle,look);
|
|
m = m.getAdjoint().getInverse();
|
|
|
|
up = (Math::Float4(up,0) * m).xyz;
|
|
right = (Math::Float4(right,0) * m).xyz;
|
|
}
|
|
void Camera::RotateY(float angle)
|
|
{
|
|
Matrix m;
|
|
|
|
Math::rotationMatrix_AxisY(m, angle);
|
|
|
|
m = m.getAdjoint().getInverse();
|
|
|
|
up = (Math::Float4(up,0) * m).xyz;
|
|
look = (Math::Float4(look,0) * m).xyz;
|
|
right = (Math::Float4(right,0) * m).xyz;
|
|
}
|
|
|
|
void Camera::UpdateViewMatrix()
|
|
{
|
|
look.normalize();
|
|
|
|
up = look.cross(right);
|
|
up.normalize();
|
|
|
|
right = up.cross(look);
|
|
|
|
float x = -pos.dot(right);
|
|
float y = -pos.dot(up);
|
|
float z = -pos.dot(look);
|
|
|
|
mView.m[0][0] = right.x;
|
|
mView.m[1][0] = right.y;
|
|
mView.m[2][0] = right.z;
|
|
mView.m[3][0] = x;
|
|
|
|
mView.m[0][1] = up.x;
|
|
mView.m[1][1] = up.y;
|
|
mView.m[2][1] = up.z;
|
|
mView.m[3][1] = y;
|
|
|
|
mView.m[0][2] = look.x;
|
|
mView.m[1][2] = look.y;
|
|
mView.m[2][2] = look.z;
|
|
mView.m[3][2] = z;
|
|
|
|
mView.m[0][3] = 0.0f;
|
|
mView.m[1][3] = 0.0f;
|
|
mView.m[2][3] = 0.0f;
|
|
mView.m[3][3] = 1.0f;
|
|
}
|
|
|
|
|