2016-03-04 15:03:26 -08:00
|
|
|
#include "zeus/CProjection.hpp"
|
|
|
|
#include "zeus/Math.hpp"
|
|
|
|
#include <cassert>
|
2015-04-19 13:39:16 -07:00
|
|
|
|
2018-12-07 17:16:50 -08:00
|
|
|
namespace zeus {
|
|
|
|
void CProjection::_updateCachedMatrix() {
|
|
|
|
assert(m_projType == EProjType::Orthographic || m_projType == EProjType::Perspective);
|
|
|
|
if (m_projType == EProjType::Orthographic) {
|
|
|
|
float tmp;
|
2016-07-08 11:42:42 -07:00
|
|
|
|
2018-12-07 17:16:50 -08:00
|
|
|
tmp = 1.0f / (m_ortho.right - m_ortho.left);
|
|
|
|
m_mtx.m[0][0] = 2.0f * tmp;
|
|
|
|
m_mtx.m[1][0] = 0.0f;
|
|
|
|
m_mtx.m[2][0] = 0.0f;
|
|
|
|
m_mtx.m[3][0] = -(m_ortho.right + m_ortho.left) * tmp;
|
2016-07-08 11:42:42 -07:00
|
|
|
|
2018-12-07 17:16:50 -08:00
|
|
|
tmp = 1.0f / (m_ortho.top - m_ortho.bottom);
|
|
|
|
m_mtx.m[0][1] = 0.0f;
|
|
|
|
m_mtx.m[1][1] = 2.0f * tmp;
|
|
|
|
m_mtx.m[2][1] = 0.0f;
|
|
|
|
m_mtx.m[3][1] = -(m_ortho.top + m_ortho.bottom) * tmp;
|
2016-07-08 11:42:42 -07:00
|
|
|
|
2018-12-07 17:16:50 -08:00
|
|
|
tmp = 1.0f / (m_ortho.zfar - m_ortho.znear);
|
|
|
|
m_mtx.m[0][2] = 0.0f;
|
|
|
|
m_mtx.m[1][2] = 0.0f;
|
|
|
|
m_mtx.m[2][2] = -tmp;
|
|
|
|
m_mtx.m[3][2] = -m_ortho.zfar * tmp;
|
2016-07-08 11:42:42 -07:00
|
|
|
|
2018-12-07 17:16:50 -08:00
|
|
|
m_mtx.m[0][3] = 0.0f;
|
|
|
|
m_mtx.m[1][3] = 0.0f;
|
|
|
|
m_mtx.m[2][3] = 0.0f;
|
|
|
|
m_mtx.m[3][3] = 1.0f;
|
|
|
|
} else if (m_projType == EProjType::Perspective) {
|
|
|
|
float tfov = std::tan(m_persp.fov * 0.5f);
|
|
|
|
float top = m_persp.znear * tfov;
|
|
|
|
float bottom = -top;
|
|
|
|
float right = m_persp.aspect * m_persp.znear * tfov;
|
|
|
|
float left = -right;
|
2016-07-08 11:42:42 -07:00
|
|
|
|
2018-12-07 17:16:50 -08:00
|
|
|
float rml = right - left;
|
|
|
|
float rpl = right + left;
|
|
|
|
float tmb = top - bottom;
|
|
|
|
float tpb = top + bottom;
|
|
|
|
float fpn = m_persp.zfar + m_persp.znear;
|
|
|
|
float fmn = m_persp.zfar - m_persp.znear;
|
2016-07-08 11:42:42 -07:00
|
|
|
|
2018-12-07 17:16:50 -08:00
|
|
|
m_mtx.m[0][0] = 2.f * m_persp.znear / rml;
|
|
|
|
m_mtx.m[1][0] = 0.0f;
|
|
|
|
m_mtx.m[2][0] = rpl / rml;
|
|
|
|
m_mtx.m[3][0] = 0.0f;
|
2016-07-08 11:42:42 -07:00
|
|
|
|
2018-12-07 17:16:50 -08:00
|
|
|
m_mtx.m[0][1] = 0.0f;
|
|
|
|
m_mtx.m[1][1] = 2.f * m_persp.znear / tmb;
|
|
|
|
m_mtx.m[2][1] = tpb / tmb;
|
|
|
|
m_mtx.m[3][1] = 0.0f;
|
2016-07-08 11:42:42 -07:00
|
|
|
|
2018-12-07 17:16:50 -08:00
|
|
|
m_mtx.m[0][2] = 0.0f;
|
|
|
|
m_mtx.m[1][2] = 0.0f;
|
|
|
|
m_mtx.m[2][2] = -fpn / fmn;
|
|
|
|
m_mtx.m[3][2] = -2.f * m_persp.zfar * m_persp.znear / fmn;
|
2016-07-08 11:42:42 -07:00
|
|
|
|
2018-12-07 17:16:50 -08:00
|
|
|
m_mtx.m[0][3] = 0.0f;
|
|
|
|
m_mtx.m[1][3] = 0.0f;
|
|
|
|
m_mtx.m[2][3] = -1.0f;
|
|
|
|
m_mtx.m[3][3] = 0.0f;
|
|
|
|
}
|
2015-04-19 13:39:16 -07:00
|
|
|
}
|
2018-12-07 21:23:50 -08:00
|
|
|
} // namespace zeus
|