00001 #include "project.h" 00002 00015 #include <cassert> 00016 #include <iosfwd> 00017 using namespace std; 00018 00019 GltOrtho::GltOrtho() 00020 : _left(-1.0), _right(1.0), _bottom(-1.0), _top(1.0), _zNear(-10.0), _zFar(10.0) 00021 { 00022 } 00023 00024 GltOrtho::~GltOrtho() 00025 { 00026 } 00027 00028 void 00029 GltOrtho::set() 00030 { 00031 glMatrixMode(GL_PROJECTION); 00032 glLoadIdentity(); 00033 glOrtho(_left,_right,_bottom,_top,_zNear,_zFar); 00034 glMatrixMode(GL_MODELVIEW); 00035 } 00036 00037 void 00038 GltOrtho::set(int width,int height) 00039 { 00040 GLdouble x = 1.0; 00041 GLdouble y = 1.0; 00042 00043 if (width!=0 && height!=0) 00044 { 00045 if (width>height) 00046 x = GLdouble(width)/GLdouble(height); 00047 else 00048 y = GLdouble(height)/GLdouble(width); 00049 } 00050 00051 _left = -x; 00052 _right = x; 00053 _bottom = -y; 00054 _top = y; 00055 set(); 00056 } 00057 00058 GLdouble &GltOrtho::left() { return _left; } 00059 GLdouble &GltOrtho::right() { return _right; } 00060 GLdouble &GltOrtho::bottom() { return _bottom; } 00061 GLdouble &GltOrtho::top() { return _top; } 00062 GLdouble &GltOrtho::zNear() { return _zNear; } 00063 GLdouble &GltOrtho::zFar() { return _zFar; } 00064 00065 const GLdouble &GltOrtho::left() const { return _left; } 00066 const GLdouble &GltOrtho::right() const { return _right; } 00067 const GLdouble &GltOrtho::bottom() const { return _bottom; } 00068 const GLdouble &GltOrtho::top() const { return _top; } 00069 const GLdouble &GltOrtho::zNear() const { return _zNear; } 00070 const GLdouble &GltOrtho::zFar() const { return _zFar; } 00071 00072 bool 00073 GltOrtho::tile(GltOrtho &frust,const int dx,const int dy,const int n) const 00074 { 00075 if (dx<1 || dy<1 || n<0 || n>=dx*dy) 00076 { 00077 frust = *this; 00078 return false; 00079 } 00080 00081 const int px = n%dx; 00082 const int py = n/dx; 00083 00084 const GLdouble width = (_right-_left)/dx; 00085 const GLdouble height = (_top-_bottom)/dy; 00086 00087 assert(py<=dy); 00088 00089 if (py<dy) 00090 { 00091 frust._left = frust._right = _left + width*px; 00092 frust._top = frust._bottom = _bottom + height*py; 00093 00094 frust._right += width; 00095 frust._top += height; 00096 00097 frust._zNear = _zNear; 00098 frust._zFar = _zFar; 00099 00100 return true; 00101 } 00102 else 00103 return false; 00104 } 00105 00107 00108 00109 GltFrustum::GltFrustum() 00110 : _left(-1.0), _right(1.0), _bottom(-1.0), _top(1.0), _zNear(1.0), _zFar(10.0) 00111 { 00112 } 00113 00114 GltFrustum::~GltFrustum() 00115 { 00116 } 00117 00118 void 00119 GltFrustum::set() 00120 { 00121 assert(_zNear>0.0); 00122 assert(_zFar>0.0); 00123 00124 glMatrixMode(GL_PROJECTION); 00125 glLoadIdentity(); 00126 glFrustum(_left,_right,_bottom,_top,_zNear,_zFar); 00127 glMatrixMode(GL_MODELVIEW); 00128 } 00129 00130 void 00131 GltFrustum::set(int width,int height) 00132 { 00133 GLdouble x = 1.0; 00134 GLdouble y = 1.0; 00135 00136 if (width!=0 && height!=0) 00137 { 00138 if (width>height) 00139 x = GLdouble(width)/GLdouble(height); 00140 else 00141 y = GLdouble(height)/GLdouble(width); 00142 } 00143 00144 _left = -x; 00145 _right = x; 00146 _bottom = -y; 00147 _top = y; 00148 set(); 00149 } 00150 00151 GLdouble &GltFrustum::left() { return _left; } 00152 GLdouble &GltFrustum::right() { return _right; } 00153 GLdouble &GltFrustum::bottom() { return _bottom; } 00154 GLdouble &GltFrustum::top() { return _top; } 00155 GLdouble &GltFrustum::zNear() { return _zNear; } 00156 GLdouble &GltFrustum::zFar() { return _zFar; } 00157 00158 const GLdouble &GltFrustum::left() const { return _left; } 00159 const GLdouble &GltFrustum::right() const { return _right; } 00160 const GLdouble &GltFrustum::bottom() const { return _bottom; } 00161 const GLdouble &GltFrustum::top() const { return _top; } 00162 const GLdouble &GltFrustum::zNear() const { return _zNear; } 00163 const GLdouble &GltFrustum::zFar() const { return _zFar; } 00164 00165 bool 00166 GltFrustum::tile(GltFrustum &frust,const int dx,const int dy,const int n) const 00167 { 00168 if (dx<1 || dy<1 || n<0 || n>=dx*dy) 00169 { 00170 frust = *this; 00171 return false; 00172 } 00173 00174 const int px = n%dx; 00175 const int py = n/dx; 00176 00177 const GLdouble width = (_right-_left)/dx; 00178 const GLdouble height = (_top-_bottom)/dy; 00179 00180 assert(py<=dy); 00181 00182 if (py<dy) 00183 { 00184 frust._left = frust._right = _left + width*px; 00185 frust._top = frust._bottom = _bottom + height*py; 00186 00187 frust._right += width; 00188 frust._top += height; 00189 00190 frust._zNear = _zNear; 00191 frust._zFar = _zFar; 00192 00193 return true; 00194 } 00195 else 00196 return false; 00197 } 00198