ReWrote loadMask. Now shorter and faster.
This commit is contained in:
parent
49daa83ca1
commit
8738390450
|
@ -25,6 +25,9 @@
|
||||||
History
|
History
|
||||||
|
|
||||||
$Log: not supported by cvs2svn $
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.9 2006/10/09 19:58:08 cignoni
|
||||||
|
Added casts to remove warnings
|
||||||
|
|
||||||
Revision 1.8 2006/07/09 05:41:17 cignoni
|
Revision 1.8 2006/07/09 05:41:17 cignoni
|
||||||
Major rewrite. Now shorter and more robust.
|
Major rewrite. Now shorter and more robust.
|
||||||
|
|
||||||
|
@ -567,7 +570,7 @@ static int Open( OpenMeshType &m, const char * filename, Info &oi)
|
||||||
if(stream.eof()) return;
|
if(stream.eof()) return;
|
||||||
std::string line;
|
std::string line;
|
||||||
do
|
do
|
||||||
std::getline(stream, line, '\n');
|
std::getline(stream, line);
|
||||||
while ((line[0] == '#' || line.length()==0) && !stream.eof()); // skip comments and empty lines
|
while ((line[0] == '#' || line.length()==0) && !stream.eof()); // skip comments and empty lines
|
||||||
|
|
||||||
if ((line[0] == '#') || (line.length() == 0)) // can be true only on last line of file
|
if ((line[0] == '#') || (line.length() == 0)) // can be true only on last line of file
|
||||||
|
@ -708,6 +711,53 @@ inline static const void SplitVToken(std::string token, std::string &vertex)
|
||||||
}
|
}
|
||||||
} // end of SplitVVTVNToken
|
} // end of SplitVVTVNToken
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Retrieves infos about kind of data stored into the file and fills a mask appropriately
|
||||||
|
* \param filename The name of the file to open
|
||||||
|
* \param mask A mask which will be filled according to type of data found in the object
|
||||||
|
* \param oi A structure which will be filled with infos about the object to be opened
|
||||||
|
*/
|
||||||
|
|
||||||
|
static bool LoadMask(const char * filename, Info &oi)
|
||||||
|
{
|
||||||
|
std::ifstream stream(filename);
|
||||||
|
if (stream.fail()) return false;
|
||||||
|
|
||||||
|
// obtain length of file:
|
||||||
|
stream.seekg (0, std::ios::end);
|
||||||
|
int length = stream.tellg();
|
||||||
|
stream.seekg (0, std::ios::beg);
|
||||||
|
|
||||||
|
if (length == 0) return false;
|
||||||
|
|
||||||
|
bool bHasPerFaceColor = false;
|
||||||
|
|
||||||
|
oi.numVertices=0;
|
||||||
|
oi.numFaces=0;
|
||||||
|
oi.numTexCoords=0;
|
||||||
|
int lineCount=0;
|
||||||
|
std::string line;
|
||||||
|
while (!stream.eof())
|
||||||
|
{
|
||||||
|
lineCount++;
|
||||||
|
if(oi.cb && (lineCount%1000)==0)
|
||||||
|
(*oi.cb)( (int)(100.0*(float(stream.tellg()))/float(length)), "Loading mask...");
|
||||||
|
std::getline(stream, line);
|
||||||
|
if(line.size()>2)
|
||||||
|
{
|
||||||
|
if(line[0]=='v')
|
||||||
|
{
|
||||||
|
if(line[1]==' ') oi.numVertices++;
|
||||||
|
if(line[1]=='t') oi.numTexCoords++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if(line[0]=='f') oi.numFaces++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
oi.mask = 0;
|
||||||
|
if (oi.numTexCoords) oi.mask |= vcg::tri::io::Mask::IOM_WEDGTEXCOORD;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool LoadMask(const char * filename, int &mask)
|
static bool LoadMask(const char * filename, int &mask)
|
||||||
{
|
{
|
||||||
|
@ -717,170 +767,6 @@ static bool LoadMask(const char * filename, int &mask)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
|
||||||
* Retrieves infos about kind of data stored into the file and fills a mask appropriately
|
|
||||||
* \param filename The name of the file to open
|
|
||||||
* \param mask A mask which will be filled according to type of data found in the object
|
|
||||||
* \param oi A structure which will be filled with infos about the object to be opened
|
|
||||||
*/
|
|
||||||
static bool LoadMask(const char * filename, Info &oi)
|
|
||||||
{
|
|
||||||
std::ifstream stream(filename);
|
|
||||||
if (stream.fail())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// obtain length of file:
|
|
||||||
stream.seekg (0, std::ios::end);
|
|
||||||
int length = stream.tellg();
|
|
||||||
if (length == 0) return false;
|
|
||||||
stream.seekg (0, std::ios::beg);
|
|
||||||
|
|
||||||
|
|
||||||
bool bHasPerWedgeTexCoord = false;
|
|
||||||
bool bHasPerWedgeNormal = false;
|
|
||||||
bool bUsingMaterial = false;
|
|
||||||
bool bHasPerVertexColor = false;
|
|
||||||
bool bHasPerFaceColor = false;
|
|
||||||
|
|
||||||
std::string header;
|
|
||||||
std::vector<std::string> tokens;
|
|
||||||
|
|
||||||
int numVertices = 0; // stores the number of vertexes been read till now
|
|
||||||
int numTriangles = 0; // stores the number of triangular faces been read till now
|
|
||||||
|
|
||||||
const int deltaPos = 100;
|
|
||||||
int currPos = 0;
|
|
||||||
int lastPos = currPos;
|
|
||||||
|
|
||||||
// cycle till we encounter first face
|
|
||||||
while (!stream.eof())
|
|
||||||
{
|
|
||||||
tokens.clear();
|
|
||||||
header.clear();
|
|
||||||
TokenizeNextLine(stream, tokens);
|
|
||||||
|
|
||||||
if (tokens.size() > 0)
|
|
||||||
{
|
|
||||||
header = tokens[0];
|
|
||||||
|
|
||||||
if (header.compare("v")==0)
|
|
||||||
{
|
|
||||||
++numVertices;
|
|
||||||
if (bUsingMaterial) bHasPerVertexColor = true;
|
|
||||||
}
|
|
||||||
if (header.compare("vt")==0)
|
|
||||||
{
|
|
||||||
++oi.numTexCoords;
|
|
||||||
}
|
|
||||||
else if (header.compare("f")==0)
|
|
||||||
{
|
|
||||||
numTriangles += (int)tokens.size() - 3;
|
|
||||||
std::string remainingText = tokens[1];
|
|
||||||
|
|
||||||
// we base our assumption on the fact that the way vertex data is
|
|
||||||
// referenced into faces must be consistent among the entire file
|
|
||||||
int charIdx = 0;
|
|
||||||
size_t length = remainingText.size();
|
|
||||||
char c;
|
|
||||||
while((charIdx != length) && ((c = remainingText[charIdx])!='/') && (c != ' '))
|
|
||||||
++charIdx;
|
|
||||||
|
|
||||||
if (c == '/')
|
|
||||||
{
|
|
||||||
++charIdx;
|
|
||||||
if ((charIdx != length) && ((c = remainingText[charIdx])!='/'))
|
|
||||||
{
|
|
||||||
bHasPerWedgeTexCoord = true;
|
|
||||||
|
|
||||||
++charIdx;
|
|
||||||
while((charIdx != length) && ((c = remainingText[charIdx])!='/') && (c != ' '))
|
|
||||||
++charIdx;
|
|
||||||
|
|
||||||
if (c == '/')
|
|
||||||
bHasPerWedgeNormal = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bHasPerWedgeNormal = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (bUsingMaterial) bHasPerFaceColor = true;
|
|
||||||
}
|
|
||||||
else if (header.compare("usemtl")==0)
|
|
||||||
bUsingMaterial = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// callback invocation, abort loading process if the call returns false
|
|
||||||
if (oi.cb !=NULL)
|
|
||||||
{
|
|
||||||
currPos = stream.tellg();
|
|
||||||
if ((currPos - lastPos) > deltaPos)
|
|
||||||
{
|
|
||||||
if (!(*oi.cb)((100 * currPos)/length, "Loading mask..."))
|
|
||||||
return false;
|
|
||||||
lastPos = currPos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// after the encounter of first face we avoid to do additional tests
|
|
||||||
while (!stream.eof())
|
|
||||||
{
|
|
||||||
tokens.clear();
|
|
||||||
header.clear();
|
|
||||||
TokenizeNextLine(stream, tokens);
|
|
||||||
|
|
||||||
if (tokens.size() > 0)
|
|
||||||
{
|
|
||||||
header = tokens[0];
|
|
||||||
|
|
||||||
if (header.compare("v")==0)
|
|
||||||
{
|
|
||||||
++numVertices;
|
|
||||||
if (bUsingMaterial) bHasPerVertexColor = true;
|
|
||||||
}
|
|
||||||
else if (header.compare("f")==0)
|
|
||||||
{
|
|
||||||
numTriangles += (static_cast<int>(tokens.size()) - 3);
|
|
||||||
if (bUsingMaterial) bHasPerFaceColor = true;
|
|
||||||
}
|
|
||||||
else if (header.compare("vt")==0)
|
|
||||||
{
|
|
||||||
++oi.numTexCoords;
|
|
||||||
}
|
|
||||||
else if (header.compare("usemtl")==0)
|
|
||||||
bUsingMaterial = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// callback invocation, abort loading process if the call returns false
|
|
||||||
if (oi.cb !=NULL)
|
|
||||||
{
|
|
||||||
currPos = stream.tellg();
|
|
||||||
if ((currPos - lastPos) > deltaPos)
|
|
||||||
{
|
|
||||||
if (!(*oi.cb)((100 * currPos)/length, "Loading mask..."))
|
|
||||||
return false;
|
|
||||||
lastPos = currPos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
oi.mask = 0;
|
|
||||||
if (bHasPerWedgeTexCoord) oi.mask |= vcg::tri::io::Mask::IOM_WEDGTEXCOORD;
|
|
||||||
if (bHasPerWedgeNormal) oi.mask |= vcg::tri::io::Mask::IOM_WEDGNORMAL;
|
|
||||||
if (bHasPerVertexColor) oi.mask |= vcg::tri::io::Mask::IOM_VERTCOLOR;
|
|
||||||
if (bHasPerFaceColor) oi.mask |= vcg::tri::io::Mask::IOM_FACECOLOR;
|
|
||||||
|
|
||||||
oi.numVertices = numVertices;
|
|
||||||
oi.numFaces = numTriangles;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static bool LoadMaterials(const char * filename, std::vector<Material> &materials, std::vector<std::string> &textures)
|
static bool LoadMaterials(const char * filename, std::vector<Material> &materials, std::vector<std::string> &textures)
|
||||||
{
|
{
|
||||||
// assumes we are in the right directory
|
// assumes we are in the right directory
|
||||||
|
|
Loading…
Reference in New Issue