3 #include "StraightLineSetGL.h"
4 #include <Reve/StraightLineSet.h>
5 #include <Reve/GLUtilNS.h>
7 #include <TGLDrawFlags.h>
10 #include "Windows4root.h"
17 //______________________________________________________________________
21 ClassImp(StraightLineSetGL)
23 StraightLineSetGL::StraightLineSetGL() : TGLObject(), fM(0)
25 // fCached = false; // Disable display list.
28 StraightLineSetGL::~StraightLineSetGL()
31 /**************************************************************************/
33 Bool_t StraightLineSetGL::SetModel(TObject* obj)
35 if(SetModelCheckClass(obj, StraightLineSet::Class())) {
36 fM = dynamic_cast<StraightLineSet*>(obj);
42 void StraightLineSetGL::SetBBox()
44 // !! This ok if master sub-classed from TAttBBox
45 SetAxisAlignedBBox(((StraightLineSet*)fExternalObj)->AssertBBox());
48 //______________________________________________________________________________
49 Bool_t StraightLineSetGL::ShouldCache(const TGLDrawFlags & flags) const
51 // Override from TGLDrawable.
52 // To account for large point-sizes we modify the projection matrix
53 // during selection and thus we need a direct draw.
55 if (flags.Selection()) return kFALSE;
59 /**************************************************************************/
61 void StraightLineSetGL::DirectDraw(const TGLDrawFlags & flags) const
63 // printf("StraightLineSetGL::DirectDraw Style %d, LOD %d\n", flags.Style(), flags.LOD());
65 StraightLineSet& mL = * fM;
67 glPushAttrib(GL_POINT_BIT | GL_LINE_BIT | GL_ENABLE_BIT);
68 GLUtilNS::GL_Capability_Switch lights_off(GL_LIGHTING, false);
73 ColorFromIdx(mL.GetMainColor(), color);
76 VoidCPlex::iterator li(mL.fLinePlex);
77 if(flags.SecSelection())
84 StraightLineSet::Line& l = * (StraightLineSet::Line*) li();
88 glVertex3f(l.fV1[0], l.fV1[1], l.fV1[2]);
89 glVertex3f(l.fV2[0], l.fV2[1], l.fV2[2]);
102 StraightLineSet::Line& l = * (StraightLineSet::Line*) li();
103 glVertex3f(l.fV1[0], l.fV1[1], l.fV1[2]);
104 glVertex3f(l.fV2[0], l.fV2[1], l.fV2[2]);
113 ColorFromIdx(mL.GetMarkerColor(), color);
116 VoidCPlex::iterator mi(mL.fMarkerPlex);
117 Float_t* pnts = new Float_t[mL.fMarkerPlex.Size()*3];
122 StraightLineSet::Marker& m = * (StraightLineSet::Marker*) mi();
124 StraightLineSet::Line& l = * (StraightLineSet::Line*) mL.fLinePlex.Atom(lidx);
125 pnt[0] = l.fV1[0] + (l.fV2[0] - l.fV1[0])*m.fPos;
126 pnt[1] = l.fV1[1] + (l.fV2[1] - l.fV1[1])*m.fPos;
127 pnt[2] = l.fV1[2] + (l.fV2[2] - l.fV1[2])*m.fPos;;
130 if(flags.SecSelection()) glPushName(2);
131 GLUtilNS::RenderPolyMarkers((TAttMarker&)mL, pnts, mL.fLinePlex.Size(), flags.Selection(), flags.SecSelection());
132 if(flags.SecSelection()) glPopName();
139 /**************************************************************************/
141 void StraightLineSetGL::ProcessSelection(UInt_t* ptr, TGLViewer*, TGLScene*)
143 if (ptr[0] != 3) return;
144 ptr += 3; // skip n, zmin, zmax
147 printf("selected line %d\n", ptr[2]);
151 StraightLineSet::Marker& m = * (StraightLineSet::Marker*) fM->fMarkerPlex.Atom(ptr[2]);
152 printf("Selected point %d on line %d\n", ptr[2], m.fLineID);