source: nanovis/branches/1.2/Grid.cpp @ 6632

Last change on this file since 6632 was 5588, checked in by ldelgass, 9 years ago

Merge support for VTK vector fields in nanovis to release branch

  • Property svn:eol-style set to native
File size: 10.0 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#ifdef USE_WORLD_COORDS
68    double xLen = xAxis.length();
69    double yLen = yAxis.length();
70    double zLen = zAxis.length();
71    double avgLen = 0.;
72    double denom = 0.;
73    if (xLen > 0.0) {
74        avgLen += xLen;
75        denom += 1.0;
76    }
77    if (yLen > 0.0) {
78        avgLen += yLen;
79        denom += 1.0;
80    }
81    if (zLen > 0.0) {
82        avgLen += zLen;
83        denom += 1.0;
84    }
85    if (denom > 0.0) {
86        avgLen /= denom;
87    } else {
88        avgLen = 1.0;
89    }
90    float xTickLen = (TICK_LENGTH * avgLen) / xLen;
91    float yTickLen = (TICK_LENGTH * avgLen) / yLen;
92    float zTickLen = (TICK_LENGTH * avgLen) / zLen;
93    float xLabelOfs = (LABEL_OFFSET * avgLen) / xLen;
94    //float yLabelOfs = (LABEL_OFFSET * avgLen) / yLen;
95    float zLabelOfs = (LABEL_OFFSET * avgLen) / zLen;
96    float xTitleOfs = (TITLE_OFFSET * avgLen) / xLen;
97    float yTitleOfs = (TITLE_OFFSET * avgLen) / yLen;
98    float zTitleOfs = (TITLE_OFFSET * avgLen) / zLen;
99
100    glTranslated(xAxis.min(), yAxis.min(), zAxis.min());
101    glScaled(xLen, yLen, zLen);
102#else
103    double xDataRange = xAxis.dataMax() - xAxis.dataMin();
104    double yDataRange = yAxis.dataMax() - yAxis.dataMin();
105    double zDataRange = zAxis.dataMax() - zAxis.dataMin();
106
107    double paspectX = 1.0f;
108    double paspectY = yDataRange / xDataRange;
109    double paspectZ = zDataRange / xDataRange;
110 
111    double xscale = xAxis.length() / xDataRange;
112    double yscale = yAxis.length() / xDataRange;
113    double zscale = zAxis.length() / xDataRange;
114
115    double xoffset = (xAxis.min() - xAxis.dataMin()) / xAxis.length();
116    double yoffset = (yAxis.min() - yAxis.dataMin()) / yAxis.length();
117    double zoffset = (zAxis.min() - zAxis.dataMin()) / zAxis.length();
118
119    float xTickLen = TICK_LENGTH;
120    float yTickLen = TICK_LENGTH;
121    float zTickLen = TICK_LENGTH;
122    float xLabelOfs = LABEL_OFFSET;
123    //float yLabelOfs = LABEL_OFFSET;
124    float zLabelOfs = LABEL_OFFSET;
125    float xTitleOfs = TITLE_OFFSET;
126    float yTitleOfs = TITLE_OFFSET;
127    float zTitleOfs = TITLE_OFFSET;
128
129    TRACE("Axis lengths: %g %g %g",
130          xAxis.length(),
131          yAxis.length(),
132          zAxis.length());
133    TRACE("Axis min/max: %g,%g %g,%g %g,%g",
134          xAxis.min(), xAxis.max(),
135          yAxis.min(), yAxis.max(),
136          zAxis.min(), zAxis.max());
137    TRACE("Axis vmin/vmax: %g,%g %g,%g %g,%g",
138          xAxis.dataMin(), xAxis.dataMax(),
139          yAxis.dataMin(), yAxis.dataMax(),
140          zAxis.dataMin(), zAxis.dataMax());
141    TRACE("paspect: %g %g %g", paspectX, paspectY, paspectZ);
142    TRACE("scale: %g %g %g", xscale, yscale, zscale);
143
144    glTranslatef(-0.5f * paspectX, -0.5f * paspectY, -0.5f * paspectZ);
145    glScalef(xscale, yscale, zscale);
146    glTranslatef(xoffset, yoffset, zoffset);
147#endif
148
149    glLineWidth(2.0f);
150    glColor4f(_axisColor.r, _axisColor.g, _axisColor.b,
151              _axisColor.a);
152
153    glBegin(GL_LINES);
154    {
155        glVertex3f(0.0f, 0.0f, 0.0f);
156        glVertex3f(1.0f + xTickLen, 0.0f, 0.0f);
157        glVertex3f(0.0f, 0.0f, 0.0f);
158        glVertex3f(0.0f, 1.0f + yTickLen, 0.0f);
159        glVertex3f(0.0f, 0.0f, 0.0f);
160        glVertex3f(0.0f, 0.0f, 1.0f + zTickLen);
161    }
162    glEnd();
163
164    glLineWidth(1.0f);
165    glColor4f(_majorColor.r, _majorColor.g, _majorColor.b,
166              _majorColor.a);
167
168    glBegin(GL_LINES);
169    {
170        Ticks::ConstIterator itr;
171        for (itr = xAxis.firstMajor(); itr != xAxis.lastMajor(); ++itr) {
172            float x = (float)xAxis.map(*itr);
173            glVertex3f(x, 0.0f, 0.0f);
174            glVertex3f(x, 1.0f, 0.0f);
175            glVertex3f(x, 0.0f, 0.0f);
176            glVertex3f(x, 0.0f, 1.0f + zTickLen);
177        }
178        for (itr = yAxis.firstMajor(); itr != yAxis.lastMajor(); ++itr) {
179            float y = (float)yAxis.map(*itr);
180            glVertex3f(0.0f, y, 0.0f);
181            glVertex3f(1.0f + xTickLen, y, 0.0f);
182            glVertex3f(0.0f, y, 0.0f);
183            glVertex3f(0.0f, y, 1.0f);
184        }
185        for (itr = zAxis.firstMajor(); itr != zAxis.lastMajor(); ++itr) {
186            float z = (float)zAxis.map(*itr);
187            glVertex3f(0.0f, 0.0f, z);
188            glVertex3f(0.0f, 1.0f, z);
189            glVertex3f(0.0f, 0.0f, z);
190            glVertex3f(1.0f + xTickLen, 0.0f, z);
191        }
192    }
193    glEnd();
194
195    // Set minor line color
196    glColor4f(_minorColor.r, _minorColor.g, _minorColor.b,
197              _minorColor.a);
198
199    glBegin(GL_LINES);
200    {
201        Ticks::ConstIterator itr;
202        for (itr = xAxis.firstMinor(); itr != xAxis.lastMinor(); ++itr) {
203            float x = (float)xAxis.map(*itr);
204            glVertex3f(x, 0.0f, 0.0f);
205            glVertex3f(x, 1.0f, 0.0f);
206            glVertex3f(x, 0.0f, 0.0f);
207            glVertex3f(x, 0.0f, 1.0f);
208        }
209        for (itr = yAxis.firstMinor(); itr != yAxis.lastMinor(); ++itr) {
210            float y = (float)yAxis.map(*itr);
211            glVertex3f(0.0f, y, 0.0f);
212            glVertex3f(1.0f, y, 0.0f);
213            glVertex3f(0.0f, y, 0.0f);
214            glVertex3f(0.0f, y, 1.0f);
215        }
216        for (itr = zAxis.firstMinor(); itr != zAxis.lastMinor(); ++itr) {
217            float z = (float)zAxis.map(*itr);
218            glVertex3f(0.0f, 0.0f, z);
219            glVertex3f(0.0f, 1.0f, z);
220            glVertex3f(0.0f, 0.0f, z);
221            glVertex3f(1.0f, 0.0f, z);
222        }
223    }
224    glEnd();
225
226    if (_font != NULL) {
227        double mv[16], prjm[16];
228        int viewport[4];
229        double wx, wy, wz;
230
231        glGetDoublev(GL_MODELVIEW_MATRIX, mv);
232        glGetDoublev(GL_PROJECTION_MATRIX, prjm);
233        glGetIntegerv(GL_VIEWPORT, viewport);
234
235        _font->begin();
236
237        glColor4f(_axisColor.r, _axisColor.g, _axisColor.b,
238                  _axisColor.a);
239
240        if (gluProject(1.0 + xTitleOfs, 0.0, 0.0,
241                       mv, prjm, viewport,
242                       &wx, &wy, &wz) &&
243            wz >= 0.0 && wz <= 1.0) {
244            glLoadIdentity();
245            glTranslatef((int) wx, viewport[3] - (int) wy, 0);
246            const char *title = xAxis.title();
247            if (title == NULL) {
248                title = "???";
249            }
250            _font->draw(title);
251        }
252       
253        if (gluProject(0.0, 1.0 + yTitleOfs, 0.0,
254                       mv, prjm, viewport,
255                       &wx, &wy, &wz) &&
256            wz >= 0.0 && wz <= 1.0) {
257            glLoadIdentity();
258            glTranslatef((int) wx, viewport[3] - (int)wy, 0);
259            const char *title = yAxis.title();
260            if (title == NULL) {
261                title = "???";
262            }
263            _font->draw(title);
264        }
265       
266        if (gluProject(0.0, 0.0, 1.0 + zTitleOfs,
267                       mv, prjm, viewport,
268                       &wx, &wy, &wz) &&
269            wz >= 0.0 && wz <= 1.0) {
270            glLoadIdentity();
271            glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
272            const char *title = zAxis.title();
273            if (title == NULL) {
274                title = "???";
275            }
276            _font->draw(title);
277        }
278
279        glColor4f(_majorColor.r, _majorColor.g, _majorColor.b,
280                  _majorColor.a);
281
282        Ticks::ConstIterator itr;
283        for (itr = xAxis.firstMajor(); itr != xAxis.lastMajor(); ++itr) {
284            float x = (float)xAxis.map(*itr);
285            if (gluProject(x, 0.0f, 1.0 + zLabelOfs,
286                           mv, prjm, viewport,
287                           &wx, &wy, &wz) &&
288                wz >= 0.0 && wz <= 1.0) {
289                char buff[20];
290                glLoadIdentity();
291                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
292                sprintf(buff, "%.*g", NUMDIGITS, *itr);
293                _font->draw(buff);
294            }
295        }
296        for (itr = yAxis.firstMajor(); itr != yAxis.lastMajor(); ++itr) {
297            float y = (float)yAxis.map(*itr);
298            if (gluProject(1.0 + xLabelOfs, y, 0.0f,
299                           mv, prjm, viewport,
300                           &wx, &wy, &wz) &&
301                wz >= 0.0 && wz <= 1.0) {
302                char buff[20];
303                glLoadIdentity();
304                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
305                sprintf(buff, "%.*g", NUMDIGITS, *itr);
306                _font->draw(buff);
307            }
308        }
309        for (itr = zAxis.firstMajor(); itr != zAxis.lastMajor(); ++itr) {
310            float z = (float)zAxis.map(*itr);
311            if (gluProject(1.0 + xLabelOfs, 0.0f, z,
312                           mv, prjm, viewport,
313                           &wx, &wy, &wz) &&
314                wz >= 0.0 && wz <= 1.0) {
315                char buff[20];
316                glLoadIdentity();
317                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
318                sprintf(buff, "%.*g", NUMDIGITS, *itr);
319                _font->draw(buff);
320            }
321        }
322        _font->end();
323    };
324
325    glPopMatrix();
326    glPopAttrib();
327}
328
329void Grid::setFont(Fonts *font)
330{
331    _font = font;
332}
333
Note: See TracBrowser for help on using the repository browser.