例子演示了osg中的拷贝,深拷贝和浅拷贝。
浅拷贝只拷贝指针,指向同一个内容。
深拷贝,指针和所指向的内容都拷贝。
拷贝的全部内容都在CopyOp中,看看这个类吧:
enum Options
{
SHALLOW_COPY = 0,
DEEP_COPY_OBJECTS = 1<<0,
DEEP_COPY_NODES = 1<<1,
DEEP_COPY_DRAWABLES = 1<<2,
DEEP_COPY_STATESETS = 1<<3,
DEEP_COPY_STATEATTRIBUTES = 1<<4,
DEEP_COPY_TEXTURES = 1<<5,
DEEP_COPY_IMAGES = 1<<6,
DEEP_COPY_ARRAYS = 1<<7,
DEEP_COPY_PRIMITIVES = 1<<8,
DEEP_COPY_SHAPES = 1<<9,
DEEP_COPY_UNIFORMS = 1<<10,
DEEP_COPY_CALLBACKS = 1<<11,
DEEP_COPY_USERDATA = 1<<12,
DEEP_COPY_ALL =
0x7FFFFFFF
};
定义了一个枚举,可以进行浅拷贝,以上内容的深拷贝。
来看看它是怎么实现拷贝的,
定义了很多的operator()方法,CopyFlags _flags;代表着CopyOp可以拷贝的内容。
在CopyOp.cpp文件中定义了一个宏
#define COPY_OP( TYPE, FLAG ) \
TYPE* CopyOp::operator() (const TYPE* obj) const \
{ \
if
(obj && _flags&FLAG) \
return osg::clone(obj, *this); \
else \
return
const_cast<TYPE*>(obj); \
}
用于类型的拷贝,下面还分别定义了Referenced、StateAttribute、NodeCallback的拷贝,
但是实现的内容大体相同。看看这个宏吧:
如果参数有效,并且CopyOp可以拷贝,则对指定的类型进行osg::clone(obj, *this);操作,否则直接返
回类型的指针。
这里说一下const_cast,就是一个类型的转换,但返回的内容不受const限制。
来看看这个osg::clone(obj, *this);
通过这个实现的深拷贝,它的实现在osg::ref_ptr<osg::Object> obj = t->clone(copyop);这句话,这
句话直接指向了指定类型的clone方法。以Node为例,看看Node干了,现了深拷贝。
回到例子中,这个例子就没有其他可以过多说明的了,MyCopyOp继承CopyOp,打印出拷贝的内容信息。
浅拷贝只拷贝指针,指向同一个内容。
深拷贝,指针和所指向的内容都拷贝。
拷贝的全部内容都在CopyOp中,看看这个类吧:
enum Options
{
SHALLOW_COPY = 0,
DEEP_COPY_OBJECTS = 1<<0,
DEEP_COPY_NODES = 1<<1,
DEEP_COPY_DRAWABLES = 1<<2,
DEEP_COPY_STATESETS = 1<<3,
DEEP_COPY_STATEATTRIBUTES = 1<<4,
DEEP_COPY_TEXTURES = 1<<5,
DEEP_COPY_IMAGES = 1<<6,
DEEP_COPY_ARRAYS = 1<<7,
DEEP_COPY_PRIMITIVES = 1<<8,
DEEP_COPY_SHAPES = 1<<9,
DEEP_COPY_UNIFORMS = 1<<10,
DEEP_COPY_CALLBACKS = 1<<11,
DEEP_COPY_USERDATA = 1<<12,
DEEP_COPY_ALL =
0x7FFFFFFF
};
定义了一个枚举,可以进行浅拷贝,以上内容的深拷贝。
来看看它是怎么实现拷贝的,
定义了很多的operator()方法,CopyFlags _flags;代表着CopyOp可以拷贝的内容。
在CopyOp.cpp文件中定义了一个宏
#define COPY_OP( TYPE, FLAG ) \
TYPE* CopyOp::operator() (const TYPE* obj) const \
{ \
if
(obj && _flags&FLAG) \
return osg::clone(obj, *this); \
else \
return
const_cast<TYPE*>(obj); \
}
用于类型的拷贝,下面还分别定义了Referenced、StateAttribute、NodeCallback的拷贝,
但是实现的内容大体相同。看看这个宏吧:
如果参数有效,并且CopyOp可以拷贝,则对指定的类型进行osg::clone(obj, *this);操作,否则直接返
回类型的指针。
这里说一下const_cast,就是一个类型的转换,但返回的内容不受const限制。
来看看这个osg::clone(obj, *this);
通过这个实现的深拷贝,它的实现在osg::ref_ptr<osg::Object> obj = t->clone(copyop);这句话,这
句话直接指向了指定类型的clone方法。以Node为例,看看Node干了,现了深拷贝。
回到例子中,这个例子就没有其他可以过多说明的了,MyCopyOp继承CopyOp,打印出拷贝的内容信息。