[2798] | 1 | /* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */ |
---|
[2871] | 2 | #include <stdlib.h> |
---|
| 3 | #include <stdio.h> |
---|
| 4 | |
---|
[776] | 5 | #include <GL/glew.h> |
---|
| 6 | #include <GL/gl.h> |
---|
[2871] | 7 | |
---|
[776] | 8 | #include "Grid.h" |
---|
[3362] | 9 | #include "Trace.h" |
---|
[776] | 10 | |
---|
[3463] | 11 | using namespace nv::util; |
---|
| 12 | |
---|
[932] | 13 | #define NUMDIGITS 6 |
---|
[955] | 14 | #define GRID_TICK 0.05 |
---|
[932] | 15 | |
---|
[2844] | 16 | Grid::Grid() : |
---|
| 17 | xAxis("X"), |
---|
| 18 | yAxis("Y"), |
---|
| 19 | zAxis("Z"), |
---|
[932] | 20 | _axisColor(1.0f, 1.0f, 1.0f, 1.0f), |
---|
| 21 | _majorColor(1.0f, 1.0f, 1.0f, 1.0f), |
---|
[955] | 22 | _minorColor(0.5f, 0.5f, 0.5f, 1.0f), |
---|
[2953] | 23 | _font(NULL), |
---|
[2844] | 24 | _visible(false) |
---|
[776] | 25 | { |
---|
| 26 | } |
---|
| 27 | |
---|
[2953] | 28 | Grid::~Grid() |
---|
| 29 | { |
---|
| 30 | } |
---|
| 31 | |
---|
[776] | 32 | void Grid::render() |
---|
| 33 | { |
---|
[2932] | 34 | glPushAttrib(GL_ENABLE_BIT); |
---|
| 35 | |
---|
[862] | 36 | glEnable(GL_DEPTH_TEST); |
---|
[953] | 37 | glDisable(GL_TEXTURE_2D); |
---|
| 38 | glEnable(GL_BLEND); |
---|
[932] | 39 | #ifdef notdef |
---|
| 40 | glEnable(GL_LINE_SMOOTH); |
---|
| 41 | #endif |
---|
[2932] | 42 | |
---|
[3362] | 43 | glMatrixMode(GL_MODELVIEW); |
---|
[2932] | 44 | glPushMatrix(); |
---|
[776] | 45 | |
---|
[3362] | 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 | |
---|
[3452] | 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", |
---|
[3362] | 65 | xAxis.min(), xAxis.max(), |
---|
| 66 | yAxis.min(), yAxis.max(), |
---|
| 67 | zAxis.min(), zAxis.max()); |
---|
[3452] | 68 | TRACE("Axis vmin/vmax: %g,%g %g,%g %g,%g", |
---|
[3362] | 69 | xAxis.dataMin(), xAxis.dataMax(), |
---|
| 70 | yAxis.dataMin(), yAxis.dataMax(), |
---|
| 71 | zAxis.dataMin(), zAxis.dataMax()); |
---|
[3452] | 72 | TRACE("paspect: %g %g %g", paspectX, paspectY, paspectZ); |
---|
| 73 | TRACE("scale: %g %g %g", xscale, yscale, zscale); |
---|
[3362] | 74 | |
---|
| 75 | glTranslatef(-0.5f * paspectX, -0.5f * paspectY, -0.5f * paspectZ); |
---|
| 76 | glScalef(xscale, yscale, zscale); |
---|
| 77 | glTranslatef(xoffset, yoffset, zoffset); |
---|
| 78 | |
---|
[862] | 79 | glLineWidth(2.0f); |
---|
[932] | 80 | glColor4f(_axisColor.red, _axisColor.green, _axisColor.blue, |
---|
[2871] | 81 | _axisColor.alpha); |
---|
[776] | 82 | |
---|
[862] | 83 | glBegin(GL_LINES); |
---|
| 84 | { |
---|
[2871] | 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); |
---|
[862] | 91 | } |
---|
| 92 | glEnd(); |
---|
[776] | 93 | |
---|
[862] | 94 | glLineWidth(1.0f); |
---|
[932] | 95 | glColor4f(_majorColor.red, _majorColor.green, _majorColor.blue, |
---|
[2871] | 96 | _majorColor.alpha); |
---|
[932] | 97 | |
---|
[862] | 98 | glBegin(GL_LINES); |
---|
[932] | 99 | { |
---|
[2871] | 100 | bool result; |
---|
| 101 | TickIter iter; |
---|
[776] | 102 | |
---|
[2923] | 103 | for (result = xAxis.firstMajor(iter); result; result = iter.next()) { |
---|
[2871] | 104 | float x; |
---|
[2923] | 105 | x = xAxis.map(iter.getValue()); |
---|
[2871] | 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 | } |
---|
[2923] | 111 | for (result = yAxis.firstMajor(iter); result; result = iter.next()) { |
---|
[2871] | 112 | float y; |
---|
[2923] | 113 | y = yAxis.map(iter.getValue()); |
---|
[2871] | 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 | } |
---|
[2923] | 119 | for (result = zAxis.firstMajor(iter); result; result = iter.next()) { |
---|
[2871] | 120 | float z; |
---|
[2923] | 121 | z = zAxis.map(iter.getValue()); |
---|
[2871] | 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 | } |
---|
[862] | 127 | } |
---|
[932] | 128 | glEnd(); |
---|
| 129 | |
---|
| 130 | // Set minor line color |
---|
| 131 | glColor4f(_minorColor.red, _minorColor.green, _minorColor.blue, |
---|
[2871] | 132 | _minorColor.alpha); |
---|
[932] | 133 | |
---|
| 134 | glBegin(GL_LINES); |
---|
| 135 | { |
---|
[2871] | 136 | bool result; |
---|
| 137 | TickIter iter; |
---|
[932] | 138 | |
---|
[2923] | 139 | for (result = xAxis.firstMinor(iter); result; result = iter.next()) { |
---|
[2871] | 140 | float x; |
---|
[2923] | 141 | x = xAxis.map(iter.getValue()); |
---|
[2871] | 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 | } |
---|
[2923] | 147 | for (result = yAxis.firstMinor(iter); result; result = iter.next()) { |
---|
[2871] | 148 | float y; |
---|
[2923] | 149 | y = yAxis.map(iter.getValue()); |
---|
[2871] | 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 | } |
---|
[2923] | 155 | for (result = zAxis.firstMinor(iter); result; result = iter.next()) { |
---|
[2871] | 156 | float z; |
---|
[2923] | 157 | z = zAxis.map(iter.getValue()); |
---|
[2871] | 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 | } |
---|
[862] | 163 | } |
---|
| 164 | glEnd(); |
---|
[776] | 165 | |
---|
[932] | 166 | if (_font != NULL) { |
---|
[2871] | 167 | double mv[16], prjm[16]; |
---|
| 168 | int viewport[4]; |
---|
| 169 | double wx, wy, wz; |
---|
| 170 | bool result; |
---|
| 171 | TickIter iter; |
---|
[932] | 172 | |
---|
[2871] | 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); |
---|
[932] | 209 | |
---|
[2923] | 210 | for (result = xAxis.firstMajor(iter); result; result = iter.next()) { |
---|
[2871] | 211 | float x; |
---|
[2923] | 212 | x = xAxis.map(iter.getValue()); |
---|
[2871] | 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); |
---|
[2923] | 217 | sprintf(buff, "%.*g", NUMDIGITS, iter.getValue()); |
---|
[2871] | 218 | _font->draw(buff); |
---|
| 219 | } |
---|
| 220 | } |
---|
[2923] | 221 | for (result = yAxis.firstMajor(iter); result; result = iter.next()) { |
---|
[2871] | 222 | float y; |
---|
[2923] | 223 | y = yAxis.map(iter.getValue()); |
---|
[2871] | 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); |
---|
[2923] | 228 | sprintf(buff, "%.*g", NUMDIGITS, iter.getValue()); |
---|
[2871] | 229 | _font->draw(buff); |
---|
| 230 | } |
---|
| 231 | } |
---|
[2923] | 232 | for (result = zAxis.firstMajor(iter); result; result = iter.next()) { |
---|
[2871] | 233 | float z; |
---|
[2923] | 234 | z = zAxis.map(iter.getValue()); |
---|
[2871] | 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); |
---|
[2923] | 239 | sprintf(buff, "%.*g", NUMDIGITS, iter.getValue()); |
---|
[2871] | 240 | _font->draw(buff); |
---|
| 241 | } |
---|
| 242 | } |
---|
| 243 | _font->end(); |
---|
[862] | 244 | }; |
---|
[2932] | 245 | |
---|
[862] | 246 | glPopMatrix(); |
---|
[2932] | 247 | glPopAttrib(); |
---|
[776] | 248 | } |
---|
[2871] | 249 | |
---|
[3463] | 250 | void Grid::setFont(Fonts *font) |
---|
[776] | 251 | { |
---|
[862] | 252 | _font = font; |
---|
[776] | 253 | } |
---|
[932] | 254 | |
---|