source: nanovis/trunk/Grid.cpp @ 5224

Last change on this file since 5224 was 4902, checked in by ldelgass, 9 years ago

sync with release branch

  • Property svn:eol-style set to native
File size: 8.6 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.min() + xAxis.range(),
46                yAxis.min() + yAxis.range(),
47                zAxis.min() + zAxis.range());
48}
49
50void Grid::render()
51{
52    if (!isVisible())
53        return;
54
55    glPushAttrib(GL_ENABLE_BIT);
56
57    glEnable(GL_DEPTH_TEST);
58    glDisable(GL_TEXTURE_2D);
59#ifdef notdef
60    glEnable(GL_BLEND);
61    glEnable(GL_LINE_SMOOTH);
62#else
63    glDisable(GL_BLEND);
64#endif
65
66    glMatrixMode(GL_MODELVIEW);
67    glPushMatrix();
68
69    double xLen = xAxis.range();
70    double yLen = yAxis.range();
71    double zLen = zAxis.range();
72    double avgLen = 0.;
73    double denom = 0.;
74    if (xLen > 0.0) {
75        avgLen += xLen;
76        denom += 1.0;
77    }
78    if (yLen > 0.0) {
79        avgLen += yLen;
80        denom += 1.0;
81    }
82    if (zLen > 0.0) {
83        avgLen += zLen;
84        denom += 1.0;
85    }
86    if (denom > 0.0) {
87        avgLen /= denom;
88    } else {
89        avgLen = 1.0;
90    }
91    float xTickLen = (TICK_LENGTH * avgLen) / xLen;
92    float yTickLen = (TICK_LENGTH * avgLen) / yLen;
93    float zTickLen = (TICK_LENGTH * avgLen) / zLen;
94    float xLabelOfs = (LABEL_OFFSET * avgLen) / xLen;
95    //float yLabelOfs = (LABEL_OFFSET * avgLen) / yLen;
96    float zLabelOfs = (LABEL_OFFSET * avgLen) / zLen;
97    float xTitleOfs = (TITLE_OFFSET * avgLen) / xLen;
98    float yTitleOfs = (TITLE_OFFSET * avgLen) / yLen;
99    float zTitleOfs = (TITLE_OFFSET * avgLen) / zLen;
100
101    glTranslated(xAxis.min(), yAxis.min(), zAxis.min());
102    glScaled(xLen, yLen, zLen);
103
104    glLineWidth(2.0f);
105    glColor4f(_axisColor.r, _axisColor.g, _axisColor.b,
106              _axisColor.a);
107
108    glBegin(GL_LINES);
109    {
110        glVertex3f(0.0f, 0.0f, 0.0f);
111        glVertex3f(1.0f + xTickLen, 0.0f, 0.0f);
112        glVertex3f(0.0f, 0.0f, 0.0f);
113        glVertex3f(0.0f, 1.0f + yTickLen, 0.0f);
114        glVertex3f(0.0f, 0.0f, 0.0f);
115        glVertex3f(0.0f, 0.0f, 1.0f + zTickLen);
116    }
117    glEnd();
118
119    glLineWidth(1.0f);
120    glColor4f(_majorColor.r, _majorColor.g, _majorColor.b,
121              _majorColor.a);
122
123    glBegin(GL_LINES);
124    {
125        bool result;
126        TickIter iter;
127
128        for (result = xAxis.firstMajor(iter); result; result = iter.next()) {
129            float x;
130            x = xAxis.map(iter.getValue());
131            glVertex3f(x, 0.0f, 0.0f);
132            glVertex3f(x, 1.0f, 0.0f);
133            glVertex3f(x, 0.0f, 0.0f);
134            glVertex3f(x, 0.0f, 1.0f + zTickLen);
135        }
136        for (result = yAxis.firstMajor(iter); result; result = iter.next()) {
137            float y;
138            y = yAxis.map(iter.getValue());
139            glVertex3f(0.0f, y, 0.0f);
140            glVertex3f(1.0f + xTickLen, y, 0.0f);
141            glVertex3f(0.0f, y, 0.0f);
142            glVertex3f(0.0f, y, 1.0f);
143        }
144        for (result = zAxis.firstMajor(iter); result; result = iter.next()) {
145            float z;
146            z = zAxis.map(iter.getValue());
147            glVertex3f(0.0f, 0.0f, z);
148            glVertex3f(0.0f, 1.0f, z);
149            glVertex3f(0.0f, 0.0f, z);
150            glVertex3f(1.0f + xTickLen, 0.0f, z);
151        }
152    }
153    glEnd();
154
155    // Set minor line color
156    glColor4f(_minorColor.r, _minorColor.g, _minorColor.b,
157              _minorColor.a);
158
159    glBegin(GL_LINES);
160    {
161        bool result;
162        TickIter iter;
163
164        for (result = xAxis.firstMinor(iter); result; result = iter.next()) {
165            float x;
166            x = xAxis.map(iter.getValue());
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 (result = yAxis.firstMinor(iter); result; result = iter.next()) {
173            float y;
174            y = yAxis.map(iter.getValue());
175            glVertex3f(0.0f, y, 0.0f);
176            glVertex3f(1.0f, y, 0.0f);
177            glVertex3f(0.0f, y, 0.0f);
178            glVertex3f(0.0f, y, 1.0f);
179        }
180        for (result = zAxis.firstMinor(iter); result; result = iter.next()) {
181            float z;
182            z = zAxis.map(iter.getValue());
183            glVertex3f(0.0f, 0.0f, z);
184            glVertex3f(0.0f, 1.0f, z);
185            glVertex3f(0.0f, 0.0f, z);
186            glVertex3f(1.0f, 0.0f, z);
187        }
188    }
189    glEnd();
190
191    if (_font != NULL) {
192        double mv[16], prjm[16];
193        int viewport[4];
194        double wx, wy, wz;
195        bool result;
196        TickIter iter;
197
198        glGetDoublev(GL_MODELVIEW_MATRIX, mv);
199        glGetDoublev(GL_PROJECTION_MATRIX, prjm);
200        glGetIntegerv(GL_VIEWPORT, viewport);
201
202        _font->begin();
203
204        glColor4f(_axisColor.r, _axisColor.g, _axisColor.b,
205                  _axisColor.a);
206
207        if (gluProject(1.0 + xTitleOfs, 0.0, 0.0,
208                       mv, prjm, viewport,
209                       &wx, &wy, &wz) &&
210            wz >= 0.0 && wz <= 1.0) {
211            glLoadIdentity();
212            glTranslatef((int) wx, viewport[3] - (int) wy, 0);
213            const char *name = xAxis.name();
214            if (name == NULL) {
215                name = "???";
216            }
217            _font->draw(name);
218        }
219       
220        if (gluProject(0.0, 1.0 + yTitleOfs, 0.0,
221                       mv, prjm, viewport,
222                       &wx, &wy, &wz) &&
223            wz >= 0.0 && wz <= 1.0) {
224            glLoadIdentity();
225            glTranslatef((int) wx, viewport[3] - (int)wy, 0);
226            const char *name = yAxis.name();
227            if (name == NULL) {
228                name = "???";
229            }
230            _font->draw(name);
231        }
232       
233        if (gluProject(0.0, 0.0, 1.0 + zTitleOfs,
234                       mv, prjm, viewport,
235                       &wx, &wy, &wz) &&
236            wz >= 0.0 && wz <= 1.0) {
237            glLoadIdentity();
238            glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
239            const char *name = zAxis.name();
240            if (name == NULL) {
241                name = "???";
242            }
243            _font->draw(name);
244        }
245
246        glColor4f(_majorColor.r, _majorColor.g, _majorColor.b,
247                  _majorColor.a);
248
249        for (result = xAxis.firstMajor(iter); result; result = iter.next()) {
250            float x;
251            x = xAxis.map(iter.getValue());
252            if (gluProject(x, 0.0f, 1.0 + zLabelOfs,
253                           mv, prjm, viewport,
254                           &wx, &wy, &wz) &&
255                wz >= 0.0 && wz <= 1.0) {
256                char buff[20];
257                glLoadIdentity();
258                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
259                sprintf(buff, "%.*g", NUMDIGITS, iter.getValue());
260                _font->draw(buff);
261            }
262        }
263        for (result = yAxis.firstMajor(iter); result; result = iter.next()) {
264            float y;
265            y = yAxis.map(iter.getValue());
266            if (gluProject(1.0 + xLabelOfs, y, 0.0f,
267                           mv, prjm, viewport,
268                           &wx, &wy, &wz) &&
269                wz >= 0.0 && wz <= 1.0) {
270                char buff[20];
271                glLoadIdentity();
272                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
273                sprintf(buff, "%.*g", NUMDIGITS, iter.getValue());
274                _font->draw(buff);
275            }
276        }
277        for (result = zAxis.firstMajor(iter); result; result = iter.next()) {
278            float z;
279            z = zAxis.map(iter.getValue());
280            if (gluProject(1.0 + xLabelOfs, 0.0f, z,
281                           mv, prjm, viewport,
282                           &wx, &wy, &wz) &&
283                wz >= 0.0 && wz <= 1.0) {
284                char buff[20];
285                glLoadIdentity();
286                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
287                sprintf(buff, "%.*g", NUMDIGITS, iter.getValue());
288                _font->draw(buff);
289            }
290        }
291        _font->end();
292    };
293
294    glPopMatrix();
295    glPopAttrib();
296}
297
298void Grid::setFont(Fonts *font)
299{
300    _font = font;
301}
302
Note: See TracBrowser for help on using the repository browser.