From 59ec503fc9282de021541bc56d9a5f2118f0456e Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 18 Apr 2005 13:29:59 +0000 Subject: [PATCH] Added more complete support for writing out data of Uniforms --- src/osgPlugins/osg/Uniform.cpp | 336 ++++++++++++++++++++++++++++++++- 1 file changed, 327 insertions(+), 9 deletions(-) diff --git a/src/osgPlugins/osg/Uniform.cpp b/src/osgPlugins/osg/Uniform.cpp index 19e89e12d..132f965c5 100644 --- a/src/osgPlugins/osg/Uniform.cpp +++ b/src/osgPlugins/osg/Uniform.cpp @@ -1,4 +1,6 @@ #include "osg/Uniform" +#include "osg/io_utils" +#include "osg/Notify" #include "osgDB/Registry" #include "osgDB/Input" @@ -29,12 +31,6 @@ bool Uniform_readLocalData(Object& obj, Input& fr) Uniform& uniform = static_cast(obj); - if (fr.matchSequence("type %w")) - { - uniform.setType( Uniform::getTypeId(fr[1].getStr()) ); - fr+=2; - iteratorAdvanced = true; - } if (fr.matchSequence("name %s")) { @@ -45,6 +41,194 @@ bool Uniform_readLocalData(Object& obj, Input& fr) // TODO read uniform value based on type + if (fr.matchSequence("type %w")) + { + uniform.setType( Uniform::getTypeId(fr[1].getStr()) ); + fr+=2; + iteratorAdvanced = true; + } + + switch(uniform.getType()) + { + case(osg::Uniform::FLOAT): + { + float value; + if (fr[0].getFloat(value)) + { + uniform.set(value); + fr+=1; + iteratorAdvanced = true; + } + break; + } + case(osg::Uniform::FLOAT_VEC2): + { + osg::Vec2 value; + if (fr[0].getFloat(value[0]) && fr[1].getFloat(value[1])) + { + uniform.set(value); + fr+=2; + iteratorAdvanced = true; + } + break; + } + case(osg::Uniform::FLOAT_VEC3): + { + osg::Vec3 value; + if (fr[0].getFloat(value[0]) && fr[1].getFloat(value[1]) && fr[2].getFloat(value[2])) + { + uniform.set(value); + fr+=3; + iteratorAdvanced = true; + } + break; + } + case(osg::Uniform::FLOAT_VEC4): + { + osg::Vec4 value; + if (fr[0].getFloat(value[0]) && fr[1].getFloat(value[1]) && fr[2].getFloat(value[2]) && fr[3].getFloat(value[3])) + { + uniform.set(value); + fr+=4; + iteratorAdvanced = true; + } + break; + } + case(osg::Uniform::INT): + { + int value; + if (fr[0].getInt(value)) + { + uniform.set(value); + fr+=1; + iteratorAdvanced = true; + } + break; + } + case(osg::Uniform::INT_VEC2): + { + int value[2]; + if (fr[0].getInt(value[0]) && fr[1].getInt(value[1])) + { + uniform.set(value[0],value[1]); + fr+=2; + iteratorAdvanced = true; + } + break; + } + case(osg::Uniform::INT_VEC3): + { + int value[3]; + if (fr[0].getInt(value[0]) && fr[1].getInt(value[1]) && fr[2].getInt(value[2])) + { + uniform.set(value[0],value[1],value[2]); + fr+=3; + iteratorAdvanced = true; + } + break; + } + case(osg::Uniform::INT_VEC4): + { + int value[4]; + if (fr[0].getInt(value[0]) && fr[1].getInt(value[1]) && fr[2].getInt(value[2]) && fr[3].getInt(value[3])) + { + uniform.set(value[0],value[1],value[2],value[3]); + fr+=4; + iteratorAdvanced = true; + } + break; + } + case(osg::Uniform::BOOL): + { + int value; + if (fr[0].getInt(value)) + { + uniform.set(value!=0 ? true:false); + fr+=1; + iteratorAdvanced = true; + } + break; + } + case(osg::Uniform::BOOL_VEC2): + { + int value[2]; + if (fr[0].getInt(value[0]) && fr[1].getInt(value[1])) + { + uniform.set(value[0]!=0 ? true:false, value[1]!=0 ? true:false); + fr+=2; + iteratorAdvanced = true; + } + break; + } + case(osg::Uniform::BOOL_VEC3): + { + int value[3]; + if (fr[0].getInt(value[0]) && fr[1].getInt(value[1]) && fr[2].getInt(value[2])) + { + uniform.set(value[0]!=0 ? true:false, value[1]!=0 ? true:false, value[2]!=0 ? true:false); + fr+=3; + iteratorAdvanced = true; + } + break; + } + case(osg::Uniform::BOOL_VEC4): + { + int value[4]; + if (fr[0].getInt(value[0]) && fr[1].getInt(value[1]) && fr[2].getInt(value[2]) && fr[3].getInt(value[3])) + { + uniform.set(value[0]!=0 ? true:false, value[1]!=0 ? true:false, value[2]!=0 ? true:false, value[3]!=0 ? true:false); + fr+=4; + iteratorAdvanced = true; + } + break; + } + case(osg::Uniform::FLOAT_MAT2): + { + osg::notify(osg::WARN)<<"Warning : type not supported for reading."<(obj); - fw.indent() << "type " << Uniform::getTypename( uniform.getType() ) << std::endl; fw.indent() << "name "<< fw.wrapString(uniform.getName()) << std::endl; - // TODO write uniform value based on type - + fw.indent() << "type " << Uniform::getTypename( uniform.getType() ) << " "; + + switch(uniform.getType()) + { + case(osg::Uniform::FLOAT): + { + float value = 0.0f; + uniform.get(value); + fw << value; + break; + } + case(osg::Uniform::FLOAT_VEC2): + { + Vec2 value; + uniform.get(value); + fw << value; + break; + } + case(osg::Uniform::FLOAT_VEC3): + { + Vec3 value; + uniform.get(value); + fw << value; + break; + } + case(osg::Uniform::FLOAT_VEC4): + { + Vec4 value; + uniform.get(value); + fw << value; + break; + } + case(osg::Uniform::INT): + { + int value = 0; + uniform.get(value); + fw << value; + break; + } + case(osg::Uniform::INT_VEC2): + { + int value[2]; + uniform.get(value[0],value[1]); + fw << value[0]<<" "<