source: trunk/packages/vizservers/nanovis/ParticleSystemFactory.cpp @ 2096

Last change on this file since 2096 was 2096, checked in by ldelgass, 10 years ago

Normalize line endings, set eol-style to native on *.cpp, *.h files

  • Property svn:eol-style set to native
File size: 6.5 KB
Line 
1#include "ParticleSystemFactory.h"
2#include "ParticleSystem.h"
3#include <vrutil/vrFilePath.h>
4#include <stdio.h>
5
6#ifdef _WIN32
7#include <expat/expat.h>
8#else
9#include <expat.h>
10#endif
11
12#include <string.h>
13
14#ifdef WIN32
15#pragma warning (disable : 4996)
16#endif
17
18#define BUFSIZE 4096
19
20void ParticleSystemFactory::text(void *data, const XML_Char *txt, int len)
21{
22
23
24void ParticleSystemFactory::startElement(void *userData, const char *elementName, const char **attrs)
25{
26        ParticleSystemFactory* This = reinterpret_cast<ParticleSystemFactory*>(userData);
27
28        if (!strcmp(elementName, "particle-sys-info"))
29        {
30                This->parseParticleSysInfo(attrs);
31        }
32        else if (!strcmp(elementName, "emitter"))
33        {
34                This->parseEmitterInfo(attrs);
35        }
36}
37
38void ParticleSystemFactory::endElement(void *userData, const char *name)
39{
40}
41
42ParticleSystemFactory::ParticleSystemFactory()
43: _newParticleSystem(0)
44{
45}
46
47ParticleSystemFactory::~ParticleSystemFactory()
48{
49}
50
51ParticleSystem* ParticleSystemFactory::create(const std::string& fileName)
52{
53        FILE* fp = fopen(fileName.c_str(), "rb");
54
55        if (fp == 0) {
56                return 0;
57        }
58        XML_Parser parser = XML_ParserCreate(NULL);
59
60        XML_SetUserData(parser, this);
61        XML_SetElementHandler(parser, startElement, endElement);
62
63        size_t stat;
64        size_t cnt;
65
66        while(! feof(fp))
67        {
68                void *buff = XML_GetBuffer(parser, BUFSIZE);
69                if (! buff)
70                {
71                        break;
72                }
73                cnt = fread(buff, 1, BUFSIZE, fp);
74                stat = XML_ParseBuffer(parser, (int) cnt, 0);
75                if (!stat)
76                {
77                        //printf("Parse error at line %d\n", XML_GetCurrentLineNumber(parser));
78                        break;
79                }
80        }
81
82        fclose(fp);
83
84        XML_ParserFree(parser);
85
86        return _newParticleSystem;
87}
88
89void ParticleSystemFactory::parseParticleSysInfo(const char** attrs)
90{
91        int width = 2, height = 2; // default
92        std::string fileName = "J-wire-vec.dx";
93        float pointSize = -1.0f;
94        int numOfUsedParticles = -1;
95        bool sortEnabled = false;
96        bool glypEnabled = false;
97        bool bboxVisible = false;
98        bool advectionEnabled = false;
99        bool streamlineEnabled = false;
100        bool timeVaryingData = false;
101        int fieldWidth = 1;
102        int fieldHeight = 1;
103        int fieldDepth = 1;
104        // TBD..
105        //float timeSeries_vel_mag_min;
106        //float timeSeries_vel_mag_max;
107        //float timeSeriesVelMagMax;
108        int startIndex = -1, endIndex = -1;
109        for (int i = 0; attrs[i]; i += 2) {
110                if (!strcmp(attrs[i], "rendertarget-width"))
111                {
112                        width = atoi(attrs[i + 1]);
113                }
114                else if (!strcmp(attrs[i], "rendertarget-height"))
115                {
116                        height = atoi(attrs[i + 1]);
117                }
118                else if (!strcmp(attrs[i], "particle-point-size"))
119                {
120                        pointSize = (float) atof(attrs[i + 1]);
121                }
122                else if (!strcmp(attrs[i], "vector-field-x"))
123                {
124                        fieldWidth = (float) atof(attrs[i + 1]);
125                }
126                else if (!strcmp(attrs[i], "vector-field-y"))
127                {
128                        fieldHeight = (float) atof(attrs[i + 1]);
129                }
130                else if (!strcmp(attrs[i], "vector-field-z"))
131                {
132                        fieldDepth = (float) atof(attrs[i + 1]);
133                }
134                else if (!strcmp(attrs[i], "sort-enabled"))
135                {
136                        if (!strcmp(attrs[i + 1], "true"))
137                                sortEnabled = true;
138                }
139                else if (!strcmp(attrs[i], "glyp-enabled"))
140                {
141                        if (!strcmp(attrs[i + 1], "true"))
142                                glypEnabled = true;
143                }
144                else if (!strcmp(attrs[i], "bbox-draw-enabled"))
145                {
146                        if (!strcmp(attrs[i + 1], "true"))
147                                bboxVisible = true;
148                }
149                else if (!strcmp(attrs[i], "advection-enabled"))
150                {
151                        if (!strcmp(attrs[i + 1], "true"))
152                                advectionEnabled = true;
153                }
154                else if (!strcmp(attrs[i], "stream-line-enabled"))
155                {
156                        if (!strcmp(attrs[i + 1], "true"))
157                                streamlineEnabled = true;
158                }
159                else if (!strcmp(attrs[i], "vector-field"))
160                {
161                        fileName = attrs[i + 1];
162                }
163                else if (!strcmp(attrs[i], "vector-field"))
164                {
165                        if (!strcmp(attrs[i + 1], "true"))
166                                timeVaryingData = true;
167                }
168                else if (!strcmp(attrs[i], "particle-user-num"))
169                {
170                        numOfUsedParticles = atoi(attrs[i + 1]);
171                }
172                else if (!strcmp(attrs[i], "time-series-start-index"))
173                {
174                        startIndex = atoi(attrs[i + 1]);
175                }
176                else if (!strcmp(attrs[i], "time-series-end-index"))
177                {
178                        endIndex = atoi(attrs[i + 1]);
179                }
180                else if (!strcmp(attrs[i], "time-varying"))
181                {
182                        if (!strcmp(attrs[i + 1], "true"))
183                                timeVaryingData = true;
184                }
185               
186        }
187
188        if (timeVaryingData)
189        {
190                char buff[256];
191                sprintf(buff, fileName.c_str(), startIndex);
192                std::string path = vrFilePath::getInstance()->getPath(buff);
193                if (path.size())
194                {
195                        std::string dir;
196                        int index = path.rfind('/');
197                        if (index == -1) {
198                                index = path.rfind('\\');
199                                if (index == -1)
200                                        printf("file not found\n");
201                        }
202
203                        dir = path.substr(0, index + 1);
204                        path = dir + fileName;
205               
206                        _newParticleSystem = new ParticleSystem(width, height, path.c_str(), fieldWidth, fieldHeight, fieldDepth, timeVaryingData, startIndex, endIndex);
207                }
208                else
209                {
210                        _newParticleSystem = new ParticleSystem(width, height, fileName.c_str(), fieldWidth, fieldHeight, fieldDepth, timeVaryingData, startIndex, endIndex);
211                }
212        }
213        else
214        {
215                std::string path = vrFilePath::getInstance()->getPath(fileName.c_str());
216                _newParticleSystem = new ParticleSystem(width, height, path.c_str(), fieldWidth, fieldHeight, fieldDepth, timeVaryingData, startIndex, endIndex);
217        }
218
219        if (pointSize != -1.0f) _newParticleSystem->setDefaultPointSize(pointSize);
220        if (sortEnabled) _newParticleSystem->enable(ParticleSystem::PS_SORT);
221        if (glypEnabled) _newParticleSystem->enable(ParticleSystem::PS_GLYPE);
222        if (bboxVisible) _newParticleSystem->enable(ParticleSystem::PS_DRAW_BBOX);
223        if (advectionEnabled) _newParticleSystem->enable(ParticleSystem::PS_ADVECTION);
224        if (streamlineEnabled) _newParticleSystem->enable(ParticleSystem::PS_STREAMLINE);
225        if (numOfUsedParticles != -1) _newParticleSystem->setUserDefinedNumOfParticles(numOfUsedParticles);
226}
227
228void ParticleSystemFactory::parseEmitterInfo(const char** attrs)
229{
230        ParticleEmitter* emitter = new ParticleEmitter;
231        for (int i = 0; attrs[i]; i += 2) {
232                if (!strcmp(attrs[i], "max-position-offset"))
233                {
234                        float x = 0, y = 0, z = 0;
235                        sscanf(attrs[i+1], "%f%f%f",&x, &y, &z);
236                        emitter->setMaxPositionOffset(x, y, z);
237                }
238                else if (!strcmp(attrs[i], "position"))
239                {
240                        float x = 0, y = 0, z = 0;
241                        sscanf(attrs[i+1], "%f%f%f",&x, &y, &z);
242                        emitter->setPosition(x, y, z);
243                }
244                else if (!strcmp(attrs[i], "min-max-life-time"))
245                {
246                        float min = 0, max = 0;
247                        sscanf(attrs[i+1], "%f%f",&min, &max);
248                        emitter->setMinMaxLifeTime(min, max);
249                }
250                else if (!strcmp(attrs[i], "min-max-new-particles"))
251                {
252                        int min = 0, max = 0;
253                        sscanf(attrs[i+1], "%d%d",&min, &max);
254                        emitter->setMinMaxNumOfNewParticles(min, max);
255                }
256                else if (!strcmp(attrs[i], "enabled"))
257                {
258                        if (!strcmp(attrs[i + 1], "true"))
259                                emitter->setEnabled(true);
260                        else
261                                emitter->setEnabled(false);
262                }
263        }
264        _newParticleSystem->addEmitter(emitter);
265}
Note: See TracBrowser for help on using the repository browser.