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);
}
Example #2
0
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();
}