void CorrespondenceEvaluate::generateInbetween(double t) { auto scheduler = QSharedPointer<Scheduler>(new Scheduler); auto blender = QSharedPointer<TopoBlender>(new TopoBlender(GraphCorr, scheduler.data())); auto synthManager = QSharedPointer<SynthesisManager>(new SynthesisManager(GraphCorr, scheduler.data(), blender.data(), 1000)); synthManager->genSynData(); scheduler->timeStep = 1.0 / 100.0; scheduler->defaultSchedule(); scheduler->executeAll(); auto blendedModel = scheduler->allGraphs[t * (scheduler->allGraphs.size() - 1)]; synthManager->renderGraph(*blendedModel, "test", false, 5); }
void AutoBlend::doBlend() { auto selected = gallery->getSelected(); if (selected.size() < 2) return; for(auto t : results->items) t->deleteLater(); results->items.clear(); ((GraphicsScene*)scene())->showPopup("Please wait.."); for(int shapeI = 0; shapeI < selected.size(); shapeI++) { for(int shapeJ = shapeI + 1; shapeJ < selected.size(); shapeJ++) { //auto sourceName = selected.front()->data["targetName"].toString(); //auto targetName = selected.back()->data["targetName"].toString(); auto sourceName = selected[shapeI]->data.value("targetName").toString(); auto targetName = selected[shapeJ]->data.value("targetName").toString(); auto cacheSource = document->cacheModel(sourceName); auto cacheTarget = document->cacheModel(targetName); if(cacheSource == nullptr || cacheTarget == nullptr) continue; auto source = QSharedPointer<Structure::Graph>(cacheSource->cloneAsShapeGraph()); auto target = QSharedPointer<Structure::Graph>(cacheTarget->cloneAsShapeGraph()); auto gcorr = QSharedPointer<GraphCorresponder>(new GraphCorresponder(source.data(), target.data())); // Apply computed correspondence //if (false) // enable/disable auto correspondence { QVector<QPair<QString, QString> > all_pairs; for(auto n : source->nodes) { if (!document->datasetCorr[sourceName][n->id][targetName].empty()) { for(auto nj : document->datasetCorr[sourceName][n->id][targetName]) { all_pairs << qMakePair(n->id, nj); } } } ResolveCorrespondence(source.data(), target.data(), all_pairs, gcorr.data()); } gcorr->computeCorrespondences(); // Schedule blending sequence auto scheduler = QSharedPointer<Scheduler>(new Scheduler); auto blender = QSharedPointer<TopoBlender>(new TopoBlender(gcorr.data(), scheduler.data())); // Sample geometries int numSamples = 100; int reconLevel = 4; int LOD = widget->levelDetails->currentIndex(); switch (LOD){ case 0: numSamples = 100; reconLevel = 4; break; case 1: numSamples = 1000; reconLevel = 5; break; case 2: numSamples = 10000; reconLevel = 7; break; } /// Visualize schedule: if (false) { blender->parentWidget = new QMainWindow(); blender->parentWidget->show(); blender->setupUI(); QStringList corr; for(auto n : scheduler->activeGraph->nodes){ corr << QString("%1-%2").arg(n->id, n->property["correspond"].toString()); } QMessageBox::information(blender->parentWidget, "Correspondence", corr.join("\n")); } auto synthManager = QSharedPointer<SynthesisManager>(new SynthesisManager(gcorr.data(), scheduler.data(), blender.data(), numSamples)); synthManager->genSynData(); // Compute blending scheduler->timeStep = 1.0 / 100.0; scheduler->defaultSchedule(); scheduler->executeAll(); int numResults = widget->count->value(); for (int i = 0; i < numResults; i++) { double a = ((double(i) / (numResults - 1)) * 0.9) + 0.05; auto blendedModel = scheduler->allGraphs[a * (scheduler->allGraphs.size() - 1)]; synthManager->renderGraph(*blendedModel, "", false, reconLevel ); auto t = results->addTextItem(""); t->setCamera(cameraPos, cameraMatrix); QVariantMap data; data["name"] = QString("%1_%2").arg(sourceName).arg(targetName); t->setData(data); // Add parts of target shape for (auto n : blendedModel->nodes){ t->addAuxMesh(toBasicMesh(blendedModel->getMesh(n->id), n->vis_property["color"].value<QColor>())); } } } } ((GraphicsScene*)scene())->hidePopup(); }