diff --git a/src/fgt/filter_hqrender/RibFileStack.cpp b/src/fgt/filter_hqrender/RibFileStack.cpp index fdba3b9a1..a460709e9 100644 --- a/src/fgt/filter_hqrender/RibFileStack.cpp +++ b/src/fgt/filter_hqrender/RibFileStack.cpp @@ -1,19 +1,17 @@ #include "RibFileStack.h" RibFileStack::RibFileStack(QString dir) { + ribProc = ribParser::initHash(); //hash of rib procedure stack = new QStack< QPair* >(); - this->templateDir = dir; + templateDir = dir; subDir.append("."); //to search in the same dir }; RibFileStack::~RibFileStack() { - //close all file + delete ribProc; while(!stack->isEmpty()) - popFile(); + popFile(); //close all file delete stack; //it's enough? - /* - while(popFile()); delete stack; - */ }; //open file and push the text stream to stack @@ -27,12 +25,18 @@ bool RibFileStack::pushFile(QString* path) { }; bool RibFileStack::pushFile(QFile* file) { + //add file to stack and open it if(!(*file).open(QIODevice::ReadOnly)) { return false; } QTextStream* stream = new QTextStream(file); QPair* p = new QPair(file, stream); stack->push(p); + if(stack->count() == 1) { //if it's the first prepare next line + bool end; + nextLine = topNextLine(&end); + nextLineType = isRibProcedure(nextLine); + } return true; }; @@ -48,52 +52,153 @@ bool RibFileStack::popFile() { //return the next line from file at top of stack //if it's the end of this file, pop it and take the line of next -//if it's a ReadArchive statement, add the new file at the top of stack -QString RibFileStack::topNextLine() { - if(stack->isEmpty()) - return QString::null; - +QString RibFileStack::topNextLine(bool* end) { + if(stack->isEmpty()) { + *end = true; + return ""; + } //take the top element from stack QPair* p = stack->top(); //the stream of file QTextStream* s = (p->second); if(!s->atEnd()) { - QString line = s->readLine(); - QStringList token = line.split(' '); - //test if it's a statement to open a new file - if(token[0].trimmed() == "ReadArchive") { - //if it's a ReadArchive statement search the next file to parse - //search in subdir list - bool found = false; - //token[1] is the file name - for(int i=0; ireadLine(); + if(str == "") + return topNextLine(end); //ignore empty line + else + return str; } else { //close and remove from stack the file popFile(); //recursive call (the top is changed) - return topNextLine(); + return topNextLine(end); } }; -bool RibFileStack::isEmpty() const { +//return the next statement of file stack (maybe on more line) +QString RibFileStack::nextStatement(int* type, bool manageReadArchive) { + if(nextLine == "") { + bool end = false; + nextLine = topNextLine(&end); + if(end) { + *type = ribParser::NOMORESTATEMENT; + return nextLine; //no more line to be readable + } + else + *type = isRibProcedure(nextLine); + } + QString str = nextLine; //nextline is a rib procedure + *type = nextLineType; + + if(*type == ribParser::READARCHIVE) { + qDebug("is a ReadArchive"); + QStringList token = ribParser::splitStatement(&str); + //0: ReadArchive, + //1: " , + //2: , + //3: " + bool end; + while(token.size() < 4 && !end) { + QString line = topNextLine(&end); + str += " " + line; + token = ribParser::splitStatement(&str); + } + if(manageReadArchive) { + if(readArchive(str)) { //add the new file to stack + nextLine = topNextLine(&end); + nextLineType = isRibProcedure(nextLine); + //qDebug("Readed: %s Type: %d",qPrintable(str), *type); + //qDebug("nextline: %s type: %d",qPrintable(nextLine),nextLineType); + return nextStatement(type, manageReadArchive); //read the first line of new file, if found it + } + else + return str; + } + else + return str; + } + else { //it isn't a ReadArchive procedure + bool end; + nextLine = topNextLine(&end); //take next line + if(!inString(str)) + nextLineType = isRibProcedure(nextLine); + else //maybe a string with a procedure name + nextLineType = ribParser::NOTAPROCEDURE; + while(nextLine != "" && nextLineType == ribParser::NOTAPROCEDURE ) { + //qDebug("nextline: %s type: %d",qPrintable(nextLine),nextLineType); + str += "\n" + nextLine; //if isn't a rib procedure append to str + nextLine = topNextLine(&end); + if(!inString(str)) + nextLineType = isRibProcedure(nextLine); //if there's a string opened, don't test if it's a procedure + } + //qDebug("Readed: %s Type: %d",qPrintable(str), *type); + //qDebug("nextline: %s type: %d",qPrintable(nextLine),nextLineType); + return str; + } +} + +//parse the statement, search and add the new file to stack +bool RibFileStack::readArchive(QString line) { + QStringList token = ribParser::splitStatement(&line); + //test if it's a statement to open a new file + if(ribProc->value(token[0]) == ribParser::READARCHIVE) { + //if it's a ReadArchive statement search the next file to parse + //search in subdir list + QString filename = token[2]; + //token[2] is the file name + for(int i=0; ivalue(token); + +} + +bool RibFileStack::hasNext() const { return stack->isEmpty(); }; +//append a directory list to the list of stack bool RibFileStack::addSubDirs(QStringList dirs) { foreach(QString dir,dirs) subDir.append(dir); return true; }; + diff --git a/src/fgt/filter_hqrender/RibFileStack.h b/src/fgt/filter_hqrender/RibFileStack.h index 9a14e20a4..ed52d7929 100644 --- a/src/fgt/filter_hqrender/RibFileStack.h +++ b/src/fgt/filter_hqrender/RibFileStack.h @@ -5,6 +5,7 @@ #include #include #include +#include "ribProcedure.h" class RibFileStack { @@ -13,12 +14,22 @@ public: ~RibFileStack(); bool pushFile(QString* path); bool pushFile(QFile* file); - QString topNextLine(); - bool isEmpty() const; - bool addSubDirs(QStringList dirs); + bool hasNext() const; + bool addSubDirs(QStringList dirs); + QString nextStatement(int* type, bool manageReadArchive = true); + bool readArchive(QString line); private: QStack< QPair* >* stack; QString templateDir; - bool popFile(); QStringList subDir; + bool popFile(); + int isRibProcedure(QString line) const; + bool inString(QString line) const; + QString nextLine; + int nextLineType; + QString topNextLine(bool* end); + + QHash* ribProc; + + }; diff --git a/src/fgt/filter_hqrender/filter_hqrender.cpp b/src/fgt/filter_hqrender/filter_hqrender.cpp index 29c6caf33..f4bd432ae 100644 --- a/src/fgt/filter_hqrender/filter_hqrender.cpp +++ b/src/fgt/filter_hqrender/filter_hqrender.cpp @@ -85,18 +85,7 @@ void FilterHighQualityRender::initParameterSet(QAction *action, MeshModel &m, Ri { switch(ID(action)) { case FP_HIGHQUALITY_RENDER : - { - //parlst.addParam(new RichInt("FormatX", 800, "Format X")); - //parlst.addParam(new RichInt("FormatY", 600, "Format Y")); - parlst.addParam(new RichInt("FormatX", 320, "Format X")); - parlst.addParam(new RichInt("FormatY", 200, "Format Y")); - parlst.addParam(new RichFloat("PixelAspectRatio", 1.0, "Pixel aspect ratio")); - parlst.addParam(new RichBool("Autoscale",true,"Auto-scale mesh","Check if the object will be scaled on render scene")); - QStringList alignValueList = (QStringList() << "Center" << "Top" << "Bottom"); - parlst.addParam(new RichEnum("AlignX",0,alignValueList,"Align X")); - parlst.addParam(new RichEnum("AlignY",0,alignValueList,"Align Y")); - parlst.addParam(new RichEnum("AlignZ",0,alignValueList,"Align Z")); - + { //update the template list templates = QStringList(); foreach(QString subDir, templatesDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) { @@ -110,18 +99,24 @@ void FilterHighQualityRender::initParameterSet(QAction *action, MeshModel &m, Ri qDebug(qPrintable(this->errorMessage)); } parlst.addParam(new RichEnum("scene",0,templates,"Select scene")); - //parlst.addParam(new RichInt("frames",0, "Number of frames for animation (0 for no animation)")); + //parlst.addParam(new RichInt("frames",0, "Number of frames for animation (0 for no animation)")); parlst.addParam(new RichString("ImageName", "default", "Name of output image")); parlst.addParam(new RichEnum("ImageFormat", 0, imageFormatsSupported, "Output image format")); - - //DON'T WORK!!not implemented - //delRibFiles = true; - //FileValue fv(""); - //parlst.addParam(new RichSaveFile("SceneName",&fv,&FileDecoration(&fv,".rib","Name of file rib to save","If not specified, the files will be removed"))); + parlst.addParam(new RichBool("ShowResult",true,"Show the images created?","If checked a window with the created images will be showed at finish")); + //parlst.addParam(new RichInt("FormatX", 800, "Format X")); + //parlst.addParam(new RichInt("FormatY", 600, "Format Y")); + parlst.addParam(new RichInt("FormatX", 320, "Format X")); + parlst.addParam(new RichInt("FormatY", 200, "Format Y")); + parlst.addParam(new RichFloat("PixelAspectRatio", 1.0, "Pixel aspect ratio")); + parlst.addParam(new RichBool("Autoscale",true,"Auto-scale mesh","Check if the object will be scaled on render scene")); + QStringList alignValueList = (QStringList() << "Center" << "Top" << "Bottom"); + parlst.addParam(new RichEnum("AlignX",0,alignValueList,"Align X")); + parlst.addParam(new RichEnum("AlignY",0,alignValueList,"Align Y")); + parlst.addParam(new RichEnum("AlignZ",0,alignValueList,"Align Z")); parlst.addParam(new RichBool("SaveScene",false,"Save the files created for rendering?", "If checked the scene will be created in the same directory of mesh, else in the temporary system folder and then removed")); break; - } + } default : assert(0); } } @@ -129,13 +124,8 @@ void FilterHighQualityRender::initParameterSet(QAction *action, MeshModel &m, Ri // The Real Core Function doing the actual mesh processing. bool FilterHighQualityRender::applyFilter(QAction *filter, MeshModel &m, RichParameterSet & par, vcg::CallBackPos *cb) { - // Typical usage of the callback for showing a nice progress bar in the bottom. - // First parameter is a 0..100 number indicating percentage of completion, the second is an info string. - //cb(100*i/m.cm.vert.size(), "Randomly Displacing..."); - // Log function dump textual info in the lower part of the MeshLab screen. - //Log(GLLogStream::FILTER,"Successfully displaced %i vertices",m.cm.vn); this->cb = cb; - QTime tt; tt.start(); //debug + QTime tt; tt.start(); //time for debuging qDebug("Starting apply filter"); QString templateName = templates.at(par.getEnum("scene")); @@ -154,6 +144,7 @@ bool FilterHighQualityRender::applyFilter(QAction *filter, MeshModel &m, RichPar //creating of destination directory bool delRibFiles = !par.getBool("SaveScene"); + //if SaveScene is true create in same mesh directory, otherwise in system temporary directry QDir destDir = QDir::temp(); //system temporary directry if(!delRibFiles) { //destDir = QDir(par.getSaveFileName("SceneName")); @@ -208,14 +199,14 @@ bool FilterHighQualityRender::applyFilter(QAction *filter, MeshModel &m, RichPar //check if the final rib file will render any image if(imagesRendered.size() == 0) { - this->errorMessage = "The template hasn't statement to render any image"; + this->errorMessage = "The template hasn't a statement to render any image"; return false; } //copy the rest of template (shaders, textures, procedural..) - copyFiles(templateDir, destDir, textureDirs); - copyFiles(templateDir, destDir, shaderDirs); - copyFiles(templateDir, destDir, proceduralDirs); + copyFiles(&templateDir, &destDir, &textureDirs); + copyFiles(&templateDir, &destDir, &shaderDirs); + copyFiles(&templateDir, &destDir, &proceduralDirs); qDebug("Copied needed file at %i",tt.elapsed()); QStringList aqsisEnv = QProcess::systemEnvironment(); @@ -383,26 +374,27 @@ bool FilterHighQualityRender::applyFilter(QAction *filter, MeshModel &m, RichPar cb(100, qPrintable("Created " + QString::number(imagesRendered.size())+" images")); //run piqls with rendered image - QProcess piqslProcess; - piqslProcess.setWorkingDirectory(destDirString); - piqslProcess.setEnvironment(aqsisEnv); - toRun = aqsisDir + aqsisBinPath() + QDir::separator() + piqslName(); - //if there'isnt image, it stops before... - foreach(QString img, imagesRendered) { - toRun += " " + img; + if(par.getBool("ShowResult")) { + QProcess piqslProcess; + piqslProcess.setWorkingDirectory(destDirString); + piqslProcess.setEnvironment(aqsisEnv); + toRun = aqsisDir + aqsisBinPath() + QDir::separator() + piqslName(); + //if there'isnt image, it stops before... + foreach(QString img, imagesRendered) { + toRun += " " + img; + } + qDebug("Runnig piqsl command: %s", qPrintable(toRun)); + piqslProcess.start(toRun); + + piqslProcess.waitForFinished(-1); //no check error... + piqslProcess.terminate(); } - qDebug("Runnig piqsl command: %s", qPrintable(toRun)); - piqslProcess.start(toRun); - - piqslProcess.waitForFinished(-1); //no check error... - piqslProcess.terminate(); - //only now we can delete recursively all created files (if it's required) if(delRibFiles) { QString dirName = destDir.dirName(); QDir temp = destDir; temp.cdUp(); - delDir(temp, dirName); + delDir(&temp, &dirName); delRibFiles = false; } qDebug("finsish to apply filter at %i",tt.elapsed()); @@ -417,7 +409,7 @@ void FilterHighQualityRender::updateOutputProcess() { QString out = QString::fromLocal8Bit(renderProcess.readAllStandardOutput().data()); //qDebug("aqsis.exe output: %s",qPrintable(out)); out = QStringList(out.trimmed().split(' ')).last(); //take only the last - qDebug("aqsis output taken: %s",qPrintable(out)); + //qDebug("aqsis output taken: %s",qPrintable(out)); int currentCb = int(out.toFloat()); if(currentCb < lastCb) worldBeginRendered++; @@ -425,7 +417,7 @@ void FilterHighQualityRender::updateOutputProcess() { QString::number(worldBeginRendered) + "/" + QString::number(numOfWorldBegin) + ")"; int value = int( (100 * (worldBeginRendered - 1) + currentCb ) / numOfWorldBegin ); cb(value, qPrintable(msg)); //update progress bar - qDebug("cb value: worldBeginRendered %i last %i current %i effective %i" ,worldBeginRendered,lastCb,currentCb,value); + //qDebug("cb value: worldBeginRendered %i last %i current %i effective %i" ,worldBeginRendered,lastCb,currentCb,value); lastCb = currentCb; //restore the signal handling connect(&renderProcess, SIGNAL(readyReadStandardOutput()),this, SLOT(updateOutputProcess())); diff --git a/src/fgt/filter_hqrender/filter_hqrender.h b/src/fgt/filter_hqrender/filter_hqrender.h index 3671152ea..346ffbaad 100644 --- a/src/fgt/filter_hqrender/filter_hqrender.h +++ b/src/fgt/filter_hqrender/filter_hqrender.h @@ -1,113 +1,114 @@ -#ifndef FILTER_HQRENDER_H -#define FILTER_HQRENDER_H - -#include -#include -#include -#include +#ifndef FILTER_HQRENDER_H +#define FILTER_HQRENDER_H + +#include +#include +#include +#include #include -#include "RibFileStack.h" -#include "export_rib.h" -#include "utilities_hqrender.h" -#include -#include - - - -class FilterHighQualityRender : public QObject, public MeshFilterInterface -{ - Q_OBJECT - Q_INTERFACES(MeshFilterInterface) - -public: - - enum { FP_HIGHQUALITY_RENDER } ; - - FilterHighQualityRender(); - - //filter_hqrender.cpp - virtual QString filterName(FilterIDType filter) const; - virtual QString filterInfo(FilterIDType filter) const; - virtual bool autoDialog(QAction *) {return true;} - virtual void initParameterSet(QAction *,MeshModel &m, RichParameterSet & param); - virtual bool applyFilter(QAction *filter, MeshModel &m, RichParameterSet & param, vcg::CallBackPos * cb) ; - virtual FilterClass getClass(QAction *a); - -private slots: - void updateOutputProcess(); - void errSgn(); -private: - vcg::CallBackPos * cb; - int worldBeginRendered, numOfWorldBegin, lastCb; //for progress bar update - QProcess renderProcess; - QDir templatesDir; //directory of templates ("render_template") - QStringList templates; //list of templates found - QStringList imageFormatsSupported; //list of image formats supported by qt for conversion of final image - - enum alignValue { CENTER, TOP, BOTTOM }; - bool convertedGeometry; - - inline const QString aqsisName() - { - #if defined(Q_OS_WIN) - return QString("aqsis.exe"); - #elif defined(Q_OS_MAC) - return QString("aqsis"); - #endif - } - inline const QString aqslName() - { - #if defined(Q_OS_WIN) - return QString("aqsl.exe"); - #elif defined(Q_OS_MAC) - return QString("aqsl"); - #endif - } - inline const QString teqserName() - { - #if defined(Q_OS_WIN) - return QString("teqser.exe"); - #elif defined(Q_OS_MAC) - return QString("teqser"); - #endif - } - inline const QString piqslName() - { - #if defined(Q_OS_WIN) - return QString("piqsl.exe"); - #elif defined(Q_OS_MAC) - return QString("piqsl"); - #endif - } - inline const QString aqsisBinPath() - { - #if defined(Q_OS_WIN) - return QString("bin"); - #elif defined(Q_OS_MAC) - return QString("/Contents/Resources/bin/"); - #endif - } - - inline const QString mainFileName() { return QString("scene.rib"); } - - //parser_rib.cpp - int numberOfDummies, numOfObject; - struct ObjValues { - vcg::Matrix44f objectMatrix; - 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); - 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); -}; - -#endif +#include "RibFileStack.h" +#include "export_rib.h" +#include "utilities_hqrender.h" +#include +#include + + + +class FilterHighQualityRender : public QObject, public MeshFilterInterface +{ + Q_OBJECT + Q_INTERFACES(MeshFilterInterface) + +public: + + enum { FP_HIGHQUALITY_RENDER } ; + + FilterHighQualityRender(); + + //filter_hqrender.cpp + virtual QString filterName(FilterIDType filter) const; + virtual QString filterInfo(FilterIDType filter) const; + virtual bool autoDialog(QAction *) {return true;} + virtual void initParameterSet(QAction *,MeshModel &m, RichParameterSet & param); + virtual bool applyFilter(QAction *filter, MeshModel &m, RichParameterSet & param, vcg::CallBackPos * cb) ; + virtual FilterClass getClass(QAction *a); + +private slots: + void updateOutputProcess(); + void errSgn(); +private: + vcg::CallBackPos * cb; + int worldBeginRendered, numOfWorldBegin, lastCb; //for progress bar update + QProcess renderProcess; + QDir templatesDir; //directory of templates ("render_template") + QStringList templates; //list of templates found + QStringList imageFormatsSupported; //list of image formats supported by qt for conversion of final image + + enum alignValue { CENTER, TOP, BOTTOM }; + bool convertedGeometry; + + inline const QString aqsisName() + { + #if defined(Q_OS_WIN) + return QString("aqsis.exe"); + #elif defined(Q_OS_MAC) + return QString("aqsis"); + #endif + } + inline const QString aqslName() + { + #if defined(Q_OS_WIN) + return QString("aqsl.exe"); + #elif defined(Q_OS_MAC) + return QString("aqsl"); + #endif + } + inline const QString teqserName() + { + #if defined(Q_OS_WIN) + return QString("teqser.exe"); + #elif defined(Q_OS_MAC) + return QString("teqser"); + #endif + } + inline const QString piqslName() + { + #if defined(Q_OS_WIN) + return QString("piqsl.exe"); + #elif defined(Q_OS_MAC) + return QString("piqsl"); + #endif + } + inline const QString aqsisBinPath() + { + #if defined(Q_OS_WIN) + return QString("bin"); + #elif defined(Q_OS_MAC) + return QString("/Contents/Resources/bin/"); + #endif + } + + inline const QString mainFileName() { return QString("scene.rib"); } + + //parser_rib.cpp + int numberOfDummies, numOfObject; + struct ObjValues { + vcg::Matrix44f objectMatrix; + 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); + 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); + QStringList readSearchPath(const QStringList* token, int* type); +}; + +#endif diff --git a/src/fgt/filter_hqrender/filter_hqrender.pro b/src/fgt/filter_hqrender/filter_hqrender.pro index 3736254a6..c3082d041 100644 --- a/src/fgt/filter_hqrender/filter_hqrender.pro +++ b/src/fgt/filter_hqrender/filter_hqrender.pro @@ -3,7 +3,8 @@ include (../../shared.pri) HEADERS += filter_hqrender.h \ export_rib.h \ RibFileStack.h \ - utilities_hqrender.h + utilities_hqrender.h \ + ribProcedure.h SOURCES += filter_hqrender.cpp \ diff --git a/src/fgt/filter_hqrender/parser_rib.cpp b/src/fgt/filter_hqrender/parser_rib.cpp index 73e11d6ae..0979f5881 100644 --- a/src/fgt/filter_hqrender/parser_rib.cpp +++ b/src/fgt/filter_hqrender/parser_rib.cpp @@ -1,4 +1,4 @@ -#include "filter_hqrender.h" +#include "filter_hqrender.h" #include using namespace UtilitiesHQR; @@ -48,140 +48,166 @@ bool FilterHighQualityRender::makeScene(MeshModel &m, numOfObject = 0; //reading cycle //int debugCount = 0; - while(!files.isEmpty() && !stop) { + while(!files.hasNext() && !stop) { //if((++debugCount)%200 == 0) qDebug("Time after %i statement: %i",debugCount,tt.elapsed()); bool writeLine = true; - QString line = files.topNextLine(); + int statementType = 0; + QString line = files.nextStatement(&statementType); - //the ReadArchive statement is already handled - QStringList token = line.split(' '); - - //statement to declare other directory for the template - if(token[0].trimmed() == "Option" && token[1].trimmed() == "\"searchpath\"") { - int type = 0; - QStringList dirList = readSearchPath(&files,line,&type); - switch(type) { - case FilterHighQualityRender::ARCHIVE: - files.addSubDirs(dirList); - break; - case FilterHighQualityRender::SHADER: - *shaderDirs = dirList; - break; - case FilterHighQualityRender::TEXTURE: - *textureDirs = dirList; - break; - case FilterHighQualityRender::PROCEDURAL: - *proceduralDirs = dirList; - break; - case FilterHighQualityRender::ERR: - //ignore: maybe an error or another searchpath type (not in RISpec3.2) - break; - } - } - - //there are some statement that make an output. It's need to create the path - if(token[0].trimmed().startsWith("Make")) { - QString path = token[2]; //for MakeTexture, MakeShadow, MakeLatLongEnvironment - if(token[0].trimmed() == "MakeCubeFaceEnvironment") - path = token[7]; - path = getDirFromPath(&path); - //qDebug("check dir! line: %s\npath: %s",qPrintable(line),qPrintable(path)); - checkDir(destDirString,path); - } - - if(token[0].trimmed() == "FrameBegin") { - currentFrame = token[1].trimmed().toInt(); //no check on cast - if(currentFrame == 1) { //questo è casino con animazioni - if(numOfFrames > 0) - isFrameDeclaration = true; - } - } - - //if there's an animation, stop the processing of other possible frame - if(numOfFrames > 0 && currentFrame == 1 && token[0].trimmed() == "FrameEnd") { - fprintf(fout,"%s\n",qPrintable(line)); - writeLine = false; - makeAnimation(fout,numOfFrames,transfCamera,frameDeclaration,par.getString("ImageName")); - stop = true; - } - - //if output is not a file the format must be the same!!framebuffer is ignored and commented - if(token[0].trimmed() == "Display") { - //create the path if needed - QString path = token[1].trimmed(); - path = getDirFromPath(&path); - //qDebug("check dir! line: %s\npath: %s",qPrintable(line),qPrintable(path)); - checkDir(destDirString,path); - - //if there's more "Display" statement with one that's "file" is not considered a final image - if(token[2].trimmed() != "\"framebuffer\"") - if (!anyOtherDisplayType && token[2].trimmed() == "\"file\"") { - currentDisplayTypeIsFile = true; - QString img = token[1].trimmed().remove('\"'); - if(img.startsWith('+')) - img = img.mid(1,img.size()); - *imagesRendered << img; + switch(statementType) { + case ribParser::OPTION: { + QStringList token = ribParser::splitStatement(&line); + //statement to declare other directory for the template + if(token[2] == "searchpath") { + int type = 0; + QStringList dirList = readSearchPath(&token,&type); + switch(type) { + case FilterHighQualityRender::ARCHIVE: + files.addSubDirs(dirList); + break; + case FilterHighQualityRender::SHADER: + *shaderDirs = dirList; + break; + case FilterHighQualityRender::TEXTURE: + *textureDirs = dirList; + break; + case FilterHighQualityRender::PROCEDURAL: + *proceduralDirs = dirList; + + break; + case FilterHighQualityRender::ERR: + //ignore: maybe an error or another searchpath type (not in RISpec3.2) + break; + } } + break; + } + case ribParser::MAKE: + case ribParser::MAKECUBEFACEENVIRONMENT: + { + QStringList token = ribParser::splitStatement(&line); + QString path = token[2]; //for MakeTexture, MakeShadow, MakeLatLongEnvironment + if(statementType == ribParser::MAKECUBEFACEENVIRONMENT) + path = token[7]; + path = getDirFromPath(&path); + //qDebug("check dir! line: %s\npath: %s",qPrintable(line),qPrintable(path)); + checkDir(&destDirString,&path); + break; + } + case ribParser::FRAMEBEGIN: + { + QStringList token = ribParser::splitStatement(&line); + currentFrame = token[1].toInt(); //no check on cast + if(currentFrame == 1) { //questo è casino con animazioni + if(numOfFrames > 0) + isFrameDeclaration = true; + } + break; + } + case ribParser::FRAMEEND: + { + //if there's an animation, stop the processing of other possible frame + if(numOfFrames > 0 && currentFrame == 1) { + fprintf(fout,"%s\n",qPrintable(line)); + writeLine = false; + makeAnimation(fout,numOfFrames,transfCamera,frameDeclaration,par.getString("ImageName")); + stop = true; + } + break; + } + case ribParser::DISPLAY: + { + //if output is not a file the format must be the same!! framebuffer is ignored and commented + QStringList token = ribParser::splitStatement(&line); + //create the path if needed + QString path = token[2]; + path = getDirFromPath(&path); + //qDebug("check dir! line: %s\npath: %s",qPrintable(line),qPrintable(path)); + checkDir(&destDirString,&path); + + //if there's more "Display" statement with one that's "file" is not considered a final image + if(token[5] != "framebuffer") + if (!anyOtherDisplayType && token[5] == "file") { + currentDisplayTypeIsFile = true; + QString img = token[2]; + if(img.startsWith('+')) + img = img.mid(1,img.size()); + *imagesRendered << img; + } + else + anyOtherDisplayType = true; else - anyOtherDisplayType = true; - else - line = "#" + line; //if there's a framebuffer will be open pqsl automatically - } - - //transformation camera - if(numOfFrames > 0 && token[0].trimmed() == "Transform") { - line = readArray(&files,line); - transfCamera = getMatrix(line); - /*transfCamera = readMatrix(&files, line); - writeMatrix(fout,transfCamera); - writeLine = false;*/ - } - - //make another file if there is an animation - if(token[0].trimmed() == "WorldBegin") { - numOfWorldBegin++; - //if there's another type of display the format is not change - if(!anyOtherDisplayType && currentDisplayTypeIsFile) { - fprintf(fout,"%s\n", qPrintable(newFormat)); - frameDeclaration << newFormat; + line = "#" + line; //if there's a framebuffer will be open pqsl automatically + break; } - currentDisplayTypeIsFile = false; - anyOtherDisplayType = false; - //is right?yes,because before the next WorldBegin will there be a new Display statement - - if(numOfFrames > 0) { - isFrameDeclaration = false; - //it's certainly the first WorldBegin - QString filename = destDirString + QDir::separator() + "world.rib"; - fprintf(fout,"ReadArchive \"world.rib\"\n"); - fout = fopen(qPrintable(filename),"wb"); - if(fout == NULL) { + case ribParser::TRANSFORM: + { + //transformation camera + if(numOfFrames > 0) { + //line = readArray(&files,line); //// + transfCamera = getMatrix(line); } + break; + } + case ribParser::WORLDBEGIN: + { + numOfWorldBegin++; + //if there's another type of display the format is not change + if(!anyOtherDisplayType && currentDisplayTypeIsFile) { + fprintf(fout,"%s\n", qPrintable(newFormat)); + frameDeclaration << newFormat; + } + currentDisplayTypeIsFile = false; + anyOtherDisplayType = false; + //is right?yes,because before the next WorldBegin will there be a new Display statement + + //make another file if there is an animation + if(numOfFrames > 0) { + isFrameDeclaration = false; + //it's certainly the first WorldBegin + QString filename = destDirString + QDir::separator() + "world.rib"; + fprintf(fout,"ReadArchive \"world.rib\"\n"); + fout = fopen(qPrintable(filename),"wb"); + if(fout == NULL) { + } + } + break; + } + case ribParser::WORLDEND: + { + if(numOfFrames > 0) { + //it's certainly the first WorldEnd + fprintf(fout,"%s\n",qPrintable(line)); + fclose(fout); + fout = fmain; + writeLine = false; + } + break; + } + case ribParser::ATTRIBUTEBEGIN: + { + //is an object + //write it (o convert it if it's named dummy) to another file + QString filename = parseObject(&files, destDirString, currentFrame, m, par, textureList); + qDebug("fuori: %s",qPrintable(filename)); + writeLine = false; + fprintf(fout,"ReadArchive \"%s\"\n",qPrintable(filename)); + break; + } + case ribParser::NOMORESTATEMENT: + { + qDebug("Stack empty"); + stop = true; + writeLine = false; } } - if(numOfFrames > 0 && token[0].trimmed() == "WorldEnd") { - //it's certainly the first WorldEnd - fprintf(fout,"%s\n",qPrintable(line)); - fclose(fout); - fout = fmain; - writeLine = false; - } - //is an object - if(token[0].trimmed() == "AttributeBegin") { - //write it (o convert it if it's named dummy) to another file - QString filename = parseObject(&files, destDirString, currentFrame, m, par, textureList); - qDebug("fuori: %s",qPrintable(filename)); - writeLine = false; - fprintf(fout,"ReadArchive \"%s\"\n",qPrintable(filename)); - } - if(writeLine) { //copy the same line in file fprintf(fout,"%s\n",qPrintable(line)); } - if(isFrameDeclaration && token[0].trimmed() != "FrameBegin" && token[0].trimmed() != "Transform") + if(isFrameDeclaration && statementType != ribParser::FRAMEBEGIN && statementType != ribParser::TRANSFORM) frameDeclaration << line; } fclose(fout); @@ -194,105 +220,97 @@ QString FilterHighQualityRender::parseObject(RibFileStack* files, QString destDi FILE* fout = fopen(qPrintable(destDirString + QDir::separator() + name),"wb"); if(fout == NULL) { } - + qDebug("parse object"); //if it's a dummy object, i need the the follow value: ObjValues* current = new ObjValues(); current->objectMatrix = vcg::Matrix44f::Identity(); //default RIS bound is infinite for(int i=0; i< 6; i=i+2) - current->objectBound[i] = std::numeric_limits::min(); + current->objectBound[i] = std::numeric_limits::min(); for(int i=1; i<6; i=i+2) - current->objectBound[i] = std::numeric_limits::max(); + current->objectBound[i] = std::numeric_limits::max(); - //write AttributeBegin statement + //write AttributeBegin statement (already readed) fprintf(fout,"AttributeBegin\n"); //write next statement and looking for an object called "dummy"... int c = 1; //number of nestled "AttributeBegin" - bool isDummy = false; - while(!files->isEmpty() && c != 0) { - QString line = files->topNextLine(); - QStringList token = line.split(' '); + bool isDummy = false; //if is dummy stops to write + while(c != 0 && !files->hasNext()) { + int statementType = 0; + QString line = files->nextStatement(&statementType); - //the surface shader remain the same of template (maybe many line and many shader) - if(token[0].trimmed() == "Surface") { - current->objectShader << line; - fprintf(fout,"%s\n",qPrintable(line)); - line = files->topNextLine(); - while(line.trimmed().startsWith('\"')) - { - current->objectShader << line; - fprintf(fout,"%s\n",qPrintable(line)); - line = files->topNextLine(); + switch(statementType) { + case ribParser::ATTRIBUTEBEGIN: + ++c; + break; + case ribParser::ATTRIBUTEEND: + --c; + break; + case ribParser::SURFACE: + { + //the surface shader remain the same of template + current->objectShader << line; + break; } - token = line.split(' '); - } - //from previous "if", if condition is true, exit a new line - - if(token[0].trimmed() == "AttributeEnd") - --c; - - if(token[0].trimmed() == "AttributeBegin") - ++c; - - //take the transformation matrix of object - if(token[0].trimmed() == "Transform") { - line = readArray(files,line); - current->objectMatrix = getMatrix(line); - } - - //take the transformation bound - if(token[0].trimmed() == "Bound") { - if(line.contains('[')) - line = readArray(files, line); - line.remove('['); - line.remove(']'); - token = line.split(' '); - for(int i=0; i<6; i++) { - current->objectBound[i] = token[i+1].toFloat(); + case ribParser::TRANSFORM: + { + current->objectMatrix = getMatrix(line); + break; } - } - - if(token[0].trimmed() == "Attribute") - { - qDebug("%s\n",qPrintable(line)); - line = readArray(files, line); //if there's an array, maybe contains '\n' - token = line.split(' '); - qDebug("%s\n",qPrintable(line)); - - //RISpec3.2 not specify how many attribute are there in renderman - //"user id" and "displacemetbound" don't be needed (perhaps) - if(token[1].trimmed() == "\"user\"" && current->objectId == "") - current->objectId = line; //only first time (can be nestled id attributes) - - if(token[1].trimmed() == "\"displacementbound\"") - current->objectDisplacementbound = line; - - if(token[1].trimmed() == "\"identifier\"") { - int index = 2; - if(token[2].trimmed() == "\"string") - index++; //is "string name".. - - if(token[index].trimmed() == "\"name\"" || token[index].trimmed() == "name\"") { - QString str = token[++index]; - if(token.size()>(index+1)) - for(int i = index + 1; i < token.size(); i++) { - str += " " + token[i]; //the remainig tokens are joined together - } - - str = readArray(files, str); - //remove the character [ ] " - str.remove('['); - str.remove(']'); - str.remove('\"'); - str = str.simplified(); - - if(str.toLower() == "dummy") //found a dummy object? - isDummy = true; + case ribParser::BOUND: + { + //take the transformation bound + QStringList token = ribParser::splitStatement(&line); + int index = 1; + if(token[index] == "[") + index++; + for(int i=0; i<6; i++) { + bool isNumber; + float number = token[index+i].toFloat(&isNumber); + if(isNumber) + current->objectBound[i] = number; } + break; + } + case ribParser::ATTRIBUTE: + { + QStringList token = ribParser::splitStatement(&line); + QString deb = ""; + foreach(QString s,token) + deb += "str: " + s + "\n"; + qDebug(qPrintable(deb)); + //RISpec3.2 not specify what and how many attributes are there in renderman + //"user id" and "displacemetbound" don't be needed (perhaps) + if(token[2] == "user" && current->objectId == "") + current->objectId = line; //only first time (can be nestled id attributes) + + if(token[2] == "displacementbound") + current->objectDisplacementbound = line; + + if(token[2] == "identifier") { + //Attribute "identifier" "string name" [ "object name" ] + if(token[5] == "string name" || token[5] == "name") { + int index = 7; + if(token[index] == "[") + index++; + if(token[index] == "\"") + index++; + if(token[index].trimmed().toLower() == "dummy") {//found a dummy object? + qDebug("object name is dummy"); + isDummy = true; + } + } + } + break; + } + case ribParser::NOMORESTATEMENT: + { + c = 0; + break; } } - + if(!isDummy) { fprintf(fout,"%s\n",qPrintable(line)); } @@ -300,6 +318,7 @@ QString FilterHighQualityRender::parseObject(RibFileStack* files, QString destDi fclose(fout); if(isDummy) { + qDebug("Found dummy object"); //delete the previous file QDir tmp = QDir(destDirString); tmp.remove(name); @@ -325,7 +344,8 @@ int FilterHighQualityRender::convertObject(FILE* fout, QString destDir, MeshMode //name fprintf(fout,"Attribute \"identifier\" \"string name\" [ \"dummy\" ]\n"); //id - fprintf(fout,"%s\n",dummyValues->objectId); + if(dummyValues->objectId != "") + fprintf(fout,"%s\n",qPrintable(dummyValues->objectId.trimmed())); //modify the transformation matrix vcg::Matrix44f scaleMatrix = vcg::Matrix44f::Identity(); @@ -373,7 +393,7 @@ int FilterHighQualityRender::convertObject(FILE* fout, QString destDir, MeshMode } vcg::Matrix44f alignMatrix; alignMatrix = alignMatrix.SetTranslate(dx,dy,dz); - vcg::Matrix44f templateMatrix = dummyValues->objectMatrix; + vcg::Matrix44f templateMatrix = dummyValues->objectMatrix; //by default is identity vcg::Matrix44f result = templateMatrix * alignMatrix * scaleMatrix * translateBBMatrix; //write transformation matrix (after transpose it) @@ -392,17 +412,18 @@ int FilterHighQualityRender::convertObject(FILE* fout, QString destDir, MeshMode //force the shading interpolation to smooth fprintf(fout,"ShadingInterpolation \"smooth\"\n"); //displacementBound - fprintf(fout,"%s\n",dummyValues->objectDisplacementbound); + if(dummyValues->objectDisplacementbound != "") + fprintf(fout,"%s\n",qPrintable(dummyValues->objectDisplacementbound.trimmed())); //shader foreach(QString line, dummyValues->objectShader) { - fprintf(fout,"%s\n",line); + fprintf(fout,"%s\n",qPrintable(line.trimmed())); } //texture mapping (are TexCoord needed for texture mapping?) if(!textureList->empty() > 0 && (m.cm.HasPerWedgeTexCoord() || m.cm.HasPerVertexTexCoord())) { //multi-texture don't work!I need ad-hoc shader and to read the texture index for vertex.. //foreach(QString textureName, *textureList) { - //read only the one texture + //read only the first texture QString textureName = textureList->first(); fprintf(fout,"Surface \"paintedplastic\" \"Kd\" 1.0 \"Ks\" 0.0 \"texturename\" [\"%s.tx\"]\n", qPrintable(getFileNameFromPath(&textureName,false))); } @@ -456,49 +477,30 @@ int FilterHighQualityRender::makeAnimation(FILE* fout, int numOfFrame,vcg::Matri } //return an a list of directory (separated by ':' character) -QStringList FilterHighQualityRender::readSearchPath(RibFileStack* files,QString line, int* type) { - QStringList dirs; - QStringList token = line.split(" "); - if(!(token[0].trimmed() == "Option" && token[1].trimmed() == "\"searchpath\"")) { - *type = FilterHighQualityRender::ERR; - return dirs; - } +QStringList FilterHighQualityRender::readSearchPath(const QStringList* token, int* type) { //the line maybe: Option "searchpath" "string type" [ ..values..] // or: Option "searchpath" "type" [ ..values..] - int index = 2; - if(token[2].trimmed() == "\"string") - index++; //is "string type".. - if(token[index].trimmed() == "\"archive\"" || token[index].trimmed() == "archive\"") + int index = 5; + *type = FilterHighQualityRender::ERR; + if((*token)[index] == "archive" || (*token)[index] == "string archive") *type = FilterHighQualityRender::ARCHIVE; - if(token[index].trimmed() == "\"shader\"" || token[index].trimmed() == "shader\"") + if((*token)[index] == "shader" || (*token)[index] == "string shader") *type = FilterHighQualityRender::SHADER; - if(token[index].trimmed() == "\"texture\"" || token[index].trimmed() == "texture\"") + if((*token)[index] == "texture" || (*token)[index] == "string texture") *type = FilterHighQualityRender::TEXTURE; - if(token[index].trimmed() == "\"procedural\"" || token[index].trimmed() == "procedural\"") + if((*token)[index] == "procedural" || (*token)[index] == "string procedural") *type = FilterHighQualityRender::PROCEDURAL; - - QString str = token[++index]; - if(token.size()>(index+1)) { - for(int i = index + 1; i < token.size(); i++) { - str += " " + token[i]; //the remainig tokens are joined together - } - } - //maybe that the array is defined over more line - str = readArray(files,str); - str = str.simplified(); - if(str.startsWith('[') && str.endsWith(']')) { - //remove the character [ ] " - str.remove('['); - str.remove(']'); - str.remove('\"'); - str = str.simplified(); - dirs = str.split(':'); //it's the standard method divide dirs with character ':' ? - } else { - *type = FilterHighQualityRender::ERR; - } + index = 7; + if((*token)[index] == "[") + index++; + if((*token)[index] == "\"") + index++; + //else err? + QStringList dirs = (*token)[index].split(':'); //it's the standard method divide dirs with character ':' ? return dirs; } +//write a vcg::Matrix44f to file int FilterHighQualityRender::writeMatrix(FILE* fout, vcg::Matrix44f matrix, bool transposed) { fprintf(fout,"Transform [ "); for(int i = 0; i<4; i++) @@ -508,7 +510,7 @@ int FilterHighQualityRender::writeMatrix(FILE* fout, vcg::Matrix44f matrix, bool return 0; } -//get a matrix from line (and transpose it) +//get a vcg::Matrix44f from line (and transpose it) vcg::Matrix44f FilterHighQualityRender::getMatrix(QString matrixString) { float t[16]; int k=0; @@ -525,12 +527,4 @@ vcg::Matrix44f FilterHighQualityRender::getMatrix(QString matrixString) { } vcg::Matrix44f tempMatrix(t); return tempMatrix.transpose(); -} - -//read array from the rib stack (an array can be contain '\n' character) -QString FilterHighQualityRender::readArray(RibFileStack* files, QString arrayString) { - QString str = arrayString; - while( (str.count('[') - str.count(']')) > 0 && !files->isEmpty()) - str += " " + files->topNextLine(); - return str; //a string with array -} +} \ No newline at end of file diff --git a/src/fgt/filter_hqrender/ribProcedure.h b/src/fgt/filter_hqrender/ribProcedure.h new file mode 100644 index 000000000..d8c43f0c4 --- /dev/null +++ b/src/fgt/filter_hqrender/ribProcedure.h @@ -0,0 +1,186 @@ +#include +#include + +class ribParser { +public: + enum ribProcedure { + NOTAPROCEDURE, + ATTRIBUTE, + ATTRIBUTEBEGIN, + ATTRIBUTEEND, + BOUND, + DISPLAY, + FRAMEBEGIN, + FRAMEEND, + MAKE, + MAKECUBEFACEENVIRONMENT, + OPTION, + READARCHIVE, + SURFACE, + TRANSFORM, + WORLDBEGIN, + WORLDEND, + COMMENT, + OTHER, + NOMORESTATEMENT + }; + + static QHash* initHash() { + QHash* proc = new QHash(); + proc->insert("ArchiveRecord", ribParser::OTHER); + proc->insert("AreaLightSource", ribParser::OTHER); + proc->insert("Atmosphere", ribParser::OTHER); + proc->insert("Attribute", ribParser::ATTRIBUTE); + proc->insert("AttributeBegin", ribParser::ATTRIBUTEBEGIN); + proc->insert("AttributeEnd", ribParser::ATTRIBUTEEND); + proc->insert("Basis", ribParser::OTHER); + proc->insert("Begin", ribParser::OTHER); + proc->insert("Blobby", ribParser::OTHER); + proc->insert("Bound", ribParser::BOUND); + proc->insert("Clipping", ribParser::OTHER); + proc->insert("ClippingPlane", ribParser::OTHER); + proc->insert("Color", ribParser::OTHER); + proc->insert("ColorSamples", ribParser::OTHER); + proc->insert("ConcatTransform", ribParser::OTHER); + proc->insert("Cone", ribParser::OTHER); + proc->insert("Context", ribParser::OTHER); + proc->insert("CoordinateSystem", ribParser::OTHER); + proc->insert("CoordSysTransform", ribParser::OTHER); + proc->insert("CropWindow", ribParser::OTHER); + proc->insert("Curves", ribParser::OTHER); + proc->insert("Cylinder", ribParser::OTHER); + proc->insert("Declare", ribParser::OTHER); + proc->insert("DepthOfField", ribParser::OTHER); + proc->insert("Detail", ribParser::OTHER); + proc->insert("DetailRange", ribParser::OTHER); + proc->insert("Disk", ribParser::OTHER); + proc->insert("Displacement", ribParser::OTHER); + proc->insert("Display", ribParser::DISPLAY); + proc->insert("End", ribParser::OTHER); + proc->insert("ErrorHandler", ribParser::OTHER); + proc->insert("Exposure", ribParser::OTHER); + proc->insert("Exterior", ribParser::OTHER); + proc->insert("Format", ribParser::OTHER); + proc->insert("FrameAspectRatio", ribParser::OTHER); + proc->insert("FrameBegin", ribParser::FRAMEBEGIN); + proc->insert("FrameEnd", ribParser::FRAMEEND); + proc->insert("GeneralPolygon", ribParser::OTHER); + proc->insert("GeometricApproximation", ribParser::OTHER); + proc->insert("Geometry", ribParser::OTHER); + proc->insert("GetContext", ribParser::OTHER); + proc->insert("Hider", ribParser::OTHER); + proc->insert("Hyperboloid", ribParser::OTHER); + proc->insert("Identity", ribParser::OTHER); + proc->insert("Illuminate", ribParser::OTHER); + proc->insert("Imager", ribParser::OTHER); + proc->insert("Interior", ribParser::OTHER); + proc->insert("LightSource", ribParser::OTHER); + proc->insert("MakeCubeFaceEnvironment", ribParser::MAKECUBEFACEENVIRONMENT); + proc->insert("MakeLatLongEnvironment", ribParser::MAKE); + proc->insert("MakeShadow", ribParser::MAKE); + proc->insert("MakeTexture", ribParser::MAKE); + proc->insert("Matte", ribParser::OTHER); + proc->insert("MotionBegin", ribParser::OTHER); + proc->insert("MotionEnd", ribParser::OTHER); + proc->insert("NuPatch", ribParser::OTHER); + proc->insert("ObjectBegin", ribParser::OTHER); + proc->insert("ObjectEnd", ribParser::OTHER); + proc->insert("ObjectInstance", ribParser::OTHER); + proc->insert("Opacity", ribParser::OTHER); + proc->insert("Option", ribParser::OPTION); + proc->insert("Orientation", ribParser::OTHER); + proc->insert("Paraboloid", ribParser::OTHER); + proc->insert("Patch", ribParser::OTHER); + proc->insert("PatchMesh", ribParser::OTHER); + proc->insert("Perspective", ribParser::OTHER); + proc->insert("PixelFilter", ribParser::OTHER); + proc->insert("PixelSamples", ribParser::OTHER); + proc->insert("PixelVariance", ribParser::OTHER); + proc->insert("Points", ribParser::OTHER); + proc->insert("PointsGeneralPolygons", ribParser::OTHER); + proc->insert("PointsPolygons", ribParser::OTHER); + proc->insert("Polygon", ribParser::OTHER); + proc->insert("Procedural", ribParser::OTHER); + proc->insert("Projection", ribParser::OTHER); + proc->insert("Quantize", ribParser::OTHER); + proc->insert("ReadArchive", ribParser::READARCHIVE); + proc->insert("RelativeDetail", ribParser::OTHER); + proc->insert("ReverseOrientation", ribParser::OTHER); + proc->insert("Rotate", ribParser::OTHER); + proc->insert("Scale", ribParser::OTHER); + proc->insert("ScreenWindow", ribParser::OTHER); + proc->insert("ShadingInterpolation", ribParser::OTHER); + proc->insert("ShadingRate", ribParser::OTHER); + proc->insert("Shutter", ribParser::OTHER); + proc->insert("Sides", ribParser::OTHER); + proc->insert("Skew", ribParser::OTHER); + proc->insert("SolidBegin", ribParser::OTHER); + proc->insert("SolidEnd", ribParser::OTHER); + proc->insert("Sphere", ribParser::OTHER); + proc->insert("SubdivisionMesh", ribParser::OTHER); + proc->insert("Surface", ribParser::SURFACE); + proc->insert("TextureCoordinates", ribParser::OTHER); + proc->insert("Torus", ribParser::OTHER); + proc->insert("Transform", ribParser::TRANSFORM); + proc->insert("TransformBegin", ribParser::OTHER); + proc->insert("TransformEnd", ribParser::OTHER); + proc->insert("TransformPoints", ribParser::OTHER); + proc->insert("Translate", ribParser::OTHER); + proc->insert("TrimCurve", ribParser::OTHER); + proc->insert("version", ribParser::OTHER); //not a procedure, but a keyword + proc->insert("WorldBegin", ribParser::WORLDBEGIN); + proc->insert("WorldEnd", ribParser::WORLDEND); + return proc; + } + + //split a statement in word (strings are unique word, like '\"' , '[' and ']' ) + static QStringList splitStatement(const QString* line) { + QString str = line->trimmed(); + + QStringList list = QStringList(); + QString word = ""; + bool string = false, slash = false; + for(int i = 0; ileft(path->lastIndexOf(QDir::separator())); //don't work :/ if(path->lastIndexOf('\\') == -1 && path->lastIndexOf('/') == -1) return "."; return path->left(std::max(path->lastIndexOf('\\'),path->lastIndexOf('/'))); } -QString UtilitiesHQR::getFileNameFromPath(QString* path, bool type) { +QString UtilitiesHQR::getFileNameFromPath(const QString* path, bool type) { //return path->right(path->size() - 1 - path->lastIndexOf(QDir::separator())); //don't work :/ QString temp = path->right(path->size() - 1 - std::max(path->lastIndexOf('\\'),path->lastIndexOf('/'))); if(type) @@ -18,7 +18,7 @@ QString UtilitiesHQR::getFileNameFromPath(QString* path, bool type) { } //if path contains a space, is wrapped in quotes (e.g. ..\"Program files"\..) -QString UtilitiesHQR::quotesPath(QString* path) { +QString UtilitiesHQR::quotesPath(const QString* path) { QStringList dirs = path->split(QDir::separator()); QString temp(""); for(int i = 0; i < dirs.size(); i++) { @@ -33,9 +33,9 @@ QString UtilitiesHQR::quotesPath(QString* path) { } //if dir not exist, create it -bool UtilitiesHQR::checkDir(QString destDirString, QString path) { - QDir destDir(destDirString); - QStringList pathDirs = path.split('/'); +bool UtilitiesHQR::checkDir(const QString* destDirString, const QString* path) { + QDir destDir(*destDirString); + QStringList pathDirs = path->split('/'); foreach(QString dir, pathDirs) { if(!destDir.cd(dir)) { destDir.mkdir(dir); @@ -47,9 +47,9 @@ bool UtilitiesHQR::checkDir(QString destDirString, QString path) { } //take all files in fromDir/[dirs] directories and copy them in dest/[dirs] -bool UtilitiesHQR::copyFiles(QDir fromDir, QDir destDir, QStringList dirs) { - QDir src = fromDir, dest = destDir; - foreach(QString dir, dirs) { +bool UtilitiesHQR::copyFiles(const QDir* fromDir, const QDir* destDir, const QStringList* dirs) { + QDir src = *fromDir, dest = *destDir; + foreach(QString dir, *dirs) { if(dir != "." && src.cd(dir)) { if(!dest.mkdir(dir)) { if(!dest.cd(dir)) @@ -71,26 +71,26 @@ bool UtilitiesHQR::copyFiles(QDir fromDir, QDir destDir, QStringList dirs) { } //delete a directory and all file and subdirectory (recursive calls) -bool UtilitiesHQR::delDir(QDir dir, QString toDel) { - qDebug("Deleting: %s in %s", qPrintable(toDel), qPrintable(dir.absolutePath())); - if(!dir.rmdir(toDel)) { - dir.cd(toDel); - qDebug("I'm in %s", qPrintable(dir.absolutePath())); - QStringList dirs = dir.entryList(QDir::Files|QDir::NoDotAndDotDot); +bool UtilitiesHQR::delDir(QDir* dir, const QString* toDel) { + qDebug("Deleting: %s in %s", qPrintable(*toDel), qPrintable(dir->absolutePath())); + if(!dir->rmdir(*toDel)) { + dir->cd(*toDel); + qDebug("I'm in %s", qPrintable(dir->absolutePath())); + QStringList dirs = dir->entryList(QDir::Files|QDir::NoDotAndDotDot); foreach(QString entry, dirs) { - qDebug("Cycle1 deleting file: %s in %s", qPrintable(entry), qPrintable(dir.absolutePath())); - dir.remove(entry); + qDebug("Cycle1 deleting file: %s in %s", qPrintable(entry), qPrintable(dir->absolutePath())); + dir->remove(entry); } - dirs = dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot); + dirs = dir->entryList(QDir::Dirs|QDir::NoDotAndDotDot); foreach(QString entry, dirs) { - qDebug("Cycle2 deleting dir: %s in %s", qPrintable(entry), qPrintable(dir.absolutePath())); - if(!dir.rmdir(entry)) { - QDir temp = dir; - delDir(temp, entry); + qDebug("Cycle2 deleting dir: %s in %s", qPrintable(entry), qPrintable(dir->absolutePath())); + if(!dir->rmdir(entry)) { + QDir temp = *dir; + delDir(&temp, &entry); } } - dir.cdUp(); - if(!dir.rmdir(toDel)) + dir->cdUp(); + if(!dir->rmdir(*toDel)) return false; } return true; diff --git a/src/fgt/filter_hqrender/utilities_hqrender.h b/src/fgt/filter_hqrender/utilities_hqrender.h index bf3ab9195..eb69b2ecc 100644 --- a/src/fgt/filter_hqrender/utilities_hqrender.h +++ b/src/fgt/filter_hqrender/utilities_hqrender.h @@ -4,11 +4,11 @@ #include namespace UtilitiesHQR { - QString getDirFromPath(QString* path); - QString getFileNameFromPath(QString* path, bool type = true); - QString quotesPath(QString* path); - bool checkDir(QString destDirString, QString path); - bool copyFiles(QDir templateDir,QDir destDir,QStringList dirs); - bool delDir(QDir dir, QString toDel); + QString getDirFromPath(const QString* path); + QString getFileNameFromPath(const QString* path, bool type = true); + QString quotesPath(const QString* path); + bool checkDir(const QString* destDirString, const QString* path); + bool copyFiles(const QDir* templateDir, const QDir* destDir, const QStringList* dirs); + bool delDir(QDir* dir, const QString* toDel); int numberOfCiphers(int number); }; \ No newline at end of file