#include #include #include #include #include #include #include "Matrix.h" using namespace osg; using namespace osgDB; // forward declare functions to use later. 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 ( new osg::CameraNode, "CameraNode", "Object Node Transform CameraNode Group", &CameraNode_readLocalData, &CameraNode_writeLocalData, DotOsgWrapper::READ_AND_WRITE ); bool CameraNode_readLocalData(Object& obj, Input& fr) { bool iteratorAdvanced = false; CameraNode& camera = static_cast(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 attribute; while((attribute=fr.readStateAttribute())!=NULL) { osg::Viewport* viewport = dynamic_cast(attribute.get()); if (viewport) camera.setViewport(viewport); else { osg::ColorMask* colormask = dynamic_cast(attribute.get()); camera.setColorMask(colormask); } } if (fr.matchSequence("transformOrder %w")) { if (fr[1].matchWord("PRE_MULTIPLY")) camera.setTransformOrder(osg::CameraNode::PRE_MULTIPLY); else if (fr[1].matchWord("POST_MULTIPLY")) camera.setTransformOrder(osg::CameraNode::POST_MULTIPLY); // the following are for backwards compatibility. else if (fr[1].matchWord("PRE_MULTIPLE")) camera.setTransformOrder(osg::CameraNode::PRE_MULTIPLY); else if (fr[1].matchWord("POST_MULTIPLE")) camera.setTransformOrder(osg::CameraNode::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::CameraNode::PRE_RENDER); else if (fr[1].matchWord("NESTED_RENDER")) camera.setRenderOrder(osg::CameraNode::NESTED_RENDER); else if (fr[1].matchWord("POST_RENDER")) camera.setRenderOrder(osg::CameraNode::POST_RENDER); fr += 2; 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")) { // 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 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; } bool CameraNode_writeLocalData(const Object& obj, Output& fw) { const CameraNode& camera = static_cast(obj); fw.indent()<<"clearColor "<second; fw.indent()<<"bufferComponent "<first)<<" {"<