Files
BlitzNext/Runtime/blitz3d/camera.cpp
T

133 lines
2.2 KiB
C++
Raw Normal View History

2014-01-31 08:23:00 +13:00
2019-01-18 15:55:06 +01:00
#include "camera.hpp"
2019-01-18 17:04:17 +01:00
#include "std.hpp"
2014-01-31 08:23:00 +13:00
2019-01-18 17:04:17 +01:00
extern gxScene* gx_scene;
2014-01-31 08:23:00 +13:00
2019-01-18 17:04:17 +01:00
Camera::Camera()
{
setZoom(1);
setRange(1, 1000);
setViewport(0, 0, 0, 0);
setClsColor(Vector());
setClsMode(true, true);
setProjMode(PROJ_PERSP);
setFogRange(1, 1000);
setFogColor(Vector());
setFogMode(gxScene::FOG_NONE);
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
void Camera::setZoom(float z)
{
zoom = z;
local_valid = false;
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
void Camera::setRange(float n, float f)
{
frustum_nr = n;
frustum_fr = f;
local_valid = false;
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
void Camera::setViewport(int x, int y, int w, int h)
{
vp_x = x;
vp_y = y;
vp_w = w;
vp_h = h;
local_valid = false;
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
void Camera::setClsColor(const Vector& v)
{
cls_color = v;
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
void Camera::setClsMode(bool c, bool z)
{
cls_argb = c;
cls_z = z;
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
void Camera::setProjMode(int mode)
{
proj_mode = mode;
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
void Camera::setFogColor(const Vector& v)
{
fog_color = v;
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
void Camera::setFogRange(float nr, float fr)
{
fog_nr = nr;
fog_fr = fr;
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
void Camera::setFogMode(int mode)
{
fog_mode = mode;
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
const Frustum& Camera::getFrustum() const
{
if (!local_valid) {
float ar = (float)vp_h / vp_w;
frustum_w = frustum_nr * 2 / zoom;
frustum_h = frustum_nr * 2 / zoom * ar;
new (&local_frustum) Frustum(frustum_nr, frustum_fr, frustum_w, frustum_h);
local_valid = true;
2014-01-31 08:23:00 +13:00
}
return local_frustum;
}
2019-01-18 17:04:17 +01:00
float Camera::getFrustumNear() const
{
2014-01-31 08:23:00 +13:00
return frustum_nr;
}
2019-01-18 17:04:17 +01:00
float Camera::getFrustumFar() const
{
2014-01-31 08:23:00 +13:00
return frustum_fr;
}
2019-01-18 17:04:17 +01:00
float Camera::getFrustumWidth() const
{
getFrustum();
return frustum_w;
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
float Camera::getFrustumHeight() const
{
getFrustum();
return frustum_h;
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
void Camera::getViewport(int* x, int* y, int* w, int* h) const
{
*x = vp_x;
*y = vp_y;
*w = vp_w;
*h = vp_h;
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
bool Camera::beginRenderFrame()
{
if (!proj_mode)
return false;
2014-01-31 08:23:00 +13:00
getFrustum();
2019-01-18 17:04:17 +01:00
gx_scene->setViewport(vp_x, vp_y, vp_w, vp_h);
gx_scene->clear(&(cls_color.x), 1, 1, cls_argb, cls_z);
if (proj_mode == PROJ_ORTHO) {
gx_scene->setOrthoProj(frustum_nr, frustum_fr, frustum_w, frustum_h);
} else {
gx_scene->setPerspProj(frustum_nr, frustum_fr, frustum_w, frustum_h);
2014-01-31 08:23:00 +13:00
}
2019-01-18 17:04:17 +01:00
gx_scene->setFogRange(fog_nr, fog_fr);
gx_scene->setFogColor((float*)&fog_color.x);
gx_scene->setFogMode(fog_mode);
2014-01-31 08:23:00 +13:00
return true;
}