00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "view-precompile.hh"
00026 #include "precompile.hh"
00027 #include "precompile-aimed-point.hh"
00028 #include "parameter-eye-position.hh"
00029 #include "parameter-aimed-position.hh"
00030 #include "parameter-drawing.hh"
00031 using namespace std;
00032
00033 CViewPrecompile::CViewPrecompile(CParameterEyePosition * AEyePosition,
00034 CParameterAimedPosition* AAimedPosition,
00035 CParameterDrawing * ADrawing) :
00036 FParameterEyePosition(AEyePosition),
00037 FParameterAimedPosition(AAimedPosition),
00038 FParameterDrawing(ADrawing)
00039 {
00040 assert(FParameterEyePosition != NULL);
00041 assert(FParameterAimedPosition != NULL);
00042 assert(FParameterDrawing != NULL);
00043
00044 FParameterEyePosition->incNbRef();
00045 FParameterAimedPosition->incNbRef();
00046 FParameterDrawing->incNbRef();
00047 }
00048
00049 CViewPrecompile::~CViewPrecompile()
00050 {
00051 FParameterEyePosition->decNbRef();
00052 FParameterAimedPosition->decNbRef();
00053 FParameterDrawing->decNbRef();
00054 }
00055
00056 void CViewPrecompile::initScene()
00057 {
00058 glMatrixMode(GL_MODELVIEW);
00059 glLoadIdentity();
00060
00061 glClearColor(FParameterDrawing->getCLBackground(0),
00062 FParameterDrawing->getCLBackground(1),
00063 FParameterDrawing->getCLBackground(2),
00064 1.0);
00065 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00066 }
00067
00068 void CViewPrecompile::drawScene()
00069 {
00070 if (isEnabled())
00071 {
00072
00073 setScenePosition();
00074
00075
00076 display();
00077 }
00078 }
00079
00080 void CViewPrecompile::unproject(float Ax, float Ay, float ARes[])
00081 {
00082 GLdouble xp, yp, zp;
00083
00084
00085 float xm = FParameterAimedPosition->getLookAt(0);
00086 float ym = FParameterAimedPosition->getLookAt(1);
00087 float zm = FParameterAimedPosition->getLookAt(2);
00088
00089
00090 GLdouble dummy, zMire;
00091 gluProject(xm, ym, zm,
00092 FModelViewMatrix, FProjectionMatrix, FViewport,
00093 & dummy, & dummy, & zMire);
00094
00095
00096 gluUnProject(Ax, Ay, zMire,
00097 FModelViewMatrix, FProjectionMatrix, FViewport,
00098 & xp, & yp, & zp);
00099
00100
00101 ARes[0] = xp;
00102 ARes[1] = yp;
00103 ARes[2] = zp;
00104 }
00105
00106 void CViewPrecompile::project(float Ax, float Ay, float Az, float ARes[])
00107 {
00108 GLdouble x, y, z;
00109
00110
00111 gluProject(Ax, Ay, Az, FModelViewMatrix, FProjectionMatrix, FViewport,
00112 &x, &y, &z);
00113
00114
00115 ARes[0] = x;
00116 ARes[1] = y;
00117 ARes[2] = z;
00118 }
00119
00120 CVertex CViewPrecompile::getLookAt()
00121 {
00122 return CVertex(FParameterAimedPosition->getLookAt(0),
00123 FParameterAimedPosition->getLookAt(1),
00124 FParameterAimedPosition->getLookAt(2));
00125 }
00126
00127 CVertex CViewPrecompile::getEyeDirection()
00128 {
00129 GLdouble xp, yp, zp;
00130
00131
00132 float xm = FParameterAimedPosition->getLookAt(0);
00133 float ym = FParameterAimedPosition->getLookAt(1);
00134 float zm = FParameterAimedPosition->getLookAt(2);
00135
00136
00137 GLdouble xMire, yMire, zMire;
00138 gluProject(xm, ym, zm,
00139 FModelViewMatrix, FProjectionMatrix, FViewport,
00140 & xMire, & yMire, & zMire);
00141
00142
00143 gluUnProject(xMire, yMire, zMire + 10,
00144 FModelViewMatrix, FProjectionMatrix, FViewport,
00145 & xp, & yp, & zp);
00146
00147
00148 CVertex vect(xm - xp, ym - yp, zm - zp);
00149
00150 assert(! vect.isNull());
00151
00152 return vect / vect.norm();
00153 }
00154
00155 void CViewPrecompile::update()
00156 {
00157 list<CPrecompile*>::iterator it = FListPrecompile.begin();
00158
00159 while (it != FListPrecompile.end())
00160 {
00161 (*it)->update();
00162 ++it;
00163 }
00164 }
00165
00166 void CViewPrecompile::display()
00167 {
00168 if (isEnabled())
00169 {
00170 list<CPrecompile*>::iterator it = FListPrecompile.begin();
00171
00172 while (it != FListPrecompile.end())
00173 {
00174 (*it)->draw();
00175 ++it;
00176 }
00177 }
00178 }
00179
00180 CPrecompile* CViewPrecompile::findPrecompile(TPrecompile APrecompileType)
00181 {
00182 list<CPrecompile*>::iterator it = FListPrecompile.begin();
00183
00184 while (it != FListPrecompile.end())
00185 {
00186 if ((*it)->getType() == APrecompileType)
00187 return *it;
00188
00189 ++it;
00190 }
00191
00192 return NULL;
00193 }
00194
00195 void CViewPrecompile::addPrecompile(CPrecompile* APrecompile)
00196 {
00197 assert(APrecompile != NULL);
00198 assert(findPrecompile(APrecompile->getType()) == NULL);
00199
00200 FListPrecompile.push_back(APrecompile);
00201
00202 APrecompile->incNbView();
00203 if (isEnabled()) APrecompile->incNbEnabledView();
00204 }
00205
00206 CPrecompile* CViewPrecompile::removePrecompile(TPrecompile APrecompileType)
00207 {
00208 CPrecompile* precompile = findPrecompile(APrecompileType);
00209
00210 if (precompile != NULL)
00211 {
00212 FListPrecompile.remove(precompile);
00213 if (isEnabled()) precompile->decNbEnabledView();
00214
00215
00216
00217 precompile->decNbView();
00218 }
00219
00220 return precompile;
00221 }
00222
00223 CPrecompile* CViewPrecompile::removePrecompile(CPrecompile* APrecompile)
00224 {
00225 assert(APrecompile != NULL);
00226
00227 return removePrecompile(APrecompile->getType());
00228 }
00229
00230 CParameterEyePosition & CViewPrecompile::getEyePosition() const
00231 { return *FParameterEyePosition; }
00232
00233 CParameterAimedPosition & CViewPrecompile::getAimedPosition() const
00234 { return *FParameterAimedPosition; }
00235
00236 void CViewPrecompile::setScenePositionInitialize()
00237 {
00238 glGetIntegerv(GL_VIEWPORT, FViewport);
00239 FRatio = (1.0 * FViewport[2]) / FViewport[3];
00240
00241 glMatrixMode(GL_PROJECTION);
00242 glLoadIdentity();
00243 }
00244
00245 void CViewPrecompile::setScenePositionFinalize()
00246 {
00247 glGetDoublev(GL_PROJECTION_MATRIX, FProjectionMatrix);
00248 glGetDoublev(GL_MODELVIEW_MATRIX, FModelViewMatrix);
00249 }
00250
00251 CParameter* CViewPrecompile::getParameter(TParameter AParameterType) const
00252 {
00253 switch (AParameterType)
00254 {
00255 case PARAMETER_EYE_POSITION : return FParameterEyePosition;
00256 case PARAMETER_AIMED_POSITION: return FParameterAimedPosition;
00257 case PARAMETER_DRAWING : return FParameterDrawing;
00258 }
00259
00260 return NULL;
00261 }
00262
00263 CParameterEyePosition* CViewPrecompile::getParameterEyePosition() const
00264 { return FParameterEyePosition; }
00265
00266 CParameterAimedPosition* CViewPrecompile::getParameterAimedPosition() const
00267 { return FParameterAimedPosition; }
00268
00269 CParameterDrawing* CViewPrecompile::getParameterDrawing() const
00270 { return FParameterDrawing; }
00271
00272 void CViewPrecompile::setParameter(CParameter* AParameter)
00273 {
00274 switch (AParameter->getType())
00275 {
00276 case PARAMETER_EYE_POSITION:
00277 setParameterEyePosition(static_cast<CParameterEyePosition*>
00278 (AParameter));
00279 break;
00280 case PARAMETER_AIMED_POSITION:
00281 setParameterAimedPosition(static_cast<CParameterAimedPosition*>
00282 (AParameter));
00283 break;
00284 case PARAMETER_DRAWING:
00285 setParameterDrawing(static_cast<CParameterDrawing*>(AParameter));
00286 break;
00287 }
00288 }
00289
00290 void CViewPrecompile::groupParameter(CViewPrecompile* AView,
00291 TParameter AParameterType)
00292 {
00293 assert(AView != NULL);
00294
00295 CParameter* parameter = getParameter(AParameterType);
00296
00297 if (parameter != NULL) AView->setParameter(parameter);
00298 }
00299
00300 void CViewPrecompile::ungroupParameter(TParameter AParameterType)
00301 {
00302 CParameter* parameter = getParameter(AParameterType);
00303
00304 if (parameter != NULL && parameter->getNbRef() > 1)
00305 setParameter(parameter->copy());
00306 }
00307
00308 void CViewPrecompile::setParameterEyePosition(CParameterEyePosition* AParam)
00309 {
00310 assert(AParam != NULL);
00311
00312 if (AParam != FParameterEyePosition)
00313 {
00314 AParam->incNbRef();
00315 FParameterEyePosition->decNbRef();
00316 FParameterEyePosition = AParam;
00317
00318 for (list<CPrecompile*>::iterator it = FListPrecompile.begin();
00319 it != FListPrecompile.end(); ++it)
00320 (*it)->setParameter(AParam);
00321 }
00322 }
00323
00324 void CViewPrecompile::setParameterAimedPosition(CParameterAimedPosition*
00325 AParam)
00326 {
00327 assert(AParam != NULL);
00328
00329 if (AParam != FParameterAimedPosition)
00330 {
00331 AParam->incNbRef();
00332 FParameterAimedPosition->decNbRef();
00333 FParameterAimedPosition = AParam;
00334
00335 for (list<CPrecompile*>::iterator it = FListPrecompile.begin();
00336 it != FListPrecompile.end(); ++it)
00337 (*it)->setParameter(AParam);
00338 }
00339 }
00340
00341 void CViewPrecompile::setParameterDrawing(CParameterDrawing* AParam)
00342 {
00343 assert(AParam != NULL);
00344
00345 if (AParam != FParameterDrawing)
00346 {
00347 AParam->incNbRef();
00348 FParameterDrawing->decNbRef();
00349 FParameterDrawing = AParam;
00350
00351 for (list<CPrecompile*>::iterator it = FListPrecompile.begin();
00352 it != FListPrecompile.end(); ++it)
00353 (*it)->setParameter(AParam);
00354 }
00355 }
00356
00357 void CViewPrecompile::enable()
00358 {
00359 CView::enable();
00360 for (list<CPrecompile*>::iterator it = FListPrecompile.begin();
00361 it != FListPrecompile.end(); ++it)
00362 (*it)->incNbEnabledView();
00363 }
00364
00365 void CViewPrecompile::disable()
00366 {
00367 CView::disable();
00368 for (list<CPrecompile*>::iterator it = FListPrecompile.begin();
00369 it != FListPrecompile.end(); ++it)
00370 (*it)->decNbEnabledView();
00371 }
00372
00373 void CViewPrecompile::pick(int AX, int AY)
00374 {
00375 for (list<CPrecompile*>::iterator it = FListPrecompile.begin();
00376 it != FListPrecompile.end(); ++it)
00377 (*it)->pick(AX, AY, this);
00378 }
00379