// Mike Weiblen 2006-05-14 #include "osg/Uniform" #include "osg/io_utils" #include "osg/Notify" #include "osgDB/Registry" #include "osgDB/Input" #include "osgDB/Output" #include "Matrix.h" using namespace osg; using namespace osgDB; using namespace std; // reuse from Geometry.cpp bool Array_writeLocalData(const Array& array,Output& fw); Array* Array_readLocalData(Input& fr); // forward declare functions to use later. bool Uniform_readLocalData(Object& obj, Input& fr); bool Uniform_writeLocalData(const Object& obj, Output& fw); // register the read and write functions with the osgDB::Registry. RegisterDotOsgWrapperProxy g_UniformProxy ( new osg::Uniform, "Uniform", "Object Uniform", &Uniform_readLocalData, &Uniform_writeLocalData ); bool Uniform_readLocalData(Object& obj, Input& fr) { bool iteratorAdvanced = false; Uniform& uniform = static_cast(obj); if (fr[0].matchWord("type")) { // post-May 2006 format (OSG versions > 1.0) uniform.setType( Uniform::getTypeId( fr[1].getStr() ) ); unsigned int numElements; fr[2].getUInt(numElements); uniform.setNumElements( numElements ); fr+=3; iteratorAdvanced = true; Array* data = Array_readLocalData(fr); uniform.setArray( dynamic_cast(data) ); uniform.setArray( dynamic_cast(data) ); } #if 1 //[ // Deprecated; for backwards compatibility only. // when can we safely delete this code, I wonder... else { // pre-May 2006 format (OSG versions <= 1.0) uniform.setType( Uniform::getTypeId(fr[0].getStr()) ); fr+=1; iteratorAdvanced = true; switch( Uniform::getGlApiType(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::FLOAT_MAT2): { osg::Matrix2 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::FLOAT_MAT3): { osg::Matrix3 value; if (fr[0].getFloat(value[0]) && fr[1].getFloat(value[1]) && fr[2].getFloat(value[2]) && fr[3].getFloat(value[3]) && fr[4].getFloat(value[4]) && fr[5].getFloat(value[5]) && fr[6].getFloat(value[6]) && fr[7].getFloat(value[7]) && fr[8].getFloat(value[8])) { uniform.set(value); fr+=9; iteratorAdvanced = true; } break; } case(osg::Uniform::FLOAT_MAT4): { Matrix value; if( readMatrix(value,fr) ) { uniform.set(value); iteratorAdvanced = true; } break; } default: break; } } #endif //] return iteratorAdvanced; } bool Uniform_writeLocalData(const Object& obj,Output& fw) { const Uniform& uniform = static_cast(obj); // post-May 2006 format (OSG versions > 1.0) fw.indent() << "type " << Uniform::getTypename( uniform.getType() ) << " " << uniform.getNumElements() << " "; if( uniform.getFloatArray() ) Array_writeLocalData( *uniform.getFloatArray(), fw ); if( uniform.getIntArray() ) Array_writeLocalData( *uniform.getIntArray(), fw ); return true; }