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

Last change on this file since 2824 was 2798, checked in by ldelgass, 12 years ago

Add emacs mode magic line in preparation for indentation cleanup

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