📄 shader.cpp
字号:
#include "osg/Shader"#include "osg/Notify"#include <iostream>#include <sstream>#include "osgDB/Registry"#include "osgDB/Input"#include "osgDB/Output"#include "osgDB/FileUtils"#include "osgDB/WriteFile"using namespace osg;using namespace osgDB;using namespace std;// forward declare functions to use later.bool Shader_readLocalData(Object& obj, Input& fr);bool Shader_writeLocalData(const Object& obj, Output& fw);// register the read and write functions with the osgDB::Registry.RegisterDotOsgWrapperProxy g_ShaderProxy( new osg::Shader, "Shader", "Object Shader", &Shader_readLocalData, &Shader_writeLocalData);bool Shader_readLocalData(Object& obj, Input& fr){ bool iteratorAdvanced = false; Shader& shader = static_cast<Shader&>(obj); if (fr.matchSequence("type %w")) { shader.setType( Shader::getTypeId(fr[1].getStr()) ); fr+=2; iteratorAdvanced = true; } if (fr.matchSequence("file %w") || fr.matchSequence("file %s") ) { std::string fileName = osgDB::findDataFile(fr[1].getStr()); if (!fileName.empty()) { shader.loadShaderSourceFromFile( fileName.c_str() ); } else { osg::notify(osg::NOTICE)<<"Warning: could not find shader file \""<<fr[1].getStr()<<"\""<<std::endl; } fr += 2; iteratorAdvanced = true; } if (fr.matchSequence("code {")) { std::string code; fr += 2; iteratorAdvanced = true; int entry = fr[0].getNoNestedBrackets(); while (!fr.eof() && fr[0].getNoNestedBrackets() >= entry) { if (fr[0].getStr()) { code.append(std::string(fr[0].getStr())); code += '\n' ; } ++fr; } shader.setShaderSource(code.c_str()); } return iteratorAdvanced;}bool Shader_writeLocalData(const Object& obj,Output& fw){ const Shader& shader = static_cast<const Shader&>(obj); fw.indent() << "type " << shader.getTypename() << std::endl; // osg::notify(osg::NOTICE)<<"fw.getOutputShaderFiles()="<<fw.getOutputShaderFiles()<<std::endl; // check whenever output to shader files is requested if (fw.getOutputShaderFiles()) { std::string fileName = shader.getFileName(); if (fileName.empty()) { fileName = fw.getShaderFileNameForOutput(); } osgDB::writeShaderFile(shader, fileName); if (!fileName.empty()) { fw.indent() << "file "<<fw.wrapString(fw.getFileNameForOutput(fileName))<< std::endl; } } else // no need to write shaders to external files, hence embed it { // split source text into individual lines std::vector<std::string> lines; std::istringstream iss(shader.getShaderSource()); std::string line; while (std::getline(iss, line)) { lines.push_back(line); } fw.indent() << "code {\n"; fw.moveIn(); std::vector<std::string>::const_iterator j; for (j=lines.begin(); j!=lines.end(); ++j) { fw.indent() << fw.wrapString(*j) << "\n"; } fw.moveOut(); fw.indent() << "}\n"; } return true;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -