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

Last change on this file since 3916 was 3916, checked in by ldelgass, 6 years ago

Don't draw grid labels outside view frustum

  • Property svn:eol-style set to native
File size: 7.1 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            wz >= 0.0 && wz <= 1.0) {
169            glLoadIdentity();
170            glTranslatef((int) wx, viewport[3] - (int) wy, 0);
171            const char *name = xAxis.name();
172            if (name == NULL) {
173                name = "???";
174            }
175            _font->draw(name);
176        }
177       
178        if (gluProject(0.0, 1.2, 0.0, mv, prjm, viewport, &wx, &wy, &wz) &&
179            wz >= 0.0 && wz <= 1.0) {
180            glLoadIdentity();
181            glTranslatef((int) wx, viewport[3] - (int)wy, 0);
182            const char *name = yAxis.name();
183            if (name == NULL) {
184                name = "???";
185            }
186            _font->draw(name);
187        }
188       
189        if (gluProject(0.0, 0.0, 1.2, mv, prjm, viewport, &wx, &wy, &wz) &&
190            wz >= 0.0 && wz <= 1.0) {
191            glLoadIdentity();
192            glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
193            const char *name = zAxis.name();
194            if (name == NULL) {
195                name = "???";
196            }
197            _font->draw(name);
198        }
199       
200        glColor4f(1.0f, 1.0f, 0.0f, 1.0f); 
201
202        for (result = xAxis.firstMajor(iter); result; result = iter.next()) {
203            float x;
204            x = xAxis.map(iter.getValue());
205            if (gluProject(x, 0.0f, 1.06f, mv, prjm, viewport, &wx, &wy, &wz) &&
206                wz >= 0.0 && wz <= 1.0) {
207                char buff[20];
208                glLoadIdentity();
209                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
210                sprintf(buff, "%.*g", NUMDIGITS, iter.getValue());
211                _font->draw(buff);
212            }
213        }
214        for (result = yAxis.firstMajor(iter); result; result = iter.next()) {
215            float y;
216            y = yAxis.map(iter.getValue());
217            if (gluProject(1.06f, y, 0.0f, mv, prjm, viewport, &wx, &wy, &wz) &&
218                wz >= 0.0 && wz <= 1.0) {
219                char buff[20];
220                glLoadIdentity();
221                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
222                sprintf(buff, "%.*g", NUMDIGITS, iter.getValue());
223                _font->draw(buff);
224            }
225        }
226        for (result = zAxis.firstMajor(iter); result; result = iter.next()) {
227            float z;
228            z = zAxis.map(iter.getValue());
229            if (gluProject(1.06f, 0.0f, z, mv, prjm, viewport, &wx, &wy, &wz) &&
230                wz >= 0.0 && wz <= 1.0) {
231                char buff[20];
232                glLoadIdentity();
233                glTranslatef((int) wx, (int) viewport[3] - (int)wy, 0.0f);
234                sprintf(buff, "%.*g", NUMDIGITS, iter.getValue());
235                _font->draw(buff);
236            }
237        }
238        _font->end();
239    };
240
241    glPopMatrix();
242    glPopAttrib();
243}
244
245void Grid::setFont(Fonts *font)
246{
247    _font = font;
248}
249
Note: See TracBrowser for help on using the repository browser.