/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2005 Robert Osfield * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ #include #include #include #include #include #include #include #include using namespace osg; #define COPY_OP( TYPE, FLAG ) \ TYPE* CopyOp::operator() (const TYPE* obj) const \ { \ if (obj && _flags&FLAG) \ return dynamic_cast( obj->clone(*this) ); \ else \ return const_cast(obj); \ } COPY_OP( Object, DEEP_COPY_OBJECTS ); COPY_OP( Node, DEEP_COPY_NODES ); COPY_OP( Drawable, DEEP_COPY_DRAWABLES ); COPY_OP( StateSet, DEEP_COPY_STATESETS ); COPY_OP( Texture, DEEP_COPY_TEXTURES ); COPY_OP( Image, DEEP_COPY_IMAGES ); COPY_OP( Array, DEEP_COPY_DRAWABLES ); COPY_OP( PrimitiveSet, DEEP_COPY_PRIMITIVES ); COPY_OP( Shape, DEEP_COPY_SHAPES ); COPY_OP( Uniform, DEEP_COPY_UNIFORMS ); Referenced* CopyOp::operator() (const Referenced* ref) const { return const_cast(ref); } StateAttribute* CopyOp::operator() (const StateAttribute* attr) const { if (attr && _flags&DEEP_COPY_STATEATTRIBUTES) { const Texture* textbase = dynamic_cast(attr); if (textbase) { return operator()(textbase); } else { return dynamic_cast(attr->clone(*this)); } } else return const_cast(attr); }