diff --git a/src/osgPlugins/osg/CameraNode.cpp b/src/osgPlugins/osg/CameraNode.cpp index fbf43744c..6d5a306cb 100644 --- a/src/osgPlugins/osg/CameraNode.cpp +++ b/src/osgPlugins/osg/CameraNode.cpp @@ -15,6 +15,10 @@ using namespace osgDB; bool CameraNode_readLocalData(Object& obj, Input& fr); bool CameraNode_writeLocalData(const Object& obj, Output& fw); +bool CameraNode_matchBufferComponentStr(const char* str,CameraNode::BufferComponent& buffer); +const char* CameraNode_getBufferComponentStr(CameraNode::BufferComponent buffer); + + // register the read and write functions with the osgDB::Registry. RegisterDotOsgWrapperProxy g_CameraNodeProxy ( @@ -97,6 +101,111 @@ bool CameraNode_readLocalData(Object& obj, Input& fr) iteratorAdvanced = true; } + if (fr.matchSequence("renderTargetImplementation %w")) + { + osg::CameraNode::RenderTargetImplementation implementation = osg::CameraNode::FRAME_BUFFER; + + if (fr[1].matchWord("FRAME_BUFFER_OBJECT")) implementation = osg::CameraNode::FRAME_BUFFER_OBJECT; + else if (fr[1].matchWord("PIXEL_BUFFER_RTT")) implementation = osg::CameraNode::PIXEL_BUFFER_RTT; + else if (fr[1].matchWord("PIXEL_BUFFER")) implementation = osg::CameraNode::PIXEL_BUFFER; + else if (fr[1].matchWord("FRAME_BUFFER")) implementation = osg::CameraNode::FRAME_BUFFER; + else if (fr[1].matchWord("SEPERATE_WINDOW")) implementation = osg::CameraNode::SEPERATE_WINDOW; + + camera.setRenderTargetImplementation(implementation); + + fr += 2; + iteratorAdvanced = true; + } + + if (fr.matchSequence("renderTargetImplementation %w")) + { + osg::CameraNode::RenderTargetImplementation fallback = camera.getRenderTargetFallback(); + + if (fr[1].matchWord("FRAME_BUFFER_OBJECT")) fallback = osg::CameraNode::FRAME_BUFFER_OBJECT; + else if (fr[1].matchWord("PIXEL_BUFFER_RTT")) fallback = osg::CameraNode::PIXEL_BUFFER_RTT; + else if (fr[1].matchWord("PIXEL_BUFFER")) fallback = osg::CameraNode::PIXEL_BUFFER; + else if (fr[1].matchWord("FRAME_BUFFER")) fallback = osg::CameraNode::FRAME_BUFFER; + else if (fr[1].matchWord("SEPERATE_WINDOW")) fallback = osg::CameraNode::SEPERATE_WINDOW; + + camera.setRenderTargetImplementation(camera.getRenderTargetImplementation(), fallback); + + fr += 2; + iteratorAdvanced = true; + } + + + if (fr.matchSequence("bufferComponent %w {")) + { + int entry = fr[1].getNoNestedBrackets(); + + CameraNode::BufferComponent buffer; + CameraNode_matchBufferComponentStr(fr[1].getStr(),buffer); + + fr += 3; + + CameraNode::Attachment& attachment = camera.getBufferAttachmentMap()[buffer]; + + // read attachment data. + while (!fr.eof() && fr[0].getNoNestedBrackets()>entry) + { + bool localAdvance = false; + + if (fr.matchSequence("internalFormat %i")) + { + fr[1].getUInt(attachment._internalFormat); + fr += 2; + localAdvance = true; + } + + osg::ref_ptr attribute; + while((attribute=fr.readObject())!=NULL) + { + localAdvance = true; + + osg::Texture* texture = dynamic_cast(attribute.get()); + if (texture) attachment._texture = texture; + else + { + osg::Image* image = dynamic_cast(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; } @@ -136,5 +245,124 @@ bool CameraNode_writeLocalData(const Object& obj, Output& fw) case(osg::CameraNode::POST_RENDER): fw <<"POST_RENDER"<second; + fw.indent()<<"bufferComponent "<first)<<" {"<