source: trunk/packages/vizservers/nanovis/Grid.cpp @ 3628

Last change on this file since 3628 was 3627, checked in by ldelgass, 11 years ago

Use vrmath::Color4f for color where appropriate

  • Property svn:eol-style set to native
File size: 7.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 GRID_TICK       0.05
23
24Grid::Grid() :
25    xAxis("X"),
26    yAxis("Y"),
27    zAxis("Z"),
28    _axisColor(1.0f, 1.0f, 1.0f, 1.0f),
29    _majorColor(1.0f, 1.0f, 1.0f, 1.0f),
30    _minorColor(0.5f, 0.5f, 0.5f, 1.0f),
31    _font(NULL),
32    _visible(false)
33{
34}
35
36Grid::~Grid()
37{
38}
39
40void Grid::render()
41{
42    if (!isVisible())
43        return;
44
45    glPushAttrib(GL_ENABLE_BIT);
46
47    glEnable(GL_DEPTH_TEST);
48    glDisable(GL_TEXTURE_2D);
49    glEnable(GL_BLEND);
50#ifdef notdef
51    glEnable(GL_LINE_SMOOTH);
52#endif
53
54    glMatrixMode(GL_MODELVIEW);
55    glPushMatrix();
56
57    double xDataRange = xAxis.dataMax() - xAxis.dataMin();
58    double yDataRange = yAxis.dataMax() - yAxis.dataMin();
59    double zDataRange = zAxis.dataMax() - zAxis.dataMin();
60
61    double paspectX = 1.0f;
62    double paspectY = yDataRange / xDataRange;
63    double paspectZ = zDataRange / xDataRange;
64 
65    double xscale = xAxis.range() / xDataRange;
66    double yscale = yAxis.range() / xDataRange;
67    double zscale = zAxis.range() / xDataRange;
68
69    double xoffset = (xAxis.min() - xAxis.dataMin()) * xAxis.scale();
70    double yoffset = (yAxis.min() - yAxis.dataMin()) * yAxis.scale();
71    double zoffset = (zAxis.min() - zAxis.dataMin()) * zAxis.scale();
72
73    TRACE("Axis ranges: %g %g %g", xAxis.range(), yAxis.range(), zAxis.range());
74    TRACE("Axis scales: %g %g %g", xAxis.scale(), yAxis.scale(), zAxis.scale());
75    TRACE("Axis min/max: %g,%g %g,%g %g,%g",
76          xAxis.min(), xAxis.max(),
77          yAxis.min(), yAxis.max(),
78          zAxis.min(), zAxis.max());
79    TRACE("Axis vmin/vmax: %g,%g %g,%g %g,%g",
80          xAxis.dataMin(), xAxis.dataMax(),
81          yAxis.dataMin(), yAxis.dataMax(),
82          zAxis.dataMin(), zAxis.dataMax());
83    TRACE("paspect: %g %g %g", paspectX, paspectY, paspectZ);
84    TRACE("scale: %g %g %g", xscale, yscale, zscale);
85
86    glTranslatef(-0.5f * paspectX, -0.5f * paspectY, -0.5f * paspectZ);
87    glScalef(xscale, yscale, zscale);
88    glTranslatef(xoffset, yoffset, zoffset);
89
90    glLineWidth(2.0f);
91    glColor4f(_axisColor.r, _axisColor.g, _axisColor.b,
92              _axisColor.a);
93
94    glBegin(GL_LINES);
95    {
96        glVertex3f(0.0f, 0.0f, 0.0f);
97        glVertex3f(1.0f + GRID_TICK, 0.0f, 0.0f);
98        glVertex3f(0.0f, 0.0f, 0.0f);
99        glVertex3f(0.0f, 1.0f + GRID_TICK, 0.0f);
100        glVertex3f(0.0f, 0.0f, 0.0f);
101        glVertex3f(0.0f, 0.0f, 1.0f + GRID_TICK);
102    }
103    glEnd();
104
105    glLineWidth(1.0f);
106    glColor4f(_majorColor.r, _majorColor.g, _majorColor.b,
107              _majorColor.a);
108
109    glBegin(GL_LINES);
110    {
111        bool result;
112        TickIter iter;
113
114        for (result = xAxis.firstMajor(iter); result; result = iter.next()) {
115            float x;
116            x = xAxis.map(iter.getValue());
117            glVertex3f(x, 0.0f, 0.0f);
118            glVertex3f(x, 1.0f, 0.0f);
119            glVertex3f(x, 0.0f, 0.0f);
120            glVertex3f(x, 0.0f, 1.0f + GRID_TICK);
121        }
122        for (result = yAxis.firstMajor(iter); result; result = iter.next()) {
123            float y;
124            y = yAxis.map(iter.getValue());
125            glVertex3f(0.0f, y, 0.0f);
126            glVertex3f(1.0f + GRID_TICK, y, 0.0f);
127            glVertex3f(0.0f, y, 0.0f);
128            glVertex3f(0.0f, y, 1.0f);
129        }
130        for (result = zAxis.firstMajor(iter); result; result = iter.next()) {
131            float z;
132            z = zAxis.map(iter.getValue());
133            glVertex3f(0.0f, 0.0f, z);
134            glVertex3f(0.0f, 1.0f, z);
135            glVertex3f(0.0f, 0.0f, z);
136            glVertex3f(1.0f + GRID_TICK, 0.0f, z);
137        }
138    }
139    glEnd();
140
141    // Set minor line color
142    glColor4f(_minorColor.r, _minorColor.g, _minorColor.b,
143              _minorColor.a);
144
145    glBegin(GL_LINES);
146    {
147        bool result;
148        TickIter iter;
149
150        for (result = xAxis.firstMinor(iter); result; result = iter.next()) {
151            float x;
152            x = xAxis.map(iter.getValue());
153            glVertex3f(x, 0.0f, 0.0f);
154            glVertex3f(x, 1.0f, 0.0f);
155            glVertex3f(x, 0.0f, 0.0f);
156            glVertex3f(x, 0.0f, 1.0f);
157        }
158        for (result = yAxis.firstMinor(iter); result; result = iter.next()) {
159            float y;
160            y = yAxis.map(iter.getValue());
161            glVertex3f(0.0f, y, 0.0f);
162            glVertex3f(1.0f, y, 0.0f);
163            glVertex3f(0.0f, y, 0.0f);
164            glVertex3f(0.0f, y, 1.0f);
165        }
166        for (result = zAxis.firstMinor(iter); result; result = iter.next()) {
167            float z;
168            z = zAxis.map(iter.getValue());
169            glVertex3f(0.0f, 0.0f, z);
170            glVertex3f(0.0f, 1.0f, z);
171            glVertex3f(0.0f, 0.0f, z);
172            glVertex3f(1.0f, 0.0f, z);
173        }
174    }
175    glEnd();
176
177    if (_font != NULL) {
178        double mv[16], prjm[16];
179        int viewport[4];
180        double wx, wy, wz;
181        bool result;
182        TickIter iter;
183
184        glGetDoublev(GL_MODELVIEW_MATRIX, mv);
185        glGetDoublev(GL_PROJECTION_MATRIX, prjm);
186        glGetIntegerv(GL_VIEWPORT, viewport);
187       
188        _font->begin();
189        if (gluProject(1.2, 0.0, 0.0, mv, prjm, viewport, &wx, &wy, &wz)) {
190            glLoadIdentity();
191            glTranslatef((int) wx, viewport[3] - (int) wy, 0);
192            const char *name = xAxis.name();
193            if (name == NULL) {
194                name = "???";
195            }
196            _font->draw(name);
197        }
198       
199        if (gluProject(0.0, 1.2, 0.0, mv, prjm, viewport, &wx, &wy, &wz)) {
200            glLoadIdentity();
201            glTranslatef((int) wx, viewport[3] - (int)wy, 0);
202            const char *name = yAxis.name();
203            if (name == NULL) {
204                name = "???";
205            }
206            _font->draw(name);
207        }
208       
209        if (gluProject(0.0, 0.0, 1.2, mv, prjm, viewport, &wx, &wy, &wz)) {
210            glLoadIdentity();
211            glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
212            const char *name = zAxis.name();
213            if (name == NULL) {
214                name = "???";
215            }
216            _font->draw(name);
217        }
218       
219        glColor4f(1.0f, 1.0f, 0.0f, 1.0f);
220
221        for (result = xAxis.firstMajor(iter); result; result = iter.next()) {
222            float x;
223            x = xAxis.map(iter.getValue());
224            if (gluProject(x, 0.0f, 1.06f, mv, prjm, viewport, &wx, &wy, &wz)) {
225                char buff[20];
226                glLoadIdentity();
227                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
228                sprintf(buff, "%.*g", NUMDIGITS, iter.getValue());
229                _font->draw(buff);
230            }
231        }
232        for (result = yAxis.firstMajor(iter); result; result = iter.next()) {
233            float y;
234            y = yAxis.map(iter.getValue());
235            if (gluProject(1.06f, y, 0.0f, mv, prjm, viewport, &wx, &wy, &wz)) {
236                char buff[20];
237                glLoadIdentity();
238                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
239                sprintf(buff, "%.*g", NUMDIGITS, iter.getValue());
240                _font->draw(buff);
241            }
242        }
243        for (result = zAxis.firstMajor(iter); result; result = iter.next()) {
244            float z;
245            z = zAxis.map(iter.getValue());
246            if (gluProject(1.06f, 0.0f, z, mv, prjm, viewport, &wx, &wy, &wz)) {
247                char buff[20];
248                glLoadIdentity();
249                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
250                sprintf(buff, "%.*g", NUMDIGITS, iter.getValue());
251                _font->draw(buff);
252            }
253        }
254        _font->end();
255    };
256
257    glPopMatrix();
258    glPopAttrib();
259}
260
261void Grid::setFont(Fonts *font)
262{
263    _font = font;
264}
265
Note: See TracBrowser for help on using the repository browser.