void Browse::Flags (int flagNumber, bool go) { // For each for (int i=0;i<m_ctrl.InfoList.GetSize(m_128x128);i++) { // Selected ? if (m_ctrl.InfoList.theList[m_128x128][i].Selected) { // Tile index sint index; // get flags switch (m_128x128) { case 0: // Tile index index=tileBank2.getTileSet (land)->getTile128 (i); break; case 1: // Tile index index=tileBank2.getTileSet (land)->getTile256 (i); break; case 2: // Tile index index=tileBank2.getTileSet (land)->getTransition (i)->getTile (); break; default: nlassert (0); // no! } // valid flags if (index!=-1) { // Get flags uint value=tileBank2.getTile (index)->getGroupFlags (); // Clear flag value&=~(1<<flagNumber); // Set the flag if (go) value|=(1<<flagNumber); // Setup tileBank2.getTile (index)->setGroupFlags (value); } } } }
void CTileSetCont::build (CTileBank& bank, uint tileSet) { // TileSet ref CTileSet* set=bank.getTileSet (tileSet); // Find a main bitmap with a valid name if (set->getNumTile128()) { // Get the name std::string fileName=bank.getAbsPath()+bank.getTile (set->getTile128(0))->getRelativeFileName (CTile::diffuse); // Valid name? if (fileName!="") { // Create it MainBitmap=new CTextureFile (fileName); } } // Build group bitmaps for (int group=0; group<NL3D_CTILE_NUM_GROUP; group++) { int tile; // Look for a 128 tile in this group for (tile=0; tile<set->getNumTile128(); tile++) { // Tile pointer CTile* pTile=bank.getTile (set->getTile128 (tile)); // Look for a tile of the group if (pTile->getGroupFlags ()&(1<<group)) { // Get the name std::string fileName=bank.getAbsPath()+pTile->getRelativeFileName (CTile::diffuse); // Valid name? if (fileName!="") { // Create it if (GroupBitmap[group]==NULL) GroupBitmap[group]=new CTextureFile (fileName); // Add to the group list GroupTile128[group].push_back (tile); } } } // Look for a 256 tile in this group for (tile=0; tile<set->getNumTile256(); tile++) { // Tile pointer CTile* pTile=bank.getTile (set->getTile256 (tile)); // Look for a tile of the group if (pTile->getGroupFlags ()&(1<<group)) { // Get the name std::string fileName=bank.getAbsPath()+pTile->getRelativeFileName (CTile::diffuse); // Valid name? if (fileName!="") { // Create it if (GroupBitmap[group]==NULL) GroupBitmap[group]=new CTextureFile (fileName); // Add to the group list GroupTile256[group].push_back (tile); } } } } // Current index bool dmwarn = false; for (uint displace=0; displace<CTileSet::CountDisplace; displace++) { uint dispTile = set->getDisplacementTile((CTileSet::TDisplacement)displace); if (bank.getDisplacementMapCount() <= dispTile) { if (!dmwarn) { dmwarn = true; MessageBox(NULL, "Tile bank not loaded, or bad tile bank. Missing a displacement tile. Use the tile bank utility to load the correct tilebank.", "NeL Patch Paint", MB_OK | MB_ICONWARNING); } continue; // with next displace } // Get the name std::string fileName = bank.getDisplacementMap(dispTile); if (fileName=="EmptyDisplacementMap") fileName=""; // Valid name? if (fileName!="") { // Create it DisplaceBitmap[displace]=new CTextureFile (bank.getAbsPath()+fileName); DisplaceBitmap[displace]->loadGrayscaleAsAlpha (false); } } }
void Browse::UpdateFlags () { SubGroup0=0; SubGroup1=0; SubGroup2=0; SubGroup3=0; SubGroup4=0; SubGroup5=0; SubGroup6=0; SubGroup7=0; SubGroup8=0; SubGroup9=0; SubGroup10=0; SubGroup11=0; // Flags uint or=0, and=0xffffffff; bool find=false; // For each for (int i=0;i<m_ctrl.InfoList.GetSize(m_128x128);i++) { // Selected ? if (m_ctrl.InfoList.theList[m_128x128][i].Selected) { // Tile index sint index; // get flags switch (m_128x128) { case 0: // Tile index index=tileBank2.getTileSet (land)->getTile128 (i); break; case 1: // Tile index index=tileBank2.getTileSet (land)->getTile256 (i); break; case 2: // Tile index index=tileBank2.getTileSet (land)->getTransition (i)->getTile (); break; case 3: // not found index=-1; break; default: nlassert (0); // no! } // valid flags if (index!=-1) { // Get flags or|=tileBank2.getTile (index)->getGroupFlags (); and&=tileBank2.getTile (index)->getGroupFlags (); // Find one find=true; } } } // Valid ctrl GetDlgItem (IDC_SUBGROUP0)->EnableWindow (find?TRUE:FALSE); GetDlgItem (IDC_SUBGROUP1)->EnableWindow (find?TRUE:FALSE); GetDlgItem (IDC_SUBGROUP2)->EnableWindow (find?TRUE:FALSE); GetDlgItem (IDC_SUBGROUP3)->EnableWindow (find?TRUE:FALSE); GetDlgItem (IDC_SUBGROUP4)->EnableWindow (find?TRUE:FALSE); GetDlgItem (IDC_SUBGROUP5)->EnableWindow (find?TRUE:FALSE); GetDlgItem (IDC_SUBGROUP6)->EnableWindow (find?TRUE:FALSE); GetDlgItem (IDC_SUBGROUP7)->EnableWindow (find?TRUE:FALSE); GetDlgItem (IDC_SUBGROUP8)->EnableWindow (find?TRUE:FALSE); GetDlgItem (IDC_SUBGROUP9)->EnableWindow (find?TRUE:FALSE); GetDlgItem (IDC_SUBGROUP10)->EnableWindow (find?TRUE:FALSE); GetDlgItem (IDC_SUBGROUP11)->EnableWindow (find?TRUE:FALSE); // Find at least one tile ? if (find) { // Set UI SubGroup0=(and&0x1)?1:(or&0x1)?2:0; SubGroup1=(and&0x2)?1:(or&0x2)?2:0; SubGroup2=(and&0x4)?1:(or&0x4)?2:0; SubGroup3=(and&0x8)?1:(or&0x8)?2:0; SubGroup4=(and&0x10)?1:(or&0x10)?2:0; SubGroup5=(and&0x20)?1:(or&0x20)?2:0; SubGroup6=(and&0x40)?1:(or&0x40)?2:0; SubGroup7=(and&0x80)?1:(or&0x80)?2:0; SubGroup8=(and&0x100)?1:(or&0x100)?2:0; SubGroup9=(and&0x200)?1:(or&0x200)?2:0; SubGroup10=(and&0x400)?1:(or&0x400)?2:0; SubGroup11=(and&0x800)?1:(or&0x800)?2:0; } // Update UI data UpdateData (FALSE); }
void Browse::OnBatchLoad () { CFileDialog sFile (true, NULL, NULL, OFN_ENABLESIZING, "Targa bitmap (*.tga)|*.tga|All files (*.*)|*.*||",NULL); if (sFile.DoModal()==IDOK) { char sDrive[256]; char sPath[256]; char sName[256]; char sExt[256]; _splitpath (sFile.GetPathName(), sDrive, sPath, sName, sExt); // look for some numbers.. char *sNumber=sName+strlen(sName)-1; while ((sNumber>sName)&&(*sNumber>='0')&&(*sNumber<='9')) { sNumber--; } sNumber[1]=0; bool rotate=false; if (::MessageBox (NULL, "Do you want to use rotation to reuse alpha tiles ?", "Import rotated tiles", MB_OK|MB_ICONQUESTION|MB_YESNO)==IDYES) rotate=true; for (int i=0; i<CTileSet::count; i++) { if (m_ctrl.Texture==3) { // Current transition CTileSet::TTransition transition=(CTileSet::TTransition)i; // Transition to patch CTileSetTransition* trans=tileBank2.getTileSet (land)->getTransition (transition); if (tileBank2.getTile (trans->getTile())->getRelativeFileName (CTile::alpha)=="") { // Continue ? int ok; // Try to load transition with rotation for (int rot=0; rot<4; rot++) { // Try to load a tile with a file name like /tiletransition0.tga char sName2[256]; char sFinal[256]; sprintf (sName2, "%s%02d", sName, (int)transition); _makepath (sFinal, sDrive, sPath, sName2, sExt); FILE *pFile=fopen (sFinal, "rb"); // Close the file and add the tile if opened if (pFile) { fclose (pFile); ok=m_ctrl.InfoList.setTileTransitionAlpha (i, sFinal, (4-rot)%4); // End break; } // Rotate the transition transition=CTileSet::rotateTransition (transition); if (!rotate) break; } if (!ok) break; } } else { // Current transition CTileSet::TTransition transition=(CTileSet::TTransition)i; // Transition to patch CTileSetTransition* trans=tileBank2.getTileSet (land)->getTransition (transition); if (tileBank2.getTile (trans->getTile())->getRelativeFileName (m_ctrl.Texture==1?CTile::diffuse:CTile::additive)=="") { // Try to load a tile with a file name like /tiletransition0.tga char sName2[256]; char sFinal[256]; sprintf (sName2, "%s%02d", sName, (int)transition); _makepath (sFinal, sDrive, sPath, sName2, sExt); FILE *pFile=fopen (sFinal, "rb"); // Close the file and add the tile if opened if (pFile) { fclose (pFile); if (!m_ctrl.InfoList.setTileTransition (i, sFinal, m_ctrl.Texture==1?CTile::diffuse:CTile::additive)) break; } } } } m_ctrl.Invalidate (); } }
unsigned long Browse::MyControllingFunction( void* pParam ) { thread_actif = 1; Browse *br = (Browse*)pParam; br->m_ctrl.lockInsertion = 1; int iFV,iLV; br->m_ctrl.GetVisibility(iFV, iLV, br->m_128x128); br->m_ctrl.UpdateBar(iFV, iLV, br->m_128x128); tilelist::iterator p = br->m_ctrl.InfoList.GetFirst(br->m_128x128); tilelist::iterator plast = p; for (int i=0;i<br->m_ctrl.InfoList.GetSize(br->m_128x128);i++) { int *ld; int rot=0; std::string path; LPBITMAPINFO pBmp; std::vector<NLMISC::CBGRA>* bits; switch (br->m_128x128) { case 0: path = tileBank2.getTile (tileBank2.getTileSet (br->m_ctrl.InfoList._tileSet)->getTile128 (i))-> getRelativeFileName ((CTile::TBitmap)(br->m_ctrl.Texture-1)); break; case 1: path = tileBank2.getTile (tileBank2.getTileSet (br->m_ctrl.InfoList._tileSet)->getTile256 (i))-> getRelativeFileName ((CTile::TBitmap)(br->m_ctrl.Texture-1)); break; case 2: { int index=tileBank2.getTileSet (br->m_ctrl.InfoList._tileSet)->getTransition (i)->getTile(); if (index!=-1) { path = tileBank2.getTile (index)->getRelativeFileName ((CTile::TBitmap)(br->m_ctrl.Texture-1)); if (br->m_ctrl.Texture==3) rot = tileBank2.getTile (index)->getRotAlpha (); } else path = ""; } break; case 3: // Get diplacement filename path = tileBank2.getDisplacementMap (tileBank2.getTileSet (br->m_ctrl.InfoList._tileSet)->getDisplacementTile ((CTileSet::TDisplacement)i)); break; } std::vector<NLMISC::CBGRA>* pAlpha=NULL; switch (br->m_ctrl.Texture) { case 1: ld = &p->loaded; pBmp = &p->BmpInfo; bits = &p->Bits; pAlpha = &p->alphaBits; break; case 2: ld = &p->nightLoaded; pBmp = &p->nightBmpInfo; bits = &p->nightBits; pAlpha = &p->alphaBits; break; case 3: ld = &p->alphaLoaded; pBmp = &p->alphaBmpInfo; bits = &p->alphaBits; break; } if ((path!="") && _LoadBitmap(tileBank2.getAbsPath() + path, pBmp, *bits, pAlpha, rot)) { *ld=1; int iFV,iLV; br->m_ctrl.GetVisibility(iFV, iLV, br->m_128x128); if (i<=iLV && i>=iFV) { CDC *pDC = br->m_ctrl.GetDC(); br->m_ctrl.DrawTile(p,pDC,1,br->m_128x128); ::ReleaseDC(*br,*pDC); } } p++; } br->m_ctrl.lockInsertion = 0; thread_actif = 0; return 1; }
void CTile_edit_dlg::on_absolutePathPushButton_clicked() { // Build the struct QFileDialog::Options options = QFileDialog::DontResolveSymlinks | QFileDialog::ShowDirsOnly; QString directory = QFileDialog::getExistingDirectory(this, tr("Select the absolute base path of the bank"), ui.absolutePathPushButton->text(), options); // Select the path if (!directory.isEmpty()) { // Convert item into path string QString path = QDir::toNativeSeparators(directory); // Add a final back slash if (!path.endsWith(QDir::separator())) { // Add a '\' at the end path.append(QDir::separator()); } //// Last check QMessageBox::StandardButton reply; QString confirmMessage = tr("Do you really want to set %1 as base path of the bank?").arg(path); reply = QMessageBox::question(this, tr("Confirm Path"), confirmMessage, QMessageBox::Yes | QMessageBox::No); if (reply == QMessageBox::Yes) { // Set as default path.. // Old path const char* oldPath=tileBank.getAbsPath ().c_str(); // Path are good bool goodPath=true; // If no absolute path, must check before use it if ((*oldPath)==0) { // Compute xref tileBank.computeXRef(); // For all tiles, check we can change the path for (int tiles=0; tiles<tileBank.getTileCount(); tiles++) { // Get tile xref int tileSet; int number; CTileBank::TTileType type; tileBank.getTileXRef (tiles, tileSet, number, type); // Is tile used ? if (tileSet!=-1) { // 3 types of bitmaps int type; for (type=CTile::diffuse; type<CTile::bitmapCount; type++) { // Bitmap string const std::string& bitmapPath=tileBank.getTile(tiles)->getRelativeFileName ((CTile::TBitmap)type); // not empty ? if (bitmapPath!="") { // Check the path if ( CheckPath( bitmapPath, path.toUtf8() ) == false ) { // Bad path goodPath=false; // Message QString continueMessage = tr("Path '%1' can't be found in bitmap '%2'. Continue ?").arg(path).arg(QString(bitmapPath.c_str())); reply = QMessageBox::question(this, tr("Continue"), continueMessage, QMessageBox::Yes | QMessageBox::No); if (reply == QMessageBox::No) break; } } } if (type!=CTile::bitmapCount) break; } } // For all tiles, check we can change the path for (uint noise=1; noise<tileBank.getDisplacementMapCount (); noise++) { // Bitmap string const char *bitmapPath=tileBank.getDisplacementMap (noise); // not empty ? if (strcmp (bitmapPath, "")!=0) { // Check the path if (CheckPath( bitmapPath, path.toUtf8() )==false) { // Bad path goodPath=false; // Message QString continueMessage = tr("Path '%1' can't be found in bitmap '%2'. Continue ?").arg(path).arg(QString(bitmapPath)); reply = QMessageBox::question(this, tr("Continue"), continueMessage, QMessageBox::Yes | QMessageBox::No); if (reply == QMessageBox::No) break; } } } // Good path ? if (goodPath) { // Ok change the path // For all tiles, check we can change the path for (int tiles=0; tiles<tileBank.getTileCount(); tiles++) { // Get tile xref int tileSet; int number; CTileBank::TTileType type; tileBank.getTileXRef (tiles, tileSet, number, type); // Is tile used ? if (tileSet!=-1) { // 3 types of bitmaps for (int type=CTile::diffuse; type<CTile::bitmapCount; type++) { // Bitmap string std::string bitmapPath=tileBank.getTile(tiles)->getRelativeFileName ((CTile::TBitmap)type); // not empty ? if (bitmapPath!="") { // Remove the absolute path bool res=RemovePath (bitmapPath, path.toUtf8()); nlassert (res); // Set the bitmap tileBank.getTile(tiles)->setFileName ((CTile::TBitmap)type, bitmapPath); } } } } // For all tiles, check we can change the path for (uint noise=1; noise<tileBank.getDisplacementMapCount (); noise++) { // Bitmap string std::string bitmapPath=tileBank.getDisplacementMap (noise); // not empty ? if (bitmapPath!="") { // Remove the absolute path bool res=RemovePath (bitmapPath, path.toUtf8()); nlassert (res); // Set the bitmap tileBank.setDisplacementMap (noise, bitmapPath.c_str()); } } } else { // Info message QMessageBox::information(this, tr("Error"), tr("Can't set the path.")); } } // Good path ? if (goodPath) { // Change the abs path of the bank tileBank.setAbsPath (path.toUtf8().constData()); // Change the bouton text ui.absolutePathPushButton->setText(path); } } // Remove path from all tiles //tileBank } }
void CTile_browser_dlg::on_batchLoadPushButton_clicked() { QFileDialog::Options options; QString selectedFilter; QString fileName = QFileDialog::getOpenFileName(this, tr("Choose Bitmap"), QString(tileBankBrowser.getAbsPath().c_str()) , tr("Targa Bitmap (*.tga);;PNG Image (*.png);;All Files (*.*);;"), &selectedFilter, options); QFileInfo fi(fileName); QString baseName = fi.baseName() ; if (!fileName.isEmpty()) { QRegExp rx("\\d{2}$"); baseName = baseName.remove(rx); //TODO titegus: What's the point in asking for rotation if Texture != Alpha ??? bool rotate = (QMessageBox::Yes == QMessageBox::question(this, tr("Import rotated tiles"), tr("Do you want to use rotation to reuse alpha tiles?"), QMessageBox::Yes | QMessageBox::No )); for (int i=0; i<CTileSet::count; i++) { if (tileTextureButtonGroup->checkedId() == Alpha) { // Current transition CTileSet::TTransition transition=(CTileSet::TTransition)i; // Transition to patch CTileSetTransition* trans=tileBankBrowser.getTileSet (tileSetIndex)->getTransition (transition); if (tileBankBrowser.getTile (trans->getTile())->getRelativeFileName (CTile::alpha)=="") { // Continue ? int ok; // Try to load transition with rotation for (int rot=0; rot<4; rot++) { // Try to load a tile with a file name like /tiletransition0.tga QString transitionNumber = QString::number(transition); QString batchNumber = transitionNumber.rightJustified(2, '0'); QString nextBaseName = baseName + batchNumber; QString nextFileName = QDir::toNativeSeparators(fi.absolutePath()) + QDir::separator() + nextBaseName + QString(".") + fi.suffix(); FILE *pFile=fopen (nextFileName.toStdString().c_str(), "rb"); // Close the file and add the tile if opened if (pFile) { fclose (pFile); ok=browserModel.setTileTransitionAlpha (i, nextFileName.toStdString().c_str(), (4-rot)%4); // End break; } // Rotate the transition transition=CTileSet::rotateTransition (transition); if (!rotate) break; } if (!ok) break; } } else { //TODO titegus: Check that, Batch Load seems useless // Current transition CTileSet::TTransition transition=(CTileSet::TTransition)i; // Transition to patch //CTileSetTransition* trans=tileBankBrowser.getTileSet (tileSetIndex)->getTransition (transition); //if (tileBankBrowser.getTile (trans->getTile())->getRelativeFileName ((CTile::TBitmap)tileTextureButtonGroup->checkedId())=="") //{ // // Try to load a tile with a file name like /tiletransition0.tga // char sName2[256]; // char sFinal[256]; // sprintf (sName2, "%s%02d", sName, (int)transition); // _makepath (sFinal, sDrive, sPath, sName2, sExt); // FILE *pFile=fopen (sFinal, "rb"); // // Close the file and add the tile if opened // if (pFile) // { // fclose (pFile); // if (!infoList.setTileTransition (i, sFinal, (CTile::TBitmap) tileTextureButtonGroup->checkedId())) // break; // } //} } } LoadInThread(); } }