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

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

Add basic VTK structured points reader to nanovis, update copyright dates.

  • Property svn:eol-style set to native
File size: 7.6 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 "nanovis.h"
7
8#include <vrmath/Vector3f.h>
9#include <vrmath/Vector4f.h>
10
11#include "NvVectorField.h"
12#include "NvParticleRenderer.h"
13
14using namespace vrmath;
15
16NvVectorField::NvVectorField() :
17    _vectorFieldId(0),
18    _volPtr(NULL),
19    _activated(true),
20    _origin(0, 0, 0),
21    _scaleX(1),
22    _scaleY(1),
23    _scaleZ(1),
24    _max(1),
25    _deviceVisible(false)
26{
27}
28
29NvVectorField::~NvVectorField()
30{
31    std::map<std::string, NvParticleRenderer *>::iterator iter;
32    for (iter = _particleRendererMap.begin();
33         iter != _particleRendererMap.end(); iter++) {
34        delete (*iter).second;
35    }
36}
37
38void
39NvVectorField::setVectorField(Volume *volPtr, const Vector3f& origin,
40                              float scaleX, float scaleY, float scaleZ,
41                              float max)
42{
43    _volPtr = volPtr;
44    _origin = origin;
45    _scaleX = scaleX;
46    _scaleY = scaleY;
47    _scaleZ = scaleZ;
48    _max = max;
49    _vectorFieldId = volPtr->textureID();
50}
51
52void
53NvVectorField::addDeviceShape(const std::string& name,
54                              const NvDeviceShape& shape)
55{
56    _shapeMap[name] = shape;
57}
58
59void NvVectorField::removeDeviceShape(const std::string& name)
60{
61    std::map<std::string, NvDeviceShape>::iterator iter = _shapeMap.find(name);
62    if (iter != _shapeMap.end()) _shapeMap.erase(iter);
63}
64
65void NvVectorField::initialize()
66{
67    std::map<std::string, NvParticleRenderer *>::iterator iter;
68    for (iter = _particleRendererMap.begin();
69         iter != _particleRendererMap.end(); iter++) {
70        if ((*iter).second) (*iter).second->initialize();
71    }
72}
73
74void NvVectorField::reset()
75{
76    std::map<std::string, NvParticleRenderer *>::iterator iter;
77    for (iter = _particleRendererMap.begin();
78         iter != _particleRendererMap.end(); iter++) {
79        if ((*iter).second) (*iter).second->reset();
80    }
81}
82
83void NvVectorField::setPlaneAxis(const std::string& name, int axis)
84{
85    std::map<std::string, NvParticleRenderer *>::iterator iter = _particleRendererMap.find(name);
86    if (iter != _particleRendererMap.end()) {
87        (*iter).second->setAxis(axis);
88    }
89   
90}
91
92void NvVectorField::setPlanePos(const std::string& name, float pos)
93{
94    std::map<std::string, NvParticleRenderer *>::iterator iter = _particleRendererMap.find(name);
95    if (iter != _particleRendererMap.end()) {
96        (*iter).second->setPos(pos);
97    }
98}
99
100void NvVectorField::addPlane(const std::string& name)
101{
102    std::map<std::string, NvParticleRenderer *>::iterator iter = _particleRendererMap.find(name);
103    NvParticleRenderer *renderer = NULL;
104    if (iter != _particleRendererMap.end()) {
105        if ((*iter).second != 0) {
106            renderer = (*iter).second;
107        } else {
108            renderer = (*iter).second = new NvParticleRenderer(NMESH, NMESH);
109        }
110    } else {
111        renderer = new NvParticleRenderer(NMESH, NMESH);
112        _particleRendererMap[name] = renderer;
113    }
114
115    renderer->setVectorField(_vectorFieldId, _origin, _scaleX, _scaleY, _scaleZ, _max);
116    if (renderer) {
117        renderer->initialize();
118    }
119}
120
121void NvVectorField::removePlane(const std::string& name)
122{
123    std::map<std::string, NvParticleRenderer* >::iterator iter = _particleRendererMap.find(name);
124    if (iter != _particleRendererMap.end()) {
125        delete (*iter).second;
126        _particleRendererMap.erase(iter);
127    }
128}
129
130void NvVectorField::activatePlane(const std::string& name)
131{
132    std::map<std::string, NvParticleRenderer *>::iterator iter = _particleRendererMap.find(name);
133    if (iter != _particleRendererMap.end()) {
134        (*iter).second->active(true);
135    }
136}
137
138void NvVectorField::deactivatePlane(const std::string& name)
139{
140    std::map<std::string, NvParticleRenderer *>::iterator iter = _particleRendererMap.find(name);
141    if (iter != _particleRendererMap.end()) {
142        (*iter).second->active(false);
143    }
144}
145
146void NvVectorField::setParticleColor(const std::string& name, const vrmath::Vector4f& color)
147{
148    std::map<std::string, NvParticleRenderer *>::iterator iter = _particleRendererMap.find(name);
149    if (iter != _particleRendererMap.end()) {
150        (*iter).second->setColor(color);
151    }
152}
153
154void NvVectorField::setParticleColor(const std::string& name, float r, float g, float b, float a)
155{
156    std::map<std::string, NvParticleRenderer *>::iterator iter = _particleRendererMap.find(name);
157    if (iter != _particleRendererMap.end()) {
158        if ((*iter).second) (*iter).second->setColor(vrmath::Vector4f(r,g,b,a));
159    }
160}
161
162void NvVectorField::advect()
163{
164    std::map<std::string, NvParticleRenderer *>::iterator iter;
165    for (iter = _particleRendererMap.begin();
166         iter != _particleRendererMap.end(); ++iter) {
167        if ((*iter).second && (*iter).second->active())
168            (*iter).second->advect();
169    }
170}
171
172void NvVectorField::render()
173{
174    std::map<std::string, NvParticleRenderer *>::iterator iter;
175    for (iter = _particleRendererMap.begin();
176         iter != _particleRendererMap.end(); ++iter) {
177        if ((*iter).second && (*iter).second->active()) {
178            (*iter).second->render();
179        }
180    }
181    if (_deviceVisible) {
182        drawDeviceShape();
183    }
184}
185
186void
187NvVectorField::drawDeviceShape()
188{
189    glPushAttrib(GL_ENABLE_BIT);
190
191    glEnable(GL_DEPTH_TEST);
192    glDisable(GL_TEXTURE_2D);
193    glDisable(GL_BLEND);
194
195    glMatrixMode(GL_MODELVIEW);
196    glPushMatrix();
197
198    Vector3f origin = _volPtr->location();
199    glTranslatef(origin.x, origin.y, origin.z);
200
201    Vector3f scale = _volPtr->getPhysicalScaling();
202    glScaled(scale.x, scale.y, scale.z);
203
204    Vector3f min, max;
205    min.x = _volPtr->xAxis.min();
206    min.y = _volPtr->yAxis.min();
207    min.z = _volPtr->zAxis.min();
208    max.x = _volPtr->xAxis.max();
209    max.y = _volPtr->yAxis.max();
210    max.z = _volPtr->zAxis.max();
211
212    std::map<std::string, NvDeviceShape>::iterator iterShape;
213
214    for (iterShape = _shapeMap.begin(); iterShape != _shapeMap.end();
215         ++iterShape) {
216        NvDeviceShape& shape = (*iterShape).second;
217
218        if (!shape.visible) continue;
219
220        float x0, y0, z0, x1, y1, z1;
221        x0 = y0 = z0 = 0.0f;
222        x1 = y1 = z1 = 0.0f;
223        if (max.x > min.x) {
224            x0 = (shape.min.x - min.x) / (max.x - min.x);
225            x1 = (shape.max.x - min.x) / (max.x - min.x);
226        }
227        if (max.y > min.y) {
228            y0 = (shape.min.y - min.y) / (max.y - min.y);
229            y1 = (shape.max.y - min.y) / (max.y - min.y);
230        }
231        if (max.z > min.z) {
232            z0 = (shape.min.z - min.z) / (max.z - min.z);
233            z1 = (shape.max.z - min.z) / (max.z - min.z);
234        }
235
236        TRACE("rendering box %g,%g %g,%g %g,%g", x0, x1, y0, y1, z0, z1);
237
238        glColor4d(shape.color.x, shape.color.y, shape.color.z, shape.color.w);
239        glLineWidth(1.2);
240        glBegin(GL_LINE_LOOP);
241        {
242            glVertex3d(x0, y0, z0);
243            glVertex3d(x1, y0, z0);
244            glVertex3d(x1, y1, z0);
245            glVertex3d(x0, y1, z0);
246        }
247        glEnd();
248        glBegin(GL_LINE_LOOP);
249        {
250            glVertex3d(x0, y0, z1);
251            glVertex3d(x1, y0, z1);
252            glVertex3d(x1, y1, z1);
253            glVertex3d(x0, y1, z1);
254        }
255        glEnd();
256       
257        glBegin(GL_LINE_LOOP);
258        {
259            glVertex3d(x0, y0, z0);
260            glVertex3d(x0, y0, z1);
261            glVertex3d(x0, y1, z1);
262            glVertex3d(x0, y1, z0);
263        }
264        glEnd();
265       
266        glBegin(GL_LINE_LOOP);
267        {
268            glVertex3d(x1, y0, z0);
269            glVertex3d(x1, y0, z1);
270            glVertex3d(x1, y1, z1);
271            glVertex3d(x1, y1, z0);
272        }
273        glEnd();
274    }
275   
276    glPopMatrix();
277    glPopAttrib();
278}
279
280void
281NvVectorField::activateDeviceShape(const std::string& name)
282{
283    std::map<std::string, NvDeviceShape>::iterator iter = _shapeMap.find(name);
284    if (iter != _shapeMap.end()) {
285        (*iter).second.visible = true;
286    }
287}
288
289void
290NvVectorField::deactivateDeviceShape(const std::string& name)
291{
292    std::map<std::string, NvDeviceShape>::iterator iter = _shapeMap.find(name);
293    if (iter != _shapeMap.end()) {
294        (*iter).second.visible = false;
295    }
296}
Note: See TracBrowser for help on using the repository browser.