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

Last change on this file since 3502 was 3502, checked in by ldelgass, 12 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
RevLine 
[2798]1/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
[3502]2/*
3 * Copyright (c) 2004-2013  HUBzero Foundation, LLC
4 *
5 */
[2871]6#include <stdlib.h>
7#include <stdio.h>
8
[776]9#include <GL/glew.h>
10#include <GL/gl.h>
[2871]11
[776]12#include "Grid.h"
[3362]13#include "Trace.h"
[776]14
[3463]15using namespace nv::util;
16
[932]17#define NUMDIGITS       6
[955]18#define GRID_TICK       0.05
[932]19
[2844]20Grid::Grid() :
21    xAxis("X"),
22    yAxis("Y"),
23    zAxis("Z"),
[932]24    _axisColor(1.0f, 1.0f, 1.0f, 1.0f),
25    _majorColor(1.0f, 1.0f, 1.0f, 1.0f),
[955]26    _minorColor(0.5f, 0.5f, 0.5f, 1.0f),
[2953]27    _font(NULL),
[2844]28    _visible(false)
[776]29{
30}
31
[2953]32Grid::~Grid()
33{
34}
35
[776]36void Grid::render()
37{
[2932]38    glPushAttrib(GL_ENABLE_BIT);
39
[862]40    glEnable(GL_DEPTH_TEST);
[953]41    glDisable(GL_TEXTURE_2D);
42    glEnable(GL_BLEND);
[932]43#ifdef notdef
44    glEnable(GL_LINE_SMOOTH);
45#endif
[2932]46
[3362]47    glMatrixMode(GL_MODELVIEW);
[2932]48    glPushMatrix();
[776]49
[3362]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
[3452]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",
[3362]69          xAxis.min(), xAxis.max(),
70          yAxis.min(), yAxis.max(),
71          zAxis.min(), zAxis.max());
[3452]72    TRACE("Axis vmin/vmax: %g,%g %g,%g %g,%g",
[3362]73          xAxis.dataMin(), xAxis.dataMax(),
74          yAxis.dataMin(), yAxis.dataMax(),
75          zAxis.dataMin(), zAxis.dataMax());
[3452]76    TRACE("paspect: %g %g %g", paspectX, paspectY, paspectZ);
77    TRACE("scale: %g %g %g", xscale, yscale, zscale);
[3362]78
79    glTranslatef(-0.5f * paspectX, -0.5f * paspectY, -0.5f * paspectZ);
80    glScalef(xscale, yscale, zscale);
81    glTranslatef(xoffset, yoffset, zoffset);
82
[862]83    glLineWidth(2.0f);
[932]84    glColor4f(_axisColor.red, _axisColor.green, _axisColor.blue,
[2871]85              _axisColor.alpha);
[776]86
[862]87    glBegin(GL_LINES);
88    {
[2871]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);
[862]95    }
96    glEnd();
[776]97
[862]98    glLineWidth(1.0f);
[932]99    glColor4f(_majorColor.red, _majorColor.green, _majorColor.blue,
[2871]100              _majorColor.alpha);
[932]101
[862]102    glBegin(GL_LINES);
[932]103    {
[2871]104        bool result;
105        TickIter iter;
[776]106
[2923]107        for (result = xAxis.firstMajor(iter); result; result = iter.next()) {
[2871]108            float x;
[2923]109            x = xAxis.map(iter.getValue());
[2871]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        }
[2923]115        for (result = yAxis.firstMajor(iter); result; result = iter.next()) {
[2871]116            float y;
[2923]117            y = yAxis.map(iter.getValue());
[2871]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        }
[2923]123        for (result = zAxis.firstMajor(iter); result; result = iter.next()) {
[2871]124            float z;
[2923]125            z = zAxis.map(iter.getValue());
[2871]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        }
[862]131    }
[932]132    glEnd();
133
134    // Set minor line color
135    glColor4f(_minorColor.red, _minorColor.green, _minorColor.blue,
[2871]136              _minorColor.alpha);
[932]137
138    glBegin(GL_LINES);
139    {
[2871]140        bool result;
141        TickIter iter;
[932]142
[2923]143        for (result = xAxis.firstMinor(iter); result; result = iter.next()) {
[2871]144            float x;
[2923]145            x = xAxis.map(iter.getValue());
[2871]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        }
[2923]151        for (result = yAxis.firstMinor(iter); result; result = iter.next()) {
[2871]152            float y;
[2923]153            y = yAxis.map(iter.getValue());
[2871]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        }
[2923]159        for (result = zAxis.firstMinor(iter); result; result = iter.next()) {
[2871]160            float z;
[2923]161            z = zAxis.map(iter.getValue());
[2871]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        }
[862]167    }
168    glEnd();
[776]169
[932]170    if (_font != NULL) {
[2871]171        double mv[16], prjm[16];
172        int viewport[4];
173        double wx, wy, wz;
174        bool result;
175        TickIter iter;
[932]176
[2871]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);
[932]213
[2923]214        for (result = xAxis.firstMajor(iter); result; result = iter.next()) {
[2871]215            float x;
[2923]216            x = xAxis.map(iter.getValue());
[2871]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);
[2923]221                sprintf(buff, "%.*g", NUMDIGITS, iter.getValue());
[2871]222                _font->draw(buff);
223            }
224        }
[2923]225        for (result = yAxis.firstMajor(iter); result; result = iter.next()) {
[2871]226            float y;
[2923]227            y = yAxis.map(iter.getValue());
[2871]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);
[2923]232                sprintf(buff, "%.*g", NUMDIGITS, iter.getValue());
[2871]233                _font->draw(buff);
234            }
235        }
[2923]236        for (result = zAxis.firstMajor(iter); result; result = iter.next()) {
[2871]237            float z;
[2923]238            z = zAxis.map(iter.getValue());
[2871]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);
[2923]243                sprintf(buff, "%.*g", NUMDIGITS, iter.getValue());
[2871]244                _font->draw(buff);
245            }
246        }
247        _font->end();
[862]248    };
[2932]249
[862]250    glPopMatrix();
[2932]251    glPopAttrib();
[776]252}
[2871]253
[3463]254void Grid::setFont(Fonts *font)
[776]255{
[862]256    _font = font;
[776]257}
[932]258
Note: See TracBrowser for help on using the repository browser.