Files
BlitzNext/Runtime/blitz3d/camera.cpp
T
Michael Fabian 'Xaymar' Dirks 3afa84df85 runtime/blitz3d: Fixup C++ification
2019-01-18 21:26:42 +01:00

133 lines
2.2 KiB
C++

#include "camera.hpp"
#include <gxscene.hpp>
extern gxScene* gx_scene;
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);
}
void Camera::setZoom(float z)
{
zoom = z;
local_valid = false;
}
void Camera::setRange(float n, float f)
{
frustum_nr = n;
frustum_fr = f;
local_valid = false;
}
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;
}
void Camera::setClsColor(const Vector& v)
{
cls_color = v;
}
void Camera::setClsMode(bool c, bool z)
{
cls_argb = c;
cls_z = z;
}
void Camera::setProjMode(int mode)
{
proj_mode = mode;
}
void Camera::setFogColor(const Vector& v)
{
fog_color = v;
}
void Camera::setFogRange(float nr, float fr)
{
fog_nr = nr;
fog_fr = fr;
}
void Camera::setFogMode(int mode)
{
fog_mode = mode;
}
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;
}
return local_frustum;
}
float Camera::getFrustumNear() const
{
return frustum_nr;
}
float Camera::getFrustumFar() const
{
return frustum_fr;
}
float Camera::getFrustumWidth() const
{
getFrustum();
return frustum_w;
}
float Camera::getFrustumHeight() const
{
getFrustum();
return frustum_h;
}
void Camera::getViewport(int* x, int* y, int* w, int* h) const
{
*x = vp_x;
*y = vp_y;
*w = vp_w;
*h = vp_h;
}
bool Camera::beginRenderFrame()
{
if (!proj_mode)
return false;
getFrustum();
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);
}
gx_scene->setFogRange(fog_nr, fog_fr);
gx_scene->setFogColor((float*)&fog_color.x);
gx_scene->setFogMode(fog_mode);
return true;
}