io_particle.cpp

来自「最新osg包」· C++ 代码 · 共 244 行

CPP
244
字号
#include <osgParticle/Particle>#include <osgParticle/Interpolator>#include <osgParticle/range>#include <iostream>#include <string>#include <osg/Vec3>#include <osg/Vec4>#include <osg/Notify>#include <osgDB/Input>#include <osgDB/Output>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<osgParticle::Interpolator *>(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<osgParticle::Interpolator *>(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<osgParticle::Interpolator *>(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;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?