source: nanovis/branches/1.1/Grid.cpp @ 4816

Last change on this file since 4816 was 3502, checked in by ldelgass, 11 years ago

Add basic VTK structured points reader to nanovis, update copyright dates.

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