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

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

Cleanups for nanovis utility libs

  • Property svn:eol-style set to native
File size: 7.8 KB
RevLine 
[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]11using namespace nv::util;
12
[932]13#define NUMDIGITS       6
[955]14#define GRID_TICK       0.05
[932]15
[2844]16Grid::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]28Grid::~Grid()
29{
30}
31
[776]32void 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]250void Grid::setFont(Fonts *font)
[776]251{
[862]252    _font = font;
[776]253}
[932]254
Note: See TracBrowser for help on using the repository browser.