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

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

Fix camera reset for nanovis. Includes refactoring of vector/matrix classes
in nanovis to consolidate into vrmath library. Also add preliminary canonical
view control to clients for testing.

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