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

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

Merge r5478,r5480 from nanovis trunk (grid refactoring)

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