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

Last change on this file since 2932 was 2932, checked in by ldelgass, 12 years ago

Fix a couple more GL state leaks, AxisRange? method rename

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