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,打印出拷贝的内容信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值