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

Last change on this file since 3423 was 3362, checked in by ldelgass, 11 years ago

Merge nanovis2 branch to trunk

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