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); }