void deepCloneAttachments( OSG::AttachmentContainer const *src, OSG::AttachmentContainer *dst, const std::vector<const OSG::ReflexiveContainerType *> &shareTypes, const std::vector<const OSG::ReflexiveContainerType *> &ignoreTypes, const std::vector<OSG::UInt16> &shareGroupIds, const std::vector<OSG::UInt16> &ignoreGroupIds) { #if 0 const FieldContainerType &type = dst->getType(); const FieldDescriptionBase *fDesc = type.getFieldDesc("attachments"); const UInt32 fieldId = fDesc->getFieldId(); const Field *srcField = src->getField("attachments"); fDesc->cloneValuesV(srcField, fieldId, dst, shareTypes, ignoreTypes, shareGroupIds, ignoreGroupIds); #else const SFAttachmentPtrMap *pAttMap = src->getSFAttachments(); AttachmentMap::const_iterator mapIt = pAttMap->getValue().begin(); AttachmentMap::const_iterator mapEnd = pAttMap->getValue().end(); for(; mapIt != mapEnd; ++mapIt) { AttachmentUnrecPtr att = mapIt->second; UInt16 uiBinding = UInt16(mapIt->first & 0x0000FFFF ); if(att != NULL) { const FieldContainerType &attType = att->getType(); // test if att type should NOT be ignored if(!TypePredicates::typeInGroupIds (ignoreGroupIds.begin(), ignoreGroupIds.end(), attType ) && !TypePredicates::typeDerivedFrom(ignoreTypes.begin(), ignoreTypes.end(), attType ) ) { // test if att should cloned if(!TypePredicates::typeInGroupIds (shareGroupIds.begin(), shareGroupIds.end(), attType ) && !TypePredicates::typeDerivedFrom(shareTypes.begin(), shareTypes.end(), attType ) ) { att = dynamic_pointer_cast<Attachment>( OSG::deepClone(att, shareTypes, ignoreTypes, shareGroupIds, ignoreGroupIds)); } } } dst->addAttachment(att, uiBinding); } #endif }
void EditSFieldHandle<SFAttachmentPtrMap>::cloneValues( GetFieldHandlePtr pSrc, const TypePtrVector &shareTypes, const TypePtrVector &ignoreTypes, const TypeIdVector &shareGroupIds, const TypeIdVector &ignoreGroupIds) const { SFAttachmentPtrMap::GetHandlePtr pGetHandle = boost::dynamic_pointer_cast< SFAttachmentPtrMap::GetHandle>(pSrc); if(pGetHandle == NULL || pGetHandle->isValid() == false) return; const SFAttachmentPtrMap &pAttMap = **pGetHandle; AttachmentMap::const_iterator mapIt = pAttMap.getValue().begin(); AttachmentMap::const_iterator mapEnd = pAttMap.getValue().end(); for(; mapIt != mapEnd; ++mapIt) { AttachmentUnrecPtr att = mapIt->second; UInt16 uiBinding = UInt16(mapIt->first & 0x0000FFFF ); if(att != NULL) { const FieldContainerType &attType = att->getType(); // test if att type should NOT be ignored if(!TypePredicates::typeInGroupIds (ignoreGroupIds.begin(), ignoreGroupIds.end(), attType ) && !TypePredicates::typeDerivedFrom(ignoreTypes.begin(), ignoreTypes.end(), attType ) ) { // test if att should cloned if(!TypePredicates::typeInGroupIds (shareGroupIds.begin(), shareGroupIds.end(), attType ) && !TypePredicates::typeDerivedFrom(shareTypes.begin(), shareTypes.end(), attType ) ) { att = dynamic_pointer_cast<Attachment>( OSG::deepClone(att, shareTypes, ignoreTypes, shareGroupIds, ignoreGroupIds)); } } } if(_fAddMethod) { _fAddMethod(att, uiBinding); } } }