#include "Varia.h" #include bool filetest(const char* filename) { FILE* plik_test; if((plik_test=fopen(filename,"r"))==NULL) return false; else fclose(plik_test); return true; } #include unsigned long* WczytajTeksture(HWND uchwytOkna,char* nazwaPliku,int& teksturaSzer,int& teksturaWys,bool zZasobow,unsigned char alfa) { //niezbyt elegancko jest tworzyc new w funkcji (zapomina sie o delete) //ale dzieki temu nie trzeba rozbijac na dwie czesci (pobieranie obrazu i czytanie) //nie trzeba zwracac informacji o obrazie, bo zawsze zwracamy tablice RGBA try { //czytanie bitmapy z pliku lub z zasobow char komunikat[1024] = "Brak pliku tekstury "; strcat(komunikat,nazwaPliku); if (!zZasobow && !filetest(nazwaPliku)) throw std::invalid_argument(komunikat); HBITMAP uchwytObrazu = (HBITMAP)LoadImage(GetModuleHandle(NULL),nazwaPliku,IMAGE_BITMAP,0,0,(zZasobow?0:LR_LOADFROMFILE) | LR_CREATEDIBSECTION); //informacje o bitmapie BITMAP obraz; GetObject(uchwytObrazu,sizeof(BITMAP),&obraz); teksturaSzer=obraz.bmWidth; teksturaWys=obraz.bmHeight; //informacja o ilosci bitow na piksel //char bufor[256]; //ShowMessage(_gcvt(obraz.bmBitsPixel,10,bufor)); unsigned long* tekstura=new unsigned long[teksturaSzer*teksturaWys]; switch(obraz.bmBitsPixel) { case 24: { unsigned char* tekstura24bppBRG=new unsigned char[obraz.bmWidthBytes*teksturaWys]; memcpy(tekstura24bppBRG,obraz.bmBits,teksturaSzer*teksturaWys*3); //gdybym zwrocil tekstura24bppBRG zrzutowane na unsigned long*, to powinienem uzywac do wyswietlania GL_BGR_EXT //konwersja na RGBA for(int ih=0;ih>4):(tekstura4bppPalette[i] & 0x0F); unsigned char R=tabelaKolorow[numerKoloruZPalety].rgbRed; unsigned char G=tabelaKolorow[numerKoloruZPalety].rgbGreen; unsigned char B=tabelaKolorow[numerKoloruZPalety].rgbBlue; tekstura[iw+(ih*teksturaSzer)]=(A << 24) + (B << 16) + (G << 8) + (R); } delete [] tekstura4bppPalette; } break; default: throw std::exception("Nieobslugiwany format bitmapy"); break; } DeleteObject(uchwytObrazu); return tekstura; } catch(const std::exception& exc) { char komunikat[256]="Błąd podczas pobierania tekstury:\n"; strcat(komunikat,exc.what()); MessageBox(NULL,komunikat,"Błąd teksturowania",NULL); return NULL; } }