osgDB.ObjectWrapperAssociate是一个辅助类,用于将对象包装在一个包装器中,然后将包装器与一个对象类型相关联,以允许在读取和写入OSG二进制格式数据时存储和读取该类型的对象。
在OpenSceneGraph中,许多类都使用了该类来支持读写二进制格式。您也可以使用该类来支持自己的类的读写。
以下是一些常用的公共成员函数:
static bool wrapObject(osgDB::ObjectWrapper &wrapper, const T &obj)
:将指定类型的对象包装在一个ObjectWrapper中。其中,T是对象类型。static bool writeToFile(const std::string &filename, const T &obj, const osgDB::ReaderWriter::Options *options = nullptr)
:将对象写入二进制文件。static bool readFile(const std::string &filename, T &obj, const osgDB::ReaderWriter::Options *options = nullptr)
:从二进制文件中读取对象并将其存储在obj中。#include <osgDB/ObjectWrapperAssociate>
#include <osgDB/Registry>
#include <osgDB/WriteFile>
#include <osgDB/ReadFile>
#include <iostream>
// 定义一个简单的测试类
class TestClass
{
public:
TestClass() : m_value(0) {}
TestClass(int value) : m_value(value) {}
int getValue() const { return m_value; }
void setValue(int value) { m_value = value; }
private:
int m_value;
};
// 将TestClass包装成ObjectWrapper
namespace osgDB
{
template<> struct ObjectWrapper<TestClass> : public ObjectWrapperTemplate<TestClass>
{
ObjectWrapper() { addMember("value", &TestClass::getValue, &TestClass::setValue); }
virtual const char* className() const { return "TestClass"; }
};
}
// ObjectWrapperAssociate需要使用的函数
bool wrapTestClass(osgDB::ObjectWrapper &wrapper, const TestClass &obj)
{
// 调用ObjectWrapperAssociate的默认函数wrapObject,参数是ObjectWrapper和TestClass类型对象的引用
return osgDB::ObjectWrapperAssociate::wrapObject(wrapper, obj);
}
// 待写入二进制文件的数据
TestClass data(123);
int main()
{
// 将TestClass类型与其包装器相关联
osgDB::Registry::instance()->getObjectWrapperManager()->addWrapperType<TestClass>(&wrapTestClass);
// 写入二进制文件
osgDB::writeNodeFile(data, "test.bin");
// 读取二进制文件
TestClass data2;
osgDB::readNodeFile("test.bin", data2);
// 输出读取的数据
std::cout << "data2.value: " << data2.getValue() << std::endl;
return 0;
}
#include <osgDB/ObjectWrapper>
#include <osgDB/ObjectWrapperAssociate>
#include <osgDB/Registry>
#include <osgDB/ReadFile>
#include <osg/Node>
#include <osg/Group>
#include <iostream>
// 定义一个简单的节点类
class MyNode : public osg::Group
{
public:
MyNode() {}
MyNode(int value) : m_value(value) {}
int getValue() const { return m_value; }
void setValue(int value) { m_value = value; }
private:
int m_value;
};
// 将MyNode包装成ObjectWrapper
namespace osgDB
{
template<> struct ObjectWrapper<MyNode> : public NodesWrapper<MyNode>
{
ObjectWrapper() { addMember("value", &MyNode::getValue, &MyNode::setValue); }
virtual const char* className() const { return "MyNode"; }
};
}
// ObjectWrapperAssociate需要使用的函数
bool wrapMyNode(osgDB::ObjectWrapper &wrapper, const MyNode &obj)
{
// 调用ObjectWrapperAssociate的默认函数wrapObject,参数是ObjectWrapper和MyNode类型对象的引用
return osgDB::ObjectWrapperAssociate::wrapObject(wrapper, obj);
}
int main(int argc, char **argv)
{
osg::ArgumentParser arguments(&argc, argv);
// 将MyNode类型与其包装器相关联
osgDB::Registry::instance()->getObjectWrapperManager()->addWrapperType<MyNode>(&wrapMyNode);
// 读取包含MyNode的场景图
osg::ref_ptr<osg::Node> loadedModel = osgDB::readRefNodeFiles(arguments);
// 查找MyNode节点并输出
osg::NodeVisitor nv;
nv.setVisitorType(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN);
nv.setTraversalMask(osg::NodeVisitor::ALL_CHILDREN_BITS);
osg::ref_ptr<osg::Node> foundNode = loadedModel->accept(nv);
if (foundNode.valid())
{
MyNode *myNode = dynamic_cast<MyNode*>(foundNode.get());
if (myNode)
{
std::cout << "myNode.value: " << myNode->getValue() << std::endl;
}
else
{
std::cout << "Not a MyNode." << std::endl;
}
}
else
{
std::cout << "MyNode not found." << std::endl;
}
return 0;
}