From 8935a67aa7d3fe9120aa19936ebdb59bff9effdc Mon Sep 17 00:00:00 2001 From: Paolo Cignoni cignoni Date: Wed, 23 Dec 2009 23:41:23 +0000 Subject: [PATCH] improved error report minor bug fix --- src/fgt/filter_hqrender/export_rib.h | 163 +++++++++----------- src/fgt/filter_hqrender/filter_hqrender.cpp | 16 +- src/fgt/filter_hqrender/filter_hqrender.h | 18 +-- src/fgt/filter_hqrender/parser_rib.cpp | 70 ++++++--- 4 files changed, 133 insertions(+), 134 deletions(-) diff --git a/src/fgt/filter_hqrender/export_rib.h b/src/fgt/filter_hqrender/export_rib.h index 9a51257dc..845047b6b 100644 --- a/src/fgt/filter_hqrender/export_rib.h +++ b/src/fgt/filter_hqrender/export_rib.h @@ -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::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 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 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 ; diff --git a/src/fgt/filter_hqrender/filter_hqrender.cpp b/src/fgt/filter_hqrender/filter_hqrender.cpp index f4bd432ae..056abe452 100644 --- a/src/fgt/filter_hqrender/filter_hqrender.cpp +++ b/src/fgt/filter_hqrender/filter_hqrender.cpp @@ -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; diff --git a/src/fgt/filter_hqrender/filter_hqrender.h b/src/fgt/filter_hqrender/filter_hqrender.h index 346ffbaad..b33557c39 100644 --- a/src/fgt/filter_hqrender/filter_hqrender.h +++ b/src/fgt/filter_hqrender/filter_hqrender.h @@ -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); }; diff --git a/src/fgt/filter_hqrender/parser_rib.cpp b/src/fgt/filter_hqrender/parser_rib.cpp index 0979f5881..1ecaf5b95 100644 --- a/src/fgt/filter_hqrender/parser_rib.cpp +++ b/src/fgt/filter_hqrender/parser_rib.cpp @@ -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::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::Save(m.cm, qPrintable(geometryDest), vcg::tri::io::Mask::IOM_ALL, false, cb); + if(res != vcg::tri::io::ExporterRIB::E_NOERROR) { + fclose(fout); + this->errorMessage = QString(vcg::tri::io::ExporterRIB::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