Logo ROOT   6.10/09
Reference Guide
TGLPlotCamera.cxx
Go to the documentation of this file.
1 // @(#)root/gl:$Id$
2 // Author: Timur Pocheptsov
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 #include "TGLPlotCamera.h"
12 #include "TGLIncludes.h"
13 #include "TVirtualGL.h"
14 #include "TGLUtil.h"
15 
16 /** \class TGLPlotCamera
17 \ingroup opengl
18 Camera for TGLPlotPainter and sub-classes.
19 */
20 
22 
23 ////////////////////////////////////////////////////////////////////////////////
24 ///Construct camera for plot painters.
25 
27  fZoom(1.), fShift(1.5), fCenter(),
28  fVpChanged(kFALSE)
29 {
30  fOrthoBox[0] = 1.;
31  fOrthoBox[1] = 1.;
32  fOrthoBox[2] = -100.;
33  fOrthoBox[3] = 100.;
34 }
35 
36 ////////////////////////////////////////////////////////////////////////////////
37 ///Setup viewport, if it was changed, plus reset arcball.
38 
40 {
41  if (vp.Width() != fViewport.Width() || vp.Height() != fViewport.Height() ||
42  vp.X() != fViewport.X() || vp.Y() != fViewport.Y())
43  {
44  fVpChanged = kTRUE;
45  fArcBall.SetBounds(vp.Width(), vp.Height());
46  fViewport = vp;
47 
48  } else
50 }
51 
52 ////////////////////////////////////////////////////////////////////////////////
53 ///'box' is the TGLPlotPainter's back box's coordinates.
54 
56 {
57 /* fCenter[0] = (box[0].X() + box[1].X()) / 2;
58  fCenter[1] = (box[0].Y() + box[2].Y()) / 2;
59  fCenter[2] = (box[0].Z() + box[4].Z()) / 2;
60  const Double_t maxDim = box[1].X() - box[0].X();
61  fOrthoBox[0] = maxDim;
62  fOrthoBox[1] = maxDim;
63  fOrthoBox[2] = -100 * maxDim;//100?
64  fOrthoBox[3] = 100 * maxDim;
65  fShift = maxDim * 1.5;*/
66 }
67 
68 ////////////////////////////////////////////////////////////////////////////////
69 ///User clicks somewhere (px, py).
70 
72 {
73  fArcBall.Click(TPoint(px, py));
74 }
75 
76 ////////////////////////////////////////////////////////////////////////////////
77 ///Mouse movement.
78 
80 {
81  fArcBall.Drag(TPoint(px, py));
82 }
83 
84 ////////////////////////////////////////////////////////////////////////////////
85 ///User clicks somewhere (px, py).
86 
88 {
89  fMousePos.fX = px;
90  fMousePos.fY = fViewport.Height() - py;
91 }
92 
93 ////////////////////////////////////////////////////////////////////////////////
94 ///Pan camera.
95 
97 {
98  py = fViewport.Height() - py;
99 
100  //Extract gl matrices.
101  Double_t mv[16] = {0.};
102  glGetDoublev(GL_MODELVIEW_MATRIX, mv);
103  Double_t pr[16] = {0.};
104  glGetDoublev(GL_PROJECTION_MATRIX, pr);
105  Int_t vp[] = {0, 0, fViewport.Width(), fViewport.Height()};
106  //Adjust pan vector.
107  TGLVertex3 start, end;
108  gluUnProject(fMousePos.fX, fMousePos.fY, 1., mv, pr, vp, &start.X(), &start.Y(), &start.Z());
109  gluUnProject(px, py, 1., mv, pr, vp, &end.X(), &end.Y(), &end.Z());
110  fTruck += (start - end) /= 2.;
111  //
112  fMousePos.fX = px;
113  fMousePos.fY = py;
114 }
115 
116 ////////////////////////////////////////////////////////////////////////////////
117 ///Viewport and projection.
118 
120 {
121  glViewport(fViewport.X(), fViewport.Y(), fViewport.Width(), fViewport.Height());
122 
123  glMatrixMode(GL_PROJECTION);
124  glLoadIdentity();
125  glOrtho(
126  -fOrthoBox[0] * fZoom,
127  fOrthoBox[0] * fZoom,
128  -fOrthoBox[1] * fZoom,
129  fOrthoBox[1] * fZoom,
130  fOrthoBox[2],
131  fOrthoBox[3]
132  );
133 
134  glMatrixMode(GL_MODELVIEW);
135  glLoadIdentity();
136 }
137 
138 ////////////////////////////////////////////////////////////////////////////////
139 ///Applies rotations and translations before drawing
140 
142 {
143  glTranslated(0., 0., -fShift);
144  glMultMatrixd(fArcBall.GetRotMatrix());
145  glRotated(theta - 90., 1., 0., 0.);
146  glRotated(phi, 0., 0., 1.);
147  glTranslated(-fTruck[0], -fTruck[1], -fTruck[2]);
148 // glTranslated(-fCenter[0], -fCenter[1], -fCenter[2]);
149 }
150 
151 ////////////////////////////////////////////////////////////////////////////////
152 ///viewport[0]
153 
155 {
156  return fViewport.X();
157 }
158 
159 ////////////////////////////////////////////////////////////////////////////////
160 ///viewport[1]
161 
163 {
164  return fViewport.Y();
165 }
166 
167 ////////////////////////////////////////////////////////////////////////////////
168 ///viewport[2]
169 
171 {
172  return Int_t(fViewport.Width());
173 }
174 
175 ////////////////////////////////////////////////////////////////////////////////
176 ///viewport[3]
177 
179 {
180  return Int_t(fViewport.Height());
181 }
182 
183 ////////////////////////////////////////////////////////////////////////////////
184 ///Zoom in.
185 
187 {
188  fZoom /= 1.2;
189 }
190 
191 ////////////////////////////////////////////////////////////////////////////////
192 ///Zoom out.
193 
195 {
196  fZoom *= 1.2;
197 }
void SetViewport(const TGLRect &vp)
Setup viewport, if it was changed, plus reset arcball.
Camera for TGLPlotPainter and sub-classes.
Definition: TGLPlotCamera.h:21
TArcBall fArcBall
Definition: TGLPlotCamera.h:34
Int_t X() const
Definition: TGLUtil.h:447
void Click(const TPoint &NewPt)
Mouse down.
Definition: TArcBall.cxx:249
void StartPan(Int_t px, Int_t py)
User clicks somewhere (px, py).
const Double_t * GetRotMatrix() const
Definition: TArcBall.h:47
SCoord_t fX
Definition: TPoint.h:35
SCoord_t fY
Definition: TPoint.h:36
Int_t GetWidth() const
viewport[2]
int Int_t
Definition: RtypesCore.h:41
Int_t Y() const
Definition: TGLUtil.h:449
void Apply(Double_t phi, Double_t theta) const
Applies rotations and translations before drawing.
void Drag(const TPoint &NewPt)
Mouse drag, calculate rotation.
Definition: TArcBall.cxx:260
3 component (x/y/z) vertex class.
Definition: TGLUtil.h:82
TGLVector3 fTruck
Definition: TGLPlotCamera.h:33
void SetCamera() const
Viewport and projection.
void ZoomOut()
Zoom out.
Viewport (pixel base) 2D rectangle class.
Definition: TGLUtil.h:422
void StartRotation(Int_t px, Int_t py)
User clicks somewhere (px, py).
void SetViewVolume(const TGLVertex3 *box)
'box' is the TGLPlotPainter's back box's coordinates.
TGLRect fViewport
Definition: TGLPlotCamera.h:28
Double_t fOrthoBox[4]
Definition: TGLPlotCamera.h:31
Definition: TPoint.h:31
Bool_t fVpChanged
Definition: TGLPlotCamera.h:36
Double_t fZoom
Definition: TGLPlotCamera.h:29
void RotateCamera(Int_t px, Int_t py)
Mouse movement.
TPoint fMousePos
Definition: TGLPlotCamera.h:35
void Pan(Int_t px, Int_t py)
Pan camera.
TGLPlotCamera()
Construct camera for plot painters.
Int_t Width() const
Definition: TGLUtil.h:451
const Bool_t kFALSE
Definition: RtypesCore.h:92
Double_t Z() const
Definition: TGLUtil.h:122
#define ClassImp(name)
Definition: Rtypes.h:336
double Double_t
Definition: RtypesCore.h:55
Int_t GetY() const
viewport[1]
void SetBounds(UInt_t NewWidth, UInt_t NewHeight)
Definition: TArcBall.h:38
void ZoomIn()
Zoom in.
Int_t Height() const
Definition: TGLUtil.h:453
Int_t GetHeight() const
viewport[3]
Double_t Y() const
Definition: TGLUtil.h:120
const Bool_t kTRUE
Definition: RtypesCore.h:91
Int_t GetX() const
viewport[0]
Double_t fShift
Definition: TGLPlotCamera.h:30
Double_t X() const
Definition: TGLUtil.h:118