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

Last change on this file since 3470 was 3470, checked in by ldelgass, 6 years ago

Cleanups for nanovis utility libs

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