io_particleeffect.cpp

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

CPP
227
字号
#include <osgParticle/ParticleEffect>#include <osg/io_utils>#include <osgDB/Registry>#include <osgDB/Input>#include <osgDB/Output>#include <osg/Notify>bool  ParticleEffect_readLocalData(osg::Object &obj, osgDB::Input &fr);bool  ParticleEffect_writeLocalData(const osg::Object &obj, osgDB::Output &fw);osgDB::RegisterDotOsgWrapperProxy  ParticleEffect_Proxy(    0,    "ParticleEffect",    "Object Node ParticleEffect",    ParticleEffect_readLocalData,    ParticleEffect_writeLocalData);bool ParticleEffect_readLocalData(osg::Object& object, osgDB::Input& fr){    osgParticle::ParticleEffect& effect = static_cast<osgParticle::ParticleEffect&>(object);    bool itrAdvanced = false;    if (fr.matchSequence("position %s"))    {        effect.setTextureFileName(fr[1].getStr());        fr += 2;        itrAdvanced = true;    }    if (fr.matchSequence("position %f %f %f"))    {        osg::Vec3 position;        fr[1].getFloat(position[0]);        fr[2].getFloat(position[1]);        fr[3].getFloat(position[2]);            effect.setPosition(position);        fr += 4;        itrAdvanced = true;    }    if (fr.matchSequence("scale %f"))    {        float scale;        fr[1].getFloat(scale);        effect.setScale(scale);                fr += 2;        itrAdvanced = true;    }        if (fr.matchSequence("intensity %f"))    {        float intensity;        fr[1].getFloat(intensity);        effect.setIntensity(intensity);                fr += 2;        itrAdvanced = true;    }    if (fr.matchSequence("startTime %f"))    {        float startTime;        fr[1].getFloat(startTime);        effect.setStartTime(startTime);                fr += 2;        itrAdvanced = true;    }    if (fr.matchSequence("emitterDuration %f"))    {        float emitterDuration;        fr[1].getFloat(emitterDuration);        effect.setEmitterDuration(emitterDuration);                fr += 2;        itrAdvanced = true;    }    osgParticle::Particle particle = effect.getDefaultParticleTemplate();    bool particleSet = false;    if (fr.matchSequence("particleDuration %f"))    {        float particleDuration;        fr[1].getFloat(particleDuration);        particle.setLifeTime(particleDuration);        particleSet = true;        fr += 2;        itrAdvanced = true;    }        if (fr[0].matchWord("particleSizeRange"))    {        osgParticle::rangef r;        if (fr[1].getFloat(r.minimum) && fr[2].getFloat(r.maximum))        {            particle.setSizeRange(r);            particleSet = true;            fr += 3;            itrAdvanced = true;        }    }    if (fr[0].matchWord("particleAlphaRange"))    {        osgParticle::rangef r;        if (fr[1].getFloat(r.minimum) && fr[2].getFloat(r.maximum))        {            particle.setAlphaRange(r);            particleSet = true;            fr += 3;            itrAdvanced = true;        }    }    if (fr[0].matchWord("particleColorRange"))    {        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()))        {            particle.setColorRange(r);            particleSet = true;            fr += 9;            itrAdvanced = true;        }    }        if (particleSet)    {        effect.setDefaultParticleTemplate(particle);    }        if (fr.matchSequence("wind %f %f %f"))    {        osg::Vec3 wind;        fr[1].getFloat(wind[0]);        fr[2].getFloat(wind[1]);        fr[3].getFloat(wind[2]);            effect.setWind(wind);                fr += 4;        itrAdvanced = true;    }        if (fr[0].matchWord("useLocalParticleSystem"))    {        if (fr[1].matchWord("FALSE"))        {            effect.setUseLocalParticleSystem(false);            fr+=2;            itrAdvanced = true;            // now read the particle system that is shared with an node external to this particle effect            osg::ref_ptr<osg::Object> readObject = fr.readObjectOfType(osgDB::type_wrapper<osgParticle::ParticleSystem>());            if (readObject.valid())            {                osgParticle::ParticleSystem* ps = static_cast<osgParticle::ParticleSystem*>(readObject.get());                effect.setParticleSystem(ps);                itrAdvanced = true;            }        }        else if (fr[1].matchWord("TRUE"))        {            effect.setUseLocalParticleSystem(true);            fr+=2;            itrAdvanced = true;        }    }    if (!effect.getAutomaticSetup())    {        // since by default the clone of the ParticleEffect is done with automatic setup off to prevent premature loading of        // imagery, we still want to make sure the ParticleEffect is properly built so we'll now mannually enable the automatic setup        // run the buildEffect().        effect.setAutomaticSetup(true);        effect.buildEffect();    }    return itrAdvanced;}bool ParticleEffect_writeLocalData(const osg::Object& object, osgDB::Output& fw){    const osgParticle::ParticleEffect& effect = static_cast<const osgParticle::ParticleEffect&>(object);        fw.indent()<<"textFileName "<<effect.getTextureFileName()<<std::endl;    fw.indent()<<"position "<<effect.getPosition()<<std::endl;    fw.indent()<<"scale "<<effect.getScale()<<std::endl;    fw.indent()<<"intensity "<<effect.getIntensity()<<std::endl;    fw.indent()<<"startTime "<<effect.getStartTime()<<std::endl;    fw.indent()<<"emitterDuration "<<effect.getEmitterDuration()<<std::endl;    fw.indent()<<"particleDuration "<<effect.getParticleDuration()<<std::endl;    osgParticle::rangef rf = effect.getDefaultParticleTemplate().getSizeRange();    fw.indent() << "particleSizeRange " << rf.minimum << " " << rf.maximum << std::endl;    rf = effect.getDefaultParticleTemplate().getAlphaRange();    fw.indent() << "particleAlphaRange " << rf.minimum << " " << rf.maximum << std::endl;    osgParticle::rangev4 rv4 = effect.getDefaultParticleTemplate().getColorRange();    fw.indent() << "particleColorRange ";    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;    fw.indent()<<"wind "<<effect.getWind()<<std::endl;    fw.indent()<<"useLocalParticleSystem ";    if (effect.getUseLocalParticleSystem()) fw<<"TRUE"<<std::endl;    else     {        fw<<"FALSE"<<std::endl;        fw.writeObject(*effect.getParticleSystem());    }    return true;}

⌨️ 快捷键说明

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