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

Last change on this file since 3605 was 3605, checked in by ldelgass, 7 years ago

Add writer thread to nanovis (set USE_THREADS in Makefile), more refactoring.

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