Refactored osgUtil::ShaderGen to use #pragma(tic) shader composition.

This commit is contained in:
Robert Osfield
2018-03-14 08:22:45 +00:00
parent 009580676f
commit 4447190dd6
5 changed files with 164 additions and 418 deletions

View File

@@ -10,6 +10,7 @@
*/
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgUtil/ShaderGen>
#include <osgViewer/Viewer>
@@ -26,31 +27,6 @@
#include <iostream>
class ShaderGenReadFileCallback : public osgDB::Registry::ReadFileCallback
{
public:
ShaderGenReadFileCallback()
{
}
virtual osgDB::ReaderWriter::ReadResult readNode(const std::string& filename, const osgDB::ReaderWriter::Options* options)
{
osgDB::ReaderWriter::ReadResult result = osgDB::Registry::ReadFileCallback::readNode(filename, options);
if (osg::Node *node = result.getNode())
{
_visitor.reset();
node->accept(_visitor);
}
return result;
}
void setRootStateSet(osg::StateSet *stateSet) { _visitor.setRootStateSet(stateSet); }
osg::StateSet *getRootStateSet() const { return _visitor.getRootStateSet(); }
protected:
osgUtil::ShaderGenVisitor _visitor;
};
int main(int argc, char** argv)
{
@@ -64,6 +40,8 @@ int main(int argc, char** argv)
osgViewer::Viewer viewer(arguments);
unsigned int helpType = 0;
if ((helpType = arguments.readHelpType()))
{
@@ -134,11 +112,10 @@ int main(int argc, char** argv)
// add the screen capture handler
viewer.addEventHandler(new osgViewer::ScreenCaptureHandler);
// Register shader generator callback
ShaderGenReadFileCallback *readFileCallback = new ShaderGenReadFileCallback;
// All read nodes will inherit root state set.
readFileCallback->setRootStateSet(viewer.getCamera()->getStateSet());
osgDB::Registry::instance()->setReadFileCallback(readFileCallback);
std::string outputFilename;
if (arguments.read("-o", outputFilename)) {}
// load the data
osg::ref_ptr<osg::Node> loadedModel = osgDB::readRefNodeFiles(arguments);
@@ -148,6 +125,20 @@ int main(int argc, char** argv)
return 1;
}
// run the shadergen on the loaded scene graph, and assign the uber shader
osgUtil::ShaderGenVisitor shadergen;
shadergen.assignUberProgram(viewer.getCamera()->getStateSet());
//shadergen.assignUberProgram(loadedModel->getOrCreateStateSet());
loadedModel->accept(shadergen);
if (!outputFilename.empty())
{
osgDB::writeNodeFile(*loadedModel, outputFilename);
osgDB::writeObjectFile(*(viewer.getCamera()->getStateSet()),"rootStateSet.osgt");
return 0;
}
// any option left unread are converted into errors to write out later.
arguments.reportRemainingOptionsAsUnrecognized();