00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "C_Chute.h"
00024
00025 C_Chute::C_Chute(osg::Group *g,osg::Group *n,string pathTextEau)
00026 {
00027 rootNode = g;
00028 geode = new osg::Geode;
00029 rootNode->addChild(geode);
00030 pathTexture = pathTextEau;
00031 node_emitter = n;
00032 enableShooter = false;
00033 enableAcc = true;
00034 enableGrav = false;
00035 }
00036
00037 void C_Chute::Creer_Chute(double x, double y, double z)
00038 {
00039 ChuteParticleSystem = new osgParticle::ParticleSystem;
00040 ChuteParticleSystem->setDefaultAttributes(pathTexture,false, false);
00041 geode->addDrawable(ChuteParticleSystem);
00042
00043 ChuteSystemUpdater = new osgParticle::ParticleSystemUpdater;
00044 ChuteSystemUpdater->addParticleSystem(ChuteParticleSystem);
00045 rootNode->addChild(ChuteSystemUpdater);
00046
00047 osgParticle::Particle smokeParticle;
00048 smokeParticle.setSizeRange(osgParticle::rangef(range_min,range_max));
00049 smokeParticle.setLifeTime(lifeTime);
00050 smokeParticle.setMass(mass);
00051 ChuteParticleSystem->setDefaultParticleTemplate(smokeParticle);
00052
00053
00054 emitter= new osgParticle::ModularEmitter;
00055 emitter->setParticleSystem(ChuteParticleSystem);
00056 switch (type){
00057 case CHU : emitter->setUpdateCallback(new PSChuteCallback()); break;
00058 case HZ : emitter->setUpdateCallback(new PSChuteHzCallback()); break;
00059 case NUAG : emitter->setUpdateCallback(new PSChuteNuageCallback()); break;
00060 default: ;
00061 }
00062 osgParticle::RandomRateCounter *ChuteRate = static_cast<osgParticle::RandomRateCounter *>(emitter->getCounter());
00063 ChuteRate->setRateRange(nbGenerate, nbGenerate);
00064
00065 placer = new osgParticle::SectorPlacer;
00066 placer->setCenter(x, y, z);
00067 placer->setRadiusRange(radiusRangeMin, radiusRangeMax);
00068 emitter->setPlacer(placer);
00069
00070 smokeShooter = new osgParticle::RadialShooter();
00071 if (enableShooter)
00072 {
00073 smokeShooter->setThetaRange(thetaRangeMin, thetaRangeMax);
00074 smokeShooter->setPhiRange(phiRangeMin, phiRangeMax);
00075 smokeShooter->setInitialSpeedRange(speedRangeMin,speedRangeMax);
00076 }
00077 emitter->setShooter(smokeShooter);
00078 node_emitter->addChild(emitter);
00079
00080 osgParticle::ModularProgram *moveDustInAir = new osgParticle::ModularProgram;
00081 moveDustInAir->setParticleSystem(ChuteParticleSystem);
00082
00083 accelUp = new osgParticle::AccelOperator;
00084 if (enableAcc)
00085 accelUp->setAcceleration(vecAcceleration);
00086 if (enableGrav)
00087 accelUp->setToGravity(gravite);
00088 moveDustInAir->addOperator(accelUp);
00089
00090 airFriction = new osgParticle::FluidFrictionOperator;
00091 airFriction->setFluidToWater();
00092 moveDustInAir->addOperator(airFriction);
00093 rootNode->addChild(moveDustInAir);
00094 }