diff --git a/Makefile b/Makefile index 3ff096d..3668573 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ CFLAGS += -Wno-error=unused-function CFLAGS += -Wno-error=unused-variable CFLAGS += -DUNICODE -LDFLAGS += -Wl,--subsystem,windows -mwindows -mconsole -municode -ld3d9 +LDFLAGS += -Wl,--subsystem,windows -mwindows -mconsole -municode -ld3d9 -ld3dx9 -lwinmm OPT = -Og diff --git a/main.cpp b/main.cpp index b46a228..f49a830 100644 --- a/main.cpp +++ b/main.cpp @@ -1,18 +1,19 @@ #include #include +#include #include +#include -struct CUSTOMVERTEX { - float x, y, z, rhw; +struct CUSTOMVERTEX +{ + float x, y, z; uint32_t color; }; -#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE) - -const CUSTOMVERTEX vertices[] = { - { 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000 }, - { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00 }, - { 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff }, +const CUSTOMVERTEX g_Vertices[] = { + { -1.0f,-1.0f, 0.0f, 0xffff0000, }, + { 1.0f,-1.0f, 0.0f, 0xff0000ff, }, + { 0.0f, 1.0f, 0.0f, 0xffffffff, }, }; LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -20,6 +21,9 @@ LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); IDirect3D9 * g_pD3D = NULL; IDirect3DDevice9 * g_pd3dDevice = NULL; IDirect3DVertexBuffer9 * g_pVB = NULL; +IDirect3DVertexDeclaration9 * g_pVertexDeclaration = NULL; +ID3DXConstantTable * g_pConstantTable = NULL; +IDirect3DVertexShader9 * g_pVertexShader = NULL; HRESULT InitDirect3D(HWND hwnd) { @@ -42,6 +46,9 @@ HRESULT InitDirect3D(HWND hwnd) return E_FAIL; } + g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); + g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); + return S_OK; } @@ -54,16 +61,42 @@ void Cleanup() g_pD3D->Release(); } +D3DXMATRIX WorldViewProjection() +{ + D3DXMATRIX matWorld; + UINT iTime = timeGetTime() % 1000; + FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f; + D3DXMatrixRotationY( &matWorld, fAngle ); + + D3DXVECTOR3 vEyePt( 0.0f, 3.0f,-5.0f ); + D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f ); + D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f ); + D3DXMATRIX matView; + D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec ); + + D3DXMATRIX matProj; + D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f ); + + D3DXMATRIX mWorldViewProj = matWorld * matView * matProj; + return mWorldViewProj; +} + void Render() { if (g_pd3dDevice == NULL) return; - g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0); + g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 10, 10), 1.0f, 0); g_pd3dDevice->BeginScene(); + + D3DXMATRIX mWorldViewProj = WorldViewProjection(); + g_pConstantTable->SetMatrix(g_pd3dDevice, "mWorldViewProj", &mWorldViewProj); + + g_pd3dDevice->SetVertexDeclaration(g_pVertexDeclaration); + g_pd3dDevice->SetVertexShader(g_pVertexShader); + g_pd3dDevice->SetStreamSource(0, g_pVB, 0, (sizeof (CUSTOMVERTEX))); - g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX); g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); g_pd3dDevice->EndScene(); @@ -102,9 +135,13 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine HRESULT res; + ////////////////////////////////////////////////////////////////////// + // vertex buffer + ////////////////////////////////////////////////////////////////////// + res = g_pd3dDevice->CreateVertexBuffer(3 * (sizeof (CUSTOMVERTEX)), // length 0, // usage - D3DFVF_CUSTOMVERTEX, // FVF + 0,//D3DFVF_CUSTOMVERTEX, // FVF D3DPOOL_DEFAULT, // Pool &g_pVB, //ppVertexBuffer NULL //pSharedHandle @@ -113,14 +150,63 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine return 0; void * pVertices; - res = g_pVB->Lock(0, (sizeof (vertices)), &pVertices, 0); + res = g_pVB->Lock(0, (sizeof (g_Vertices)), &pVertices, 0); if (FAILED(res)) return 0; - memcpy(pVertices, vertices, (sizeof (vertices))); + memcpy(pVertices, g_Vertices, (sizeof (g_Vertices))); g_pVB->Unlock(); + ////////////////////////////////////////////////////////////////////// + // vertex declaration + ////////////////////////////////////////////////////////////////////// + + + const D3DVERTEXELEMENT9 decl[] = { + { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 }, + D3DDECL_END() + }; + + res = g_pd3dDevice->CreateVertexDeclaration(decl, &g_pVertexDeclaration); + if (FAILED(res)) + return 0; + + ////////////////////////////////////////////////////////////////////// + // vertex shader + ////////////////////////////////////////////////////////////////////// + + LPD3DXBUFFER pCode; + DWORD dwShaderFlags = 0; + + res = D3DXCompileShaderFromFile(L"main.vsh", // pSrcFile + NULL, // pDefines + NULL, // pInclude + "Main", // pFunctionName + "vs_3_0", // pProfile + dwShaderFlags, // Flags + &pCode, // ppShader + NULL, // ppErrorMsgs + &g_pConstantTable // ppConstantTable + ); + if (FAILED(res)) { + fprintf(stderr, "D3DXCompileShader\n"); + return 0; + } + + res = g_pd3dDevice->CreateVertexShader((DWORD*)pCode->GetBufferPointer(), &g_pVertexShader); + pCode->Release(); + if(FAILED(res)) { + fprintf(stderr, "CreateVertexShader\n"); + return 0; + } + + // + + fprintf(stderr, "success\n"); + fflush(stderr); + ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); diff --git a/main.vsh b/main.vsh new file mode 100644 index 0000000..a979cf4 --- /dev/null +++ b/main.vsh @@ -0,0 +1,23 @@ +struct VS_INPUT +{ + float3 Position : POSITION; + float4 Color : COLOR0; +}; + +struct VS_OUTPUT +{ + float4 Position : POSITION; // vertex position + float4 Diffuse : COLOR0; // vertex diffuse color +}; + +float4x4 mWorldViewProj; + +VS_OUTPUT Main(VS_INPUT Input) +{ + VS_OUTPUT Output; + + Output.Position = mul(float4(Input.Position, 1.0), mWorldViewProj); + Output.Diffuse = Input.Color; + + return Output; +}