void VRMLBodyLoaderImpl::readSurfaceNode(LinkInfo& iLink, VRMLProtoInstance* segmentShapeNode, const Affine3& T) { const string& typeName = segmentShapeNode->proto->protoName; if(isVerbose) putMessage(string("Surface node ") + segmentShapeNode->defName); iLink.isSurfaceNodeUsed = true; // check if another Surface node does not appear in the subtree MFNode& visualNodes = get<MFNode>(segmentShapeNode->fields["visual"]); ProtoIdSet acceptableProtoIds; readJointSubNodes(iLink, visualNodes, acceptableProtoIds, T); MFNode& collisionNodes = get<MFNode>(segmentShapeNode->fields["collision"]); readJointSubNodes(iLink, collisionNodes, acceptableProtoIds, T); SgGroup* group; SgPosTransform* transform = 0; if(T.isApprox(Affine3::Identity())){ group = iLink.collisionShape; } else { transform = new SgPosTransform(T); group = transform; } for(size_t i=0; i < collisionNodes.size(); ++i){ SgNodePtr node = sgConverter.convert(collisionNodes[i]); if(node){ group->addChild(node); } } if(transform && !transform->empty()){ iLink.collisionShape->addChild(transform); } }
void SceneGraphViewImpl::createGraph(SgvItem* item, SgNode* node) { SgvItem* oldParent = parentItem; parentItem = item; list<SgvItem*> children; for(int i=0; i<item->childCount(); i++) children.push_back((SgvItem*)item->child(i)); SgGroup* group = dynamic_cast<SgGroup*>(node); if(group){ for(SgGroup::const_iterator p = group->begin(); p != group->end(); ++p){ SgvItem* item_ = findItem(parentItem, (*p).get()); if(item_){ createGraph(item_, (*p).get()); children.remove(item_); }else{ (*p)->accept(*this); } } for(list<SgvItem*>::iterator it = children.begin(); it != children.end(); it++){ removeItem(*it); } } parentItem = oldParent; }
SgGroup::SgGroup(const SgGroup& org, SgCloneMap& cloneMap) : SgNode(org) { children.reserve(org.numChildren()); for(const_iterator p = org.begin(); p != org.end(); ++p){ addChild(cloneMap.getClone<SgNode>(p->get()), false); } isBboxCacheValid = true; bboxCache = org.bboxCache; }
SgGroup::SgGroup(const SgGroup& org) : SgNode(org) { children.reserve(org.numChildren()); // shallow copy for(const_iterator p = org.begin(); p != org.end(); ++p){ addChild(*p, false); } isBboxCacheValid = true; bboxCache = org.bboxCache; }