24 ClassImp(TGLScaleManip);
29 TGLScaleManip::TGLScaleManip()
36 TGLScaleManip::TGLScaleManip(TGLPhysicalShape * shape) :
44 TGLScaleManip::~TGLScaleManip()
53 void TGLScaleManip::Draw(
const TGLCamera & camera)
const
60 const TGLBoundingBox & box = fShape->BoundingBox();
62 TGLVector3 axisScale[3];
63 CalcDrawScale(box, camera, baseScale, axisScale);
66 TGLPhysicalShape::EManip manip = fShape->GetManip();
69 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
70 glDisable(GL_CULL_FACE);
75 if (manip & TGLPhysicalShape::kScaleX) {
77 TGLUtil::DrawLine(box.Center(), axisScale[0], TGLUtil::kLineHeadBox,
78 baseScale, ColorFor(1));
81 TGLUtil::DrawLine(box.Center(), axisScale[0], TGLUtil::kLineHeadBox,
82 baseScale, TGLUtil::fgGrey);
84 if (manip & TGLPhysicalShape::kScaleY) {
86 TGLUtil::DrawLine(box.Center(), axisScale[1], TGLUtil::kLineHeadBox,
87 baseScale, ColorFor(2));
90 TGLUtil::DrawLine(box.Center(), axisScale[1], TGLUtil::kLineHeadBox,
91 baseScale, TGLUtil::fgGrey);
93 if (manip & TGLPhysicalShape::kScaleZ) {
95 TGLUtil::DrawLine(box.Center(), axisScale[2], TGLUtil::kLineHeadBox,
96 baseScale, ColorFor(3));
99 TGLUtil::DrawLine(box.Center(), axisScale[2], TGLUtil::kLineHeadBox,
100 baseScale, TGLUtil::fgGrey);
103 TGLUtil::DrawSphere(box.Center(), baseScale/2.0, TGLUtil::fgWhite);
105 glEnable(GL_CULL_FACE);
113 Bool_t TGLScaleManip::HandleButton(
const Event_t & event,
114 const TGLCamera & camera)
116 if (event.fType == kButtonPress && fSelectedWidget != 0) {
117 fStartScale = fShape->GetScale();
120 return TGLManip::HandleButton(event, camera);
129 Bool_t TGLScaleManip::HandleMotion(
const Event_t & event,
130 const TGLCamera & camera)
134 TGLVector3 shift = camera.ViewportDeltaToWorld(fShape->BoundingBox().Center(),
135 event.fX - fFirstMouse.GetX(),
136 -
event.fY + fFirstMouse.GetY());
138 UInt_t axisIndex = fSelectedWidget - 1;
139 TGLVector3 widgetAxis = fShape->BoundingBox().Axis(axisIndex, kTRUE);
142 TGLVector3 screenScale = camera.ViewportDeltaToWorld(fShape->BoundingBox().Center(), 500, 500);
143 Double_t factor = -5.0*Dot(shift, widgetAxis) / screenScale.Mag();
145 TGLVector3 newScale = fStartScale;
146 newScale[axisIndex] += factor;
147 LimitScale(newScale[axisIndex]);
148 fShape->Scale(newScale);
150 fLastMouse.SetX(event.fX);
151 fLastMouse.SetY(event.fY);
162 void TGLScaleManip::LimitScale(Double_t & factor)
const