104 lines
2.1 KiB
C++
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;
|
|
}
|