diff --git a/gl/inc/TGLSAViewer.h b/gl/inc/TGLSAViewer.h index b0690f87b0111ecc3b3fa56ef93c37e8a8a57a86..9e030d1f07efcff6cc81445196768750af0ebace 100644 --- a/gl/inc/TGLSAViewer.h +++ b/gl/inc/TGLSAViewer.h @@ -1,4 +1,4 @@ -// @(#)root/gl:$Name: $:$Id: TGLSAViewer.h,v 1.15 2006/09/25 13:43:21 rdm Exp $ +// @(#)root/gl:$Name: $:$Id: TGLSAViewer.h,v 1.16 2006/09/26 08:06:49 rdm Exp $ // Author: Richard Maunder / Timur Pocheptsov /************************************************************************* @@ -94,6 +94,8 @@ public: virtual const char* GetName() const { return "GLViewer"; } + virtual void RefreshPadEditor(TObject* changed=0); + void Show(); void Close(); diff --git a/gl/inc/TGLViewer.h b/gl/inc/TGLViewer.h index 87c0a44c8083c7693be7305c6e67cd5d1207f443..8cd77f27d6af29a4ef18ea8b461273ae2e352cc7 100644 --- a/gl/inc/TGLViewer.h +++ b/gl/inc/TGLViewer.h @@ -1,4 +1,4 @@ -// @(#)root/gl:$Name: $:$Id: TGLViewer.h,v 1.30 2006/08/23 14:39:40 brun Exp $ +// @(#)root/gl:$Name: $:$Id: TGLViewer.h,v 1.31 2006/09/25 13:40:46 rdm Exp $ // Author: Richard Maunder 25/05/2005 /************************************************************************* @@ -149,6 +149,7 @@ protected: // In future it will be shaped between multiple viewers TGLScene fScene; //! the GL scene - owned by viewer at present TGLRect fViewport; //! viewport - drawn area + Color_t fClearColor; //! clear-color UInt_t fLightState; //! light states (on/off) mask EAxesType fAxesType; //! axes type Bool_t fReferenceOn; //! reference marker on? @@ -201,7 +202,8 @@ protected: TClass* FindDirectRendererClass(TClass* cls); TGLLogicalShape* AttemptDirectRenderer(TObject* id); - // Camera-reset behaviour + // Updata/camera-reset behaviour + Bool_t fIgnoreSizesOnUpdate; // ignore sizes of bounding-boxes on update Bool_t fResetCamerasOnUpdate; // reposition camera on each update Bool_t fResetCamerasOnNextUpdate; // reposition camera on next update Bool_t fResetCameraOnDoubleClick; // reposition camera on double-click @@ -232,7 +234,11 @@ public: virtual void ResetCameras() { SetupCameras(kTRUE); } virtual void ResetCamerasAfterNextUpdate() { fResetCamerasOnNextUpdate = kTRUE; } + virtual void RefreshPadEditor(TObject* changed=0) {} + Int_t GetDev()const{return fGLDevice;} + Color_t GetClearColor() const { return fClearColor; } + void SetClearColor(Color_t col) { fClearColor = col; } Bool_t GetSmartRefresh() const { return fSmartRefresh; } void SetSmartRefresh(Bool_t smart_ref) { fSmartRefresh = smart_ref; } @@ -266,7 +272,10 @@ public: Bool_t DoSelect(const TGLRect & rect); // Window coords origin top left void ApplySelection(); - // Camera-reset + // Update/camera-reset + void UpdateScene(); + Bool_t GetIgnoreSizesOnUpdate() const { return fIgnoreSizesOnUpdate; } + void SetIgnoreSizesOnUpdate(Bool_t v) { fIgnoreSizesOnUpdate = v; } void ResetCurrentCamera(); Bool_t GetResetCamerasOnUpdate() const { return fResetCamerasOnUpdate; } void SetResetCamerasOnUpdate(Bool_t v) { fResetCamerasOnUpdate = v; } @@ -285,7 +294,7 @@ public: void SetPadEditor(TGLViewerEditor *ed){fPadEditor = ed;} ClassDef(TGLViewer,0) // GL viewer generic base class - }; +}; //______________________________________________________________________________ inline void TGLViewer::GetClipState(EClipType type, Double_t data[6]) const diff --git a/gl/inc/TGLViewerEditor.h b/gl/inc/TGLViewerEditor.h index 177ab26a2a2dff7f93359551160473cf76daf6f6..4d74343f5d5d981cba7063b841ece3ada28b2fe0 100644 --- a/gl/inc/TGLViewerEditor.h +++ b/gl/inc/TGLViewerEditor.h @@ -16,7 +16,7 @@ class TGNumberEntry; class TGButtonGroup; class TGroupFrame; class TGRadioButton; -// class TGTabElement; +class TGColorSelect; class TGButton; class TGLViewer; class TGTab; @@ -33,6 +33,14 @@ private: TGButton *fBottomLight; TGButton *fLeftLight; TGButton *fFrontLight; + + TGColorSelect *fClearColor; + TGCheckButton *fIgnoreSizesOnUpdate; + TGCheckButton *fResetCamerasOnUpdate; + TGCheckButton *fResetCameraOnDoubleClick; + TGTextButton *fUpdateScene; + TGTextButton *fCameraHome; + //"Guides" tab's controls TGButtonGroup *fAxesContainer; TGRadioButton *fAxesNone; @@ -82,6 +90,12 @@ public: void SetCurrentClip(); //Lights manipulation void DoButton(); + void DoClearColor(Pixel_t color); + void DoIgnoreSizesOnUpdate(); + void DoResetCamerasOnUpdate(); + void DoResetCameraOnDoubleClick(); + void DoUpdateScene(); + void DoCameraHome(); //Axis manipulation void UpdateViewerGuides(); void UpdateReferencePos(); diff --git a/gl/src/TGLSAViewer.cxx b/gl/src/TGLSAViewer.cxx index 4d7ed2b0c147ff8dbc3b0db7773f7412c98cc220..5dbe41ff102b3d8cdcde24bed785a6e6071f8653 100644 --- a/gl/src/TGLSAViewer.cxx +++ b/gl/src/TGLSAViewer.cxx @@ -1,4 +1,4 @@ -// @(#)root/gl:$Name: $:$Id: TGLSAViewer.cxx,v 1.24 2006/09/25 13:43:21 rdm Exp $ +// @(#)root/gl:$Name: $:$Id: TGLSAViewer.cxx,v 1.25 2006/09/26 08:07:18 rdm Exp $ // Author: Timur Pocheptsov / Richard Maunder /************************************************************************* @@ -25,6 +25,7 @@ #include "TGSplitter.h" #include "TColor.h" +#include "TVirtualPad.h" #include "TGedEditor.h" #include "TRootEmbeddedCanvas.h" #include "TString.h" @@ -195,7 +196,7 @@ TGLSAViewer::TGLSAViewer(TVirtualPad * pad) : fFrame->SetCleanup(kDeepCleanup); fLeftVerticalFrame->GetList()->AddFirst(fe); - fGedEditor->SetModel(fPad, this, kButton1); + fGedEditor->SetModel(fPad, this, kButton1Down); Show(); } @@ -245,7 +246,7 @@ TGLSAViewer::TGLSAViewer(TGFrame * parent, TVirtualPad * pad) : fFrame->SetCleanup(kDeepCleanup); fLeftVerticalFrame->GetList()->AddFirst(fe); - fGedEditor->SetModel(fPad, this, kButton1); + fGedEditor->SetModel(fPad, this, kButton1Down); Show(); } @@ -264,6 +265,14 @@ TGLSAViewer::~TGLSAViewer() delete fFrame; } +//______________________________________________________________________________ +void TGLSAViewer::RefreshPadEditor(TObject* changed) +{ + if (changed == 0 || fGedEditor->GetModel() == changed) { + fGedEditor->SetModel(fPad, fGedEditor->GetModel(), kButton1Down); + } +} + //______________________________________________________________________________ void TGLSAViewer::CreateMenus() { @@ -360,7 +369,7 @@ void TGLSAViewer::Show() { // Show the viewer fFrame->MapRaised(); - fGedEditor->SetModel(fPad, this, 0); + fGedEditor->SetModel(fPad, this, kButton1Down); RequestDraw(); } @@ -512,10 +521,10 @@ void TGLSAViewer::SelectionChanged() if (selected) { fPShapeWrap->fPShape = selected; - fGedEditor->SetModel(fPad, fPShapeWrap, kButton1); + fGedEditor->SetModel(fPad, fPShapeWrap, kButton1Down); } else { fPShapeWrap->fPShape = 0; - fGedEditor->SetModel(fPad, this, kButton1); + fGedEditor->SetModel(fPad, this, kButton1Down); } } diff --git a/gl/src/TGLScene.cxx b/gl/src/TGLScene.cxx index 706c24fd40c51f10677ee463d895d2d84369e595..03bcc8a2d73057f1e06f956e8c5369ad5b22e4cf 100644 --- a/gl/src/TGLScene.cxx +++ b/gl/src/TGLScene.cxx @@ -1,4 +1,4 @@ -// @(#)root/gl:$Name: $:$Id: TGLScene.cxx,v 1.42 2006/05/08 14:01:30 rdm Exp $ +// @(#)root/gl:$Name: $:$Id: TGLScene.cxx,v 1.43 2006/08/23 14:39:40 brun Exp $ // Author: Richard Maunder 25/05/2005 // Parts taken from original TGLRender by Timur Pocheptsov @@ -444,11 +444,8 @@ void TGLScene::Draw(const TGLCamera & camera, TGLDrawFlags sceneFlags, } // No clip - default single side lighting, // front polygons, cull (BACK) faces ok - if (sceneFlags.Style() == TGLDrawFlags::kFill) { - glClearColor(0.0, 0.0, 0.0, 1.0); // Black background for fill - } else { - glClearColor(1.0, 1.0, 1.0, 1.0); // White background for outline - reqFullDraws = 2; // Outline needs two full draws + if (sceneFlags.Style() == TGLDrawFlags::kOutline) { + reqFullDraws = 2; // Outline needs two full draws } break; @@ -456,7 +453,6 @@ void TGLScene::Draw(const TGLCamera & camera, TGLDrawFlags sceneFlags, case (TGLDrawFlags::kWireFrame): { glDisable(GL_LIGHTING); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - glClearColor(0.0, 0.0, 0.0, 1.0); // Black break; } default: { diff --git a/gl/src/TGLViewer.cxx b/gl/src/TGLViewer.cxx index fbdce730b8a7fe12e80c906e2f42cc719f82ab9d..53811f54f1e00ca0499c397f5be4312e76cd0b58 100644 --- a/gl/src/TGLViewer.cxx +++ b/gl/src/TGLViewer.cxx @@ -1,4 +1,4 @@ -// @(#)root/gl:$Name: $:$Id: TGLViewer.cxx,v 1.52 2006/08/23 14:39:40 brun Exp $ +// @(#)root/gl:$Name: $:$Id: TGLViewer.cxx,v 1.53 2006/08/23 15:32:48 brun Exp $ // Author: Richard Maunder 25/05/2005 /************************************************************************* @@ -98,6 +98,7 @@ TGLViewer::TGLViewer(TVirtualPad * pad, Int_t x, Int_t y, fAction(kCameraNone), fLastPos(0,0), fActiveButtonID(0), fDrawFlags(TGLDrawFlags::kFill, TGLDrawFlags::kLODHigh), fRedrawTimer(0), + fClearColor(1), fLightState(kLightMask), // All on fAxesType(kAxesNone), fReferenceOn(kFALSE), @@ -111,6 +112,7 @@ TGLViewer::TGLViewer(TVirtualPad * pad, Int_t x, Int_t y, fGLWindow(0), fGLDevice(-1), fPadEditor(0), + fIgnoreSizesOnUpdate(kFALSE), fResetCamerasOnUpdate(kTRUE), fResetCamerasOnNextUpdate(kFALSE), fResetCameraOnDoubleClick(kTRUE) @@ -145,6 +147,7 @@ TGLViewer::TGLViewer(TVirtualPad * pad) : fAction(kCameraNone), fLastPos(0,0), fActiveButtonID(0), fDrawFlags(TGLDrawFlags::kFill, TGLDrawFlags::kLODHigh), fRedrawTimer(0), + fClearColor(1), fLightState(kLightMask), // All on fAxesType(kAxesNone), fReferenceOn(kFALSE), @@ -158,6 +161,7 @@ TGLViewer::TGLViewer(TVirtualPad * pad) : fGLWindow(0), fGLDevice(fPad->GetGLDevice()), fPadEditor(0), + fIgnoreSizesOnUpdate(kFALSE), fResetCamerasOnUpdate(kTRUE), fResetCamerasOnNextUpdate(kFALSE), fResetCameraOnDoubleClick(kTRUE) @@ -502,8 +506,8 @@ Int_t TGLViewer::AddObject(UInt_t physicalID, const TBuffer3D & buffer, Bool_t * if (!box.IsEmpty()) { // Test transformed box with camera box.Transform(TGLMatrix(buffer.fLocalMaster)); - Bool_t ofInterest = CurrentCamera().OfInterest - (box, logical ? logical->IgnoreSizeForOfInterest() : kTRUE); + Bool_t ignoreSize = fIgnoreSizesOnUpdate || !logical || logical->IgnoreSizeForOfInterest(); + Bool_t ofInterest = CurrentCamera().OfInterest(box, ignoreSize); // For external PID request children if physical of interest if (addChildren &&!fInternalPIDs) { @@ -885,6 +889,21 @@ void TGLViewer::ResetCurrentCamera() CurrentCamera().Reset(); } +//______________________________________________________________________________ +void TGLViewer::UpdateScene() +{ + // Force a scene update. + // Code segments taken from protected RebuildScene(). + + // We are going to rebuild the scene - ensure any pending redraw timer cancelled now + fRedrawTimer->Stop(); + + // Pretend the update request came from outside. + fInternalRebuild = kFALSE; + + fPad->Paint(); +} + //______________________________________________________________________________ void TGLViewer::SetupLights() { @@ -1137,18 +1156,13 @@ void TGLViewer::PreDraw() InitGL(); } - - 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.); - } + // For embedded gl clear color must be pad's background color. + Color_t ci = (fGLDevice != -1) ? gPad->GetFillColor() : fClearColor; + 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); @@ -1798,7 +1812,12 @@ Bool_t TGLViewer::HandleButton(Event_t * event) if (!fContextMenu) { fContextMenu = new TContextMenu("glcm", "GL Viewer Context Menu"); } - selected->InvokeContextMenu(*fContextMenu, event->fX, event->fY); + Int_t x, y; + Window_t childdum; + gVirtualX->TranslateCoordinates(fGLWindow->GetId(), + gClient->GetDefaultRoot()->GetId(), + event->fX, event->fY, x, y, childdum); + selected->InvokeContextMenu(*fContextMenu, x, y); // MT-TODO: Find a way to request redraw after dialog has finished. } } else { @@ -1916,16 +1935,28 @@ Bool_t TGLViewer::HandleKey(Event_t *event) case kKey_R: case kKey_r: fDrawFlags.SetStyle(TGLDrawFlags::kFill); + if (fClearColor == 0) { + fClearColor = 1; // Black + RefreshPadEditor(this); + } redraw = kTRUE; break; case kKey_W: case kKey_w: fDrawFlags.SetStyle(TGLDrawFlags::kWireFrame); + if (fClearColor == 0) { + fClearColor = 1; // Black + RefreshPadEditor(this); + } redraw = kTRUE; break; case kKey_T: case kKey_t: fDrawFlags.SetStyle(TGLDrawFlags::kOutline); + if (fClearColor == 1) { + fClearColor = 0; // White + RefreshPadEditor(this); + } redraw = kTRUE; break; case kKey_V: diff --git a/gl/src/TGLViewerEditor.cxx b/gl/src/TGLViewerEditor.cxx index 2a33e3375460679d5a4b9c2b584708b33d7a3aa2..256a8955a7d173ea8c258756d971ec72f9a25ccb 100644 --- a/gl/src/TGLViewerEditor.cxx +++ b/gl/src/TGLViewerEditor.cxx @@ -3,9 +3,11 @@ #include "TGedEditor.h" #include "TGNumberEntry.h" #include "TGButtonGroup.h" +#include "TGColorSelect.h" #include "TVirtualGL.h" #include "TG3DLine.h" #include "TGButton.h" +#include "TColor.h" #include "TString.h" #include "TGLabel.h" #include "TClass.h" @@ -32,6 +34,12 @@ TGLViewerEditor::TGLViewerEditor(const TGWindow *p, Int_t width, Int_t height, fBottomLight(0), fLeftLight(0), fFrontLight(0), + fClearColor(0), + fIgnoreSizesOnUpdate(0), + fResetCamerasOnUpdate(0), + fResetCameraOnDoubleClick(0), + fUpdateScene(0), + fCameraHome(0), fAxesContainer(0), fAxesNone(0), fAxesEdge(0), @@ -78,6 +86,13 @@ void TGLViewerEditor::ConnectSignals2Slots() fLeftLight->Connect("Clicked()", "TGLViewerEditor", this, "DoButton()"); fFrontLight->Connect("Clicked()", "TGLViewerEditor", this, "DoButton()"); + fClearColor->Connect("ColorSelected(Pixel_t)", "TGLViewerEditor", this, "DoClearColor(Pixel_t)"); + fIgnoreSizesOnUpdate->Connect("Toggled(Bool_t)", "TGLViewerEditor", this, "DoIgnoreSizesOnUpdate()"); + fResetCamerasOnUpdate->Connect("Toggled(Bool_t)", "TGLViewerEditor", this, "DoResetCamerasOnUpdate()"); + fResetCameraOnDoubleClick->Connect("Toggled(Bool_t)", "TGLViewerEditor", this, "DoResetCameraOnDoubleClick()"); + fUpdateScene->Connect("Pressed()", "TGLViewerEditor", this, "DoUpdateScene()"); + fCameraHome->Connect("Pressed()", "TGLViewerEditor", this, "DoCameraHome()"); + fAxesContainer->Connect("Pressed(Int_t)", "TGLViewerEditor", this, "UpdateViewerGuides()"); fReferenceOn->Connect("Clicked()", "TGLViewerEditor", this, "UpdateViewerGuides()"); fReferencePosX->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateViewerGuides()"); @@ -131,6 +146,11 @@ void TGLViewerEditor::SetModel(TObject* obj) if(ls & TGLViewer::kLightFront) fFrontLight->SetState(kButtonDown); + + fClearColor->SetColor(TColor::Number2Pixel(fViewer->GetClearColor()), kFALSE); + fIgnoreSizesOnUpdate->SetState(fViewer->GetIgnoreSizesOnUpdate() ? kButtonDown : kButtonUp); + fResetCamerasOnUpdate->SetState(fViewer->GetResetCamerasOnUpdate() ? kButtonDown : kButtonUp); + fResetCameraOnDoubleClick->SetState(fViewer->GetResetCameraOnDoubleClick() ? kButtonDown : kButtonUp); } //______________________________________________________________________________ @@ -141,6 +161,58 @@ void TGLViewerEditor::DoButton() fViewer->ToggleLight(TGLViewer::ELight(((TGButton *) gTQSender)->WidgetId())); } +//______________________________________________________________________________ +void TGLViewerEditor::DoClearColor(Pixel_t color) +{ + // Clear-color was changed. + + fViewer->SetClearColor(Color_t(TColor::GetColor(color))); + fViewer->RequestDraw(); +} + +//______________________________________________________________________________ +void TGLViewerEditor::DoIgnoreSizesOnUpdate() +{ + // ResetCamerasOnUpdate was toggled. + + fViewer->SetIgnoreSizesOnUpdate(fIgnoreSizesOnUpdate->IsOn()); + if (fIgnoreSizesOnUpdate->IsOn()) + fViewer->UpdateScene(); +} + +//______________________________________________________________________________ +void TGLViewerEditor::DoResetCamerasOnUpdate() +{ + // ResetCamerasOnUpdate was toggled. + + fViewer->SetResetCamerasOnUpdate(fResetCamerasOnUpdate->IsOn()); +} + +//______________________________________________________________________________ +void TGLViewerEditor::DoResetCameraOnDoubleClick() +{ + // ResetCameraOnDoubleClick was toggled. + + fViewer->SetResetCameraOnDoubleClick(fResetCameraOnDoubleClick->IsOn()); +} + +//______________________________________________________________________________ +void TGLViewerEditor::DoUpdateScene() +{ + // ResetCameraOnDoubleClick was toggled. + + fViewer->UpdateScene(); +} + +//______________________________________________________________________________ +void TGLViewerEditor::DoCameraHome() +{ + // ResetCameraOnDoubleClick was toggled. + + fViewer->ResetCurrentCamera(); + fViewer->RequestDraw(); +} + //______________________________________________________________________________ void TGLViewerEditor::UpdateViewerGuides() { @@ -184,6 +256,30 @@ void TGLViewerEditor::CreateLightsTab() fLightFrame->AddFrame(fBottomLight); fLightFrame->AddFrame(fLeftLight); fLightFrame->AddFrame(fFrontLight); + + { + TGHorizontalFrame* hf = new TGHorizontalFrame(this); + TGLabel* lab = new TGLabel(hf, "Clear color"); + hf->AddFrame(lab, new TGLayoutHints(kLHintsLeft|kLHintsBottom, 1, 12, 1, 3)); + fClearColor = new TGColorSelect(hf, 0, -1); + hf->AddFrame(fClearColor, new TGLayoutHints(kLHintsLeft, 1, 1, 1, 1)); + AddFrame(hf, new TGLayoutHints(kLHintsLeft, 2, 1, 1, 1)); + } + + MakeTitle("Update behaviour"); + fIgnoreSizesOnUpdate = new TGCheckButton(this, "Ignore sizes"); + fIgnoreSizesOnUpdate->SetToolTipText("Ignore bounding-box sizes on scene update"); + AddFrame(fIgnoreSizesOnUpdate, new TGLayoutHints(kLHintsLeft, 4, 1, 1, 1)); + fResetCamerasOnUpdate = new TGCheckButton(this, "Reset on update"); + fResetCamerasOnUpdate->SetToolTipText("Reset camera on scene update"); + AddFrame(fResetCamerasOnUpdate, new TGLayoutHints(kLHintsLeft, 4, 1, 1, 1)); + fResetCameraOnDoubleClick = new TGCheckButton(this, "Reset on dbl-click"); + fResetCameraOnDoubleClick->SetToolTipText("Reset cameras on double-click"); + AddFrame(fResetCameraOnDoubleClick, new TGLayoutHints(kLHintsLeft, 4, 1, 1, 1)); + fUpdateScene = new TGTextButton(this, "Update Scene"); + AddFrame(fUpdateScene, new TGLayoutHints(kLHintsLeft|kLHintsExpandX, 4, 1, 1, 1)); + fCameraHome = new TGTextButton(this, "Camera Home"); + AddFrame(fCameraHome, new TGLayoutHints(kLHintsLeft|kLHintsExpandX, 4, 1, 1, 1)); } //______________________________________________________________________________