السلام عليكــم ورحمـة الله وبركاتــة ،،
قبل ايام كنت استعمل الدوال الخاصة بتحمل الاكساء D3Dx . لكن الملاحظ ان حجم ملف التطبيق يكبر جدا بستخدام هذه المكتبة . فحاولت كتابة دالة تقوم بتحميل الكساء يدويا لكن بصيغة bmp فقط .
للاسف لم انجح .
الكود كما هو
#include <d3d8.h>
#define E01 "File Not Found"
BYTE * data;
DWORD sizeX;
DWORD sizeY;
LPDIRECT3D8 g_pD3D = NULL;
LPDIRECT3DDEVICE8 g_pd3dDevice = NULL;
LPDIRECT3DVERTEXBUFFER8 g_pVB = NULL;
LPDIRECT3DTEXTURE8 g_Texture = NULL;
//Display Error Message
void hHalt(char * Emsg)
{
MessageBox(NULL,Emsg,"MyApp",MB_OK);
}
// load texture from bitmap file
void LoadTexture( HWND hwnd ,char * fName)
{
HBITMAP hBmp;
BITMAPINFO BMInfo;
HDC dc;
BITMAP bmp;
DWORD w , h;
dc = GetDC(hwnd);
hBmp = (HBITMAP) LoadImage(NULL, fName, IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
if ( !hBmp )
hHalt(E01);
GetObject(hBmp, sizeof(bmp), &bmp);
w = bmp.bmWidth;
h = bmp.bmHeight;
ZeroMemory(&BMInfo, sizeof(BMInfo));
BMInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
BMInfo.bmiHeader.biBitCount = 0;
BMInfo.bmiHeader.biWidth = w;
BMInfo.bmiHeader.biHeight= h;
BMInfo.bmiHeader.biBitCount = 24;
BMInfo.bmiHeader.biPlanes = bmp.bmPlanes;
BMInfo.bmiHeader.biCompression = BI_RGB;
const DWORD BitmapLength = ((BMInfo.bmiHeader.biWidth*BMInfo.bmiHeader.biHeight)*3);
data = new byte [BitmapLength];
// Get the Pixels from Bitmap File
GetDIBits(dc, (HBITMAP)hBmp, 0, BMInfo.bmiHeader.biHeight, data, &BMInfo, DIB_RGB_COLORS);
DeleteObject(hBmp);
// Create an Empty Texture 24bpp
g_pd3dDevice->CreateTexture( w, h, 1, 0, D3DFMT_R8G8B8, D3DPOOL_MANAGED, &g_Texture);
D3DSURFACE_DESC texdesc;
g_Texture->GetLevelDesc(0, &texdesc);
D3DLOCKED_RECT rect;
//Fill the Texture
g_Texture->LockRect(0, &rect, NULL, 0);
BYTE * pSurf = (BYTE *)rect.pBits;
BYTE* ptr = (BYTE *)data;
// "data" is 32bpp and D3DFMT == A8R8G8B8
// for(DWORD y=0; y<h; y++)
// {
// memcpy((BYTE*)pSurf,(BYTE*)ptr,w*sizeof(DWORD));
// ptr += w*4;
// pSurf += rect.Pitch/4;
// }
// "data" is 24bpp and D3DFMT == R8G8B8
for(DWORD y=0; y<h; y++)
{
for(DWORD x=0; x<w; x++)
{
CopyMemory(pSurf,ptr+x*4,3);
pSurf += 3;
}
ptr += w*4;
pSurf = ((BYTE*)rect.pBits)+y*rect.Pitch;
}
g_Texture->UnlockRect(0);
}