void ImageComparator::Compare( QString const&filepath, QImage const &img )
{
  QSettings sett(SettingsValues::filename(),QSettings::IniFormat);
  sett.beginGroup(SettingsValues::comparatorGroupName());
  QString goldenPath = sett.value(SettingsValues::goldenPathValueName(), SettingsValues::goldenPathDefault()).toString() + "/";
  QString diffPath =  sett.value(SettingsValues::diffPathValueName(), SettingsValues::diffPathDefault()).toString() + "/";  
  sett.endGroup();
  QFileInfo info(filepath);
  QString const samplePath = goldenPath + info.fileName();
  if(!QFile::exists(samplePath))
  {
    QMessageBox::critical(NULL, "Error!", QString("Golden image \"%1\" does not exist!").arg(samplePath));
    return;
  }
  QImage sample(samplePath);
  sample = sample.convertToFormat(QImage::Format_ARGB32_Premultiplied);
  if(sample.isNull())
  {
    QMessageBox::critical(NULL, "Error!", QString("Could not open file \"%1\"!").arg(samplePath));
    return;
  }
  if(sample.size() != img.size())
  {
    QMessageBox::critical(NULL, "Error!", QString("Sample and current images have different sizes!"));
    return;
  }
  unsigned long long accum = 0;
  int sx = sample.width();
  int sy = sample.height();
  int bpl = sample.bytesPerLine();
  QImage diffImg(sample.size(), QImage::Format_ARGB32);
  for (int y = 0; y < sy; ++y) {
    for (int x = 0; x < sx; ++x) 
    {
      for (int c = 0; c < 3; ++c) 
      {
        unsigned idx = y * bpl + (x << 2) + c;
        uchar diff = abs((int)sample.constBits()[idx] - (int)img.constBits()[idx]);
        diffImg.bits()[idx] = diff;
        accum += diff;
      }
      diffImg.bits()[y * bpl + (x << 2) + 3] = sample.bits()[y * bpl + (x << 2) + 3];
    }
  }
  QString const diffName = diffPath + info.fileName();
  QDir diffDir(diffPath);
  if(!diffDir.exists(diffPath))
  {
    if(!QDir(diffPath + "/..").mkpath(diffDir.dirName()))
    {
      QMessageBox::critical(NULL, "Error!", QString("Could not create diff folder \"%1\"!").arg(diffPath));
      return;
    }
  }
  if(!diffImg.save(diffName, info.suffix().toAscii().data()))
  {
    QMessageBox::critical(NULL, "Error!", QString("Could not save the difference image \"%1\"!").arg(diffName));
    return;
  }
  double diff = ((double)accum / (img.size().width() * img.size().height() * 3) * 100.0 / 255.0);

  QDialog dlg;
  Ui::ImgDifferenceDialog ui;
  ui.setupUi(&dlg);
  dlg.setModal(true);
  dlg.setSizeGripEnabled(false);
  dlg.layout()->setSizeConstraint( QLayout::SetFixedSize );
  ui.label->setText(QString("The difference is: %1").arg(diff, 0, 'f', 2));
  QPixmap pxmp = QPixmap::fromImage(diffImg);
  QRect r = ui.frame->frameRect();
  if(r.width() < pxmp.width())
    pxmp = pxmp.scaledToWidth(r.width(), Qt::SmoothTransformation);
  if(r.height() < pxmp.height())
    pxmp = pxmp.scaledToHeight(r.height(), Qt::SmoothTransformation);
  //ui.differenceLabel->resize(pxmp.size());
  ui.differenceLabel->setPixmap(pxmp);
  
  dlg.exec();

}
void ManagerLight::init()
{
	// point lights
	float dif[4] = { 0.7f, 0.7f, 0.3f, 1.0f };
	Vector diff(dif, 4);
	float specPointf[4] = { 0.1f, 0.1f, 0.1f, 1.0f };
	Vector specPoint(specPointf, 4);
	float lpos1[4] = { 0.0f, -1.0f, 0.5f, 1.0f };
	Vector lightPos1(lpos1, 4);
	Light *light1 = new Light(0, Light::POINT_LIGHT, game);
	light1->setPosition(lightPos1);
	light1->setDiffuse(diff);
	light1->setAmbient(diff);
	light1->setSpecular(specPoint);
	lights.push_back(light1);

	float lpos2[4] = { 10.0f, -1.0f, 0.5f, 1.0f };
	Vector lightPos2(lpos2, 4);
	Light *light2 = new Light(1, Light::POINT_LIGHT, game);
	light2->setPosition(lightPos2);
	light2->setDiffuse(diff);
	light2->setAmbient(diff);
	light2->setSpecular(specPoint);
	lights.push_back(light2);

	float lpos3[4] = { -10.0f, -1.0f, 0.5f, 1.0f };
	Vector lightPos3(lpos3, 4);
	Light *light3 = new Light(2, Light::POINT_LIGHT, game);
	light3->setPosition(lightPos3);
	light3->setDiffuse(diff);
	light3->setAmbient(diff);
	light3->setSpecular(specPoint);
	lights.push_back(light3);

	float lpos4[4] = { 0.0f, -13.0f, 0.5f, 1.0f };
	Vector lightPos4(lpos4, 4);
	Light *light4 = new Light(3, Light::POINT_LIGHT, game);
	light4->setPosition(lightPos4);
	light4->setDiffuse(diff);
	light4->setAmbient(diff);
	light4->setSpecular(specPoint);
	lights.push_back(light4);

	float lpos5[4] = { 10.0f, -13.0f, 0.5f, 1.0f };
	Vector lightPos5(lpos5, 4);
	Light *light5 = new Light(4, Light::POINT_LIGHT, game);
	light5->setPosition(lightPos5);
	light5->setDiffuse(diff);
	light5->setAmbient(diff);
	light5->setSpecular(specPoint);
	lights.push_back(light5);

	float lpos6[4] = { -10.0f, -13.0f, 0.5f, 1.0f };
	Vector lightPos6(lpos6, 4);
	Light *light6 = new Light(5, Light::POINT_LIGHT, game);
	light6->setPosition(lightPos6);
	light6->setDiffuse(diff);
	light6->setAmbient(diff);
	light6->setSpecular(specPoint);
	lights.push_back(light6);

	// directional light
	float difDirf[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
	Vector diffDir(difDirf, 4);
	float ldir[4] = { -1.0f, -1.0f, -1.0f, 0.0f };
	Vector lightDir(ldir, 4);
	Light *dirLight = new Light(6, Light::DIR_LIGHT, game);
	dirLight->setDiffuse(diffDir);
	dirLight->setAmbient(diffDir);
	dirLight->setSpecular(diffDir);
	dirLight->setPosition(lightDir);
	this->dirLight = dirLight;
	lights.push_back(dirLight);

	// spot light
	float difSpotf[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
	Vector difSpot(difSpotf, 4);
	float lSpotPosf[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
	Vector lSpotPos(lSpotPosf, 4);
	float lSpotDirf[3] = { 0.0f, 0.0f, -1.0f };
	Vector lSpotDir(lSpotDirf, 3);
	Light *spot = new Light(7, Light::SPOT_LIGHT, game);
	spot->setDiffuse(difSpot);
	spot->setAmbient(difSpot);
	spot->setSpecular(difSpot);
	spot->setPosition(lSpotPos);
	spot->setDirection(lSpotDir);
	spot->setCutoff(0.5f);
	spot->setExponent(0.1f);
	spotLight = spot;
	lights.push_back(spot);
}