void PhotoTexturingWidget::bakeTextures(){ FilterParameterSet combineParamSet = loadDefaultBakeSettings(); //creating template name for baked texture file QFileInfo fi = QFileInfo(mesh->fileName.c_str()); QString bTextureFile = fi.baseName()+"_baked.png"; if (QFile(bTextureFile).exists()){ int count = 1; while(QFile(bTextureFile).exists()){ bTextureFile = fi.baseName()+"_baked_"; int max = 1000; while(count<max){ bTextureFile+="0"; max/=10; } bTextureFile+=QString::number(count)+".png"; count++; } } combineParamSet.addString(PhotoTexturer::BAKE_MERGED_TEXTURE,bTextureFile,"Merged Texture Filename:",""); GenericParamDialog ad(this,&combineParamSet,"Texture Baking Parameters"); int result=ad.exec(); int textureId =0; if (result == 1){ saveDefaultBakeSettings(combineParamSet); textureId = photoTexturer->bakeTextures(mesh,&combineParamSet); } update(); updateGLAreaTextures(); }
//添加元素 void FilterParameter::addQDomElement(FilterParameterSet &par, QDomElement &np) { QString name=np.attribute("name"); QString type=np.attribute("type"); qDebug(" Reading Param with name %s : %s",qPrintable(name),qPrintable(type)); if(type=="Bool") { par.addBool(name,np.attribute("value")!=QString("false")); return; } if(type=="Int") { par.addInt(name,np.attribute("value").toInt()); return; } if(type=="Float") { par.addFloat(name,np.attribute("value").toDouble()); return; } if(type=="String") { par.addString(name,np.attribute("value")); return; } if(type=="AbsPerc") { par.addAbsPerc(name,np.attribute("value").toFloat(),np.attribute("min").toFloat(),np.attribute("max").toFloat()); return; } if(type=="Color") { par.addColor(name,QColor::QColor(np.attribute("rgb").toUInt())); return; } if(type=="Matrix44") { Matrix44f mm; for(int i=0;i<16;++i) mm.V()[i]=np.attribute(QString("val")+QString::number(i)).toDouble(); par.addMatrix44(name,mm); return; } if(type=="Enum") { QStringList list = QStringList::QStringList(); for(QDomElement ns = np.firstChildElement("EnumString"); !ns.isNull(); ns = ns.nextSiblingElement("EnumString")){ list<<ns.attribute("value"); } par.addEnum(name,np.attribute("value").toInt(),list); return; } if(type == MeshPointerName()) { par.addMesh(name, np.attribute(ValueName()).toInt()); return; } if(type == FloatListName()) { QList<float> values; for(QDomElement listItem = np.firstChildElement(ItemName()); !listItem.isNull(); listItem = listItem.nextSiblingElement(ItemName())) { values.append(listItem.attribute(ValueName()).toFloat()); } par.addFloatList(name,values); return; } if(type == DynamicFloatName()) { par.addDynamicFloat(name, np.attribute(ValueName()).toFloat(), np.attribute(MinName()).toFloat(), np.attribute(MaxName()).toFloat(), np.attribute(MaskName()).toInt()); return; } if(type == OpenFileNameName()) { par.addOpenFileName(name, np.attribute(ValueName())); return; } if(type == SaveFileNameName()) { par.addSaveFileName(name, np.attribute(ValueName())); return; } if(type=="Point3f") { Point3f val; val[0]=np.attribute("x").toFloat(); val[1]=np.attribute("y").toFloat(); val[2]=np.attribute("z").toFloat(); par.addPoint3f(name, val); return; } assert(0); // we are trying to parse an unknown xml element }
void PhotoTexturingWidget::unprojectTextures(){ QSettings ptSettings; QVariant setSmartBlend = ptSettings.value(PhotoTexturer::BAKE_SMARTBLEND,"smartblend.exe"); FilterParameterSet combineParamSet; combineParamSet.addInt(PhotoTexturer::TEXTURE_SIZE_WIDTH,1024,"Image width:",""); combineParamSet.addInt(PhotoTexturer::TEXTURE_SIZE_HEIGHT,1024,"Image height:",""); combineParamSet.addBool(PhotoTexturer::UNPROJECT_ENABLE_ANGLE,true,"Enable angle map:",""); combineParamSet.addInt(PhotoTexturer::UNPROJECT_ANGLE_WEIGHT,1,"Angle map weight:",""); combineParamSet.addFloat(PhotoTexturer::UNPROJECT_ANGLE,85,"Min angle:",""); combineParamSet.addInt(PhotoTexturer::UNPROJECT_ANGLE_SHARPNESS,1,"Angle map sharpness:",""); combineParamSet.addBool(PhotoTexturer::UNPROJECT_ENABLE_DISTANCE,false,"Enable distance map:",""); combineParamSet.addInt(PhotoTexturer::UNPROJECT_DISTANCE_WEIGHT,1,"Distance map weight:",""); combineParamSet.addBool(PhotoTexturer::BAKE_SAVE_UNPROJECT,true,"Save unprojected textures:",""); combineParamSet.addBool(PhotoTexturer::UNPROJECT_ENABLE_EDGE_STRETCHING,false,"Enable Texture edge Stretching:",""); combineParamSet.addInt(PhotoTexturer::UNPROJECT_EDGE_STRETCHING_PASS,2,"Edge Stretching Passes:",""); combineParamSet.addBool(PhotoTexturer::BAKE_MERGE_TEXTURES,true,"Merge unprojected textures:",""); combineParamSet.addEnum(PhotoTexturer::BAKE_MERGE_TYPE,0,QStringList() <<"Merge Faces by Angle"<<"Smartblend","Merge Mode:",""); combineParamSet.addString(PhotoTexturer::BAKE_MERGED_TEXTURE,"","Merged Texture Filename:",""); combineParamSet.addString(PhotoTexturer::BAKE_SMARTBLEND,setSmartBlend.toString(),"smartblend:",""); QListWidgetItem* lwis = ui.textureListWidget->currentItem(); int textureID = lwis[0].type(); GenericParamDialog ad(this,&combineParamSet,"Texture Baking Parameters"); int result=ad.exec(); ptSettings.setValue(PhotoTexturer::BAKE_SMARTBLEND,combineParamSet.getString(PhotoTexturer::BAKE_SMARTBLEND)); if (result == 1){ photoTexturer->unprojectTextures(mesh,textureID,&combineParamSet); } update(); updateGLAreaTextures(); }
FilterParameterSet PhotoTexturingWidget::loadDefaultBakeSettings(){ QSettings ptSettings; QVariant tmpValue; FilterParameterSet combineParamSet; tmpValue= ptSettings.value(PhotoTexturer::TEXTURE_SIZE_WIDTH,1024); combineParamSet.addInt(PhotoTexturer::TEXTURE_SIZE_WIDTH,tmpValue.toInt(),"Image width:",""); tmpValue = ptSettings.value(PhotoTexturer::TEXTURE_SIZE_HEIGHT,1024); combineParamSet.addInt(PhotoTexturer::TEXTURE_SIZE_HEIGHT,tmpValue.toInt(),"Image height:",""); tmpValue = ptSettings.value(PhotoTexturer::UNPROJECT_ENABLE_ANGLE,true); combineParamSet.addBool(PhotoTexturer::UNPROJECT_ENABLE_ANGLE,tmpValue.toBool(),"Enable angle map:",""); tmpValue = ptSettings.value(PhotoTexturer::UNPROJECT_ANGLE_WEIGHT,1); combineParamSet.addInt(PhotoTexturer::UNPROJECT_ANGLE_WEIGHT,tmpValue.toInt(),"Angle map weight:",""); tmpValue = ptSettings.value(PhotoTexturer::UNPROJECT_ANGLE,85.0); combineParamSet.addFloat(PhotoTexturer::UNPROJECT_ANGLE,tmpValue.toDouble(),"Max angle (degrees):",""); tmpValue = ptSettings.value(PhotoTexturer::UNPROJECT_ANGLE_SHARPNESS,1); combineParamSet.addInt(PhotoTexturer::UNPROJECT_ANGLE_SHARPNESS,tmpValue.toInt(),"Angle map sharpness:",""); tmpValue = ptSettings.value(PhotoTexturer::UNPROJECT_ENABLE_DISTANCE,false); combineParamSet.addBool(PhotoTexturer::UNPROJECT_ENABLE_DISTANCE,tmpValue.toBool(),"Enable distance map:",""); tmpValue = ptSettings.value(PhotoTexturer::UNPROJECT_DISTANCE_WEIGHT,1); combineParamSet.addInt(PhotoTexturer::UNPROJECT_DISTANCE_WEIGHT,tmpValue.toInt(),"Distance map weight:",""); tmpValue = ptSettings.value(PhotoTexturer::BAKE_SAVE_UNPROJECT,true); combineParamSet.addBool(PhotoTexturer::BAKE_SAVE_UNPROJECT,tmpValue.toBool(),"Save unprojected textures:",""); tmpValue = ptSettings.value(PhotoTexturer::UNPROJECT_ENABLE_EDGE_STRETCHING,false); combineParamSet.addBool(PhotoTexturer::UNPROJECT_ENABLE_EDGE_STRETCHING,tmpValue.toBool(),"Enable Texture edge Stretching:",""); tmpValue = ptSettings.value(PhotoTexturer::UNPROJECT_EDGE_STRETCHING_PASS,2); combineParamSet.addInt(PhotoTexturer::UNPROJECT_EDGE_STRETCHING_PASS,tmpValue.toInt(),"Edge Stretching Passes:",""); tmpValue = ptSettings.value(PhotoTexturer::BAKE_MERGE_TEXTURES,true); combineParamSet.addBool(PhotoTexturer::BAKE_MERGE_TEXTURES,tmpValue.toBool(),"Merge unprojected textures:",""); tmpValue = ptSettings.value(PhotoTexturer::BAKE_MERGE_TYPE,0); combineParamSet.addEnum(PhotoTexturer::BAKE_MERGE_TYPE,tmpValue.toInt(),QStringList() <<"Merge Faces by Angle"<<"Smartblend","Merge Mode:",""); tmpValue = ptSettings.value(PhotoTexturer::BAKE_SMARTBLEND,"smartblend.exe"); //combineParamSet.addOpenFileName(PhotoTexturer::BAKE_SMARTBLEND,tmpValue.toString(),".exe","Smartblend:",""); combineParamSet.addString(PhotoTexturer::BAKE_SMARTBLEND,tmpValue.toString(),"Smartblend:",""); return combineParamSet; }