improved error report

minor bug fix
This commit is contained in:
Paolo Cignoni cignoni 2009-12-23 23:41:23 +00:00
parent 980faa04c9
commit 8935a67aa7
4 changed files with 133 additions and 134 deletions

View File

@ -29,7 +29,6 @@ typedef typename SaveMeshType::FacePointer FacePointer;
typedef typename SaveMeshType::VertexIterator VertexIterator;
typedef typename SaveMeshType::FaceIterator FaceIterator;
static int Save(SaveMeshType &m, const char * filename, bool binary, CallBackPos *cb=0) {
return Save(m,filename, Mask::IOM_ALL, binary, cb);
}
@ -46,8 +45,7 @@ static int Save(SaveMeshType &mm, const char * filename, int savemask, bool bin
FILE *fout = fopen(filename,"wb");
if(fout==NULL) {
//pi.status=::vcg::ply::E_CANTOPEN;
//return ::vcg::ply::E_CANTOPEN;
return E_CANTOPEN;
}
QTime tt; tt.start(); //debug
@ -77,8 +75,8 @@ static int Save(SaveMeshType &mm, const char * filename, int savemask, bool bin
int incr = m.fn/cbStep, i=0;
for(i=0; i<m.fn; i++) {
fprintf(fout,"3 ");//\n");
if(i%incr == 0)
cb(++cbValue, "Exporting face topology");
if(i%incr == 0)
cb(++cbValue, "Exporting face topology");
}
fprintf(fout,"\n");
fprintf(fout,"]\n[\n");
@ -88,18 +86,18 @@ static int Save(SaveMeshType &mm, const char * filename, int savemask, bool bin
//second step: index of vertex for face
UpdateFlags<SaveMeshType>::VertexClearV(m);
for(FaceIterator fi=m.face.begin(); fi!=m.face.end(); ++fi, ++i) {
if(i%incr == 0)
cb(++cbValue, "Exporting index of verteces");
if(i%incr == 0)
cb(++cbValue, "Exporting index of verteces");
for(int j=0; j<3; ++j) {
int indexOfVertex = (*fi).V(j) - &(m.vert[0]);
fprintf(fout,"%i ",indexOfVertex);
//if it's the first visit, set visited bit
if(!(*fi).V(j)->IsV()) {
(*fi).V(j)->SetV();
fprintf(fout,"%i ",indexOfVertex);
//if it's the first visit, set visited bit
if(!(*fi).V(j)->IsV()) {
(*fi).V(j)->SetV();
}
}
}
//fprintf(fout,"\n");
fprintf(fout," ");
//fprintf(fout,"\n");
fprintf(fout," ");
}
fprintf(fout,"\n]\n");
qDebug("coords %i",tt.elapsed());
@ -113,9 +111,9 @@ static int Save(SaveMeshType &mm, const char * filename, int savemask, bool bin
for(VertexIterator vi=m.vert.begin(); vi!=m.vert.end(); ++vi, ++i) {
if(i%incr == 0) cb(++cbValue, "Exporting vertex coordinates");
if(vi->IsV()) {
Point3f p = mat * vi->P();
fprintf(fout,"%g %g %g ",p[0],p[1],p[2]);
}
Point3f p = mat * vi->P();
fprintf(fout,"%g %g %g ",p[0],p[1],p[2]);
}
}
fprintf(fout,"\n]\n");
qDebug("coords %i",tt.elapsed());
@ -125,111 +123,92 @@ static int Save(SaveMeshType &mm, const char * filename, int savemask, bool bin
if(HasPerVertexNormal(m) && (savemask & Mask::IOM_VERTNORMAL)) {
fprintf(fout,"\"N\"\n[\n");
for(FaceIterator fi=m.face.begin(); fi!=m.face.end(); ++fi, ++i) {
if(i%incr == 0) cb(++cbValue, "Exporting vertex normals");
//for each face, foreach vertex write normal
for(int j=0; j<3; ++j) {
Point3f n = mat * (*fi).V(j)->N(); //transform normal too
fprintf(fout,"%g %g %g ",n[0],n[1],n[2]);
if(i%incr == 0) cb(++cbValue, "Exporting vertex normals");
//for each face, foreach vertex write normal
for(int j=0; j<3; ++j) {
Point3f n = mat * (*fi).V(j)->N(); //transform normal too
fprintf(fout,"%g %g %g ",n[0],n[1],n[2]);
}
}
}
fprintf(fout,"\n]\n");
qDebug("normal %i",tt.elapsed());
fprintf(fout,"\n]\n");
qDebug("normal %i",tt.elapsed());
}
cbValue = (++step)*cbStep; i=0;
//fifth step: vertex color (ignore face color?)
if(m.HasPerVertexColor() && (savemask & Mask::IOM_VERTCOLOR)) {
fprintf(fout,"\"Cs\"\n[\n");
for(FaceIterator fi=m.face.begin(); fi!=m.face.end(); ++fi, ++i) {
if(i%incr == 0) cb(++cbValue, "Exporting vertex colors");
//for each face, foreach vertex write color
for(int j=0; j<3; ++j) {
Color4b &c=(*fi).V(j)->C();
fprintf(fout,"%g %g %g ",float(c[0])/255,float(c[1])/255,float(c[2])/255);
for(FaceIterator fi=m.face.begin(); fi!=m.face.end(); ++fi, ++i) {
if(i%incr == 0) cb(++cbValue, "Exporting vertex colors");
//for each face, foreach vertex write color
for(int j=0; j<3; ++j) {
Color4b &c=(*fi).V(j)->C();
fprintf(fout,"%g %g %g ",float(c[0])/255,float(c[1])/255,float(c[2])/255);
}
}
}
fprintf(fout,"\n]\n");
qDebug("color %i",tt.elapsed());
fprintf(fout,"\n]\n");
qDebug("color %i",tt.elapsed());
}
cbValue = (++step)*cbStep; i=0;
//sixth step: texture coordinates (for edge)
if((HasPerVertexTexCoord(m) && (savemask & Mask::IOM_VERTTEXCOORD)) ||
(HasPerWedgeTexCoord(m) && (savemask & Mask::IOM_WEDGTEXCOORD))) {
fprintf(fout,"\"st\"\n[\n"); i=0;
for(FaceIterator fi=m.face.begin(); fi!=m.face.end(); ++fi, ++i) {
fprintf(fout,"\"st\"\n[\n"); i=0;
for(FaceIterator fi=m.face.begin(); fi!=m.face.end(); ++fi, ++i) {
if(i%incr == 0) cb(++cbValue, "Exporting vertex/edge texture coordinates");
//for each face, foreach vertex write uv coord
for(int j=0; j<3; ++j) {
fprintf(fout,"%g %g ",(*fi).WT(j).U() , 1.0 - (*fi).WT(j).V()); //v origin axis is up
//for each face, foreach vertex write uv coord
for(int j=0; j<3; ++j) {
fprintf(fout,"%g %g ",(*fi).WT(j).U() , 1.0 - (*fi).WT(j).V()); //v origin axis is up
}
}
}
fprintf(fout,"\n]\n");
qDebug("texcoords %i",tt.elapsed());
fprintf(fout,"\n]\n");
qDebug("texcoords %i",tt.elapsed());
}
cbValue = (++step)*cbStep; i=0;
//seventh step: vertex quality
if(HasPerVertexQuality(m) && (savemask & Mask::IOM_VERTQUALITY)) {
fprintf(fout,"\"Q\"\n[\n"); i=0;
for(FaceIterator fi=m.face.begin(); fi!=m.face.end(); ++fi, ++i) {
if(i%incr == 0) cb(++cbValue, "Exporting vertex quality");
//for each face, foreach vertex write its quality
for(int j=0; j<3; ++j) {
fprintf(fout,"%g ",(*fi).V(j)->Q());
}
}
fprintf(fout,"\n]\n");
qDebug("quality %i",tt.elapsed());
fprintf(fout,"\"Q\"\n[\n"); i=0;
for(FaceIterator fi=m.face.begin(); fi!=m.face.end(); ++fi, ++i) {
if(i%incr == 0) cb(++cbValue, "Exporting vertex quality");
//for each face, foreach vertex write its quality
for(int j=0; j<3; ++j) {
fprintf(fout,"%g ",(*fi).V(j)->Q());
}
}
fprintf(fout,"\n]\n");
qDebug("quality %i",tt.elapsed());
}
cb(100, "Exporting completed");
fclose(fout);
return 0;
return RibError::E_NOERROR;
}
static const char *ErrorMsg(int error)
{/*
static std::vector<std::string> ply_error_msg;
if(ply_error_msg.empty())
{
ply_error_msg.resize(PlyInfo::E_MAXPLYINFOERRORS );
ply_error_msg[ply::E_NOERROR ]="No errors";
ply_error_msg[ply::E_CANTOPEN ]="Can't open file";
ply_error_msg[ply::E_NOTHEADER ]="Header not found";
ply_error_msg[ply::E_UNESPECTEDEOF ]="Eof in header";
ply_error_msg[ply::E_NOFORMAT ]="Format not found";
ply_error_msg[ply::E_SYNTAX ]="Syntax error on header";
ply_error_msg[ply::E_PROPOUTOFELEMENT]="Property without element";
ply_error_msg[ply::E_BADTYPENAME ]="Bad type name";
ply_error_msg[ply::E_ELEMNOTFOUND ]="Element not found";
ply_error_msg[ply::E_PROPNOTFOUND ]="Property not found";
ply_error_msg[ply::E_BADTYPE ]="Bad type on addtoread";
ply_error_msg[ply::E_INCOMPATIBLETYPE]="Incompatible type";
ply_error_msg[ply::E_BADCAST ]="Bad cast";
ply_error_msg[PlyInfo::E_NO_VERTEX ]="No vertex field found";
ply_error_msg[PlyInfo::E_NO_FACE ]="No face field found";
ply_error_msg[PlyInfo::E_SHORTFILE ]="Unespected eof";
ply_error_msg[PlyInfo::E_NO_3VERTINFACE ]="Face with more than 3 vertices";
ply_error_msg[PlyInfo::E_BAD_VERT_INDEX ]="Bad vertex index in face";
ply_error_msg[PlyInfo::E_NO_6TCOORD ]="Face with no 6 texture coordinates";
ply_error_msg[PlyInfo::E_DIFFER_COLORS ]="Number of color differ from vertices";
}
*/
static const char * dae_error_msg[] =
{
"No errors"
};
if(error>0 || error<0) return "Unknown error";
else return dae_error_msg[error];
enum RibError {
E_NOERROR, // 0
// Errors of open(..)
E_CANTOPEN, // 1
E_MAXRIBERRORS
};
static int GetExportMaskCapability()
static const char *ErrorMsg(int error) {
static std::vector<std::string> rib_error_msg;
if(rib_error_msg.empty())
{
rib_error_msg.resize(E_MAXRIBERRORS);
rib_error_msg[E_NOERROR ]="No errors";
rib_error_msg[E_CANTOPEN ]="Can't open file";
}
if(error > E_MAXRIBERRORS || error < 0)
return "Unknown error";
else
return rib_error_msg[error].c_str();
};
static int GetExportMaskCapability() {
int capability = 0;
capability |= vcg::tri::io::Mask::IOM_VERTCOORD ;
//capability |= vcg::tri::io::Mask::IOM_VERTFLAGS ;

View File

@ -324,17 +324,17 @@ bool FilterHighQualityRender::applyFilter(QAction *filter, MeshModel &m, RichPar
//every time the render process write a message, receive a signal
worldBeginRendered = 1; lastCb = 0;
qDebug("number of world begin found: %i",numOfWorldBegin);
connect(&renderProcess, SIGNAL(readyReadStandardOutput()),this, SLOT(updateOutputProcess()));
connect(&renderProcess, SIGNAL(readyReadStandardError()),this, SLOT(errSgn()));
connect(&renderProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(updateOutputProcess()));
connect(&renderProcess, SIGNAL(readyReadStandardError()) , this, SLOT(errSgn()));
cb(0, "Rendering image with Aqsis");
#if !defined(NO_RENDERING)
renderProcess.start(toRun);
renderProcess.start(toRun);
if (!renderProcess.waitForFinished(-1)) {
this->errorMessage = "An error occured in Aqsis";
return false;
return false;
}
#endif
disconnect(&renderProcess, SIGNAL(readyReadStandardOutput()),this, SLOT(updateOutputProcess()));
disconnect(&renderProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(updateOutputProcess()));
//if process Aqsis is stopped, no image are created
qDebug("aqsis process finished");
@ -369,10 +369,10 @@ bool FilterHighQualityRender::applyFilter(QAction *filter, MeshModel &m, RichPar
}
qDebug("end: %i",tt.elapsed());
Log(GLLogStream::FILTER,"Successfully created high quality image");
//Log(GLLogStream::FILTER,"Aqsis has rendered image successfully");
cb(100, qPrintable("Created " + QString::number(imagesRendered.size())+" images"));
Log(GLLogStream::FILTER,"Successfully created high quality image");
//Log(GLLogStream::FILTER,"Aqsis has rendered image successfully");
//run piqls with rendered image
if(par.getBool("ShowResult")) {
QProcess piqslProcess;

View File

@ -94,20 +94,18 @@ private:
int numberOfDummies, numOfObject;
struct ObjValues {
vcg::Matrix44f objectMatrix;
float objectBound[6]; // xmin, xmax, ymin, ymax, zmin, zmax
QStringList objectShader;
QString objectId;
QString objectDisplacementbound;
float objectBound[6]; // xmin, xmax, ymin, ymax, zmin, zmax
QStringList objectShader;
QString objectId;
QString objectDisplacementbound;
};
bool makeScene(MeshModel &m, QStringList* textureList, RichParameterSet &par, QString templatePath, QString destDirString, QStringList* shaderDirs, QStringList* textureDirs, QStringList* proceduralDirs, QStringList* imagesRendered);
QString parseObject(RibFileStack* files, QString destDir, int currentFrame, MeshModel &m, RichParameterSet &par, QStringList* textureList);
int convertObject(FILE* fout, QString destDir, MeshModel &m, RichParameterSet &par, QStringList* textureList, ObjValues* dummyValues);
bool convertObject(FILE* fout, QString destDir, MeshModel &m, RichParameterSet &par, QStringList* textureList, ObjValues* dummyValues);
int makeAnimation(FILE* fout, int numOfFrame, vcg::Matrix44f initialCamera, QStringList frameDeclaration, QString imageName);
int writeMatrix(FILE* fout, vcg::Matrix44f matrix, bool transposed = true);
//QString readArray(RibFileStack* files,QString arrayString = "");
vcg::Matrix44f getMatrix(QString matrixString);
enum searchType{ ERR, ARCHIVE, SHADER, TEXTURE, PROCEDURAL };
//QStringList readSearchPath(RibFileStack* files,QString line, int* type);
int writeMatrix(FILE* fout, const vcg::Matrix44f* matrix, bool transposed = true);
vcg::Matrix44f getMatrix(const QString* matrixString) const;
enum searchType{ ERR, ARCHIVE, SHADER, TEXTURE, PROCEDURAL };
QStringList readSearchPath(const QStringList* token, int* type);
};

View File

@ -24,7 +24,8 @@ bool FilterHighQualityRender::makeScene(MeshModel &m,
FILE* fout;
fout = fopen(qPrintable(destDirString + QDir::separator() + mainFileName()),"wb");
if(fout==NULL) {
this->errorMessage = "Impossible to create file: " + destDirString + QDir::separator() + mainFileName();
return false;
}
qDebug("Starting to write rib file into %s",qPrintable(destDirString + QDir::separator() + mainFileName()));
@ -73,8 +74,7 @@ bool FilterHighQualityRender::makeScene(MeshModel &m,
*textureDirs = dirList;
break;
case FilterHighQualityRender::PROCEDURAL:
*proceduralDirs = dirList;
*proceduralDirs = dirList;
break;
case FilterHighQualityRender::ERR:
//ignore: maybe an error or another searchpath type (not in RISpec3.2)
@ -98,7 +98,10 @@ bool FilterHighQualityRender::makeScene(MeshModel &m,
case ribParser::FRAMEBEGIN:
{
QStringList token = ribParser::splitStatement(&line);
currentFrame = token[1].toInt(); //no check on cast
bool isNum;
int i = token[1].toInt(&isNum);
if(isNum)
currentFrame = i;
if(currentFrame == 1) { //questo è casino con animazioni
if(numOfFrames > 0)
isFrameDeclaration = true;
@ -145,8 +148,7 @@ bool FilterHighQualityRender::makeScene(MeshModel &m,
{
//transformation camera
if(numOfFrames > 0) {
//line = readArray(&files,line); ////
transfCamera = getMatrix(line);
transfCamera = getMatrix(&line);
}
break;
}
@ -170,6 +172,9 @@ bool FilterHighQualityRender::makeScene(MeshModel &m,
fprintf(fout,"ReadArchive \"world.rib\"\n");
fout = fopen(qPrintable(filename),"wb");
if(fout == NULL) {
this->errorMessage = "Impossible to create file: " + filename;
fclose(fmain);
return false;
}
}
break;
@ -192,8 +197,12 @@ bool FilterHighQualityRender::makeScene(MeshModel &m,
QString filename = parseObject(&files, destDirString, currentFrame, m, par, textureList);
qDebug("fuori: %s",qPrintable(filename));
writeLine = false;
if(filename == "") { //error in parseObject
fclose(fmain);
return false;
}
fprintf(fout,"ReadArchive \"%s\"\n",qPrintable(filename));
break;
break;
}
case ribParser::NOMORESTATEMENT:
{
@ -219,6 +228,8 @@ QString FilterHighQualityRender::parseObject(RibFileStack* files, QString destDi
QString name = "object" + QString::number(numOfObject) + ".rib";
FILE* fout = fopen(qPrintable(destDirString + QDir::separator() + name),"wb");
if(fout == NULL) {
this->errorMessage = "Impossible to create file: " + destDirString + QDir::separator() + name;
return "";
}
qDebug("parse object");
//if it's a dummy object, i need the the follow value:
@ -255,7 +266,7 @@ QString FilterHighQualityRender::parseObject(RibFileStack* files, QString destDi
}
case ribParser::TRANSFORM:
{
current->objectMatrix = getMatrix(line);
current->objectMatrix = getMatrix(&line);
break;
}
case ribParser::BOUND:
@ -317,7 +328,9 @@ QString FilterHighQualityRender::parseObject(RibFileStack* files, QString destDi
}
fclose(fout);
if(isDummy) {
if(!isDummy)
numOfObject++;
else {
qDebug("Found dummy object");
//delete the previous file
QDir tmp = QDir(destDirString);
@ -327,18 +340,20 @@ QString FilterHighQualityRender::parseObject(RibFileStack* files, QString destDi
numberOfDummies++;
FILE *fmesh = fopen(qPrintable(destDirString + QDir::separator() + name),"wb");
if(fmesh==NULL) {
this->errorMessage = "Impossible to create the file: " + destDirString + QDir::separator() + name;
return "";
}
convertObject(fmesh, destDirString, m, par, textureList, current);
fclose(fmesh);
}
else
numOfObject++;
bool res = convertObject(fmesh, destDirString, m, par, textureList, current);
fclose(fmesh);
if(!res)
return "";
}
delete current;
return name;
}
//write on a opened file the attribute of object entity
int FilterHighQualityRender::convertObject(FILE* fout, QString destDir, MeshModel &m, RichParameterSet &par, QStringList* textureList, ObjValues* dummyValues)
bool FilterHighQualityRender::convertObject(FILE* fout, QString destDir, MeshModel &m, RichParameterSet &par, QStringList* textureList, ObjValues* dummyValues)
{
fprintf(fout,"AttributeBegin\n");
//name
@ -397,7 +412,7 @@ int FilterHighQualityRender::convertObject(FILE* fout, QString destDir, MeshMode
vcg::Matrix44f result = templateMatrix * alignMatrix * scaleMatrix * translateBBMatrix;
//write transformation matrix (after transpose it)
writeMatrix(fout,result);
writeMatrix(fout, &result);
QString bound = "Bound";
for(int i=0; i<6; i++)
bound += " " + QString::number(dummyValues->objectBound[i]);
@ -434,11 +449,18 @@ int FilterHighQualityRender::convertObject(FILE* fout, QString destDir, MeshMode
//make the conversion only once
convertedGeometry = true;
QString geometryDest = destDir + QDir::separator() + filename;
vcg::tri::io::ExporterRIB<CMeshO>::Save(m.cm, qPrintable(geometryDest), vcg::tri::io::Mask::IOM_ALL, false, cb);
Log(GLLogStream::FILTER,"Successfully converted mesh");
int res = vcg::tri::io::ExporterRIB<CMeshO>::Save(m.cm, qPrintable(geometryDest), vcg::tri::io::Mask::IOM_ALL, false, cb);
if(res != vcg::tri::io::ExporterRIB<CMeshO>::E_NOERROR) {
fclose(fout);
this->errorMessage = QString(vcg::tri::io::ExporterRIB<CMeshO>::ErrorMsg(res));
return false;
}
else
Log(GLLogStream::FILTER,"Successfully converted mesh");
}
fprintf(fout,"AttributeEnd\n");
return 0; //errors...
fclose(fout);
return true;
}
@ -470,7 +492,7 @@ int FilterHighQualityRender::makeAnimation(FILE* fout, int numOfFrame,vcg::Matri
float rot = float(360*(frame-1)/numOfFrame);
result = result.SetRotateDeg(rot,vcg::Point3f(0.0,0.0,1.0));
result = transfCamera * result;
writeMatrix(fout,result);
writeMatrix(fout, &result);
fprintf(fout,"ReadArchive \"world.rib\"\nFrameEnd\n");
}
return 0; //errors
@ -501,20 +523,20 @@ QStringList FilterHighQualityRender::readSearchPath(const QStringList* token, in
}
//write a vcg::Matrix44f to file
int FilterHighQualityRender::writeMatrix(FILE* fout, vcg::Matrix44f matrix, bool transposed) {
int FilterHighQualityRender::writeMatrix(FILE* fout, const vcg::Matrix44f* matrix, bool transposed) {
fprintf(fout,"Transform [ ");
for(int i = 0; i<4; i++)
for(int j = 0; j<4; j++)
fprintf(fout,"%f ",(transposed)? matrix.ElementAt(j,i) : matrix.ElementAt(i,j));
fprintf(fout,"%f ",(transposed)? matrix->ElementAt(j,i) : matrix->ElementAt(i,j));
fprintf(fout,"]\n");
return 0;
}
//get a vcg::Matrix44f from line (and transpose it)
vcg::Matrix44f FilterHighQualityRender::getMatrix(QString matrixString) {
vcg::Matrix44f FilterHighQualityRender::getMatrix(const QString* matrixString) const {
float t[16];
int k=0;
QStringList list = matrixString.split(' ');
QStringList list = matrixString->split(' ');
for(int i=0; i<list.size(); i++) {
if(list[i].trimmed().contains('[') || list[i].trimmed().contains(']')) {
list[i] = list[i].remove('[');