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

📄 camera.cpp

📁 最新osg包
💻 CPP
字号:
#include <osg/Camera>#include <osg/io_utils>#include <osg/Notify>#include <osgDB/Registry>#include <osgDB/Input>#include <osgDB/Output>#include "Matrix.h"using namespace osg;using namespace osgDB;// forward declare functions to use later.bool Camera_readLocalData(Object& obj, Input& fr);bool Camera_writeLocalData(const Object& obj, Output& fw);bool Camera_matchBufferComponentStr(const char* str,Camera::BufferComponent& buffer);const char* Camera_getBufferComponentStr(Camera::BufferComponent buffer);// register the read and write functions with the osgDB::Registry.RegisterDotOsgWrapperProxy g_CameraProxy(    new osg::Camera,    "Camera",    "Object Node Transform Camera Group",    &Camera_readLocalData,    &Camera_writeLocalData,    DotOsgWrapper::READ_AND_WRITE);// register the read and write functions with the osgDB::Registry.RegisterDotOsgWrapperProxy g_CameraNodeProxy(    new osg::Camera,    "CameraNode",    "Object Node Transform CameraNode Group",    &Camera_readLocalData,    &Camera_writeLocalData,    DotOsgWrapper::READ_AND_WRITE);bool Camera_readLocalData(Object& obj, Input& fr){    bool iteratorAdvanced = false;    Camera& camera = static_cast<Camera&>(obj);    if (fr.matchSequence("clearColor %f %f %f %f"))    {        Vec4 color;        fr[1].getFloat(color[0]);        fr[2].getFloat(color[1]);        fr[3].getFloat(color[2]);        fr[4].getFloat(color[3]);        camera.setClearColor(color);        fr +=5 ;        iteratorAdvanced = true;    };        if (fr.matchSequence("clearMask %i"))    {        unsigned int value;        fr[1].getUInt(value);        camera.setClearMask(value);        fr += 2;        iteratorAdvanced = true;    }    osg::ref_ptr<osg::StateAttribute> attribute;    while((attribute=fr.readStateAttribute())!=NULL)    {        osg::Viewport* viewport = dynamic_cast<osg::Viewport*>(attribute.get());        if (viewport) camera.setViewport(viewport);        else        {            osg::ColorMask* colormask = dynamic_cast<osg::ColorMask*>(attribute.get());            camera.setColorMask(colormask);        }    }    if (fr.matchSequence("transformOrder %w"))    {        if      (fr[1].matchWord("PRE_MULTIPLY")) camera.setTransformOrder(osg::Camera::PRE_MULTIPLY);        else if (fr[1].matchWord("POST_MULTIPLY")) camera.setTransformOrder(osg::Camera::POST_MULTIPLY);        // the following are for backwards compatibility.        else if (fr[1].matchWord("PRE_MULTIPLE")) camera.setTransformOrder(osg::Camera::PRE_MULTIPLY);        else if (fr[1].matchWord("POST_MULTIPLE")) camera.setTransformOrder(osg::Camera::POST_MULTIPLY);        fr += 2;        iteratorAdvanced = true;    }    Matrix matrix;     if (readMatrix(matrix,fr,"ProjectionMatrix"))    {        camera.setProjectionMatrix(matrix);        iteratorAdvanced = true;    }    if (readMatrix(matrix,fr,"ViewMatrix"))    {        camera.setViewMatrix(matrix);        iteratorAdvanced = true;    }    if (fr.matchSequence("renderOrder %w"))    {        if      (fr[1].matchWord("PRE_RENDER")) camera.setRenderOrder(osg::Camera::PRE_RENDER);        else if (fr[1].matchWord("NESTED_RENDER")) camera.setRenderOrder(osg::Camera::NESTED_RENDER);        else if (fr[1].matchWord("POST_RENDER")) camera.setRenderOrder(osg::Camera::POST_RENDER);        fr += 2;        iteratorAdvanced = true;    }    if (fr.matchSequence("renderTargetImplementation %w"))    {        osg::Camera::RenderTargetImplementation implementation = osg::Camera::FRAME_BUFFER;        if      (fr[1].matchWord("FRAME_BUFFER_OBJECT")) implementation = osg::Camera::FRAME_BUFFER_OBJECT;        else if (fr[1].matchWord("PIXEL_BUFFER_RTT")) implementation = osg::Camera::PIXEL_BUFFER_RTT;        else if (fr[1].matchWord("PIXEL_BUFFER")) implementation = osg::Camera::PIXEL_BUFFER;        else if (fr[1].matchWord("FRAME_BUFFER")) implementation = osg::Camera::FRAME_BUFFER;        else if (fr[1].matchWord("SEPERATE_WINDOW")) implementation = osg::Camera::SEPERATE_WINDOW;        camera.setRenderTargetImplementation(implementation);        fr += 2;        iteratorAdvanced = true;    }    if (fr.matchSequence("renderTargetImplementation %w"))    {        osg::Camera::RenderTargetImplementation fallback = camera.getRenderTargetFallback();        if      (fr[1].matchWord("FRAME_BUFFER_OBJECT")) fallback = osg::Camera::FRAME_BUFFER_OBJECT;        else if (fr[1].matchWord("PIXEL_BUFFER_RTT")) fallback = osg::Camera::PIXEL_BUFFER_RTT;        else if (fr[1].matchWord("PIXEL_BUFFER")) fallback = osg::Camera::PIXEL_BUFFER;        else if (fr[1].matchWord("FRAME_BUFFER")) fallback = osg::Camera::FRAME_BUFFER;        else if (fr[1].matchWord("SEPERATE_WINDOW")) fallback = osg::Camera::SEPERATE_WINDOW;        camera.setRenderTargetImplementation(camera.getRenderTargetImplementation(), fallback);        fr += 2;        iteratorAdvanced = true;    }        if (fr.matchSequence("bufferComponent %w {"))    {        int entry = fr[1].getNoNestedBrackets();        Camera::BufferComponent buffer;        Camera_matchBufferComponentStr(fr[1].getStr(),buffer);                fr += 3;                Camera::Attachment& attachment = camera.getBufferAttachmentMap()[buffer];                // read attachment data.        while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)        {            bool localAdvance = false;            if (fr.matchSequence("internalFormat %i"))             {                // In their infinite wisdom, the Apple engineers changed the type                // of GLenum from 'unsigned int' to 'unsigned long', thus breaking                // the call by reference of getUInt.                unsigned int format;                fr[1].getUInt(format);                attachment._internalFormat = format;                fr += 2;                localAdvance = true;            }            osg::ref_ptr<osg::Object> attribute;            while((attribute=fr.readObject())!=NULL)            {                localAdvance = true;                osg::Texture* texture = dynamic_cast<osg::Texture*>(attribute.get());                if (texture) attachment._texture = texture;                else                {                    osg::Image* image = dynamic_cast<osg::Image*>(attribute.get());                    attachment._image = image;                }                            }            if (fr.matchSequence("level %i"))             {                fr[1].getUInt(attachment._level);                fr += 2;                localAdvance = true;            }            if (fr.matchSequence("face %i"))             {                fr[1].getUInt(attachment._face);                fr += 2;                localAdvance = true;            }            if (fr.matchSequence("mipMapGeneration TRUE"))             {                attachment._mipMapGeneration = true;                fr += 2;                localAdvance = true;            }            if (fr.matchSequence("mipMapGeneration FALSE"))             {                attachment._mipMapGeneration = false;                fr += 2;                localAdvance = true;            }            if (!localAdvance) ++fr;        }                iteratorAdvanced = true;    }    return iteratorAdvanced;}bool Camera_writeLocalData(const Object& obj, Output& fw){    const Camera& camera = static_cast<const Camera&>(obj);    fw.indent()<<"clearColor "<<camera.getClearColor()<<std::endl;    fw.indent()<<"clearMask 0x"<<std::hex<<camera.getClearMask()<<std::endl;    if (camera.getColorMask())    {        fw.writeObject(*camera.getColorMask());    }    if (camera.getViewport())    {        fw.writeObject(*camera.getViewport());    }    fw.indent()<<"transformOrder ";    switch(camera.getTransformOrder())    {        case(osg::Camera::PRE_MULTIPLY): fw <<"PRE_MULTIPLY"<<std::endl; break;        case(osg::Camera::POST_MULTIPLY): fw <<"POST_MULTIPLY"<<std::endl; break;    }    writeMatrix(camera.getProjectionMatrix(),fw,"ProjectionMatrix");    writeMatrix(camera.getViewMatrix(),fw,"ViewMatrix");    fw.indent()<<"renderOrder ";    switch(camera.getRenderOrder())    {        case(osg::Camera::PRE_RENDER): fw <<"PRE_RENDER"<<std::endl; break;        case(osg::Camera::NESTED_RENDER): fw <<"NESTED_RENDER"<<std::endl; break;        case(osg::Camera::POST_RENDER): fw <<"POST_RENDER"<<std::endl; break;    }    fw.indent()<<"renderTargetImplementation ";    switch(camera.getRenderTargetImplementation())    {        case(osg::Camera::FRAME_BUFFER_OBJECT): fw <<"FRAME_BUFFER_OBJECT"<<std::endl; break;        case(osg::Camera::PIXEL_BUFFER_RTT): fw <<"PIXEL_BUFFER_RTT"<<std::endl; break;        case(osg::Camera::PIXEL_BUFFER): fw <<"PIXEL_BUFFER"<<std::endl; break;        case(osg::Camera::FRAME_BUFFER): fw <<"FRAME_BUFFER"<<std::endl; break;        case(osg::Camera::SEPERATE_WINDOW): fw <<"SEPERATE_WINDOW"<<std::endl; break;    }    fw.indent()<<"renderTargetFallback ";    switch(camera.getRenderTargetFallback())    {        case(osg::Camera::FRAME_BUFFER_OBJECT): fw <<"FRAME_BUFFER_OBJECT"<<std::endl; break;        case(osg::Camera::PIXEL_BUFFER_RTT): fw <<"PIXEL_BUFFER_RTT"<<std::endl; break;        case(osg::Camera::PIXEL_BUFFER): fw <<"PIXEL_BUFFER"<<std::endl; break;        case(osg::Camera::FRAME_BUFFER): fw <<"FRAME_BUFFER"<<std::endl; break;        case(osg::Camera::SEPERATE_WINDOW): fw <<"SEPERATE_WINDOW"<<std::endl; break;    }    fw.indent()<<"drawBuffer "<<std::hex<<camera.getDrawBuffer()<<std::endl;    fw.indent()<<"readBuffer "<<std::hex<<camera.getReadBuffer()<<std::endl;    const osg::Camera::BufferAttachmentMap& bam = camera.getBufferAttachmentMap();    if (!bam.empty())    {        for(osg::Camera::BufferAttachmentMap::const_iterator itr=bam.begin();            itr!=bam.end();            ++itr)        {            const osg::Camera::Attachment& attachment = itr->second;            fw.indent()<<"bufferComponent "<<Camera_getBufferComponentStr(itr->first)<<" {"<<std::endl;            fw.moveIn();            fw.indent()<<"internalFormat "<<attachment._internalFormat<<std::endl;            if (attachment._texture.valid())            {                fw.writeObject(*attachment._texture.get());            }            fw.indent()<<"level "<<attachment._level<<std::endl;            fw.indent()<<"face "<<attachment._face<<std::endl;            fw.indent()<<"mipMapGeneration "<<(attachment._mipMapGeneration ? "TRUE" : "FALSE")<<std::endl;            fw.moveOut();            fw.indent()<<"}"<<std::endl;        }    }    return true;}bool Camera_matchBufferComponentStr(const char* str,Camera::BufferComponent& buffer){    if      (strcmp(str,"DEPTH_BUFFER")==0)             buffer = osg::Camera::DEPTH_BUFFER;    else if (strcmp(str,"STENCIL_BUFFER")==0)           buffer = osg::Camera::STENCIL_BUFFER;    else if (strcmp(str,"COLOR_BUFFER")==0)             buffer = osg::Camera::COLOR_BUFFER;    else if (strcmp(str,"COLOR_BUFFER0")==0)            buffer = osg::Camera::COLOR_BUFFER0;    else if (strcmp(str,"COLOR_BUFFER1")==0)            buffer = osg::Camera::COLOR_BUFFER1;    else if (strcmp(str,"COLOR_BUFFER2")==0)            buffer = osg::Camera::COLOR_BUFFER2;    else if (strcmp(str,"COLOR_BUFFER3")==0)            buffer = osg::Camera::COLOR_BUFFER3;    else if (strcmp(str,"COLOR_BUFFER4")==0)            buffer = osg::Camera::COLOR_BUFFER4;    else if (strcmp(str,"COLOR_BUFFER5")==0)            buffer = osg::Camera::COLOR_BUFFER5;    else if (strcmp(str,"COLOR_BUFFER6")==0)            buffer = osg::Camera::COLOR_BUFFER6;    else if (strcmp(str,"COLOR_BUFFER7")==0)            buffer = osg::Camera::COLOR_BUFFER7;    else if (strcmp(str,"COLOR_BUFFER8")==0)            buffer = osg::Camera::COLOR_BUFFER8;    else if (strcmp(str,"COLOR_BUFFER9")==0)            buffer = osg::Camera::COLOR_BUFFER9;    else if (strcmp(str,"COLOR_BUFFER10")==0)           buffer = osg::Camera::COLOR_BUFFER10;    else if (strcmp(str,"COLOR_BUFFER11")==0)           buffer = osg::Camera::COLOR_BUFFER11;    else if (strcmp(str,"COLOR_BUFFER12")==0)           buffer = osg::Camera::COLOR_BUFFER12;    else if (strcmp(str,"COLOR_BUFFER13")==0)           buffer = osg::Camera::COLOR_BUFFER13;    else if (strcmp(str,"COLOR_BUFFER14")==0)           buffer = osg::Camera::COLOR_BUFFER14;    else if (strcmp(str,"COLOR_BUFFER15")==0)           buffer = osg::Camera::COLOR_BUFFER15;    else return false;    return true;}const char* Camera_getBufferComponentStr(Camera::BufferComponent buffer){    switch(buffer)    {        case (osg::Camera::DEPTH_BUFFER)             : return "DEPTH_BUFFER";        case (osg::Camera::STENCIL_BUFFER)           : return "STENCIL_BUFFER";        case (osg::Camera::COLOR_BUFFER)             : return "COLOR_BUFFER";        case (osg::Camera::COLOR_BUFFER0)            : return "COLOR_BUFFER0";        case (osg::Camera::COLOR_BUFFER1)            : return "COLOR_BUFFER1";        case (osg::Camera::COLOR_BUFFER2)            : return "COLOR_BUFFER2";        case (osg::Camera::COLOR_BUFFER3)            : return "COLOR_BUFFER3";        case (osg::Camera::COLOR_BUFFER4)            : return "COLOR_BUFFER4";        case (osg::Camera::COLOR_BUFFER5)            : return "COLOR_BUFFER5";        case (osg::Camera::COLOR_BUFFER6)            : return "COLOR_BUFFER6";        case (osg::Camera::COLOR_BUFFER7)            : return "COLOR_BUFFER7";        case (osg::Camera::COLOR_BUFFER8)            : return "COLOR_BUFFER8";        case (osg::Camera::COLOR_BUFFER9)            : return "COLOR_BUFFER9";        case (osg::Camera::COLOR_BUFFER10)           : return "COLOR_BUFFER10";        case (osg::Camera::COLOR_BUFFER11)           : return "COLOR_BUFFER11";        case (osg::Camera::COLOR_BUFFER12)           : return "COLOR_BUFFER12";        case (osg::Camera::COLOR_BUFFER13)           : return "COLOR_BUFFER13";        case (osg::Camera::COLOR_BUFFER14)           : return "COLOR_BUFFER14";        case (osg::Camera::COLOR_BUFFER15)           : return "COLOR_BUFFER15";        default                                      : return "UnknownBufferComponent";    }}

⌨️ 快捷键说明

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