⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stencil.cpp

📁 最新osg包
💻 CPP
字号:
#include "osg/Stencil"#include "osgDB/Registry"#include "osgDB/Input"#include "osgDB/Output"using namespace osg;using namespace osgDB;using namespace std;// forward declare functions to use later.bool Stencil_readLocalData(Object& obj, Input& fr);bool Stencil_writeLocalData(const Object& obj, Output& fw);bool Stencil_matchFuncStr(const char* str,Stencil::Function& func);const char* Stencil_getFuncStr(Stencil::Function func);bool Stencil_matchOperationStr(const char* str,Stencil::Operation& op);const char* Stencil_getOperationStr(Stencil::Operation op);// register the read and write functions with the osgDB::Registry.RegisterDotOsgWrapperProxy g_StencilProxy(    new osg::Stencil,    "Stencil",    "Object StateAttribute Stencil",    &Stencil_readLocalData,    &Stencil_writeLocalData);bool Stencil_readLocalData(Object& obj, Input& fr){    bool iteratorAdvanced = false;    Stencil& stencil = static_cast<Stencil&>(obj);        bool setFunction = false;    Stencil::Function func = stencil.getFunction();    if (fr[0].matchWord("function") && Stencil_matchFuncStr(fr[1].getStr(),func))    {        setFunction = true;        fr+=2;        iteratorAdvanced = true;    }    int ref = stencil.getFunctionRef();    if (fr[0].matchWord("functionRef") && fr[1].getInt(ref))    {        setFunction = true;        fr+=2;        iteratorAdvanced = true;    }    unsigned int mask = stencil.getFunctionMask();    if (fr[0].matchWord("functionMask") && fr[1].getUInt(mask))    {        setFunction = true;        fr+=2;        iteratorAdvanced = true;    }    if (setFunction) stencil.setFunction(func,ref,mask);    bool setOperation = false;    osg::Stencil::Operation sfail = stencil.getStencilFailOperation();    if (fr[0].matchWord("stencilFailOperation") && Stencil_matchOperationStr(fr[1].getStr(),sfail))    {        setOperation = true;        fr+=2;        iteratorAdvanced = true;    }    osg::Stencil::Operation zfail = stencil.getStencilPassAndDepthFailOperation();    if (fr[0].matchWord("stencilPassAndDepthFailOperation") && Stencil_matchOperationStr(fr[1].getStr(),zfail))    {        setOperation = true;        fr+=2;        iteratorAdvanced = true;    }    osg::Stencil::Operation zpass = stencil.getStencilPassAndDepthPassOperation();    if (fr[0].matchWord("stencilPassAndDepthPassOperation") && Stencil_matchOperationStr(fr[1].getStr(),zpass))    {        setOperation = true;        fr+=2;        iteratorAdvanced = true;    }    if (setOperation) stencil.setOperation(sfail, zfail, zpass);    if (fr[0].matchWord("writeMask") && fr[1].getUInt(mask))    {        stencil.setWriteMask(mask);        fr+=2;        iteratorAdvanced = true;    }    return iteratorAdvanced;}bool Stencil_writeLocalData(const Object& obj,Output& fw){    const Stencil& stencil = static_cast<const Stencil&>(obj);    fw.indent() << "function " << Stencil_getFuncStr(stencil.getFunction()) << std::endl;    fw.indent() << "functionRef " << stencil.getFunctionRef() << std::endl;    fw.indent() << "functionMask 0x" << hex << stencil.getFunctionMask() << dec << std::endl;        fw.indent() << "stencilFailOperation " << Stencil_getOperationStr(stencil.getStencilFailOperation()) << std::endl;    fw.indent() << "stencilPassAndDepthFailOperation " << Stencil_getOperationStr(stencil.getStencilPassAndDepthFailOperation()) << std::endl;    fw.indent() << "stencilPassAndDepthPassOperation " << Stencil_getOperationStr(stencil.getStencilPassAndDepthPassOperation()) << std::endl;        fw.indent() << "writeMask 0x" << hex << stencil.getWriteMask() << dec << std::endl;    return true;}bool Stencil_matchFuncStr(const char* str,Stencil::Function& func){    if (strcmp(str,"NEVER")==0) func = Stencil::NEVER;    else if (strcmp(str,"LESS")==0) func = Stencil::LESS;    else if (strcmp(str,"EQUAL")==0) func = Stencil::EQUAL;    else if (strcmp(str,"LEQUAL")==0) func = Stencil::LEQUAL;    else if (strcmp(str,"GREATER")==0) func = Stencil::GREATER;    else if (strcmp(str,"NOTEQUAL")==0) func = Stencil::NOTEQUAL;    else if (strcmp(str,"GEQUAL")==0) func = Stencil::GEQUAL;    else if (strcmp(str,"ALWAYS")==0) func = Stencil::ALWAYS;    else return false;    return true;}const char* Stencil_getFuncStr(Stencil::Function func){    switch(func)    {        case(Stencil::NEVER): return "NEVER";        case(Stencil::LESS): return "LESS";        case(Stencil::EQUAL): return "EQUAL";        case(Stencil::LEQUAL): return "LEQUAL";        case(Stencil::GREATER): return "GREATER";        case(Stencil::NOTEQUAL): return "NOTEQUAL";        case(Stencil::GEQUAL): return "GEQUAL";        case(Stencil::ALWAYS): return "ALWAYS";    }    return "";}bool Stencil_matchOperationStr(const char* str,Stencil::Operation& op){    if (strcmp(str,"KEEP")==0) op = Stencil::KEEP;    else if (strcmp(str,"ZERO")==0) op = Stencil::ZERO;    else if (strcmp(str,"REPLACE")==0) op = Stencil::REPLACE;    else if (strcmp(str,"INCR")==0) op = Stencil::INCR;    else if (strcmp(str,"DECR")==0) op = Stencil::DECR;    else if (strcmp(str,"INVERT")==0) op = Stencil::INVERT;    else if (strcmp(str,"INCR_WRAP")==0) op = Stencil::INCR_WRAP;    else if (strcmp(str,"DECR_WRAP")==0) op = Stencil::DECR_WRAP;    else return false;    return true;}const char* Stencil_getOperationStr(Stencil::Operation op){    switch(op)    {        case(Stencil::KEEP): return "KEEP";        case(Stencil::ZERO): return "ZERO";        case(Stencil::REPLACE): return "REPLACE";        case(Stencil::INCR): return "INCR";        case(Stencil::DECR): return "DECR";        case(Stencil::INVERT): return "INVERT";        case(Stencil::INCR_WRAP): return "INCR_WRAP";        case(Stencil::DECR_WRAP): return "DECR_WRAP";    }    return "";}

⌨️ 快捷键说明

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