Ejemplo n.º 1
0
Parser::Parser(string const &fName, Track *tr) {

    fileName = fName;

    checkFilePath(fileName);

    size_t sep = fileName.find_last_of("\\/");
    size_t dot = fileName.find_last_of(".");

    extension = fileName.substr(dot + 1);
    transform(extension.begin(), extension.end(), extension.begin(), ::tolower);
    tr->hasGlobalCoordinate = true;//value by default

    if (extension == "bones") {

        tr->clearData();
        tr->bones(fileName);
        if (tr->hasBoneList == true)
            tr->boneList->updateBoneChildrenName();
        tr->setJointOffsetRotation();
    }

    else if (extension == "nodes") {

        tr->clearData();
        tr->nodes(fileName);
        if (tr->hasBoneList == true)
            tr->boneList->updateBoneChildrenName();
        tr->setJointOffsetRotation();
    }

    else if (extension == "txt") {

        tr->clearData();
        tr->type = FLAT;
        tr->setFileName(fileName.substr(sep + 1, dot - sep - 1));

        FlatParser flatParser(fileName, tr);

        if (!tr->hasNodeList) {

            cout << "Warning (flat txt file parsing): you should load a nodelist before the data." << endl;
        }

        if (!tr->hasBoneList) {

            cout << "Warning (flat txt file parsing): you should load a bonelist before the data." << endl;
        }

        if (tr->hasNodeList && tr->nodeList->size() != tr->nOfNodes()) {

            cout << "Warning (FlatParser): the number of nodes in the data does not correponds with the number of nodes in the nodelist. You should load a corresponding nodelist before the data." << endl;
        }

        tr->position.SetValidParam();
        if (tr->hasRotation)
            tr->rotation.SetValidParam();
    }

    else if (extension == "v3d") {
        tr->clear();
        tr->init();
        tr->type = V3D;
        tr->setFileName(fileName.substr(sep + 1, dot - sep - 1));

        V3dParser v3dParser(fileName, tr);
        tr->position.SetValidParam();
        if (tr->hasRotation)
            tr->rotation.SetValidParam();

        tr->boneList->updateBoneChildrenName();
        tr->setJointOffsetRotation();
    }

    else if (extension == "c3d") {

        tr->clearData();
        tr->type = C3D;
        tr->setFileName(fileName.substr(sep + 1, dot - sep - 1));

        C3dParser c3dParser(fileName, tr);

        if (!tr->hasBoneList) {

            cout << "Warning (c3d file parsing): you should load a bonelist before the data." << endl;
        }

        tr->position.SetValidParam();
        if (tr->hasRotation)
            tr->rotation.SetValidParam();
    }

    else if (extension == "bvh") {
        tr->clear();
        tr->init();
        tr->type = BVH;
        tr->setFileName(fileName.substr(sep + 1, dot - sep - 1));

        BvhParser::load(fileName, tr, true, false);
        tr->position.SetValidParam();
        if (tr->hasRotation)
            tr->rotation.SetValidParam();
        tr->boneList->updateBoneChildrenName();
        tr->setJointOffsetRotation();

    }
    else if (extension == "cmp") {

        tr->type = CMP;
        tr->setFileName(fileName.substr(sep + 1, dot - sep - 1));

        CmpParser Parser;
        Parser.load(fileName, tr);
        tr->position.SetValidParam();
        if (tr->hasRotation)
            tr->rotation.SetValidParam();
        //        tr->setJointOffsetRotation(true);

    }
    else if (extension == "kin") {

        tr->clearData();
        tr->type = KIN;
        tr->setFileName(fileName.substr(sep + 1, dot - sep - 1));
        KinParser kinParser(fileName, tr);
        
        if (!tr->hasNodeList) {

            cout << "Warning (flat txt file parsing): you should load a nodelist before the data." << endl;
        }

        if (!tr->hasBoneList) {

            cout << "Warning (flat txt file parsing): you should load a bonelist before the data." << endl;
        }

        if (tr->hasNodeList && tr->nodeList->size() != tr->nOfNodes()) {

            cout << "Warning (FlatParser): the number of nodes in the data does not correponds with the number of nodes in the nodelist. You should load a corresponding nodelist before the data." << endl;
        }

        tr->position.SetValidParam();
        if (tr->hasRotation)
            tr->rotation.SetValidParam();        
        if (tr->hasBoneList == true)
            tr->boneList->updateBoneChildrenName();
        tr->setJointOffsetRotation();
        tr->setFrameRate(30);
    }

    else if (extension == "xml") {

        tr->type = XML;
        tr->setFileName(fileName.substr(sep + 1, dot - sep - 1));

        XmlParser xmlParser(fileName, tr);
        tr->position.SetValidParam();
        if (tr->hasRotation) {
            tr->rotation.SetValidParam();
            tr->setJointOffsetRotation();
        }
    }    

    else cout << "Invalid file format" << endl;
}
Ejemplo n.º 2
0
Parser::Parser( string const &fName, Track *tr ) {

    track = tr;
    fileName = fName;

#ifdef _WIN32
    fileName = checkFileName( fileName );
#endif

    //set trackName
    /*string shortFName;
    char* tmp = new char[fileName.size()+1];
    strncpy(tmp, fileName.c_str(),fileName.size());
    tmp[fileName.size()]=NULL;
    char* tmpName;
    _splitpath(tmp,NULL,NULL,tmpName,NULL);
    shortFName=string(tmpName);
    track->setTrackName(shortFName);*/

    size_t sep = fileName.find_last_of("\\/");
    size_t dot = fileName.find_last_of(".");    

    int previousSize = track->nOfNodes();
    extension = fileName.substr( dot + 1) ;
    transform( extension.begin(), extension.end(), extension.begin(), ::tolower );

    if( extension == "txt" ) {        

        track->setFileName( fileName.substr( sep + 1, dot-sep-1 ) );

        FlatParser flatParser( fileName,track );

        // Check validity of lists of bones and nodes
        if( track->nOfNodes() != previousSize && previousSize != 0 ) {

            // different number of
            // markers => different labels
            if( track->hasNodeList == true ) {

                track->hasNodeList = false;
                delete track->nodeList;
            }

            //different number of
            // markers => different skeleton
            if( track->hasBoneList == true ) {

                track->hasBoneList = false;
                delete track->boneList;
            }
        }
    }

    else if( extension == "v3d" ) {

        track->setFileName( fileName.substr( sep + 1, dot-sep-1 ) );

        V3dParser v3dParser( fileName, track );

        // Check validity of list of bones
        if( track->nOfNodes() != previousSize &&
            previousSize != 0 && track->hasBoneList == true ) {

                // different number of
                // markers => different skeleton
                track->hasBoneList = false;
                delete track->boneList;
        }
        tr->setJointOffsetRotation();
    }

    else if( extension == "c3d" ) {

        track->setFileName( fileName.substr( sep + 1, dot-sep-1 ) );

        C3dParser c3dParser( fileName, track );

        // Check validity of list of bones
        if( track->nOfNodes() != previousSize &&
            previousSize !=0 && track->hasBoneList == true ) {

                // different number of
                // markers => different skeleton
                track->hasBoneList = false;
                delete track->boneList;
        }
    }
    
    else if( extension == "bvh" ) {
        
        track->setFileName( fileName.substr( sep + 1, dot-sep-1 ) );
        
        BvhParser::load( fileName, track );
        
        // Check validity of list of bones
        if( track->nOfNodes() != previousSize &&
           previousSize !=0 && track->hasBoneList == true ) {
            
            // different number of
            // markers => different skeleton
            track->hasBoneList = false;
            delete track->boneList;
        }
        tr->setJointOffsetRotation();
    }
    else if( extension == "cmp" ) {
        
        track->setFileName( fileName.substr( sep + 1, dot-sep-1 ) );
        
        CmpParser Parser;
        Parser.load( fileName, track );
        
        // Check validity of list of bones
        if( track->nOfNodes() != previousSize &&
           previousSize !=0 && track->hasBoneList == true ) {
            
            // different number of
            // markers => different skeleton
            track->hasBoneList = false;
            delete track->boneList;
        }
//        tr->setJointOffsetRotation(true);
    }
    else if( extension == "kin" ) {
        
        track->setFileName( fileName.substr( sep + 1, dot-sep-1 ) );
        KinParser kinParser( fileName, track );
        // Check validity of lists of bones and nodes
        
        if( track->nOfNodes() != previousSize && previousSize != 0 ) {
            
            // different number of
            // markers => different labels
            if( track->hasNodeList == true ) {
                
                track->hasNodeList = false;
                delete track->nodeList;
            }
            
            //different number of
            // markers => different skeleton
            if( track->hasBoneList == true ) {
                
                track->hasBoneList = false;
                delete track->boneList;
            }
        }
         tr->setJointOffsetRotation();

    }

    else if( extension == "bones" ) {
        track->bones( fileName );
        tr->setJointOffsetRotation();
    }

    else if( extension == "nodes" ) track->nodes( fileName );

    else cout << "Invalid file format" << endl;
}