00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "ParticleSysComponent.h"
00018 #include "../../core/GameManager.h"
00019
00020
00021
00022
00023 ParticleSysComponent::ParticleSysComponent(Entity *parent, const vector3df &scale)
00024 : SceneComponent(parent, true)
00025 {
00026 if(pParent != NULL)
00027 {
00028
00029 ISceneManager *pSceneMgr = GameManager::Instance()->getSceneManager();
00030
00031
00032 mParticleSystemSN = pSceneMgr->addParticleSystemSceneNode(true, 0, parent->getID(),
00033 parent->getAbsolutePosition(),
00034 parent->getAbsoluteRotation(),
00035 scale);
00036 mSceneNode = mParticleSystemSN;
00037
00038
00039 mTriSelector = NULL;
00040 mMetaSelector = pSceneMgr->createMetaTriangleSelector();
00041 }
00042 }
00043
00044
00045 ParticleSysComponent::~ParticleSysComponent()
00046 {
00047 if(pParent != NULL)
00048 {
00049 mParticleSystemSN->remove();
00050 mSceneNode = NULL;
00051 }
00052 }
00053
00054
00055 IParticleSystemSceneNode* ParticleSysComponent::getParticleSystemSceneNode()
00056 {
00057 return mParticleSystemSN;
00058 }
00059
00060
00061 void ParticleSysComponent::addAffector(IParticleAffector *affector)
00062 {
00063 mParticleSystemSN->addAffector(affector);
00064 }
00065
00066
00067 void ParticleSysComponent::addAttractionAffector(const vector3df &point, f32 speed, bool attract,
00068 bool affectX, bool affectY, bool affectZ)
00069 {
00070 IParticleAffector *affector = mParticleSystemSN->createAttractionAffector(point, speed, attract,
00071 affectX, affectY, affectZ);
00072 mParticleSystemSN->addAffector(affector);
00073 affector->drop();
00074 }
00075
00076
00077 void ParticleSysComponent::addFadeOutParticleAffector(const SColor &targetColor,
00078 u32 timeNeededToFadeOut)
00079 {
00080 IParticleAffector *affector = mParticleSystemSN->createFadeOutParticleAffector(targetColor,
00081 timeNeededToFadeOut);
00082 mParticleSystemSN->addAffector(affector);
00083 affector->drop();
00084 }
00085
00086
00087 void ParticleSysComponent::addGravityAffector(const vector3df &gravity, u32 timeForceLost)
00088 {
00089 IParticleAffector *affector = mParticleSystemSN->createGravityAffector(gravity, timeForceLost);
00090 mParticleSystemSN->addAffector(affector);
00091 affector->drop();
00092 }
00093
00094
00095 void ParticleSysComponent::addRotationAffector(const vector3df &speed, const vector3df &pivotPoint)
00096 {
00097 IParticleAffector *affector = mParticleSystemSN->createRotationAffector(speed, pivotPoint);
00098 mParticleSystemSN->addAffector(affector);
00099 affector->drop();
00100 }
00101
00102
00103 void ParticleSysComponent::addScaleParticleAffector(const dimension2df &scaleTo)
00104 {
00105 IParticleAffector *affector = mParticleSystemSN->createScaleParticleAffector(scaleTo);
00106 mParticleSystemSN->addAffector(affector);
00107 affector->drop();
00108 }
00109
00110
00111 void ParticleSysComponent::removeAffectors()
00112 {
00113 mParticleSystemSN->removeAllAffectors();
00114 }
00115
00116
00117 IParticleEmitter* ParticleSysComponent::getEmitter()
00118 {
00119 return mParticleSystemSN->getEmitter();
00120 }
00121
00122
00123 void ParticleSysComponent::setAnimatedMeshSceneNodeEmitter(IAnimatedMeshSceneNode *node,
00124 bool useNormalDirection,
00125 const vector3df &direction,
00126 f32 normalDirectionModifier,
00127 bool everyMeshVertex,
00128 u32 minParticlesPerSecond,
00129 u32 maxParticlesPerSecond,
00130 const SColor &minStartColor,
00131 const SColor &maxStartColor,
00132 u32 lifeTimeMin, u32 lifeTimeMax,
00133 s32 maxAngleDegrees,
00134 const dimension2df &minStartSize,
00135 const dimension2df &maxStartSize)
00136 {
00137 IParticleEmitter *emitter = mParticleSystemSN->createAnimatedMeshSceneNodeEmitter(node,
00138 useNormalDirection, direction, normalDirectionModifier, -1,
00139 everyMeshVertex, minParticlesPerSecond, maxParticlesPerSecond,
00140 minStartColor, maxStartColor, lifeTimeMin, lifeTimeMax,
00141 maxAngleDegrees, minStartSize, maxStartSize);
00142 mParticleSystemSN->setEmitter(emitter);
00143 emitter->drop();
00144 }
00145
00146
00147 void ParticleSysComponent::setBoxEmitter(const aabbox3df &box, const vector3df &direction,
00148 u32 minParticlesPerSecond, u32 maxParticlesPerSecond,
00149 const SColor &minStartColor, const SColor &maxStartColor,
00150 u32 lifeTimeMin, u32 lifeTimeMax, s32 maxAngleDegrees,
00151 const dimension2df &minStartSize,
00152 const dimension2df &maxStartSize)
00153 {
00154 IParticleEmitter *emitter = mParticleSystemSN->createBoxEmitter(box, direction,
00155 minParticlesPerSecond, maxParticlesPerSecond, minStartColor,
00156 maxStartColor, lifeTimeMin, lifeTimeMax, maxAngleDegrees,
00157 minStartSize, maxStartSize);
00158 mParticleSystemSN->setEmitter(emitter);
00159 emitter->drop();
00160 }
00161
00162
00163 void ParticleSysComponent::setCylinderEmitter(const vector3df ¢er, f32 radius,
00164 const vector3df &normal, f32 length,
00165 bool outlineOnly, const vector3df &direction,
00166 u32 minParticlesPerSecond, u32 maxParticlesPerSecond,
00167 const SColor &minStartColor,
00168 const SColor &maxStartColor,
00169 u32 lifeTimeMin, u32 lifeTimeMax, s32 maxAngleDegrees,
00170 const dimension2df &minStartSize,
00171 const dimension2df &maxStartSize)
00172 {
00173 IParticleEmitter *emitter = mParticleSystemSN->createCylinderEmitter(center, radius, normal,
00174 length, outlineOnly, direction, minParticlesPerSecond,
00175 maxParticlesPerSecond, minStartColor, maxStartColor, lifeTimeMin,
00176 lifeTimeMax, maxAngleDegrees, minStartSize, maxStartSize);
00177 mParticleSystemSN->setEmitter(emitter);
00178 emitter->drop();
00179 }
00180
00181
00182 void ParticleSysComponent::setEmitter(IParticleEmitter *emitter)
00183 {
00184 mParticleSystemSN->setEmitter(emitter);
00185 }
00186
00187
00188 void ParticleSysComponent::setMeshEmitter(const std::string &fileName, bool useNormalDirection,
00189 const vector3df &direction, f32 normalDirectionModifier,
00190 bool everyMeshVertex, u32 minParticlesPerSecond,
00191 u32 maxParticlesPerSecond, const SColor &minStartColor,
00192 const SColor &maxStartColor, u32 lifeTimeMin,
00193 u32 lifeTimeMax, s32 maxAngleDegrees,
00194 const dimension2df &minStartSize,
00195 const dimension2df &maxStartSize)
00196 {
00197 IMesh *mesh = GameManager::Instance()->getSceneManager()->getMesh(fileName.c_str());
00198
00199 if(mesh)
00200 {
00201 IParticleEmitter *emitter = mParticleSystemSN->createMeshEmitter(mesh, useNormalDirection,
00202 direction, normalDirectionModifier, -1, everyMeshVertex,
00203 minParticlesPerSecond, maxParticlesPerSecond,
00204 minStartColor, maxStartColor, lifeTimeMin, lifeTimeMax,
00205 maxAngleDegrees, minStartSize, maxStartSize);
00206 mParticleSystemSN->setEmitter(emitter);
00207 emitter->drop();
00208 }
00209 }
00210
00211
00212 void ParticleSysComponent::setMeshEmitter(IMesh *mesh, bool useNormalDirection,
00213 const vector3df &direction,
00214 f32 normalDirectionModifier, bool everyMeshVertex,
00215 u32 minParticlesPerSecond, u32 maxParticlesPerSecond,
00216 const SColor &minStartColor, const SColor &maxStartColor,
00217 u32 lifeTimeMin, u32 lifeTimeMax, s32 maxAngleDegrees,
00218 const dimension2df &minStartSize,
00219 const dimension2df &maxStartSize)
00220 {
00221 IParticleEmitter *emitter = mParticleSystemSN->createMeshEmitter(mesh, useNormalDirection,
00222 direction, normalDirectionModifier, -1, everyMeshVertex,
00223 minParticlesPerSecond, maxParticlesPerSecond,
00224 minStartColor, maxStartColor, lifeTimeMin, lifeTimeMax,
00225 maxAngleDegrees, minStartSize, maxStartSize);
00226 mParticleSystemSN->setEmitter(emitter);
00227 emitter->drop();
00228 }
00229
00230
00231 void ParticleSysComponent::setPointEmitter(const vector3df &direction,
00232 u32 minParticlesPerSecond, u32 maxParticlesPerSecond,
00233 const SColor &minStartColor, const SColor &maxStartColor,
00234 u32 lifeTimeMin, u32 lifeTimeMax, s32 maxAngleDegrees,
00235 const dimension2df &minStartSize,
00236 const dimension2df &maxStartSize)
00237 {
00238 IParticleEmitter *emitter = mParticleSystemSN->createPointEmitter(direction,
00239 minParticlesPerSecond, maxParticlesPerSecond, minStartColor,
00240 maxStartColor, lifeTimeMin, lifeTimeMax, maxAngleDegrees,
00241 minStartSize, maxStartSize);
00242 mParticleSystemSN->setEmitter(emitter);
00243 emitter->drop();
00244 }
00245
00246
00247 void ParticleSysComponent::setRingEmitter(const vector3df ¢er, f32 radius,
00248 f32 ringThickness, const vector3df &direction,
00249 u32 minParticlesPerSecond, u32 maxParticlesPerSecond,
00250 const SColor &minStartColor, const SColor &maxStartColor,
00251 u32 lifeTimeMin, u32 lifeTimeMax, s32 maxAngleDegrees,
00252 const dimension2df &minStartSize,
00253 const dimension2df &maxStartSize)
00254 {
00255 IParticleEmitter *emitter = mParticleSystemSN->createRingEmitter(center, radius, ringThickness,
00256 direction, minParticlesPerSecond, maxParticlesPerSecond,
00257 minStartColor, maxStartColor, lifeTimeMin, lifeTimeMax,
00258 maxAngleDegrees, minStartSize, maxStartSize);
00259 mParticleSystemSN->setEmitter(emitter);
00260 emitter->drop();
00261 }
00262
00263
00264 void ParticleSysComponent::setSphereEmitter(const vector3df ¢er, f32 radius,
00265 const vector3df &direction,
00266 u32 minParticlesPerSecond, u32 maxParticlesPerSecond,
00267 const SColor &minStartColor,
00268 const SColor &maxStartColor,
00269 u32 lifeTimeMin, u32 lifeTimeMax, s32 maxAngleDegrees,
00270 const dimension2df &minStartSize,
00271 const dimension2df &maxStartSize)
00272 {
00273 IParticleEmitter *emitter = mParticleSystemSN->createSphereEmitter(center, radius, direction,
00274 minParticlesPerSecond, maxParticlesPerSecond, minStartColor,
00275 maxStartColor, lifeTimeMin, lifeTimeMax, maxAngleDegrees,
00276 minStartSize, maxStartSize);
00277 mParticleSystemSN->setEmitter(emitter);
00278 emitter->drop();
00279 }
00280
00281
00282 void ParticleSysComponent::setParticlesAreGlobal(bool value)
00283 {
00284 mParticleSystemSN->setParticlesAreGlobal(value);
00285 }
00286
00287
00288 void ParticleSysComponent::setParticleSize(const dimension2df &size)
00289 {
00290 mParticleSystemSN->setParticleSize(size);
00291 }
00292
00293
00294 bool ParticleSysComponent::parseXML(IXMLReader *file, Entity *entity)
00295 {
00296
00297 ParticleSysComponent *component = NULL;
00298
00299
00300 if(file->getNodeType() == io::EXN_ELEMENT)
00301 {
00302 if(stringw("ParticleSysComponent") == file->getNodeName())
00303 {
00304
00305 component = new ParticleSysComponent(entity);
00306 }
00307 }
00308
00309 if(component == NULL)
00310 return false;
00311
00312
00313 while(file->read())
00314 {
00315 switch(file->getNodeType())
00316 {
00317 case io::EXN_ELEMENT:
00318
00319
00320 if(stringw("AttractionAffector") == file->getNodeName())
00321 {
00322
00323 vector3df point;
00324 f32 speed = 1.0f;
00325 bool attract = true;
00326 bool affectX = true;
00327 bool affectY = true;
00328 bool affectZ = true;
00329
00330 bool doneParsing = false;
00331
00332 while(file->read() && !doneParsing)
00333 {
00334 switch(file->getNodeType())
00335 {
00336 case io::EXN_ELEMENT:
00337
00338
00339 if(stringw("point") == file->getNodeName())
00340 {
00341 point = vector3df( file->getAttributeValueAsFloat(L"x"),
00342 file->getAttributeValueAsFloat(L"y"),
00343 file->getAttributeValueAsFloat(L"z") );
00344 }
00345
00346
00347 else if(stringw("speed") == file->getNodeName())
00348 speed = file->getAttributeValueAsFloat(L"value");
00349
00350
00351 else if(stringw("attract") == file->getNodeName())
00352 {
00353 stringc value = file->getAttributeValue(L"value");
00354 attract = (value == "true") ? true : false ;
00355 }
00356
00357
00358 else if(stringw("affectX") == file->getNodeName())
00359 {
00360 stringc value = file->getAttributeValue(L"value");
00361 affectX = (value == "true") ? true : false ;
00362 }
00363
00364
00365 else if(stringw("affectY") == file->getNodeName())
00366 {
00367 stringc value = file->getAttributeValue(L"value");
00368 affectY = (value == "true") ? true : false ;
00369 }
00370
00371
00372 else if(stringw("affectZ") == file->getNodeName())
00373 {
00374 stringc value = file->getAttributeValue(L"value");
00375 affectZ = (value == "true") ? true : false ;
00376 }
00377
00378 break;
00379
00380 case io::EXN_ELEMENT_END:
00381
00382
00383 if(stringw("AttractionAffector") == file->getNodeName())
00384 doneParsing = true;
00385
00386 break;
00387
00388 default:
00389
00390 break;
00391 }
00392 }
00393
00394
00395 component->addAttractionAffector(point, speed, attract, affectX, affectY, affectZ);
00396 }
00397
00398
00399 else if(stringw("FadeOutParticleAffector") == file->getNodeName())
00400 {
00401
00402 SColor targetColor = SColor(0, 0, 0, 0);
00403 u32 timeNeededToFadeOut = 1000;
00404
00405 bool doneParsing = false;
00406
00407 while(file->read() && !doneParsing)
00408 {
00409 switch(file->getNodeType())
00410 {
00411 case io::EXN_ELEMENT:
00412
00413
00414 if(stringw("targetColor") == file->getNodeName())
00415 {
00416 targetColor = SColor( file->getAttributeValueAsInt(L"a"),
00417 file->getAttributeValueAsInt(L"r"),
00418 file->getAttributeValueAsInt(L"g"),
00419 file->getAttributeValueAsInt(L"b") );
00420 }
00421
00422 else if(stringw("timeNeededToFadeOut") == file->getNodeName())
00423 timeNeededToFadeOut = file->getAttributeValueAsInt(L"value");
00424
00425 break;
00426
00427 case io::EXN_ELEMENT_END:
00428
00429
00430 if(stringw("FadeOutParticleAffector") == file->getNodeName())
00431 doneParsing = true;
00432
00433 break;
00434
00435 default:
00436
00437 break;
00438 }
00439 }
00440
00441
00442 component->addFadeOutParticleAffector(targetColor, timeNeededToFadeOut);
00443 }
00444
00445
00446 else if(stringw("GravityAffector") == file->getNodeName())
00447 {
00448
00449 vector3df gravity = vector3df(0.0f,-0.03f, 0.0f);
00450 u32 timeForceLost = 1000;
00451
00452 bool doneParsing = false;
00453
00454 while(file->read() && !doneParsing)
00455 {
00456 switch(file->getNodeType())
00457 {
00458 case io::EXN_ELEMENT:
00459
00460
00461 if(stringw("gravity") == file->getNodeName())
00462 {
00463 gravity = vector3df( file->getAttributeValueAsFloat(L"x"),
00464 file->getAttributeValueAsFloat(L"y"),
00465 file->getAttributeValueAsFloat(L"z") );
00466 }
00467
00468 else if(stringw("timeForceLost") == file->getNodeName())
00469 timeForceLost = file->getAttributeValueAsInt(L"value");
00470
00471 break;
00472
00473 case io::EXN_ELEMENT_END:
00474
00475
00476 if(stringw("GravityAffector") == file->getNodeName())
00477 doneParsing = true;
00478
00479 break;
00480
00481 default:
00482
00483 break;
00484 }
00485 }
00486
00487
00488 component->addGravityAffector(gravity, timeForceLost);
00489 }
00490
00491
00492 else if(stringw("RotationAffector") == file->getNodeName())
00493 {
00494
00495 vector3df speed = vector3df(5.0f, 5.0f, 5.0f);
00496 vector3df pivotPoint = vector3df(0.0f, 0.0f, 0.0f);
00497
00498 bool doneParsing = false;
00499
00500 while(file->read() && !doneParsing)
00501 {
00502 switch(file->getNodeType())
00503 {
00504 case io::EXN_ELEMENT:
00505
00506
00507 if(stringw("speed") == file->getNodeName())
00508 {
00509 speed = vector3df( file->getAttributeValueAsFloat(L"x"),
00510 file->getAttributeValueAsFloat(L"y"),
00511 file->getAttributeValueAsFloat(L"z") );
00512 }
00513
00514
00515 else if(stringw("pivotPoint") == file->getNodeName())
00516 {
00517 pivotPoint = vector3df( file->getAttributeValueAsFloat(L"x"),
00518 file->getAttributeValueAsFloat(L"y"),
00519 file->getAttributeValueAsFloat(L"z") );
00520 }
00521
00522 break;
00523
00524 case io::EXN_ELEMENT_END:
00525
00526
00527 if(stringw("RotationAffector") == file->getNodeName())
00528 doneParsing = true;
00529
00530 break;
00531
00532 default:
00533
00534 break;
00535 }
00536 }
00537
00538
00539 component->addRotationAffector(speed, pivotPoint);
00540 }
00541
00542
00543 else if(stringw("ScaleParticleAffector") == file->getNodeName())
00544 {
00545
00546 dimension2df scaleTo = dimension2df(1.0f, 1.0f);
00547
00548 bool doneParsing = false;
00549
00550 while(file->read() && !doneParsing)
00551 {
00552 switch(file->getNodeType())
00553 {
00554 case io::EXN_ELEMENT:
00555
00556
00557 if(stringw("scaleTo") == file->getNodeName())
00558 {
00559 scaleTo = dimension2df( file->getAttributeValueAsFloat(L"width"),
00560 file->getAttributeValueAsFloat(L"height") );
00561 }
00562
00563 break;
00564
00565 case io::EXN_ELEMENT_END:
00566
00567
00568 if(stringw("ScaleParticleAffector") == file->getNodeName())
00569 doneParsing = true;
00570
00571 break;
00572
00573 default:
00574
00575 break;
00576 }
00577 }
00578
00579
00580 component->addScaleParticleAffector(scaleTo);
00581 }
00582
00583
00584 else if(stringw("MeshEmitter") == file->getNodeName())
00585 {
00586
00587 std::string fileName;
00588 bool useNormalDirection = true;
00589 vector3df direction = vector3df(0.0f, 0.03f, 0.0f);
00590 f32 normalDirectionModifier = 100.0f;
00591 bool everyMeshVertex = false;
00592 u32 minParticlesPerSecond = 5;
00593 u32 maxParticlesPerSecond = 10;
00594 SColor minStartColor = SColor(255, 0, 0, 0);
00595 SColor maxStartColor = SColor(255, 255, 255, 255);
00596 u32 lifeTimeMin = 2000;
00597 u32 lifeTimeMax = 4000;
00598 s32 maxAngleDegrees = 0;
00599 dimension2df minStartSize = dimension2df(5.0f, 5.0f);
00600 dimension2df maxStartSize = dimension2df(5.0f, 5.0f);
00601
00602 bool doneParsing = false;
00603
00604 while(file->read() && !doneParsing)
00605 {
00606 switch(file->getNodeType())
00607 {
00608 case io::EXN_ELEMENT:
00609
00610
00611 if(stringw("fileName") == file->getNodeName())
00612 {
00613 stringc value = file->getAttributeValue(L"value");
00614 fileName = value.c_str();
00615 }
00616
00617
00618 else if(stringw("useNormalDirection") == file->getNodeName())
00619 {
00620 stringc value = file->getAttributeValue(L"value");
00621 useNormalDirection = (value == "true") ? true : false ;
00622 }
00623
00624
00625 else if(stringw("direction") == file->getNodeName())
00626 {
00627 direction = vector3df( file->getAttributeValueAsFloat(L"x"),
00628 file->getAttributeValueAsFloat(L"y"),
00629 file->getAttributeValueAsFloat(L"z") );
00630 }
00631
00632
00633 else if(stringw("normalDirectionModifier") == file->getNodeName())
00634 normalDirectionModifier = file->getAttributeValueAsFloat(L"value");
00635
00636
00637 else if(stringw("everyMeshVertex") == file->getNodeName())
00638 {
00639 stringc value = file->getAttributeValue(L"value");
00640 everyMeshVertex = (value == "true") ? true : false ;
00641 }
00642
00643
00644 else if(stringw("minParticlesPerSecond") == file->getNodeName())
00645 minParticlesPerSecond = file->getAttributeValueAsInt(L"value");
00646
00647
00648 else if(stringw("maxParticlesPerSecond") == file->getNodeName())
00649 maxParticlesPerSecond = file->getAttributeValueAsInt(L"value");
00650
00651
00652 else if(stringw("minStartColor") == file->getNodeName())
00653 {
00654 minStartColor = SColor( file->getAttributeValueAsInt(L"a"),
00655 file->getAttributeValueAsInt(L"r"),
00656 file->getAttributeValueAsInt(L"g"),
00657 file->getAttributeValueAsInt(L"b") );
00658 }
00659
00660
00661 else if(stringw("maxStartColor") == file->getNodeName())
00662 {
00663 maxStartColor = SColor( file->getAttributeValueAsInt(L"a"),
00664 file->getAttributeValueAsInt(L"r"),
00665 file->getAttributeValueAsInt(L"g"),
00666 file->getAttributeValueAsInt(L"b") );
00667 }
00668
00669
00670 else if(stringw("lifeTimeMin") == file->getNodeName())
00671 lifeTimeMin = file->getAttributeValueAsInt(L"value");
00672
00673
00674 else if(stringw("lifeTimeMax") == file->getNodeName())
00675 lifeTimeMax = file->getAttributeValueAsInt(L"value");
00676
00677
00678 else if(stringw("maxAngleDegrees") == file->getNodeName())
00679 maxAngleDegrees = file->getAttributeValueAsInt(L"value");
00680
00681
00682 else if(stringw("minStartSize") == file->getNodeName())
00683 {
00684 minStartSize = dimension2df( file->getAttributeValueAsFloat(L"width"),
00685 file->getAttributeValueAsFloat(L"height"));
00686 }
00687
00688
00689 else if(stringw("maxStartSize") == file->getNodeName())
00690 {
00691 maxStartSize = dimension2df( file->getAttributeValueAsFloat(L"width"),
00692 file->getAttributeValueAsFloat(L"height"));
00693 }
00694
00695 break;
00696
00697 case io::EXN_ELEMENT_END:
00698
00699
00700 if(stringw("MeshEmitter") == file->getNodeName())
00701 doneParsing = true;
00702
00703 break;
00704
00705 default:
00706
00707 break;
00708 }
00709 }
00710
00711
00712 component->setMeshEmitter(fileName, useNormalDirection, direction,
00713 normalDirectionModifier, everyMeshVertex, minParticlesPerSecond,
00714 maxParticlesPerSecond, minStartColor, maxStartColor, lifeTimeMin,
00715 lifeTimeMax, maxAngleDegrees, minStartSize, maxStartSize);
00716 }
00717
00718
00719 else if(stringw("BoxEmitter") == file->getNodeName())
00720 {
00721
00722 aabbox3df box = aabbox3df(-10, 28,-10, 10, 30, 10);
00723 vector3df direction = vector3df(0.0f, 0.03f, 0.0f);
00724 u32 minParticlesPerSecond = 5;
00725 u32 maxParticlesPerSecond = 10;
00726 SColor minStartColor = SColor(255, 0, 0, 0);
00727 SColor maxStartColor = SColor(255, 255, 255, 255);
00728 u32 lifeTimeMin = 2000;
00729 u32 lifeTimeMax = 4000;
00730 s32 maxAngleDegrees = 0;
00731 dimension2df minStartSize = dimension2df(5.0f, 5.0f);
00732 dimension2df maxStartSize = dimension2df(5.0f, 5.0f);
00733
00734 bool doneParsing = false;
00735
00736 while(file->read() && !doneParsing)
00737 {
00738 switch(file->getNodeType())
00739 {
00740 case io::EXN_ELEMENT:
00741
00742
00743 if(stringw("scaleTo") == file->getNodeName())
00744 {
00745 box = aabbox3df( file->getAttributeValueAsFloat(L"minX"),
00746 file->getAttributeValueAsFloat(L"minY"),
00747 file->getAttributeValueAsFloat(L"minZ"),
00748 file->getAttributeValueAsFloat(L"maxX"),
00749 file->getAttributeValueAsFloat(L"maxY"),
00750 file->getAttributeValueAsFloat(L"maxZ") );
00751 }
00752
00753
00754 else if(stringw("direction") == file->getNodeName())
00755 {
00756 direction = vector3df( file->getAttributeValueAsFloat(L"x"),
00757 file->getAttributeValueAsFloat(L"y"),
00758 file->getAttributeValueAsFloat(L"z") );
00759 }
00760
00761
00762 else if(stringw("minParticlesPerSecond") == file->getNodeName())
00763 minParticlesPerSecond = file->getAttributeValueAsInt(L"value");
00764
00765
00766 else if(stringw("maxParticlesPerSecond") == file->getNodeName())
00767 maxParticlesPerSecond = file->getAttributeValueAsInt(L"value");
00768
00769
00770 else if(stringw("minStartColor") == file->getNodeName())
00771 {
00772 minStartColor = SColor( file->getAttributeValueAsInt(L"a"),
00773 file->getAttributeValueAsInt(L"r"),
00774 file->getAttributeValueAsInt(L"g"),
00775 file->getAttributeValueAsInt(L"b") );
00776 }
00777
00778
00779 else if(stringw("maxStartColor") == file->getNodeName())
00780 {
00781 maxStartColor = SColor( file->getAttributeValueAsInt(L"a"),
00782 file->getAttributeValueAsInt(L"r"),
00783 file->getAttributeValueAsInt(L"g"),
00784 file->getAttributeValueAsInt(L"b") );
00785 }
00786
00787
00788 else if(stringw("lifeTimeMin") == file->getNodeName())
00789 lifeTimeMin = file->getAttributeValueAsInt(L"value");
00790
00791
00792 else if(stringw("lifeTimeMax") == file->getNodeName())
00793 lifeTimeMax = file->getAttributeValueAsInt(L"value");
00794
00795
00796 else if(stringw("maxAngleDegrees") == file->getNodeName())
00797 maxAngleDegrees = file->getAttributeValueAsInt(L"value");
00798
00799
00800 else if(stringw("minStartSize") == file->getNodeName())
00801 {
00802 minStartSize = dimension2df( file->getAttributeValueAsFloat(L"width"),
00803 file->getAttributeValueAsFloat(L"height"));
00804 }
00805
00806
00807 else if(stringw("maxStartSize") == file->getNodeName())
00808 {
00809 maxStartSize = dimension2df( file->getAttributeValueAsFloat(L"width"),
00810 file->getAttributeValueAsFloat(L"height"));
00811 }
00812
00813 break;
00814
00815 case io::EXN_ELEMENT_END:
00816
00817
00818 if(stringw("BoxEmitter") == file->getNodeName())
00819 doneParsing = true;
00820
00821 break;
00822
00823 default:
00824
00825 break;
00826 }
00827 }
00828
00829
00830 component->setBoxEmitter(box, direction, minParticlesPerSecond,
00831 maxParticlesPerSecond, minStartColor, maxStartColor, lifeTimeMin,
00832 lifeTimeMax, maxAngleDegrees, minStartSize, maxStartSize);
00833 }
00834
00835
00836 else if(stringw("CylinderEmitter") == file->getNodeName())
00837 {
00838
00839 vector3df center;
00840 f32 radius;
00841 vector3df normal;
00842 f32 length;
00843 bool outlineOnly = false;
00844 vector3df direction = vector3df(0.0f, 0.03f, 0.0f);
00845 u32 minParticlesPerSecond = 5;
00846 u32 maxParticlesPerSecond = 10;
00847 SColor minStartColor = SColor(255, 0, 0, 0);
00848 SColor maxStartColor = SColor(255, 255, 255, 255);
00849 u32 lifeTimeMin = 2000;
00850 u32 lifeTimeMax = 4000;
00851 s32 maxAngleDegrees = 0;
00852 dimension2df minStartSize = dimension2df(5.0f, 5.0f);
00853 dimension2df maxStartSize = dimension2df(5.0f, 5.0f);
00854
00855 bool doneParsing = false;
00856
00857 while(file->read() && !doneParsing)
00858 {
00859 switch(file->getNodeType())
00860 {
00861 case io::EXN_ELEMENT:
00862
00863
00864 if(stringw("center") == file->getNodeName())
00865 {
00866 center = vector3df( file->getAttributeValueAsFloat(L"x"),
00867 file->getAttributeValueAsFloat(L"y"),
00868 file->getAttributeValueAsFloat(L"z") );
00869 }
00870
00871
00872 else if(stringw("radius") == file->getNodeName())
00873 radius = file->getAttributeValueAsFloat(L"value");
00874
00875
00876 else if(stringw("normal") == file->getNodeName())
00877 {
00878 normal = vector3df( file->getAttributeValueAsFloat(L"x"),
00879 file->getAttributeValueAsFloat(L"y"),
00880 file->getAttributeValueAsFloat(L"z") );
00881 }
00882
00883
00884 else if(stringw("length") == file->getNodeName())
00885 length = file->getAttributeValueAsFloat(L"value");
00886
00887
00888 else if(stringw("outlineOnly") == file->getNodeName())
00889 {
00890 stringc value = file->getAttributeValue(L"value");
00891 outlineOnly = (value == "true") ? true : false ;
00892 }
00893
00894
00895 else if(stringw("direction") == file->getNodeName())
00896 {
00897 direction = vector3df( file->getAttributeValueAsFloat(L"x"),
00898 file->getAttributeValueAsFloat(L"y"),
00899 file->getAttributeValueAsFloat(L"z") );
00900 }
00901
00902
00903 else if(stringw("minParticlesPerSecond") == file->getNodeName())
00904 minParticlesPerSecond = file->getAttributeValueAsInt(L"value");
00905
00906
00907 else if(stringw("maxParticlesPerSecond") == file->getNodeName())
00908 maxParticlesPerSecond = file->getAttributeValueAsInt(L"value");
00909
00910
00911 else if(stringw("minStartColor") == file->getNodeName())
00912 {
00913 minStartColor = SColor( file->getAttributeValueAsInt(L"a"),
00914 file->getAttributeValueAsInt(L"r"),
00915 file->getAttributeValueAsInt(L"g"),
00916 file->getAttributeValueAsInt(L"b") );
00917 }
00918
00919
00920 else if(stringw("maxStartColor") == file->getNodeName())
00921 {
00922 maxStartColor = SColor( file->getAttributeValueAsInt(L"a"),
00923 file->getAttributeValueAsInt(L"r"),
00924 file->getAttributeValueAsInt(L"g"),
00925 file->getAttributeValueAsInt(L"b") );
00926 }
00927
00928
00929 else if(stringw("lifeTimeMin") == file->getNodeName())
00930 lifeTimeMin = file->getAttributeValueAsInt(L"value");
00931
00932
00933 else if(stringw("lifeTimeMax") == file->getNodeName())
00934 lifeTimeMax = file->getAttributeValueAsInt(L"value");
00935
00936
00937 else if(stringw("maxAngleDegrees") == file->getNodeName())
00938 maxAngleDegrees = file->getAttributeValueAsInt(L"value");
00939
00940
00941 else if(stringw("minStartSize") == file->getNodeName())
00942 {
00943 minStartSize = dimension2df( file->getAttributeValueAsFloat(L"width"),
00944 file->getAttributeValueAsFloat(L"height"));
00945 }
00946
00947
00948 else if(stringw("maxStartSize") == file->getNodeName())
00949 {
00950 maxStartSize = dimension2df( file->getAttributeValueAsFloat(L"width"),
00951 file->getAttributeValueAsFloat(L"height"));
00952 }
00953
00954 break;
00955
00956 case io::EXN_ELEMENT_END:
00957
00958
00959 if(stringw("CylinderEmitter") == file->getNodeName())
00960 doneParsing = true;
00961
00962 break;
00963
00964 default:
00965
00966 break;
00967 }
00968 }
00969
00970
00971 component->setCylinderEmitter(center, radius, normal, length, outlineOnly,
00972 direction, minParticlesPerSecond, maxParticlesPerSecond, minStartColor,
00973 maxStartColor, lifeTimeMin, lifeTimeMax, maxAngleDegrees,
00974 minStartSize, maxStartSize);
00975 }
00976
00977
00978 else if(stringw("PointEmitter") == file->getNodeName())
00979 {
00980
00981 vector3df direction = vector3df(0.0f, 0.03f, 0.0f);
00982 u32 minParticlesPerSecond = 5;
00983 u32 maxParticlesPerSecond = 10;
00984 SColor minStartColor = SColor(255, 0, 0, 0);
00985 SColor maxStartColor = SColor(255, 255, 255, 255);
00986 u32 lifeTimeMin = 2000;
00987 u32 lifeTimeMax = 4000;
00988 s32 maxAngleDegrees = 0;
00989 dimension2df minStartSize = dimension2df(5.0f, 5.0f);
00990 dimension2df maxStartSize = dimension2df(5.0f, 5.0f);
00991
00992 bool doneParsing = false;
00993
00994 while(file->read() && !doneParsing)
00995 {
00996 switch(file->getNodeType())
00997 {
00998 case io::EXN_ELEMENT:
00999
01000
01001 if(stringw("direction") == file->getNodeName())
01002 {
01003 direction = vector3df( file->getAttributeValueAsFloat(L"x"),
01004 file->getAttributeValueAsFloat(L"y"),
01005 file->getAttributeValueAsFloat(L"z") );
01006 }
01007
01008
01009 else if(stringw("minParticlesPerSecond") == file->getNodeName())
01010 minParticlesPerSecond = file->getAttributeValueAsInt(L"value");
01011
01012
01013 else if(stringw("maxParticlesPerSecond") == file->getNodeName())
01014 maxParticlesPerSecond = file->getAttributeValueAsInt(L"value");
01015
01016
01017 else if(stringw("minStartColor") == file->getNodeName())
01018 {
01019 minStartColor = SColor( file->getAttributeValueAsInt(L"a"),
01020 file->getAttributeValueAsInt(L"r"),
01021 file->getAttributeValueAsInt(L"g"),
01022 file->getAttributeValueAsInt(L"b") );
01023 }
01024
01025
01026 else if(stringw("maxStartColor") == file->getNodeName())
01027 {
01028 maxStartColor = SColor( file->getAttributeValueAsInt(L"a"),
01029 file->getAttributeValueAsInt(L"r"),
01030 file->getAttributeValueAsInt(L"g"),
01031 file->getAttributeValueAsInt(L"b") );
01032 }
01033
01034
01035 else if(stringw("lifeTimeMin") == file->getNodeName())
01036 lifeTimeMin = file->getAttributeValueAsInt(L"value");
01037
01038
01039 else if(stringw("lifeTimeMax") == file->getNodeName())
01040 lifeTimeMax = file->getAttributeValueAsInt(L"value");
01041
01042
01043 else if(stringw("maxAngleDegrees") == file->getNodeName())
01044 maxAngleDegrees = file->getAttributeValueAsInt(L"value");
01045
01046
01047 else if(stringw("minStartSize") == file->getNodeName())
01048 {
01049 minStartSize = dimension2df( file->getAttributeValueAsFloat(L"width"),
01050 file->getAttributeValueAsFloat(L"height"));
01051 }
01052
01053
01054 else if(stringw("maxStartSize") == file->getNodeName())
01055 {
01056 maxStartSize = dimension2df( file->getAttributeValueAsFloat(L"width"),
01057 file->getAttributeValueAsFloat(L"height"));
01058 }
01059
01060 break;
01061
01062 case io::EXN_ELEMENT_END:
01063
01064
01065 if(stringw("PointEmitter") == file->getNodeName())
01066 doneParsing = true;
01067
01068 break;
01069
01070 default:
01071
01072 break;
01073 }
01074 }
01075
01076
01077 component->setPointEmitter(direction, minParticlesPerSecond, maxParticlesPerSecond,
01078 minStartColor, maxStartColor, lifeTimeMin, lifeTimeMax,
01079 maxAngleDegrees, minStartSize, maxStartSize);
01080 }
01081
01082
01083 else if(stringw("RingEmitter") == file->getNodeName())
01084 {
01085
01086 vector3df center;
01087 f32 radius;
01088 f32 ringThickness;
01089 vector3df direction = vector3df(0.0f, 0.03f, 0.0f);
01090 u32 minParticlesPerSecond = 5;
01091 u32 maxParticlesPerSecond = 10;
01092 SColor minStartColor = SColor(255, 0, 0, 0);
01093 SColor maxStartColor = SColor(255, 255, 255, 255);
01094 u32 lifeTimeMin = 2000;
01095 u32 lifeTimeMax = 4000;
01096 s32 maxAngleDegrees = 0;
01097 dimension2df minStartSize = dimension2df(5.0f, 5.0f);
01098 dimension2df maxStartSize = dimension2df(5.0f, 5.0f);
01099
01100 bool doneParsing = false;
01101
01102 while(file->read() && !doneParsing)
01103 {
01104 switch(file->getNodeType())
01105 {
01106 case io::EXN_ELEMENT:
01107
01108
01109 if(stringw("center") == file->getNodeName())
01110 {
01111 center = vector3df( file->getAttributeValueAsFloat(L"x"),
01112 file->getAttributeValueAsFloat(L"y"),
01113 file->getAttributeValueAsFloat(L"z") );
01114 }
01115
01116
01117 else if(stringw("radius") == file->getNodeName())
01118 radius = file->getAttributeValueAsFloat(L"value");
01119
01120
01121 else if(stringw("ringThickness") == file->getNodeName())
01122 ringThickness = file->getAttributeValueAsFloat(L"value");
01123
01124
01125 else if(stringw("direction") == file->getNodeName())
01126 {
01127 direction = vector3df( file->getAttributeValueAsFloat(L"x"),
01128 file->getAttributeValueAsFloat(L"y"),
01129 file->getAttributeValueAsFloat(L"z") );
01130 }
01131
01132
01133 else if(stringw("minParticlesPerSecond") == file->getNodeName())
01134 minParticlesPerSecond = file->getAttributeValueAsInt(L"value");
01135
01136
01137 else if(stringw("maxParticlesPerSecond") == file->getNodeName())
01138 maxParticlesPerSecond = file->getAttributeValueAsInt(L"value");
01139
01140
01141 else if(stringw("minStartColor") == file->getNodeName())
01142 {
01143 minStartColor = SColor( file->getAttributeValueAsInt(L"a"),
01144 file->getAttributeValueAsInt(L"r"),
01145 file->getAttributeValueAsInt(L"g"),
01146 file->getAttributeValueAsInt(L"b") );
01147 }
01148
01149
01150 else if(stringw("maxStartColor") == file->getNodeName())
01151 {
01152 maxStartColor = SColor( file->getAttributeValueAsInt(L"a"),
01153 file->getAttributeValueAsInt(L"r"),
01154 file->getAttributeValueAsInt(L"g"),
01155 file->getAttributeValueAsInt(L"b") );
01156 }
01157
01158
01159 else if(stringw("lifeTimeMin") == file->getNodeName())
01160 lifeTimeMin = file->getAttributeValueAsInt(L"value");
01161
01162
01163 else if(stringw("lifeTimeMax") == file->getNodeName())
01164 lifeTimeMax = file->getAttributeValueAsInt(L"value");
01165
01166
01167 else if(stringw("maxAngleDegrees") == file->getNodeName())
01168 maxAngleDegrees = file->getAttributeValueAsInt(L"value");
01169
01170
01171 else if(stringw("minStartSize") == file->getNodeName())
01172 {
01173 minStartSize = dimension2df( file->getAttributeValueAsFloat(L"width"),
01174 file->getAttributeValueAsFloat(L"height"));
01175 }
01176
01177
01178 else if(stringw("maxStartSize") == file->getNodeName())
01179 {
01180 maxStartSize = dimension2df( file->getAttributeValueAsFloat(L"width"),
01181 file->getAttributeValueAsFloat(L"height"));
01182 }
01183
01184 break;
01185
01186 case io::EXN_ELEMENT_END:
01187
01188
01189 if(stringw("RingEmitter") == file->getNodeName())
01190 doneParsing = true;
01191
01192 break;
01193
01194 default:
01195
01196 break;
01197 }
01198 }
01199
01200
01201 component->setRingEmitter(center, radius, ringThickness, direction,
01202 minParticlesPerSecond, maxParticlesPerSecond, minStartColor,
01203 maxStartColor, lifeTimeMin, lifeTimeMax, maxAngleDegrees,
01204 minStartSize, maxStartSize);
01205 }
01206
01207
01208 else if(stringw("SphereEmitter") == file->getNodeName())
01209 {
01210
01211 vector3df center;
01212 f32 radius;
01213 vector3df direction = vector3df(0.0f, 0.03f, 0.0f);
01214 u32 minParticlesPerSecond = 5;
01215 u32 maxParticlesPerSecond = 10;
01216 SColor minStartColor = SColor(255, 0, 0, 0);
01217 SColor maxStartColor = SColor(255, 255, 255, 255);
01218 u32 lifeTimeMin = 2000;
01219 u32 lifeTimeMax = 4000;
01220 s32 maxAngleDegrees = 0;
01221 dimension2df minStartSize = dimension2df(5.0f, 5.0f);
01222 dimension2df maxStartSize = dimension2df(5.0f, 5.0f);
01223
01224 bool doneParsing = false;
01225
01226 while(file->read() && !doneParsing)
01227 {
01228 switch(file->getNodeType())
01229 {
01230 case io::EXN_ELEMENT:
01231
01232
01233 if(stringw("center") == file->getNodeName())
01234 {
01235 center = vector3df( file->getAttributeValueAsFloat(L"x"),
01236 file->getAttributeValueAsFloat(L"y"),
01237 file->getAttributeValueAsFloat(L"z") );
01238 }
01239
01240
01241 else if(stringw("radius") == file->getNodeName())
01242 radius = file->getAttributeValueAsFloat(L"value");
01243
01244
01245 else if(stringw("direction") == file->getNodeName())
01246 {
01247 direction = vector3df( file->getAttributeValueAsFloat(L"x"),
01248 file->getAttributeValueAsFloat(L"y"),
01249 file->getAttributeValueAsFloat(L"z") );
01250 }
01251
01252
01253 else if(stringw("minParticlesPerSecond") == file->getNodeName())
01254 minParticlesPerSecond = file->getAttributeValueAsInt(L"value");
01255
01256
01257 else if(stringw("maxParticlesPerSecond") == file->getNodeName())
01258 maxParticlesPerSecond = file->getAttributeValueAsInt(L"value");
01259
01260
01261 else if(stringw("minStartColor") == file->getNodeName())
01262 {
01263 minStartColor = SColor( file->getAttributeValueAsInt(L"a"),
01264 file->getAttributeValueAsInt(L"r"),
01265 file->getAttributeValueAsInt(L"g"),
01266 file->getAttributeValueAsInt(L"b") );
01267 }
01268
01269
01270 else if(stringw("maxStartColor") == file->getNodeName())
01271 {
01272 maxStartColor = SColor( file->getAttributeValueAsInt(L"a"),
01273 file->getAttributeValueAsInt(L"r"),
01274 file->getAttributeValueAsInt(L"g"),
01275 file->getAttributeValueAsInt(L"b") );
01276 }
01277
01278
01279 else if(stringw("lifeTimeMin") == file->getNodeName())
01280 lifeTimeMin = file->getAttributeValueAsInt(L"value");
01281
01282
01283 else if(stringw("lifeTimeMax") == file->getNodeName())
01284 lifeTimeMax = file->getAttributeValueAsInt(L"value");
01285
01286
01287 else if(stringw("maxAngleDegrees") == file->getNodeName())
01288 maxAngleDegrees = file->getAttributeValueAsInt(L"value");
01289
01290
01291 else if(stringw("minStartSize") == file->getNodeName())
01292 {
01293 minStartSize = dimension2df( file->getAttributeValueAsFloat(L"width"),
01294 file->getAttributeValueAsFloat(L"height"));
01295 }
01296
01297
01298 else if(stringw("maxStartSize") == file->getNodeName())
01299 {
01300 maxStartSize = dimension2df( file->getAttributeValueAsFloat(L"width"),
01301 file->getAttributeValueAsFloat(L"height"));
01302 }
01303
01304 break;
01305
01306 case io::EXN_ELEMENT_END:
01307
01308
01309 if(stringw("SphereEmitter") == file->getNodeName())
01310 doneParsing = true;
01311
01312 break;
01313
01314 default:
01315
01316 break;
01317 }
01318 }
01319
01320
01321 component->setSphereEmitter(center, radius, direction, minParticlesPerSecond,
01322 maxParticlesPerSecond, minStartColor, maxStartColor, lifeTimeMin,
01323 lifeTimeMax, maxAngleDegrees, minStartSize, maxStartSize);
01324 }
01325
01326
01327 else SceneComponent::parseBaseXML(file, component);
01328
01329 break;
01330
01331 case io::EXN_ELEMENT_END:
01332
01333
01334 if(stringw("ParticleSysComponent") == file->getNodeName())
01335 return true;
01336
01337 break;
01338
01339 default:
01340
01341 break;
01342 }
01343
01344 }
01345
01346
01347 return false;
01348 }
01349
01350