关闭

OSGCopy例子解析

537人阅读 评论(0) 收藏 举报
分类:
例子演示了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,打印出拷贝的内容信息。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:224218次
    • 积分:3338
    • 等级:
    • 排名:第10514名
    • 原创:73篇
    • 转载:285篇
    • 译文:0篇
    • 评论:9条
    最新评论