Moka controlers
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros
controler-views.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 "controler.hh"
26 
27 #include "view-precompile.hh"
28 #include "view-precompile-ortho.hh"
30 
32 #include "precompile-axis.hh"
33 #include "precompile-grid.hh"
34 
35 using namespace std;
36 //******************************************************************************
38 {
39  TViewId id = 0;
40  vector<CViewPrecompile *>::iterator it = FViews.begin();
41  while ( FViews[id]!=NULL && it!=FViews.end() )
42  {
43  ++it; ++id;
44  }
45 
46  if ( it==FViews.end() ) FViews.push_back(NULL);
47 
48  CParameterEyePosition * eyePosition = new CParameterEyePosition ;
50  CParameterDrawing * sceneDrawing = new CParameterDrawing ;
51 
52  FViews[id] = newViewPrecompile(AViewType, eyePosition,
53  aimedPosition, sceneDrawing);
54 
55  assert( FViews[id]!=NULL );
56 
57  return id;
58 }
59 //******************************************************************************
61 {
62  TViewId id = viewCreate( AViewType );
63  viewGroup( AView, id );
64  return id;
65 }
66 //******************************************************************************
68 {
69  assert( AViewId<FViews.size() );
70 
71  if ( FViews[AViewId]!=NULL )
72  {
73  delete FViews[AViewId];
74  FViews[AViewId] = NULL;
75  }
76 }
77 //******************************************************************************
78 void CControler::viewAddPrecompile(TViewId AViewId, TPrecompile APrecompileType)
79 {
80  assert( AViewId<FViews.size() );
81 
82  if ( FViews[AViewId]==NULL ||
83  FViews[AViewId]->findPrecompile(APrecompileType)!=NULL )
84  return;
85 
86  CPrecompile* precompile = newPrecompile(AViewId,APrecompileType);
87 
88  assert( precompile!=NULL );
89 
90  FViews[AViewId]->addPrecompile(precompile);
91 }
92 //******************************************************************************
94  TPrecompile APrecompileType)
95 {
96  assert( AViewId<FViews.size());
97 
98  if ( FViews[AViewId]!=NULL )
99  FViews[AViewId]->removePrecompile(APrecompileType);
100 }
101 //******************************************************************************
103 {
104  assert( AViewId<FViews.size() );
105 
106  if ( FViews[AViewId]==NULL ) return;
107 
108  CPrecompile * precompile = FViews[AViewId]->findPrecompile(APrecom);
109  if ( precompile==NULL )
110  viewAddPrecompile(AViewId,APrecom);
111  else
112  FViews[AViewId]->removePrecompile(APrecom);
113 }
114 //******************************************************************************
116 {
117  assert( AViewId<FViews.size() );
118 
119  if ( FViews[AViewId]==NULL ) return false;
120 
121  CPrecompile * precompile = FViews[AViewId]->findPrecompile(APrecom);
122 
123  return ( precompile!=NULL && precompile->isEnabled() );
124 }
125 //******************************************************************************
127 {
128  assert( AViewId<FViews.size() );
129 
130  if ( FViews[AViewId]==NULL ) return;
131 
132  CPrecompile * precompile = FViews[AViewId]->findPrecompile(APrecom);
133 
134  if ( precompile!=NULL ) precompile->enable();
135 }
136 //******************************************************************************
138 {
139  assert( AViewId<FViews.size() );
140 
141  if ( FViews[AViewId]==NULL ) return;
142 
143  CPrecompile * precompile = FViews[AViewId]->findPrecompile(APrecom);
144 
145  if ( precompile!=NULL ) precompile->disable();
146 }
147 //******************************************************************************
149 {
150  assert( AViewId<FViews.size() );
151 
152  if ( FViews[AViewId]==NULL ) return;
153 
154  CPrecompile * precompile = FViews[AViewId]->findPrecompile(APrecom);
155  if (precompile!=NULL )
156  {
157  if (precompile->isEnabled()) precompile->disable();
158  else precompile->enable();
159  }
160  else
161  viewAddPrecompile(AViewId, APrecom);
162 }
163 //******************************************************************************
165 {
166  assert( AViewId<FViews.size() );
167 
168  if (FViews[AViewId]==NULL) return;
169  FViews[AViewId]->update();
170 }
171 //******************************************************************************
173 {
174  assert( AViewId<FViews.size() );
175 
176  if (FViews[AViewId]==NULL) return;
177 
178  FViews[AViewId]->initScene();
179 }
180 //******************************************************************************
182 {
183  assert( AViewId<FViews.size() );
184 
185  if (FViews[AViewId]==NULL) return;
186 
187  viewUpdate(AViewId);
188  FViews[AViewId]->drawScene();
189 }
190 //******************************************************************************
191 void CControler::viewGroup(TViewId AViewId1, TViewId AViewId2)
192 {
193  assert( AViewId1<FViews.size() );
194  assert( AViewId2<FViews.size() );
195 
196  if ( FViews[AViewId1]==NULL || FViews[AViewId2]==NULL || AViewId1==AViewId2 )
197  return;
198 
199  // 1. On groupe tout les précompiles.
200  viewGroupPrecompiles(AViewId1,AViewId2);
201 
202  // 2. Et on groupe les paramètres de vue.
203  viewGroupParameter(AViewId1, AViewId2, PARAMETER_DRAWING);
204  viewGroupParameter(AViewId1, AViewId2, PARAMETER_EYE_POSITION);
205  viewGroupParameter(AViewId1, AViewId2, PARAMETER_AIMED_POSITION);
206 }
207 //******************************************************************************
209 {
210  for (unsigned int i=0; i<FViews.size(); ++i)
211  viewGroup(AViewId,i);
212 }
213 //******************************************************************************
215 {
216  assert( AViewId<FViews.size() );
217 
218  if ( FViews[AViewId]!=NULL )
219  {
220  // 1. On dégroupe tout les précompiles.
221  viewUngroupPrecompiles(AViewId);
222 
223  // 2. Et on dégroupe les paramètres de vue.
227  }
228 }
229 //******************************************************************************
231 {
232  for (unsigned int i=1; i<FViews.size(); ++i)
233  viewUngroup(i);
234 }
235 //******************************************************************************
237  TPrecompile APrecompileType)
238 {
239  assert( AViewId1<FViews.size() );
240  assert( AViewId2<FViews.size() );
241 
242  if ( APrecompileType==PRECOMPILE_AIMED_POINT ) return;
243 
244  if ( FViews[AViewId1]==NULL || FViews[AViewId2]==NULL || AViewId1==AViewId2 )
245  return;
246 
247  CPrecompile * precompile1 = FViews[AViewId1]->findPrecompile(APrecompileType);
248  CPrecompile * precompile2 = FViews[AViewId2]->findPrecompile(APrecompileType);
249 
250  if ( precompile1==precompile2 )
251  return;
252 
253  if ( precompile1!=NULL )
254  {
255  if ( precompile2!=NULL ) // 2 précompiles => Suppresion du deuxième.
256  FViews[AViewId2]->removePrecompile(APrecompileType);
257 
258  FViews[AViewId2]->addPrecompile(precompile1);
259  }
260  else // Cas où precompile1==NULL && precompile2!=NULL
261  FViews[AViewId1]->addPrecompile(precompile2);
262 }
263 //******************************************************************************
265 {
266  if ( AViewId1==AViewId2 ) return;
267 
269  viewGroupPrecompile(AViewId1, AViewId2, i);
270  }
271 //******************************************************************************
273 {
274  for (unsigned int i=0; i<FViews.size(); ++i)
275  viewGroupPrecompiles(AViewId, i);
276 }
277 //******************************************************************************
279  TPrecompile APrecompileType)
280 {
281  assert( AViewId<FViews.size() );
282 
283  if ( APrecompileType==PRECOMPILE_AIMED_POINT ) return;
284 
285  if ( FViews[AViewId]!=NULL )
286  {
287  CPrecompile * precompile = FViews[AViewId]->findPrecompile(APrecompileType);
288 
289  if ( precompile!=NULL && precompile->getNbView()>1 )
290  {
291  FViews[AViewId]->removePrecompile(APrecompileType);
292  FViews[AViewId]->addPrecompile( precompile->copy() );
293  }
294  }
295 }
296 //******************************************************************************
298 {
300  viewUngroupPrecompile(AViewId, i);
301  }
302 //******************************************************************************
304 {
305  for (unsigned int i=1; i<FViews.size(); ++i)
307 }
308 //******************************************************************************
310  TParameter AParameterType)
311 {
312  assert( AViewId1<FViews.size() );
313  assert( AViewId2<FViews.size() );
314 
315  if ( FViews[AViewId1]==NULL || FViews[AViewId2]==NULL || AViewId1==AViewId2)
316  return;
317 
318  FViews[AViewId1]->groupParameter(FViews[AViewId2], AParameterType);
319 }
320 //******************************************************************************
322  TParameter AParameterType)
323 {
324  for (unsigned int i=0; i<FViews.size(); ++i)
325  viewGroupParameter(AViewId, i, AParameterType);
326 }
327 //******************************************************************************
329 {
330  assert( AViewId<FViews.size() );
331 
332  if ( FViews[AViewId]!=NULL )
333  FViews[AViewId]->ungroupParameter(AParameterType);
334 }
335 //******************************************************************************
337 {
338  for (unsigned int i=1; i<FViews.size(); ++i)
339  viewUngroupParameter(i, AParameterType);
340 }
341 //******************************************************************************
343 {
344  assert( AViewId<FViews.size() );
345 
346  if ( FViews[AViewId]==NULL )
347  return false;
348 
349  return FViews[AViewId]->isEnabled();
350 }
351 //******************************************************************************
353 {
354  assert( AViewId<FViews.size() );
355 
356  if ( FViews[AViewId]!=NULL )
357  FViews[AViewId]->enable();
358 }
359 //******************************************************************************
361 {
362  assert( AViewId<FViews.size() );
363 
364  if ( FViews[AViewId]!=NULL )
365  FViews[AViewId]->disable();
366 }
367 //******************************************************************************