コード例 #1
0
ファイル: ObjModel.cpp プロジェクト: viny93/JTI2.4-A2
ObjModel::ObjModel(std::string fileName)
{
        std::string dirName = fileName;
        if(dirName.rfind("/") != std::string::npos)
                dirName = dirName.substr(0, dirName.rfind("/"));
        if(dirName.rfind("\\") != std::string::npos)
                dirName = dirName.substr(0, dirName.rfind("\\"));
        if(fileName == dirName)
                dirName = "";


        std::ifstream pFile(fileName.c_str());



        ObjGroup* currentGroup = new ObjGroup();
        currentGroup->materialIndex = -1;


        while(!pFile.eof())
        {
                std::string line;
                std::getline(pFile, line);
                
                line = replace(line, "\t", " ");
                while(line.find("  ") != std::string::npos)
                        line = replace(line, "  ", " ");
                if(line == "")
                        continue;
                if(line[0] == ' ')
                        line = line.substr(1);
                if(line == "")
                        continue;
                if(line[line.length()-1] == ' ')
                        line = line.substr(0, line.length()-1);
                if(line == "")
                        continue;
                if(line[0] == '#')
                        continue;

                std::vector<std::string> params = split(line, " ");
                params[0] = toLower(params[0]);

                if(params[0] == "v")
                        vertices.push_back(Vec3f((float)atof(params[1].c_str()), (float)atof(params[2].c_str()), (float)atof(params[3].c_str())));
                else if(params[0] == "vn")
                        normals.push_back(Vec3f((float)atof(params[1].c_str()), (float)atof(params[2].c_str()), (float)atof(params[3].c_str())));
                else if(params[0] == "vt")
                        texcoords.push_back(Vec2f((float)atof(params[1].c_str()), (float)atof(params[2].c_str())));
                else if(params[0] == "f")
                {
                        for(size_t ii = 4; ii <= params.size(); ii++)
                        {
                                Face face;

                                for(size_t i = ii-3; i < ii; i++)
                                {
                                        Vertex vertex;
                                        vertex.normal = -1;
                                        vertex.texcoord = -1;
                                        std::vector<std::string> indices = split(params[i == (ii-3) ? 1 : i], "/");
                                        if(indices.size() >= 1)
                                                vertex.position = atoi(indices[0].c_str())-1;
                                        if(indices.size() == 2) //texture 
                                                vertex.texcoord = atoi(indices[1].c_str())-1;
                                        if(indices.size() == 3)
                                        {
                                                if( indices[1] != "")
                                                {
                                                        vertex.texcoord = atoi(indices[1].c_str())-1;
                                                }
                                                vertex.normal = atoi(indices[2].c_str())-1;
                                        }
                                        face.vertices.push_back(vertex);
                                }
                                currentGroup->faces.push_back(face);
                        }
                }
                else if(params[0] == "s")

                {
                }
        else if(params[0] == "mtllib")
        {
            loadMaterialFile(dirName + "/" + params[1], dirName);
        }
                else if(params[0] == "usemtl")
                {
                        if(currentGroup->faces.size() != 0)
                                groups.push_back(currentGroup);
                        currentGroup = new ObjGroup();
                        currentGroup->materialIndex = -1;

                        for(size_t i = 0; i < materials.size(); i++)
                        {
                                MaterialInfo* info = materials[i];
                                if(info->name == params[1])
                                {
                                        currentGroup->materialIndex = i;
                                        break;
                                }
                        }
                        if(currentGroup->materialIndex == -1)
                                std::cout<<"Could not find material name "<<params[1]<<std::endl;
                }
        }
        groups.push_back(currentGroup);
}
コード例 #2
0
ファイル: ObjModel.cpp プロジェクト: yorickr/CV-solo
ObjModel::ObjModel(std::string fileName, Singleton* s): s(s) {
    xpos = ypos = zpos = xrot = yrot = zrot = 0;
    this->obj = this;

    if(fileName == ""){
        return;
    }

    std::string dirName = fileName;
    if (dirName.rfind("/") != std::string::npos)
        dirName = dirName.substr(0, dirName.rfind("/"));
    if (dirName.rfind("\\") != std::string::npos)
        dirName = dirName.substr(0, dirName.rfind("\\"));
    if (fileName == dirName)
        dirName = "";


    std::ifstream pFile(fileName.c_str());

    if (!pFile.is_open()) {
        //std::cout << "Could not open file " << fileName << std::endl;
        return;
    }


    ObjGroup *currentGroup = new ObjGroup();
    currentGroup->materialIndex = -1;


    while (!pFile.eof()) {
        std::string line;
        std::getline(pFile, line);

        line = replace(line, "\t", " ");
        while (line.find("  ") != std::string::npos)
            line = replace(line, "  ", " ");
        if (line == "")
            continue;
        if (line[0] == ' ')
            line = line.substr(1);
        if (line == "")
            continue;
        if (line[line.length() - 1] == ' ')
            line = line.substr(0, line.length() - 1);
        if (line == "")
            continue;
        if (line[0] == '#')
            continue;

        std::vector<std::string> params = split(line, " ");
        params[0] = toLower(params[0]);

        if (params[0] == "v")
            vertices.push_back(new Vec3f((float) atof(params[1].c_str()), (float) atof(params[2].c_str()),
                                         (float) atof(params[3].c_str())));
        else if (params[0] == "vn")
            normals.push_back(new Vec3f((float) atof(params[1].c_str()), (float) atof(params[2].c_str()),
                                        (float) atof(params[3].c_str())));
        else if (params[0] == "vt")
            texcoords.push_back(new Vec2f((float) atof(params[1].c_str()), (float) atof(params[2].c_str())));
        else if (params[0] == "f") {
            for (size_t ii = 4; ii <= params.size(); ii++) {
                Face face;

                for (size_t i = ii - 3; i < ii; i++)    //magische forlus om van quads triangles te maken ;)
                {
                    Vertex vertex;
                    std::vector<std::string> indices = split(params[i == (ii - 3) ? 1 : i], "/");
                    if (indices.size() >= 1)    //er is een positie
                        vertex.position = atoi(indices[0].c_str()) - 1;
                    if (indices.size() == 2)        //alleen texture
                        vertex.texcoord = atoi(indices[1].c_str()) - 1;
                    if (indices.size() == 3)        //v/t/n of v//n
                    {
                        if (indices[1] != "")
                            vertex.texcoord = atoi(indices[1].c_str()) - 1;
                        vertex.normal = atoi(indices[2].c_str()) - 1;
                    }
                    face.vertices.push_back(vertex);
                }
                currentGroup->faces.push_back(face);
            }
        }
        else if (params[0] == "s") {//smoothing
        }
        else if (params[0] == "mtllib") {
            loadMaterialFile(dirName + "/" + params[1], dirName);
        }
        else if (params[0] == "usemtl") {
            if (currentGroup->faces.size() != 0)
                groups.push_back(currentGroup);
            currentGroup = new ObjGroup();
            currentGroup->materialIndex = -1;

            for (size_t i = 0; i < materials.size(); i++) {
                MaterialInfo *info = materials[i];
                if (info->name == params[1]) {
                    currentGroup->materialIndex = i;
                    break;
                }
            }
            if (currentGroup->materialIndex == -1) {
                //std::cout << "Could not find material name " << params[1] << std::endl;
            }
        }
    }
    groups.push_back(currentGroup);

    CalcMinVertex();
    CalcMaxVertex();
    InitBoundingSpheres();
    CalcBoundingSpheres();
}