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

Last change on this file since 3611 was 3611, checked in by ldelgass, 7 years ago

Use nv namespace for classes in nanovis rather than prefixing class names with
Nv (still need to convert shader classes).

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