The following code is supposed to draw a cube in wireframe mode, but it is only drawing the first 2 primites (6 vertices instead of 36). If its just a typo Ill be mad, but honestly I'm drawing a blank here
DWORD WINAPI MainThread(DWORD);
DWORD WINAPI MainThread(DWORD dwParam){
// Wait for the window to appear
while(!bQuit && hwnd == NULL) Sleep(1);
if(bQuit) return 0;
// Initialize Direct3D
// Create a Direct3D Object (starts Direct3D and lets you access its functions)
IDirect3D9* d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
if(d3d9 == NULL) bQuit = true;
// Get device capabilities (what your card can do)
D3DCAPS9 caps;
d3d9->GetDeviceCaps( 0 , D3DDEVTYPE_HAL , &caps);
// Set Vertex Processing type (Hardware or Software)
// Hardware is faster, but not 'all' cards support it
int vp = 0;
switch(caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT){
case 0:
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
break;
default:
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
break;
}
//Beep(1000,50);
// Fill out the Present Parameters structure (What we want the display to look like)
d3dpp.BackBufferWidth = 800;
d3dpp.BackBufferHeight = 600;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = TRUE;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
// Create the device (start the Direct3D window)
IDirect3DDevice9* device;
HRESULT hResult = d3d9->CreateDevice(
D3DADAPTER_DEFAULT, // primary adapter
D3DDEVTYPE_HAL, // device type - We want Hardware, not Software (emulation)
hwnd, // window associated with device
vp, // vertex processing
&d3dpp, // present parameters
&device); // return created device
if(FAILED(hResult)){ bQuit = true; MessageBox(NULL , "CreateDevice() FAILED" , 0 , 0);}
// Create a vertex buffer that holds 8 vertices
IDirect3DVertexBuffer9* VertexBuffer;
hResult = device->CreateVertexBuffer(
8 * sizeof(Vertex),
0 ,
VERTEXFORMAT,
D3DPOOL_MANAGED,
&VertexBuffer,
0);
if(FAILED(hResult)){ bQuit = true; MessageBox(NULL , "CreateVertexBuffer() FAILED" , 0 , 0);}
// create an index buffer that holds 36 indices
IDirect3DIndexBuffer9* IndexBuffer;
hResult = device->CreateIndexBuffer(
36 * sizeof(WORD),
D3DUSAGE_WRITEONLY,
D3DFMT_INDEX16,
D3DPOOL_MANAGED,
&IndexBuffer,
0);
if(FAILED(hResult)){ bQuit = true; MessageBox(NULL , "CreateIndexBuffer() FAILED" , 0 , 0);}
// the following 2 sections, accessing the buffers should be merged into a single section
// which loads the model data from files after calculating the necessary buffer sizes
// access the vertex buffer
Vertex* vertices;
VertexBuffer->Lock(0 , 0 , (void**)&vertices , 0);
vertices[0] = Vertex(-1.0f, -1.0f, -1.0f);
vertices[1] = Vertex(-1.0f, 1.0f, -1.0f);
vertices[2] = Vertex( 1.0f, 1.0f, -1.0f);
vertices[3] = Vertex( 1.0f, -1.0f, -1.0f);
vertices[4] = Vertex(-1.0f, -1.0f, 1.0f);
vertices[5] = Vertex(-1.0f, 1.0f, 1.0f);
vertices[6] = Vertex( 1.0f, 1.0f, 1.0f);
vertices[7] = Vertex( 1.0f, -1.0f, 1.0f);
VertexBuffer->Unlock();
// access the index buffer
WORD* indices;
IndexBuffer->Lock(0 , 0 , (void**)&indices , 0);
indices[0] = 0; indices[1] = 1; indices[2] = 2;
indices[3] = 0; indices[4] = 2; indices[5] = 3;
indices[6] = 4; indices[7] = 6; indices[8] = 5;
indices[9] = 4; indices[10] = 7; indices[11] = 6;
indices[12] = 4; indices[13] = 5; indices[14] = 1;
indices[15] = 4; indices[16] = 1; indices[17] = 0;
indices[18] = 3; indices[19] = 2; indices[20] = 6;
indices[21] = 3; indices[22] = 6; indices[23] = 7;
indices[24] = 1; indices[25] = 5; indices[26] = 6;
indices[27] = 1; indices[28] = 6; indices[29] = 2;
indices[30] = 4; indices[31] = 0; indices[32] = 3;
indices[33] = 4; indices[34] = 3; indices[35] = 7;
IndexBuffer->Unlock();
// set stream source (attach vertex buffer to rendering pipeline)
//device->SetStreamSource(0 , VertexBuffer , 0 , sizeof(Vertex));
// set the vertex format
//device->SetFVF(D3DFVF_XYZ);// | D3DFVF_DIFFUSE);// | D3DFVF_TEX1);
// set the index buffer
//device->SetIndices(IndexBuffer);
// Position and aim the camera
// TODO: This should probably be moved into the main rendering loop, as it may change in game
//D3DXVECTOR3 position(1.0f, 1.0f, -3.0f);
//D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
//D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
//D3DXMATRIX V;
//D3DXMatrixLookAtLH(&V, &position, &target, &up);
//device->SetTransform(D3DTS_VIEW, &V);
// Set the projection matrix
D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(
&proj,
D3DX_PI * 0.5f, // 90 - degree
(float)d3dpp.BackBufferWidth / (float)d3dpp.BackBufferHeight,
1.0f,
1000.0f);
device->SetTransform(D3DTS_PROJECTION, &proj);
// set render state - wireframe mode
device->SetRenderState(D3DRS_FILLMODE , D3DFILL_WIREFRAME);
// Now enter the rendering loop, this renders the game objects
float x,y,dx,dy;
dx=+0.1f;dy=0.0f;x=0.0f;y=0.0f;
//D3DXVECTOR3 position((float)x, (float)y, -3.0f);
D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
D3DXMATRIX V;
while(!bQuit){
x+=dx;y+=dy;
if(x>1.0f) dy=0.0f-dx;dx=0.0f;x=1.0f;
if(x<-1.0f) dy=0.0f-dx;dx=0.0f;x=-1.0f;
if(y>1.0f) dx=dy;dy=0.0f;y=1.0f;
if(y<-1.0f) dx=dy;dy=0.0f;y=-1.0f;
D3DXVECTOR3 position(x, y, -3.0f);
// Position and aim the camera
// TODO: This should probably be moved into the main rendering loop, as it may change in game
D3DXMatrixLookAtLH(&V, &position, &target, &up);
device->SetTransform(D3DTS_VIEW, &V);
//bQuit = true;
device->Clear(0 , 0 , D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , 0xffffffff , 1.0f , 0);
device->BeginScene();
// draw code goes here
// set stream source (attach vertex buffer to rendering pipeline)
device->SetStreamSource(0 , VertexBuffer , 0 , sizeof(Vertex));
// set the vertex format
device->SetFVF(Vertex::FVF); // | D3DFVF_DIFFUSE);// | D3DFVF_TEX1);
// set the index buffer
device->SetIndices(IndexBuffer);
// draw the primitive, which in this case is a triangle
device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST , 0 , 0 , 36 , 0 , 12);
// done drawing
device->EndScene();
// present the scene, usually copies the backbuffer to the screen
device->Present(0 , 0 , 0 , 0);
// be multitask friendly
Sleep(1);
}
VertexBuffer->Release();
IndexBuffer->Release();
device->Release();
d3d9->Release();
return 0;
}