00001
00002
00003
00004
00005
00006
00007
00008
00009
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
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
00085
00086 CreateStyleTab();
00087 CreateGuidesTab();
00088 CreateClippingTab();
00089 CreateExtrasTab();
00090 }
00091
00092
00093
00094 TGLViewerEditor::~TGLViewerEditor()
00095 {
00096
00097
00098 }
00099
00100
00101 void TGLViewerEditor::ConnectSignals2Slots()
00102 {
00103
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
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
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
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
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
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
00240
00241 fViewer->RnrCtx().ColorSet().Background().SetColor(Color_t(TColor::GetColor(color)));
00242 ViewerRedraw();
00243 }
00244
00245
00246 void TGLViewerEditor::DoIgnoreSizesOnUpdate()
00247 {
00248
00249
00250 fViewer->SetIgnoreSizesOnUpdate(fIgnoreSizesOnUpdate->IsOn());
00251 if (fIgnoreSizesOnUpdate->IsOn())
00252 fViewer->UpdateScene();
00253 }
00254
00255
00256 void TGLViewerEditor::DoResetCamerasOnUpdate()
00257 {
00258
00259
00260 fViewer->SetResetCamerasOnUpdate(fResetCamerasOnUpdate->IsOn());
00261 }
00262
00263
00264 void TGLViewerEditor::DoUpdateScene()
00265 {
00266
00267
00268 fViewer->UpdateScene();
00269 }
00270
00271
00272 void TGLViewerEditor::DoCameraHome()
00273 {
00274
00275
00276 fViewer->ResetCurrentCamera();
00277 ViewerRedraw();
00278 }
00279
00280
00281 void TGLViewerEditor::UpdateMaxDrawTimes()
00282 {
00283
00284
00285 fViewer->SetMaxSceneDrawTimeHQ(fMaxSceneDrawTimeHQ->GetNumber());
00286 fViewer->SetMaxSceneDrawTimeLQ(fMaxSceneDrawTimeLQ->GetNumber());
00287 }
00288
00289
00290 void TGLViewerEditor::UpdatePointLineStuff()
00291 {
00292
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
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
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
00342
00343 fViewer->PickCameraCenter();
00344 ViewerRedraw();
00345 }
00346
00347
00348 void TGLViewerEditor::DoDrawCameraCenter()
00349 {
00350
00351
00352 fViewer->SetDrawCameraCenter(fDrawCameraCenter->IsDown());
00353 ViewerRedraw();
00354 }
00355
00356
00357 void TGLViewerEditor::UpdateCameraCenter()
00358 {
00359
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
00370
00371 fViewer->PickAnnotate();
00372 }
00373
00374
00375 void TGLViewerEditor::UpdateViewerAxes(Int_t id)
00376 {
00377
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
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
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
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
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
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
00487 fGuidesFrame = CreateEditorTabSubFrame("Guides");
00488
00489
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
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
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
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
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
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
00563
00564 Int_t labw = 80;
00565
00566 TGCompositeFrame *tab = CreateEditorTabSubFrame("Extras"), *p = 0;
00567
00568
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
00607
00608 fStereoFrame = p = new TGGroupFrame(tab, "Stereo", kVerticalFrame);
00609
00610
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
00629
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
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
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
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
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
00710
00711 fViewer->GetAutoRotator()->Start();
00712 }
00713
00714
00715 void TGLViewerEditor::DoRotatorStop()
00716 {
00717
00718
00719 fViewer->GetAutoRotator()->Stop();
00720 }
00721
00722
00723 void TGLViewerEditor::UpdateStereo()
00724 {
00725
00726
00727 fViewer->SetStereoZeroParallax (fStereoZeroParallax->GetNumber());
00728 fViewer->SetStereoEyeOffsetFac (fStereoEyeOffsetFac->GetNumber());
00729 fViewer->SetStereoFrustumAsymFac(fStereoFrustumAsymFac->GetNumber());
00730 ViewerRedraw();
00731 }