From c91d7e94d15ac2b7d98e3b53dbadf54be667978b Mon Sep 17 00:00:00 2001 From: Rene Brun <Rene.Brun@cern.ch> Date: Wed, 8 Mar 2006 21:09:43 +0000 Subject: [PATCH] From Timur Pocheptsov: -TGLPixmap - removed and replaced by TGLViewer (most of the TGLViewer functionality is available in pad now); -TGLHistPainter - zooming/panning added for legoes/surfaces; -TGLViewerEditor - TGLViewer's editor for pad (lights/clipping/guides manipulation). -TRootCanvas : minor changes to support mouse wheel event in gl viewer in a pad -TCanvas : a)changes to process keyboard events correctly b)changes to process mouse will events -TVirtualViewer3D : changes in interface for TGLManager (win32 implementation of TGLManager requires some functions and cannot be dependant from TGLViewer) -Added class TVirtualGLManipulator - base for TGLManip - again, required mostly by TGWin32GL. git-svn-id: http://root.cern.ch/svn/root/trunk@14203 27541ba8-7e3a-0410-8455-c3a389f83636 --- base/inc/LinkDef1.h | 3 +- base/inc/TVirtualGL.h | 23 +- base/inc/TVirtualViewer3D.h | 6 +- base/src/TVirtualGL.cxx | 5 +- gl/Module.mk | 5 +- gl/inc/LinkDef.h | 2 +- gl/inc/TGLHistPainter.h | 16 +- gl/inc/TGLManip.h | 8 +- gl/inc/TGLPixmap.h | 104 -- gl/inc/TGLViewer.h | 9 +- gl/inc/TGLViewerEditor.h | 97 ++ gl/inc/TX11GL.h | 7 +- gl/src/TGLHistPainter.cxx | 87 +- gl/src/TGLManip.cxx | 5 +- gl/src/TGLPixmap.cxx | 1356 ------------------------ gl/src/TGLViewer.cxx | 190 +++- gl/src/TGLViewerEditor.cxx | 448 ++++++++ gl/src/TX11GL.cxx | 32 +- gpad/src/TCanvas.cxx | 44 +- gui/src/TRootCanvas.cxx | 21 +- tutorials/rootgeom.C | 3 +- win32gdk/inc/TGWin32GL.h | 8 +- win32gdk/inc/TGWin32VirtualGLProxy.h | 5 +- win32gdk/src/TGWin32GL.cxx | 26 +- win32gdk/src/TGWin32VirtualGLProxy.cxx | 5 +- 25 files changed, 964 insertions(+), 1551 deletions(-) delete mode 100644 gl/inc/TGLPixmap.h create mode 100644 gl/inc/TGLViewerEditor.h delete mode 100644 gl/src/TGLPixmap.cxx create mode 100644 gl/src/TGLViewerEditor.cxx diff --git a/base/inc/LinkDef1.h b/base/inc/LinkDef1.h index 4ac18f243a7..5cb914f38ff 100644 --- a/base/inc/LinkDef1.h +++ b/base/inc/LinkDef1.h @@ -1,4 +1,4 @@ -/* @(#)root/base:$Name: $:$Id: LinkDef1.h,v 1.32 2005/11/17 14:43:17 couet Exp $ */ +/* @(#)root/base:$Name: $:$Id: LinkDef1.h,v 1.33 2006/01/23 21:50:26 brun Exp $ */ /************************************************************************* * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. * @@ -155,6 +155,7 @@ #pragma link C++ class TVirtualGLImp; #pragma link C++ class TGLManager; #pragma link C++ class TVirtualGLPainter; +#pragma link C++ class TVirtualGLManip; #pragma link C++ class TVirtualPS; #pragma link C++ class TVirtualUtil3D; #pragma link C++ class TVirtualUtilHist; diff --git a/base/inc/TVirtualGL.h b/base/inc/TVirtualGL.h index a60bb6a40cc..b7f87f9aed2 100644 --- a/base/inc/TVirtualGL.h +++ b/base/inc/TVirtualGL.h @@ -1,4 +1,4 @@ -// @(#)root/base:$Name: $:$Id: TVirtualGL.h,v 1.27 2006/02/03 21:55:38 pcanal Exp $ +// @(#)root/base:$Name: $:$Id: TVirtualGL.h,v 1.28 2006/02/06 16:15:12 couet Exp $ // Author: Valery Fine(fine@vxcern.cern.ch) 05/03/97 /************************************************************************* @@ -174,10 +174,6 @@ public: R__EXTERN TVirtualGL *(*gPtr2VirtualGL)(); #endif -//This class (and its descendants) in future will replace (?) -//TVirtualGL/TGLKernel/TGWin32GL/TGX11GL - - class TVirtualGLPainter { public: virtual ~TVirtualGLPainter(){} @@ -186,6 +182,18 @@ public: ClassDef(TVirtualGLPainter, 0); // Interface for OpenGL painter }; +//We need this class to implement TGWin32GLManager's SelectManip +class TVirtualGLManip { +public: + virtual ~TVirtualGLManip(){} + virtual Bool_t Select(const TGLCamera & camera, const TGLRect & rect, const TGLBoundingBox & sceneBox) = 0; + + ClassDef(TVirtualGLManip, 0); //Interface for GL manipulator +}; + +//This class (and its descendants) in future will replace (?) +//TVirtualGL/TGLKernel/TGWin32GL/TGX11GL + class TGLManager : public TNamed { public: TGLManager(); @@ -221,7 +229,10 @@ public: //functions to switch between threads in win32 virtual void DrawViewer(TVirtualViewer3D *vv) = 0; - virtual TObject* Select(TVirtualViewer3D *vv, Int_t x, Int_t y) = 0; + // + virtual Bool_t SelectViewer(TVirtualViewer3D *viewer, const TGLRect *selRect) = 0; + virtual Bool_t SelectManip(TVirtualGLManip *manip, const TGLCamera *camera, const TGLRect *rect, const TGLBoundingBox *sceneBox) = 0; + // virtual void PaintSingleObject(TVirtualGLPainter *) = 0; //EPS/PDF output virtual void PrintViewer(TVirtualViewer3D *vv) = 0; diff --git a/base/inc/TVirtualViewer3D.h b/base/inc/TVirtualViewer3D.h index 331f183b30c..c4b3e518f8c 100644 --- a/base/inc/TVirtualViewer3D.h +++ b/base/inc/TVirtualViewer3D.h @@ -1,4 +1,4 @@ -// @(#)root/base:$Name: $:$Id: TVirtualViewer3D.h $ +// @(#)root/base:$Name: $:$Id: TVirtualViewer3D.h,v 1.9 2006/01/30 17:42:05 rdm Exp $ // Author: Olivier Couet 05/10/2004 /************************************************************************* @@ -38,6 +38,7 @@ class TBuffer3D; class TVirtualPad; +class TGLRect; class TVirtualViewer3D : public TObject { @@ -69,6 +70,9 @@ public: virtual TObject *SelectObject(Int_t, Int_t){return 0;} virtual void DrawViewer(){} + virtual void DoDraw(){} + virtual Bool_t DoSelect(const TGLRect &){return kFALSE;} + virtual void PrintObjects(){} static TVirtualViewer3D *Viewer3D(TVirtualPad *pad = 0, Option_t *type = ""); diff --git a/base/src/TVirtualGL.cxx b/base/src/TVirtualGL.cxx index 8fd587d34dc..f4e205bc494 100644 --- a/base/src/TVirtualGL.cxx +++ b/base/src/TVirtualGL.cxx @@ -1,4 +1,4 @@ -// @(#)root/base:$Name: $:$Id: TVirtualGL.cxx,v 1.5 2005/11/16 20:04:12 pcanal Exp $ +// @(#)root/base:$Name: $:$Id: TVirtualGL.cxx,v 1.6 2005/11/17 14:43:17 couet Exp $ // Author: Valery Fine(fine@vxcern.cern.ch) 05/03/97 ////////////////////////////////////////////////////////////////////////// @@ -78,3 +78,6 @@ TGLManager *&TGLManager::Instance() } ClassImp(TVirtualGLPainter) + + +ClassImp(TVirtualGLManip) diff --git a/gl/Module.mk b/gl/Module.mk index cf8b7839eec..9278c3ac68f 100644 --- a/gl/Module.mk +++ b/gl/Module.mk @@ -39,9 +39,12 @@ GLLIBS := $(OPENGLLIBDIR) $(OPENGLULIB) $(OPENGLLIB) \ $(X11LIBDIR) -lX11 -lXext -lXmu -lXi -lm endif ifeq ($(ARCH),win32) -GLLIBS := opengl32.lib glu32.lib $(LPATH)/libGraf.lib $(LPATH)/libHist.lib +GLLIBS := opengl32.lib glu32.lib $(LPATH)/libGraf.lib $(LPATH)/libHist.lib $(LPATH)/libGed.lib +else +GLLIBS += $(LPATH)/libGed.$(SOEXT) endif + GLO := $(GLS:.cxx=.o) GLO1 := $(GLS1:.c=.o) diff --git a/gl/inc/LinkDef.h b/gl/inc/LinkDef.h index 88664653b2c..38e506a1aca 100644 --- a/gl/inc/LinkDef.h +++ b/gl/inc/LinkDef.h @@ -65,8 +65,8 @@ #pragma link C++ class TGLPolyMarker; #pragma link C++ class TGLCylinder; #pragma link C++ class TGLSphere; -#pragma link C++ class TGLPixmap; #pragma link C++ class TGLHistPainter; +#pragma link C++ class TGLViewerEditor; #ifndef _WIN32 #pragma link C++ class TX11GL; #pragma link C++ class TX11GLManager; diff --git a/gl/inc/TGLHistPainter.h b/gl/inc/TGLHistPainter.h index ab739f02559..3124af977d8 100644 --- a/gl/inc/TGLHistPainter.h +++ b/gl/inc/TGLHistPainter.h @@ -20,6 +20,14 @@ #include "TGLUtil.h" #endif +#ifndef ROOT_TPoint +#include "TPoint.h" +#endif + +#ifndef ROOT_TGLOrthoCamera +#include "TGLOrthoCamera.h" +#endif + class TString; class TAxis; class TF3; @@ -148,7 +156,11 @@ private: std::vector<UChar_t> fTexture; void (TGLHistPainter::*fCurrentPainter)()const; mutable Int_t fFrontPoint; - + + Double_t fZoom; + TGLVertex3 fPan; + TPoint fCurrPos; + public: TGLHistPainter(TH1 *hist); ~TGLHistPainter(); @@ -221,6 +233,8 @@ private: void SetTransformation()const; void ClearBuffers()const; + + void Pan(Int_t newX, Int_t newY); Bool_t Select(Int_t x, Int_t y)const; void SelectAxes(Int_t front, Int_t x, Int_t y)const; diff --git a/gl/inc/TGLManip.h b/gl/inc/TGLManip.h index 3f663a1def8..4eaf98cfa1f 100644 --- a/gl/inc/TGLManip.h +++ b/gl/inc/TGLManip.h @@ -1,4 +1,4 @@ -// @(#)root/gl:$Name: $:$Id: TGLManip.h,v 1.8 2006/02/21 16:39:49 brun Exp $ +// @(#)root/gl:$Name: $:$Id: TGLManip.h,v 1.9 2006/02/23 16:44:51 brun Exp $ // Author: Richard Maunder 16/09/2005 /************************************************************************* @@ -12,6 +12,9 @@ #ifndef ROOT_TGLManip #define ROOT_TGLManip +#ifndef ROOT_TVirtualGL +#include "TVirtualGL.h" +#endif #ifndef ROOT_TPoint #include "TPoint.h" #endif @@ -44,8 +47,7 @@ class TGLViewer; // some common mouse action handling/tracking. // ////////////////////////////////////////////////////////////////////////// -class TGLManip // TODO Should derive from TGLDrawable or TGLPhysicalShape -{ +class TGLManip : public TVirtualGLManip { protected: TGLPhysicalShape * fShape; //! manipulated shape UInt_t fSelectedWidget; //! active width (axis) component diff --git a/gl/inc/TGLPixmap.h b/gl/inc/TGLPixmap.h deleted file mode 100644 index 40765f71473..00000000000 --- a/gl/inc/TGLPixmap.h +++ /dev/null @@ -1,104 +0,0 @@ -// @(#)root/gl:$Name: $:$Id: TGLPixmap.h,v 1.5 2006/02/06 16:15:13 couet Exp $ -// Author: Timur Pocheptsov 18/08/2005 - -/************************************************************************* - * Copyright (C) 1995-2005, Rene Brun and Fons Rademakers. * - * All rights reserved. * - * * - * For the licensing terms see $ROOTSYS/LICENSE. * - * For the list of contributors see $ROOTSYS/README/CREDITS. * - *************************************************************************/ - -#ifndef ROOT_TGLPixmap -#define ROOT_TGLPixmap - -#include <utility> - -#ifndef ROOT_TVirtualViewer3D -#include "TVirtualViewer3D.h" -#endif -#ifndef ROOT_TArcBall -#include "TArcBall.h" -#endif -#ifndef ROOT_TPoint -#include "TPoint.h" -#endif - -class GLSelection; -class GLSceneObject; -class GLCamera; -class TBuffer3D; -class TVirtualPad; -class TGLRender; - -class TGLPixmap : public TVirtualViewer3D { -private: - GLCamera *fCamera; - Double_t fViewVolume[4]; - Double_t fZoom[4]; - Int_t fActiveViewport[4]; - Int_t fLightMask; - TGLRender *fRender; - - typedef std::pair<Double_t, Double_t> PDD_t; - PDD_t fRangeX, fRangeY, fRangeZ, fLastPosRot; - Double_t fXc, fYc, fZc; - Double_t fRad; - - Bool_t fPressed; - TArcBall fArcBall; - - UInt_t fNbShapes; - TPoint fLastPos; - - Int_t fGLDevice; - - GLSceneObject *fSelectedObj; - enum EAction{kNoAction, kRotating, kPicking, kZooming}; - EAction fAction; - Bool_t fBuildingScene; - TVirtualPad *fPad; - Bool_t fFirstScene; - -public: - TGLPixmap(TVirtualPad * pad); - ~TGLPixmap(); - - // TVirtualViewer3D interface - virtual Bool_t PreferLocalFrame() const; - virtual void BeginScene(); - virtual Bool_t BuildingScene() const { return fBuildingScene; } - virtual void EndScene(); - Int_t AddObject(const TBuffer3D &buffer, Bool_t *addChild); - Int_t AddObject(UInt_t, const TBuffer3D &, Bool_t *) {return 0;} - virtual Bool_t OpenComposite(const TBuffer3D & buffer, Bool_t * addChildren = 0); - virtual void CloseComposite(); - virtual void AddCompositeOp(UInt_t operation); - TObject *SelectObject(Int_t x, Int_t y); - Int_t DistancetoPrimitive(Int_t px, Int_t py); - -///////////////////////////////////////// - void ZoomIn();// *MENU* - void ZoomOut();// *MENU* - void PrintObjects();// *MENU* - - void ExecuteEvent(Int_t type, Int_t px, Int_t py); - void DrawViewer(); -private: - void CreateViewer(); - void DrawObjects()const; - void UpdateRange(const GLSelection *box); - void CalculateViewports(); - void CalculateViewvolumes(); - void CreateCameras(); - - Bool_t MakeCurrent()const; - - //non-copyable class - TGLPixmap(const TGLPixmap &); - TGLPixmap & operator = (const TGLPixmap &); - - ClassDef(TGLPixmap, 0); //Temporary gl pad viewer -}; - -#endif diff --git a/gl/inc/TGLViewer.h b/gl/inc/TGLViewer.h index 5e19c8505c1..05d30936f92 100644 --- a/gl/inc/TGLViewer.h +++ b/gl/inc/TGLViewer.h @@ -1,4 +1,4 @@ -// @(#)root/gl:$Name: $:$Id: TGLViewer.h,v 1.22 2006/01/26 11:59:41 brun Exp $ +// @(#)root/gl:$Name: $:$Id: TGLViewer.h,v 1.24 2006/02/08 10:49:26 couet Exp $ // Author: Richard Maunder 25/05/2005 /************************************************************************* @@ -190,7 +190,9 @@ private: protected: TGLWindow * fGLWindow; //! remove - replace with TGLManager - + //NEW + Int_t fGLDevice; //!for embedded gl viewer + //NEW // Overloadable virtual void PostSceneBuildSetup(); virtual void SelectionChanged(); // *SIGNAL* @@ -198,6 +200,7 @@ protected: public: TGLViewer(TVirtualPad * pad, Int_t x, Int_t y, UInt_t width, UInt_t height); + TGLViewer(TVirtualPad * pad); virtual ~TGLViewer(); // TVirtualViewer3D interface @@ -212,6 +215,8 @@ public: virtual Bool_t OpenComposite(const TBuffer3D & buffer, Bool_t * addChildren = 0); virtual void CloseComposite(); virtual void AddCompositeOp(UInt_t operation); + + Int_t GetDev()const{return fGLDevice;} // External GUI component interface void SetDrawStyle(TGLDrawFlags::EStyle style); diff --git a/gl/inc/TGLViewerEditor.h b/gl/inc/TGLViewerEditor.h new file mode 100644 index 00000000000..18ec313ea16 --- /dev/null +++ b/gl/inc/TGLViewerEditor.h @@ -0,0 +1,97 @@ +#ifndef ROOT_TGLViewerEditor +#define ROOT_TGLViewerEditor + +#include <memory> + +#ifndef ROOT_TGedFrame +#include "TGedFrame.h" +#endif + +#ifndef ROOT_TGLUtil +#include "TGLUtil.h" +#endif + +class TGCheckButton; +class TGNumberEntry; +class TGButtonGroup; +class TGroupFrame; +class TGRadioButton; +class TGTabElement; +class TGButton; +class TGLViewer; +class TGTab; + +class TGLViewerEditor : public TGedFrame { +private: + //Pointers to manipulate with tabs + TGTabElement *fGuidesTabEl; + TGTabElement *fClipTabEl; + TGCompositeFrame *fGuidesFrame; + TGCompositeFrame *fClipFrame; + //"Lights" tab's controls + TGGroupFrame *fLightFrame; + TGButton *fTopLight; + TGButton *fRightLight; + TGButton *fBottomLight; + TGButton *fLeftLight; + TGButton *fFrontLight; + //"Guides" tab's controls + TGButtonGroup *fAxesContainer; + TGRadioButton *fAxesNone; + TGRadioButton *fAxesEdge; + TGRadioButton *fAxesOrigin; + TGGroupFrame *fRefContainer; + + TGCheckButton *fReferenceOn; + TGNumberEntry *fReferencePosX; + TGNumberEntry *fReferencePosY; + TGNumberEntry *fReferencePosZ; + + //"Cplipping" tab's controls + EClipType fCurrentClip; + TGButtonGroup *fTypeButtons; + + TGCompositeFrame *fPlanePropFrame; + TGNumberEntry *fPlaneProp[4]; + + TGCompositeFrame *fBoxPropFrame; + TGNumberEntry *fBoxProp[6]; + TGCheckButton *fEdit; + TGButton *fApplyButton; + //Model + TGLViewer *fViewer; + + void ConnectSignals2Slots(); + + TGLViewerEditor(const TGLViewerEditor &); + TGLViewerEditor &operator = (const TGLViewerEditor &); + + void CreateLightsTab(); + void CreateGuidesTab(); + void CreateClippingTab(); + +public: + TGLViewerEditor(const TGWindow *p, Int_t id, + Int_t width = 140, Int_t height = 30, + UInt_t options = kChildFrame, + Pixel_t back = GetDefaultFrameBackground()); + + ~TGLViewerEditor(); + + void SetModel(TVirtualPad *pad, TObject *obj, Int_t event); + void SetGuides(); + void SetCurrentClip(); + //Lights manipulation + void DoButton(); + //Axis manipulation + void UpdateViewerGuides(); + void UpdateReferencePos(); + //Clipping manipulation + void ClipValueChanged(); + void ClipTypeChanged(Int_t); + void UpdateViewerClip(); + + ClassDef(TGLViewerEditor, 0) //GUI for editing TGLViewer attributes +}; + +#endif diff --git a/gl/inc/TX11GL.h b/gl/inc/TX11GL.h index 660a8dcb75a..ef351a13f2b 100644 --- a/gl/inc/TX11GL.h +++ b/gl/inc/TX11GL.h @@ -1,4 +1,4 @@ -// @(#)root/x11:$Name: $:$Id: TX11GL.h,v 1.9 2006/02/06 16:15:13 couet Exp $ +// @(#)root/x11:$Name: $:$Id: TX11GL.h,v 1.10 2006/02/07 14:18:45 couet Exp $ // Author: Timur Pocheptsov 09/08/2004 /************************************************************************* @@ -93,7 +93,10 @@ public: //used by viewer void DrawViewer(TVirtualViewer3D *vv); - TObject* Select(TVirtualViewer3D *vv, Int_t x, Int_t y); + // + Bool_t SelectViewer(TVirtualViewer3D *viewer, const TGLRect *selRect); + Bool_t SelectManip(TVirtualGLManip *manip, const TGLCamera *camera, const TGLRect *rect, const TGLBoundingBox *sceneBox); + // void PaintSingleObject(TVirtualGLPainter *); void PrintViewer(TVirtualViewer3D *vv); diff --git a/gl/src/TGLHistPainter.cxx b/gl/src/TGLHistPainter.cxx index e76ccf11ce8..b91d3c70bd2 100644 --- a/gl/src/TGLHistPainter.cxx +++ b/gl/src/TGLHistPainter.cxx @@ -1,4 +1,5 @@ #include <algorithm> +#include <iostream> #ifdef WIN32 #include "Windows4root.h" @@ -22,6 +23,11 @@ #include "TROOT.h" #include "TAxis.h" #include "TMath.h" +#include "TFile.h" + +#include "TH2.h" + +#include "TGLBoundingBox.h" #include "TPad.h" #include "TH1.h" #include "TF3.h" @@ -58,7 +64,8 @@ TGLHistPainter::TGLHistPainter(TH1 *hist) f2DPass(kFALSE), fTextureName(0), fCurrentPainter(0), - fFrontPoint(2) + fFrontPoint(2), + fZoom(1.) { //Each TGLHistPainter has default painter as a member //to delegate unsupported calls @@ -89,6 +96,8 @@ Int_t TGLHistPainter::DistancetoPrimitive(Int_t px, Int_t py) if (!MakeCurrent())return 1000; + + if (!Select(px, py)) gPad->SetSelected(gPad);// To avoid TF2 selection @@ -143,7 +152,20 @@ void TGLHistPainter::ExecuteEvent(Int_t event, Int_t px, Int_t py) case kMouseMotion: gPad->SetCursor(kRotate);//Does not work for TF2 (?) break; + case kButton2Down: + gGLManager->MarkForDirectCopy(fGLDevice, kTRUE); + fCurrPos.fX = px; + fCurrPos.fY = fViewport[3] - py; + break; + case kButton2Motion: + Pan(px, fViewport[3] - py); + break; + case kButton2Up: + gGLManager->MarkForDirectCopy(fGLDevice, kFALSE); + break; case kKeyPress: + case 5: + case 6: if (fLastOption == kTF3 && (py == kKey_s || py == kKey_S)) { if(fTF3Style < kMaple2) fTF3Style = EGLTF3Style(fTF3Style + 1); @@ -153,6 +175,18 @@ void TGLHistPainter::ExecuteEvent(Int_t event, Int_t px, Int_t py) gPad->Modified(); gPad->Update(); } + if (event == 5 || py == kKey_J || py == kKey_j) { + gGLManager->MarkForDirectCopy(fGLDevice, kTRUE); + fZoom /= 1.2; + gGLManager->PaintSingleObject(this); + gGLManager->MarkForDirectCopy(fGLDevice, kFALSE); + } else if (event == 6 || py == kKey_K || py == kKey_k) { + gGLManager->MarkForDirectCopy(fGLDevice, kTRUE); + fZoom *= 1.2; + gGLManager->PaintSingleObject(this); + gGLManager->MarkForDirectCopy(fGLDevice, kFALSE); + } + break; } } } @@ -281,6 +315,7 @@ void TGLHistPainter::Paint(Option_t *o) void TGLHistPainter::Paint() { //This function indirectly called via gGLManager->PaintSingleObject + gPad->SetCopyGLDevice(kTRUE); //Calculate translation, frustum. CalculateTransformation(); @@ -318,6 +353,29 @@ void TGLHistPainter::Paint() DrawAxes(); gVirtualX->SelectWindow(gPad->GetPixmapID()); //Flush pixmap during rotation + + /* gPad->SetCopyGLDevice(kTRUE); + glColor3d(1., 0., 0.); + glDisable(GL_CULL_FACE); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(-1., 1., -1., 1., -200000., 149999.); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +// glTranslated(0, 0, -15000.); + glBegin(GL_POLYGON); + glNormal3d(0.,0., 1); + glVertex3d(-0.5, -0.5, 150000.); + glVertex3d(0.5, -0.5, 150000.); + glVertex3d(0.5, 0.5, 150000.); + glVertex3d(-0.5, 0.5, 150000.); + glEnd(); + + glFlush(); + //Put content of GL buffer into pixmap/DIB + gGLManager->ReadGLBuffer(fGLDevice); + gGLManager->Flush(fGLDevice);*/ gGLManager->Flush(fGLDevice); } @@ -1034,8 +1092,8 @@ void TGLHistPainter::CalculateTransformation() fFrustum[0] = maxDim; fFrustum[1] = maxDim; - fFrustum[2] = maxDim * 0.707; - fFrustum[3] = 3 * maxDim; + fFrustum[2] = -100 * maxDim; + fFrustum[3] = 100 * maxDim; fShift = maxDim * 1.5; } @@ -1240,7 +1298,7 @@ void TGLHistPainter::SetCamera()const glMatrixMode(GL_PROJECTION); glLoadIdentity(); - glOrtho(-fFrustum[0], fFrustum[0], -fFrustum[1], fFrustum[1], fFrustum[2], fFrustum[3]); + glOrtho(-fFrustum[0] * fZoom, fFrustum[0] * fZoom, - fFrustum[1] * fZoom, fFrustum[1] * fZoom, -200000, 200000);//fFrustum[2], fFrustum[3]); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); @@ -1256,6 +1314,7 @@ void TGLHistPainter::SetTransformation()const glRotated(-45., 0., 1., 0.); glRotated(-90., 0., 1., 0.); glRotated(-90., 1., 0., 0.); + glTranslated(-fPan[0], -fPan[1], -fPan[2]); glTranslated(-fCenter[0] * fScaleX, -fCenter[1] * fScaleY, -fCenter[2] * fScaleZ); } @@ -1929,7 +1988,9 @@ namespace { 255, 255, 185, 200 }; + const UChar_t gDefTexture2[] = + { //R G B A 230, 0, 115, 255, @@ -1951,6 +2012,24 @@ namespace { }; } +void TGLHistPainter::Pan(Int_t x, Int_t y) +{ + Double_t mvMatrix[16] = {0.}; + glGetDoublev(GL_MODELVIEW_MATRIX, mvMatrix); + Double_t prMatrix[16] = {0.}; + glGetDoublev(GL_PROJECTION_MATRIX, prMatrix); + + TGLVertex3 start, end; + gluUnProject(fCurrPos.fX, fCurrPos.fY, 1., mvMatrix, prMatrix, fViewport, &start.X(), &start.Y(), &start.Z()); + gluUnProject(x, y, 1., mvMatrix, prMatrix, fViewport, &end.X(), &end.Y(), &end.Z()); + TGLVector3 delta = start - end; + fPan = fPan + delta / 2.; + fCurrPos.fX = x, fCurrPos.fY = y; +// fFrustum[0] *= 1.2, fFrustum[1] *= 1.2; + gGLManager->PaintSingleObject(this); +} + + //______________________________________________________________________________ void TGLHistPainter::SetTexture() { diff --git a/gl/src/TGLManip.cxx b/gl/src/TGLManip.cxx index feaf8ddfb26..f19ef64d305 100644 --- a/gl/src/TGLManip.cxx +++ b/gl/src/TGLManip.cxx @@ -1,4 +1,4 @@ -// @(#)root/gl:$Name: $:$Id: TGLManip.cxx,v 1.8 2006/01/30 17:42:06 rdm Exp $ +// @(#)root/gl:$Name: $:$Id: TGLManip.cxx,v 1.9 2006/02/23 16:44:52 brun Exp $ // Author: Richard Maunder 16/09/2005 /************************************************************************* @@ -151,6 +151,9 @@ Bool_t TGLManip::HandleMotion(const Event_t & event, const TGLCamera & camera, c // TODO: Again very ugly cross thread gVirtual GL call requires passing viewer // + if (gGLManager) + return gGLManager->SelectManip(this, &camera, &selectRect, &sceneBox); + return gVirtualGL->SelectManip(this, &camera, &selectRect, &sceneBox); } diff --git a/gl/src/TGLPixmap.cxx b/gl/src/TGLPixmap.cxx deleted file mode 100644 index 41a71cabcff..00000000000 --- a/gl/src/TGLPixmap.cxx +++ /dev/null @@ -1,1356 +0,0 @@ -// @(#)root/gl:$Name: $:$Id: TGLPixmap.cxx,v 1.13 2006/02/06 16:15:13 couet Exp $ -// Author: Timur Pocheptsov 18/08/2005 - -/************************************************************************* - * Copyright (C) 1995-2005, Rene Brun and Fons Rademakers. * - * All rights reserved. * - * * - * For the licensing terms see $ROOTSYS/LICENSE. * - * For the list of contributors see $ROOTSYS/README/CREDITS. * - *************************************************************************/ - -#include "Riostream.h" -#include <algorithm> -#include <utility> -#include <vector> - -#ifdef WIN32 -#include "Windows4root.h" -#endif - -#include <GL/gl.h> -#include <GL/glu.h> - -#include "TVirtualPS.h" -#include "gl2ps.h" -#include "TVirtualGL.h" -#include "TVirtualPad.h" -#include "TError.h" -#include "TBuffer3D.h" -#include "TColor.h" -#include "TMath.h" -#include "TSystem.h" -#include "TGLPixmap.h" -#include "TArcBall.h" -#include "TBuffer3D.h" -#include "TBuffer3DTypes.h" -#include "TObjArray.h" -#include "Buttons.h" - -#include "TPad.h" -#include "KeySymbols.h" - -ClassImp(TGLPixmap) - -class GLSelection { -private: - Double_t fBBox[6]; - -public: - GLSelection(); - GLSelection(const Double_t *bbox); - GLSelection(Double_t xmin, Double_t xmax, Double_t ymin, - Double_t ymax, Double_t zmin, Double_t zmax); - - void SetBBox(const Double_t *newBbox); - void SetBBox(Double_t xmin, Double_t xmax, Double_t ymin, - Double_t ymax, Double_t zmin, Double_t zmax); - - const Double_t *GetRangeX()const{return fBBox;} - const Double_t *GetRangeY()const{return fBBox + 2;} - const Double_t *GetRangeZ()const{return fBBox + 4;} -}; - -class GLSceneObject : public TObject { -protected: - std::vector<Double_t> fVertices; - Float_t fColor[17]; - GLSelection fSelectionBox; - Bool_t fIsSelected; - -private: - UInt_t fGLName; - GLSceneObject *fNextT; - TObject *fRealObject; - -public: - GLSceneObject(const TBuffer3D &buffer, Int_t verticesReserve, - const Float_t *color = 0, UInt_t glName = 0, TObject *realObj = 0); - GLSceneObject(const TBuffer3D &buffer, - const Float_t *color = 0, UInt_t glName = 0, TObject *realObj = 0); - GLSceneObject(UInt_t glName, const Float_t *color, Short_t trans, TObject *realObj); - - virtual Bool_t IsTransparent()const; - - virtual void GLDraw()const = 0; - - GLSelection *GetBBox(){return &fSelectionBox;} - const GLSelection *GetBBox()const{return &fSelectionBox;} - - void SetNextT(GLSceneObject *next){fNextT = next;} - GLSceneObject *GetNextT()const{return fNextT;} - - UInt_t GetGLName()const{return fGLName;} - TObject *GetRealObject()const{return fRealObject;} - - const Float_t *GetColor()const{return fColor;} - void SetColor(const Float_t *newColor, Bool_t fromCtor = kFALSE); - - void Select(Bool_t select = kTRUE){fIsSelected = select;} - - void SetBBox(); -private: - GLSceneObject(const GLSceneObject &); - GLSceneObject & operator = (const GLSceneObject &); - - void SetBBox(const TBuffer3D & buffer); - -}; - -class GLFaceSet : public GLSceneObject { -private: - std::vector<Double_t> fNormals; - std::vector<Int_t> fPolyDesc; - UInt_t fNbPols; - -public: - GLFaceSet(const TBuffer3D &buff, const Float_t *color, - UInt_t glName, TObject *realObj); - - void GLDraw()const; - void GLDrawPolys()const; - -private: - Int_t CheckPoints(const Int_t *source, Int_t *dest)const; - static Bool_t Eq(const Double_t *p1, const Double_t *p2); - void CalculateNormals(); -}; - -static GLUtriangulatorObj *getTesselator() -{ - static struct Init { - Init() - { -#if defined(R__WIN32) - typedef void (CALLBACK *tessfuncptr_t)(); -#elif defined(R__AIXGCC) - typedef void (*tessfuncptr_t)(...); -#else - typedef void (*tessfuncptr_t)(); -#endif - fTess = gluNewTess(); - - if (!fTess) { - Error("getTesselator::Init", "could not create tesselation object"); - } else { - gluTessCallback(fTess, (GLenum)GLU_BEGIN, (tessfuncptr_t)glBegin); - gluTessCallback(fTess, (GLenum)GLU_END, (tessfuncptr_t)glEnd); - gluTessCallback(fTess, (GLenum)GLU_VERTEX, (tessfuncptr_t)glVertex3dv); - } - } - ~Init() - { - if(fTess) - gluDeleteTess(fTess); - } - GLUtriangulatorObj *fTess; - }singleton; - - return singleton.fTess; -} - - -//______________________________________________________________________________ -GLSelection::GLSelection() -{ - // - fBBox[0] = fBBox[1] = fBBox[2] = - fBBox[3] = fBBox[4] = fBBox[5] = 0.; -} - - -//______________________________________________________________________________ -GLSelection::GLSelection(const Double_t *bbox) -{ - // - for (Int_t i= 0; i < 6; ++i) fBBox[i] = bbox[i]; -} - - -//______________________________________________________________________________ -GLSelection::GLSelection(Double_t xmin, Double_t xmax, Double_t ymin, - Double_t ymax, Double_t zmin, Double_t zmax) -{ - // - fBBox[0] = xmin, fBBox[1] = xmax; - fBBox[2] = ymin, fBBox[3] = ymax; - fBBox[4] = zmin, fBBox[5] = zmax; -} - - -//______________________________________________________________________________ -void GLSelection::SetBBox(const Double_t *newBBox) -{ - // - for (Int_t i= 0; i < 6; ++i) fBBox[i] = newBBox[i]; -} - - -//______________________________________________________________________________ -void GLSelection::SetBBox(Double_t xmin, Double_t xmax, Double_t ymin, - Double_t ymax, Double_t zmin, Double_t zmax) -{ - // - fBBox[0] = xmin, fBBox[1] = xmax; - fBBox[2] = ymin, fBBox[3] = ymax; - fBBox[4] = zmin, fBBox[5] = zmax; -} - - -//______________________________________________________________________________ -GLSceneObject::GLSceneObject(const TBuffer3D &buffer, const Float_t *color, - UInt_t glName, TObject *obj) : - fVertices(buffer.fPnts, buffer.fPnts + 3 * buffer.NbPnts()), - fColor(), - fIsSelected(kFALSE), - fGLName(glName), - fNextT(0), - fRealObject(obj) -{ - // - SetColor(color, kTRUE); - fColor[3] = 1.f - buffer.fTransparency / 100.f; - SetBBox(buffer); -} - - -//______________________________________________________________________________ -GLSceneObject::GLSceneObject(const TBuffer3D &buffer, Int_t verticesReserve, - const Float_t *color, UInt_t glName, TObject *obj) : - fVertices(verticesReserve, 0.), - fColor(), - fIsSelected(kFALSE), - fGLName(glName), - fNextT(0), - fRealObject(obj) -{ - // - SetColor(color, kTRUE); - fColor[3] = 1.f - buffer.fTransparency / 100.f; - SetBBox(buffer); -} - - -//______________________________________________________________________________ -GLSceneObject::GLSceneObject(UInt_t glName, const Float_t *color, Short_t trans, TObject *obj) - : fColor(), fIsSelected(kFALSE), fGLName(glName), fNextT(0), fRealObject(obj) -{ - // - SetColor(color, kTRUE); - fColor[3] = 1.f - trans / 100.f; -} - - -//______________________________________________________________________________ -Bool_t GLSceneObject::IsTransparent()const -{ - // - return fColor[3] < 1.f; -} - - -//______________________________________________________________________________ -void GLSceneObject::SetColor(const Float_t *color, Bool_t fromCtor) -{ - // - if (!fromCtor) { - for (Int_t i = 0; i < 17; ++i) fColor[i] = color[i]; - } else { - if (color) { - //diffuse and specular - fColor[0] = color[0]; - fColor[1] = color[1]; - fColor[2] = color[2]; - } else { - //for (Int_t i = 0; i < 12; ++i) fColor[i] = 1.f; - fColor[0] = 1.f; - fColor[1] = .3f; - fColor[2] = .0f; - } - //ambient - fColor[4] = fColor[5] = fColor[6] = 0.f; - //specular - fColor[8] = fColor[9] = fColor[10] = 0.7f; - //emission - fColor[12] = fColor[13] = fColor[14] = 0.f; - //alpha - fColor[3] = fColor[7] = fColor[11] = fColor[15] = 1.f; - //shininess - if (color) fColor[16] = 60.f; - else fColor[16] = 10.f; - } -} - - -//______________________________________________________________________________ -void GLSceneObject::SetBBox(const TBuffer3D & buffer) -{ - // - Double_t xmin = buffer.fPnts[0], xmax = xmin; - Double_t ymin = buffer.fPnts[1], ymax = ymin; - Double_t zmin = buffer.fPnts[2], zmax = zmin; - - for (UInt_t nv = 3; nv < buffer.NbPnts()*3; nv += 3) { - xmin = TMath::Min(xmin, buffer.fPnts[nv]); - xmax = TMath::Max(xmax, buffer.fPnts[nv]); - ymin = TMath::Min(ymin, buffer.fPnts[nv + 1]); - ymax = TMath::Max(ymax, buffer.fPnts[nv + 1]); - zmin = TMath::Min(zmin, buffer.fPnts[nv + 2]); - zmax = TMath::Max(zmax, buffer.fPnts[nv + 2]); - } - - fSelectionBox.SetBBox(xmin, xmax, ymin, ymax, zmin, zmax); -} - - -//______________________________________________________________________________ -void GLSceneObject::SetBBox() -{ - // Use the buffer bounding box if provided - - if (fVertices.size() >= 3) { - Double_t xmin = fVertices[0], xmax = xmin; - Double_t ymin = fVertices[1], ymax = ymin; - Double_t zmin = fVertices[2], zmax = zmin; - - for (UInt_t nv = 3; nv < fVertices.size(); nv += 3) { - xmin = TMath::Min(xmin, fVertices[nv]); - xmax = TMath::Max(xmax, fVertices[nv]); - ymin = TMath::Min(ymin, fVertices[nv + 1]); - ymax = TMath::Max(ymax, fVertices[nv + 1]); - zmin = TMath::Min(zmin, fVertices[nv + 2]); - zmax = TMath::Max(zmax, fVertices[nv + 2]); - } - - fSelectionBox.SetBBox(xmin, xmax, ymin, ymax, zmin, zmax); - } -} - - -//______________________________________________________________________________ -GLFaceSet::GLFaceSet(const TBuffer3D & buff, const Float_t *color, UInt_t glname, TObject *realobj) - :GLSceneObject(buff, color, glname, realobj), - fNormals(3 * buff.NbPols()) -{ - // - fNbPols = buff.NbPols(); - - Int_t *segs = buff.fSegs; - Int_t *pols = buff.fPols; - Int_t shiftInd = buff.fReflection ? 1 : -1; - - Int_t descSize = 0; - - for (UInt_t i = 0, k = 1; i < fNbPols; ++i, ++k) - { - descSize += pols[k] + 1; - k += pols[k] + 1; - } - - fPolyDesc.resize(descSize); - - for (UInt_t numPol = 0, currInd = 0, j = 1; numPol < fNbPols; ++numPol) { - Int_t segmentInd = shiftInd < 0 ? pols[j] + j : j + 1; - Int_t segmentCol = pols[j]; - Int_t s1 = pols[segmentInd]; - segmentInd += shiftInd; - Int_t s2 = pols[segmentInd]; - segmentInd += shiftInd; - Int_t segEnds[] = {segs[s1 * 3 + 1], segs[s1 * 3 + 2], - segs[s2 * 3 + 1], segs[s2 * 3 + 2]}; - Int_t numPnts[3] = {0}; - - if (segEnds[0] == segEnds[2]) { - numPnts[0] = segEnds[1], numPnts[1] = segEnds[0], numPnts[2] = segEnds[3]; - } else if (segEnds[0] == segEnds[3]) { - numPnts[0] = segEnds[1], numPnts[1] = segEnds[0], numPnts[2] = segEnds[2]; - } else if (segEnds[1] == segEnds[2]) { - numPnts[0] = segEnds[0], numPnts[1] = segEnds[1], numPnts[2] = segEnds[3]; - } else { - numPnts[0] = segEnds[0], numPnts[1] = segEnds[1], numPnts[2] = segEnds[2]; - } - - fPolyDesc[currInd] = 3; - Int_t sizeInd = currInd++; - fPolyDesc[currInd++] = numPnts[0]; - fPolyDesc[currInd++] = numPnts[1]; - fPolyDesc[currInd++] = numPnts[2]; - Int_t lastAdded = numPnts[2]; - - Int_t end = shiftInd < 0 ? j + 1 : j + segmentCol; - for (; segmentInd != end; segmentInd += shiftInd) { - segEnds[0] = segs[pols[segmentInd] * 3 + 1]; - segEnds[1] = segs[pols[segmentInd] * 3 + 2]; - if (segEnds[0] == lastAdded) { - fPolyDesc[currInd++] = segEnds[1]; - lastAdded = segEnds[1]; - } else { - fPolyDesc[currInd++] = segEnds[0]; - lastAdded = segEnds[0]; - } - ++fPolyDesc[sizeInd]; - } - j += segmentCol + 2; - } - - CalculateNormals(); -} - - -//______________________________________________________________________________ -void GLFaceSet::GLDraw()const -{ - // - static float spec[] = {.4f, .4f, .4f, 1.f}; - - glMaterialfv(GL_FRONT, GL_DIFFUSE, fColor); - glMaterialfv(GL_FRONT, GL_SPECULAR, spec); - glMaterialf(GL_FRONT, GL_SHININESS, 20); - - if (IsTransparent()) { - glEnable(GL_BLEND); - glDepthMask(GL_FALSE); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - } - - glLoadName(GetGLName()); - - GLDrawPolys(); - - if (IsTransparent()) { - glDepthMask(GL_TRUE); - glDisable(GL_BLEND); - } -} - - -//______________________________________________________________________________ -void GLFaceSet::GLDrawPolys()const -{ - // - GLUtriangulatorObj *tessObj = getTesselator(); - const Double_t *pnts = &fVertices[0]; - const Double_t *normals = &fNormals[0]; - const Int_t *pols = &fPolyDesc[0]; - - for (UInt_t i = 0, j = 0; i < fNbPols; ++i) { - Int_t npoints = pols[j++]; - - if (tessObj && npoints > 4) { - gluBeginPolygon(tessObj); - gluNextContour(tessObj, (GLenum)GLU_UNKNOWN); - glNormal3dv(normals + i * 3); - - for (Int_t k = 0; k < npoints; ++k, ++j) { - gluTessVertex(tessObj, (Double_t *)pnts + pols[j] * 3, (Double_t *)pnts + pols[j] * 3); - } - gluEndPolygon(tessObj); - } else { - glBegin(GL_POLYGON); - glNormal3dv(normals + i * 3); - - for (Int_t k = 0; k < npoints; ++k, ++j) { - glVertex3dv(pnts + pols[j] * 3); - } - glEnd(); - } - } -} - - -//______________________________________________________________________________ -Int_t GLFaceSet::CheckPoints(const Int_t *source, Int_t *dest) const -{ - // - const Double_t * p1 = &fVertices[source[0] * 3]; - const Double_t * p2 = &fVertices[source[1] * 3]; - const Double_t * p3 = &fVertices[source[2] * 3]; - Int_t retVal = 1; - - if (Eq(p1, p2)) { - dest[0] = source[0]; - if (!Eq(p1, p3) ) { - dest[1] = source[2]; - retVal = 2; - } - } else if (Eq(p1, p3)) { - dest[0] = source[0]; - dest[1] = source[1]; - retVal = 2; - } else { - dest[0] = source[0]; - dest[1] = source[1]; - retVal = 2; - if (!Eq(p2, p3)) { - dest[2] = source[2]; - retVal = 3; - } - } - - return retVal; -} - - -//______________________________________________________________________________ -Bool_t GLFaceSet::Eq(const Double_t *p1, const Double_t *p2) -{ - // - Double_t dx = TMath::Abs(p1[0] - p2[0]); - Double_t dy = TMath::Abs(p1[1] - p2[1]); - Double_t dz = TMath::Abs(p1[2] - p2[2]); - return dx < 1e-10 && dy < 1e-10 && dz < 1e-10; -} - - -//______________________________________________________________________________ -void GLFaceSet::CalculateNormals() -{ - // - Double_t *pnts = &fVertices[0]; - for (UInt_t i = 0, j = 0; i < fNbPols; ++i) { - Int_t polEnd = fPolyDesc[j] + j + 1; - Int_t norm[] = {fPolyDesc[j + 1], fPolyDesc[j + 2], fPolyDesc[j + 3]}; - j += 4; - Int_t check = CheckPoints(norm, norm), ngood = check; - if (check == 3) { - TMath::Normal2Plane(pnts + norm[0] * 3, pnts + norm[1] * 3, - pnts + norm[2] * 3, &fNormals[i * 3]); - j = polEnd; - continue; - } - while (j < (UInt_t)polEnd) { - norm[ngood++] = fPolyDesc[j++]; - if (ngood == 3) { - ngood = CheckPoints(norm, norm); - if (ngood == 3) { - TMath::Normal2Plane(pnts + norm[0] * 3, pnts + norm[1] * 3, - pnts + norm[2] * 3, &fNormals[i * 3]); - j = polEnd; - break; - } - } - } - } -} - -class GLCamera : public TObject{ -protected: - const Double_t *fViewVolume; - const Int_t *fViewPort; - Double_t fZoom; - Bool_t fDrawFrame; - -public: - GLCamera(const Double_t *viewvolume, const Int_t *viewport); - const Int_t *GetViewport()const - { - return fViewPort; - } - virtual void TurnOn()const = 0; - virtual void TurnOn(Int_t x, Int_t y)const = 0; - void Zoom(Double_t zoom) - { - fZoom = zoom; - } - void Select() - { - fDrawFrame = kTRUE; - } -private: - GLCamera(const GLCamera &); - GLCamera & operator = (const GLCamera &); -}; - -class GLTransformation { -public: - virtual ~GLTransformation(); - virtual void Apply()const = 0; -}; - - -class GLSimpleTransform : public GLTransformation { -private: - const Double_t *fRotMatrix; - Double_t fShift; - //modifications - const Double_t *fX; - const Double_t *fY; - const Double_t *fZ; -public: - GLSimpleTransform(const Double_t *rm, Double_t s, const Double_t *x, - const Double_t *y, const Double_t *z); - void Apply()const; -}; - -class GLPerspectiveCamera : public GLCamera { -private: - GLSimpleTransform fTransformation; -public: - GLPerspectiveCamera(const Double_t *vv, const Int_t *vp, - const GLSimpleTransform &tr); - void TurnOn()const; - void TurnOn(Int_t x, Int_t y)const; -}; - -GLCamera::GLCamera(const Double_t *vv, const Int_t *vp) - :fViewVolume(vv), fViewPort(vp), - fZoom(1.), fDrawFrame(kFALSE) -{ - // -} - -GLTransformation::~GLTransformation() -{ - // -} - -GLSimpleTransform::GLSimpleTransform(const Double_t *rm, Double_t s, const Double_t *x, - const Double_t *y, const Double_t *z) - :fRotMatrix(rm), fShift(s), - fX(x), fY(y), fZ(z) -{ - // -} - -void GLSimpleTransform::Apply()const -{ - // - glTranslated(0., 0., -fShift); - glMultMatrixd(fRotMatrix); - glRotated(-90., 1., 0., 0.); - glTranslated(-*fX, -*fY, -*fZ); -} - -GLPerspectiveCamera::GLPerspectiveCamera(const Double_t *vv, const Int_t *vp, - const GLSimpleTransform &tr) - :GLCamera(vv, vp), - fTransformation(tr) -{ - // -} - -void GLPerspectiveCamera::TurnOn()const -{ - // - glViewport(fViewPort[0], fViewPort[1], fViewPort[2], fViewPort[3]); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - Double_t frx = fViewVolume[0] * fZoom; - Double_t fry = fViewVolume[1] * fZoom; - - glFrustum(-frx, frx, -fry, fry, fViewVolume[2], fViewVolume[3]); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - fTransformation.Apply(); -} - -void GLPerspectiveCamera::TurnOn(Int_t x, Int_t y)const -{ - // - gluPickMatrix(x, fViewPort[3] - y, 1., 1., (Int_t *)fViewPort); - Double_t frx = fViewVolume[0] * fZoom; - Double_t fry = fViewVolume[1] * fZoom; - - glFrustum(-frx, frx, -fry, fry, fViewVolume[2], fViewVolume[3]); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - fTransformation.Apply(); -} - - -class TGLRender { - friend class TGLPixmap; -private: - TObjArray fGLObjects; - TObjArray fGLCameras; - - Bool_t fGLInit; - Bool_t fAllActive; - Int_t fActiveCam; - - GLSceneObject *fFirstT; - GLSceneObject *fSelectedObj; - -public: - TGLRender(); - virtual ~TGLRender(); - void Traverse(); - void SetAllActive(){fAllActive = kTRUE;} - void SetActive(UInt_t cam); - void AddNewObject(GLSceneObject *newObject); - void RemoveAllObjects(); - void AddNewCamera(GLCamera *newCamera); - GLSceneObject *SelectObject(Int_t x, Int_t y, Int_t); - - Int_t GetSize()const{return fGLObjects.GetEntriesFast();} - -private: - void DrawScene(); - void DrawAxes(); - - void Init(); -}; - - -//______________________________________________________________________________ -TGLRender::TGLRender() -{ - // - fGLObjects.SetOwner(kTRUE); - fGLCameras.SetOwner(kTRUE); - - fGLInit = kFALSE; - fAllActive = kTRUE; - fActiveCam = 0; - fFirstT = 0; - fSelectedObj = 0; -} - - -//______________________________________________________________________________ -TGLRender::~TGLRender() -{ - // -} - - -//______________________________________________________________________________ -void TGLRender::Traverse() -{ - // - if (!fGLInit) { - fGLInit = kTRUE; - Init(); - } - - Int_t start = 0, end = fGLCameras.GetEntriesFast(); - - if (end == 0) { - return; - } - - if (!fAllActive) { - start = fActiveCam; - end = start + 1; - } - - for (; start < end; ++start) { - GLCamera *currCam = (GLCamera *)fGLCameras.At(start); - currCam->TurnOn(); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - DrawScene(); - } -} - - -//______________________________________________________________________________ -void TGLRender::SetActive(UInt_t ncam) -{ - // - fActiveCam = ncam; - fAllActive = kFALSE; -} - - -//______________________________________________________________________________ -void TGLRender::AddNewObject(GLSceneObject *newobject) -{ - // - fGLObjects.AddLast(newobject); -} - - -//______________________________________________________________________________ -void TGLRender::RemoveAllObjects() -{ - // - fGLObjects.Delete(); - fSelectedObj = 0; - assert(fGLObjects.GetEntriesFast() == 0); -} - - -//______________________________________________________________________________ -void TGLRender::AddNewCamera(GLCamera *newcamera) -{ - // - fGLCameras.AddLast(newcamera); -} - - -//______________________________________________________________________________ -GLSceneObject *TGLRender::SelectObject(Int_t x, Int_t y, Int_t cam) -{ - // - GLCamera *actCam = (GLCamera *)fGLCameras.At(cam); - std::vector<UInt_t>selectBuff(fGLObjects.GetEntriesFast() * 4); - std::vector<std::pair<UInt_t, Int_t> >objNames; - - glSelectBuffer(selectBuff.size(), &selectBuff[0]); - glRenderMode(GL_SELECT); - glInitNames(); - glPushName(0); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - actCam->TurnOn(x, y); - - DrawScene(); - //glFlush(); - - Int_t hits = glRenderMode(GL_RENDER); - - if (hits < 0) { - Error("TGLRender::SelectObject", "selection buffer overflow"); - } else if (hits > 0) { - objNames.resize(hits); - for (Int_t i = 0; i < hits; ++i) { - //object's "depth" - objNames[i].first = selectBuff[i * 4 + 1]; - //object's name - objNames[i].second = selectBuff[i * 4 + 3]; - } - std::sort(objNames.begin(), objNames.end()); - UInt_t chosen = 0; - GLSceneObject *hitObject = 0; - for (Int_t j = 0; j < hits; ++j) { - chosen = objNames[j].second; - hitObject = (GLSceneObject *)fGLObjects.At(chosen); - if (!hitObject->IsTransparent()) - break; - } - if (hitObject->IsTransparent()) { - chosen = objNames[0].second; - hitObject = (GLSceneObject *)fGLObjects.At(chosen); - } - if (hitObject != fSelectedObj) { - if (fSelectedObj) fSelectedObj->Select(kFALSE); - fSelectedObj = hitObject; - fSelectedObj->Select(); - } - } else if (fSelectedObj) { - fSelectedObj->Select(kFALSE); - fSelectedObj = 0; - } - - return fSelectedObj; -} - - -//______________________________________________________________________________ -void TGLRender::Init() -{ - // - glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); - Float_t lmodelAmb[] = {0.5f, 0.5f, 1.f, 1.f}; - glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodelAmb); - glEnable(GL_LIGHTING); - glEnable(GL_DEPTH_TEST); - glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); - glClearDepth(1.); -} - - -//______________________________________________________________________________ -void TGLRender::DrawScene() -{ - // - for (Int_t i = 0, e = fGLObjects.GetEntriesFast(); i < e; ++i) { - GLSceneObject *currObj = (GLSceneObject *)fGLObjects.At(i); - if (currObj->IsTransparent()) { - currObj->SetNextT(fFirstT); - fFirstT = currObj; - } else { - currObj->GLDraw(); - } - } - - while (fFirstT) { - fFirstT->GLDraw(); - fFirstT = fFirstT->GetNextT(); - } -} - - -//______________________________________________________________________________ -TGLPixmap::TGLPixmap(TVirtualPad *pad) - : fCamera(), fViewVolume(), fZoom(), - fActiveViewport(), fArcBall(100, 100), fBuildingScene(kFALSE), - fPad(pad), fFirstScene(kTRUE) -{ - // - fGLDevice = pad->GetGLDevice(); - - if (fGLDevice == -1) return; - - fLightMask = 0x1b; - fXc = fYc = fZc = fRad = 0.; - fPressed = kFALSE; - fNbShapes = 0; - fSelectedObj = 0; - fAction = kNoAction; - - CreateViewer(); - CalculateViewports(); - fArcBall.SetBounds(fActiveViewport[2], fActiveViewport[3]); -} - - -//______________________________________________________________________________ -void TGLPixmap::CreateViewer() -{ - // - fZoom[0] = fZoom[1] = fZoom[2] = fZoom[3] = 1.; - fRender = new TGLRender; -} - - -//______________________________________________________________________________ -TGLPixmap::~TGLPixmap() -{ - // - delete fRender; -} - -//______________________________________________________________________________ -void TGLPixmap::DrawObjects()const -{ - // - if (!MakeCurrent())return; - - const_cast<TGLPixmap *>(this)->CalculateViewports(); - //new MVGL!!! - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - Float_t pos1[] = {0., fRad + fYc, -fRad - fZc, 1.f}; - Float_t pos2[] = {fRad + fXc, 0.f, -fRad - fZc, 1.f}; - Float_t pos3[] = {0.f, -fRad - fYc, -fRad - fZc, 1.f}; - Float_t pos4[] = {-fRad - fXc, 0.f, -fRad - fZc, 1.f}; - Float_t pos5[] = {0.f, 0.f, 0.f, 1.f}; - - Float_t whiteCol[] = {.7f, .7f, .7f, 1.f}; - glLightfv(GL_LIGHT4, GL_POSITION, pos1); - glLightfv(GL_LIGHT4, GL_DIFFUSE, whiteCol); - glLightfv(GL_LIGHT1, GL_POSITION, pos2); - glLightfv(GL_LIGHT1, GL_DIFFUSE, whiteCol); - glLightfv(GL_LIGHT2, GL_POSITION, pos3); - glLightfv(GL_LIGHT2, GL_DIFFUSE, whiteCol); - glLightfv(GL_LIGHT3, GL_POSITION, pos4); - glLightfv(GL_LIGHT3, GL_DIFFUSE, whiteCol); - glLightfv(GL_LIGHT0, GL_POSITION, pos5); - glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteCol); - - glEnable(GL_LIGHT4); - glEnable(GL_LIGHT1); - glEnable(GL_LIGHT2); - glEnable(GL_LIGHT3); - glEnable(GL_LIGHT0); - - fRender->Traverse(); - - glFlush(); - gGLManager->ReadGLBuffer(fGLDevice); - gGLManager->Flush(fGLDevice); -} - - -//______________________________________________________________________________ -void TGLPixmap::UpdateRange(const GLSelection *box) -{ - // - const Double_t *x = box->GetRangeX(); - const Double_t *y = box->GetRangeY(); - const Double_t *z = box->GetRangeZ(); - - if (!fRender->GetSize()) { - fRangeX.first = x[0], fRangeX.second = x[1]; - fRangeY.first = y[0], fRangeY.second = y[1]; - fRangeZ.first = z[0], fRangeZ.second = z[1]; - return; - } - - if (fRangeX.first > x[0]) - fRangeX.first = x[0]; - if (fRangeX.second < x[1]) - fRangeX.second = x[1]; - if (fRangeY.first > y[0]) - fRangeY.first = y[0]; - if (fRangeY.second < y[1]) - fRangeY.second = y[1]; - if (fRangeZ.first > z[0]) - fRangeZ.first = z[0]; - if (fRangeZ.second < z[1]) - fRangeZ.second = z[1]; -} - - -//______________________________________________________________________________ -void TGLPixmap::PrintObjects() -{ - // Print objects in a PS file. This function use gl2ps. The gl2ps output - // is embeded within the TPostScript one. - if (!MakeCurrent())return; - - const_cast<TGLPixmap *>(this)->CalculateViewports(); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - Float_t pos1[] = {0., fRad + fYc, -fRad - fZc, 1.f}; - Float_t pos2[] = {fRad + fXc, 0.f, -fRad - fZc, 1.f}; - Float_t pos3[] = {0.f, -fRad - fYc, -fRad - fZc, 1.f}; - Float_t pos4[] = {-fRad - fXc, 0.f, -fRad - fZc, 1.f}; - Float_t pos5[] = {0.f, 0.f, 0.f, 1.f}; - - Float_t whiteCol[] = {.7f, .7f, .7f, 1.f}; - glLightfv(GL_LIGHT4, GL_POSITION, pos1); - glLightfv(GL_LIGHT4, GL_DIFFUSE, whiteCol); - glLightfv(GL_LIGHT1, GL_POSITION, pos2); - glLightfv(GL_LIGHT1, GL_DIFFUSE, whiteCol); - glLightfv(GL_LIGHT2, GL_POSITION, pos3); - glLightfv(GL_LIGHT2, GL_DIFFUSE, whiteCol); - glLightfv(GL_LIGHT3, GL_POSITION, pos4); - glLightfv(GL_LIGHT3, GL_DIFFUSE, whiteCol); - glLightfv(GL_LIGHT0, GL_POSITION, pos5); - glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteCol); - - glEnable(GL_LIGHT4); - glEnable(GL_LIGHT1); - glEnable(GL_LIGHT2); - glEnable(GL_LIGHT3); - glEnable(GL_LIGHT0); - - // Tanslate and scale the PS generated by gl2ps - gVirtualPS->PrintStr("@"); - gVirtualPS->PrintStr("% Start gl2ps EPS@"); - gVirtualPS->PrintStr("newpath gsave save@"); - Double_t xx[2], yy[2]; - xx[0] = gPad->GetUxmin(); - yy[0] = gPad->GetUymin(); - xx[1] = gPad->GetUxmax(); - yy[1] = gPad->GetUymax(); - gVirtualPS->PrintStr("@"); - gVirtualPS->DrawPS(0, xx, yy); - gVirtualPS->WriteInteger(4*gPad->GetBorderSize()); - gVirtualPS->PrintStr(" add exch"); - gVirtualPS->WriteInteger(4*gPad->GetBorderSize()); - gVirtualPS->PrintStr(" add exch translate"); - gVirtualPS->PrintStr("@"); - GLint vp[4]; - glGetIntegerv(GL_VIEWPORT,vp); - gVirtualPS->DrawPS(0, xx, yy); - gVirtualPS->PrintStr(" exch"); - xx[0] = xx[1]; - yy[0] = yy[1]; - gVirtualPS->DrawPS(0, xx, yy); - gVirtualPS->PrintStr(" 4 1 roll exch sub 3 1 roll sub"); - gVirtualPS->WriteInteger(2*4*gPad->GetBorderSize()); - gVirtualPS->PrintStr(" sub exch"); - gVirtualPS->WriteInteger(2*4*gPad->GetBorderSize()); - gVirtualPS->PrintStr(" sub exch"); - gVirtualPS->WriteInteger((Int_t)(vp[3])); - gVirtualPS->WriteInteger((Int_t)(vp[2])); - gVirtualPS->PrintStr(" 4 1 roll div 3 1 roll exch div exch scale@"); - gVirtualPS->PrintStr("@"); - gVirtualPS->PrintStr("countdictstack@"); - gVirtualPS->PrintStr("mark@"); - gVirtualPS->PrintStr("/showpage {} def@"); - - // Close the gVirtualPS output stream - ofstream *fs = (ofstream*)gVirtualPS->GetStream(); - fs->close(); - - // Generate GL view - FILE *output = fopen (gVirtualPS->GetName(), "a"); - Int_t gl2psFormat; - Int_t gl2psSort; - gl2psFormat = GL2PS_EPS; - gl2psSort = GL2PS_BSP_SORT; - Int_t buffsize = 0, state = GL2PS_OVERFLOW; - - while (state == GL2PS_OVERFLOW) { - buffsize += 1024*1024; - gl2psBeginPage ("ROOT Scene Graph", "ROOT", NULL, - gl2psFormat, gl2psSort, GL2PS_USE_CURRENT_VIEWPORT - | GL2PS_POLYGON_OFFSET_FILL | GL2PS_SILENT - | GL2PS_BEST_ROOT | GL2PS_OCCLUSION_CULL - | 0, - GL_RGBA, 0, NULL,0, 0, 0, - buffsize, output, NULL); - fRender->Traverse(); - state = gl2psEndPage(); - } - - fclose (output); - - // Restore the gVirtualPS output stream - fs = new ofstream(gVirtualPS->GetName(),ios::app); - gVirtualPS->SetStream(fs); - gVirtualPS->PrintStr("@"); - gVirtualPS->PrintStr("cleartomark@"); - gVirtualPS->PrintStr("countdictstack exch sub { end } repeat@"); - gVirtualPS->PrintStr("restore grestore@"); - gVirtualPS->PrintStr("% End gl2ps EPS@"); - - glFlush(); -} - -//______________________________________________________________________________ -Bool_t TGLPixmap::MakeCurrent()const -{ - // - return fGLDevice != -1 && gGLManager->MakeCurrent(fGLDevice); -} - -//______________________________________________________________________________ -TObject *TGLPixmap::SelectObject(Int_t x, Int_t y) -{ - // Select Object - if (!MakeCurrent())return 0; - CalculateViewvolumes(); - - Int_t tmpVal = fActiveViewport[1]; - fActiveViewport[1] = 0; - GLSceneObject *obj = fRender->SelectObject(x, y, 0); - fActiveViewport[1] = tmpVal; - - if (obj) { - return obj->GetRealObject(); - } - - return 0; -} - - -//______________________________________________________________________________ -Int_t TGLPixmap::DistancetoPrimitive(Int_t x, Int_t y) -{ - // Compute the disatance to the primitive - - TObject *selection = gGLManager->Select(this, x, y); - if(selection) gPad->SetSelected(selection); - else gPad->SetSelected(this); - - return 0; -} - - -//______________________________________________________________________________ -void TGLPixmap::CalculateViewports() -{ - // - gGLManager->ExtractViewport(fGLDevice, fActiveViewport); -} - - -//______________________________________________________________________________ -void TGLPixmap::CalculateViewvolumes() -{ - // - CalculateViewports(); - - if (fRender->GetSize()) { - Double_t xdiff = fRangeX.second - fRangeX.first; - Double_t ydiff = fRangeY.second - fRangeY.first; - Double_t zdiff = fRangeZ.second - fRangeZ.first; - Double_t max = xdiff > ydiff ? xdiff > zdiff ? xdiff : zdiff : ydiff > zdiff ? ydiff : zdiff; - - Double_t frx = 1., fry = 1.; - - if (fActiveViewport[2] > fActiveViewport[3]) - frx = fActiveViewport[2] / double(fActiveViewport[3]); - else if (fActiveViewport[2] < fActiveViewport[3]) - fry = fActiveViewport[3] / double(fActiveViewport[2]); - - fViewVolume[0] = max / 1.9 * frx; - fViewVolume[1] = max / 1.9 * fry; - fViewVolume[2] = max * 0.707; - fViewVolume[3] = 3 * max; - fRad = max * 1.7; - } -} - - -//______________________________________________________________________________ -void TGLPixmap::CreateCameras() -{ - // - if (!fRender->GetSize()) - return; - - GLSimpleTransform trPersp(fArcBall.GetRotMatrix(), fRad, &fXc, &fYc, &fZc); - - fCamera = new GLPerspectiveCamera(fViewVolume, fActiveViewport, trPersp); - - fRender->AddNewCamera(fCamera); -} - - -//______________________________________________________________________________ -Bool_t TGLPixmap::PreferLocalFrame() const -{ - // Not at present - but in the future.... - return kFALSE; -} - -void TGLPixmap::BeginScene() -{ - // Clear any existing scene contents - fRender->RemoveAllObjects(); - fNbShapes = 0; - fBuildingScene = kTRUE; -} - - -//______________________________________________________________________________ -void TGLPixmap::EndScene() -{ - // - CalculateViewvolumes(); - - if (fFirstScene) { - // Calculate light sources positions - Double_t xdiff = fRangeX.second - fRangeX.first; - Double_t ydiff = fRangeY.second - fRangeY.first; - Double_t zdiff = fRangeZ.second - fRangeZ.first; - - fXc = fRangeX.first + xdiff / 2; - fYc = fRangeY.first + ydiff / 2; - fZc = fRangeZ.first + zdiff / 2; - - CreateCameras(); - fFirstScene = kFALSE; - } - - fBuildingScene = kFALSE; - gGLManager->DrawViewer(this); -} - -Int_t TGLPixmap::AddObject(const TBuffer3D &buffer, Bool_t *addChildren) -{ - // - if (addChildren) { - *addChildren = kTRUE; - } - - UInt_t reqSections = TBuffer3D::kCore|TBuffer3D::kRawSizes|TBuffer3D::kRaw; - - if (!buffer.SectionsValid(reqSections)) { - return reqSections; - } - - Float_t rgba[] = {.4f, .4f, .4f, 1.f}; - TColor *c = gROOT->GetColor(buffer.fColor); - - if (c && buffer.fColor > 1) { - c->GetRGB(rgba[0], rgba[1], rgba[2]); - } - - - GLFaceSet *newPix = new GLFaceSet(buffer, rgba, fNbShapes ++, buffer.fID); - fRender->AddNewObject(newPix); - UpdateRange(newPix->GetBBox()); - - return TBuffer3D::kNone; -} - -Bool_t TGLPixmap::OpenComposite(const TBuffer3D &, Bool_t *) -{ - // - return kFALSE; -} - -void TGLPixmap::CloseComposite() -{ - // -} - -void TGLPixmap::AddCompositeOp(UInt_t) -{ - // -} - -void TGLPixmap::ExecuteEvent(Int_t event, Int_t px, Int_t py) -{ - // - py -= Int_t((1 - fPad->GetHNDC() - fPad->GetYlowNDC()) * fPad->GetWh()); - px -= Int_t(fPad->GetXlowNDC() * fPad->GetWw()); - switch(event) { - case kButton1Down: - //fix arc ball first - CalculateViewports(); - fArcBall.SetBounds(fActiveViewport[2], fActiveViewport[3]); - fArcBall.Click(TPoint(px, py)); - gGLManager->MarkForDirectCopy(fGLDevice, kTRUE); - break; - case kButton1Up: - gGLManager->MarkForDirectCopy(fGLDevice, kFALSE); - break; - case kButton1Motion: - fArcBall.Drag(TPoint(px, py)); - gGLManager->DrawViewer(this); - break; - case kMouseMotion: - gPad->SetCursor(kRotate); - break; - case kKeyPress: - if (py == kKey_J || py == kKey_j) { - gGLManager->MarkForDirectCopy(fGLDevice, kTRUE); - fZoom[0] /= 1.2; - fCamera->Zoom(fZoom[0]); - gGLManager->DrawViewer(this); - gGLManager->MarkForDirectCopy(fGLDevice, kFALSE); - } else if (py == kKey_K || py == kKey_k) { - gGLManager->MarkForDirectCopy(fGLDevice, kTRUE); - fZoom[0] *= 1.2; - fCamera->Zoom(fZoom[0]); - gGLManager->DrawViewer(this); - gGLManager->MarkForDirectCopy(fGLDevice, kFALSE); - } - - } -} - -void TGLPixmap::DrawViewer() -{ - // - if (!MakeCurrent())return; - fRender->Init(); - - Color_t backColor = fPad->GetFillColor(); - Float_t rgb[] = {1.f, 1.f, 1.f};//white will be default - TColor *c = gROOT->GetColor(backColor); - - if (c) - c->GetRGB(rgb[0], rgb[1], rgb[2]); - - glClearColor(rgb[0], rgb[1], rgb[2], 1.f); - - DrawObjects(); -} - -void TGLPixmap::ZoomIn() -{ - // - fZoom[0] /= 2; - fCamera->Zoom(fZoom[0]); -} - -void TGLPixmap::ZoomOut() -{ - // - fZoom[0] *= 2; - fCamera->Zoom(fZoom[0]); -} diff --git a/gl/src/TGLViewer.cxx b/gl/src/TGLViewer.cxx index 46454765d4e..75ec508f15a 100644 --- a/gl/src/TGLViewer.cxx +++ b/gl/src/TGLViewer.cxx @@ -1,4 +1,4 @@ -// @(#)root/gl:$Name: $:$Id: TGLViewer.cxx,v 1.38 2006/02/20 11:02:19 brun Exp $ +// @(#)root/gl:$Name: $:$Id: TGLViewer.cxx,v 1.39 2006/02/23 16:44:52 brun Exp $ // Author: Richard Maunder 25/05/2005 /************************************************************************* @@ -27,6 +27,7 @@ #include "TGLSphere.h" #include "TVirtualPad.h" // Remove when pad removed - use signal +#include "TVirtualX.h" #include "TColor.h" #include "TError.h" @@ -100,7 +101,8 @@ TGLViewer::TGLViewer(TVirtualPad * pad, Int_t x, Int_t y, fAcceptedPhysicals(0), fRejectedPhysicals(0), fIsPrinting(kFALSE), - fGLWindow(0) + fGLWindow(0), + fGLDevice(-1) { // Construct the viewer object, with following arguments: // 'pad' - external pad viewer is bound to @@ -111,6 +113,55 @@ TGLViewer::TGLViewer(TVirtualPad * pad, Int_t x, Int_t y, SetViewport(x, y, width, height); } +//______________________________________________________________________________ +TGLViewer::TGLViewer(TVirtualPad * pad) : + fPad(pad), + fContextMenu(0), + fPerspectiveCameraXOZ(TGLVector3(1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)), // XOZ floor + fPerspectiveCameraYOZ(TGLVector3(0.0, 1.0, 0.0), TGLVector3(1.0, 0.0, 0.0)), // YOZ floor + fPerspectiveCameraXOY(TGLVector3(1.0, 0.0, 0.0), TGLVector3(0.0, 0.0,-1.0)), // XOY floor + fOrthoXOYCamera(TGLOrthoCamera::kXOY), + fOrthoXOZCamera(TGLOrthoCamera::kXOZ), + fOrthoZOYCamera(TGLOrthoCamera::kZOY), + fCurrentCamera(&fPerspectiveCameraXOZ), + fInternalRebuild(kFALSE), + fPostSceneBuildSetup(kTRUE), + fAcceptedAllPhysicals(kTRUE), + fForceAcceptAll(kFALSE), + fInternalPIDs(kFALSE), + fNextInternalPID(1), // 0 reserved + fComposite(0), fCSLevel(0), + fAction(kCameraNone), fLastPos(0,0), fActiveButtonID(0), + fDrawFlags(TGLDrawFlags::kFill, TGLDrawFlags::kLODHigh), + fRedrawTimer(0), + fLightState(kLightMask), // All on + fAxesType(kAxesNone), + fReferenceOn(kFALSE), + fReferencePos(0.0, 0.0, 0.0), + fInitGL(kFALSE), + fDebugMode(kFALSE), + fAcceptedPhysicals(0), + fRejectedPhysicals(0), + fIsPrinting(kFALSE), + fGLWindow(0), + fGLDevice(fPad->GetGLDevice()) +{ + //gl-embedded viewer's ctor + // Construct the viewer object, with following arguments: + // 'pad' - external pad viewer is bound to + // 'x', 'y' - initial top left position + // 'width', 'height' - initial width/height + // Create timer + fRedrawTimer = new TGLRedrawTimer(*this); + if (fGLDevice != -1) { + Int_t viewport[4] = {0}; + gGLManager->ExtractViewport(fGLDevice, viewport); + SetViewport(viewport[0], viewport[1], viewport[2], viewport[3]); + } + else + Error("TGLViewer", "VAH!!! Dermo kakoe!!!\n"); +} + //______________________________________________________________________________ TGLViewer::~TGLViewer() { @@ -745,7 +796,7 @@ void TGLViewer::InitGL() glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); - glClearColor(0.0, 0.0, 0.0, 0.0); + glClearColor(0.f, 0.f, 0.f, 1.f); glClearDepth(1.0); glMaterialf(GL_BACK, GL_SHININESS, 0.0); glPolygonMode(GL_FRONT, GL_FILL); @@ -894,10 +945,11 @@ void TGLViewer::RequestDraw(Short_t LOD) // Post request for redraw of viewer at level of detail 'LOD' // Request is directed via cross thread gVirtualGL object fRedrawTimer->Stop(); +// std::cout<<"Draw requested\n"; // Ignore request if GL window or context not yet availible - we // will get redraw later - if (!fGLWindow || !gVirtualGL) { + if ((!fGLWindow || !gVirtualGL) && fGLDevice == -1) { return; } @@ -912,7 +964,10 @@ void TGLViewer::RequestDraw(Short_t LOD) return; } fDrawFlags.SetLOD(LOD); - gVirtualGL->DrawViewer(this); + if (fGLDevice == -1) + gVirtualGL->DrawViewer(this); + else + gGLManager->DrawViewer(this); } //______________________________________________________________________________ @@ -931,6 +986,12 @@ void TGLViewer::DoDraw() } fRedrawTimer->Stop(); + + if (fGLDevice != -1) { + Int_t viewport[4] = {}; + gGLManager->ExtractViewport(fGLDevice, viewport); + SetViewport(viewport[0], viewport[1], viewport[2], viewport[3]); + } TGLStopwatch timer; if (gDebug>2) { @@ -1025,6 +1086,18 @@ void TGLViewer::PreDraw() } MakeCurrent(); + + if (fGLDevice != -1) { + //Clear color must be canvas's background color + Color_t ci = gPad->GetFillColor(); + TColor *color = gROOT->GetColor(ci); + Float_t sc[3] = {1.f, 1.f, 1.f}; + + if (color) + color->GetRGB(sc[0], sc[1], sc[2]); + + glClearColor(sc[0], sc[1], sc[2], 1.); + } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -1035,10 +1108,11 @@ void TGLViewer::PreDraw() void TGLViewer::PostDraw() { // Perform GL work which must be done after each draw of scene + glFlush(); SwapBuffers(); // Flush everything in case picking starts - glFlush(); +// glFlush(); TGLUtil::CheckError("TGLViewer::PostDraw"); } @@ -1047,7 +1121,9 @@ void TGLViewer::PostDraw() void TGLViewer::MakeCurrent() const { // Make GL context current - fGLWindow->MakeCurrent(); + if (fGLDevice == -1) + fGLWindow->MakeCurrent(); + else gGLManager->MakeCurrent(fGLDevice); // Don't call TGLUtil::CheckError() as we do not // have to be in GL thread here - GL window will call @@ -1063,7 +1139,13 @@ void TGLViewer::SwapBuffers() const fScene.CurrentLock() != TGLScene::kSelectLock) { Error("TGLViewer::SwapBuffers", "scene is %s", TGLScene::LockName(fScene.CurrentLock())); } - fGLWindow->SwapBuffers(); + if (fGLDevice == -1) + fGLWindow->SwapBuffers(); + else { + gGLManager->ReadGLBuffer(fGLDevice); + gGLManager->Flush(fGLDevice); + gGLManager->MarkForDirectCopy(fGLDevice, kFALSE); + } } //______________________________________________________________________________ @@ -1083,7 +1165,10 @@ void TGLViewer::RequestSelect(UInt_t x, UInt_t y) // TODO: Check only the GUI thread ever enters here & DoSelect. // Then TVirtualGL and TGLKernel can be obsoleted. TGLRect selectRect(x, y, 3, 3); // TODO: Constant somewhere - gVirtualGL->SelectViewer(this, &selectRect); + if (fGLDevice == -1) + gVirtualGL->SelectViewer(this, &selectRect); + else + gGLManager->SelectViewer(this, &selectRect); } //______________________________________________________________________________ @@ -1133,7 +1218,7 @@ void TGLViewer::SetViewport(Int_t x, Int_t y, UInt_t width, UInt_t height) { // Set viewer viewport (window area) with bottom/left at (x,y), with // dimensions 'width'/'height' - if (fScene.IsLocked()) { + if (fScene.IsLocked() && fGLDevice == -1) { Error("TGLViewer::SetViewport", "expected kUnlocked, found %s", TGLScene::LockName(fScene.CurrentLock())); return; } @@ -1315,6 +1400,9 @@ void TGLViewer::ToggleLight(ELight light) } fLightState ^= light; + if (fGLDevice != -1) + gGLManager->MarkForDirectCopy(fGLDevice, kTRUE); + RequestDraw(); } @@ -1356,6 +1444,8 @@ void TGLViewer::SetGuideState(EAxesType axesType, Bool_t referenceOn, const Doub fAxesType = axesType; fReferenceOn = referenceOn; fReferencePos.Set(referencePos[0], referencePos[1], referencePos[2]); + if (fGLDevice != -1) + gGLManager->MarkForDirectCopy(fGLDevice, kTRUE); RequestDraw(); } @@ -1462,27 +1552,42 @@ void TGLViewer::ExecuteEvent(Int_t event, Int_t px, Int_t py) eventSt.fY = py; switch (event) { + case kMouseMotion: + eventSt.fCode = kMouseMotion; + eventSt.fType = kMotionNotify; + HandleMotion(&eventSt); + break; case kButton1Down: case kButton1Up: { eventSt.fCode = kButton1; - eventSt.fType = kButton1Down ? kButtonPress:kButtonRelease; + eventSt.fType = event == kButton1Down ? kButtonPress:kButtonRelease; HandleButton(&eventSt); } + break; case kButton2Down: case kButton2Up: { eventSt.fCode = kButton2; - eventSt.fType = kButton2Down ? kButtonPress:kButtonRelease; + eventSt.fType = event == kButton2Down ? kButtonPress:kButtonRelease; HandleButton(&eventSt); } + break; case kButton3Down: + { + eventSt.fState = kKeyShiftMask; + eventSt.fCode = kButton1; + eventSt.fType = kButtonPress; + HandleButton(&eventSt); + } + break; case kButton3Up: { eventSt.fCode = kButton3; - eventSt.fType = kButton3Down ? kButtonPress:kButtonRelease; + eventSt.fType = kButtonRelease;//event == kButton3Down ? kButtonPress:kButtonRelease; HandleButton(&eventSt); } + break; case kButton1Double: case kButton2Double: case kButton3Double: @@ -1491,26 +1596,54 @@ void TGLViewer::ExecuteEvent(Int_t event, Int_t px, Int_t py) eventSt.fType = kButtonDoubleClick; HandleDoubleClick(&eventSt); } + break; case kButton1Motion: case kButton2Motion: case kButton3Motion: { - eventSt.fCode = kButton1Motion ? kButton1 : kButton2Motion ? kButton2 : kButton3; + eventSt.fCode = event == kButton1Motion ? kButton1 : event == kButton2Motion ? kButton2 : kButton3; eventSt.fType = kMotionNotify; HandleMotion(&eventSt); } + break; case kKeyPress: // We only care about full key 'presses' not individual down/up { eventSt.fType = kKeyRelease; - eventSt.fCode = px; // px contains key code - need modifiers from somewhere + eventSt.fCode = py; // px contains key code - need modifiers from somewhere HandleKey(&eventSt); } + break; + case 5://trick :) + // + if (CurrentCamera().Zoom(+50, kFALSE, kFALSE)) { //TODO : val static const somewhere + if (fGLDevice != -1) { + gGLManager->MarkForDirectCopy(fGLDevice, kTRUE); + gVirtualX->SetDrawMode(TVirtualX::kCopy); + } + RequestDraw(); + } + break; + case 6://trick :) + if (CurrentCamera().Zoom(-50, kFALSE, kFALSE)) { //TODO : val static const somewhere + if (fGLDevice != -1) { + gGLManager->MarkForDirectCopy(fGLDevice, kTRUE); + gVirtualX->SetDrawMode(TVirtualX::kCopy); + } + RequestDraw(); + } + break; + case 7://trick :) + eventSt.fState = kKeyShiftMask; + eventSt.fCode = kButton1; + eventSt.fType = kButtonPress; + HandleButton(&eventSt); + break; default: { - Error("TGLViewer::ExecuteEvent", "invalid event type"); + // Error("TGLViewer::ExecuteEvent", "invalid event type"); } } -}; +} //______________________________________________________________________________ Bool_t TGLViewer::HandleEvent(Event_t *event) @@ -1556,7 +1689,7 @@ Bool_t TGLViewer::HandleButton(Event_t * event) return kFALSE; } } - + // Button DOWN if (event->fType == kButtonPress) { Bool_t grabPointer = kFALSE; @@ -1612,7 +1745,7 @@ Bool_t TGLViewer::HandleButton(Event_t * event) // Note: Modifiers (ctrl/shift) disabled as fState doesn't seem to // have correct modifier flags with mouse wheel under Windows.. case(kButton4): { - // Zoom out (adjust camera FOV) + // Zoom out (adjust camera FOV) if (CurrentCamera().Zoom(+50, kFALSE, kFALSE)) { //TODO : val static const somewhere RequestDraw(); } @@ -1627,6 +1760,8 @@ Bool_t TGLViewer::HandleButton(Event_t * event) } } fAction = kCameraNone; + if (fGLDevice != -1) + gGLManager->MarkForDirectCopy(fGLDevice, kFALSE); } return kTRUE; @@ -1679,11 +1814,14 @@ Bool_t TGLViewer::HandleKey(Event_t *event) } return kFALSE; } - + char tmp[10] = {0}; UInt_t keysym = 0; - gVirtualX->LookupString(event, tmp, sizeof(tmp), keysym); + if (fGLDevice == -1) + gVirtualX->LookupString(event, tmp, sizeof(tmp), keysym); + else + keysym = event->fCode; Bool_t redraw = kFALSE; @@ -1755,9 +1893,12 @@ Bool_t TGLViewer::HandleKey(Event_t *event) Info("OpenGL viewer FORCED rebuild", ""); RebuildScene(); } + default:; } if (redraw) { + if (fGLDevice != -1) + gGLManager->MarkForDirectCopy(fGLDevice, kTRUE); RequestDraw(); } @@ -1786,7 +1927,7 @@ Bool_t TGLViewer::HandleMotion(Event_t * event) Int_t yDelta = event->fY - fLastPos.fY; // If no current camera action give to scene to pass on to manipulator - if (fAction == kNone) { + if (fAction == kNone/* && fGLDevice == -1*/) { MakeCurrent(); processed = fScene.HandleMotion(*event, *fCurrentCamera); @@ -1807,6 +1948,11 @@ Bool_t TGLViewer::HandleMotion(Event_t * event) fLastPos.fY = event->fY; if (processed) { + if (fGLDevice != -1) { + gGLManager->MarkForDirectCopy(fGLDevice, kTRUE); + gVirtualX->SetDrawMode(TVirtualX::kCopy); + } + RequestDraw(); } diff --git a/gl/src/TGLViewerEditor.cxx b/gl/src/TGLViewerEditor.cxx new file mode 100644 index 00000000000..37557048cd9 --- /dev/null +++ b/gl/src/TGLViewerEditor.cxx @@ -0,0 +1,448 @@ +#include <iostream> +#include <cstring> + +#include "TGNumberEntry.h" +#include "TGButtonGroup.h" +#include "TVirtualGL.h" +#include "TG3DLine.h" +#include "TGButton.h" +#include "TString.h" +#include "TGLabel.h" +#include "TClass.h" +#include "TGTab.h" + +#include "TGLViewerEditor.h" +#include "TGLViewer.h" +#include "TGLUtil.h" + +ClassImp(TGLViewerEditor) + +//A lot of raw pointers/naked new-expressions - good way to discredit C++ :( +//ROOT has system to cleanup - I'll try to use it + +//______________________________________________________________________________ +TGLViewerEditor::TGLViewerEditor(const TGWindow *p, Int_t id, Int_t width, Int_t height, UInt_t options, Pixel_t back) + : TGedFrame(p, id, width, height, options | kVerticalFrame, back), + fGuidesTabEl(0), + fClipTabEl(0), + fGuidesFrame(0), + fClipFrame(0), + fLightFrame(0), + fTopLight(0), + fRightLight(0), + fBottomLight(0), + fLeftLight(0), + fFrontLight(0), + fAxesContainer(0), + fAxesNone(0), + fAxesEdge(0), + fAxesOrigin(0), + fRefContainer(0), + fReferenceOn(0), + fReferencePosX(0), + fReferencePosY(0), + fReferencePosZ(0), + fCurrentClip(kClipNone), + fTypeButtons(0), + fPlanePropFrame(0), + fPlaneProp(), + fBoxPropFrame(0), + fBoxProp(), + fEdit(0), + fApplyButton(0), + fViewer(0) +{ + //Create tabs + CreateLightsTab(); + CreateGuidesTab(); + CreateClippingTab(); + + fTab->Layout(); + fTab->MapSubwindows(); + //Register editor + TGedElement *ged = new TGedElement; + ged->fGedFrame = this; + ged->fCanvas = 0; + TGLViewer::Class()->GetEditorList()->Add(ged); +} + +//______________________________________________________________________________ +TGLViewerEditor::~TGLViewerEditor() +{ + //Try to cleanup + SetCleanup(kDeepCleanup); + Cleanup(); + + fGuidesFrame->SetCleanup(kDeepCleanup); + fGuidesFrame->Cleanup(); + + fClipFrame->SetCleanup(kDeepCleanup); + fClipFrame->Cleanup(); +} + +//______________________________________________________________________________ +void TGLViewerEditor::ConnectSignals2Slots() +{ + //Connect check buttons + //Do I really need this function, or I can connect directly in CreateXXXTab functions ??? + fTopLight->Connect("Clicked()", "TGLViewerEditor", this, "DoButton()"); + fRightLight->Connect("Clicked()", "TGLViewerEditor", this, "DoButton()"); + fBottomLight->Connect("Clicked()", "TGLViewerEditor", this, "DoButton()"); + fLeftLight->Connect("Clicked()", "TGLViewerEditor", this, "DoButton()"); + fFrontLight->Connect("Clicked()", "TGLViewerEditor", this, "DoButton()"); + + fAxesContainer->Connect("Pressed(Int_t)", "TGLViewerEditor", this, "UpdateViewerGuides()"); + fReferenceOn->Connect("Clicked()", "TGLViewerEditor", this, "UpdateViewerGuides()"); + fReferencePosX->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateViewerGuides()"); + fReferencePosY->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateViewerGuides()"); + fReferencePosZ->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateViewerGuides()"); + + fTypeButtons->Connect("Pressed(Int_t)", "TGLViewerEditor", this, "ClipTypeChanged(Int_t)"); + fEdit->Connect("Clicked()", "TGLViewerEditor", this, "UpdateViewerClip()"); + + for (Int_t i = 0; i < 4; ++i) + fPlaneProp[i]->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "ClipValueChanged()"); + + for (Int_t i = 0; i < 6; ++i) + fBoxProp[i]->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "ClipValueChanged()"); + + fApplyButton->Connect("Pressed()", "TGLViewerEditor", this, "UpdateViewerClip()"); + + fInit = kFALSE; +} + +//______________________________________________________________________________ +void TGLViewerEditor::SetModel(TVirtualPad *pad, TObject *obj, Int_t) +{ + //Sets model or disables/hides viewer + fViewer = 0; + fModel = 0; + fPad = 0; + + if (!obj || !obj->InheritsFrom(TGLViewer::Class())) { + SetActive(kFALSE); + fGuidesTabEl->UnmapWindow(); + fGuidesFrame->UnmapWindow(); + fClipTabEl->UnmapWindow(); + fClipFrame->UnmapWindow(); + fTab->SetTab(0); + return; + } else { + fGuidesTabEl->MapWindow(); + fGuidesFrame->MapWindow(); + fClipTabEl->MapWindow(); + fClipFrame->MapWindow(); + } + + fViewer = static_cast<TGLViewer *>(obj); + fModel = obj; + fPad = pad; + //Set guides controls' values + SetGuides(); + //Set clipping control values + SetCurrentClip(); + + if (fInit) + ConnectSignals2Slots(); + + SetActive(); +} + +//______________________________________________________________________________ +void TGLViewerEditor::DoButton() +{ + //Lights radio button was clicked + fViewer->ToggleLight(TGLViewer::ELight(((TGButton *) gTQSender)->WidgetId())); +} + +//______________________________________________________________________________ +void TGLViewerEditor::UpdateViewerGuides() +{ + // Update viewer with GUI state + TGLViewer::EAxesType axesType = TGLViewer::kAxesNone; + + for (Int_t i = 1; i < 4; i++) { + TGButton * button = fAxesContainer->GetButton(i); + if (button && button->IsDown()) { + axesType = TGLViewer::EAxesType(i-1); + break; + } + } + + const Double_t refPos[] = {fReferencePosX->GetNumber(), fReferencePosY->GetNumber(), fReferencePosZ->GetNumber()}; + fViewer->SetGuideState(axesType, fReferenceOn->IsDown(), refPos); + UpdateReferencePos(); +} + +//______________________________________________________________________________ +void TGLViewerEditor::CreateLightsTab() +{ + //Creates "Lights" tab + fLightFrame = new TGGroupFrame(this, "Light sources:", kLHintsTop | kLHintsCenterX); + fLightFrame->SetCleanup(kDeepCleanup); + fLightFrame->SetTitlePos(TGGroupFrame::kLeft); + AddFrame(fLightFrame, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3));//- + + TGMatrixLayout *ml = new TGMatrixLayout(fLightFrame, 0, 1, 10); + fLightFrame->SetLayoutManager(ml); + + fTopLight = new TGCheckButton(fLightFrame, "Top", TGLViewer::kLightTop); + fTopLight->SetState(kButtonDown); + fRightLight = new TGCheckButton(fLightFrame, "Right", TGLViewer::kLightRight); + fRightLight->SetState(kButtonDown); + fBottomLight = new TGCheckButton(fLightFrame, "Bottom", TGLViewer::kLightBottom); + fBottomLight->SetState(kButtonDown); + fLeftLight = new TGCheckButton(fLightFrame, "Left", TGLViewer::kLightLeft); + fLeftLight->SetState(kButtonDown); + fFrontLight = new TGCheckButton(fLightFrame, "Front", TGLViewer::kLightFront); + fFrontLight->SetState(kButtonDown); + + fLightFrame->AddFrame(fTopLight); + fLightFrame->AddFrame(fRightLight); + fLightFrame->AddFrame(fBottomLight); + fLightFrame->AddFrame(fLeftLight); + fLightFrame->AddFrame(fFrontLight); +} + +//______________________________________________________________________________ +void TGLViewerEditor::CreateGuidesTab() +{ + //Create "Guides" tab + fGuidesFrame = fTab->AddTab("Guides"); + fGuidesTabEl = fTab->GetTabTab("Guides"); + + TGCompositeFrame *nameBin = new TGCompositeFrame(fGuidesFrame, 145, 10, kHorizontalFrame | kFixedWidth | kOwnBackground); + nameBin->SetCleanup(kDeepCleanup); + nameBin->AddFrame(new TGLabel(nameBin,"Name"), new TGLayoutHints(kLHintsLeft, 1, 1, 5, 0)); + nameBin->AddFrame(new TGHorizontal3DLine(nameBin), new TGLayoutHints(kLHintsExpandX, 5, 5, 12, 7)); + + fGuidesFrame->AddFrame(nameBin, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0)); + TGLabel *nameLabel = new TGLabel(fGuidesFrame, "TGLViewer::TGLViewer"); + Pixel_t color; + gClient->GetColorByName("#ff0000", color); + nameLabel->SetTextColor(color, kFALSE); + fGuidesFrame->AddFrame(nameLabel, new TGLayoutHints(kLHintsLeft, 1, 1, 0, 0)); + + fAxesContainer = new TGButtonGroup(fGuidesFrame, "Axes"); + fAxesContainer->SetCleanup(kDeepCleanup); + + fAxesNone = new TGRadioButton(fAxesContainer, "None"); + fAxesEdge = new TGRadioButton(fAxesContainer, "Edge"); + fAxesOrigin = new TGRadioButton(fAxesContainer, "Origin"); + + fGuidesFrame->AddFrame(fAxesContainer, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + //Reference container + fRefContainer = new TGGroupFrame(fGuidesFrame, "Reference Marker"); + fRefContainer->SetCleanup(kDeepCleanup); + fGuidesFrame->AddFrame(fRefContainer, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + //Reference options + fReferenceOn = new TGCheckButton(fRefContainer, "Show"); + fRefContainer->AddFrame(fReferenceOn, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + + TGLabel *label = new TGLabel(fRefContainer, "X"); + fRefContainer->AddFrame(label, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 0, 3, 3)); + fReferencePosX = new TGNumberEntry(fRefContainer, 0.0, 8); + fRefContainer->AddFrame(fReferencePosX, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + + label = new TGLabel(fRefContainer, "Y"); + fRefContainer->AddFrame(label, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 0, 3, 3)); + fReferencePosY = new TGNumberEntry(fRefContainer, 0.0, 8); + fRefContainer->AddFrame(fReferencePosY, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + + label = new TGLabel(fRefContainer, "Z"); + fRefContainer->AddFrame(label, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 0, 3, 3)); + fReferencePosZ = new TGNumberEntry(fRefContainer, 0.0, 8); + fRefContainer->AddFrame(fReferencePosZ, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); +} + +namespace +{ + enum EClippingControlIds { + kEditId, + kApplyId + }; +} + +//______________________________________________________________________________ +void TGLViewerEditor::CreateClippingTab() +{ + // Create GUI controls - clip type (none/plane/box) and plane/box properties + fClipFrame = fTab->AddTab("Clipping"); + fClipTabEl = fTab->GetTabTab("Clipping"); + // + TGCompositeFrame *nameBin = new TGCompositeFrame(fClipFrame, 145, 10, kHorizontalFrame | kFixedWidth | kOwnBackground); + nameBin->SetCleanup(kDeepCleanup); + nameBin->AddFrame(new TGLabel(nameBin,"Name"), new TGLayoutHints(kLHintsLeft, 1, 1, 5, 0)); + nameBin->AddFrame(new TGHorizontal3DLine(nameBin), new TGLayoutHints(kLHintsExpandX, 5, 5, 12, 7)); + + fClipFrame->AddFrame(nameBin, new TGLayoutHints(kLHintsTop, 1, 1, 0, 0)); + TGLabel *nameLabel = new TGLabel(fClipFrame, "TGLViewer::TGLViewer"); + Pixel_t color; + gClient->GetColorByName("#ff0000", color); + nameLabel->SetTextColor(color, kFALSE); + fClipFrame->AddFrame(nameLabel, new TGLayoutHints(kLHintsLeft, 1, 1, 0, 0)); + + fTypeButtons = new TGButtonGroup(fClipFrame, "Clip Type"); + fTypeButtons->SetCleanup(kDeepCleanup); + new TGRadioButton(fTypeButtons, "None"); + new TGRadioButton(fTypeButtons, "Plane"); + new TGRadioButton(fTypeButtons, "Box"); + + fClipFrame->AddFrame(fTypeButtons, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + // Viewer Edit + fEdit = new TGCheckButton(fClipFrame, "Show / Edit In Viewer", kEditId); + fClipFrame->AddFrame(fEdit, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + + // Plane properties + fPlanePropFrame = new TGCompositeFrame(fClipFrame); + fPlanePropFrame->SetCleanup(kDeepCleanup); + fClipFrame->AddFrame(fPlanePropFrame, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + + static const char * const planeStr[] = { "aX + ", "bY +", "cZ + ", "d = 0" }; + + for (Int_t i = 0; i < 4; ++i) { + TGLabel *label = new TGLabel(fPlanePropFrame, planeStr[i]); + fPlanePropFrame->AddFrame(label, new TGLayoutHints(kLHintsTop | kLHintsLeft, 3, 3, 3, 3)); + fPlaneProp[i] = new TGNumberEntry(fPlanePropFrame, 1., 8); + fPlanePropFrame->AddFrame(fPlaneProp[i], new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + } + + // Box properties + fBoxPropFrame = new TGCompositeFrame(fClipFrame); + fBoxPropFrame->SetCleanup(kDeepCleanup); + fClipFrame->AddFrame(fBoxPropFrame, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + + static const char * const boxStr[] = {"Center X", "Center Y", "Center Z", "Length X", "Length Y", "Length Z" }; + + for (Int_t i = 0; i < 6; ++i) { + TGLabel *label = new TGLabel(fBoxPropFrame, boxStr[i]); + fBoxPropFrame->AddFrame(label, new TGLayoutHints(kLHintsTop | kLHintsLeft, 3, 3, 3, 3)); + fBoxProp[i] = new TGNumberEntry(fBoxPropFrame, 1., 8); + fBoxPropFrame->AddFrame(fBoxProp[i], new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); + } + + // Apply button + fApplyButton = new TGTextButton(fClipFrame, "Apply", kApplyId); + fClipFrame->AddFrame(fApplyButton, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 3, 3, 3, 3)); +} + +//______________________________________________________________________________ +void TGLViewerEditor::UpdateReferencePos() +{ + // Enable/disable reference position (x/y/z) number edits based on + // reference check box + fReferencePosX->SetState(fReferenceOn->IsDown()); + fReferencePosY->SetState(fReferenceOn->IsDown()); + fReferencePosZ->SetState(fReferenceOn->IsDown()); +} + +//______________________________________________________________________________ +void TGLViewerEditor::ClipValueChanged() +{ + //One of number edtries was changed + fApplyButton->SetState(kButtonUp); +} + +//______________________________________________________________________________ +void TGLViewerEditor::ClipTypeChanged(Int_t id) +{ + // Clip type radio button changed - update viewer + if (id == 1) { + fCurrentClip = kClipNone; + fViewer->SetCurrentClip(kClipNone, kFALSE); + SetCurrentClip(); + fEdit->SetState(kButtonDisabled); + } else { + fEdit->SetState(kButtonUp); + fCurrentClip = id == 2 ? kClipPlane : kClipBox; + fViewer->SetCurrentClip(fCurrentClip, fEdit->IsDown()); + SetCurrentClip(); + } + + // Internal GUI change - need to update the viewer + gGLManager->MarkForDirectCopy(fViewer->GetDev(), kTRUE); + fViewer->RequestDraw(); +} + +//______________________________________________________________________________ +void TGLViewerEditor::UpdateViewerClip() +{ + //Change clipping volume + Double_t data[6] = {0.}; + + // Fetch GUI state for clip if 'type' into 'data' vector + if (fCurrentClip == kClipPlane) + for (Int_t i = 0; i < 4; ++i) + data[i] = fPlaneProp[i]->GetNumber(); + else if (fCurrentClip == kClipBox) + for (Int_t i = 0; i < 6; ++i) + data[i] = fBoxProp[i]->GetNumber(); + + fApplyButton->SetState(kButtonDisabled); + fViewer->SetClipState(fCurrentClip, data); + fViewer->SetCurrentClip(fCurrentClip, fEdit->IsDown()); + gGLManager->MarkForDirectCopy(fViewer->GetDev(), kTRUE); + fViewer->RequestDraw(); +} + +//______________________________________________________________________________ +void TGLViewerEditor::SetCurrentClip() +{ + // Set current (active) GUI clip type from 'type' + Bool_t edit = kFALSE; + fViewer->GetCurrentClip(fCurrentClip, edit); + fEdit->SetDown(edit); + fApplyButton->SetState(kButtonDisabled); + + switch(fCurrentClip) { + case(kClipNone): + fTypeButtons->SetButton(1); + fClipFrame->HideFrame(fPlanePropFrame); + fClipFrame->HideFrame(fBoxPropFrame); + return; + case(kClipPlane): + fTypeButtons->SetButton(2); + fClipFrame->ShowFrame(fPlanePropFrame); + fClipFrame->HideFrame(fBoxPropFrame); + break; + case(kClipBox): + fTypeButtons->SetButton(3); + fClipFrame->HideFrame(fPlanePropFrame); + fClipFrame->ShowFrame(fBoxPropFrame); + break; + default:; + } + + Double_t clip[6] = {0.}; + fViewer->GetClipState(fCurrentClip, clip); + + if (fCurrentClip == kClipPlane) + for (Int_t i = 0; i < 4; ++i) + fPlaneProp[i]->SetNumber(clip[i]); + else if (fCurrentClip == kClipBox) + for (Int_t i = 0; i < 6; ++i) + fBoxProp[i]->SetNumber(clip[i]); + + gGLManager->MarkForDirectCopy(fViewer->GetDev(), kTRUE); + fViewer->RequestDraw(); +} + +//______________________________________________________________________________ +void TGLViewerEditor::SetGuides() +{ + //Set cintriks in "Guides" tab + TGLViewer::EAxesType axesType = TGLViewer::kAxesNone; + Bool_t referenceOn = kFALSE; + Double_t referencePos[3] = {0.}; + fViewer->GetGuideState(axesType, referenceOn, referencePos); + + // Button ids run from 1 + if (TGButton *btn = fAxesContainer->GetButton(axesType+1)) + btn->SetDown(); + + fReferenceOn->SetDown(referenceOn); + fReferencePosX->SetNumber(referencePos[0]); + fReferencePosY->SetNumber(referencePos[1]); + fReferencePosZ->SetNumber(referencePos[2]); + UpdateReferencePos(); +} diff --git a/gl/src/TX11GL.cxx b/gl/src/TX11GL.cxx index 280ab4fd79f..0b5cdddf3cd 100644 --- a/gl/src/TX11GL.cxx +++ b/gl/src/TX11GL.cxx @@ -1,4 +1,4 @@ -// @(#)root/gx11:$Name: $:$Id: TX11GL.cxx,v 1.13 2006/02/06 16:15:13 couet Exp $ +// @(#)root/gx11:$Name: $:$Id: TX11GL.cxx,v 1.14 2006/02/07 14:18:46 couet Exp $ // Author: Timur Pocheptsov (TX11GLManager) / Valeriy Onuchin (TX11GL) /************************************************************************* @@ -21,6 +21,8 @@ #include "TVirtualViewer3D.h" #include "TVirtualX.h" +#include "TGLViewer.h" +#include "TGLManip.h" #include "TX11GL.h" #include "TError.h" #include "TROOT.h" @@ -556,12 +558,14 @@ void TX11GLManager::DeleteGLContext(Int_t ctxInd) ctx.fWindowIndex = ctxInd; } +//______________________________________________________________________________ Int_t TX11GLManager::GetVirtualXInd(Int_t ctxInd) { //Returns index appropriate for gVirtualX return fPimpl->fGLContexts[ctxInd].fPixmapIndex; } +//______________________________________________________________________________ void TX11GLManager::ExtractViewport(Int_t ctxInd, Int_t *viewport) { //Returns current sizes of gl pixmap @@ -576,28 +580,32 @@ void TX11GLManager::ExtractViewport(Int_t ctxInd, Int_t *viewport) } //______________________________________________________________________________ -void TX11GLManager::DrawViewer(TVirtualViewer3D *vv) +void TX11GLManager::PaintSingleObject(TVirtualGLPainter *p) { // - vv->DrawViewer(); + p->Paint(); } -//______________________________________________________________________________ -TObject *TX11GLManager::Select(TVirtualViewer3D *vv, Int_t x, Int_t y) +void TX11GLManager::PrintViewer(TVirtualViewer3D *vv) { // - return vv->SelectObject(x, y); + vv->PrintObjects(); } //______________________________________________________________________________ -void TX11GLManager::PaintSingleObject(TVirtualGLPainter *p) +void TX11GLManager::DrawViewer(TVirtualViewer3D *viewer) { - // - p->Paint(); + viewer->DoDraw(); } -void TX11GLManager::PrintViewer(TVirtualViewer3D *vv) +//______________________________________________________________________________ +Bool_t TX11GLManager::SelectViewer(TVirtualViewer3D *viewer, const TGLRect *rect) { - // - vv->PrintObjects(); + return viewer->DoSelect(*rect); +} + +//______________________________________________________________________________ +Bool_t TX11GLManager::SelectManip(TVirtualGLManip *manip, const TGLCamera * camera, const TGLRect * rect, const TGLBoundingBox * sceneBox) +{ + return manip->Select(*camera, *rect, *sceneBox); } diff --git a/gpad/src/TCanvas.cxx b/gpad/src/TCanvas.cxx index 26f727f34be..95da414449c 100644 --- a/gpad/src/TCanvas.cxx +++ b/gpad/src/TCanvas.cxx @@ -1,4 +1,4 @@ -// @(#)root/gpad:$Name: $:$Id: TCanvas.cxx,v 1.102 2005/11/24 23:30:05 rdm Exp $ +// @(#)root/gpad:$Name: $:$Id: TCanvas.cxx,v 1.103 2005/11/28 13:50:41 brun Exp $ // Author: Rene Brun 12/12/94 /************************************************************************* @@ -1158,13 +1158,21 @@ void TCanvas::HandleInput(EEventType event, Int_t px, Int_t py) while ((tc = (TCanvas *)next())) tc->Update(); } + + if (pad->GetGLDevice() != -1) + fSelected->ExecuteEvent(event, px, py); break; // don't want fPadSave->cd() to be executed at the end case kButton2Motion: - break; - + //was empty! case kButton2Up: + if (fSelected) { + gPad = fSelectedPad; + + fSelected->ExecuteEvent(event, px, py); + RunAutoExec(); + } break; case kButton2Double: @@ -1196,22 +1204,40 @@ void TCanvas::HandleInput(EEventType event, Int_t px, Int_t py) break; case kKeyPress: + if (!fSelectedPad || !fSelected) return; + gPad = fSelectedPad; // don't use cd() because we won't draw in pad + // we will only use its coordinate system + fSelected->ExecuteEvent(event, px, py); - // find pad in which input occured + RunAutoExec(); + + break; + case 7: + // Try to select pad = Pick(px, py, prevSelObj); + if (!pad) return; - gPad = pad; // don't use cd() because we won't draw in pad - // we will only use its coordinate system + EnterLeave(prevSelPad, prevSelObj); + gPad = pad; // don't use cd() we will use the current + // canvas via the GetCanvas member and not via + // gPad->GetCanvas fSelected->ExecuteEvent(event, px, py); - RunAutoExec(); break; - default: - break; + //kButton4/kButton5 for embedded gl/ glhistpainter + //5 and 6 + if (event == 5 || event == 6) + { + pad = Pick(px, py, prevSelObj); + if (!pad) return; + + gPad = pad; + fSelected->ExecuteEvent(event, px, py); + } } if (fPadSave && event != kButton2Down) diff --git a/gui/src/TRootCanvas.cxx b/gui/src/TRootCanvas.cxx index b3ae6c99039..ff14bb13d2b 100644 --- a/gui/src/TRootCanvas.cxx +++ b/gui/src/TRootCanvas.cxx @@ -1,4 +1,4 @@ -// @(#)root/gui:$Name: $:$Id: TRootCanvas.cxx,v 1.91 2006/01/10 09:24:59 brun Exp $ +// @(#)root/gui:$Name: $:$Id: TRootCanvas.cxx,v 1.92 2006/02/06 16:46:41 antcheva Exp $ // Author: Fons Rademakers 15/01/98 /************************************************************************* @@ -274,13 +274,13 @@ Bool_t TRootContainer::HandleButton(Event_t *event) newpos = y - page; if (newpos < 0) newpos = 0; fCanvas->fCanvasWindow->SetVsbPosition(newpos); - return kTRUE; +// return kTRUE; } if (event->fCode == kButton5) { // scroll down newpos = fCanvas->fCanvasWindow->GetVsbPosition() + page; fCanvas->fCanvasWindow->SetVsbPosition(newpos); - return kTRUE; +// return kTRUE; } return fCanvas->HandleContainerButton(event); } @@ -1321,7 +1321,6 @@ void TRootCanvas::ShowStatusBar(Bool_t show) void TRootCanvas::ShowEditor(Bool_t show) { // Show or hide side frame. - TVirtualPad *savedPad = 0; savedPad = (TVirtualPad *) gPad; gPad = Canvas(); @@ -1490,8 +1489,12 @@ Bool_t TRootCanvas::HandleContainerButton(Event_t *event) if (event->fType == kButtonPress) { fButton = button; - if (button == kButton1) - fCanvas->HandleInput(kButton1Down, x, y); + if (button == kButton1) { + if (event->fState & kKeyShiftMask) + fCanvas->HandleInput(EEventType(7), x, y); + else + fCanvas->HandleInput(kButton1Down, x, y); + } if (button == kButton2) fCanvas->HandleInput(kButton2Down, x, y); if (button == kButton3) { @@ -1500,6 +1503,10 @@ Bool_t TRootCanvas::HandleContainerButton(Event_t *event) } } else if (event->fType == kButtonRelease) { + if (button == kButton4) + fCanvas->HandleInput(EEventType(5), x, y);//hack + if (button == kButton5) + fCanvas->HandleInput(EEventType(6), x, y);//hack if (button == kButton1) fCanvas->HandleInput(kButton1Up, x, y); if (button == kButton2) @@ -1585,6 +1592,8 @@ Bool_t TRootCanvas::HandleContainerMotion(Event_t *event) fCanvas->HandleInput(kMouseMotion, x, y); if (fButton == kButton1) fCanvas->HandleInput(kButton1Motion, x, y); + if (fButton == kButton2) + fCanvas->HandleInput(kButton2Motion, x, y); return kTRUE; } diff --git a/tutorials/rootgeom.C b/tutorials/rootgeom.C index 6106e603cf4..1d029e4278f 100644 --- a/tutorials/rootgeom.C +++ b/tutorials/rootgeom.C @@ -1,6 +1,7 @@ void rootgeom() { //--- Definition of a simple geometry +// gStyle->SetCanvasPreferGL(true); gSystem->Load("libGeom"); TGeoManager *geom = new TGeoManager("simple1", "Simple geometry"); @@ -128,6 +129,6 @@ void rootgeom() //#Viewer3D.DefaultDrawOption: ogl geom->SetVisLevel(4); - top->Draw(); + top->Draw("ogle"); } diff --git a/win32gdk/inc/TGWin32GL.h b/win32gdk/inc/TGWin32GL.h index 934eeb462a0..4e9c7a879a5 100644 --- a/win32gdk/inc/TGWin32GL.h +++ b/win32gdk/inc/TGWin32GL.h @@ -1,4 +1,4 @@ -// @(#)root/win32gdk:$Name: $:$Id: TGWin32GL.h,v 1.7 2006/01/12 16:56:08 couet Exp $ +// @(#)root/win32gdk:$Name: $:$Id: TGWin32GL.h,v 1.8 2006/02/06 16:48:12 couet Exp $ // Author: Valeriy Onuchin 05/08/04 /************************************************************************* @@ -86,8 +86,10 @@ public: //functions to switch between threads in win32 //used by viewer - void DrawViewer(TVirtualViewer3D *vv); - TObject* Select(TVirtualViewer3D *vv, Int_t x, Int_t y); + void DrawViewer(TVirtualViewer3D *glv); + Bool_t SelectViewer(TVirtualViewer3D *viewer, const TGLRect *selRect); + Bool_t SelectManip(TVirtualGLManip *manip, const TGLCamera *camera, const TGLRect *rect, const TGLBoundingBox *sceneBox); + void PaintSingleObject(TVirtualGLPainter *); void PrintViewer(TVirtualViewer3D *vv); diff --git a/win32gdk/inc/TGWin32VirtualGLProxy.h b/win32gdk/inc/TGWin32VirtualGLProxy.h index 9393a77105e..ab489dcf24f 100644 --- a/win32gdk/inc/TGWin32VirtualGLProxy.h +++ b/win32gdk/inc/TGWin32VirtualGLProxy.h @@ -1,4 +1,4 @@ -// @(#)root/win32gdk:$Name: $:$Id: TGWin32VirtualGLProxy.h,v 1.15 2006/01/26 11:59:42 brun Exp $ +// @(#)root/win32gdk:$Name: $:$Id: TGWin32VirtualGLProxy.h,v 1.16 2006/02/06 16:48:12 couet Exp $ // Author: Valeriy Onuchin 05/08/04 /************************************************************************* @@ -147,7 +147,8 @@ public: void Flush(Int_t ctxInd); void DeleteGLContext(Int_t devInd); void DrawViewer(TVirtualViewer3D *vv); - TObject* Select(TVirtualViewer3D *vv, Int_t x, Int_t y); + Bool_t SelectViewer(TVirtualViewer3D *viewer, const TGLRect *selRect); + Bool_t SelectManip(TVirtualGLManip *manip, const TGLCamera *camera, const TGLRect *rect, const TGLBoundingBox *sceneBox); void PaintSingleObject(TVirtualGLPainter *); void PrintViewer(TVirtualViewer3D *vv); diff --git a/win32gdk/src/TGWin32GL.cxx b/win32gdk/src/TGWin32GL.cxx index 26a95a34c47..219ef64ddb2 100644 --- a/win32gdk/src/TGWin32GL.cxx +++ b/win32gdk/src/TGWin32GL.cxx @@ -1,4 +1,4 @@ -// @(#)root/win32gdk:$Name: $:$Id: TGWin32GL.cxx,v 1.9 2005/11/17 14:43:17 couet Exp $ +// @(#)root/win32gdk:$Name: $:$Id: TGWin32GL.cxx,v 1.10 2006/02/06 16:48:12 couet Exp $ // Author: Valeriy Onuchin(TGWin32GL)/ Timur Pocheptsov (TGWin32GLManager) /************************************************************************* @@ -587,25 +587,31 @@ void TGWin32GLManager::ExtractViewport(Int_t ctxInd, Int_t *viewport) } //______________________________________________________________________________ -void TGWin32GLManager::DrawViewer(TVirtualViewer3D *vv) +void TGWin32GLManager::PaintSingleObject(TVirtualGLPainter *p) { - vv->DrawViewer(); + p->Paint(); } //______________________________________________________________________________ -TObject *TGWin32GLManager::Select(TVirtualViewer3D *vv, Int_t x, Int_t y) +void TGWin32GLManager::PrintViewer(TVirtualViewer3D *vv) { - return vv->SelectObject(x, y); + vv->PrintObjects(); } //______________________________________________________________________________ -void TGWin32GLManager::PaintSingleObject(TVirtualGLPainter *p) +void TGWin32GLManager::DrawViewer(TVirtualViewer3D *viewer) { - p->Paint(); + viewer->DoDraw(); } //______________________________________________________________________________ -void TGWin32GLManager::PrintViewer(TVirtualViewer3D *vv) +Bool_t TGWin32GLManager::SelectViewer(TVirtualViewer3D *viewer, const TGLRect *rect) { - vv->PrintObjects(); -} \ No newline at end of file + return viewer->DoSelect(*rect); +} + +//______________________________________________________________________________ +Bool_t TGWin32GLManager::SelectManip(TVirtualGLManip *manip, const TGLCamera * camera, const TGLRect * rect, const TGLBoundingBox * sceneBox) +{ + return manip->Select(*camera, *rect, *sceneBox); +} diff --git a/win32gdk/src/TGWin32VirtualGLProxy.cxx b/win32gdk/src/TGWin32VirtualGLProxy.cxx index 97f31fa0108..9836ba0acff 100644 --- a/win32gdk/src/TGWin32VirtualGLProxy.cxx +++ b/win32gdk/src/TGWin32VirtualGLProxy.cxx @@ -1,4 +1,4 @@ -// @(#)root/win32gdk:$Name: $:$Id: TGWin32VirtualGLProxy.cxx,v 1.17 2006/01/26 11:59:42 brun Exp $ +// @(#)root/win32gdk:$Name: $:$Id: TGWin32VirtualGLProxy.cxx,v 1.18 2006/02/06 16:48:12 couet Exp $ // Author: Valeriy Onuchin 05/08/04 /************************************************************************* @@ -152,5 +152,6 @@ VOID_METHOD_ARG2(GLManager, ExtractViewport, Int_t, pixInd, Int_t *, vp, 1) VOID_METHOD_ARG1(GLManager, DrawViewer, TVirtualViewer3D *, vv, 1) VOID_METHOD_ARG1(GLManager, PrintViewer, TVirtualViewer3D *, vv, 1) VOID_METHOD_ARG1(GLManager, PaintSingleObject, TVirtualGLPainter *, p, 1) -RETURN_METHOD_ARG3(GLManager, TObject *, Select, TVirtualViewer3D *, w, Int_t, x, Int_t, y) +RETURN_METHOD_ARG2(GLManager, Bool_t, SelectViewer, TVirtualViewer3D *, viewer, const TGLRect *, rect) +RETURN_METHOD_ARG4(GLManager, Bool_t, SelectManip, TVirtualGLManip *, manip, const TGLCamera *, camera, const TGLRect *, rect, const TGLBoundingBox *, box) -- GitLab