ROOT  6.07/01
Reference Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
TGLTransManip.cxx
Go to the documentation of this file.
1 // @(#)root/gl:$Id$
2 // Author: Richard Maunder 16/09/2005
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2005, 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 
12 #include "TGLTransManip.h"
13 #include "TGLPhysicalShape.h"
14 #include "TGLCamera.h"
15 #include "TGLIncludes.h"
16 
17 /** \class TGLTransManip
18 \ingroup opengl
19 Translation manipulator - attaches to physical shape and draws local
20 axes widgets with arrow heads. User can mouse over (turns yellow) and
21 L click/drag to translate along this axis.
22 Widgets use standard 3D package axes colours: X red, Y green, Z blue.
23 */
24 
26 
27 ////////////////////////////////////////////////////////////////////////////////
28 /// Construct translation manipulator not bound to any physical shape.
29 
31 {
32 }
33 
34 ////////////////////////////////////////////////////////////////////////////////
35 /// Construct translation manipulator, attached to supplied TGLViewer
36 /// 'viewer', bound to TGLPhysicalShape 'shape'.
37 
39  TGLManip(shape)
40 {
41 }
42 
43 ////////////////////////////////////////////////////////////////////////////////
44 /// Destroy the translation manipulator
45 
47 {
48 }
49 
50 ////////////////////////////////////////////////////////////////////////////////
51 /// Draw translation manipulator - tubes with arrow heads, in local axes of
52 /// attached shape, in red(X), green(Y) and blue(Z), with white center sphere.
53 /// If selected widget (mouse over) this is drawn in active colour (yellow).
54 
56 {
57  if (!fShape) {
58  return;
59  }
60 
61  // Get draw scales
62  const TGLBoundingBox & box = fShape->BoundingBox();
63  Double_t baseScale;
64  TGLVector3 axisScale[3];
65  CalcDrawScale(box, camera, baseScale, axisScale);
66 
67  // Get permitted manipulations on shape
69 
70  glEnable(GL_BLEND);
71  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
72  glDisable(GL_CULL_FACE);
73 
74  // Draw three axis widgets out of bounding box where permitted
75  // Not drawing will prevent interaction
76  // GL name loading for hit testing - 0 reserved for no selection
77  if (manip & TGLPhysicalShape::kTranslateX) {
78  glPushName(1);
80  baseScale, ColorFor(1));
81  glPopName();
82  } else {
84  baseScale, TGLUtil::fgGrey);
85  }
86  if (manip & TGLPhysicalShape::kTranslateY) {
87  glPushName(2);
89  baseScale, ColorFor(2));
90  glPopName();
91  } else {
93  baseScale, TGLUtil::fgGrey);
94  }
95  if (manip & TGLPhysicalShape::kTranslateZ) {
96  glPushName(3);
98  baseScale, ColorFor(3));
99  glPopName();
100  } else {
101  TGLUtil::DrawLine(box.Center(), axisScale[2], TGLUtil::kLineHeadArrow,
102  baseScale, TGLUtil::fgGrey);
103  }
104  // Draw white center sphere
105  TGLUtil::DrawSphere(box.Center(), baseScale/2.0, TGLUtil::fgWhite);
106 
107  glEnable(GL_CULL_FACE);
108  glDisable(GL_BLEND);
109 }
110 
111 ////////////////////////////////////////////////////////////////////////////////
112 /// Handle mouse motion over manipulator - if active (selected
113 /// widget) translate physical along selected widget (axis) of the
114 /// manipulator, so it tracks mouse action. Returns kTRUE if redraw
115 /// required kFALSE otherwise.
116 
118  const TGLCamera & camera)
119 {
120  if (fActive) {
121  // Find mouse delta projected into world at attached object center
122  TGLVector3 shift =
124  event.fX - fLastMouse.GetX(),
125  -event.fY + fLastMouse.GetY() ); // Y inverted
126 
127  // Now project this delta onto the current widget (axis) to give
128  // a constrained shift along this
129  UInt_t axisIndex = fSelectedWidget - 1; // Ugg sort out axis / widget id mapping
130  TGLVector3 widgetAxis = fShape->BoundingBox().Axis(axisIndex, kTRUE);
131  TGLVector3 constrainedShift = widgetAxis * Dot(shift, widgetAxis);
132  fShape->Translate(constrainedShift);
133 
134  fLastMouse.SetX(event.fX);
135  fLastMouse.SetY(event.fY);
136 
137  return kTRUE;
138  }
139  return kFALSE;
140 }
141 
virtual void Draw(const TGLCamera &camera) const
Draw translation manipulator - tubes with arrow heads, in local axes of attached shape, in red(X), green(Y) and blue(Z), with white center sphere.
Abstract base class for viewer manipulators, which allow direct in viewer manipulation of a (TGlPhysi...
Definition: TGLManip.h:36
void SetX(SCoord_t x)
Definition: TPoint.h:51
const UChar_t * ColorFor(UInt_t widget) const
Returns color to be used for given widget.
Definition: TGLManip.cxx:97
Abstract base camera class - concrete classes for orthographic and perspective cameras derive from it...
Definition: TGLCamera.h:43
void Translate(const TGLVector3 &vect)
static void DrawLine(const TGLLine3 &line, ELineHeadShape head, Double_t size, const UChar_t rgba[4])
Draw thick line (tube) defined by 'line', with head at end shape 'head' - box/arrow/none, (head) size 'size', color 'rgba'.
Definition: TGLUtil.cxx:2333
const TGLBoundingBox & BoundingBox() const
TGLVector3 ViewportDeltaToWorld(const TGLVertex3 &worldRef, Double_t viewportXDelta, Double_t viewportYDelta, TGLMatrix *modviewMat=0) const
Apply a 2D viewport delta (shift) to the projection of worldRef onto viewport, returning the resultan...
Definition: TGLCamera.cxx:546
Int_t fY
Definition: GuiTypes.h:179
TGLVertex3 Center() const
static const UChar_t fgGrey[4]
Definition: TGLUtil.h:1056
bool Bool_t
Definition: RtypesCore.h:59
virtual Bool_t HandleMotion(const Event_t &event, const TGLCamera &camera)
Handle mouse motion over manipulator - if active (selected widget) translate physical along selected ...
const Bool_t kFALSE
Definition: Rtypes.h:92
UInt_t fSelectedWidget
manipulated shape
Definition: TGLManip.h:40
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Definition: fillpatterns.C:1
virtual ~TGLTransManip()
Destroy the translation manipulator.
void SetY(SCoord_t y)
Definition: TPoint.h:52
TGLViewer::ECameraType camera
Concrete physical shape - a GL drawable.
static void DrawSphere(const TGLVertex3 &position, Double_t radius, const UChar_t rgba[4])
Draw sphere, centered on vertex 'position', with radius 'radius', color 'rgba'.
Definition: TGLUtil.cxx:2318
ClassImp(TGLTransManip) TGLTransManip
Construct translation manipulator not bound to any physical shape.
3 component (x/y/z) vector class.
Definition: TGLUtil.h:250
TPoint fLastMouse
first (start) mouse position (in WINDOW coords)
Definition: TGLManip.h:45
void CalcDrawScale(const TGLBoundingBox &box, const TGLCamera &camera, Double_t &base, TGLVector3 axis[3]) const
Calculates base and axis scale factor (in world units) for drawing manipulators with reasonable size ...
Definition: TGLManip.cxx:156
SCoord_t GetY() const
Definition: TPoint.h:50
Bool_t fActive
active width (axis) component
Definition: TGLManip.h:41
static const UChar_t fgWhite[4]
Definition: TGLUtil.h:1055
EManip GetManip() const
TGLPhysicalShape * fShape
Definition: TGLManip.h:39
unsigned int UInt_t
Definition: RtypesCore.h:42
Double_t Dot(const TGLVector3 &v1, const TGLVector3 &v2)
Definition: TGLUtil.h:322
double Double_t
Definition: RtypesCore.h:55
const TGLVector3 & Axis(UInt_t i, Bool_t normalised=kTRUE) const
SCoord_t GetX() const
Definition: TPoint.h:49
Concrete class describing an orientated (free) or axis aligned box of 8 vertices. ...
const Bool_t kTRUE
Definition: Rtypes.h:91
Int_t fX
Definition: GuiTypes.h:179
Translation manipulator - attaches to physical shape and draws local axes widgets with arrow heads...
Definition: TGLTransManip.h:29