00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "TGLTransManip.h"
00013 #include "TGLPhysicalShape.h"
00014 #include "TGLCamera.h"
00015 #include "TGLIncludes.h"
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 ClassImp(TGLTransManip)
00028
00029
00030 TGLTransManip::TGLTransManip()
00031 {
00032
00033 }
00034
00035
00036 TGLTransManip::TGLTransManip(TGLPhysicalShape * shape) :
00037 TGLManip(shape)
00038 {
00039
00040
00041 }
00042
00043
00044 TGLTransManip::~TGLTransManip()
00045 {
00046
00047 }
00048
00049
00050 void TGLTransManip::Draw(const TGLCamera & camera) const
00051 {
00052
00053
00054
00055 if (!fShape) {
00056 return;
00057 }
00058
00059
00060 const TGLBoundingBox & box = fShape->BoundingBox();
00061 Double_t baseScale;
00062 TGLVector3 axisScale[3];
00063 CalcDrawScale(box, camera, baseScale, axisScale);
00064
00065
00066 TGLPhysicalShape::EManip manip = fShape->GetManip();
00067
00068 glEnable(GL_BLEND);
00069 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00070 glDisable(GL_CULL_FACE);
00071
00072
00073
00074
00075 if (manip & TGLPhysicalShape::kTranslateX) {
00076 glPushName(1);
00077 TGLUtil::DrawLine(box.Center(), axisScale[0], TGLUtil::kLineHeadArrow,
00078 baseScale, ColorFor(1));
00079 glPopName();
00080 } else {
00081 TGLUtil::DrawLine(box.Center(), axisScale[0], TGLUtil::kLineHeadArrow,
00082 baseScale, TGLUtil::fgGrey);
00083 }
00084 if (manip & TGLPhysicalShape::kTranslateY) {
00085 glPushName(2);
00086 TGLUtil::DrawLine(box.Center(), axisScale[1], TGLUtil::kLineHeadArrow,
00087 baseScale, ColorFor(2));
00088 glPopName();
00089 } else {
00090 TGLUtil::DrawLine(box.Center(), axisScale[1], TGLUtil::kLineHeadArrow,
00091 baseScale, TGLUtil::fgGrey);
00092 }
00093 if (manip & TGLPhysicalShape::kTranslateZ) {
00094 glPushName(3);
00095 TGLUtil::DrawLine(box.Center(), axisScale[2], TGLUtil::kLineHeadArrow,
00096 baseScale, ColorFor(3));
00097 glPopName();
00098 } else {
00099 TGLUtil::DrawLine(box.Center(), axisScale[2], TGLUtil::kLineHeadArrow,
00100 baseScale, TGLUtil::fgGrey);
00101 }
00102
00103 TGLUtil::DrawSphere(box.Center(), baseScale/2.0, TGLUtil::fgWhite);
00104
00105 glEnable(GL_CULL_FACE);
00106 glDisable(GL_BLEND);
00107 }
00108
00109
00110 Bool_t TGLTransManip::HandleMotion(const Event_t & event,
00111 const TGLCamera & camera)
00112 {
00113
00114
00115
00116
00117 if (fActive) {
00118
00119 TGLVector3 shift =
00120 camera.ViewportDeltaToWorld( fShape->BoundingBox().Center(),
00121 event.fX - fLastMouse.GetX(),
00122 -event.fY + fLastMouse.GetY() );
00123
00124
00125
00126 UInt_t axisIndex = fSelectedWidget - 1;
00127 TGLVector3 widgetAxis = fShape->BoundingBox().Axis(axisIndex, kTRUE);
00128 TGLVector3 constrainedShift = widgetAxis * Dot(shift, widgetAxis);
00129 fShape->Translate(constrainedShift);
00130
00131 fLastMouse.SetX(event.fX);
00132 fLastMouse.SetY(event.fY);
00133
00134 return kTRUE;
00135 }
00136 return kFALSE;
00137 }
00138