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

Last change on this file since 1370 was 1370, checked in by vrinside, 15 years ago

improving the flow vis engine

  • particle advection for multiple vector field
  • specifying multiple advection planes
  • specifying the position of a particle injection plane
  • specifying the axis of a particle injection plane
  • specifying the visibility of particle injection planes
  • specifying the particle color for each particle injection plane
  • rendering device shapes

[NOTE] Currently, I commented out with the MACRO NEW_FLOW_ENGINE in config
To use this, please comment NEW_FLOW_ENGINE in

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