source: nanovis/trunk/Grid.cpp @ 4890

Last change on this file since 4890 was 4164, checked in by ldelgass, 10 years ago

Fix coloring of fonts in grid labels

  • Property svn:eol-style set to native
File size: 8.3 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, mv, prjm, viewport, &wx, &wy, &wz) &&
208            wz >= 0.0 && wz <= 1.0) {
209            glLoadIdentity();
210            glTranslatef((int) wx, viewport[3] - (int) wy, 0);
211            const char *name = xAxis.name();
212            if (name == NULL) {
213                name = "???";
214            }
215            _font->draw(name);
216        }
217       
218        if (gluProject(0.0, 1.0 + yTitleOfs, 0.0, mv, prjm, viewport, &wx, &wy, &wz) &&
219            wz >= 0.0 && wz <= 1.0) {
220            glLoadIdentity();
221            glTranslatef((int) wx, viewport[3] - (int)wy, 0);
222            const char *name = yAxis.name();
223            if (name == NULL) {
224                name = "???";
225            }
226            _font->draw(name);
227        }
228       
229        if (gluProject(0.0, 0.0, 1.0 + zTitleOfs, mv, prjm, viewport, &wx, &wy, &wz) &&
230            wz >= 0.0 && wz <= 1.0) {
231            glLoadIdentity();
232            glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
233            const char *name = zAxis.name();
234            if (name == NULL) {
235                name = "???";
236            }
237            _font->draw(name);
238        }
239       
240        glColor4f(_majorColor.r, _majorColor.g, _majorColor.b,
241                  _majorColor.a);
242
243        for (result = xAxis.firstMajor(iter); result; result = iter.next()) {
244            float x;
245            x = xAxis.map(iter.getValue());
246            if (gluProject(x, 0.0f, 1.0 + zLabelOfs, mv, prjm, viewport, &wx, &wy, &wz) &&
247                wz >= 0.0 && wz <= 1.0) {
248                char buff[20];
249                glLoadIdentity();
250                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
251                sprintf(buff, "%.*g", NUMDIGITS, iter.getValue());
252                _font->draw(buff);
253            }
254        }
255        for (result = yAxis.firstMajor(iter); result; result = iter.next()) {
256            float y;
257            y = yAxis.map(iter.getValue());
258            if (gluProject(1.0 + xLabelOfs, y, 0.0f, mv, prjm, viewport, &wx, &wy, &wz) &&
259                wz >= 0.0 && wz <= 1.0) {
260                char buff[20];
261                glLoadIdentity();
262                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
263                sprintf(buff, "%.*g", NUMDIGITS, iter.getValue());
264                _font->draw(buff);
265            }
266        }
267        for (result = zAxis.firstMajor(iter); result; result = iter.next()) {
268            float z;
269            z = zAxis.map(iter.getValue());
270            if (gluProject(1.0 + xLabelOfs, 0.0f, z, mv, prjm, viewport, &wx, &wy, &wz) &&
271                wz >= 0.0 && wz <= 1.0) {
272                char buff[20];
273                glLoadIdentity();
274                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
275                sprintf(buff, "%.*g", NUMDIGITS, iter.getValue());
276                _font->draw(buff);
277            }
278        }
279        _font->end();
280    };
281
282    glPopMatrix();
283    glPopAttrib();
284}
285
286void Grid::setFont(Fonts *font)
287{
288    _font = font;
289}
290
Note: See TracBrowser for help on using the repository browser.