45 void SetLabeledNEntryState(TGNumberEntry *entry, Bool_t enabled);
49 ClassImp(TGLViewerEditor);
51 TGLViewerEditor::TGLViewerEditor(
const TGWindow *p, Int_t width, Int_t height, UInt_t options, Pixel_t back) :
52 TGedFrame(p, width, height, options | kVerticalFrame, back),
56 fIgnoreSizesOnUpdate(0),
57 fResetCamerasOnUpdate(0),
60 fMaxSceneDrawTimeHQ(0),
61 fMaxSceneDrawTimeLQ(0),
62 fPointSizeScale(0), fLineWidthScale(0),
63 fPointSmooth(0), fLineSmooth(0),
64 fWFLineWidth(0), fOLLineWidth(0),
87 fARotDt(0), fARotWPhi(0), fARotATheta(0), fARotWTheta(0), fARotADolly(0), fARotWDolly(0),
88 fASavImageGUIBaseName(0), fASavImageGUIOutMode(0),
89 fStereoZeroParallax(0), fStereoEyeOffsetFac(0), fStereoFrustumAsymFac(0),
103 TGLViewerEditor::~TGLViewerEditor()
112 void TGLViewerEditor::ConnectSignals2Slots()
114 fClearColor->Connect(
"ColorSelected(Pixel_t)",
"TGLViewerEditor",
this,
"DoClearColor(Pixel_t)");
115 fIgnoreSizesOnUpdate->Connect(
"Toggled(Bool_t)",
"TGLViewerEditor",
this,
"DoIgnoreSizesOnUpdate()");
116 fResetCamerasOnUpdate->Connect(
"Toggled(Bool_t)",
"TGLViewerEditor",
this,
"DoResetCamerasOnUpdate()");
117 fUpdateScene->Connect(
"Pressed()",
"TGLViewerEditor",
this,
"DoUpdateScene()");
118 fCameraHome->Connect(
"Pressed()",
"TGLViewerEditor",
this,
"DoCameraHome()");
119 fMaxSceneDrawTimeHQ->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdateMaxDrawTimes()");
120 fMaxSceneDrawTimeLQ->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdateMaxDrawTimes()");
121 fPointSizeScale->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdatePointLineStuff()");
122 fLineWidthScale->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdatePointLineStuff()");
123 fPointSmooth->Connect(
"Clicked()",
"TGLViewerEditor",
this,
"UpdatePointLineStuff()");
124 fLineSmooth ->Connect(
"Clicked()",
"TGLViewerEditor",
this,
"UpdatePointLineStuff()");
125 fWFLineWidth->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdatePointLineStuff()");
126 fOLLineWidth->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdatePointLineStuff()");
128 fCameraCenterExt->Connect(
"Clicked()",
"TGLViewerEditor",
this,
"DoCameraCenterExt()");
129 fCaptureCenter->Connect(
"Clicked()",
"TGLViewerEditor",
this,
"DoCaptureCenter()");
130 fDrawCameraCenter->Connect(
"Clicked()",
"TGLViewerEditor",
this,
"DoDrawCameraCenter()");
131 fCameraCenterX->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdateCameraCenter()");
132 fCameraCenterY->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdateCameraCenter()");
133 fCameraCenterZ->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdateCameraCenter()");
135 fCaptureAnnotate->Connect(
"Clicked()",
"TGLViewerEditor",
this,
"DoAnnotation()");
137 fAxesContainer->Connect(
"Clicked(Int_t)",
"TGLViewerEditor",
this,
"UpdateViewerAxes(Int_t)");
139 fReferenceOn->Connect(
"Clicked()",
"TGLViewerEditor",
this,
"UpdateViewerReference()");
140 fReferencePosX->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdateViewerReference()");
141 fReferencePosY->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdateViewerReference()");
142 fReferencePosZ->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdateViewerReference()");
144 fCamMode->Connect(
"Selected(Int_t)",
"TGLViewerEditor",
this,
"DoCameraOverlay()");
145 fCamOverlayOn->Connect(
"Clicked()",
"TGLViewerEditor",
this,
"DoCameraOverlay()");
148 fRotateSceneOn->Connect(
"Clicked()",
"TGLViewerEditor",
this,
"SetRotatorMode()");
150 fSceneRotDt->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdateRotator()");
151 fARotDt ->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdateRotator()");
152 fARotWPhi ->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdateRotator()");
153 fARotATheta->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdateRotator()");
154 fARotWTheta->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdateRotator()");
155 fARotADolly->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdateRotator()");
156 fARotWDolly->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdateRotator()");
158 fASavImageGUIBaseName->Connect(
"TextChanged(char*",
"TGLViewerEditor",
this,
"DoASavImageGUIBaseName(char*)");
159 fASavImageGUIOutMode->Connect(
"Clicked(Int_t)",
"TGLViewerEditor",
this,
"DoASavImageGUIOutMode(Int_t)");
161 fStereoZeroParallax ->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdateStereo()");
162 fStereoEyeOffsetFac ->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdateStereo()");
163 fStereoFrustumAsymFac->Connect(
"ValueSet(Long_t)",
"TGLViewerEditor",
this,
"UpdateStereo()");
164 fStereoZeroParallax ->Connect(
"ValueChanged(Long_t)",
"TGLViewerEditor",
this,
"UpdateStereo()");
165 fStereoEyeOffsetFac ->Connect(
"ValueChanged(Long_t)",
"TGLViewerEditor",
this,
"UpdateStereo()");
166 fStereoFrustumAsymFac->Connect(
"ValueChanged(Long_t)",
"TGLViewerEditor",
this,
"UpdateStereo()");
174 void TGLViewerEditor::ViewerRedraw()
176 if (gGLManager && fIsInPad)
177 gGLManager->MarkForDirectCopy(fViewer->GetDev(), kTRUE);
178 fViewer->RequestDraw();
184 void TGLViewerEditor::SetModel(TObject* obj)
188 fViewer =
static_cast<TGLViewer *
>(obj);
189 fIsInPad = (fViewer->GetDev() != -1);
194 ConnectSignals2Slots();
196 fLightSet->SetModel(fViewer->GetLightSet());
197 fClipSet->SetModel(fViewer->GetClipSet());
200 fClearColor->SetColor(TColor::Number2Pixel(fViewer->RnrCtx().ColorSet().Background().GetColorIndex()), kFALSE);
201 fClearColor->Enable(!fViewer->IsUsingDefaultColorSet());
202 fIgnoreSizesOnUpdate->SetState(fViewer->GetIgnoreSizesOnUpdate() ? kButtonDown : kButtonUp);
203 fResetCamerasOnUpdate->SetState(fViewer->GetResetCamerasOnUpdate() ? kButtonDown : kButtonUp);
204 fMaxSceneDrawTimeHQ->SetNumber(fViewer->GetMaxSceneDrawTimeHQ());
205 fMaxSceneDrawTimeLQ->SetNumber(fViewer->GetMaxSceneDrawTimeLQ());
206 fPointSizeScale->SetNumber(fViewer->GetPointScale());
207 fLineWidthScale->SetNumber(fViewer->GetLineScale ());
208 fPointSmooth->SetState(fViewer->GetSmoothPoints() ? kButtonDown : kButtonUp);
209 fLineSmooth ->SetState(fViewer->GetSmoothLines () ? kButtonDown : kButtonUp);
210 fWFLineWidth->SetNumber(fViewer->WFLineW());
211 fOLLineWidth->SetNumber(fViewer->OLLineW());
213 TGLCamera & cam = fViewer->CurrentCamera();
214 fCameraCenterExt->SetDown(cam.GetExternalCenter());
215 fDrawCameraCenter->SetDown(fViewer->GetDrawCameraCenter());
216 Double_t* la = cam.GetCenterVec();
217 fCameraCenterX->SetNumber(la[0]);
218 fCameraCenterY->SetNumber(la[1]);
219 fCameraCenterZ->SetNumber(la[2]);
220 fCameraCenterX->SetState(fCameraCenterExt->IsDown());
221 fCameraCenterY->SetState(fCameraCenterExt->IsDown());
222 fCameraCenterZ->SetState(fCameraCenterExt->IsDown());
225 fCaptureCenter->SetTextColor((fViewer->GetPushAction() == TGLViewer::kPushCamCenter) ? 0xa03060 : 0x000000);
226 fCaptureAnnotate->SetDown( (fViewer->GetPushAction() == TGLViewer::kPushAnnotate), kFALSE);
229 TGLAutoRotator *r = fViewer->GetAutoRotator();
231 fSceneRotDt->SetNumber(r->GetDeltaPhi());
232 fARotDt ->SetNumber(r->GetDt());
233 fARotWPhi ->SetNumber(r->GetWPhi());
234 fARotATheta->SetNumber(r->GetATheta());
235 fARotWTheta->SetNumber(r->GetWTheta());
236 fARotADolly->SetNumber(r->GetADolly());
237 fARotWDolly->SetNumber(r->GetWDolly());
239 fASavImageGUIBaseName->SetText(r->GetImageGUIBaseName());
240 fASavImageGUIOutMode ->SetButton(r->GetImageGUIOutMode());
242 Bool_t rotate_standard = ! fViewer->GetAutoRotator()->GetRotateScene();
243 fRotateSceneOn->SetState(rotate_standard ? kButtonUp : kButtonDown);
244 SetLabeledNEntryState(fSceneRotDt, ! rotate_standard);
245 SetLabeledNEntryState(fARotDt, rotate_standard);
246 SetLabeledNEntryState(fARotWPhi, rotate_standard);
247 SetLabeledNEntryState(fARotATheta, rotate_standard);
248 SetLabeledNEntryState(fARotWTheta, rotate_standard);
249 SetLabeledNEntryState(fARotADolly, rotate_standard);
250 SetLabeledNEntryState(fARotWDolly, rotate_standard);
253 if (fViewer->GetStereo())
255 fStereoZeroParallax ->SetNumber(fViewer->GetStereoZeroParallax());
256 fStereoEyeOffsetFac ->SetNumber(fViewer->GetStereoEyeOffsetFac());
257 fStereoFrustumAsymFac->SetNumber(fViewer->GetStereoFrustumAsymFac());
258 fStereoFrame->MapWindow();
262 fStereoFrame->UnmapWindow();
269 void TGLViewerEditor::DoClearColor(Pixel_t color)
271 fViewer->RnrCtx().ColorSet().Background().SetColor(Color_t(TColor::GetColor(color)));
278 void TGLViewerEditor::DoIgnoreSizesOnUpdate()
280 fViewer->SetIgnoreSizesOnUpdate(fIgnoreSizesOnUpdate->IsOn());
281 if (fIgnoreSizesOnUpdate->IsOn())
282 fViewer->UpdateScene();
288 void TGLViewerEditor::DoResetCamerasOnUpdate()
290 fViewer->SetResetCamerasOnUpdate(fResetCamerasOnUpdate->IsOn());
296 void TGLViewerEditor::DoUpdateScene()
298 fViewer->UpdateScene();
304 void TGLViewerEditor::DoCameraHome()
306 fViewer->ResetCurrentCamera();
313 void TGLViewerEditor::UpdateMaxDrawTimes()
315 fViewer->SetMaxSceneDrawTimeHQ(fMaxSceneDrawTimeHQ->GetNumber());
316 fViewer->SetMaxSceneDrawTimeLQ(fMaxSceneDrawTimeLQ->GetNumber());
322 void TGLViewerEditor::UpdatePointLineStuff()
324 fViewer->SetPointScale(fPointSizeScale->GetNumber());
325 fViewer->SetLineScale (fLineWidthScale->GetNumber());
326 fViewer->SetSmoothPoints(fPointSmooth->IsDown());
327 fViewer->SetSmoothLines (fLineSmooth->IsDown());
328 fViewer->SetWFLineW(fWFLineWidth->GetNumber());
329 fViewer->SetOLLineW(fOLLineWidth->GetNumber());
336 void TGLViewerEditor::DoCameraOverlay()
338 TGLCameraOverlay* co = fViewer->GetCameraOverlay();
340 if (fViewer->CurrentCamera().IsPerspective())
342 co->SetShowPerspective(fCamOverlayOn->IsDown());
343 co->SetPerspectiveMode((TGLCameraOverlay::EMode)fCamMode->GetSelected());
347 co->SetShowOrthographic(fCamOverlayOn->IsDown());
348 co->SetOrthographicMode((TGLCameraOverlay::EMode)fCamMode->GetSelected());
356 void TGLViewerEditor::DoCameraCenterExt()
358 TGLCamera& cam = fViewer->CurrentCamera();
359 cam.SetExternalCenter(fCameraCenterExt->IsDown());
361 fCameraCenterX->SetState(fCameraCenterExt->IsDown());
362 fCameraCenterY->SetState(fCameraCenterExt->IsDown());
363 fCameraCenterZ->SetState(fCameraCenterExt->IsDown());
371 void TGLViewerEditor::DoCaptureCenter()
373 fViewer->PickCameraCenter();
380 void TGLViewerEditor::DoDrawCameraCenter()
382 fViewer->SetDrawCameraCenter(fDrawCameraCenter->IsDown());
389 void TGLViewerEditor::UpdateCameraCenter()
391 TGLCamera& cam = fViewer->CurrentCamera();
392 cam.SetCenterVec(fCameraCenterX->GetNumber(), fCameraCenterY->GetNumber(), fCameraCenterZ->GetNumber());
399 void TGLViewerEditor::DoAnnotation()
401 fViewer->PickAnnotate();
407 void TGLViewerEditor::UpdateViewerAxes(Int_t
id)
412 for (Int_t i = 1; i < 4; i++) {
413 TGButton * button = fAxesContainer->GetButton(i);
415 button->SetDown(kTRUE);
417 button->SetDown(kFALSE);
420 Bool_t axdt = fAxesContainer->GetButton(4)->IsDown();
421 const Double_t refPos[] = {fReferencePosX->GetNumber(), fReferencePosY->GetNumber(), fReferencePosZ->GetNumber()};
422 fViewer->SetGuideState(fAxesType, axdt, fReferenceOn->IsDown(), refPos);
423 UpdateReferencePosState();
429 void TGLViewerEditor::UpdateViewerReference()
431 const Double_t refPos[] = {fReferencePosX->GetNumber(), fReferencePosY->GetNumber(), fReferencePosZ->GetNumber()};
432 fViewer->SetGuideState(fAxesType, fAxesContainer->GetButton(4)->IsDown(), fReferenceOn->IsDown(), refPos);
433 UpdateReferencePosState();
439 TGNumberEntry* TGLViewerEditor::MakeLabeledNEntry(TGCompositeFrame* p,
const char* name,
440 Int_t labelw,Int_t nd, Int_t style)
442 TGHorizontalFrame *rfr =
new TGHorizontalFrame(p);
443 TGHorizontalFrame *labfr =
new TGHorizontalFrame(rfr, labelw, 20, kFixedSize);
444 TGLabel *lab =
new TGLabel(labfr, name);
445 labfr->AddFrame(lab,
new TGLayoutHints(kLHintsLeft | kLHintsBottom, 0, 0, 0) );
446 rfr->AddFrame(labfr,
new TGLayoutHints(kLHintsLeft | kLHintsBottom, 0, 0, 0));
448 TGNumberEntry* ne =
new TGNumberEntry(rfr, 0.0f, nd, -1, (TGNumberFormat::EStyle)style);
449 rfr->AddFrame(ne,
new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsBottom, 2, 0, 0));
451 p->AddFrame(rfr,
new TGLayoutHints(kLHintsLeft, 0, 0, 1, 0));
458 void TGLViewerEditor::CreateStyleTab()
460 MakeTitle(
"Update behaviour");
461 fIgnoreSizesOnUpdate =
new TGCheckButton(
this,
"Ignore sizes");
462 fIgnoreSizesOnUpdate->SetToolTipText(
"Ignore bounding-box sizes on scene update");
463 AddFrame(fIgnoreSizesOnUpdate,
new TGLayoutHints(kLHintsLeft, 4, 1, 1, 1));
464 fResetCamerasOnUpdate =
new TGCheckButton(
this,
"Reset on update");
465 fResetCamerasOnUpdate->SetToolTipText(
"Reset camera on scene update");
466 AddFrame(fResetCamerasOnUpdate,
new TGLayoutHints(kLHintsLeft, 4, 1, 1, 1));
468 TGCompositeFrame* af =
this;
469 fUpdateScene =
new TGTextButton(af,
"Update Scene", 130);
470 af->AddFrame(fUpdateScene,
new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 1, 1, 8, 1));
471 fCameraHome =
new TGTextButton(af,
"Camera Home", 130);
472 af->AddFrame(fCameraHome,
new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 1, 1, 1, 3));
473 fMaxSceneDrawTimeHQ = MakeLabeledNEntry(af,
"Max HQ draw time:", 120, 6, TGNumberFormat::kNESInteger);
474 fMaxSceneDrawTimeHQ->SetLimits(TGNumberFormat::kNELLimitMin, 0, 1e6);
475 fMaxSceneDrawTimeHQ->GetNumberEntry()->SetToolTipText(
"Maximum time spent in scene drawing\nin high-quality mode [ms].");
476 fMaxSceneDrawTimeLQ = MakeLabeledNEntry(af,
"Max LQ draw time:", 120, 6, TGNumberFormat::kNESInteger);
477 fMaxSceneDrawTimeLQ->SetLimits(TGNumberFormat::kNELLimitMin, 0, 1e6);
478 fMaxSceneDrawTimeLQ->GetNumberEntry()->SetToolTipText(
"Maximum time spent in scene drawing\nin low-quality mode (during rotation etc).");
480 TGHorizontalFrame* hf =
new TGHorizontalFrame(
this);
481 TGLabel* lab =
new TGLabel(hf,
"Clear Color");
482 hf->AddFrame(lab,
new TGLayoutHints(kLHintsLeft|kLHintsBottom, 1, 4, 8, 3));
483 fClearColor =
new TGColorSelect(hf, 0, -1);
484 hf->AddFrame(fClearColor,
new TGLayoutHints(kLHintsLeft, 1, 1, 8, 1));
485 AddFrame(hf,
new TGLayoutHints(kLHintsLeft, 2, 1, 1, 1));
488 fLightSet =
new TGLLightSetSubEditor(
this);
489 fLightSet->Connect(
"Changed()",
"TGLViewerEditor",
this,
"ViewerRedraw()");
490 AddFrame(fLightSet,
new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 0, 0, 0));
493 hf =
new TGHorizontalFrame(af);
494 fPointSizeScale = MakeLabeledNEntry(hf,
"Point-size scale:", 116, 4, TGNumberFormat::kNESRealOne);
495 fPointSizeScale->SetLimits(TGNumberFormat::kNELLimitMinMax, 0.1, 16);
496 fPointSmooth =
new TGCheckButton(hf);
497 fPointSmooth->SetToolTipText(
"Use smooth points.");
498 hf->AddFrame(fPointSmooth,
new TGLayoutHints(kLHintsNormal, 3, 0, 3, 0));
500 hf =
new TGHorizontalFrame(af);
501 fLineWidthScale = MakeLabeledNEntry(hf,
"Line-width scale:", 116, 4, TGNumberFormat::kNESRealOne);
502 fLineWidthScale->SetLimits(TGNumberFormat::kNELLimitMinMax, 0.1, 16);
503 fLineSmooth =
new TGCheckButton(hf);
504 fLineSmooth->SetToolTipText(
"Use smooth lines.");
505 hf->AddFrame(fLineSmooth,
new TGLayoutHints(kLHintsNormal, 3, 0, 3, 0));
507 fWFLineWidth = MakeLabeledNEntry(af,
"Wireframe line-width:", 116, 4, TGNumberFormat::kNESRealOne);
508 fWFLineWidth->SetLimits(TGNumberFormat::kNELLimitMinMax, 0.1, 16);
509 fOLLineWidth = MakeLabeledNEntry(af,
"Outline line-width:", 116, 4, TGNumberFormat::kNESRealOne);
510 fOLLineWidth->SetLimits(TGNumberFormat::kNELLimitMinMax, 0.1, 16);
516 void TGLViewerEditor::CreateGuidesTab()
518 fGuidesFrame = CreateEditorTabSubFrame(
"Guides");
521 TGGroupFrame* grf =
new TGGroupFrame(fGuidesFrame,
"Camera center:", kVerticalFrame);
522 fDrawCameraCenter =
new TGCheckButton(grf,
"Show", 50);
523 grf->AddFrame(fDrawCameraCenter,
new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 0, 1, 1));
524 fCameraCenterExt =
new TGCheckButton(grf,
"External", 50);
525 grf->AddFrame(fCameraCenterExt,
new TGLayoutHints(kLHintsLeft, 0, 0, 1, 0));
526 fGuidesFrame->AddFrame(grf,
new TGLayoutHints(kLHintsTop| kLHintsLeft | kLHintsExpandX, 2, 3, 3, 0));
528 fCameraCenterX = MakeLabeledNEntry(grf,
"X:", labw, 8, TGNumberFormat::kNESRealThree);
529 fCameraCenterY = MakeLabeledNEntry(grf,
"Y:", labw, 8, TGNumberFormat::kNESRealThree);
530 fCameraCenterZ = MakeLabeledNEntry(grf,
"Z:", labw, 8, TGNumberFormat::kNESRealThree);
531 fCaptureCenter =
new TGTextButton(grf,
" Pick center ");
532 grf->AddFrame(fCaptureCenter,
new TGLayoutHints(kLHintsNormal, labw + 2, 0, 2, 0));
535 TGGroupFrame* annf =
new TGGroupFrame(fGuidesFrame,
"Annotation");
536 fGuidesFrame->AddFrame(annf,
new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 3, 0, 0));
537 fCaptureAnnotate =
new TGCheckButton(annf,
"Pick annotation");
538 annf->AddFrame(fCaptureAnnotate,
new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX));
541 fRefContainer =
new TGGroupFrame(fGuidesFrame,
"Reference marker");
542 fGuidesFrame->AddFrame(fRefContainer,
new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 3, 0, 0));
543 fReferenceOn =
new TGCheckButton(fRefContainer,
"Show");
544 fRefContainer->AddFrame(fReferenceOn,
new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX));
545 fReferencePosX = MakeLabeledNEntry(fRefContainer,
"X:", labw, 8, TGNumberFormat::kNESRealThree );
546 fReferencePosY = MakeLabeledNEntry(fRefContainer,
"Y:", labw, 8, TGNumberFormat::kNESRealThree );
547 fReferencePosZ = MakeLabeledNEntry(fRefContainer,
"Z:", labw, 8, TGNumberFormat::kNESRealThree );
550 fAxesContainer =
new TGButtonGroup(fGuidesFrame,
"Axes");
551 fAxesNone =
new TGRadioButton(fAxesContainer,
"None", 1);
552 fAxesEdge =
new TGRadioButton(fAxesContainer,
"Edge", 2);
553 fAxesOrigin =
new TGRadioButton(fAxesContainer,
"Origin", 3);
554 fAxesDepthTest =
new TGCheckButton(fAxesContainer,
"DepthTest",4);
555 fGuidesFrame->AddFrame(fAxesContainer,
new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 3, 0, 0));
558 fCamContainer =
new TGGroupFrame(fGuidesFrame,
"Camera overlay");
559 fGuidesFrame->AddFrame(fCamContainer,
new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 3, 0, 0));
560 fCamOverlayOn =
new TGCheckButton(fCamContainer,
"Show");
561 fCamContainer->AddFrame(fCamOverlayOn,
new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX));
562 TGHorizontalFrame* chf =
new TGHorizontalFrame(fCamContainer);
563 TGLabel* lab =
new TGLabel(chf,
"Mode");
564 chf->AddFrame(lab,
new TGLayoutHints(kLHintsLeft|kLHintsBottom, 1, 4, 1, 2));
565 fCamMode =
new TGComboBox(chf);
566 fCamMode->AddEntry(
"Plane", TGLCameraOverlay::kPlaneIntersect);
567 fCamMode->AddEntry(
"Bar", TGLCameraOverlay::kBar);
568 fCamMode->AddEntry(
"Axis", TGLCameraOverlay::kAxis);
569 fCamMode->AddEntry(
"Grid Front", TGLCameraOverlay::kGridFront);
570 fCamMode->AddEntry(
"Grid Back", TGLCameraOverlay::kGridBack);
571 TGListBox* lb = fCamMode->GetListBox();
572 lb->Resize(lb->GetWidth(), 5*18);
573 fCamMode->Resize(90, 20);
574 chf->AddFrame(fCamMode,
new TGLayoutHints(kLHintsTop, 1, 1, 1, 1));
575 fCamContainer->AddFrame(chf);
581 void TGLViewerEditor::CreateClippingTab()
583 fClipFrame = CreateEditorTabSubFrame(
"Clipping");
585 fClipSet =
new TGLClipSetSubEditor(fClipFrame);
586 fClipSet->Connect(
"Changed()",
"TGLViewerEditor",
this,
"ViewerRedraw()");
587 fClipFrame->AddFrame(fClipSet,
new TGLayoutHints(kLHintsTop | kLHintsExpandX, 2, 0, 0, 0));
593 void TGLViewerEditor::CreateExtrasTab()
597 TGCompositeFrame *tab = CreateEditorTabSubFrame(
"Extras"), *p = 0;
601 p =
new TGGroupFrame(tab,
"Auto rotator", kVerticalFrame);
604 fRotateSceneOn =
new TGCheckButton(p,
"Rotate all objects");
605 fRotateSceneOn->SetToolTipText(
"This covers a very specific use-case and is most likely not what you need.\nProceed at your own risk. Sorry about that.");
606 p->AddFrame(fRotateSceneOn,
new TGLayoutHints(kLHintsLeft, 4, 1, 1, 1));
608 fSceneRotDt = MakeLabeledNEntry(p,
"Delta Phi:", labw, 5, TGNumberFormat::kNESRealThree);
609 fSceneRotDt->SetLimits(TGNumberFormat::kNELLimitMinMax, 0.005, 0.06);
611 fARotDt = MakeLabeledNEntry(p,
"Delta T:", labw, 5, TGNumberFormat::kNESRealThree);
612 fARotDt->SetLimits(TGNumberFormat::kNELLimitMinMax, 0.001, 1);
614 fARotWPhi = MakeLabeledNEntry(p,
"Omega Phi:", labw, 5, TGNumberFormat::kNESRealTwo);
615 fARotWPhi->SetLimits(TGNumberFormat::kNELLimitMinMax, -10, 10);
617 fARotATheta = MakeLabeledNEntry(p,
"A Theta:", labw, 5, TGNumberFormat::kNESRealTwo);
618 fARotATheta->SetLimits(TGNumberFormat::kNELLimitMinMax, 0.01, 1);
620 fARotWTheta = MakeLabeledNEntry(p,
"Omega Theta:", labw, 5, TGNumberFormat::kNESRealTwo);
621 fARotWTheta->SetLimits(TGNumberFormat::kNELLimitMinMax, -10, 10);
623 fARotADolly = MakeLabeledNEntry(p,
"A Dolly:", labw, 5, TGNumberFormat::kNESRealTwo);
624 fARotADolly->SetLimits(TGNumberFormat::kNELLimitMinMax, 0.01, 1);
626 fARotWDolly = MakeLabeledNEntry(p,
"Omega Dolly:", labw, 5, TGNumberFormat::kNESRealTwo);
627 fARotWDolly->SetLimits(TGNumberFormat::kNELLimitMinMax, -10, 10);
630 TGCompositeFrame *l =
new TGHorizontalFrame(p);
632 TGTextButton *b =
new TGTextButton(l,
"Start");
633 b->Connect(
"Clicked()",
"TGLViewerEditor",
this,
"DoRotatorStart()");
634 l->AddFrame(b,
new TGLayoutHints(kLHintsLeft | kLHintsExpandX));
636 b =
new TGTextButton(l,
"Stop");
637 b->Connect(
"Clicked()",
"TGLViewerEditor",
this,
"DoRotatorStop()");
638 l->AddFrame(b,
new TGLayoutHints(kLHintsLeft | kLHintsExpandX));
640 p->AddFrame(l,
new TGLayoutHints(kLHintsTop | kLHintsExpandX, 0, 0, 4, 0));
643 tab->AddFrame(p,
new TGLayoutHints(kLHintsTop | kLHintsExpandX));
647 p =
new TGGroupFrame(tab,
"Auto save images", kVerticalFrame);
649 fASavImageGUIBaseName =
new TGTextEntry(p);
650 fASavImageGUIBaseName->SetDefaultSize(160, 0);
651 p->AddFrame(fASavImageGUIBaseName,
new TGLayoutHints(kLHintsTop | kLHintsExpandX, 0, 0, 4, 0));
653 fASavImageGUIOutMode =
new TGButtonGroup(p,
"Output mode", kChildFrame|kHorizontalFrame);
654 new TGRadioButton(fASavImageGUIOutMode,
"GIF+ ");
655 new TGRadioButton(fASavImageGUIOutMode,
"PNG set ");
656 fASavImageGUIOutMode->SetLayoutHints(
new TGLayoutHints(kLHintsLeft | kLHintsBottom, 0, 0, 2, -10));
657 p->AddFrame(fASavImageGUIOutMode,
new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 2, 3, 2, 2));
660 TGCompositeFrame *l =
new TGHorizontalFrame(p);
662 TGTextButton *b =
new TGTextButton(l,
"Start");
663 b->Connect(
"Clicked()",
"TGLViewerEditor",
this,
"DoASavImageStart()");
664 l->AddFrame(b,
new TGLayoutHints(kLHintsLeft | kLHintsExpandX));
666 b =
new TGTextButton(l,
"Stop");
667 b->Connect(
"Clicked()",
"TGLViewerEditor",
this,
"DoASavImageStop()");
668 l->AddFrame(b,
new TGLayoutHints(kLHintsLeft | kLHintsExpandX));
670 p->AddFrame(l,
new TGLayoutHints(kLHintsTop | kLHintsExpandX, 0, 0, 4, 0));
673 tab->AddFrame(p,
new TGLayoutHints(kLHintsTop | kLHintsExpandX));
677 fStereoFrame = p =
new TGGroupFrame(tab,
"Stereo", kVerticalFrame);
681 fStereoZeroParallax = MakeLabeledNEntry(p,
"Zero parallax:", labw, 5, TGNumberFormat::kNESRealThree);
682 fStereoZeroParallax->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, 1);
684 fStereoEyeOffsetFac = MakeLabeledNEntry(p,
"Eye offset:", labw, 5, TGNumberFormat::kNESRealTwo);
685 fStereoEyeOffsetFac->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, 2);
687 fStereoFrustumAsymFac = MakeLabeledNEntry(p,
"Asymetry:", labw, 5, TGNumberFormat::kNESRealTwo);
688 fStereoFrustumAsymFac->SetLimits(TGNumberFormat::kNELLimitMinMax, 0, 2);
690 tab->AddFrame(p,
new TGLayoutHints(kLHintsTop | kLHintsExpandX));
698 void TGLViewerEditor::UpdateReferencePosState()
700 fReferencePosX->SetState(fReferenceOn->IsDown());
701 fReferencePosY->SetState(fReferenceOn->IsDown());
702 fReferencePosZ->SetState(fReferenceOn->IsDown());
708 void TGLViewerEditor::SetGuides()
710 Bool_t axesDepthTest = kFALSE;
711 Bool_t referenceOn = kFALSE;
712 Double_t referencePos[3] = {0.};
713 fViewer->GetGuideState(fAxesType, axesDepthTest, referenceOn, referencePos);
715 for (Int_t i = 1; i < 4; i++) {
716 TGButton * btn = fAxesContainer->GetButton(i);
717 if (fAxesType+1 == i)
720 btn->SetDown(kFALSE);
722 fAxesContainer->GetButton(4)->SetOn(axesDepthTest, kFALSE);
724 fReferenceOn->SetDown(referenceOn);
725 fReferencePosX->SetNumber(referencePos[0]);
726 fReferencePosY->SetNumber(referencePos[1]);
727 fReferencePosZ->SetNumber(referencePos[2]);
728 UpdateReferencePosState();
731 TGLCameraOverlay* co = fViewer->GetCameraOverlay();
732 TGCompositeFrame *fr = (TGCompositeFrame*)((TGFrameElement*) fCamContainer->GetList()->Last() )->fFrame;
734 if (fViewer->CurrentCamera().IsOrthographic())
736 fCamOverlayOn->SetDown(co->GetShowOrthographic());
737 fr->ShowFrame(fCamMode);
740 if (! fr->IsMapped()) {
743 fCamContainer->MapWindow();
744 fCamContainer->MapWindow();
745 fCamMode->Select(co->GetOrthographicMode(), kFALSE);
750 fCamOverlayOn->SetDown(co->GetShowPerspective());
753 fCamMode->Select(co->GetPerspectiveMode(), kFALSE);
754 fr->HideFrame(fCamMode);
762 void TGLViewerEditor::SetRotatorMode()
764 if (TGLAutoRotator *
const r = fViewer->GetAutoRotator()) {
767 if (fRotateSceneOn->IsOn()) {
768 r->SetDeltaPhi(fSceneRotDt->GetNumber());
770 SetLabeledNEntryState(fSceneRotDt, kTRUE);
771 SetLabeledNEntryState(fARotDt, kFALSE);
772 SetLabeledNEntryState(fARotWPhi, kFALSE);
773 SetLabeledNEntryState(fARotATheta, kFALSE);
774 SetLabeledNEntryState(fARotWTheta, kFALSE);
775 SetLabeledNEntryState(fARotADolly, kFALSE);
776 SetLabeledNEntryState(fARotWDolly, kFALSE);
778 SetLabeledNEntryState(fSceneRotDt, kFALSE);
779 SetLabeledNEntryState(fARotDt, kTRUE);
780 SetLabeledNEntryState(fARotWPhi, kTRUE);
781 SetLabeledNEntryState(fARotATheta, kTRUE);
782 SetLabeledNEntryState(fARotWTheta, kTRUE);
783 SetLabeledNEntryState(fARotADolly, kTRUE);
784 SetLabeledNEntryState(fARotWDolly, kTRUE);
787 r->SetRotateScene(fRotateSceneOn->IsOn());
794 void TGLViewerEditor::UpdateRotator()
796 TGLAutoRotator *r = fViewer->GetAutoRotator();
797 if (fRotateSceneOn->IsOn()) {
798 r->SetDeltaPhi(fSceneRotDt->GetNumber());
800 r->SetDt (fARotDt->GetNumber());
801 r->SetWPhi (fARotWPhi->GetNumber());
802 r->SetATheta(fARotATheta->GetNumber());
803 r->SetWTheta(fARotWTheta->GetNumber());
804 r->SetADolly(fARotADolly->GetNumber());
805 r->SetWDolly(fARotWDolly->GetNumber());
812 void TGLViewerEditor::DoRotatorStart()
814 TGLAutoRotator *r = fViewer->GetAutoRotator();
816 r->SetRotateScene(fRotateSceneOn->IsOn());
824 void TGLViewerEditor::DoRotatorStop()
826 fViewer->GetAutoRotator()->Stop();
832 void TGLViewerEditor::DoASavImageGUIBaseName(
const char* t)
834 TGLAutoRotator *r = fViewer->GetAutoRotator();
835 r->SetImageGUIBaseName(t);
841 void TGLViewerEditor::DoASavImageGUIOutMode(Int_t m)
843 TGLAutoRotator *r = fViewer->GetAutoRotator();
844 r->SetImageGUIOutMode(m);
850 void TGLViewerEditor::DoASavImageStart()
852 TGLAutoRotator *r = fViewer->GetAutoRotator();
853 if (r->GetImageAutoSave())
855 Warning(
"DoASavImageStart",
"AutoSave in progress.");
859 r->StartImageAutoSaveWithGUISettings();
865 void TGLViewerEditor::DoASavImageStop()
867 TGLAutoRotator *r = fViewer->GetAutoRotator();
868 if (!r->GetImageAutoSave())
870 Warning(
"DoASavImageStop",
"AutoSave not in progress.");
874 r->StopImageAutoSave();
880 void TGLViewerEditor::UpdateStereo()
882 fViewer->SetStereoZeroParallax (fStereoZeroParallax->GetNumber());
883 fViewer->SetStereoEyeOffsetFac (fStereoEyeOffsetFac->GetNumber());
884 fViewer->SetStereoFrustumAsymFac(fStereoFrustumAsymFac->GetNumber());
907 TGLabel *FindLabelForNEntry(TGNumberEntry *entry)
911 ::Error(
"FindLabelForNEntry",
"parameter 'entry' is null");
917 if (
const TGHorizontalFrame *
const grandpa = dynamic_cast<const TGHorizontalFrame *>(entry->GetParent())) {
918 if (TList *
const parents = grandpa->GetList()) {
919 TIter next1(parents);
920 while (TGFrameElement *
const frameElement = dynamic_cast<TGFrameElement *>(next1())) {
921 if (TGHorizontalFrame *
const parent = dynamic_cast<TGHorizontalFrame *>(frameElement->fFrame)) {
922 if (TList *
const children = parent->GetList()) {
923 TIter next2(children);
924 while (TGFrameElement *
const candidate = dynamic_cast<TGFrameElement *>(next2())) {
925 if ((label = dynamic_cast<TGLabel *>(candidate->fFrame)))
944 void SetLabeledNEntryState(TGNumberEntry *entry, Bool_t enabled)
948 ::Error(
"SetLabeledNEntryState",
"parameter 'entry' is null");
952 entry->SetState(enabled);
953 if (TGLabel *
const label = FindLabelForNEntry(entry))
955 label->Disable(!enabled);