4 #include <TAttMarker.h>
6 #include <TGLIncludes.h>
10 void RenderLine(const TAttLine& aline, Float_t* p, Int_t n,
11 Bool_t /*selection*/, Bool_t /*sec_selection*/)
15 glPushAttrib(GL_ENABLE_BIT | GL_LINE_BIT);
16 glDisable(GL_LIGHTING);
17 glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
18 glEnable(GL_COLOR_MATERIAL);
20 Reve::ColorFromIdx(aline.GetLineColor(), color);
22 glLineWidth(aline.GetLineWidth());
23 if (aline.GetLineStyle() > 1) {
25 UShort_t pat = 0xffff;
26 switch (aline.GetLineStyle()) {
27 case 2: pat = 0x3333; break;
28 case 3: pat = 0x5555; break;
29 case 4: pat = 0xf040; break;
30 case 5: pat = 0xf4f4; break;
31 case 6: pat = 0xf111; break;
32 case 7: pat = 0xf0f0; break;
33 case 8: pat = 0xff11; break;
34 case 9: pat = 0x3fff; break;
35 case 10: pat = 0x08ff; fac = 2; break;
38 glLineStipple(1, pat);
39 glEnable(GL_LINE_STIPPLE);
43 glBegin(GL_LINE_STRIP);
44 for (Int_t i=0; i<n; ++i, tp+=3)
51 void RenderPolyMarkers(const TAttMarker& marker, Float_t* p, Int_t n,
52 Bool_t selection, Bool_t sec_selection)
54 // Store attributes GL_POINT_BIT and GL_LINE_BIT before call this function !
55 glPushAttrib(GL_ENABLE_BIT |GL_POINT_BIT | GL_LINE_BIT);
56 glDisable(GL_LIGHTING);
57 glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
58 glEnable(GL_COLOR_MATERIAL);
60 Reve::ColorFromIdx(marker.GetMarkerColor(), color);
63 Int_t s = marker.GetMarkerStyle();
64 if (s == 2 || s == 3 || s == 5 || s == 28)
65 RenderCrosses(marker, p, n, sec_selection);
67 RenderPoints(marker, p, n, selection, sec_selection);
72 //______________________________________________________________________________
73 void RenderPoints(const TAttMarker& marker, Float_t* op, Int_t n,
74 Bool_t selection, Bool_t sec_selection)
76 // Render markers as circular or square points.
78 Int_t ms = marker.GetMarkerStyle();
79 Float_t size = 5*marker.GetMarkerSize();
80 if (ms == 4 || ms == 20 || ms == 24)
82 if (ms == 4 || ms == 24)
84 glEnable(GL_POINT_SMOOTH);
87 glDisable(GL_POINT_SMOOTH);
88 if (ms == 1) size = 1;
89 else if (ms == 6) size = 2;
90 else if (ms == 7) size = 3;
94 // During selection extend picking region for large point-sizes.
95 static const Int_t sPickRadius = 3; // Hardcoded also in TGLViewer::RequestSelect()
96 Bool_t changePM = kFALSE;
97 if (selection && size > sPickRadius)
100 glMatrixMode(GL_PROJECTION);
103 glGetFloatv(GL_PROJECTION_MATRIX, pm);
104 Float_t scale = (Float_t) sPickRadius / size;
105 for (Int_t i=0; i<=12; i+=4) {
106 pm[i] *= scale; pm[i+1] *= scale;
115 for (Int_t i=0; i<n; ++i, p+=3)
126 glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
127 glVertexPointer(3, GL_FLOAT, 0, p);
128 glEnableClientState(GL_VERTEX_ARRAY);
129 { // Circumvent bug in ATI's linux drivers.
132 const Int_t maxChunk = 8192;
133 while (nleft > maxChunk)
135 glDrawArrays(GL_POINTS, ndone, maxChunk);
139 glDrawArrays(GL_POINTS, ndone, nleft);
147 glMatrixMode(GL_MODELVIEW);
152 //______________________________________________________________________________
153 void RenderCrosses(const TAttMarker& marker, Float_t* op, Int_t n,
154 Bool_t sec_selection)
156 // Render markers as crosses.
158 if (marker.GetMarkerStyle() == 28)
161 glEnable(GL_LINE_SMOOTH);
166 glDisable(GL_LINE_SMOOTH);
170 const Float_t d = 2*marker.GetMarkerSize();
175 for (Int_t i=0; i<n; ++i, p+=3)
179 glVertex3f(p[0]-d, p[1], p[2]); glVertex3f(p[0]+d, p[1], p[2]);
180 glVertex3f(p[0], p[1]-d, p[2]); glVertex3f(p[0], p[1]+d, p[2]);
181 glVertex3f(p[0], p[1], p[2]-d); glVertex3f(p[0], p[1], p[2]+d);
189 for (Int_t i=0; i<n; ++i, p+=3)
191 glVertex3f(p[0]-d, p[1], p[2]); glVertex3f(p[0]+d, p[1], p[2]);
192 glVertex3f(p[0], p[1]-d, p[2]); glVertex3f(p[0], p[1]+d, p[2]);
193 glVertex3f(p[0], p[1], p[2]-d); glVertex3f(p[0], p[1], p[2]+d);
199 /**************************************************************************/
200 } // end namespace GLUtilNS