facetype* equipcache::getface(int fid)
	{
		if (!faces.count(fid))
		{
			faces[fid] = facetype(fid);
		}
		return &faces[fid];
	}
Esempio n. 2
0
	facetype lookfactory::getface(int fid)
	{
		if (!faces.count(fid))
		{
			faces[fid] = facetype(fid);
		}
		return faces[fid];
	}
	facetype* equipcache::getface(int fid)
	{
		if (!faces.count(fid))
		{
			app.getimgcache()->setmode(ict_sys);
			faces[fid] = facetype(fid);
			app.getimgcache()->unlock();
		}
		return &faces[fid];
	}
Esempio n. 4
0
bool ObjParser::parse(const char*        filename,
                      vector<Point3f>   &verts,
                      vector<Point2f>   &uvs,
                      vector<Normal3f>  &norms,
                      vector<PolyIndex> &polys)
{
#ifdef _DEBUG
    clock_t start, end;//Timer
    start = clock();
#endif

    FILE* fp = fopen(filename, "r");
    if (fp == nullptr)
    {
        return false;
    }
    int err;
    char buff[256] = {};
    char lineHeader[3] = {};
    Float val[3] = {};
    uint32_t indices[3];
    char endflg;

    while (true)
    {
        lineHeader[0] = lineHeader[1] = 0;
        err = fscanf(fp, "%2s", &lineHeader);
        if (err == EOF)
        {
            break;
        }
        // Vertex
        if (strcmp(lineHeader, "v") == 0)
        {
            fscanf(fp, "%f %f %f\n", val, val + 1, val + 2);
            verts.push_back(Point3f(val));
        }
        // Texture Coordinate
        else if (strcmp(lineHeader, "vt") == 0)
        {
            fscanf(fp, "%f %f\n", val, val + 1);
            uvs.push_back(Point2f(val));
        }
        // Vertex Normal
        else if (strcmp(lineHeader, "vn") == 0)
        {
            //float val[3];
            fscanf(fp, "%f %f %f\n", val, val + 1, val + 2);
            norms.push_back(Normal3f(val));
        }
        // Face Index
        else if (strcmp(lineHeader, "f") == 0)
        {
            PolyIndex fid;
            err = fscanf(fp, "%s", &buff);
            indices[1] = indices[2] = 0;
            index_t ft = facetype(buff, indices);
            fid.push_back(indices);
            endflg = fgetc(fp);
            switch (ft)
            {
            case VTN://111
                while (endflg != '\n' && endflg != '\r' && endflg != '\0')
                {
                    ungetc(endflg, fp);
                    fscanf(fp, "%d/%d/%d", indices, indices + 1, indices + 2);
                    fid.push_back(indices);
                    endflg = fgetc(fp);
                }
                break;
            case VT://011
                while (endflg != '\n' && endflg != '\r' && endflg != '\0')
                {
                    ungetc(endflg, fp);
                    fscanf(fp, "%d/%d", indices, indices + 1);
                    fid.push_back(indices);
                    endflg = fgetc(fp);
                }
                break;
            case VN://101
                while (endflg != '\n' && endflg != '\r' && endflg != '\0')
                {
                    ungetc(endflg, fp);
                    fscanf(fp, "%d//%d", indices, indices + 2);
                    fid.push_back(indices);
                    endflg = fgetc(fp);
                }
                break;
            case V://001
                while (endflg != '\n' && endflg != '\r' && endflg != EOF)
                {
                    ungetc(endflg, fp);
                    fscanf(fp, "%d", indices);
                    fid.push_back(indices);
                    endflg = fgetc(fp);
                }
                break;
            default:
                break;
            }
            fid.size = fid.v.size();
            polys.push_back(fid);
        }
        // Comment
        else if (strcmp(lineHeader, "#") == 0)
        {
            fscanf(fp, "%[^\r\n]", &buff);
        }
        // Others
        else
        {
            // skip everything except \n or \r
            fscanf(fp, "%[^\r\n]", &buff);
        }
    }
    fclose(fp);

#ifdef _DEBUG
    end = clock();
    cout << "OBJ File " << filename << " Loding Time:" << (Float)(end - start) / CLOCKS_PER_SEC << "s" << endl;//Timer
#endif // _DEBUG

    return true;
}