Hi,
Sorry for newbee question. But I found that my program memory usage grows up to
200 k per cycle.
I try to find memory leak and maybe some guru look to this code portion and
give me some advice.
(sorry because on linux when I copy code from qtcreator I've got some mess.)
Code:
osg::ref_ptr < osg::MatrixTransform > viewnode_mtx;
osg::ref_ptr < SmokeParticleSystem > smoke_right;
class SmokeParticleSystem : public osg::Group {
private:
// osgParticle::PointPlacer* placer;
public:
SmokeParticleSystem(osg::Group* scene, osg::MatrixTransform*
mt,osg::Uniform *patt) {
osgParticle::ParticleSystem* dustParticleSystem = new
osgParticle::ParticleSystem;
osg::Geode *geode = new osg::Geode();
geode->addDrawable(dustParticleSystem);
this->addChild(geode);
// dustParticleSystem->setDefaultAttributes("smoke.rgb", false, false);
osgParticle::Particle smokeParticle;
smokeParticle.setSizeRange(osgParticle::rangef(1.5f,4.0f)); // meters
smokeParticle.setLifeTime(10); // seconds
smokeParticle.setMass(0.2f);
smokeParticle.setColorRange(osgParticle::rangev4(
osg::Vec4(1, 1.0f, 1.0f, 1.0f),
osg::Vec4(0.8, 0.8, 0.8, 0.0f)));
dustParticleSystem->setDefaultParticleTemplate(smokeParticle);
dustParticleSystem->setDefaultAttributesUsingShaders( "smoke.rgb",
false, 0 );
osgParticle::ParticleSystemUpdater *dustSystemUpdater = new
osgParticle::ParticleSystemUpdater;
dustSystemUpdater->addParticleSystem(dustParticleSystem);
this->addChild(dustSystemUpdater);
osgParticle::ModularEmitter *emitter = new osgParticle::ModularEmitter;
emitter->setParticleSystem(dustParticleSystem);
this->addChild(emitter);
dustRate =
static_cast<osgParticle::RandomRateCounter
*>(emitter->getCounter());
dustRate->setRateRange(20,30);
osgParticle::PointPlacer* placer =
static_cast<osgParticle::PointPlacer *>(emitter->getPlacer());
this->setUpdateCallback(new EmitterUpdateCallback(placer, mt));
osgParticle::RadialShooter* shooter =
static_cast<osgParticle::RadialShooter
*>(emitter->getShooter());
shooter->setThetaRange(-osg::PI_4/8.0, osg::PI_4/8.0 ); // radians,
relative to Z axis.
shooter->setInitialSpeedRange(0,20); // meters/second
emitter->setShooter(shooter);
osgParticle::ModularProgram *program = new osgParticle::ModularProgram;
program->setParticleSystem(dustParticleSystem);
scene->addChild(program);
osgParticle::FluidFrictionOperator *airFriction = new
osgParticle::FluidFrictionOperator;
airFriction->setFluidToAir();
airFriction->setWind(osg::Vec3(0.25, 0, 0));
program->addOperator(airFriction);
osgParticle::AccelOperator *accelUp = new osgParticle::AccelOperator;
accelUp->setToGravity(-0.2f);
program->addOperator(accelUp);
osg::StateSet* stateset = dustParticleSystem->getOrCreateStateSet();
stateset->setAttribute(program_data->particle_program);
osg::Uniform* baseTextureSampler = new osg::Uniform("baseTexture",0);
stateset->addUniform(baseTextureSampler);
stateset->addUniform(patt);
}
osgParticle::RandomRateCounter *dustRate;
};
At the begining of every cycle I clean root this way.
Code:
viewnode_mtx->removeChildren(0,viewnode_mtx->getNumChildren());
when I need to add particle system to scenery root I use.
Code:
this->smoke_right = new SmokeParticleSystem(this->viewnode,
this->pat_r.get(),this->point_att_u);
this->smoke_right->setNodeMask(IS_VISIBLE_MASK);
this->smoke_right->setName("smoke");
this->viewnode_mtx->addChild( this->smoke_right);
Could you please comment if memory freed when I remove children or not. And
maybe I should use ref_ptr on smokeparticlesystem.
Thank you!
Cheers,
Roman
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=54481#54481
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org