OSGCopy例子解析

例子演示了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,打印出拷贝的内容信息。

你可能感兴趣的:(OSGCopy例子解析)