Danbias/OysterGraphics/Render/Camera.cpp

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;
}