Exemplo n.º 1
0
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);
    }
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
}