//VC,DirectX8开发实例(照相机和影子)
// http://wisdom.sakura.ne.jp/system/directx/dxg8.html
#include <windows.h>
#include <d3d8.h>
#include <d3dx8.h>
#define TITLE TEXT("Kitty on your lap")
IDirect3D8 * pDirect3D;
IDirect3DDevice8 * pD3Device;
D3DPRESENT_PARAMETERS d3dpp;
D3DXVECTOR3 view(0 , 0 , 600);
typedef struct {
float x,y,z;
DWORD color;
} D3DVERTEX;
void SetRender(HWND hWnd) {
RECT rect;
D3DXMATRIX d3dm;
GetClientRect(hWnd,&rect);
//生成viewtransform用左手坐标系变换队列
D3DXMatrixLookAtLH(&d3dm , &view ,
&D3DXVECTOR3(10 , -200 , 0) ,
&D3DXVECTOR3(0 , 1 , 0));
pD3Device->SetTransform(D3DTS_VIEW , &d3dm);
//視野 (FOV) に基づいて、右手座標系パースペクティブ射影行列を作成する
D3DXMatrixPerspectiveFovLH(&d3dm ,
D3DXToRadian(45.0) ,//回转角度
(float)rect.right / (float)rect.bottom , 0 , 1000);
pD3Device->SetTransform(D3DTS_PROJECTION , &d3dm);
pD3Device->SetRenderState(D3DRS_CULLMODE , D3DCULL_NONE);
pD3Device->SetRenderState(D3DRS_LIGHTING , FALSE);
}
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
static D3DVERTEX pt[3] = {
{200 , -10 , 0 , 0xFFFF0000} ,
{400 , -200 , 0 , 0xFF00FF00} ,
{10 , -200 , 0 , 0xFF0000FF}
};
D3DXMATRIX d3dm;
D3DXVECTOR3 d3dv;
switch(msg){
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_CREATE:
SetTimer(hWnd , 1 , 10 , NULL);
return 0;
case WM_PAINT:
pD3Device->Clear(0 , NULL , D3DCLEAR_TARGET ,
D3DCOLOR_XRGB(0xFF , 0xFF , 0xFF) , 1.0 , 0);
pD3Device->BeginScene();
pD3Device->SetVertexShader(D3DFVF_XYZ | D3DFVF_DIFFUSE);
pD3Device->DrawPrimitiveUP(
D3DPT_TRIANGLELIST , 1 , pt , sizeof (D3DVERTEX));
pD3Device->EndScene();
pD3Device->Present(NULL,NULL,NULL,NULL);
ValidateRect(hWnd,NULL);
break;
case WM_SIZE:
if(pD3Device && (wp == SIZE_RESTORED || wp == SIZE_MAXIMIZED)) {
d3dpp.BackBufferWidth = LOWORD(lp);
d3dpp.BackBufferHeight = HIWORD(lp);
pD3Device->Reset(&d3dpp);
SetRender(hWnd);
InvalidateRect(hWnd,NULL,TRUE);
}
return 0;
case WM_TIMER:
//Y轴作为回转轴,进行回转
D3DXMatrixRotationY(&d3dm , D3DXToRadian(2));//回转角度
d3dv = view;
view.x = d3dv.x * d3dm.m[0][0] +
d3dv.y * d3dm.m[1][0] + d3dv.z * d3dm.m[2][0];
view.y = d3dv.x * d3dm.m[0][1] +
d3dv.y * d3dm.m[1][1] + d3dv.z * d3dm.m[2][1];
view.z = d3dv.x * d3dm.m[0][2] +
d3dv.y * d3dm.m[1][2] + d3dv.z * d3dm.m[2][2];
D3DXMatrixLookAtLH(&d3dm , &view ,
&D3DXVECTOR3(10 , -200 , 0) , &D3DXVECTOR3(0 , 1 , 0));
pD3Device->SetTransform(D3DTS_VIEW , &d3dm);
InvalidateRect(hWnd , NULL , TRUE);
return 0;
}
return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance ,
LPSTR lpCmdLine,int nCmdShow) {
MSG msg;
HWND hWnd;
WNDCLASS winc;
D3DDISPLAYMODE dmode;
pDirect3D = Direct3DCreate8(D3D_SDK_VERSION);
pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&dmode);
ZeroMemory(&d3dpp , sizeof (d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = dmode.Format;
d3dpp.BackBufferCount = 1;
winc.style = CS_CLASSDC;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL,IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if(!RegisterClass(&winc)) return 0;
hWnd = CreateWindow(TEXT("KITTY") , TITLE ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
(HWND)NULL,(HMENU)NULL , hInstance , (LPSTR)NULL
);
pDirect3D->CreateDevice(
D3DADAPTER_DEFAULT , D3DDEVTYPE_HAL , hWnd ,
D3DCREATE_SOFTWARE_VERTEXPROCESSING , &d3dpp , &pD3Device
);
//
SetRender(hWnd);
while (GetMessage(&msg , NULL , 0 , 0 )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
pDirect3D->Release();
pD3Device->Release();
return msg.wParam;
}