void prepare()
	{
		VulkanExampleBase::prepare();
		loadAssets();
		setupDescriptors();
		preparePipelines();
		buildCommandBuffers();
		prepared = true;
	}
KMeansClusteringDialog::KMeansClusteringDialog(QWidget *parent_)
  : MongoChem::AbstractClusteringWidget(parent_),
    d(new KMeansClusteringDialogPrivate),
    ui(new Ui::KMeansClusteringDialog)
{
  // setup ui
  ui->setupUi(this);

  // setup descriptors
  setupDescriptors();

  // setup vtk widget
  d->vtkWidget = new QVTKWidget(this);
  d->chartView->SetInteractor(d->vtkWidget->GetInteractor());
  d->vtkWidget->SetRenderWindow(d->chartView->GetRenderWindow());
  ui->viewFrameLayout->addWidget(d->vtkWidget);

  // setup chart xyz
  d->plot = 0;
  d->chart->SetFitToScene(true);
  d->chart->SetDecorateAxes(true);
  d->chart->SetGeometry(vtkRectf(0, 0, 600, 600));

  // setup chart view
  d->chartView->GetScene()->AddItem(d->chart.GetPointer());

  // setup k-means statistics
  d->kValue = 3;
  ui->kValueSpinBox->setValue(d->kValue);

  // render
  d->vtkWidget->update();

  // connect signals
  connect(ui->kValueSpinBox, SIGNAL(valueChanged(int)),
          this, SLOT(kValueSpinBoxChanged(int)));
  connect(ui->xDescriptorComboBox, SIGNAL(currentIndexChanged(QString)),
          this, SLOT(xDescriptorChanged(QString)));
  connect(ui->yDescriptorComboBox, SIGNAL(currentIndexChanged(QString)),
          this, SLOT(yDescriptorChanged(QString)));
  connect(ui->zDescriptorComboBox, SIGNAL(currentIndexChanged(QString)),
          this, SLOT(zDescriptorChanged(QString)));
  connect(d->vtkWidget, SIGNAL(mouseEvent(QMouseEvent*)),
          this, SLOT(viewMouseEvent(QMouseEvent*)));
}