#include "camera.hpp" #include "std.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; }