diff --git a/include/osgParticle/Particle b/include/osgParticle/Particle index df7b467ed..3dc4fc511 100644 --- a/include/osgParticle/Particle +++ b/include/osgParticle/Particle @@ -146,6 +146,15 @@ namespace osgParticle /// Get the t texture coordinate of the bottom left of the particle inline float getTCoord() const { return _t_coord; } + /// Get width of texture tile + inline int getTileS() const; + + /// Get height of texture tile + inline int getTileT() const; + + /// Get number of texture tiles + inline int getNumTiles() const { return _num_tile; } + /** Kill the particle on next update NOTE: after calling this function, the isAlive() method will still return true until the particle is updated again. @@ -396,6 +405,16 @@ namespace osgParticle return _prev_angle; } + inline int Particle::getTileS() const + { + return (_s_tile>0.0f) ? static_cast(1.0f / _s_tile) : 1; + } + + inline int Particle::getTileT() const + { + return (_t_tile>0.0f) ? static_cast(1.0f / _t_tile) : 1; + } + inline void Particle::kill() { _mustdie = true; diff --git a/src/osgPlugins/osgParticle/IO_Particle.cpp b/src/osgPlugins/osgParticle/IO_Particle.cpp index c42514329..b6b9e4590 100644 --- a/src/osgPlugins/osgParticle/IO_Particle.cpp +++ b/src/osgPlugins/osgParticle/IO_Particle.cpp @@ -124,6 +124,16 @@ bool read_particle(osgDB::Input &fr, osgParticle::Particle &P) } } + if (fr[0].matchWord("textureTile")) { + int sTile,tTile,numTiles; + if (fr[1].getInt(sTile) && fr[2].getInt(tTile) && fr[3].getInt(numTiles)) { + P.setTextureTile(sTile,tTile,numTiles); + fr += 4; + itAdvanced = true; + } + } + + // interpolators if (fr[0].matchWord("sizeInterpolator") && fr[1].matchString("{")) { @@ -206,6 +216,7 @@ void write_particle(const osgParticle::Particle &P, osgDB::Output &fw) fw.indent() << "radius " << P.getRadius() << std::endl; fw.indent() << "mass " << P.getMass() << std::endl; + fw.indent() << "textureTile " << P.getTileS() << " " << P.getTileT() << " " << P.getNumTiles() << std::endl; // interpolators