Witam,
Oświeci mnie ktoś dlaczego ten kod działa poprawnie:
//Na potrzeby obczajania zadeklarowane globalnie
ColorVertex _vertsColor[] =
{
ColorVertex(-2.0f, 3.0f, 6.0f, 0xFFFF0000), //0
ColorVertex(-1.0f, 0.0f, 5.0f, 0xFFFF0000), //1
ColorVertex(-1.0f, 0.0f, 7.0f, 0xFFFF0000), //2
ColorVertex(-3.0f, 0.0f, 7.0f, 0xFFFF0000), //3
ColorVertex(-3.0f, 0.0f, 5.0f, 0xFFFF0000) //4
};
u32 _faceColor[] = {4,0,1, 2,0,3, 3,0,4, 1,0,2, 1,2,3, 4,1,3};
//W jakiejś funkcji wywołuje
CopyDataIntoVertexBuffer(0, pVBc, _vertsColor, sizeof(_vertsColor));
CopyDataIntoIndexBuffer(0, pIBc, _faceColor);
//Definicje opakowywarek:
RetCode GUI::CopyDataIntoVertexBuffer(u32 offset, IDirect3DVertexBuffer9* pVB, void* verts, u32 size)
{
void* data = NULL;
if(FAILED(pVB->Lock(offset, size, &data, D3DLOCK_DISCARD))) return NOK; //D3DLOCK_DISCARD - ewentualną poprzednią wartość bufora nadpisujemy
memcpy(data, _vertsColor, size);
pVB->Unlock();
return OK;
}
RetCode GUI::CopyDataIntoIndexBuffer(u32 offset, IDirect3DIndexBuffer9* pIB, u32* face)
{
void* data = NULL;
if(FAILED(pIB->Lock(offset, sizeof(_faceColor), &data, D3DLOCK_DISCARD))) return NOK;
memcpy(data, _faceColor, sizeof(_faceColor));
pIB->Unlock();
return OK;
}
a ten nie:
RetCode GUI::CopyDataIntoVertexBuffer(u32 offset, IDirect3DVertexBuffer9* pVB, void* verts, u32 size)
{
void* data = NULL;
if(FAILED(pVB->Lock(offset, size, &data, D3DLOCK_DISCARD))) return NOK; //D3DLOCK_DISCARD - ewentualną poprzednią wartość bufora nadpisujemy
memcpy(data, verts, size);
pVB->Unlock();
return OK;
}
RetCode GUI::CopyDataIntoIndexBuffer(u32 offset, IDirect3DIndexBuffer9* pIB, u32* face)
{
u32 x = sizeof(face); //wynosi 4
u32 x = sizeof(_faceColor); //wynosi dużo więcej, tyle ile powinien, skąd roznice????
void* data = NULL;
if(FAILED(pIB->Lock(offset, sizeof(face), &data, D3DLOCK_DISCARD))) return NOK;
memcpy(data, face, sizeof(face));
pIB->Unlock();
return OK;
}
Wygląda na to, że jak pod pojęciem u32* x mieści się 1 zmienna, to sizeof zwraca poprawnie jej rozmiar. Natomiast jak pod pojęciem u32 *x mieści się wskaźnik na pierwszy element tablicy to już sizeof nie zwróci wyniku poprawnego. Ponadto aby wszystko było dobrze to także należy zmienić face na _faceColor i verts na _vertsColor. Tutaj też nie rozumiem trochę czemu. Czy da radę mimo wszystko jakoś opakować dane tak bym nie musiał za każdym razem wywoływać Lock, memcpy i Unlock???