Witam,
Wiem, że to nie forum od tworzenia gier, ale niestety gamedev i warsztat.gd jest nieczynne, dlatego pytam tutaj, a nóż ktoś programuje w DirectX. Od 3 godzin próbuję dojść do tego dlaczego nie widać na ekranie czerwonego stożka.
Kod wygląda tak:
//Definicja wierzchołka
typedef struct ColorVertex
{
ColorVertex(){}
ColorVertex(float _x,float _y,float _z, D3DCOLOR _color)
{
x = _x; y = _y; z = _z; color = _color;
}
float x,y,z;
D3DCOLOR color;
static const DWORD FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;
} ColorVertex;
//Pętla komunikatów (na razie nie wykorzystuje timeDelta)
void GUI::Display(float timeDelta)
{
pDev->Clear(0, 0, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0xff000000, 1, 0); //STENCIL
pDev->BeginScene();
/*pDev->SetMaterial(&material::RED);
pDev->SetStreamSource(0,pVBn2,0,sizeof(NormalVertex2));
pDev->SetFVF(NormalVertex2::FVF);
pDev->SetIndices(pIBn2);
pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,object->getVerticesNr(vertNormal2),0,object->getTriangleNr(vertNormal2));*/
static float angle = 0.0f;
D3DXMatrixRotationY(&::MatWorld, angle);
angle += 0.01f;
if(angle == 360.02) angle = 0.0f;
pDev->SetTransform(D3DTS_WORLD,&MatWorld);
pDev->SetStreamSource(0,pVBc,0,sizeof(ColorVertex));
pDev->SetFVF(ColorVertex::FVF);
pDev->SetIndices(pIBc);
pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,5,0,6);
pDev->EndScene();
pDev->Present(0, 0, 0, 0); //present back buffer
}
//Inicjalizacja danych:
D3DXMATRIX MatView;
D3DXMATRIX MatProj;
D3DXMATRIX MatWorld;
RetCode GUI::Setup()
{
char buffer[30];
string napis;
u32 x=0;
x = object->getVerticesNr(vertColor);
_itoa(x, buffer, 10);
napis = "Liczba wierzcholkow wynosi ";
napis.append(buffer);
::MessageBox(hWnd,(char *)napis.c_str(),"",MB_OK);
x = object->getTriangleNr(vertColor);
_itoa(x, buffer, 10);
napis = "Liczba trojkatow wynosi ";
napis.append(buffer);
::MessageBox(hWnd,(char *)napis.c_str(),"",MB_OK);
/*for(u32 i=0; i<object->getVerticesNr(vertNormal2); i++)
{
napis = "Wektor normalny: ";
_itoa((i32)object->vertsN2[i].nx, buffer, 10);
napis.append(buffer);
_itoa((i32)object->vertsN2[i].ny, buffer, 10);
napis.append(buffer);
_itoa((i32)object->vertsN2[i].nz, buffer, 10);
napis.append(buffer);
::MessageBox(hWnd,(char *)napis.c_str(),"",MB_OK);
}*/
//Debug stozek z kolorem:
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
};
//Table of indexes for NormalVertex2
u32 _faceColor[] = {4,0,1, 2,0,3, 3,0,4, 1,0,2, 1,2,3, 4,1,3};
//Create buffer
//if(FAILED(pDev->CreateVertexBuffer(object->getVerticesNr(vertNormal)*sizeof(NormalVertex),D3DUSAGE_DYNAMIC, NormalVertex::FVF, D3DPOOL_DEFAULT, &pVBn, 0))) return NOK;
if(FAILED(pDev->CreateVertexBuffer(object->getVerticesNr(vertNormal2)*sizeof(NormalVertex2),D3DUSAGE_DYNAMIC, NormalVertex2::FVF, D3DPOOL_DEFAULT, &pVBn2, 0))) return NOK;
if(FAILED(pDev->CreateVertexBuffer(object->getVerticesNr(vertColor)*sizeof(ColorVertex),D3DUSAGE_DYNAMIC, ColorVertex::FVF, D3DPOOL_DEFAULT, &pVBc, 0))) return NOK;
//if(FAILED(pDev->CreateIndexBuffer(object->getTriangleNr(vertNormal)*12,D3DUSAGE_DYNAMIC, D3DFMT_INDEX32, D3DPOOL_DEFAULT, &pIBn, 0))) return NOK;
if(FAILED(pDev->CreateIndexBuffer(object->getTriangleNr(vertNormal2)*12,D3DUSAGE_DYNAMIC, D3DFMT_INDEX32, D3DPOOL_DEFAULT, &pIBn2, 0))) return NOK;
if(FAILED(pDev->CreateIndexBuffer(object->getTriangleNr(vertColor)*12,D3DUSAGE_DYNAMIC, D3DFMT_INDEX32, D3DPOOL_DEFAULT, &pIBc, 0))) return NOK;
//CopyDataIntoVertexBuffer(0, pVBn, void* verts);
CopyDataIntoVertexBuffer(0, pVBn2, static_cast<NormalVertex2 *>(object->getVerts(vertNormal2)));
//CopyDataIntoVertexBuffer(0, pVBc, _vertsColor); //static_cast<ColorVertex *>(object->getVerts(vertColor)));
//CopyDataIntoIndexBuffer(0, pIBn, void* verts);
CopyDataIntoIndexBuffer(0, pIBn2, object->getIndices(vertNormal2));
//CopyDataIntoIndexBuffer(0, pIBc, _faceColor);//object->getIndices(vertColor));
//Copy data into buffer
void* data = NULL;
if(FAILED(pVBc->Lock(0, sizeof(_vertsColor), &data, D3DLOCK_DISCARD))) return NOK; //D3DLOCK_DISCARD - ewentualną poprzednią wartość bufora nadpisujemy
memcpy(data, _vertsColor, sizeof(_vertsColor));
pVBc->Unlock();
if(FAILED(pIBc->Lock(0, sizeof(_faceColor), &data, D3DLOCK_DISCARD))) return NOK;
memcpy(data, _faceColor, sizeof(_faceColor));
pIBc->Unlock();
pDev->SetRenderState(D3DRS_LIGHTING, FALSE );
//macierze świata, widoku, projekcji
D3DXMatrixPerspectiveFovLH(&MatProj, D3DXToRadian(90), 4.0f/3.0f, 1, 100);
D3DXMatrixLookAtLH(&MatView, &D3DXVECTOR3(3,5,-6), &D3DXVECTOR3(0,0,0), &D3DXVECTOR3(0,1,0));
pDev->SetTransform( D3DTS_VIEW, &::MatView);
pDev->SetTransform( D3DTS_PROJECTION, &::MatProj);
//cam->SetCamera(Tele);
//swiatlo->SetSource(Midday);
return OK;
}
W definicji klasy mam też m.in.
IDirect3DDevice9* pDev;
IDirect3DVertexBuffer9 *pVBn, *pVBn2, *pVBc;
IDirect3DIndexBuffer9 *pIBn, *pIBn2, *pIBc;
W powyższym kodzie widać dużo zakomentowanego kodu. Ot chciałem po prostu wykluczyć że to jakiś problem z obiektowością. Najlepsze jest to, że to działało, ale chciałem przejść na większą obiektowość i zacząłem tworzyć takie klasy jak swiatlo, camera, object (który zawiera definicje wierzchołków i różne informacje), funkcje opakowywujce jak CopyDataIntoVertexBuffer i się popsuło. Teraz juz nie potrafię wrócić do wersji działającej a tamtej neistety nie zachowałem:///