00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "stdopengl.h"
00027
00028 namespace NL3D {
00029
00030
00031 void CDriverGL::setFrustum(float left, float right, float bottom, float top, float znear, float zfar, bool perspective)
00032 {
00033 glMatrixMode(GL_PROJECTION);
00034 glLoadIdentity();
00035 if (perspective)
00036 {
00037 glFrustum(left,right,bottom,top,znear,zfar);
00038 }
00039 else
00040 {
00041 glOrtho(left,right,bottom,top,znear,zfar);
00042 }
00043
00044
00045 _OODeltaZ = 1 / (zfar - znear);
00046
00047 glMatrixMode(GL_MODELVIEW);
00048 }
00049
00050
00051
00052 void CDriverGL::setupViewMatrixEx(const CMatrix& mtx, const CVector &cameraPos)
00053 {
00054 _UserViewMtx= mtx;
00055
00056
00057 CMatrix changeBasis;
00058 CVector I(1,0,0);
00059 CVector J(0,0,-1);
00060 CVector K(0,1,0);
00061
00062 changeBasis.identity();
00063 changeBasis.setRot(I,J,K, true);
00064 _ViewMtx=changeBasis*mtx;
00065
00066 _ViewMtx.setPos(CVector::Null);
00067 _PZBCameraPos= cameraPos;
00068
00069
00070 _LightSetupDirty= true;
00071 _ModelViewMatrixDirty= true;
00072 _RenderSetupDirty= true;
00073
00074 _TexMtx = _ViewMtx;
00075 _TexMtx.setPos(CVector(0.0f,0.0f,0.0f));
00076 _TexMtx.invert();
00077 _TexMtx = changeBasis * _TexMtx;
00078 }
00079
00080
00081
00082 void CDriverGL::setupViewMatrix(const CMatrix& mtx)
00083 {
00084 _UserViewMtx= mtx;
00085
00086
00087 CMatrix changeBasis;
00088 CVector I(1,0,0);
00089 CVector J(0,0,-1);
00090 CVector K(0,1,0);
00091
00092 changeBasis.identity();
00093 changeBasis.setRot(I,J,K, true);
00094 _ViewMtx=changeBasis*mtx;
00095
00096 _PZBCameraPos= CVector::Null;
00097
00098
00099 _LightSetupDirty= true;
00100 _ModelViewMatrixDirty= true;
00101 _RenderSetupDirty= true;
00102
00103 _TexMtx = _ViewMtx;
00104 _TexMtx.setPos(CVector(0.0f,0.0f,0.0f));
00105 _TexMtx.invert();
00106 _TexMtx = changeBasis * _TexMtx;
00107
00108 }
00109
00110
00111 CMatrix CDriverGL::getViewMatrix(void) const
00112 {
00113 return _UserViewMtx;
00114 }
00115
00116
00117 void CDriverGL::setupModelMatrix(const CMatrix& mtx)
00118 {
00119
00120 _NbSetupModelMatrixCall++;
00121
00122
00123
00124 _ModelViewMatrixDirty= true;
00125 _RenderSetupDirty= true;
00126
00127
00128
00129 CMatrix mat= mtx;
00130
00131 mat.setPos(mtx.getPos() - _PZBCameraPos);
00132 _ModelViewMatrix= _ViewMtx*mat;
00133 }
00134
00135
00136 void CDriverGL::multiplyModelMatrix(const CMatrix& mtx)
00137 {
00138
00139 _ModelViewMatrixDirty= true;
00140 _RenderSetupDirty= true;
00141
00142
00143
00144 _ModelViewMatrix= _ModelViewMatrix*mtx;
00145 }
00146
00147
00148
00149 void CDriverGL::doRefreshRenderSetup()
00150 {
00151
00152 if (_LightSetupDirty)
00153
00154 cleanLightSetup ();
00155
00156
00157 nlassert (_LightSetupDirty==false);
00158
00159
00160
00161 if( _ModelViewMatrixDirty )
00162 {
00163
00164 glLoadMatrixf( _ModelViewMatrix.get() );
00165
00166 enableGlNormalize( _ModelViewMatrix.hasScalePart() || _ForceNormalize );
00167
00168 _ModelViewMatrixDirty= false;
00169 }
00170
00171
00172 _RenderSetupDirty= false;
00173 }
00174
00175
00176 }