source: nanovis/tags/1.1.4/Grid.cpp @ 4937

Last change on this file since 4937 was 4904, checked in by ldelgass, 9 years ago

Merge serveral changes from trunk. Does not include threading, world space
changes, etc.

  • Property svn:eol-style set to native
File size: 9.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 xDataRange = xAxis.dataMax() - xAxis.dataMin();
70    double yDataRange = yAxis.dataMax() - yAxis.dataMin();
71    double zDataRange = zAxis.dataMax() - zAxis.dataMin();
72
73    double paspectX = 1.0f;
74    double paspectY = yDataRange / xDataRange;
75    double paspectZ = zDataRange / xDataRange;
76 
77    double xscale = xAxis.range() / xDataRange;
78    double yscale = yAxis.range() / xDataRange;
79    double zscale = zAxis.range() / xDataRange;
80
81    double xoffset = (xAxis.min() - xAxis.dataMin()) * xAxis.scale();
82    double yoffset = (yAxis.min() - yAxis.dataMin()) * yAxis.scale();
83    double zoffset = (zAxis.min() - zAxis.dataMin()) * zAxis.scale();
84
85    float xTickLen = TICK_LENGTH;
86    float yTickLen = TICK_LENGTH;
87    float zTickLen = TICK_LENGTH;
88    float xLabelOfs = LABEL_OFFSET;
89    //float yLabelOfs = LABEL_OFFSET;
90    float zLabelOfs = LABEL_OFFSET;
91    float xTitleOfs = TITLE_OFFSET;
92    float yTitleOfs = TITLE_OFFSET;
93    float zTitleOfs = TITLE_OFFSET;
94
95    TRACE("Axis ranges: %g %g %g", xAxis.range(), yAxis.range(), zAxis.range());
96    TRACE("Axis scales: %g %g %g", xAxis.scale(), yAxis.scale(), zAxis.scale());
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        bool result;
134        TickIter iter;
135
136        for (result = xAxis.firstMajor(iter); result; result = iter.next()) {
137            float x;
138            x = xAxis.map(iter.getValue());
139            glVertex3f(x, 0.0f, 0.0f);
140            glVertex3f(x, 1.0f, 0.0f);
141            glVertex3f(x, 0.0f, 0.0f);
142            glVertex3f(x, 0.0f, 1.0f + zTickLen);
143        }
144        for (result = yAxis.firstMajor(iter); result; result = iter.next()) {
145            float y;
146            y = yAxis.map(iter.getValue());
147            glVertex3f(0.0f, y, 0.0f);
148            glVertex3f(1.0f + xTickLen, y, 0.0f);
149            glVertex3f(0.0f, y, 0.0f);
150            glVertex3f(0.0f, y, 1.0f);
151        }
152        for (result = zAxis.firstMajor(iter); result; result = iter.next()) {
153            float z;
154            z = zAxis.map(iter.getValue());
155            glVertex3f(0.0f, 0.0f, z);
156            glVertex3f(0.0f, 1.0f, z);
157            glVertex3f(0.0f, 0.0f, z);
158            glVertex3f(1.0f + xTickLen, 0.0f, z);
159        }
160    }
161    glEnd();
162
163    // Set minor line color
164    glColor4f(_minorColor.r, _minorColor.g, _minorColor.b,
165              _minorColor.a);
166
167    glBegin(GL_LINES);
168    {
169        bool result;
170        TickIter iter;
171
172        for (result = xAxis.firstMinor(iter); result; result = iter.next()) {
173            float x;
174            x = xAxis.map(iter.getValue());
175            glVertex3f(x, 0.0f, 0.0f);
176            glVertex3f(x, 1.0f, 0.0f);
177            glVertex3f(x, 0.0f, 0.0f);
178            glVertex3f(x, 0.0f, 1.0f);
179        }
180        for (result = yAxis.firstMinor(iter); result; result = iter.next()) {
181            float y;
182            y = yAxis.map(iter.getValue());
183            glVertex3f(0.0f, y, 0.0f);
184            glVertex3f(1.0f, y, 0.0f);
185            glVertex3f(0.0f, y, 0.0f);
186            glVertex3f(0.0f, y, 1.0f);
187        }
188        for (result = zAxis.firstMinor(iter); result; result = iter.next()) {
189            float z;
190            z = zAxis.map(iter.getValue());
191            glVertex3f(0.0f, 0.0f, z);
192            glVertex3f(0.0f, 1.0f, z);
193            glVertex3f(0.0f, 0.0f, z);
194            glVertex3f(1.0f, 0.0f, z);
195        }
196    }
197    glEnd();
198
199    if (_font != NULL) {
200        double mv[16], prjm[16];
201        int viewport[4];
202        double wx, wy, wz;
203        bool result;
204        TickIter iter;
205
206        glGetDoublev(GL_MODELVIEW_MATRIX, mv);
207        glGetDoublev(GL_PROJECTION_MATRIX, prjm);
208        glGetIntegerv(GL_VIEWPORT, viewport);
209
210        _font->begin();
211
212        glColor4f(_axisColor.r, _axisColor.g, _axisColor.b,
213                  _axisColor.a);
214
215        if (gluProject(1.0 + xTitleOfs, 0.0, 0.0,
216                       mv, prjm, viewport,
217                       &wx, &wy, &wz) &&
218            wz >= 0.0 && wz <= 1.0) {
219            glLoadIdentity();
220            glTranslatef((int) wx, viewport[3] - (int) wy, 0);
221            const char *name = xAxis.name();
222            if (name == NULL) {
223                name = "???";
224            }
225            _font->draw(name);
226        }
227       
228        if (gluProject(0.0, 1.0 + yTitleOfs, 0.0,
229                       mv, prjm, viewport,
230                       &wx, &wy, &wz) &&
231            wz >= 0.0 && wz <= 1.0) {
232            glLoadIdentity();
233            glTranslatef((int) wx, viewport[3] - (int)wy, 0);
234            const char *name = yAxis.name();
235            if (name == NULL) {
236                name = "???";
237            }
238            _font->draw(name);
239        }
240       
241        if (gluProject(0.0, 0.0, 1.0 + zTitleOfs,
242                       mv, prjm, viewport,
243                       &wx, &wy, &wz) &&
244            wz >= 0.0 && wz <= 1.0) {
245            glLoadIdentity();
246            glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
247            const char *name = zAxis.name();
248            if (name == NULL) {
249                name = "???";
250            }
251            _font->draw(name);
252        }
253
254        glColor4f(_majorColor.r, _majorColor.g, _majorColor.b,
255                  _majorColor.a);
256
257        for (result = xAxis.firstMajor(iter); result; result = iter.next()) {
258            float x;
259            x = xAxis.map(iter.getValue());
260            if (gluProject(x, 0.0f, 1.0 + zLabelOfs,
261                           mv, prjm, viewport,
262                           &wx, &wy, &wz) &&
263                wz >= 0.0 && wz <= 1.0) {
264                char buff[20];
265                glLoadIdentity();
266                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
267                sprintf(buff, "%.*g", NUMDIGITS, iter.getValue());
268                _font->draw(buff);
269            }
270        }
271        for (result = yAxis.firstMajor(iter); result; result = iter.next()) {
272            float y;
273            y = yAxis.map(iter.getValue());
274            if (gluProject(1.0 + xLabelOfs, y, 0.0f,
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, iter.getValue());
282                _font->draw(buff);
283            }
284        }
285        for (result = zAxis.firstMajor(iter); result; result = iter.next()) {
286            float z;
287            z = zAxis.map(iter.getValue());
288            if (gluProject(1.0 + xLabelOfs, 0.0f, z,
289                           mv, prjm, viewport,
290                           &wx, &wy, &wz) &&
291                wz >= 0.0 && wz <= 1.0) {
292                char buff[20];
293                glLoadIdentity();
294                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
295                sprintf(buff, "%.*g", NUMDIGITS, iter.getValue());
296                _font->draw(buff);
297            }
298        }
299        _font->end();
300    };
301
302    glPopMatrix();
303    glPopAttrib();
304}
305
306void Grid::setFont(Fonts *font)
307{
308    _font = font;
309}
310
Note: See TracBrowser for help on using the repository browser.