64 #define GL_BGRA GL_BGRA_EXT
95 TGLColorSet TGLViewer::fgDefaultColorSet;
96 Bool_t TGLViewer::fgUseDefaultColorSetForNewViewers = kFALSE;
100 TGLViewer::TGLViewer(TVirtualPad * pad, Int_t x, Int_t y,
101 Int_t width, Int_t height) :
104 fPerspectiveCameraXOZ(TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)),
105 fPerspectiveCameraYOZ(TGLVector3( 0.0,-1.0, 0.0), TGLVector3(1.0, 0.0, 0.0)),
106 fPerspectiveCameraXOY(TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 0.0, 1.0)),
107 fOrthoXOYCamera (TGLOrthoCamera::kXOY, TGLVector3( 0.0, 0.0, 1.0), TGLVector3(0.0, 1.0, 0.0)),
108 fOrthoXOZCamera (TGLOrthoCamera::kXOZ, TGLVector3( 0.0,-1.0, 0.0), TGLVector3(0.0, 0.0, 1.0)),
109 fOrthoZOYCamera (TGLOrthoCamera::kZOY, TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)),
110 fOrthoZOXCamera (TGLOrthoCamera::kZOX, TGLVector3( 0.0,-1.0, 0.0), TGLVector3(1.0, 0.0, 0.0)),
111 fOrthoXnOYCamera(TGLOrthoCamera::kXnOY, TGLVector3( 0.0, 0.0,-1.0), TGLVector3(0.0, 1.0, 0.0)),
112 fOrthoXnOZCamera(TGLOrthoCamera::kXnOZ, TGLVector3( 0.0, 1.0, 0.0), TGLVector3(0.0, 0.0, 1.0)),
113 fOrthoZnOYCamera(TGLOrthoCamera::kZnOY, TGLVector3( 1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)),
114 fOrthoZnOXCamera(TGLOrthoCamera::kZnOX, TGLVector3( 0.0, 1.0, 0.0), TGLVector3(1.0, 0.0, 0.0)),
115 fCurrentCamera(&fPerspectiveCameraXOZ),
119 fStereoQuadBuf (kFALSE),
120 fStereoZeroParallax (0.03f),
121 fStereoEyeOffsetFac (1.0f),
122 fStereoFrustumAsymFac (1.0f),
126 fSelectedPShapeRef (0),
132 fPushAction(kPushStd), fDragAction(kDragNone),
134 fMaxSceneDrawTimeHQ(5000),
135 fMaxSceneDrawTimeLQ(100),
136 fPointScale (1), fLineScale(1), fSmoothPoints(kFALSE), fSmoothLines(kFALSE),
137 fAxesType(TGLUtil::kAxesNone),
138 fAxesDepthTest(kTRUE),
139 fReferenceOn(kFALSE),
140 fReferencePos(0.0, 0.0, 0.0),
141 fDrawCameraCenter(kFALSE),
143 fSmartRefresh(kFALSE),
146 fPictureFileName(
"viewer.jpg"),
151 fIgnoreSizesOnUpdate(kFALSE),
152 fResetCamerasOnUpdate(kTRUE),
153 fResetCamerasOnNextUpdate(kFALSE)
160 InitSecondaryObjects();
162 SetViewport(x, y, width, height);
167 TGLViewer::TGLViewer(TVirtualPad * pad) :
170 fPerspectiveCameraXOZ(TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)),
171 fPerspectiveCameraYOZ(TGLVector3( 0.0,-1.0, 0.0), TGLVector3(1.0, 0.0, 0.0)),
172 fPerspectiveCameraXOY(TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 0.0, 1.0)),
173 fOrthoXOYCamera (TGLOrthoCamera::kXOY, TGLVector3( 0.0, 0.0, 1.0), TGLVector3(0.0, 1.0, 0.0)),
174 fOrthoXOZCamera (TGLOrthoCamera::kXOZ, TGLVector3( 0.0,-1.0, 0.0), TGLVector3(0.0, 0.0, 1.0)),
175 fOrthoZOYCamera (TGLOrthoCamera::kZOY, TGLVector3(-1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)),
176 fOrthoZOXCamera (TGLOrthoCamera::kZOX, TGLVector3( 0.0,-1.0, 0.0), TGLVector3(1.0, 0.0, 0.0)),
177 fOrthoXnOYCamera(TGLOrthoCamera::kXnOY, TGLVector3( 0.0, 0.0,-1.0), TGLVector3(0.0, 1.0, 0.0)),
178 fOrthoXnOZCamera(TGLOrthoCamera::kXnOZ, TGLVector3( 0.0, 1.0, 0.0), TGLVector3(0.0, 0.0, 1.0)),
179 fOrthoZnOYCamera(TGLOrthoCamera::kZnOY, TGLVector3( 1.0, 0.0, 0.0), TGLVector3(0.0, 1.0, 0.0)),
180 fOrthoZnOXCamera(TGLOrthoCamera::kZnOX, TGLVector3( 0.0, 1.0, 0.0), TGLVector3(1.0, 0.0, 0.0)),
181 fCurrentCamera(&fPerspectiveCameraXOZ),
185 fStereoQuadBuf (kFALSE),
186 fStereoZeroParallax (0.03f),
187 fStereoEyeOffsetFac (1.0f),
188 fStereoFrustumAsymFac (1.0f),
192 fSelectedPShapeRef (0),
198 fPushAction(kPushStd), fDragAction(kDragNone),
200 fMaxSceneDrawTimeHQ(5000),
201 fMaxSceneDrawTimeLQ(100),
202 fPointScale (1), fLineScale(1), fSmoothPoints(kFALSE), fSmoothLines(kFALSE),
203 fAxesType(TGLUtil::kAxesNone),
204 fAxesDepthTest(kTRUE),
205 fReferenceOn(kFALSE),
206 fReferencePos(0.0, 0.0, 0.0),
207 fDrawCameraCenter(kFALSE),
209 fSmartRefresh(kFALSE),
212 fPictureFileName(
"viewer.jpg"),
215 fGLDevice(fPad->GetGLDevice()),
217 fIgnoreSizesOnUpdate(kFALSE),
218 fResetCamerasOnUpdate(kTRUE),
219 fResetCamerasOnNextUpdate(kFALSE)
227 InitSecondaryObjects();
229 if (fGLDevice != -1) {
231 fGLCtxId =
new TGLContextIdentity;
233 Int_t viewport[4] = {0};
234 gGLManager->ExtractViewport(fGLDevice, viewport);
235 SetViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
242 void TGLViewer::InitSecondaryObjects()
244 fLightSet =
new TGLLightSet;
245 fClipSet =
new TGLClipSet;
246 AddOverlayElement(fClipSet);
248 fSelectedPShapeRef =
new TGLManipSet;
249 fSelectedPShapeRef->SetDrawBBox(kTRUE);
250 AddOverlayElement(fSelectedPShapeRef);
252 fPShapeWrap =
new TGLPShapeObj(0,
this);
254 fLightColorSet.StdLightBackground();
255 if (fgUseDefaultColorSetForNewViewers) {
256 fRnrCtx->ChangeBaseColorSet(&fgDefaultColorSet);
259 fRnrCtx->ChangeBaseColorSet(&fLightColorSet);
260 fLightColorSet.Background().SetColor(fPad->GetFillColor());
261 fLightColorSet.Foreground().SetColor(fPad->GetLineColor());
263 fRnrCtx->ChangeBaseColorSet(&fDarkColorSet);
267 fCameraOverlay =
new TGLCameraOverlay(kFALSE, kFALSE);
268 AddOverlayElement(fCameraOverlay);
270 fRedrawTimer =
new TGLRedrawTimer(*
this);
276 TGLViewer::~TGLViewer()
288 fGLWidget->SetEventHandler(0);
289 delete fEventHandler;
293 fPad->ReleaseViewer3D();
295 fGLCtxId->Release(0);
306 void TGLViewer::PadPaint(TVirtualPad* pad)
308 TGLScenePad* scenepad = 0;
309 for (SceneInfoList_i si = fScenes.begin(); si != fScenes.end(); ++si)
311 scenepad =
dynamic_cast<TGLScenePad*
>((*si)->GetScene());
312 if (scenepad && scenepad->GetPad() == pad)
318 scenepad =
new TGLScenePad(pad);
322 scenepad->PadPaintFromViewer(
this);
324 PostSceneBuildSetup(fResetCamerasOnNextUpdate || fResetCamerasOnUpdate);
325 fResetCamerasOnNextUpdate = kFALSE;
338 void TGLViewer::UpdateScene(Bool_t redraw)
341 fRedrawTimer->Stop();
343 for (SceneInfoList_i si = fScenes.begin(); si != fScenes.end(); ++si)
345 TGLScenePad* scenepad =
dynamic_cast<TGLScenePad*
>((*si)->GetScene());
347 scenepad->PadPaintFromViewer(
this);
350 PostSceneBuildSetup(fResetCamerasOnNextUpdate || fResetCamerasOnUpdate);
351 fResetCamerasOnNextUpdate = kFALSE;
360 void TGLViewer::ResetCurrentCamera()
362 MergeSceneBBoxes(fOverallBoundingBox);
363 CurrentCamera().Setup(fOverallBoundingBox, kTRUE);
369 void TGLViewer::SetupCameras(Bool_t reset)
372 Error(
"TGLViewer::SetupCameras",
"expected kUnlocked, found %s", LockName(CurrentLock()));
377 const TGLBoundingBox & box = fOverallBoundingBox;
378 if (!box.IsEmpty()) {
379 fPerspectiveCameraYOZ.Setup(box, reset);
380 fPerspectiveCameraXOZ.Setup(box, reset);
381 fPerspectiveCameraXOY.Setup(box, reset);
382 fOrthoXOYCamera.Setup(box, reset);
383 fOrthoXOZCamera.Setup(box, reset);
384 fOrthoZOYCamera.Setup(box, reset);
385 fOrthoXnOYCamera.Setup(box, reset);
386 fOrthoXnOZCamera.Setup(box, reset);
387 fOrthoZnOYCamera.Setup(box, reset);
394 void TGLViewer::PostSceneBuildSetup(Bool_t resetCameras)
396 MergeSceneBBoxes(fOverallBoundingBox);
397 SetupCameras(resetCameras);
400 fReferencePos.Set(fOverallBoundingBox.Center());
401 RefreshPadEditor(
this);
411 void TGLViewer::InitGL()
413 glEnable(GL_LIGHTING);
414 glEnable(GL_DEPTH_TEST);
415 glEnable(GL_CULL_FACE);
417 glClearColor(0.f, 0.f, 0.f, 0.f);
419 glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
420 glEnable(GL_COLOR_MATERIAL);
421 glMaterialf(GL_BACK, GL_SHININESS, 0.0);
422 glPolygonMode(GL_FRONT, GL_FILL);
425 glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
426 Float_t lmodelAmb[] = {0.5f, 0.5f, 1.f, 1.f};
427 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodelAmb);
428 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
430 glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
431 glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
433 TGLUtil::CheckError(
"TGLViewer::InitGL");
440 void TGLViewer::RequestDraw(Short_t LODInput)
442 fRedrawTimer->Stop();
444 if ((!fGLWidget && fGLDevice == -1) || (fGLWidget && !fGLWidget->IsMapped()))
450 if ( ! TakeLock(kDrawLock)) {
454 Info(
"TGLViewer::RequestDraw",
"viewer locked - requesting another draw.");
456 fRedrawTimer->RequestDraw(100, LODInput);
461 if (!gVirtualX->IsCmdThread())
462 gROOT->ProcessLineFast(Form(
"((TGLViewer *)0x%lx)->DoDraw()", (ULong_t)
this));
470 void TGLViewer::SetupClipObject()
472 if (GetClipAutoUpdate())
474 fClipSet->SetupCurrentClip(fOverallBoundingBox);
478 fClipSet->SetupCurrentClipIfInvalid(fOverallBoundingBox);
485 void TGLViewer::PreRender()
487 fCamera = fCurrentCamera;
488 fClip = fClipSet->GetCurrentClip();
491 fRnrCtx->SetGLCtxIdentity(fGLCtxId);
492 fGLCtxId->DeleteGLResources();
495 TGLUtil::SetPointSizeScale(fPointScale * fRnrCtx->GetRenderScale());
496 TGLUtil::SetLineWidthScale(fLineScale * fRnrCtx->GetRenderScale());
498 if (fSmoothPoints) glEnable(GL_POINT_SMOOTH);
else glDisable(GL_POINT_SMOOTH);
499 if (fSmoothLines) glEnable(GL_LINE_SMOOTH);
else glDisable(GL_LINE_SMOOTH);
500 if (fSmoothPoints || fSmoothLines)
502 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
510 TGLViewerBase::PreRender();
513 fLightSet->StdSetupLights(fOverallBoundingBox, *fCamera, fDebugMode);
519 void TGLViewer::Render()
521 TGLViewerBase::Render();
524 RenderOverlay(TGLOverlayElement::kAllVisible, kFALSE);
526 if ( ! fRnrCtx->Selection())
528 RenderSelectedForHighlight();
531 glClear(GL_DEPTH_BUFFER_BIT);
539 void TGLViewer::PostRender()
541 TGLViewerBase::PostRender();
543 TGLUtil::SetPointSizeScale(1);
544 TGLUtil::SetLineWidthScale(1);
550 void TGLViewer::DoDraw(Bool_t swap_buffers)
557 R__LOCKGUARD(gROOTMutex);
559 fRedrawTimer->Stop();
561 if (CurrentLock() != kDrawLock) {
562 if ( ! TakeLock(kDrawLock)) {
563 Error(
"TGLViewer::DoDraw",
"viewer is %s", LockName(CurrentLock()));
568 TUnlocker ulck(
this);
570 if (fGLDevice == -1 && (fViewport.Width() <= 1 || fViewport.Height() <= 1)) {
572 Info(
"TGLViewer::DoDraw()",
"zero surface area, draw skipped.");
577 if (fGLDevice != -1) {
578 Int_t viewport[4] = {};
579 gGLManager->ExtractViewport(fGLDevice, viewport);
580 SetViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
589 fRnrCtx->SetRenderTimeOut(fLOD == TGLRnrCtx::kLODHigh ?
590 fMaxSceneDrawTimeHQ :
591 fMaxSceneDrawTimeLQ);
593 if (fStereo && fCurrentCamera->IsPerspective() && !fRnrCtx->GetGrabImage() &&
596 DoDrawStereo(swap_buffers);
600 DoDrawMono(swap_buffers);
603 ReleaseLock(kDrawLock);
606 Info(
"TGLViewer::DoDraw()",
"Took %f msec", timer.End());
611 if (CurrentCamera().UpdateInterest(kFALSE)) {
614 fRedrawTimer->RequestDraw(0, fLOD);
617 if (fLOD != TGLRnrCtx::kLODHigh &&
618 (fDragAction < kDragCameraRotate || fDragAction > kDragCameraDolly))
621 fRedrawTimer->RequestDraw(100, TGLRnrCtx::kLODHigh);
628 void TGLViewer::DoDrawMono(Bool_t swap_buffers)
632 if (!fIsPrinting) PreDraw();
635 fRnrCtx->StartStopwatch();
640 fRnrCtx->StopStopwatch();
660 void TGLViewer::DoDrawStereo(Bool_t swap_buffers)
662 TGLPerspectiveCamera &c = *
dynamic_cast<TGLPerspectiveCamera*
>(fCurrentCamera);
664 Float_t gl_near, gl_far, zero_p_dist;
665 Float_t h_half, w_half;
666 Float_t x_len_at_zero_parallax;
667 Float_t stereo_offset;
668 Float_t frustum_asym;
675 glDrawBuffer(GL_BACK_LEFT);
679 glScissor(0, 0, fViewport.Width(), fViewport.Height());
680 glEnable(GL_SCISSOR_TEST);
685 gl_near = c.GetNearClip();
686 gl_far = c.GetFarClip();
687 zero_p_dist = gl_near + fStereoZeroParallax*(gl_far-gl_near);
689 h_half = TMath::Tan(0.5*TMath::DegToRad()*c.GetFOV()) * gl_near;
690 w_half = h_half * fViewport.Aspect();
692 x_len_at_zero_parallax = 2.0f * w_half * zero_p_dist / gl_near;
693 stereo_offset = 0.035f * x_len_at_zero_parallax * fStereoEyeOffsetFac;
695 frustum_asym = stereo_offset * gl_near / zero_p_dist * fStereoFrustumAsymFac;
697 TGLMatrix abs_trans(c.RefCamBase());
698 abs_trans *= c.RefCamTrans();
699 TGLVector3 left_vec = abs_trans.GetBaseVec(2);
701 glTranslatef(stereo_offset*left_vec[0], stereo_offset*left_vec[1], stereo_offset*left_vec[2]);
703 glMatrixMode(GL_PROJECTION);
705 glFrustum(-w_half + frustum_asym, w_half + frustum_asym,
706 -h_half, h_half, gl_near, gl_far);
707 glMatrixMode(GL_MODELVIEW);
709 fRnrCtx->StartStopwatch();
714 fRnrCtx->StopStopwatch();
727 glDrawBuffer(GL_BACK_RIGHT);
731 glScissor(fViewport.Width(), 0, fViewport.Width(), fViewport.Height());
735 if ( ! fStereoQuadBuf)
737 glViewport(fViewport.Width(), 0, fViewport.Width(), fViewport.Height());
740 glTranslatef(-stereo_offset*left_vec[0], -stereo_offset*left_vec[1], -stereo_offset*left_vec[2]);
742 glMatrixMode(GL_PROJECTION);
744 glFrustum(-w_half - frustum_asym, w_half - frustum_asym,
745 -h_half, h_half, gl_near, gl_far);
746 glMatrixMode(GL_MODELVIEW);
748 fRnrCtx->StartStopwatch();
753 fRnrCtx->StopStopwatch();
771 glDrawBuffer(GL_BACK);
775 glDisable(GL_SCISSOR_TEST);
776 glViewport(0, 0, fViewport.Width(), fViewport.Height());
785 Bool_t TGLViewer::SavePicture()
787 return SavePicture(fPictureFileName);
805 Bool_t TGLViewer::SavePicture(
const TString &fileName)
807 if (fileName.EndsWith(
".eps"))
809 return TGLOutput::Capture(*
this, TGLOutput::kEPS_BSP, fileName.Data());
811 else if (fileName.EndsWith(
".pdf"))
813 return TGLOutput::Capture(*
this, TGLOutput::kPDF_BSP, fileName.Data());
817 if (GLEW_EXT_framebuffer_object && gEnv->GetValue(
"OpenGL.SavePicturesViaFBO", 1))
819 return SavePictureUsingFBO(fileName, fViewport.Width(), fViewport.Height(), kFALSE);
823 return SavePictureUsingBB(fileName);
836 Bool_t TGLViewer::SavePictureUsingBB(
const TString &fileName)
838 static const TString eh(
"TGLViewer::SavePictureUsingBB");
840 if (! fileName.EndsWith(
".gif") && ! fileName.Contains(
".gif+") &&
841 ! fileName.EndsWith(
".jpg") && ! fileName.EndsWith(
".png"))
843 Warning(eh,
"file %s cannot be saved with this extension.", fileName.Data());
847 if ( ! TakeLock(kDrawLock)) {
848 Error(eh,
"viewer locked - try later.");
852 TUnlocker ulck(
this);
854 fLOD = TGLRnrCtx::kLODHigh;
855 fRnrCtx->SetGrabImage(kTRUE);
857 if (!gVirtualX->IsCmdThread())
858 gROOT->ProcessLineFast(Form(
"((TGLViewer *)0x%lx)->DoDraw(kFALSE)", (ULong_t)
this));
862 fRnrCtx->SetGrabImage(kFALSE);
864 glReadBuffer(GL_BACK);
866 UChar_t* xx =
new UChar_t[4 * fViewport.Width() * fViewport.Height()];
867 glPixelStorei(GL_PACK_ALIGNMENT, 1);
868 glReadPixels(0, 0, fViewport.Width(), fViewport.Height(),
869 GL_BGRA, GL_UNSIGNED_BYTE, xx);
871 std::unique_ptr<TImage> image(TImage::Create());
872 image->FromGLBuffer(xx, fViewport.Width(), fViewport.Height());
873 image->WriteImage(fileName);
893 Bool_t TGLViewer::SavePictureUsingFBO(
const TString &fileName, Int_t w, Int_t h,
894 Float_t pixel_object_scale)
896 static const TString eh(
"TGLViewer::SavePictureUsingFBO");
898 if (! fileName.EndsWith(
".gif") && ! fileName.Contains(
".gif+") &&
899 ! fileName.EndsWith(
".jpg") && ! fileName.EndsWith(
".png"))
901 Warning(eh,
"file %s cannot be saved with this extension.", fileName.Data());
905 if ( ! TakeLock(kDrawLock)) {
906 Error(eh,
"viewer locked - try later.");
910 TUnlocker ulck(
this);
914 TGLFBO *fbo =
new TGLFBO();
917 fbo->Init(w, h, fGLWidget->GetPixelFormat()->GetSamples());
919 catch (std::runtime_error& exc)
921 Error(eh,
"%s",exc.what());
922 if (gEnv->GetValue(
"OpenGL.SavePictureFallbackToBB", 1)) {
923 Info(eh,
"Falling back to saving image via back-buffer. Window must be fully visible.");
924 if (w != fViewport.Width() || h != fViewport.Height())
925 Warning(eh,
"Back-buffer does not support image scaling, window size will be used.");
926 return SavePictureUsingBB(fileName);
932 TGLRect old_vp(fViewport);
933 SetViewport(0, 0, w, h);
935 Float_t old_scale = 1;
936 if (pixel_object_scale != 0)
938 old_scale = fRnrCtx->GetRenderScale();
939 fRnrCtx->SetRenderScale(old_scale * pixel_object_scale);
944 fLOD = TGLRnrCtx::kLODHigh;
945 fRnrCtx->SetGrabImage(kTRUE);
947 if (!gVirtualX->IsCmdThread())
948 gROOT->ProcessLineFast(Form(
"((TGLViewer *)0x%lx)->DoDraw(kFALSE)", (ULong_t)
this));
952 fRnrCtx->SetGrabImage(kFALSE);
956 fbo->SetAsReadBuffer();
958 UChar_t* xx =
new UChar_t[4 * fViewport.Width() * fViewport.Height()];
959 glPixelStorei(GL_PACK_ALIGNMENT, 1);
960 glReadPixels(0, 0, fViewport.Width(), fViewport.Height(),
961 GL_BGRA, GL_UNSIGNED_BYTE, xx);
963 std::unique_ptr<TImage> image(TImage::Create());
964 image->FromGLBuffer(xx, fViewport.Width(), fViewport.Height());
965 image->WriteImage(fileName);
971 if (pixel_object_scale != 0)
973 fRnrCtx->SetRenderScale(old_scale);
987 TImage* TGLViewer::GetPictureUsingBB()
989 static const TString eh(
"TGLViewer::GetPictureUsingBB");
991 if ( ! TakeLock(kDrawLock)) {
992 Error(eh,
"viewer locked - try later.");
996 TUnlocker ulck(
this);
998 fLOD = TGLRnrCtx::kLODHigh;
999 fRnrCtx->SetGrabImage(kTRUE);
1001 if (!gVirtualX->IsCmdThread())
1002 gROOT->ProcessLineFast(Form(
"((TGLViewer *)0x%lx)->DoDraw(kFALSE)", (ULong_t)
this));
1006 fRnrCtx->SetGrabImage(kFALSE);
1008 glReadBuffer(GL_BACK);
1010 UChar_t* xx =
new UChar_t[4 * fViewport.Width() * fViewport.Height()];
1011 glPixelStorei(GL_PACK_ALIGNMENT, 1);
1012 glReadPixels(0, 0, fViewport.Width(), fViewport.Height(),
1013 GL_BGRA, GL_UNSIGNED_BYTE, xx);
1015 TImage *image(TImage::Create());
1016 image->FromGLBuffer(xx, fViewport.Width(), fViewport.Height());
1034 TImage* TGLViewer::GetPictureUsingFBO(Int_t w, Int_t h,Float_t pixel_object_scale)
1036 static const TString eh(
"TGLViewer::GetPictureUsingFBO");
1038 if ( ! TakeLock(kDrawLock)) {
1039 Error(eh,
"viewer locked - try later.");
1043 TUnlocker ulck(
this);
1047 TGLFBO *fbo =
new TGLFBO();
1050 fbo->Init(w, h, fGLWidget->GetPixelFormat()->GetSamples());
1052 catch (std::runtime_error& exc)
1054 Error(eh,
"%s",exc.what());
1055 if (gEnv->GetValue(
"OpenGL.GetPictureFallbackToBB", 1)) {
1056 Info(eh,
"Falling back to saving image via back-buffer. Window must be fully visible.");
1057 if (w != fViewport.Width() || h != fViewport.Height())
1058 Warning(eh,
"Back-buffer does not support image scaling, window size will be used.");
1059 return GetPictureUsingBB();
1065 TGLRect old_vp(fViewport);
1066 SetViewport(0, 0, w, h);
1068 Float_t old_scale = 1;
1069 if (pixel_object_scale != 0)
1071 old_scale = fRnrCtx->GetRenderScale();
1072 fRnrCtx->SetRenderScale(old_scale * pixel_object_scale);
1077 fLOD = TGLRnrCtx::kLODHigh;
1078 fRnrCtx->SetGrabImage(kTRUE);
1080 if (!gVirtualX->IsCmdThread())
1081 gROOT->ProcessLineFast(Form(
"((TGLViewer *)0x%lx)->DoDraw(kFALSE)", (ULong_t)
this));
1085 fRnrCtx->SetGrabImage(kFALSE);
1089 fbo->SetAsReadBuffer();
1091 UChar_t* xx =
new UChar_t[4 * fViewport.Width() * fViewport.Height()];
1092 glPixelStorei(GL_PACK_ALIGNMENT, 1);
1093 glReadPixels(0, 0, fViewport.Width(), fViewport.Height(),
1094 GL_BGRA, GL_UNSIGNED_BYTE, xx);
1096 TImage *image(TImage::Create());
1097 image->FromGLBuffer(xx, fViewport.Width(), fViewport.Height());
1102 if (pixel_object_scale != 0)
1104 fRnrCtx->SetRenderScale(old_scale);
1107 SetViewport(old_vp);
1118 Bool_t TGLViewer::SavePictureWidth(
const TString &fileName, Int_t width,
1119 Bool_t pixel_object_scale)
1121 Float_t scale = Float_t(width) / fViewport.Width();
1122 Int_t height = TMath::Nint(scale*fViewport.Height());
1124 return SavePictureUsingFBO(fileName, width, height, pixel_object_scale ? scale : 0);
1132 Bool_t TGLViewer::SavePictureHeight(
const TString &fileName, Int_t height,
1133 Bool_t pixel_object_scale)
1135 Float_t scale = Float_t(height) / fViewport.Height();
1136 Int_t width = TMath::Nint(scale*fViewport.Width());
1138 return SavePictureUsingFBO(fileName, width, height, pixel_object_scale ? scale : 0);
1146 Bool_t TGLViewer::SavePictureScale (
const TString &fileName, Float_t scale,
1147 Bool_t pixel_object_scale)
1149 Int_t w = TMath::Nint(scale*fViewport.Width());
1150 Int_t h = TMath::Nint(scale*fViewport.Height());
1152 return SavePictureUsingFBO(fileName, w, h, pixel_object_scale ? scale : 0);
1158 void TGLViewer::DrawGuides()
1160 Bool_t disabled = kFALSE;
1163 glDisable(GL_DEPTH_TEST);
1164 TGLUtil::DrawReferenceMarker(*fCamera, fReferencePos);
1167 if (fDrawCameraCenter)
1169 glDisable(GL_DEPTH_TEST);
1170 Float_t radius = fCamera->ViewportDeltaToWorld(TGLVertex3(fCamera->GetCenterVec()), 3, 3).Mag();
1171 const UChar_t rgba[4] = { 0, 255, 255, 255 };
1172 TGLUtil::DrawSphere(fCamera->GetCenterVec(), radius, rgba);
1175 if (fAxesDepthTest && disabled)
1177 glEnable(GL_DEPTH_TEST);
1180 else if (fAxesDepthTest == kFALSE && disabled == kFALSE)
1182 glDisable(GL_DEPTH_TEST);
1185 TGLUtil::DrawSimpleAxes(*fCamera, fOverallBoundingBox, fAxesType);
1187 glEnable(GL_DEPTH_TEST);
1193 void TGLViewer::DrawDebugInfo()
1197 glDisable(GL_LIGHTING);
1198 CurrentCamera().DrawDebugAids();
1201 glColor3d(0.0, 1.0, 0.0);
1202 fOverallBoundingBox.Draw();
1205 glDisable(GL_DEPTH_TEST);
1206 Double_t size = fOverallBoundingBox.Extents().Mag() / 200.0;
1207 TGLUtil::DrawSphere(TGLVertex3(0.0, 0.0, 0.0), size, TGLUtil::fgWhite);
1208 const TGLVertex3 & center = fOverallBoundingBox.Center();
1209 TGLUtil::DrawSphere(center, size, TGLUtil::fgGreen);
1210 glEnable(GL_DEPTH_TEST);
1212 glEnable(GL_LIGHTING);
1219 void TGLViewer::PreDraw()
1225 Color_t ci = (fGLDevice != -1) ? gPad->GetFillColor() : fRnrCtx->ColorSet().Background().GetColorIndex();
1226 TColor *color = gROOT->GetColor(ci);
1229 color->GetRGB(rgb[0], rgb[1], rgb[2]);
1231 rgb[0] = rgb[1] = rgb[2] = 0.0f;
1233 glClearColor(rgb[0], rgb[1], rgb[2], 0.0f);
1236 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
1238 TGLUtil::CheckError(
"TGLViewer::PreDraw");
1244 void TGLViewer::PostDraw()
1247 TGLUtil::CheckError(
"TGLViewer::PostDraw");
1254 void TGLViewer::FadeView(Float_t alpha)
1256 static const Float_t z = -1.0f;
1258 glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity();
1259 glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity();
1262 TGLCapabilitySwitch blend(GL_BLEND, kTRUE);
1263 TGLCapabilitySwitch light(GL_LIGHTING, kFALSE);
1264 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1265 TGLUtil::ColorAlpha(fRnrCtx->ColorSet().Background(), alpha);
1267 glVertex3f(-1, -1, z); glVertex3f( 1, -1, z);
1268 glVertex3f( 1, 1, z); glVertex3f(-1, 1, z);
1272 glMatrixMode(GL_PROJECTION); glPopMatrix();
1273 glMatrixMode(GL_MODELVIEW); glPopMatrix();
1279 void TGLViewer::MakeCurrent()
const
1281 if (fGLDevice == -1)
1282 fGLWidget->MakeCurrent();
1284 gGLManager->MakeCurrent(fGLDevice);
1290 void TGLViewer::SwapBuffers()
const
1292 if ( ! IsDrawOrSelectLock()) {
1293 Error(
"TGLViewer::SwapBuffers",
"viewer is %s", LockName(CurrentLock()));
1295 if (fGLDevice == -1)
1296 fGLWidget->SwapBuffers();
1298 gGLManager->ReadGLBuffer(fGLDevice);
1299 gGLManager->Flush(fGLDevice);
1300 gGLManager->MarkForDirectCopy(fGLDevice, kFALSE);
1308 Bool_t TGLViewer::RequestSelect(Int_t x, Int_t y)
1313 if ( ! TakeLock(kSelectLock)) {
1317 if (!gVirtualX->IsCmdThread())
1318 return Bool_t(gROOT->ProcessLineFast(Form(
"((TGLViewer *)0x%lx)->DoSelect(%d, %d)", (ULong_t)
this, x, y)));
1320 return DoSelect(x, y);
1330 Bool_t TGLViewer::DoSelect(Int_t x, Int_t y)
1332 R__LOCKGUARD(gROOTMutex);
1334 if (CurrentLock() != kSelectLock) {
1335 Error(
"TGLViewer::DoSelect",
"expected kSelectLock, found %s", LockName(CurrentLock()));
1339 TGLUtil::PointToViewport(x, y);
1341 TUnlocker ulck(
this);
1345 fRnrCtx->BeginSelection(x, y, TGLUtil::GetPickingRadius());
1346 glRenderMode(GL_SELECT);
1349 TGLViewerBase::Render();
1352 Int_t nHits = glRenderMode(GL_RENDER);
1353 fRnrCtx->EndSelection(nHits);
1356 if (gDebug > 0) Info(
"TGLViewer::DoSelect",
"Primary select nHits=%d.", nHits);
1361 if (FindClosestRecord(fSelRec, idx))
1363 if (fSelRec.GetTransparent() && fRnrCtx->SelectTransparents() != TGLRnrCtx::kIfClosest)
1365 TGLSelectRecord opaque;
1366 if (FindClosestOpaqueRecord(opaque, ++idx))
1368 else if (fRnrCtx->SelectTransparents() == TGLRnrCtx::kNever)
1371 if (gDebug > 1) fSelRec.Print();
1377 ReleaseLock(kSelectLock);
1378 return ! TGLSelectRecord::AreSameSelectionWise(fSelRec, fCurrentSelRec);
1384 Bool_t TGLViewer::RequestSecondarySelect(Int_t x, Int_t y)
1386 if ( ! TakeLock(kSelectLock)) {
1390 if (!gVirtualX->IsCmdThread())
1391 return Bool_t(gROOT->ProcessLineFast(Form(
"((TGLViewer *)0x%lx)->DoSecondarySelect(%d, %d)", (ULong_t)
this, x, y)));
1393 return DoSecondarySelect(x, y);
1399 Bool_t TGLViewer::DoSecondarySelect(Int_t x, Int_t y)
1401 R__LOCKGUARD(gROOTMutex);
1403 if (CurrentLock() != kSelectLock) {
1404 Error(
"TGLViewer::DoSecondarySelect",
"expected kSelectLock, found %s", LockName(CurrentLock()));
1408 TGLUtil::PointToViewport(x, y);
1410 TUnlocker ulck(
this);
1412 if (! fSelRec.GetSceneInfo() || ! fSelRec.GetPhysShape() ||
1413 ! fSelRec.GetLogShape()->SupportsSecondarySelect())
1416 Info(
"TGLViewer::SecondarySelect",
"Skipping secondary selection "
1417 "(sinfo=0x%lx, pshape=0x%lx).\n",
1418 (Long_t)fSelRec.GetSceneInfo(), (Long_t)fSelRec.GetPhysShape());
1425 TGLSceneInfo* sinfo = fSelRec.GetSceneInfo();
1426 TGLSceneBase* scene = sinfo->GetScene();
1427 TGLPhysicalShape* pshp = fSelRec.GetPhysShape();
1429 SceneInfoList_t foo;
1430 foo.push_back(sinfo);
1432 fRnrCtx->BeginSelection(x, y, TGLUtil::GetPickingRadius());
1433 fRnrCtx->SetSecSelection(kTRUE);
1434 glRenderMode(GL_SELECT);
1437 fRnrCtx->SetSceneInfo(sinfo);
1438 scene->PreRender(*fRnrCtx);
1439 fRnrCtx->SetDrawPass(TGLRnrCtx::kPassFill);
1440 fRnrCtx->SetShapeLOD(TGLRnrCtx::kLODHigh);
1441 glPushName(pshp->ID());
1443 pshp->Draw(*fRnrCtx);
1445 scene->PostRender(*fRnrCtx);
1446 fRnrCtx->SetSceneInfo(0);
1449 Int_t nSecHits = glRenderMode(GL_RENDER);
1450 fRnrCtx->EndSelection(nSecHits);
1453 if (gDebug > 0) Info(
"TGLViewer::DoSelect",
"Secondary select nSecHits=%d.", nSecHits);
1455 ReleaseLock(kSelectLock);
1459 fSecSelRec = fSelRec;
1460 fSecSelRec.SetRawOnly(fRnrCtx->GetSelectBuffer()->RawRecord(0));
1461 if (gDebug > 1) fSecSelRec.Print();
1474 void TGLViewer::ApplySelection()
1476 fCurrentSelRec = fSelRec;
1478 TGLPhysicalShape *selPhys = fSelRec.GetPhysShape();
1479 fSelectedPShapeRef->SetPShape(selPhys);
1484 RequestDraw(TGLRnrCtx::kLODHigh);
1491 Bool_t TGLViewer::RequestOverlaySelect(Int_t x, Int_t y)
1496 if ( ! TakeLock(kSelectLock)) {
1500 if (!gVirtualX->IsCmdThread())
1501 return Bool_t(gROOT->ProcessLineFast(Form(
"((TGLViewer *)0x%lx)->DoOverlaySelect(%d, %d)", (ULong_t)
this, x, y)));
1503 return DoOverlaySelect(x, y);
1510 Bool_t TGLViewer::DoOverlaySelect(Int_t x, Int_t y)
1512 R__LOCKGUARD(gROOTMutex);
1514 if (CurrentLock() != kSelectLock) {
1515 Error(
"TGLViewer::DoOverlaySelect",
"expected kSelectLock, found %s", LockName(CurrentLock()));
1519 TGLUtil::PointToViewport(x, y);
1521 TUnlocker ulck(
this);
1525 fRnrCtx->BeginSelection(x, y, TGLUtil::GetPickingRadius());
1526 glRenderMode(GL_SELECT);
1528 PreRenderOverlaySelection();
1529 RenderOverlay(TGLOverlayElement::kActive, kTRUE);
1530 PostRenderOverlaySelection();
1532 Int_t nHits = glRenderMode(GL_RENDER);
1533 fRnrCtx->EndSelection(nHits);
1536 TGLOverlayElement * selElm = 0;
1540 while (idx < nHits && FindClosestOverlayRecord(fOvlSelRec, idx))
1542 TGLOverlayElement* el = fOvlSelRec.GetOvlElement();
1543 if (el == fCurrentOvlElm)
1545 if (el->MouseStillInside(fOvlSelRec))
1551 else if (el->MouseEnter(fOvlSelRec))
1564 ReleaseLock(kSelectLock);
1566 if (fCurrentOvlElm != selElm)
1568 if (fCurrentOvlElm) fCurrentOvlElm->MouseLeave();
1569 fCurrentOvlElm = selElm;
1581 void TGLFaderHelper::MakeFadeStep()
1583 Float_t fade = fViewer->GetFader();
1585 if (fade == fFadeTarget) {
1586 delete this;
return;
1588 if (TMath::Abs(fFadeTarget - fade) < 1e-3) {
1589 fViewer->SetFader(fFadeTarget);
1590 fViewer->RequestDraw(TGLRnrCtx::kLODHigh);
1595 Float_t dt = fTime/fNSteps;
1596 Float_t df = (fFadeTarget - fade)/fNSteps;
1597 fViewer->SetFader(fade + df);
1598 fViewer->RequestDraw(TGLRnrCtx::kLODHigh);
1599 fTime -= dt; --fNSteps;
1600 TTimer::SingleShot(TMath::CeilNint(1000*dt),
1601 "TGLFaderHelper",
this,
"MakeFadeStep()");
1608 void TGLViewer::AutoFade(Float_t fade, Float_t time, Int_t steps)
1610 TGLFaderHelper* fh =
new TGLFaderHelper(
this, fade, time, steps);
1617 void TGLViewer::UseDarkColorSet()
1619 fRnrCtx->ChangeBaseColorSet(&fDarkColorSet);
1620 RefreshPadEditor(
this);
1626 void TGLViewer::UseLightColorSet()
1628 fRnrCtx->ChangeBaseColorSet(&fLightColorSet);
1629 RefreshPadEditor(
this);
1635 void TGLViewer::SwitchColorSet()
1637 if (IsUsingDefaultColorSet())
1639 Info(
"SwitchColorSet()",
"Global color-set is in use, switch not supported.");
1643 if (fRnrCtx->GetBaseColorSet() == &fLightColorSet)
1652 void TGLViewer::UseDefaultColorSet(Bool_t x)
1655 fRnrCtx->ChangeBaseColorSet(&fgDefaultColorSet);
1657 fRnrCtx->ChangeBaseColorSet(&fDarkColorSet);
1658 RefreshPadEditor(
this);
1665 Bool_t TGLViewer::IsUsingDefaultColorSet()
const
1667 return fRnrCtx->GetBaseColorSet() == &fgDefaultColorSet;
1674 void TGLViewer::SetClearColor(Color_t col)
1676 fRnrCtx->GetBaseColorSet()->Background().SetColor(col);
1683 TGLColorSet& TGLViewer::GetDefaultColorSet()
1685 return fgDefaultColorSet;
1693 void TGLViewer::UseDefaultColorSetForNewViewers(Bool_t x)
1695 fgUseDefaultColorSetForNewViewers = x;
1703 Bool_t TGLViewer::IsUsingDefaultColorSetForNewViewers()
1705 return fgUseDefaultColorSetForNewViewers;
1711 Bool_t TGLViewer::IsColorSetDark()
const
1713 return fRnrCtx->GetBaseColorSet() == &fDarkColorSet;
1724 void TGLViewer::SetViewport(Int_t x, Int_t y, Int_t width, Int_t height)
1726 if (fStereo && ! fStereoQuadBuf) width /= 2;
1729 if (fViewport.X() == x && fViewport.Y() == y &&
1730 fViewport.Width() == width && fViewport.Height() == height) {
1734 fViewport.Set(x, y, width, height);
1735 fCurrentCamera->SetViewport(fViewport);
1738 Info(
"TGLViewer::SetViewport",
"updated - corner %d,%d dimensions %d,%d", x, y, width, height);
1742 void TGLViewer::SetViewport(
const TGLRect& vp)
1746 SetViewport(vp.X(), vp.Y(), vp.Width(), vp.Height());
1756 TGLCamera& TGLViewer::RefCamera(ECameraType cameraType)
1759 switch(cameraType) {
1760 case kCameraPerspXOZ:
1761 return fPerspectiveCameraXOZ;
1762 case kCameraPerspYOZ:
1763 return fPerspectiveCameraYOZ;
1764 case kCameraPerspXOY:
1765 return fPerspectiveCameraXOY;
1766 case kCameraOrthoXOY:
1767 return fOrthoXOYCamera;
1768 case kCameraOrthoXOZ:
1769 return fOrthoXOZCamera;
1770 case kCameraOrthoZOY:
1771 return fOrthoZOXCamera;
1772 case kCameraOrthoZOX:
1773 return fOrthoZOYCamera;
1774 case kCameraOrthoXnOY:
1775 return fOrthoXnOYCamera;
1776 case kCameraOrthoXnOZ:
1777 return fOrthoXnOZCamera;
1778 case kCameraOrthoZnOY:
1779 return fOrthoZnOYCamera;
1780 case kCameraOrthoZnOX:
1781 return fOrthoZnOXCamera;
1783 Error(
"TGLViewer::SetCurrentCamera",
"invalid camera type");
1784 return *fCurrentCamera;
1794 void TGLViewer::SetCurrentCamera(ECameraType cameraType)
1797 Error(
"TGLViewer::SetCurrentCamera",
"expected kUnlocked, found %s", LockName(CurrentLock()));
1802 TGLCamera *prev = fCurrentCamera;
1805 case kCameraPerspXOZ: {
1806 fCurrentCamera = &fPerspectiveCameraXOZ;
1809 case kCameraPerspYOZ: {
1810 fCurrentCamera = &fPerspectiveCameraYOZ;
1813 case kCameraPerspXOY: {
1814 fCurrentCamera = &fPerspectiveCameraXOY;
1817 case kCameraOrthoXOY: {
1818 fCurrentCamera = &fOrthoXOYCamera;
1821 case kCameraOrthoXOZ: {
1822 fCurrentCamera = &fOrthoXOZCamera;
1825 case kCameraOrthoZOY: {
1826 fCurrentCamera = &fOrthoZOYCamera;
1829 case kCameraOrthoZOX: {
1830 fCurrentCamera = &fOrthoZOXCamera;
1833 case kCameraOrthoXnOY: {
1834 fCurrentCamera = &fOrthoXnOYCamera;
1837 case kCameraOrthoXnOZ: {
1838 fCurrentCamera = &fOrthoXnOZCamera;
1841 case kCameraOrthoZnOY: {
1842 fCurrentCamera = &fOrthoZnOYCamera;
1845 case kCameraOrthoZnOX: {
1846 fCurrentCamera = &fOrthoZnOXCamera;
1850 Error(
"TGLViewer::SetCurrentCamera",
"invalid camera type");
1855 if (fCurrentCamera != prev)
1858 fCurrentCamera->SetViewport(fViewport);
1859 RefreshPadEditor(
this);
1863 if (fAutoRotator->IsRunning())
1865 fAutoRotator->Stop();
1869 if (fAutoRotator->GetCamera() == fCurrentCamera)
1871 fAutoRotator->Start();
1876 RequestDraw(TGLRnrCtx::kLODHigh);
1894 void TGLViewer::SetOrthoCamera(ECameraType camera,
1895 Double_t zoom, Double_t dolly,
1897 Double_t hRotate, Double_t vRotate)
1901 case kCameraOrthoXOY: {
1902 fOrthoXOYCamera.Configure(zoom, dolly, center, hRotate, vRotate);
1903 if (fCurrentCamera == &fOrthoXOYCamera) {
1904 RequestDraw(TGLRnrCtx::kLODHigh);
1908 case kCameraOrthoXOZ: {
1909 fOrthoXOZCamera.Configure(zoom, dolly, center, hRotate, vRotate);
1910 if (fCurrentCamera == &fOrthoXOZCamera) {
1911 RequestDraw(TGLRnrCtx::kLODHigh);
1915 case kCameraOrthoZOY: {
1916 fOrthoZOYCamera.Configure(zoom, dolly, center, hRotate, vRotate);
1917 if (fCurrentCamera == &fOrthoZOYCamera) {
1918 RequestDraw(TGLRnrCtx::kLODHigh);
1922 case kCameraOrthoZOX: {
1923 fOrthoZOXCamera.Configure(zoom, dolly, center, hRotate, vRotate);
1924 if (fCurrentCamera == &fOrthoZOXCamera) {
1925 RequestDraw(TGLRnrCtx::kLODHigh);
1930 Error(
"TGLViewer::SetOrthoCamera",
"invalid camera type");
1949 void TGLViewer::SetPerspectiveCamera(ECameraType camera,
1950 Double_t fov, Double_t dolly,
1952 Double_t hRotate, Double_t vRotate)
1956 case kCameraPerspXOZ: {
1957 fPerspectiveCameraXOZ.Configure(fov, dolly, center, hRotate, vRotate);
1958 if (fCurrentCamera == &fPerspectiveCameraXOZ) {
1959 RequestDraw(TGLRnrCtx::kLODHigh);
1963 case kCameraPerspYOZ: {
1964 fPerspectiveCameraYOZ.Configure(fov, dolly, center, hRotate, vRotate);
1965 if (fCurrentCamera == &fPerspectiveCameraYOZ) {
1966 RequestDraw(TGLRnrCtx::kLODHigh);
1970 case kCameraPerspXOY: {
1971 fPerspectiveCameraXOY.Configure(fov, dolly, center, hRotate, vRotate);
1972 if (fCurrentCamera == &fPerspectiveCameraXOY) {
1973 RequestDraw(TGLRnrCtx::kLODHigh);
1978 Error(
"TGLViewer::SetPerspectiveCamera",
"invalid camera type");
1989 void TGLViewer::ReinitializeCurrentCamera(
const TGLVector3& hAxis,
const TGLVector3& vAxis, Bool_t redraw)
1991 TGLMatrix& cb = fCurrentCamera->RefCamBase();
1992 cb.Set(cb.GetTranslation(), vAxis, hAxis);
1993 fCurrentCamera->Setup(fOverallBoundingBox, kTRUE);
2001 TGLAutoRotator* TGLViewer::GetAutoRotator()
2003 if (fAutoRotator == 0)
2004 fAutoRotator =
new TGLAutoRotator(
this);
2005 return fAutoRotator;
2011 void TGLViewer::SetAutoRotator(TGLAutoRotator* ar)
2013 delete fAutoRotator;
2026 void TGLViewer::SetStereo(Bool_t stereo, Bool_t quad_buf)
2028 if (stereo != fStereo)
2031 fStereoQuadBuf = quad_buf;
2033 SetViewport(fViewport.X(), fViewport.Y(), fViewport.Width(), fViewport.Height());
2035 SetViewport(fViewport.X(), fViewport.Y(), 2*fViewport.Width(), fViewport.Height());
2037 RequestDraw(TGLRnrCtx::kLODHigh);
2047 void TGLViewer::GetGuideState(Int_t & axesType, Bool_t & axesDepthTest, Bool_t & referenceOn, Double_t referencePos[3])
const
2049 axesType = fAxesType;
2050 axesDepthTest = fAxesDepthTest;
2052 referenceOn = fReferenceOn;
2053 referencePos[0] = fReferencePos.X();
2054 referencePos[1] = fReferencePos.Y();
2055 referencePos[2] = fReferencePos.Z();
2061 void TGLViewer::SetGuideState(Int_t axesType, Bool_t axesDepthTest, Bool_t referenceOn,
const Double_t referencePos[3])
2063 fAxesType = axesType;
2064 fAxesDepthTest = axesDepthTest;
2065 fReferenceOn = referenceOn;
2067 fReferencePos.Set(referencePos[0], referencePos[1], referencePos[2]);
2068 if (fGLDevice != -1)
2069 gGLManager->MarkForDirectCopy(fGLDevice, kTRUE);
2076 void TGLViewer::SetDrawCameraCenter(Bool_t x)
2078 fDrawCameraCenter = x;
2086 const TGLPhysicalShape * TGLViewer::GetSelected()
const
2088 return fSelectedPShapeRef->GetPShape();
2097 void TGLViewer::MouseOver(TGLPhysicalShape *shape)
2099 Emit(
"MouseOver(TGLPhysicalShape*)", (Long_t)shape);
2105 void TGLViewer::MouseOver(TGLPhysicalShape *shape, UInt_t state)
2108 args[0] = (Long_t)shape;
2110 Emit(
"MouseOver(TGLPhysicalShape*,UInt_t)", args);
2116 void TGLViewer::MouseOver(TObject *obj, UInt_t state)
2119 args[0] = (Long_t)obj;
2121 Emit(
"MouseOver(TObject*,UInt_t)", args);
2127 void TGLViewer::ReMouseOver(TObject *obj, UInt_t state)
2130 args[0] = (Long_t)obj;
2132 Emit(
"ReMouseOver(TObject*,UInt_t)", args);
2139 void TGLViewer::UnMouseOver(TObject *obj, UInt_t state)
2142 args[0] = (Long_t)obj;
2144 Emit(
"UnMouseOver(TObject*,UInt_t)", args);
2150 void TGLViewer::Clicked(TObject *obj)
2152 Emit(
"Clicked(TObject*)", (Long_t)obj);
2158 void TGLViewer::Clicked(TObject *obj, UInt_t button, UInt_t state)
2161 args[0] = (Long_t)obj;
2164 Emit(
"Clicked(TObject*,UInt_t,UInt_t)", args);
2171 void TGLViewer::ReClicked(TObject *obj, UInt_t button, UInt_t state)
2174 args[0] = (Long_t)obj;
2177 Emit(
"ReClicked(TObject*,UInt_t,UInt_t)", args);
2183 void TGLViewer::UnClicked(TObject *obj, UInt_t button, UInt_t state)
2186 args[0] = (Long_t)obj;
2189 Emit(
"UnClicked(TObject*,UInt_t,UInt_t)", args);
2195 void TGLViewer::MouseIdle(TGLPhysicalShape *shape, UInt_t posx, UInt_t posy)
2198 static UInt_t oldx = 0, oldy = 0;
2200 if (oldx != posx || oldy != posy) {
2201 args[0] = (Long_t)shape;
2204 Emit(
"MouseIdle(TGLPhysicalShape*,UInt_t,UInt_t)", args);
2217 Int_t TGLViewer::DistancetoPrimitive(Int_t , Int_t )
2221 gPad->SetSelected(
this);
2230 void TGLViewer::ExecuteEvent(Int_t event, Int_t px, Int_t py)
2233 return fEventHandler->ExecuteEvent(event, px, py);
2239 void TGLViewer::PrintObjects()
2241 TGLOutput::Capture(*
this);
2247 void TGLViewer::SelectionChanged()
2252 TGLPhysicalShape *selected =
const_cast<TGLPhysicalShape*
>(GetSelected());
2255 fPShapeWrap->fPShape = selected;
2256 fGedEditor->SetModel(fPad, fPShapeWrap, kButton1Down);
2258 fPShapeWrap->fPShape = 0;
2259 fGedEditor->SetModel(fPad,
this, kButton1Down);
2267 void TGLViewer::OverlayDragFinished()
2271 fGedEditor->SetModel(fPad, fGedEditor->GetModel(), kButton1Down);
2278 void TGLViewer::RefreshPadEditor(TObject* obj)
2280 if (fGedEditor && (obj == 0 || fGedEditor->GetModel() == obj))
2282 fGedEditor->SetModel(fPad, fGedEditor->GetModel(), kButton1Down);
2293 void TGLViewer::SetEventHandler(TGEventHandler *handler)
2296 delete fEventHandler;
2298 fEventHandler = handler;
2300 fGLWidget->SetEventHandler(fEventHandler);
2306 void TGLViewer::RemoveOverlayElement(TGLOverlayElement* el)
2308 if (el == fCurrentOvlElm)
2312 TGLViewerBase::RemoveOverlayElement(el);
2320 void TGLViewer::ClearCurrentOvlElm()
2324 fCurrentOvlElm->MouseLeave();