TGLViewerEditor.cxx

Go to the documentation of this file.
00001 // @(#)root/gl:$Id$
00002 // Author:  Alja Mrak-Tadel, Matevz Tadel, Timur Pocheptsov 08/03/2006
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2006, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 #include <cstring>
00013 
00014 #include "TGedEditor.h"
00015 #include "TGNumberEntry.h"
00016 #include "TGButtonGroup.h"
00017 #include "TGColorSelect.h"
00018 #include "TVirtualGL.h"
00019 #include "TG3DLine.h"
00020 #include "TGButton.h"
00021 #include "TColor.h"
00022 #include "TString.h"
00023 #include "TGLabel.h"
00024 #include "TClass.h"
00025 #include "TGTab.h"
00026 #include "TGComboBox.h"
00027 
00028 #include "TGLViewerEditor.h"
00029 #include "TGLViewer.h"
00030 #include "TGLLightSetEditor.h"
00031 #include "TGLClipSetEditor.h"
00032 #include "TGLUtil.h"
00033 #include "TGLCameraOverlay.h"
00034 #include "TGLAutoRotator.h"
00035 
00036 //______________________________________________________________________________
00037 //
00038 // GUI editor for TGLViewer.
00039 
00040 ClassImp(TGLViewerEditor);
00041 
00042 //______________________________________________________________________________
00043 TGLViewerEditor::TGLViewerEditor(const TGWindow *p,  Int_t width, Int_t height, UInt_t options, Pixel_t back) :
00044    TGedFrame(p,  width, height, options | kVerticalFrame, back),
00045    fGuidesFrame(0),
00046    fClipFrame(0),
00047    fClearColor(0),
00048    fIgnoreSizesOnUpdate(0),
00049    fResetCamerasOnUpdate(0),
00050    fUpdateScene(0),
00051    fCameraHome(0),
00052    fMaxSceneDrawTimeHQ(0),
00053    fMaxSceneDrawTimeLQ(0),
00054    fPointSizeScale(0),  fLineWidthScale(0),
00055    fPointSmooth(0),     fLineSmooth(0),
00056    fWFLineWidth(0),     fOLLineWidth(0),
00057 
00058    fCameraCenterExt(0),
00059    fCaptureCenter(0),
00060    fCameraCenterX(0),
00061    fCameraCenterY(0),
00062    fCameraCenterZ(0),
00063    fCaptureAnnotate(),
00064    fAxesType(0),
00065    fAxesContainer(0),
00066    fAxesNone(0),
00067    fAxesEdge(0),
00068    fAxesOrigin(0),
00069    fAxesDepthTest(0),
00070    fRefContainer(0),
00071    fReferenceOn(0),
00072    fReferencePosX(0),
00073    fReferencePosY(0),
00074    fReferencePosZ(0),
00075    fCamContainer(0),
00076    fCamMode(0),
00077    fCamOverlayOn(0),
00078    fClipSet(0),
00079    fARotDt(0), fARotWPhi(0), fARotATheta(0), fARotWTheta(0), fARotADolly(0), fARotWDolly(0),
00080    fStereoZeroParallax(0), fStereoEyeOffsetFac(0), fStereoFrustumAsymFac(0),
00081    fViewer(0),
00082    fIsInPad(kTRUE)
00083 {
00084   //  Constructor.
00085 
00086    CreateStyleTab();
00087    CreateGuidesTab();
00088    CreateClippingTab();
00089    CreateExtrasTab();
00090 }
00091 
00092 //______________________________________________________________________________
00093 
00094 TGLViewerEditor::~TGLViewerEditor()
00095 {
00096    // Destructor.
00097 
00098 }
00099 
00100 //______________________________________________________________________________
00101 void TGLViewerEditor::ConnectSignals2Slots()
00102 {
00103    // Connect signals to slots.
00104 
00105    fClearColor->Connect("ColorSelected(Pixel_t)", "TGLViewerEditor", this, "DoClearColor(Pixel_t)");
00106    fIgnoreSizesOnUpdate->Connect("Toggled(Bool_t)", "TGLViewerEditor", this, "DoIgnoreSizesOnUpdate()");
00107    fResetCamerasOnUpdate->Connect("Toggled(Bool_t)", "TGLViewerEditor", this, "DoResetCamerasOnUpdate()");
00108    fUpdateScene->Connect("Pressed()", "TGLViewerEditor", this, "DoUpdateScene()");
00109    fCameraHome->Connect("Pressed()", "TGLViewerEditor", this, "DoCameraHome()");
00110    fMaxSceneDrawTimeHQ->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateMaxDrawTimes()");
00111    fMaxSceneDrawTimeLQ->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateMaxDrawTimes()");
00112    fPointSizeScale->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdatePointLineStuff()");
00113    fLineWidthScale->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdatePointLineStuff()");
00114    fPointSmooth->Connect("Clicked()", "TGLViewerEditor", this, "UpdatePointLineStuff()");
00115    fLineSmooth ->Connect("Clicked()", "TGLViewerEditor", this, "UpdatePointLineStuff()");
00116    fWFLineWidth->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdatePointLineStuff()");
00117    fOLLineWidth->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdatePointLineStuff()");
00118 
00119    fCameraCenterExt->Connect("Clicked()", "TGLViewerEditor", this, "DoCameraCenterExt()");
00120    fCaptureCenter->Connect("Clicked()", "TGLViewerEditor", this, "DoCaptureCenter()");
00121    fDrawCameraCenter->Connect("Clicked()", "TGLViewerEditor", this, "DoDrawCameraCenter()");
00122    fCameraCenterX->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateCameraCenter()");
00123    fCameraCenterY->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateCameraCenter()");
00124    fCameraCenterZ->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateCameraCenter()");
00125 
00126    fCaptureAnnotate->Connect("Clicked()", "TGLViewerEditor", this, "DoAnnotation()");
00127 
00128    fAxesContainer->Connect("Clicked(Int_t)", "TGLViewerEditor", this, "UpdateViewerAxes(Int_t)");
00129 
00130    fReferenceOn->Connect("Clicked()", "TGLViewerEditor", this, "UpdateViewerReference()");
00131    fReferencePosX->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateViewerReference()");
00132    fReferencePosY->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateViewerReference()");
00133    fReferencePosZ->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateViewerReference()");
00134 
00135    fCamMode->Connect("Selected(Int_t)", "TGLViewerEditor", this, "DoCameraOverlay()");
00136    fCamOverlayOn->Connect("Clicked()", "TGLViewerEditor", this, "DoCameraOverlay()");
00137 
00138    fARotDt    ->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateRotator()");
00139    fARotWPhi  ->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateRotator()");
00140    fARotATheta->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateRotator()");
00141    fARotWTheta->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateRotator()");
00142    fARotADolly->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateRotator()");
00143    fARotWDolly->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateRotator()");
00144 
00145    fStereoZeroParallax  ->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateStereo()");
00146    fStereoEyeOffsetFac  ->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateStereo()");
00147    fStereoFrustumAsymFac->Connect("ValueSet(Long_t)", "TGLViewerEditor", this, "UpdateStereo()");
00148    fStereoZeroParallax  ->Connect("ValueChanged(Long_t)", "TGLViewerEditor", this, "UpdateStereo()");
00149    fStereoEyeOffsetFac  ->Connect("ValueChanged(Long_t)", "TGLViewerEditor", this, "UpdateStereo()");
00150    fStereoFrustumAsymFac->Connect("ValueChanged(Long_t)", "TGLViewerEditor", this, "UpdateStereo()");
00151 
00152    fInit = kFALSE;
00153 }
00154 
00155 //______________________________________________________________________________
00156 void TGLViewerEditor::ViewerRedraw()
00157 {
00158    // Initiate redraw of the viewer.
00159 
00160    if (gGLManager && fIsInPad)
00161       gGLManager->MarkForDirectCopy(fViewer->GetDev(), kTRUE);
00162    fViewer->RequestDraw();
00163 }
00164 
00165 //______________________________________________________________________________
00166 void TGLViewerEditor::SetModel(TObject* obj)
00167 {
00168    // Sets model or disables/hides viewer.
00169 
00170    fViewer = 0;
00171 
00172    fViewer = static_cast<TGLViewer *>(obj);
00173    fIsInPad = (fViewer->GetDev() != -1);
00174 
00175    SetGuides();
00176 
00177    if (fInit)
00178       ConnectSignals2Slots();
00179 
00180    fLightSet->SetModel(fViewer->GetLightSet());
00181    fClipSet->SetModel(fViewer->GetClipSet());
00182 
00183    // style tab
00184    fClearColor->SetColor(TColor::Number2Pixel(fViewer->RnrCtx().ColorSet().Background().GetColorIndex()), kFALSE);
00185    fClearColor->Enable(!fViewer->IsUsingDefaultColorSet());
00186    fIgnoreSizesOnUpdate->SetState(fViewer->GetIgnoreSizesOnUpdate() ? kButtonDown : kButtonUp);
00187    fResetCamerasOnUpdate->SetState(fViewer->GetResetCamerasOnUpdate() ? kButtonDown : kButtonUp);
00188    fMaxSceneDrawTimeHQ->SetNumber(fViewer->GetMaxSceneDrawTimeHQ());
00189    fMaxSceneDrawTimeLQ->SetNumber(fViewer->GetMaxSceneDrawTimeLQ());
00190    fPointSizeScale->SetNumber(fViewer->GetPointScale());
00191    fLineWidthScale->SetNumber(fViewer->GetLineScale ());
00192    fPointSmooth->SetState(fViewer->GetSmoothPoints() ? kButtonDown : kButtonUp);
00193    fLineSmooth ->SetState(fViewer->GetSmoothLines () ? kButtonDown : kButtonUp);
00194    fWFLineWidth->SetNumber(fViewer->WFLineW());
00195    fOLLineWidth->SetNumber(fViewer->OLLineW());
00196    //camera look at
00197    TGLCamera & cam = fViewer->CurrentCamera();
00198    fCameraCenterExt->SetDown(cam.GetExternalCenter());
00199    fDrawCameraCenter->SetDown(fViewer->GetDrawCameraCenter());
00200    Double_t* la = cam.GetCenterVec();
00201    fCameraCenterX->SetNumber(la[0]);
00202    fCameraCenterY->SetNumber(la[1]);
00203    fCameraCenterZ->SetNumber(la[2]);
00204    fCameraCenterX->SetState(fCameraCenterExt->IsDown());
00205    fCameraCenterY->SetState(fCameraCenterExt->IsDown());
00206    fCameraCenterZ->SetState(fCameraCenterExt->IsDown());
00207 
00208    // push action
00209    fCaptureCenter->SetTextColor((fViewer->GetPushAction() == TGLViewer::kPushCamCenter) ? 0xa03060 : 0x000000);
00210    fCaptureAnnotate->SetDown( (fViewer->GetPushAction() == TGLViewer::kPushAnnotate), kFALSE);
00211 
00212    {
00213       TGLAutoRotator *r = fViewer->GetAutoRotator();
00214 
00215       fARotDt    ->SetNumber(r->GetDt());
00216       fARotWPhi  ->SetNumber(r->GetWPhi());
00217       fARotATheta->SetNumber(r->GetATheta());
00218       fARotWTheta->SetNumber(r->GetWTheta());
00219       fARotADolly->SetNumber(r->GetADolly());
00220       fARotWDolly->SetNumber(r->GetWDolly());
00221    }
00222 
00223    if (fViewer->GetStereo())
00224    {
00225       fStereoZeroParallax  ->SetNumber(fViewer->GetStereoZeroParallax());
00226       fStereoEyeOffsetFac  ->SetNumber(fViewer->GetStereoEyeOffsetFac());
00227       fStereoFrustumAsymFac->SetNumber(fViewer->GetStereoFrustumAsymFac());
00228       fStereoFrame->MapWindow();
00229    }
00230    else
00231    {
00232       fStereoFrame->UnmapWindow();
00233    }
00234 }
00235 
00236 //______________________________________________________________________________
00237 void TGLViewerEditor::DoClearColor(Pixel_t color)
00238 {
00239    // Clear-color was changed.
00240 
00241    fViewer->RnrCtx().ColorSet().Background().SetColor(Color_t(TColor::GetColor(color)));
00242    ViewerRedraw();
00243 }
00244 
00245 //______________________________________________________________________________
00246 void TGLViewerEditor::DoIgnoreSizesOnUpdate()
00247 {
00248    // ResetCamerasOnUpdate was toggled.
00249 
00250    fViewer->SetIgnoreSizesOnUpdate(fIgnoreSizesOnUpdate->IsOn());
00251    if (fIgnoreSizesOnUpdate->IsOn())
00252       fViewer->UpdateScene();
00253 }
00254 
00255 //______________________________________________________________________________
00256 void TGLViewerEditor::DoResetCamerasOnUpdate()
00257 {
00258    // ResetCamerasOnUpdate was toggled.
00259 
00260    fViewer->SetResetCamerasOnUpdate(fResetCamerasOnUpdate->IsOn());
00261 }
00262 
00263 //______________________________________________________________________________
00264 void TGLViewerEditor::DoUpdateScene()
00265 {
00266    // UpdateScene was clicked.
00267 
00268    fViewer->UpdateScene();
00269 }
00270 
00271 //______________________________________________________________________________
00272 void TGLViewerEditor::DoCameraHome()
00273 {
00274    // CameraHome was clicked.
00275 
00276    fViewer->ResetCurrentCamera();
00277    ViewerRedraw();
00278 }
00279 
00280 //______________________________________________________________________________
00281 void TGLViewerEditor::UpdateMaxDrawTimes()
00282 {
00283    // Slot for fMaxSceneDrawTimeHQ and fMaxSceneDrawTimeLQ.
00284 
00285    fViewer->SetMaxSceneDrawTimeHQ(fMaxSceneDrawTimeHQ->GetNumber());
00286    fViewer->SetMaxSceneDrawTimeLQ(fMaxSceneDrawTimeLQ->GetNumber());
00287 }
00288 
00289 //______________________________________________________________________________
00290 void TGLViewerEditor::UpdatePointLineStuff()
00291 {
00292    // Slot for point-sizes and line-widths.
00293 
00294    fViewer->SetPointScale(fPointSizeScale->GetNumber());
00295    fViewer->SetLineScale (fLineWidthScale->GetNumber());
00296    fViewer->SetSmoothPoints(fPointSmooth->IsDown());
00297    fViewer->SetSmoothLines (fLineSmooth->IsDown());
00298    fViewer->SetWFLineW(fWFLineWidth->GetNumber());
00299    fViewer->SetOLLineW(fOLLineWidth->GetNumber());
00300    ViewerRedraw();
00301 }
00302 
00303 //______________________________________________________________________________
00304 void TGLViewerEditor::DoCameraOverlay()
00305 {
00306    // Update viewer with GUI state.
00307 
00308    TGLCameraOverlay* co = fViewer->GetCameraOverlay();
00309 
00310    if (fViewer->CurrentCamera().IsPerspective())
00311    {
00312       co->SetShowPerspective(fCamOverlayOn->IsDown());
00313       co->SetPerspectiveMode((TGLCameraOverlay::EMode)fCamMode->GetSelected());
00314    }
00315    else
00316    {
00317       co->SetShowOrthographic(fCamOverlayOn->IsDown());
00318       co->SetOrthographicMode((TGLCameraOverlay::EMode)fCamMode->GetSelected());
00319    }
00320    ViewerRedraw();
00321 }
00322 
00323 //______________________________________________________________________________
00324 void TGLViewerEditor::DoCameraCenterExt()
00325 {
00326    // Set external camera center.
00327 
00328    TGLCamera& cam = fViewer->CurrentCamera();
00329    cam.SetExternalCenter(fCameraCenterExt->IsDown());
00330 
00331    fCameraCenterX->SetState(fCameraCenterExt->IsDown());
00332    fCameraCenterY->SetState(fCameraCenterExt->IsDown());
00333    fCameraCenterZ->SetState(fCameraCenterExt->IsDown());
00334 
00335    ViewerRedraw();
00336 }
00337 
00338 //______________________________________________________________________________
00339 void TGLViewerEditor::DoCaptureCenter()
00340 {
00341    // Capture camera-center via picking.
00342 
00343    fViewer->PickCameraCenter();
00344    ViewerRedraw();
00345 }
00346 
00347 //______________________________________________________________________________
00348 void TGLViewerEditor::DoDrawCameraCenter()
00349 {
00350    // Draw camera center.
00351 
00352    fViewer->SetDrawCameraCenter(fDrawCameraCenter->IsDown());
00353    ViewerRedraw();
00354 }
00355 
00356 //______________________________________________________________________________
00357 void TGLViewerEditor::UpdateCameraCenter()
00358 {
00359    // Update current camera with GUI state.
00360 
00361    TGLCamera& cam = fViewer->CurrentCamera();
00362    cam.SetCenterVec(fCameraCenterX->GetNumber(), fCameraCenterY->GetNumber(), fCameraCenterZ->GetNumber());
00363    ViewerRedraw();
00364 }
00365 
00366 //______________________________________________________________________________
00367 void TGLViewerEditor::DoAnnotation()
00368 {
00369    // Create annotation via picking.
00370 
00371    fViewer->PickAnnotate();
00372 }
00373 
00374 //______________________________________________________________________________
00375 void TGLViewerEditor::UpdateViewerAxes(Int_t id)
00376 {
00377    // Update viewer with GUI state.
00378 
00379    if(id < 4)
00380    {
00381       fAxesType = id -1;
00382       for (Int_t i = 1; i < 4; i++) {
00383          TGButton * button = fAxesContainer->GetButton(i);
00384          if (i == id)
00385             button->SetDown(kTRUE);
00386          else
00387             button->SetDown(kFALSE);
00388       }
00389    }
00390    Bool_t axdt = fAxesContainer->GetButton(4)->IsDown();
00391    const Double_t refPos[] = {fReferencePosX->GetNumber(), fReferencePosY->GetNumber(), fReferencePosZ->GetNumber()};
00392    fViewer->SetGuideState(fAxesType, axdt, fReferenceOn->IsDown(), refPos);
00393    UpdateReferencePosState();
00394 }
00395 
00396 //______________________________________________________________________________
00397 void TGLViewerEditor::UpdateViewerReference()
00398 {
00399    // Update viewer with GUI state.
00400 
00401    const Double_t refPos[] = {fReferencePosX->GetNumber(), fReferencePosY->GetNumber(), fReferencePosZ->GetNumber()};
00402    fViewer->SetGuideState(fAxesType,  fAxesContainer->GetButton(4)->IsDown(), fReferenceOn->IsDown(), refPos);
00403    UpdateReferencePosState();
00404 }
00405 
00406 //______________________________________________________________________________
00407 TGNumberEntry* TGLViewerEditor::MakeLabeledNEntry(TGCompositeFrame* p, const char* name,
00408                                                   Int_t labelw,Int_t nd, Int_t style)
00409 {
00410    // Helper function to create fixed width TGLabel and TGNumberEntry in same row.
00411 
00412    TGHorizontalFrame *rfr   = new TGHorizontalFrame(p);
00413    TGHorizontalFrame *labfr = new TGHorizontalFrame(rfr, labelw, 20, kFixedSize);
00414    TGLabel           *lab   = new TGLabel(labfr, name);
00415    labfr->AddFrame(lab, new TGLayoutHints(kLHintsLeft | kLHintsBottom, 0, 0, 0) );
00416    rfr->AddFrame(labfr, new TGLayoutHints(kLHintsLeft | kLHintsBottom, 0, 0, 0));
00417 
00418    TGNumberEntry* ne = new TGNumberEntry(rfr, 0.0f, nd, -1, (TGNumberFormat::EStyle)style);
00419    rfr->AddFrame(ne, new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsBottom, 2, 0, 0));
00420 
00421    p->AddFrame(rfr, new TGLayoutHints(kLHintsLeft, 0, 0, 1, 0));
00422    return ne;
00423 }
00424 
00425 //______________________________________________________________________________
00426 void TGLViewerEditor::CreateStyleTab()
00427 {
00428    // Creates "Style" tab.
00429 
00430    MakeTitle("Update behaviour");
00431    fIgnoreSizesOnUpdate  = new TGCheckButton(this, "Ignore sizes");
00432    fIgnoreSizesOnUpdate->SetToolTipText("Ignore bounding-box sizes on scene update");
00433    AddFrame(fIgnoreSizesOnUpdate, new TGLayoutHints(kLHintsLeft, 4, 1, 1, 1));
00434    fResetCamerasOnUpdate = new TGCheckButton(this, "Reset on update");
00435    fResetCamerasOnUpdate->SetToolTipText("Reset camera on scene update");
00436    AddFrame(fResetCamerasOnUpdate, new TGLayoutHints(kLHintsLeft, 4, 1, 1, 1));
00437 
00438    TGCompositeFrame* af = this;
00439    fUpdateScene = new TGTextButton(af, "Update Scene", 130);
00440    af->AddFrame(fUpdateScene, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 1, 1, 8, 1));
00441    fCameraHome = new TGTextButton(af, "Camera Home", 130);
00442    af->AddFrame(fCameraHome, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 1, 1, 1, 3));
00443    fMaxSceneDrawTimeHQ = MakeLabeledNEntry(af, "Max HQ draw time:", 120, 6, TGNumberFormat::kNESInteger);
00444    fMaxSceneDrawTimeHQ->SetLimits(TGNumberFormat::kNELLimitMin, 0, 1e6);
00445    fMaxSceneDrawTimeHQ->GetNumberEntry()->SetToolTipText("Maximum time spent in scene drawing\nin high-quality mode [ms].");
00446    fMaxSceneDrawTimeLQ = MakeLabeledNEntry(af, "Max LQ draw time:", 120, 6, TGNumberFormat::kNESInteger);
00447    fMaxSceneDrawTimeLQ->SetLimits(TGNumberFormat::kNELLimitMin, 0, 1e6);
00448    fMaxSceneDrawTimeLQ->GetNumberEntry()->SetToolTipText("Maximum time spent in scene drawing\nin low-quality mode (during rotation etc).");
00449 
00450    TGHorizontalFrame* hf = new TGHorizontalFrame(this);
00451    TGLabel* lab = new TGLabel(hf, "Clear Color");
00452    hf->AddFrame(lab, new TGLayoutHints(kLHintsLeft|kLHintsBottom, 1, 4, 8, 3));
00453    fClearColor = new TGColorSelect(hf, 0, -1);
00454    hf->AddFrame(fClearColor, new TGLayoutHints(kLHintsLeft, 1, 1, 8, 1));
00455    AddFrame(hf, new TGLayoutHints(kLHintsLeft, 2, 1, 1, 1));
00456 
00457    // LightSet
00458    fLightSet = new TGLLightSetSubEditor(this);
00459    fLightSet->Connect("Changed()", "TGLViewerEditor", this, "ViewerRedraw()");
00460    AddFrame(fLightSet, new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 0, 0, 0));
00461 
00462    // Point-sizes / line-widths.
00463    hf = new TGHorizontalFrame(af);
00464    fPointSizeScale = MakeLabeledNEntry(hf, "Point-size scale:", 116, 4, TGNumberFormat::kNESRealOne);
00465    fPointSizeScale->SetLimits(TGNumberFormat::kNELLimitMinMax, 0.1, 16);
00466    fPointSmooth = new TGCheckButton(hf);
00467    fPointSmooth->SetToolTipText("Use smooth points.");
00468    hf->AddFrame(fPointSmooth, new TGLayoutHints(kLHintsNormal, 3, 0, 3, 0));
00469    af->AddFrame(hf);
00470    hf = new TGHorizontalFrame(af);
00471    fLineWidthScale = MakeLabeledNEntry(hf, "Line-width scale:", 116, 4, TGNumberFormat::kNESRealOne);
00472    fLineWidthScale->SetLimits(TGNumberFormat::kNELLimitMinMax, 0.1, 16);
00473    fLineSmooth = new TGCheckButton(hf);
00474    fLineSmooth->SetToolTipText("Use smooth lines.");
00475    hf->AddFrame(fLineSmooth, new TGLayoutHints(kLHintsNormal, 3, 0, 3, 0));
00476    af->AddFrame(hf);
00477    fWFLineWidth = MakeLabeledNEntry(af, "Wireframe line-width:", 116, 4, TGNumberFormat::kNESRealOne);
00478    fWFLineWidth->SetLimits(TGNumberFormat::kNELLimitMinMax, 0.1, 16);
00479    fOLLineWidth = MakeLabeledNEntry(af, "Outline line-width:", 116, 4, TGNumberFormat::kNESRealOne);
00480    fOLLineWidth->SetLimits(TGNumberFormat::kNELLimitMinMax, 0.1, 16);
00481 }
00482 
00483 //______________________________________________________________________________
00484 void TGLViewerEditor::CreateGuidesTab()
00485 {
00486    // Create "Guides" tab.
00487    fGuidesFrame = CreateEditorTabSubFrame("Guides");
00488 
00489    // external camera look at point
00490    TGGroupFrame* grf = new TGGroupFrame(fGuidesFrame, "Camera center:", kVerticalFrame);
00491    fDrawCameraCenter = new TGCheckButton(grf, "Show", 50);
00492    grf->AddFrame(fDrawCameraCenter, new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 0, 1, 1));
00493    fCameraCenterExt = new TGCheckButton(grf, "External", 50);
00494    grf->AddFrame(fCameraCenterExt, new TGLayoutHints(kLHintsLeft, 0, 0, 1, 0));
00495    fGuidesFrame->AddFrame(grf, new TGLayoutHints(kLHintsTop| kLHintsLeft | kLHintsExpandX, 2, 3, 3, 0));
00496    Int_t labw = 20;
00497    fCameraCenterX = MakeLabeledNEntry(grf, "X:", labw, 8, TGNumberFormat::kNESRealThree);
00498    fCameraCenterY = MakeLabeledNEntry(grf, "Y:", labw, 8, TGNumberFormat::kNESRealThree);
00499    fCameraCenterZ = MakeLabeledNEntry(grf, "Z:", labw, 8, TGNumberFormat::kNESRealThree);
00500    fCaptureCenter = new TGTextButton(grf, " Pick center ");
00501    grf->AddFrame(fCaptureCenter, new TGLayoutHints(kLHintsNormal, labw + 2, 0, 2, 0));
00502 
00503    // annotate
00504    TGGroupFrame* annf  = new TGGroupFrame(fGuidesFrame, "Annotation");
00505    fGuidesFrame->AddFrame(annf, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 3, 0, 0));
00506    fCaptureAnnotate = new TGCheckButton(annf, "Pick annotation");
00507    annf->AddFrame(fCaptureAnnotate, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX));
00508 
00509    // reference container
00510    fRefContainer = new TGGroupFrame(fGuidesFrame, "Reference marker");
00511    fGuidesFrame->AddFrame(fRefContainer, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 3, 0, 0));
00512    fReferenceOn = new TGCheckButton(fRefContainer, "Show");
00513    fRefContainer->AddFrame(fReferenceOn, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX));
00514    fReferencePosX = MakeLabeledNEntry(fRefContainer, "X:", labw, 8, TGNumberFormat::kNESRealThree );
00515    fReferencePosY = MakeLabeledNEntry(fRefContainer, "Y:", labw, 8, TGNumberFormat::kNESRealThree );
00516    fReferencePosZ = MakeLabeledNEntry(fRefContainer, "Z:", labw, 8, TGNumberFormat::kNESRealThree );
00517 
00518    // axes
00519    fAxesContainer = new TGButtonGroup(fGuidesFrame, "Axes");
00520    fAxesNone = new TGRadioButton(fAxesContainer, "None", 1);
00521    fAxesEdge = new TGRadioButton(fAxesContainer, "Edge", 2);
00522    fAxesOrigin = new TGRadioButton(fAxesContainer, "Origin", 3);
00523    fAxesDepthTest = new TGCheckButton(fAxesContainer, "DepthTest",4);
00524    fGuidesFrame->AddFrame(fAxesContainer, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 3, 0, 0));
00525 
00526    // camera overlay
00527    fCamContainer = new TGGroupFrame(fGuidesFrame, "Camera overlay");
00528    fGuidesFrame->AddFrame(fCamContainer, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 3, 0, 0));
00529    fCamOverlayOn = new TGCheckButton(fCamContainer, "Show");
00530    fCamContainer->AddFrame(fCamOverlayOn, new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX));
00531    TGHorizontalFrame* chf = new TGHorizontalFrame(fCamContainer);
00532    TGLabel* lab = new TGLabel(chf, "Mode");
00533    chf->AddFrame(lab, new TGLayoutHints(kLHintsLeft|kLHintsBottom, 1, 4, 1, 2));
00534    fCamMode = new TGComboBox(chf);
00535    fCamMode->AddEntry("Plane", TGLCameraOverlay::kPlaneIntersect);
00536    fCamMode->AddEntry("Bar", TGLCameraOverlay::kBar);
00537    fCamMode->AddEntry("Axis", TGLCameraOverlay::kAxis);
00538    fCamMode->AddEntry("Grid Front", TGLCameraOverlay::kGridFront);
00539    fCamMode->AddEntry("Grid Back", TGLCameraOverlay::kGridBack);
00540    TGListBox* lb = fCamMode->GetListBox();
00541    lb->Resize(lb->GetWidth(), 5*18);
00542    fCamMode->Resize(90, 20);
00543    chf->AddFrame(fCamMode, new TGLayoutHints(kLHintsTop, 1, 1, 1, 1));
00544    fCamContainer->AddFrame(chf);
00545 }
00546 
00547 //______________________________________________________________________________
00548 void TGLViewerEditor::CreateClippingTab()
00549 {
00550    // Create GUI controls - clip type (none/plane/box) and plane/box properties.
00551 
00552    fClipFrame = CreateEditorTabSubFrame("Clipping");
00553 
00554    fClipSet = new TGLClipSetSubEditor(fClipFrame);
00555    fClipSet->Connect("Changed()", "TGLViewerEditor", this, "ViewerRedraw()");
00556    fClipFrame->AddFrame(fClipSet, new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 0, 0, 0));
00557 }
00558 
00559 //______________________________________________________________________________
00560 void TGLViewerEditor::CreateExtrasTab()
00561 {
00562    // Create Extra Tab controls - camera rotator and stereo.
00563 
00564    Int_t labw = 80;
00565 
00566    TGCompositeFrame *tab = CreateEditorTabSubFrame("Extras"), *p = 0;
00567 
00568    // ----- Auto rotator -----
00569 
00570    p = new TGGroupFrame(tab, "Auto rotator", kVerticalFrame);
00571 
00572    fARotDt = MakeLabeledNEntry(p, "Delta T:", labw, 5, TGNumberFormat::kNESRealThree);
00573    fARotDt->SetLimits(TGNumberFormat::kNELLimitMinMax, 0.001, 1);
00574 
00575    fARotWPhi = MakeLabeledNEntry(p, "Omega Phi:", labw, 5, TGNumberFormat::kNESRealTwo);
00576    fARotWPhi->SetLimits(TGNumberFormat::kNELLimitMinMax, -10, 10);
00577 
00578    fARotATheta = MakeLabeledNEntry(p, "A Theta:", labw, 5, TGNumberFormat::kNESRealTwo);
00579    fARotATheta->SetLimits(TGNumberFormat::kNELLimitMinMax, 0.01, 1);
00580 
00581    fARotWTheta = MakeLabeledNEntry(p, "Omega Theta:", labw, 5, TGNumberFormat::kNESRealTwo);
00582    fARotWTheta->SetLimits(TGNumberFormat::kNELLimitMinMax, -10, 10);
00583 
00584    fARotADolly = MakeLabeledNEntry(p, "A Dolly:", labw, 5, TGNumberFormat::kNESRealTwo);
00585    fARotADolly->SetLimits(TGNumberFormat::kNELLimitMinMax, 0.01, 1);
00586 
00587    fARotWDolly = MakeLabeledNEntry(p, "Omega Dolly:", labw, 5, TGNumberFormat::kNESRealTwo);
00588    fARotWDolly->SetLimits(TGNumberFormat::kNELLimitMinMax, -10, 10);
00589 
00590    {
00591       TGCompositeFrame *l = new TGHorizontalFrame(p);
00592 
00593       TGTextButton *b = new TGTextButton(l, "Start");
00594       b->Connect("Clicked()", "TGLViewerEditor", this, "DoRotatorStart()");
00595       l->AddFrame(b, new TGLayoutHints(kLHintsLeft | kLHintsExpandX));
00596 
00597       b = new TGTextButton(l, "Stop");
00598       b->Connect("Clicked()", "TGLViewerEditor", this, "DoRotatorStop()");
00599       l->AddFrame(b, new TGLayoutHints(kLHintsLeft | kLHintsExpandX));
00600 
00601       p->AddFrame(l, new TGLayoutHints(kLHintsTop | kLHintsExpandX, 0, 0, 4, 0));
00602    }
00603 
00604    tab->AddFrame(p, new TGLayoutHints(kLHintsTop | kLHintsExpandX));
00605 
00606    // ----- Stereo -----
00607 
00608    fStereoFrame = p = new TGGroupFrame(tab, "Stereo", kVerticalFrame);
00609 
00610    // Int_t labw = 80;
00611 
00612    fStereoZeroParallax = MakeLabeledNEntry(p, "Zero parallax:", labw, 5, TGNumberFormat::kNESRealThree);
00613    fStereoZeroParallax->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, 1);
00614 
00615    fStereoEyeOffsetFac = MakeLabeledNEntry(p, "Eye offset:", labw, 5, TGNumberFormat::kNESRealTwo);
00616    fStereoEyeOffsetFac->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, 2);
00617 
00618    fStereoFrustumAsymFac = MakeLabeledNEntry(p, "Asymetry:", labw, 5, TGNumberFormat::kNESRealTwo);
00619    fStereoFrustumAsymFac->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, 2);
00620 
00621    tab->AddFrame(p, new TGLayoutHints(kLHintsTop | kLHintsExpandX));
00622 }
00623 
00624 
00625 //______________________________________________________________________________
00626 void TGLViewerEditor::UpdateReferencePosState()
00627 {
00628    // Enable/disable reference position (x/y/z) number edits based on
00629    // reference check box.
00630 
00631    fReferencePosX->SetState(fReferenceOn->IsDown());
00632    fReferencePosY->SetState(fReferenceOn->IsDown());
00633    fReferencePosZ->SetState(fReferenceOn->IsDown());
00634 }
00635 
00636 //______________________________________________________________________________
00637 void TGLViewerEditor::SetGuides()
00638 {
00639    // Configuration of guides GUI called from SetModel().
00640 
00641    Bool_t axesDepthTest = kFALSE;
00642    Bool_t referenceOn = kFALSE;
00643    Double_t referencePos[3] = {0.};
00644    fViewer->GetGuideState(fAxesType, axesDepthTest, referenceOn, referencePos);
00645 
00646    for (Int_t i = 1; i < 4; i++) {
00647       TGButton * btn = fAxesContainer->GetButton(i);
00648       if (fAxesType+1 == i)
00649          btn->SetDown(kTRUE);
00650       else
00651          btn->SetDown(kFALSE);
00652    }
00653    fAxesContainer->GetButton(4)->SetOn(axesDepthTest, kFALSE);
00654 
00655    fReferenceOn->SetDown(referenceOn);
00656    fReferencePosX->SetNumber(referencePos[0]);
00657    fReferencePosY->SetNumber(referencePos[1]);
00658    fReferencePosZ->SetNumber(referencePos[2]);
00659    UpdateReferencePosState();
00660 
00661    // overlay
00662    TGLCameraOverlay*  co = fViewer->GetCameraOverlay();
00663    TGCompositeFrame *fr = (TGCompositeFrame*)((TGFrameElement*) fCamContainer->GetList()->Last() )->fFrame;
00664 
00665    if (fViewer->CurrentCamera().IsOrthographic())
00666    {
00667       fCamOverlayOn->SetDown(co->GetShowOrthographic());
00668       fr->ShowFrame(fCamMode);
00669 
00670 
00671       if (! fr->IsMapped()) {
00672          fr->MapSubwindows();
00673          fr->MapWindow();
00674          fCamContainer->MapWindow();
00675          fCamContainer->MapWindow();
00676          fCamMode->Select(co->GetOrthographicMode(), kFALSE);
00677       }
00678    }
00679    else
00680    {
00681       fCamOverlayOn->SetDown(co->GetShowPerspective());
00682 
00683       // only mode implemented for perspective camera
00684       fCamMode->Select(co->GetPerspectiveMode(), kFALSE);
00685       fr->HideFrame(fCamMode);
00686       if (fr->IsMapped())
00687          fr->UnmapWindow();
00688    }
00689 }
00690 
00691 //______________________________________________________________________________
00692 void TGLViewerEditor::UpdateRotator()
00693 {
00694    // Update rotator related variables.
00695 
00696    TGLAutoRotator *r = fViewer->GetAutoRotator();
00697 
00698    r->SetDt    (fARotDt->GetNumber());
00699    r->SetWPhi  (fARotWPhi->GetNumber());
00700    r->SetATheta(fARotATheta->GetNumber());
00701    r->SetWTheta(fARotWTheta->GetNumber());
00702    r->SetADolly(fARotADolly->GetNumber());
00703    r->SetWDolly(fARotWDolly->GetNumber());
00704 }
00705 
00706 //______________________________________________________________________________
00707 void TGLViewerEditor::DoRotatorStart()
00708 {
00709    // Start auto-rotator.
00710 
00711    fViewer->GetAutoRotator()->Start();
00712 }
00713 
00714 //______________________________________________________________________________
00715 void TGLViewerEditor::DoRotatorStop()
00716 {
00717    // Stop auto-rotator.
00718 
00719    fViewer->GetAutoRotator()->Stop();
00720 }
00721 
00722 //______________________________________________________________________________
00723 void TGLViewerEditor::UpdateStereo()
00724 {
00725    // Update stereo related variables.
00726 
00727    fViewer->SetStereoZeroParallax  (fStereoZeroParallax->GetNumber());
00728    fViewer->SetStereoEyeOffsetFac  (fStereoEyeOffsetFac->GetNumber());
00729    fViewer->SetStereoFrustumAsymFac(fStereoFrustumAsymFac->GetNumber());
00730    ViewerRedraw(); 
00731 }

Generated on Tue Jul 5 14:18:10 2011 for ROOT_528-00b_version by  doxygen 1.5.1