📄 uniform.cpp
字号:
// 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.cppbool 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<Uniform&>(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<FloatArray*>(data) ); uniform.setArray( dynamic_cast<IntArray*>(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 //] static ref_ptr<Uniform::Callback> s_callback = new osg::Uniform::Callback; while (fr.matchSequence("UpdateCallback {")) { int entry = fr[0].getNoNestedBrackets(); fr += 2; Uniform::Callback* callback = dynamic_cast<Uniform::Callback*>(fr.readObjectOfType(*s_callback)); if (callback) { uniform.setUpdateCallback(callback); } iteratorAdvanced = true; } while (fr.matchSequence("EventCallback {")) { int entry = fr[0].getNoNestedBrackets(); fr += 2; Uniform::Callback* callback = dynamic_cast<Uniform::Callback*>(fr.readObjectOfType(*s_callback)); if (callback) { uniform.setEventCallback(callback); } iteratorAdvanced = true; } return iteratorAdvanced;}bool Uniform_writeLocalData(const Object& obj,Output& fw){ const Uniform& uniform = static_cast<const Uniform&>(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 ); if (uniform.getUpdateCallback()) { fw.indent() << "UpdateCallback {" << std::endl; fw.moveIn(); fw.writeObject(*uniform.getUpdateCallback()); fw.moveOut(); fw.indent() << "}" << std::endl; } if (uniform.getEventCallback()) { fw.indent() << "EventCallback {" << std::endl; fw.moveIn(); fw.writeObject(*uniform.getEventCallback()); fw.moveOut(); fw.indent() << "}" << std::endl; } return true;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -