#include #include #include #include #include #include #include #include #include #include bool read_particle(osgDB::Input &fr, osgParticle::Particle &P) { if (fr[0].matchString("{")) { ++fr; int entry = fr[0].getNoNestedBrackets(); bool itAdvanced = true; while (!fr.eof() && fr[0].getNoNestedBrackets() >= entry && itAdvanced) { itAdvanced = false; if (fr[0].matchWord("shape")) { const char *ptstr = fr[1].getStr(); if (ptstr) { if (std::string(ptstr) == "QUAD") { P.setShape(osgParticle::Particle::QUAD); } else if (std::string(ptstr) == "HEXAGON") { P.setShape(osgParticle::Particle::HEXAGON); } else if (std::string(ptstr) == "POINT") { P.setShape(osgParticle::Particle::POINT); } else if (std::string(ptstr) == "QUAD_TRIANGLESTRIP") { P.setShape(osgParticle::Particle::QUAD_TRIANGLESTRIP); } else if (std::string(ptstr) == "LINE") { P.setShape(osgParticle::Particle::LINE); } else { osg::notify(osg::WARN) << "Particle reader warning: invalid shape: " << ptstr << std::endl; } fr += 2; itAdvanced = true; } } if (fr[0].matchWord("lifeTime")) { float lt; if (fr[1].getFloat(lt)) { P.setLifeTime(lt); fr += 2; itAdvanced = true; } } if (fr[0].matchWord("sizeRange")) { osgParticle::rangef r; if (fr[1].getFloat(r.minimum) && fr[2].getFloat(r.maximum)) { P.setSizeRange(r); fr += 3; itAdvanced = true; } } if (fr[0].matchWord("alphaRange")) { osgParticle::rangef r; if (fr[1].getFloat(r.minimum) && fr[2].getFloat(r.maximum)) { P.setAlphaRange(r); fr += 3; itAdvanced = true; } } if (fr[0].matchWord("colorRange")) { osgParticle::rangev4 r; if (fr[1].getFloat(r.minimum.x()) && fr[2].getFloat(r.minimum.y()) && fr[3].getFloat(r.minimum.z()) && fr[4].getFloat(r.minimum.w()) && fr[5].getFloat(r.maximum.x()) && fr[6].getFloat(r.maximum.y()) && fr[7].getFloat(r.maximum.z()) && fr[8].getFloat(r.maximum.w())) { P.setColorRange(r); fr += 9; itAdvanced = true; } } if (fr[0].matchWord("position")) { osg::Vec3 v; if (fr[1].getFloat(v.x()) && fr[2].getFloat(v.y()) && fr[3].getFloat(v.z())) { P.setPosition(v); fr += 4; itAdvanced = true; } } if (fr[0].matchWord("velocity")) { osg::Vec3 v; if (fr[1].getFloat(v.x()) && fr[2].getFloat(v.y()) && fr[3].getFloat(v.z())) { P.setVelocity(v); fr += 4; itAdvanced = true; } } if (fr[0].matchWord("angle")) { osg::Vec3 v; if (fr[1].getFloat(v.x()) && fr[2].getFloat(v.y()) && fr[3].getFloat(v.z())) { P.setAngle(v); fr += 4; itAdvanced = true; } } if (fr[0].matchWord("angularVelocity")) { osg::Vec3 v; if (fr[1].getFloat(v.x()) && fr[2].getFloat(v.y()) && fr[3].getFloat(v.z())) { P.setAngularVelocity(v); fr += 4; itAdvanced = true; } } if (fr[0].matchWord("radius")) { float f; if (fr[1].getFloat(f)) { P.setRadius(f); fr += 2; itAdvanced = true; } } if (fr[0].matchWord("mass")) { float f; if (fr[1].getFloat(f)) { P.setMass(f); fr += 2; itAdvanced = true; } } 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("{")) { fr += 2; itAdvanced = true; osgParticle::Interpolator *ip = dynamic_cast(fr.readObject()); if (ip) { P.setSizeInterpolator(ip); } ++fr; } if (fr[0].matchWord("alphaInterpolator") && fr[1].matchString("{")) { fr += 2; itAdvanced = true; osgParticle::Interpolator *ip = dynamic_cast(fr.readObject()); if (ip) { P.setAlphaInterpolator(ip); } ++fr; } if (fr[0].matchWord("colorInterpolator") && fr[1].matchString("{")) { fr += 2; itAdvanced = true; osgParticle::Interpolator *ip = dynamic_cast(fr.readObject()); if (ip) { P.setColorInterpolator(ip); } ++fr; } } return true; } return false; } void write_particle(const osgParticle::Particle &P, osgDB::Output &fw) { fw << "{" << std::endl; fw.moveIn(); fw.indent() << "shape "; switch (P.getShape()) { case osgParticle::Particle::POINT: fw << "POINT" << std::endl; break; case osgParticle::Particle::HEXAGON: fw << "HEXAGON" << std::endl; break; case osgParticle::Particle::QUAD_TRIANGLESTRIP: fw << "QUAD_TRIANGLESTRIP" << std::endl; break; case osgParticle::Particle::QUAD: fw << "QUAD" << std::endl; break; case osgParticle::Particle::LINE: default: fw << "LINE" << std::endl; break; } fw.indent() << "lifeTime " << P.getLifeTime() << std::endl; osgParticle::rangef rf = P.getSizeRange(); fw.indent() << "sizeRange " << rf.minimum << " " << rf.maximum << std::endl; rf = P.getAlphaRange(); fw.indent() << "alphaRange " << rf.minimum << " " << rf.maximum << std::endl; osgParticle::rangev4 rv4 = P.getColorRange(); fw.indent() << "colorRange "; fw << rv4.minimum.x() << " " << rv4.minimum.y() << " " << rv4.minimum.z() << " " << rv4.minimum.w() << " "; fw << rv4.maximum.x() << " " << rv4.maximum.y() << " " << rv4.maximum.z() << " " << rv4.maximum.w() << std::endl; osg::Vec3 v = P.getPosition(); fw.indent() << "position "; fw << v.x() << " " << v.y() << " " << v.z() << std::endl; v = P.getVelocity(); fw.indent() << "velocity "; fw << v.x() << " " << v.y() << " " << v.z() << std::endl; v = P.getAngle(); fw.indent() << "angle "; fw << v.x() << " " << v.y() << " " << v.z() << std::endl; v = P.getAngularVelocity(); fw.indent() << "angularVelocity "; fw << v.x() << " " << v.y() << " " << v.z() << std::endl; 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 fw.indent() << "sizeInterpolator {" << std::endl; fw.moveIn(); fw.writeObject(*P.getSizeInterpolator()); fw.moveOut(); fw.indent() << "}" << std::endl; fw.indent() << "alphaInterpolator {" << std::endl; fw.moveIn(); fw.writeObject(*P.getAlphaInterpolator()); fw.moveOut(); fw.indent() << "}" << std::endl; fw.indent() << "colorInterpolator {" << std::endl; fw.moveIn(); fw.writeObject(*P.getColorInterpolator()); fw.moveOut(); fw.indent() << "}" << std::endl; fw.moveOut(); fw.indent() << "}" << std::endl; }