blitz3d/blitz3d/camera.cpp

104 lines
2.1 KiB
C++

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