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
00026
00027 #ifndef _SO_WIN_MP_GL_WIDGET_H_
00028 #define _SO_WIN_MP_GL_WIDGET_H_
00029
00030 #include <Inventor/sys/port.h>
00031
00032 #include <Inventor/Win/SoWinBeginStrict.h>
00033
00034 #include <Inventor/Win/SoWinComponent.h>
00035
00036 #include <Inventor/MP/Xt/SbConfig.h>
00037
00038
00039
00040
00041
00042 #define SO_GLX_RGB (1<<0)
00043 #define SO_GLX_DOUBLE (1<<1)
00044 #define SO_GLX_ZBUFFER (1<<2)
00045 #define SO_GLX_OVERLAY (1<<3)
00046 #define SO_GLX_STEREO (1<<4)
00047
00048 class SoGLContext;
00049
00051
00052
00053
00054
00056
00070 class SoWinMPGLWidget : public SoWinComponent
00071 {
00072 public:
00073
00082 virtual Window getNormalWindow();
00083
00092 SoGLContext* getNormalContext() { return ctxNormal; }
00093
00098 Hdc getNormalDC() { return hdcNormal; }
00099
00100 #ifndef HIDDEN_FROM_DOC
00101
00102 Hdc copyWindowBits() ;
00103 #endif // HIDDEN_FROM_DOC
00104
00112 void setStealFocus( SbBool onOrOff ) { stealFocus = onOrOff; };
00121 SoWidget getNormalWidget() { return (glModes & SO_GLX_DOUBLE) ? doubleBufferWidget : singleBufferWidget; }
00122
00131 virtual void setNormalVisual(XVisualInfo *vis);
00135 XVisualInfo * getNormalVisual();
00136
00137
00148 virtual void setPixelFormat( int format );
00154 int getPixelFormat();
00155
00161 void setDoubleBuffer(SbBool onOrOff);
00165 SbBool isDoubleBuffer() { return (glModes & SO_GLX_DOUBLE); }
00166
00170 void setBorder(SbBool onOrOff);
00174 int getBorderSize() {return borderSize;} ;
00178 SbBool isBorder() const { return borderSize != 0; }
00179
00184 void setDrawToFrontBufferEnable(SbBool enableFlag);
00188 SbBool isDrawToFrontBufferEnable() const { return enableDrawToFrontBuffer; }
00189
00196 void setCursor(Cursor newCursor);
00200 Cursor getCursor();
00201
00206 SbBool bindNormalContext();
00207
00211 SbBool unbindNormalContext();
00212
00216 SbBool swapNormalBuffers();
00217
00218 #if 1 SoDEPRECATED
00231 Window getOverlayWindow();
00232 SoDEPRECATED
00245 SoGLContext* getOverlayContext() { return ctxOverlay; }
00246 SoDEPRECATED
00252 Hdc getOverlayDC() { return hdcOverlay; }
00253 SoDEPRECATED
00266 SoWidget getOverlayWidget() { return overlayWidget; }
00267
00268
00269
00270
00271 SoDEPRECATED
00284 virtual void setOverlayVisual( XVisualInfo *vis );
00285 SoDEPRECATED
00290 XVisualInfo* getOverlayVisual();
00291 SoDEPRECATED
00296 SbBool swapOverlayBuffers();
00297 #endif
00299 #if 1 SoDEPRECATED
00305 SbBool makeNormalCurrent();
00306
00307 #endif
00309 private:
00310 SoGLContext* m_glContext;
00311
00312 private:
00313
00314
00315
00316
00317
00318 SoWinMPGLWidget(SoWidget parent = NULL,
00319 const char *name = NULL,
00320 SbBool buildInsideParent = TRUE,
00321 int glModes = SO_GLX_RGB,
00322 SbBool buildNow = TRUE);
00323 virtual ~SoWinMPGLWidget();
00324
00325
00326
00327
00328
00329 virtual void redraw() = 0;
00330 #if 1 SoDEPRECATED
00332 virtual void redrawOverlay();
00333 #endif
00334 virtual void processEvent(XAnyEvent *anyevent);
00335
00336
00337
00338
00339
00340
00341 virtual void initGraphic();
00342 #if 1 SoDEPRECATED
00344 virtual void initOverlayGraphic();
00345 #endif
00347 virtual void sizeChanged(const SbVec2s &newSize);
00348 virtual void widgetChanged(SoWidget newWidget);
00349
00350 virtual void initViewportRegion(int);
00351
00352
00353
00354
00355
00356 void setGlxSize(SbVec2s newSize);
00357 const SbVec2s & getGlxSize() const { return glxSize; }
00358
00359
00360
00361 static void eventHandler(SoWidget, SoWinMPGLWidget *, XAnyEvent *, Boolean *);
00362
00363
00364
00365
00366 void setStereoBuffer(SbBool flag);
00367 SbBool isStereoBuffer() { return (glModes & SO_GLX_STEREO); }
00368
00369
00370 SbBool isRGBMode() { return (glModes & SO_GLX_RGB); }
00371
00372
00373 int getDisplayListShareGroup( SoGLContext* ctx );
00374
00375 Colormap colorMap;
00376 Colormap overlayColorMap;
00377
00378 SbBool waitForExpose;
00379 SbBool drawToFrontBuffer;
00380
00381
00382
00383 SoWidget buildWidget(SoWidget parent);
00384 SoWidget getGlxMgrWidget() { return mgrWidget; }
00385
00387
00388
00389
00390 void changeCursor( Cursor newCursor );
00391
00392 SbConfig * mpConfig;
00393
00394 int pipeContextIdOffset;
00395 void raiseMainViewer(SbBool);
00396
00397
00398 DWORD getThreadId() { return dwThreadId; };
00399 void setThreadId(DWORD id) { dwThreadId=id; };
00400
00402
00403 virtual void onExpose();
00404
00405 #if 1 SoDEPRECATED
00407 virtual void onOverlayExpose();
00408 #endif
00410 private:
00411
00412 SoWidget mgrWidget;
00413 SoWidget doubleBufferWidget, singleBufferWidget, overlayWidget;
00414 SoGLContext* ctxNormal, *ctxOverlay, *ctxSingle, *ctxDouble;
00415
00416 SbVec2s glxSize;
00417 SbBool enableDrawToFrontBuffer;
00418
00419
00420
00421
00422
00423
00424 PIXELFORMATDESCRIPTOR pfd;
00425 int m_nPixelFormat;
00426
00427
00428 PIXELFORMATDESCRIPTOR pfdNormal, pfdOverlay, pfdSingle, pfdDouble;
00429
00430
00431
00432
00433
00434
00435 Hdc hdcNormal, hdcOverlay, hdcSingle, hdcDouble;
00436
00437
00438
00439
00440
00441 HPALETTE palNormal, palOverlay, palSingle, palDouble;
00442
00443
00444
00445 SoWidget parent;
00446 SoWidget ancestor;
00447
00448
00449
00450
00451
00452
00453
00454
00455 int haveFocus;
00456
00457
00458 int stealFocus;
00459
00460
00461
00462
00463
00464 UINT mouseCaptured;
00465
00466
00467
00468
00469
00470
00471
00472
00473 HCURSOR currentCursor;
00474
00475
00476 static HCURSOR defaultCursor;
00477
00478 DWORD dwThreadId;
00479
00480 int* attribList;
00481 int glModes;
00482 int borderSize;
00483
00484
00485
00486
00487
00488 SbBool windowResized;
00489
00490
00491
00492 void buildNormalGLXWidget(XVisualInfo *vis = NULL);
00493 void buildOverlayGLXWidget(XVisualInfo *vis = NULL);
00494 void destroyNormalWindows();
00495 void destroyGLXWidget(SoWidget &w, SoGLContext* &ctx, SbBool normalWindow);
00496
00497
00498 static void ginitCB(SoWidget, SoWinMPGLWidget *, XtPointer);
00499 static void overlayGinitCB(SoWidget, SoWinMPGLWidget *, XtPointer ptr);
00500 static void exposeCB(SoWidget, SoWinMPGLWidget *, XtPointer);
00501 static void overlayExposeCB(SoWidget, SoWinMPGLWidget *, XtPointer);
00502 static void resizeCB(SoWidget, SoWinMPGLWidget *, XtPointer);
00503 static void mgrStructureNotifyCB(SoWidget, SoWinMPGLWidget *, XAnyEvent *, Boolean *);
00504
00505 #if defined(_WIN32)
00506
00507 static LRESULT CALLBACK mgrWindowProc( Hwnd hwnd, UINT message,
00508 WPARAM wParam, LPARAM lParam );
00509
00510
00511 static LRESULT CALLBACK glxWindowProc( Hwnd hwnd, UINT message,
00512 WPARAM wParam, LPARAM lParam );
00513 #endif // _WIN32
00514 private:
00515 static void mpGinitCB(SoWidget, SoWinMPGLWidget *, XtPointer);
00516 };
00517
00518 #if defined(_WIN32)
00519 #include <Inventor/Win/SoWinEndStrict.h>
00520 #endif // _WIN32
00521
00522 #endif // _SO_WIN_GL_WIDGET_H_
00523
00524
00525