00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "gl-window.qt.hh"
00025 #include "window.qt.hh"
00026 #include "HtmlEntities.hh"
00027
00028 #include <QtGui/QCloseEvent>
00029 #include <QtGui/QMouseEvent>
00030 #include <QPainter>
00031
00032 using namespace GMap3d ;
00033
00034
00035
00036
00037 GLWindow :: GLWindow(TView AViewType , QWorkspace * parent ,
00038 Window * owner , SelectBar * selection) :
00039 QGLWidget(QGLFormat(QGL::SampleBuffers), parent , 0, Qt::SubWindow),
00040 FViewType(AViewType),
00041 FShared(NULL),
00042 isShared(false),
00043 FOwner(owner),
00044 FSelection(selection),
00045 FDragMode(false)
00046 {
00047 string str = getViewTypeString();
00048 setWindowTitle(*HTML::decode(&str));
00049 parent->addWindow(this);
00050 setAcceptDrops(true);
00051 }
00052
00053 GLWindow :: GLWindow(TView AViewType , QWorkspace * parent ,
00054 Window * owner , GLWindow * share ,
00055 SelectBar * selection) :
00056 QGLWidget(parent, share , Qt::SubWindow) ,
00057 FViewType(AViewType) ,
00058 FShared(share) ,
00059 isShared(true) ,
00060 FOwner(owner),
00061 FSelection(selection),
00062 FDragMode(false)
00063 {
00064 string str = getViewTypeString();
00065 setWindowTitle(*HTML::decode(&str));
00066 parent->addWindow(this);
00067 setAcceptDrops(true);
00068 }
00069
00070
00071
00072 GLWindow :: ~GLWindow() { }
00073
00074
00075
00076 TView GLWindow :: getViewType() const
00077 {
00078 return FViewType;
00079 }
00080
00081 TViewId GLWindow :: getViewId() const
00082 {
00083 return FViewId;
00084 }
00085
00086 string GLWindow::getViewTypeString() const
00087 {
00088 switch (FViewType)
00089 {
00090 case VIEW_XYZ: return string("Vue 3D");
00091 case VIEW_XY: return string("Vue XY");
00092 case VIEW_XZ: return string("Vue XZ");
00093 case VIEW_YZ: return string("Vue YZ");
00094 }
00095
00096 return string("");
00097 }
00098
00099 TViewId GLWindow :: getCliquedViewId() const
00100 { return FViewId; }
00101
00102 TViewId GLWindow :: getDoubleCliquedViewId() const
00103 { return FViewId; }
00104
00105
00106
00107 void GLWindow::closeEvent(QCloseEvent * e)
00108 {
00109
00110 if (FViewId == 0)
00111 if (e != NULL)
00112 e -> ignore() ;
00113 else
00114 return ;
00115 else
00116 {
00117
00118 FOwner->getControler()->viewDestroy(FViewId) ;
00119 if (e != NULL)
00120 e -> accept() ;
00121 else
00122 close() ;
00123 }
00124 }
00125
00126
00127
00128 void GLWindow::paintGL()
00129 {
00130 QPainter p(this);
00131
00132 glClear(GL_COLOR_BUFFER_BIT) ;
00133 glLoadIdentity() ;
00134
00135 FOwner -> getControler() -> viewInit(FViewId) ;
00136
00137 if (FDragMode)
00138 {
00139 p.setPen(Qt::white) ;
00140 p.drawRect(FStartX, FStartY, FCurX - FStartX, FCurY - FStartY);
00141 if (FOwner->getControler()->getModeDeselectionAtStop())
00142 p.drawText(FStartX, FStartY, "Deselect");
00143 else
00144 p.drawText(FStartX, FStartY, "Select");
00145 }
00146
00147 FOwner -> getControler() -> viewDraw(FViewId) ;
00148 }
00149
00150
00151
00152 void GLWindow :: resizeGL(int W , int H)
00153 {
00154 glViewport(0, 0, W, H);
00155 }
00156
00157
00158
00159 void GLWindow :: initializeGL()
00160 {
00161 glEnable(GL_DEPTH_TEST);
00162 glDepthFunc(GL_LEQUAL);
00163
00164 glEnable(GL_NORMALIZE);
00165
00166 glDisable(GL_BLEND);
00167
00168 glEnable(GL_POLYGON_MODE);
00169 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
00170
00171
00172 static const GLfloat Material_Ks[] = {0.5, 0.5, 0.5, 1.0};
00173 static const GLfloat Material_Ke[] = {0.0, 0.0, 0.0, 1.0};
00174 static const GLfloat Material_Se = 100;
00175
00176 glEnable(GL_COLOR_MATERIAL);
00177 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR , Material_Ks);
00178 glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION , Material_Ke);
00179 glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, Material_Se);
00180
00181
00182 static const GLfloat Light_Ka[] = {0.1, 0.1, 0.1, 1.0};
00183 static const GLfloat Light_Kd[] = {1.0, 1.0, 1.0, 1.0};
00184 static const GLfloat Light_Ks[] = {0.5, 0.5, 0.5, 1.0};
00185
00186 glLightfv(GL_LIGHT0, GL_AMBIENT , Light_Ka);
00187 glLightfv(GL_LIGHT0, GL_DIFFUSE , Light_Kd);
00188 glLightfv(GL_LIGHT0, GL_SPECULAR, Light_Ks);
00189
00190
00191 creation() ;
00192 }
00193
00194
00195
00196 void GLWindow :: creation()
00197 {
00198 if (FShared == NULL)
00199 {
00200 GMap3d :: CControlerGMap* controler = FOwner -> getControler() ;
00201
00202 FViewId = controler->viewCreate(FViewType);
00203
00204 controler->viewAddPrecompile(FViewId, PRECOMPILE_GRID);
00205 controler->viewAddPrecompile(FViewId, PRECOMPILE_AXIS);
00206 controler->viewAddPrecompile(FViewId, PRECOMPILE_AIMED_POINT);
00207 controler->viewAddPrecompile(FViewId, PRECOMPILE_FACE);
00208 controler->viewAddPrecompile(FViewId,
00209 PRECOMPILE_OBJECT_TRANSFORMATION);
00210 controler->viewAddPrecompile(FViewId, PRECOMPILE_PREVIEW);
00211 controler->viewAddPrecompile(FViewId, PRECOMPILE_NORMAL_VECTOR);
00212 controler->viewAddPrecompile(FViewId, PRECOMPILE_SEW);
00213 controler->viewAddPrecompile(FViewId, PRECOMPILE_VERTEX);
00214 #ifdef MODULE_SPAMOD
00215 controler->viewAddPrecompile(FViewId, PRECOMPILE_SPAMOD);
00216 controler->viewDisablePrecompile(FViewId, PRECOMPILE_SPAMOD);
00217 controler->getParameterSpamod(FViewId)->setViewMode(SPAMOD_NONE);
00218 #endif // MODULE_SPAMOD
00219 controler->viewAddPrecompile(FViewId, PRECOMPILE_DART);
00220 controler->viewDisablePrecompile(FViewId, PRECOMPILE_SEW);
00221 controler->viewDisablePrecompile(FViewId, PRECOMPILE_VERTEX);
00222 controler->viewDisablePrecompile(FViewId, PRECOMPILE_FACE);
00223 controler->viewDisablePrecompile(FViewId, PRECOMPILE_NORMAL_VECTOR);
00224
00225
00226 controler->loadAllParameters(FViewId);
00227
00228
00229
00230 controler->getParameterAimedPosition(FViewId)->reinit();
00231 controler->getParameterEyePosition(FViewId)->reinit();
00232 }
00233 else
00234 {
00235 FViewId = FOwner -> getControler() ->
00236 viewCreateShare(FViewType , FShared->FViewId) ;
00237 }
00238 }
00239
00240
00241
00242 void GLWindow :: mousePressEvent(QMouseEvent * eb)
00243 {
00244 CControlerGMap * controler = FOwner -> getControler() ;
00245 int y = this -> height() - eb -> y() ;
00246
00247 if (eb->modifiers() == Qt::ControlModifier)
00248 {
00249 switch (eb -> button())
00250 {
00251 case Qt::LeftButton:
00252
00253 controler ->
00254 operationModeIndependentStart(MODE_OPERATION_SCENE_TRANSLATION ,
00255 FViewId, int (eb -> x()), y) ;
00256 break;
00257 case Qt::MidButton :
00258 controler ->
00259 operationModeIndependentStart(MODE_OPERATION_SCENE_ROTATION,
00260 FViewId, int(eb->x()), y);
00261 break;
00262 case Qt::RightButton :
00263 controler ->
00264 operationModeIndependentStart(MODE_OPERATION_SCENE_SCALE,
00265 FViewId, int(eb->x()), y);
00266 break;
00267 default : {}
00268 }
00269 }
00270 else
00271 {
00272
00273 if (eb -> button() == Qt :: LeftButton)
00274 {
00275 controler->
00276 setHalfSelectionOrbit(eb -> modifiers() == Qt :: ShiftModifier) ;
00277 controler->operationModeStart(FViewId, int(eb->x()), y) ;
00278
00279 CreationObjet * boite = FOwner -> getCreationActive() ;
00280
00281 if (boite != NULL)
00282 boite -> update() ;
00283
00284 dialogOperations * op = FOwner -> getOperationActive() ;
00285
00286 if (op != NULL)
00287 op -> update() ;
00288
00289 OptionsCarac * carac = FOwner -> getOptionsCaracActive() ;
00290 if (carac != NULL)
00291 carac -> update() ;
00292
00293 FOwner -> repaint() ;
00294
00295 if (controler->getMode() == MODE_OPERATION_SELECTION)
00296 {
00297 FStartX = int (eb -> x()); FStartY = int (eb -> y());
00298 FCurX = FStartX; FCurY = FStartY;
00299 FDragMode = true;
00300
00301 if (eb -> modifiers() == Qt :: ShiftModifier)
00302 controler -> setModeDeselectionAtStop();
00303 }
00304 }
00305 else if (eb -> button() == Qt::MidButton)
00306 {
00307 if (controler->isInCreationMode())
00308 {
00309 CreationObjet * boite = FOwner -> getCreationActive() ;
00310
00311 if (boite != NULL)
00312 boite -> create() ;
00313 }
00314 else
00315 {
00316 FSelection -> niveauSuivant() ;
00317 #ifdef MODULE_ARCHITECTURE
00318 FOwner -> getFlapSelection() -> nextLevel();
00319 #endif
00320 }
00321 }
00322 else if (eb -> button() == Qt :: RightButton)
00323 {
00324 FOwner -> getControler() -> lookAtMouseClick(FViewId, eb -> x(), y);
00325 repaint();
00326 }
00327 }
00328 }
00329
00330 void GLWindow :: mouseMoveEvent(QMouseEvent * em)
00331 {
00332 int y = this -> height() - em -> y() ;
00333 FOwner -> getControler() -> operationModeMove(int (em -> x()), y) ;
00334 CreationObjet * boite = FOwner -> getCreationActive() ;
00335 if (boite != NULL)
00336 boite -> update() ;
00337
00338 dialogOperations * op = FOwner -> getOperationActive() ;
00339
00340 if (op != NULL)
00341 op -> update() ;
00342
00343 if (FDragMode)
00344 { FCurX = int (em -> x()); FCurY = int (em -> y()); }
00345
00346 FOwner -> repaint() ;
00347 this -> update() ;
00348 }
00349
00350 void GLWindow :: mouseReleaseEvent(QMouseEvent * eb)
00351 {
00352 CControlerGMap * controler = FOwner -> getControler();
00353 FDragMode = false;
00354 int y = this -> height() - eb -> y() ;
00355
00356 controler -> operationModeStop(int(eb->x()), y);
00357
00358 CreationObjet * boite = FOwner -> getCreationActive() ;
00359 if (boite != NULL) boite -> update() ;
00360
00361 dialogOperations * op = FOwner -> getOperationActive() ;
00362 if (op != NULL) op -> update() ;
00363
00364 FOwner -> repaint() ;
00365 this -> update() ;
00366 }
00367
00368 void GLWindow :: mouseDoubleClickEvent(QMouseEvent * e)
00369 {
00370 if (e -> button() == Qt::LeftButton)
00371 {
00372 FOwner -> setDoubleCliquee(this) ;
00373 }
00374 else
00375 {
00376 mousePressEvent(e);
00377 }
00378 }