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

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

First pass at loading VTK vector data for flows in nanovis

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