source: nanovis/trunk/Grid.cpp @ 5704

Last change on this file since 5704 was 5478, checked in by ldelgass, 4 years ago

Begin refactoring axis/grid in nanovis: remove unused features, make the style
more C++

  • Property svn:eol-style set to native
File size: 8.2 KB
Line 
1/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2/*
3 * Copyright (c) 2004-2013  HUBzero Foundation, LLC
4 *
5 */
6#include <stdlib.h>
7#include <stdio.h>
8
9#include <GL/glew.h>
10#include <GL/gl.h>
11
12#include <util/Fonts.h>
13#include <vrmath/Color4f.h>
14
15#include "Grid.h"
16#include "Trace.h"
17
18using namespace nv;
19using namespace nv::util;
20
21#define NUMDIGITS       6
22#define TICK_LENGTH     0.05
23#define LABEL_OFFSET    0.06
24#define TITLE_OFFSET    0.2
25
26Grid::Grid() :
27    xAxis("X"), 
28    yAxis("Y"), 
29    zAxis("Z"),
30    _axisColor(1.0f, 1.0f, 1.0f, 1.0f), 
31    _majorColor(1.0f, 1.0f, 1.0f, 1.0f), 
32    _minorColor(0.5f, 0.5f, 0.5f, 1.0f), 
33    _font(NULL), 
34    _visible(false)
35{
36}
37
38Grid::~Grid()
39{
40}
41
42void Grid::getBounds(vrmath::Vector3f& bboxMin, vrmath::Vector3f& bboxMax) const
43{
44    bboxMin.set(xAxis.min(), yAxis.min(), zAxis.min());
45    bboxMax.set(xAxis.max(), yAxis.max(), zAxis.max());
46}
47
48void Grid::render()
49{
50    if (!isVisible())
51        return;
52
53    glPushAttrib(GL_ENABLE_BIT);
54
55    glEnable(GL_DEPTH_TEST);
56    glDisable(GL_TEXTURE_2D);
57#ifdef notdef
58    glEnable(GL_BLEND);
59    glEnable(GL_LINE_SMOOTH);
60#else
61    glDisable(GL_BLEND);
62#endif
63
64    glMatrixMode(GL_MODELVIEW);
65    glPushMatrix();
66
67    double xLen = xAxis.length();
68    double yLen = yAxis.length();
69    double zLen = zAxis.length();
70    double avgLen = 0.;
71    double denom = 0.;
72    if (xLen > 0.0) {
73        avgLen += xLen;
74        denom += 1.0;
75    }
76    if (yLen > 0.0) {
77        avgLen += yLen;
78        denom += 1.0;
79    }
80    if (zLen > 0.0) {
81        avgLen += zLen;
82        denom += 1.0;
83    }
84    if (denom > 0.0) {
85        avgLen /= denom;
86    } else {
87        avgLen = 1.0;
88    }
89    float xTickLen = (TICK_LENGTH * avgLen) / xLen;
90    float yTickLen = (TICK_LENGTH * avgLen) / yLen;
91    float zTickLen = (TICK_LENGTH * avgLen) / zLen;
92    float xLabelOfs = (LABEL_OFFSET * avgLen) / xLen;
93    //float yLabelOfs = (LABEL_OFFSET * avgLen) / yLen;
94    float zLabelOfs = (LABEL_OFFSET * avgLen) / zLen;
95    float xTitleOfs = (TITLE_OFFSET * avgLen) / xLen;
96    float yTitleOfs = (TITLE_OFFSET * avgLen) / yLen;
97    float zTitleOfs = (TITLE_OFFSET * avgLen) / zLen;
98
99    glTranslated(xAxis.min(), yAxis.min(), zAxis.min());
100    glScaled(xLen, yLen, zLen);
101
102    glLineWidth(2.0f);
103    glColor4f(_axisColor.r, _axisColor.g, _axisColor.b,
104              _axisColor.a);
105
106    glBegin(GL_LINES);
107    {
108        glVertex3f(0.0f, 0.0f, 0.0f);
109        glVertex3f(1.0f + xTickLen, 0.0f, 0.0f);
110        glVertex3f(0.0f, 0.0f, 0.0f);
111        glVertex3f(0.0f, 1.0f + yTickLen, 0.0f);
112        glVertex3f(0.0f, 0.0f, 0.0f);
113        glVertex3f(0.0f, 0.0f, 1.0f + zTickLen);
114    }
115    glEnd();
116
117    glLineWidth(1.0f);
118    glColor4f(_majorColor.r, _majorColor.g, _majorColor.b,
119              _majorColor.a);
120
121    glBegin(GL_LINES);
122    {
123        Ticks::ConstIterator itr;
124        for (itr = xAxis.firstMajor(); itr != xAxis.lastMajor(); ++itr) {
125            float x = (float)xAxis.map(*itr);
126            glVertex3f(x, 0.0f, 0.0f);
127            glVertex3f(x, 1.0f, 0.0f);
128            glVertex3f(x, 0.0f, 0.0f);
129            glVertex3f(x, 0.0f, 1.0f + zTickLen);
130        }
131        for (itr = yAxis.firstMajor(); itr != yAxis.lastMajor(); ++itr) {
132            float y = (float)yAxis.map(*itr);
133            glVertex3f(0.0f, y, 0.0f);
134            glVertex3f(1.0f + xTickLen, y, 0.0f);
135            glVertex3f(0.0f, y, 0.0f);
136            glVertex3f(0.0f, y, 1.0f);
137        }
138        for (itr = zAxis.firstMajor(); itr != zAxis.lastMajor(); ++itr) {
139            float z = (float)zAxis.map(*itr);
140            glVertex3f(0.0f, 0.0f, z);
141            glVertex3f(0.0f, 1.0f, z);
142            glVertex3f(0.0f, 0.0f, z);
143            glVertex3f(1.0f + xTickLen, 0.0f, z);
144        }
145    }
146    glEnd();
147
148    // Set minor line color
149    glColor4f(_minorColor.r, _minorColor.g, _minorColor.b,
150              _minorColor.a);
151
152    glBegin(GL_LINES);
153    {
154        Ticks::ConstIterator itr;
155        for (itr = xAxis.firstMinor(); itr != xAxis.lastMinor(); ++itr) {
156            float x = (float)xAxis.map(*itr);
157            glVertex3f(x, 0.0f, 0.0f);
158            glVertex3f(x, 1.0f, 0.0f);
159            glVertex3f(x, 0.0f, 0.0f);
160            glVertex3f(x, 0.0f, 1.0f);
161        }
162        for (itr = yAxis.firstMinor(); itr != yAxis.lastMinor(); ++itr) {
163            float y = (float)yAxis.map(*itr);
164            glVertex3f(0.0f, y, 0.0f);
165            glVertex3f(1.0f, y, 0.0f);
166            glVertex3f(0.0f, y, 0.0f);
167            glVertex3f(0.0f, y, 1.0f);
168        }
169        for (itr = zAxis.firstMinor(); itr != zAxis.lastMinor(); ++itr) {
170            float z = (float)zAxis.map(*itr);
171            glVertex3f(0.0f, 0.0f, z);
172            glVertex3f(0.0f, 1.0f, z);
173            glVertex3f(0.0f, 0.0f, z);
174            glVertex3f(1.0f, 0.0f, z);
175        }
176    }
177    glEnd();
178
179    if (_font != NULL) {
180        double mv[16], prjm[16];
181        int viewport[4];
182        double wx, wy, wz;
183
184        glGetDoublev(GL_MODELVIEW_MATRIX, mv);
185        glGetDoublev(GL_PROJECTION_MATRIX, prjm);
186        glGetIntegerv(GL_VIEWPORT, viewport);
187
188        _font->begin();
189
190        glColor4f(_axisColor.r, _axisColor.g, _axisColor.b,
191                  _axisColor.a);
192
193        if (gluProject(1.0 + xTitleOfs, 0.0, 0.0,
194                       mv, prjm, viewport,
195                       &wx, &wy, &wz) &&
196            wz >= 0.0 && wz <= 1.0) {
197            glLoadIdentity();
198            glTranslatef((int) wx, viewport[3] - (int) wy, 0);
199            const char *title = xAxis.title();
200            if (title == NULL) {
201                title = "???";
202            }
203            _font->draw(title);
204        }
205       
206        if (gluProject(0.0, 1.0 + yTitleOfs, 0.0,
207                       mv, prjm, viewport,
208                       &wx, &wy, &wz) &&
209            wz >= 0.0 && wz <= 1.0) {
210            glLoadIdentity();
211            glTranslatef((int) wx, viewport[3] - (int)wy, 0);
212            const char *title = yAxis.title();
213            if (title == NULL) {
214                title = "???";
215            }
216            _font->draw(title);
217        }
218       
219        if (gluProject(0.0, 0.0, 1.0 + zTitleOfs,
220                       mv, prjm, viewport,
221                       &wx, &wy, &wz) &&
222            wz >= 0.0 && wz <= 1.0) {
223            glLoadIdentity();
224            glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
225            const char *title = zAxis.title();
226            if (title == NULL) {
227                title = "???";
228            }
229            _font->draw(title);
230        }
231
232        glColor4f(_majorColor.r, _majorColor.g, _majorColor.b,
233                  _majorColor.a);
234
235        Ticks::ConstIterator itr;
236        for (itr = xAxis.firstMajor(); itr != xAxis.lastMajor(); ++itr) {
237            float x = (float)xAxis.map(*itr);
238            if (gluProject(x, 0.0f, 1.0 + zLabelOfs,
239                           mv, prjm, viewport,
240                           &wx, &wy, &wz) &&
241                wz >= 0.0 && wz <= 1.0) {
242                char buff[20];
243                glLoadIdentity();
244                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
245                sprintf(buff, "%.*g", NUMDIGITS, *itr);
246                _font->draw(buff);
247            }
248        }
249        for (itr = yAxis.firstMajor(); itr != yAxis.lastMajor(); ++itr) {
250            float y = (float)yAxis.map(*itr);
251            if (gluProject(1.0 + xLabelOfs, y, 0.0f,
252                           mv, prjm, viewport,
253                           &wx, &wy, &wz) &&
254                wz >= 0.0 && wz <= 1.0) {
255                char buff[20];
256                glLoadIdentity();
257                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
258                sprintf(buff, "%.*g", NUMDIGITS, *itr);
259                _font->draw(buff);
260            }
261        }
262        for (itr = zAxis.firstMajor(); itr != zAxis.lastMajor(); ++itr) {
263            float z = (float)zAxis.map(*itr);
264            if (gluProject(1.0 + xLabelOfs, 0.0f, z,
265                           mv, prjm, viewport,
266                           &wx, &wy, &wz) &&
267                wz >= 0.0 && wz <= 1.0) {
268                char buff[20];
269                glLoadIdentity();
270                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
271                sprintf(buff, "%.*g", NUMDIGITS, *itr);
272                _font->draw(buff);
273            }
274        }
275        _font->end();
276    };
277
278    glPopMatrix();
279    glPopAttrib();
280}
281
282void Grid::setFont(Fonts *font)
283{
284    _font = font;
285}
286
Note: See TracBrowser for help on using the repository browser.