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 #ifndef _SO_WIN_GL_WIDGET_H_
00027 #define _SO_WIN_GL_WIDGET_H_
00028
00029
00030 #include <Inventor/Win/SoWinBeginStrict.h>
00031
00032 #include <Inventor/Win/SoWinComponent.h>
00033 #include <Inventor/components/SoGLGraphicConfigTemplate.h>
00034 #include <Inventor/components/SoGLGraphicDevice.h>
00035 #include <Inventor/components/SoGLGraphicConfig.h>
00036
00037 #include <Inventor/devices/SoGLContext.h>
00038
00039 #include <Inventor/nodes/SoFullSceneAntialiasing.h>
00040
00041 #include <Inventor/Gui/SoGuiGLWidget.h>
00042
00043 class SoGLContext;
00044 class SoAntialiasingParameters;
00045
00047
00048
00049
00050
00052
00076 class SoWinGLWidget : public SoWinComponent
00077 {
00078 public:
00079
00081 enum FloatColorBufferSize
00082 {
00086 FLOAT_16_COLOR_BUFFER = SoGuiGLWidget::FLOAT_16_COLOR_BUFFER,
00090 FLOAT_32_COLOR_BUFFER = SoGuiGLWidget::FLOAT_32_COLOR_BUFFER
00091 };
00092
00101 virtual Window getNormalWindow();
00102
00111 GLXContext getNormalContext() { return m_contextNormal->getGLContext(); }
00112
00113 virtual SoGLContext* getNormalSoContext() { return m_contextNormal; }
00114
00118 Hdc getNormalDC() const;
00119
00120 #ifndef HIDDEN_FROM_DOC
00121
00122 Hdc copyWindowBits() ;
00123 #endif // HIDDEN_FROM_DOC
00124
00132 void setStealFocus( SbBool onOrOff ) { stealFocus = onOrOff; };
00133
00142 SoWidget getNormalWidget() const;
00143
00152 virtual void setNormalVisual( XVisualInfo* vis );
00153
00157 XVisualInfo* getNormalVisual();
00158
00173 virtual void setPixelFormat( int format );
00174
00180 int getPixelFormat();
00181
00185 void setAntialiasing(const float quality, const SoSceneManager::AntialiasingMode mode = SoSceneManager::AUTO);
00186
00190 void setAntialiasing(SoAntialiasingParameters* advancedParameters);
00191
00195 float getAntialiasingQuality() const;
00196
00200 SoSceneManager::AntialiasingMode getAntialiasingMode() const;
00201
00205 SoAntialiasingParameters* getAntialiasingParameters() const;
00206
00212 void setDoubleBuffer( SbBool onOrOff );
00213
00217 SbBool isDoubleBuffer() { return m_guiGLWidget->isDoubleBuffer(); }
00218
00222 void setBorder( SbBool onOrOff );
00223
00227 int getBorderSize() { return m_guiGLWidget->getBorderSize(); }
00228
00232 SbBool isBorder() const { return m_guiGLWidget->isBorder(); }
00233
00238 void setDrawToFrontBufferEnable( SbBool enableFlag );
00239
00243 SbBool isDrawToFrontBufferEnable() const { return m_guiGLWidget->isDrawToFrontBufferEnable(); }
00244
00253 void setCursor( Cursor newCursor );
00254
00259 Cursor getCursor();
00260
00265 virtual SbBool bindNormalContext();
00266
00270 virtual SbBool unbindNormalContext();
00271
00272
00276 virtual SbBool swapNormalBuffers();
00277
00278 #if 1 SoDEPRECATED
00291 Window getOverlayWindow();
00292 SoDEPRECATED
00305 GLXContext getOverlayContext() { return m_contextOverlay->getGLContext(); }
00306 SoDEPRECATED
00308 SoGLContext* getOverlaySoContext() { return m_contextOverlay; }
00309 SoDEPRECATED
00314 Hdc getOverlayDC() const;
00315 SoDEPRECATED
00328 SoWidget getOverlayWidget() const;
00329 SoDEPRECATED
00342 virtual void setOverlayVisual( XVisualInfo* vis );
00343 SoDEPRECATED
00348 XVisualInfo* getOverlayVisual();
00349 SoDEPRECATED
00354 SbBool swapOverlayBuffers();
00355 #endif
00360 SoGLGraphicConfigTemplate* getGraphicConfigTemplate();
00361
00365 void setGraphicConfigTemplate( SoGLGraphicConfigTemplate* gTemplate );
00366
00380 void setFloatingColorBuffer( SbBool enable,
00381 FloatColorBufferSize size = FLOAT_16_COLOR_BUFFER );
00382
00386 void getFloatingColorBuffer( SbBool& enable, FloatColorBufferSize& size );
00387
00413 bool saveSnapshot( const SbString& filename, bool overwrite = true );
00414
00415 #if 1 SoDEPRECATED
00418 SbBool isFsaaSupported();
00419 SoDEPRECATED
00424 virtual SbBool makeNormalCurrent();
00425
00426 #endif
00428 #if 1 SoDEPRECATED
00451 SbBool setFullSceneAntialiasing( SbBool enable,
00452 float quality = -1.0,
00453 int filterMask = SoFullSceneAntialiasing::ALL );
00454 SoDEPRECATED
00459 SbBool isFullSceneAntialiasingEnabled() const;
00460 SoDEPRECATED
00465 SbBool getFullSceneAntialiasing( float& quality );
00466 SoDEPRECATED
00471 SbBool isFullSceneAntialiasingAvailable() const;
00472 SoDEPRECATED
00478 SbBool isFullSceneAntialiasingHQAvailable() const;
00479 SoDEPRECATED
00486 SbBool setFullSceneAntialiasingHQ( SbBool enable );
00487 SoDEPRECATED
00492 SbBool isFullSceneAntialiasingHQEnabled() const;
00493
00494 #endif
00496 private:
00497
00498
00499
00500
00501
00502
00503
00504 void flush();
00505
00506 private:
00507
00508 SoGuiGLWidget* getGuiGLWidget() const;
00509
00510
00511 void syncFromCurrentConfig();
00512
00513 void syncToCurrentConfigTemplate( PIXELFORMATDESCRIPTOR* newPFD );
00514
00515 SbBool currentGraphicConfigTemplateIsUsed;
00516 SoGLGraphicConfigTemplate currentGraphicConfigTemplate;
00517
00518
00519 SoGLGraphicDevice* getGraphicDevice();
00520
00521
00522 SoGLGraphicConfig* getGraphicConfig();
00523
00524 virtual void posChanged( const SbVec2i32&, const SbVec2i32& );
00525
00526
00527
00528 SbBool drawToFrontBuffer;
00529 SbBool m_isFloatingPointRendering;
00530 FloatColorBufferSize m_floatingPointRenderingPrecision;
00531
00532
00533
00534 static SbBool swapNormalBuffersCB(void *data);
00535 static SbBool bindNormalCurrentCB(void *data);
00536 static SbBool unbindNormalCurrentCB(void *data);
00537 static void* getNormalWindowCB(void *data);
00538
00539 private:
00540
00541
00542
00543
00544
00545
00546
00547 void updateCurrentDeviceAndConfig( HDC hdc );
00548
00549 SbBool currentGraphicConfigIsUsed;
00550 SoGLGraphicConfig* currentGraphicConfig;
00551 SbBool currentGraphicDeviceIsUsed;
00552 SoGLGraphicDevice* currentGraphicDevice;
00553
00554
00555
00556
00557
00558 SoWinGLWidget( SoWidget parent = NULL,
00559 const char* name = NULL,
00560 SbBool buildInsideParent = TRUE,
00561 int glModes = SO_GLX_RGB,
00562 SbBool buildNow = TRUE,
00563 SbBool sync = TRUE );
00564
00565 SoWinGLWidget( SoWidget parent,
00566 const char* name,
00567 SbBool buildInsideParent,
00568 int glModes,
00569 SbBool buildNow,
00570 SbBool sync,
00571 SoGuiGLWidget* guiGLWidget );
00572
00573 virtual ~SoWinGLWidget();
00574
00575
00576
00577
00578
00579 virtual void redraw() = 0;
00580 #if 1 SoDEPRECATED
00582 virtual void redrawOverlay();
00583 #endif
00584 virtual void processEvent( XAnyEvent* anyevent );
00585
00586
00587
00588
00589
00590
00591 virtual void initGraphic();
00592 #if 1 SoDEPRECATED
00594 virtual void initOverlayGraphic();
00595 #endif
00596 virtual void sizeChanged( const SbVec2s& newSize );
00597 virtual void widgetChanged( SoWidget newWidget );
00598
00599
00600
00601
00602
00603 void setGlxSize( SbVec2s newSize );
00604 const SbVec2s& getGlxSize() const { return m_guiGLWidget->getGlxSize(); }
00605
00606
00607
00608 static void eventHandler( SoWidget w, SoWinGLWidget* p, XAnyEvent* e, Boolean* b );
00609
00610
00611
00612
00613 void setStereoBuffer( SbBool flag );
00614 SbBool isStereoBuffer() const;
00615
00616
00617 SbBool isRGBMode() const;
00618
00619
00620 int getDisplayListShareGroup( SoGLContext* ctx );
00621
00622
00623 Colormap getColorMap() const
00624 { return m_guiGLWidget->getColorMap(); }
00625
00626 #if 1
00627 // set when overlay is used
00628 SoDEPRECATED
00629 Colormap getOverlayColorMap() const
00630 { return m_guiGLWidget->getOverlayColorMap(); }
00631 #endif
00633 SbBool waitForExpose; // prevent redraws until an expose is received
00634
00635
00636
00637 SoWidget buildWidget( SoWidget parent );
00638 SoWidget getGlxMgrWidget() { return mgrWidget; }
00639
00640
00641
00642
00643
00644 void changeCursor( Cursor newCursor );
00645
00646
00647 DWORD getThreadId() { return dwThreadId; };
00648 void setThreadId( DWORD id ) { dwThreadId=id; };
00649
00651
00652 virtual void onExpose();
00653 #if 1 SoDEPRECATED
00655 virtual void onOverlayExpose();
00656 #endif
00658 void destroyNormalWindows(SbBool normalCall=TRUE);
00659
00660 private:
00661
00662 void constructorCommon( int glModes, SbBool buildNow, SoWidget parent );
00663
00664 static SbBool onGLFormatChangeCallback( SoGLFormat& format, void* userData );
00665
00666 HWND createWindow( SoGLFormat* format );
00667
00668 void destroyWindow( HWND handle );
00669
00670 void initGLXWidget( SoWidget glx, SoGLFormat* format );
00671
00672
00673 SoWidget mgrWidget;
00674 SoWidget m_widgetNormal, m_widgetOverlay;
00675
00676 SoGLContext* m_contextNormal;
00677 SoGLContext* m_contextOverlay;
00678
00679 SoGuiGLWidget* m_guiGLWidget;
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689 Hdc m_hdcNormal, m_hdcOverlay;
00690
00691
00692
00693 HPALETTE palNormal, palOverlay;
00694
00695
00696
00697 SoWidget parent;
00698 SoWidget ancestor;
00699
00700
00701
00702
00703
00704
00705
00706
00707 int haveFocus;
00708
00709
00710 int stealFocus;
00711
00712
00713
00714
00715
00716 UINT mouseCaptured;
00717
00718
00719
00720
00721
00722
00723
00724
00725 HCURSOR currentCursor;
00726
00727
00728 static HCURSOR defaultCursor;
00729
00730 DWORD dwThreadId;
00731
00732 int* attribList;
00733
00734
00735
00736
00737
00738 SbBool windowResized;
00739
00740 bool m_isMouseTracking;
00741
00742
00743
00744 void buildNormalGLXWidget( SoGLFormat* format = NULL );
00745 void buildOverlayGLXWidget( SoGLFormat* format = NULL );
00746 void destroyGLXWidget( SoWidget& w, SoGLContext*& ctx, SbBool normalWindow );
00747
00748
00749 static void ginitCB( SoWidget w, SoWinGLWidget* p, XtPointer );
00750 static void overlayGinitCB( SoWidget w, SoWinGLWidget* p, XtPointer ptr );
00751 static void exposeCB( SoWidget w, SoWinGLWidget* p, XtPointer ptr );
00752 static void overlayExposeCB( SoWidget w, SoWinGLWidget* p, XtPointer ptr );
00753 static void resizeCB( SoWidget w, SoWinGLWidget* p, XtPointer ptr );
00754 static void mgrStructureNotifyCB( SoWidget w, SoWinGLWidget* p, XAnyEvent* e, Boolean* b );
00755
00756
00757 static LRESULT CALLBACK mgrWindowProc( Hwnd hwnd, UINT message,
00758 WPARAM wParam, LPARAM lParam );
00759
00760
00761 static LRESULT CALLBACK glxWindowProc( Hwnd hwnd, UINT message,
00762 WPARAM wParam, LPARAM lParam );
00763 };
00764
00765 inline void
00766 SoWinGLWidget::posChanged( const SbVec2i32&, const SbVec2i32& )
00767 {};
00768
00769
00770 #include <Inventor/Win/SoWinEndStrict.h>
00771
00772 #endif // _SO_WIN_GL_WIDGET_H_
00773
00774
00775