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

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

Nanovis refactoring to fix problems with scaling and multiple results.
Do rendering in world space to properly place and scale multiple data sets.
Also fix flows to reduce resets of animations. More work toward removing
Cg dependency. Fix panning to convert viewport coords to world coords.

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