engine/src/Render/SalmonRender/Cameras.cpp

230 lines
3.6 KiB
C++

#include "include/Render/SalmonRender/Cameras.h"
#include "include/Engine.h"
namespace SE
{
TCameraInterface::TCameraInterface()
: CamShift(ZeroVec3)
{
CamVec = vec3(0,0,-1);
}
TPanoramicCamera::TPanoramicCamera()
: CamAlpha(0.0f)
, CamPhi(0.0f)
, CamDist(0.0f)
{
}
void TPanoramicCamera::MoveAlpha(float dAlpha)
{
if (dAlpha == 0.0f)
return;
CamAlpha += dAlpha;
while (CamAlpha >= 2*pi)
{
CamAlpha -= 2*pi;
}
while (CamAlpha<0.0f)
{
CamAlpha += 2*pi;
}
//Possibly refactor???
Renderer->CalcCamPos();
}
void TPanoramicCamera::MovePhi(float dPhi)
{
if (dPhi == 0.0f)
return;
//float oldCamPhi = CamPhi;
CamPhi += dPhi;
if (CamPhi > CONST_MAX_CAM_PHI)
{
CamPhi = CONST_MAX_CAM_PHI;
}
if (CamPhi < CONST_MIN_CAM_PHI)
{
CamPhi = CONST_MIN_CAM_PHI;
}
//Possibly refactor???
Renderer->CalcCamPos();
}
void TPanoramicCamera::MoveDist(float dDist)
{
CamDist += dDist;
if (CamDist<CONST_MIN_CAM_DIST)
{
CamDist = CONST_MIN_CAM_DIST;
}
//Possibly refactor???
Renderer->CalcCamPos();
}
void TPanoramicCamera::SetAlpha(float alpha)
{
if (alpha == CamAlpha)
return;
CamAlpha = alpha;
while (CamAlpha >= 2*pi)
{
CamAlpha -= 2*pi;
}
while (CamAlpha<0.0f)
{
CamAlpha += 2*pi;
}
//Possibly refactor???
Renderer->CalcCamPos();
}
void TPanoramicCamera::MoveForward()
{
vec3 mov;
float sina = sinf(CamAlpha);
float cosa = cosf(CamAlpha);
mov.v[0] = sina;
mov.v[1] = 0;
mov.v[2] = - cosa;
CamShift = CamShift + mov;
//Possibly refactor???
Renderer->CalcCamPos();
}
void TPanoramicCamera::MoveBackward()
{
vec3 mov;
float sina = sinf(CamAlpha);
float cosa = cosf(CamAlpha);
mov.v[0] = - sina;
mov.v[1] = 0;
mov.v[2] = cosa;
CamShift = CamShift + mov;
//Possibly refactor???
Renderer->CalcCamPos();
}
void TPanoramicCamera::MoveLeft()
{
vec3 mov;
float sina = sinf(CamAlpha);
float cosa = cosf(CamAlpha);
mov.v[0] = - cosa;
mov.v[1] = 0;
mov.v[2] = - sina;
CamShift = CamShift + mov;
//Possibly refactor???
Renderer->CalcCamPos();
}
void TPanoramicCamera::MoveRight()
{
vec3 mov;
float sina = sinf(CamAlpha);
float cosa = cosf(CamAlpha);
mov.v[0] = cosa;
mov.v[1] = 0;
mov.v[2] = sina;
CamShift = CamShift + mov;
//Possibly refactor???
Renderer->CalcCamPos();
}
void TPanoramicCamera::CalcCamVec()
{
vec3 camPos;
vec3 camVec;
float sina = sinf(CamAlpha);
float cosa = cosf(CamAlpha);
float sinp = sinf(CamPhi);
float cosp = cosf(CamPhi);
CamVec.v[0] = CamDist * cosp * sina;
CamVec.v[1] = - CamDist * sinp;
CamVec.v[2] = - CamDist * cosp * cosa;
}
void TPanoramicCamera::SetCamView()
{
Renderer->LoadIdentity();
Renderer->TranslateMatrix(vec3(0.0f, 0.0f, -CamDist));
Renderer->RotateMatrix(vec4(1.f * sin(CamPhi/2.f), 0.f, 0.f, 1.f * cos(CamPhi/2.f)));
Renderer->RotateMatrix(vec4(0.f, 1.f * sin(CamAlpha/2.f), 0.f, 1.f * cos(CamAlpha/2.f)));
Renderer->TranslateMatrix(-CamShift);
}
void TPanoramicCamera::SetCamShift(const vec3& camShift)
{
CamShift = camShift;
Renderer->CalcCamPos();
}
void TPitCamera::SetCamView()
{
Renderer->LoadIdentity();
Renderer->RotateMatrix(InverseQuat(CameraQuat));
Renderer->TranslateMatrix(-CamShift);
}
void TPitCamera::CalcCamVec()
{
vec3 r = vec3(0,0,-1);
CamVec = Normalize(CameraQuat * vec4(r) * InverseQuat(CameraQuat));
}
void TPitCamera::RotateByQuat(vec4 quat)
{
CameraQuat = quat * CameraQuat;
//float len = Length(CameraQuat);
}
} //namespace SE