00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #if defined(_WIN32)
00025 # include <Inventor/MP/Win/SoWinMPGLWidget.h>
00026 #else // _WIN32
00027
00028 #ifndef _SO_XT_MP_GL_WIDGET_H_
00029 #define _SO_XT_MP_GL_WIDGET_H_
00030
00031 #include <Inventor/helpers/SbGlContextHelper.h>
00032 #include <Inventor/Xt/SoXtComponent.h>
00033
00034
00035
00036
00037
00038 #define SO_GLX_RGB (1<<0)
00039 #define SO_GLX_DOUBLE (1<<1)
00040 #define SO_GLX_ZBUFFER (1<<2)
00041 #define SO_GLX_OVERLAY (1<<3)
00042 #define SO_GLX_STEREO (1<<4)
00043
00044 #include <Inventor/MP/Xt/SbConfig.h>
00045
00046 class SoGLContext;
00047
00049
00050
00051
00052
00054
00079 class SoXtMPGLWidget : public SoXtComponent {
00080
00081 public:
00082
00083 int getColorMapSize();
00084
00093 virtual Window getNormalWindow();
00094
00103 SoGLContext* getNormalContext() { return ctxNormal; }
00104
00113 SoWidget getNormalWidget() { return (glModes & SO_GLX_DOUBLE) ? doubleBufferWidget : singleBufferWidget; }
00114
00124 virtual void setNormalVisual(XVisualInfo *vis);
00125
00129 XVisualInfo *getNormalVisual();
00130
00136 virtual void setDoubleBuffer(SbBool onOrOff);
00140 SbBool isDoubleBuffer()
00141 { return ((glModes & SO_GLX_DOUBLE) ? 1 : 0); }
00147
00148
00149
00150
00151 void setBorder(SbBool onOrOff);
00155 SbBool isBorder() const { return borderSize != 0; }
00156
00161 void setDrawToFrontBufferEnable(SbBool enableFlag);
00162
00166 SbBool isDrawToFrontBufferEnable() const { return enableDrawToFrontBuffer; }
00167
00171 SbVec2s getVirtualSize(void) { return mpConfig->getVirtualSize(); }
00172
00186 SbVec2s winToDC( int x, int y, Window w = NULL ) const;
00187
00198 SbVec2f DCtoNDC( SbVec2s pos, Window w = NULL ) const;
00199
00200 private:
00201 SoGLContext* m_glContext;
00202
00203 private:
00204
00205
00206
00207
00208
00209
00210
00211
00212 #if 1 SoDEPRECATED
00218 SbBool makeNormalCurrent();
00219
00220 #endif
00226 SbBool bindNormalContext();
00227
00231 SbBool unbindNormalContext();
00232
00233 SbBool swapNormalBuffers();
00234
00235 #if 1 SoDEPRECATED
00237 unsigned long getOverlayTransparentPixel();SoDEPRECATED
00239 int getOverlayColorMapSize();
00240 SoDEPRECATED
00250 Window getOverlayWindow();
00251 SoDEPRECATED
00261 SoGLContext* getOverlayContext() { return ctxOverlay; }
00262 SoDEPRECATED
00272 SoWidget getOverlayWidget() { return overlayWidget; }
00273
00274
00275
00276
00277
00278
00279
00280 #if defined(sun) || defined(__linux__)
00281 SoDEPRECATED
00282 virtual void setSunOverlayBackgroundIndex();
00283 #endif
00284 SoDEPRECATED
00295 virtual void setOverlayVisual(XVisualInfo *vis);
00296 SoDEPRECATED
00301 XVisualInfo *getOverlayVisual();
00302 SoDEPRECATED
00304 SbBool makeOverlayCurrent();
00305 SoDEPRECATED
00307 SbBool swapOverlayBuffers();
00308 #endif
00310 void flush();
00311
00312
00313 SbBool ctxIsDirect();
00314
00315 private:
00316
00317
00318
00319
00320
00321 SoXtMPGLWidget(SoWidget parent = NULL,
00322 const char *name = NULL,
00323 SbBool buildInsideParent = TRUE,
00324 int glModes = SO_GLX_RGB,
00325 SbBool buildNow = TRUE);
00326
00327 #if defined(sun) || defined(__linux__) || defined(__hpux)
00328 SoXtMPGLWidget(SoWidget parent,
00329 const char *name,
00330 SbBool buildInsideParent,
00331 int glModes,
00332 SbBool buildNow,
00333 SbBool connectionType);
00334 #endif
00335
00336 virtual ~SoXtMPGLWidget();
00337
00338
00339
00340
00341
00342 virtual void redraw() = 0;
00343 #if 1 SoDEPRECATED
00345 virtual void redrawOverlay();
00346 #endif
00348 virtual void processEvent(XAnyEvent *anyevent);
00349
00350
00351
00352
00353
00354
00355 virtual void initGraphic();
00356 #if 1 SoDEPRECATED
00358 virtual void initOverlayGraphic();
00359 #endif
00361 virtual void sizeChanged(const SbVec2s &newSize);
00362 virtual void widgetChanged(SoWidget newWidget);
00363
00364 virtual void initViewportRegion(int);
00365
00366
00367
00368
00369
00370 void setGlxSize(SbVec2s newSize);
00371 const SbVec2s &getGlxSize() const { return glxSize; }
00372
00373
00374
00375 static void eventHandler(SoWidget, SoXtMPGLWidget *, XAnyEvent *, Boolean *);
00376
00377
00378
00379
00380 void setStereoBuffer(SbBool flag);
00381 SbBool isStereoBuffer()
00382 { return ((glModes & SO_GLX_STEREO) ? 1 : 0); }
00383
00384
00385 SbBool isRGBMode()
00386 { return ((glModes & SO_GLX_RGB) ? 1 : 0); }
00387
00388 #if defined(sun) || defined(__linux__)
00389 void allocCell(Display *display, Colormap cmap, XColor *colorcells,
00390 int ncolors, int colorMapSize);
00391 #endif
00392
00393
00394 int getDisplayListShareGroup( SoGLContext* ctx );
00395
00396 Colormap colorMap;
00397 Colormap overlayColorMap;
00398 int colorMapSize;
00399 int overlayColorMapSize;
00400
00401 SbBool waitForExpose;
00402 SbBool drawToFrontBuffer;
00403
00404
00405
00406 SoWidget buildWidget(SoWidget parent);
00407 SoWidget getGlxMgrWidget() { return mgrWidget; }
00408
00409 unsigned long transparentPixel;
00410
00411 int pipeContextIdOffset;
00412 void raiseMainViewer(SbBool);
00413
00414 SbConfig *mpConfig;
00415
00416 SbBool renderInFrontBuffer;
00417
00418 virtual void onExpose();
00419 virtual void onMPExpose();
00420
00421 #if 1 SoDEPRECATED
00423 virtual void onOverlayExpose();SoDEPRECATED
00425 virtual void onMPOverlayExpose();
00426 #endif
00428 private:
00429
00430 SoWidget mgrWidget;
00431 SoWidget doubleBufferWidget, singleBufferWidget, overlayWidget;
00432 SoGLContext* ctxNormal, *ctxOverlay, *ctxSingle, *ctxDouble;
00433 SbVec2s glxSize;
00434 int *attribList;
00435 int glModes;
00436 int borderSize;
00437 SbBool enableDrawToFrontBuffer;
00438
00439
00440
00441
00442
00443 SbBool windowResized;
00444
00445 SbBool directConnection;
00446
00447
00448
00449 void buildNormalGLXWidget(XVisualInfo *vis = NULL);
00450 void buildOverlayGLXWidget(XVisualInfo *vis = NULL);
00451 #if defined(sun) || defined(__linux__)
00452 void buildSunOverlayWindow(SoWidget glx, SoXtMPGLWidget *p);
00453 #endif
00454 void destroyNormalWindows();
00455 void destroyGLXWidget(SoWidget &w, SoGLContext* &ctx, SbBool normalWindow);
00456
00457
00458 static void ginitCB(SoWidget, SoXtMPGLWidget *, XtPointer);
00459 static void overlayGinitCB(SoWidget, SoXtMPGLWidget *, XtPointer);
00460 static void exposeCB(SoWidget, SoXtMPGLWidget *, XtPointer);
00461 static void overlayExposeCB(SoWidget, SoXtMPGLWidget *, XtPointer);
00462 static void resizeCB(SoWidget, SoXtMPGLWidget *, XtPointer);
00463
00464
00465 private:
00466 static void mpGinitCB(SoWidget, SoXtMPGLWidget *, XtPointer);
00467 static void mpExposeCB(SoWidget, SoXtMPGLWidget *, XtPointer);
00468 static void mpOverlayGinitCB(SoWidget, SoXtMPGLWidget *, XtPointer);
00469 static void mpOverlayExposeCB(SoWidget, SoXtMPGLWidget *, XtPointer);
00470
00471 static void mgrDestroyCB(SoWidget, SoXtMPGLWidget *, XtPointer);
00472
00473
00474 };
00475
00476 #endif // _SO_XT_GL_WIDGET_H_
00477
00478 #endif // _WIN32
00479
00480
00481