Moka controlers
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros
view-precompile.cc
Go to the documentation of this file.
1 /*
2  * lib-controler : Un contrôleur générique de scène 3D.
3  * Copyright (C) 2004, Moka Team, Université de Poitiers, Laboratoire SIC
4  * http://www.sic.sp2mi.univ-poitiers.fr/
5  * Copyright (C) 2009, Guillaume Damiand, CNRS, LIRIS,
6  * guillaume.damiand@liris.cnrs.fr, http://liris.cnrs.fr/
7  *
8  * This file is part of lib-controler
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU Lesser General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public License
21  * along with this program. If not, see <http://www.gnu.org/licenses/>.
22  */
23 
24 //******************************************************************************
25 #include "view-precompile.hh"
26 #include "precompile.hh"
30 #include "parameter-drawing.hh"
31 using namespace std;
32 //******************************************************************************
34  CParameterAimedPosition* AAimedPosition,
35  CParameterDrawing * ADrawing) :
36  FParameterEyePosition(AEyePosition),
37  FParameterAimedPosition(AAimedPosition),
38  FParameterDrawing(ADrawing)
39 {
40  assert(FParameterEyePosition != NULL);
41  assert(FParameterAimedPosition != NULL);
42  assert(FParameterDrawing != NULL);
43 
47 }
48 //******************************************************************************
50 {
54 }
55 //******************************************************************************
57 {
58  glMatrixMode(GL_MODELVIEW);
59  glLoadIdentity();
60 
61  glClearColor(FParameterDrawing->getCLBackground(0),
64  1.0);
65  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
66 }
67 //******************************************************************************
69 {
70  if (isEnabled())
71  {
72  // Positionnement dans la scène
74 
75  // Affichage du contenu de la scène
76  display();
77  }
78 }
79 //******************************************************************************
80 void CViewPrecompile::unproject(float Ax, float Ay, float ARes[])
81 {
82  GLdouble xp, yp, zp;
83 
84  // Récupération du point de mire :
85  float xm = FParameterAimedPosition->getLookAt(0);
86  float ym = FParameterAimedPosition->getLookAt(1);
87  float zm = FParameterAimedPosition->getLookAt(2);
88 
89  // Projection du point de mire :
90  GLdouble dummy, zMire;
91  gluProject(xm, ym, zm,
92  FModelViewMatrix, FProjectionMatrix, FViewport,
93  & dummy, & dummy, & zMire);
94 
95  // "Déprojection" du point (Ax,Ay,zMire) :
96  gluUnProject(Ax, Ay, zMire,
97  FModelViewMatrix, FProjectionMatrix, FViewport,
98  & xp, & yp, & zp);
99 
100  // Écriture du résultat :
101  ARes[0] = xp;
102  ARes[1] = yp;
103  ARes[2] = zp;
104 }
105 //******************************************************************************
106 void CViewPrecompile::project(float Ax, float Ay, float Az, float ARes[])
107 {
108  GLdouble x, y, z;
109 
110  // Projection du point (x,y,z) :
111  gluProject(Ax, Ay, Az, FModelViewMatrix, FProjectionMatrix, FViewport,
112  &x, &y, &z);
113 
114  // Écriture du résultat :
115  ARes[0] = x;
116  ARes[1] = y;
117  ARes[2] = z;
118 }
119 //******************************************************************************
121 {
122  return CVertex(FParameterAimedPosition->getLookAt(0),
125 }
126 //******************************************************************************
128 {
129  GLdouble xp, yp, zp;
130 
131  // Récupération du point de mire :
132  float xm = FParameterAimedPosition->getLookAt(0);
133  float ym = FParameterAimedPosition->getLookAt(1);
134  float zm = FParameterAimedPosition->getLookAt(2);
135 
136  // Projection du point de mire :
137  GLdouble xMire, yMire, zMire;
138  gluProject(xm, ym, zm,
139  FModelViewMatrix, FProjectionMatrix, FViewport,
140  & xMire, & yMire, & zMire);
141 
142  // "Déprojection" du point (xMire,yMire,zMire+10) :
143  gluUnProject(xMire, yMire, zMire + 10,
144  FModelViewMatrix, FProjectionMatrix, FViewport,
145  & xp, & yp, & zp);
146 
147  // Écriture du résultat :
148  CVertex vect(xm - xp, ym - yp, zm - zp);
149 
150  assert(! vect.isNull());
151 
152  return vect / vect.norm();
153 }
154 //******************************************************************************
156 {
157  list<CPrecompile*>::iterator it = FListPrecompile.begin();
158 
159  while (it != FListPrecompile.end())
160  {
161  (*it)->update();
162  ++it;
163  }
164 }
165 //******************************************************************************
167 {
168  if (isEnabled())
169  {
170  list<CPrecompile*>::iterator it = FListPrecompile.begin();
171 
172  while (it != FListPrecompile.end())
173  {
174  (*it)->draw();
175  ++it;
176  }
177  }
178 }
179 //******************************************************************************
181 {
182  list<CPrecompile*>::iterator it = FListPrecompile.begin();
183 
184  while (it != FListPrecompile.end())
185  {
186  if ((*it)->getType() == APrecompileType)
187  return *it;
188 
189  ++it;
190  }
191 
192  return NULL;
193 }
194 //******************************************************************************
196 {
197  assert(APrecompile != NULL);
198  assert(findPrecompile(APrecompile->getType()) == NULL);
199 
200  FListPrecompile.push_back(APrecompile);
201 
202  APrecompile->incNbView();
203  if (isEnabled()) APrecompile->incNbEnabledView();
204 }
205 //******************************************************************************
207 {
208  CPrecompile* precompile = findPrecompile(APrecompileType);
209 
210  if (precompile != NULL)
211  {
212  FListPrecompile.remove(precompile);
213  if (isEnabled()) precompile->decNbEnabledView();
214 
215  // ATTENTION: A faire en dernier car peut entraîner la destruction du
216  // précompile
217  precompile->decNbView();
218  }
219 
220  return precompile;
221 }
222 //******************************************************************************
224 {
225  assert(APrecompile != NULL);
226 
227  return removePrecompile(APrecompile->getType());
228 }
229 //******************************************************************************
231 { return *FParameterEyePosition; }
232 //******************************************************************************
234 { return *FParameterAimedPosition; }
235 //******************************************************************************
237 {
238  glGetIntegerv(GL_VIEWPORT, FViewport);
239  FRatio = (1.0 * FViewport[2]) / FViewport[3];
240 
241  glMatrixMode(GL_PROJECTION);
242  glLoadIdentity();
243 }
244 //******************************************************************************
246 {
247  glGetDoublev(GL_PROJECTION_MATRIX, FProjectionMatrix);
248  glGetDoublev(GL_MODELVIEW_MATRIX, FModelViewMatrix);
249 }
250 //******************************************************************************
252 {
253  switch (AParameterType)
254  {
257  case PARAMETER_DRAWING : return FParameterDrawing;
258  }
259 
260  return NULL;
261 }
262 //******************************************************************************
264 { return FParameterEyePosition; }
265 //******************************************************************************
267 { return FParameterAimedPosition; }
268 //******************************************************************************
270 { return FParameterDrawing; }
271 //******************************************************************************
273 {
274  switch (AParameter->getType())
275  {
277  setParameterEyePosition(static_cast<CParameterEyePosition*>
278  (AParameter));
279  break;
281  setParameterAimedPosition(static_cast<CParameterAimedPosition*>
282  (AParameter));
283  break;
284  case PARAMETER_DRAWING:
285  setParameterDrawing(static_cast<CParameterDrawing*>(AParameter));
286  break;
287  }
288 }
289 //******************************************************************************
291  TParameter AParameterType)
292 {
293  assert(AView != NULL);
294 
295  CParameter* parameter = getParameter(AParameterType);
296 
297  if (parameter != NULL) AView->setParameter(parameter);
298 }
299 //******************************************************************************
301 {
302  CParameter* parameter = getParameter(AParameterType);
303 
304  if (parameter != NULL && parameter->getNbRef() > 1)
305  setParameter(parameter->copy());
306 }
307 //******************************************************************************
309 {
310  assert(AParam != NULL);
311 
312  if (AParam != FParameterEyePosition)
313  {
314  AParam->incNbRef();
316  FParameterEyePosition = AParam;
317 
318  for (list<CPrecompile*>::iterator it = FListPrecompile.begin();
319  it != FListPrecompile.end(); ++it)
320  (*it)->setParameter(AParam);
321  }
322 }
323 //******************************************************************************
325  AParam)
326 {
327  assert(AParam != NULL);
328 
329  if (AParam != FParameterAimedPosition)
330  {
331  AParam->incNbRef();
333  FParameterAimedPosition = AParam;
334 
335  for (list<CPrecompile*>::iterator it = FListPrecompile.begin();
336  it != FListPrecompile.end(); ++it)
337  (*it)->setParameter(AParam);
338  }
339 }
340 //******************************************************************************
342 {
343  assert(AParam != NULL);
344 
345  if (AParam != FParameterDrawing)
346  {
347  AParam->incNbRef();
349  FParameterDrawing = AParam;
350 
351  for (list<CPrecompile*>::iterator it = FListPrecompile.begin();
352  it != FListPrecompile.end(); ++it)
353  (*it)->setParameter(AParam);
354  }
355 }
356 //******************************************************************************
358 {
359  CView::enable();
360  for (list<CPrecompile*>::iterator it = FListPrecompile.begin();
361  it != FListPrecompile.end(); ++it)
362  (*it)->incNbEnabledView();
363 }
364 //******************************************************************************
366 {
367  CView::disable();
368  for (list<CPrecompile*>::iterator it = FListPrecompile.begin();
369  it != FListPrecompile.end(); ++it)
370  (*it)->decNbEnabledView();
371 }
372 //******************************************************************************
373 void CViewPrecompile::pick(int AX, int AY)
374 {
375  for (list<CPrecompile*>::iterator it = FListPrecompile.begin();
376  it != FListPrecompile.end(); ++it)
377  (*it)->pick(AX, AY, this);
378 }
379 //******************************************************************************