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