#include #include #pragma warning( disable : 4996 ) // 無駄な警告を出さなくする との事 #include #pragma warning( default : 4996 ) #if _DEBUG #include #define new ::new( _NORMAL_BLOCK, __FILE__, __LINE__ ) #endif #define MAX_PATH 260 #define D3DFVF_VERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE) typedef struct _D3DLVERTEX_ { float x,y,z; DWORD color; } D3DVERTEXCOR; D3DVERTEXCOR vtx2[4]= {{-4, 4, 0, 0xff0000ff}, { 4 , 4, 0, 0xffff0000}, {-4, -4, 0, 0xffffff00}, { 4, -4, 0, 0xff00ff00}}; //----------------------------------------------------------------------------- // Global variables //----------------------------------------------------------------------------- LPDIRECT3D9 g_pD3D = NULL; // Used to create the D3DDevice LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // Our rendering device D3DXMATRIX god; //----------------------------------------------------------------------------- // Name: InitD3D() // Desc: Initializes Direct3D //----------------------------------------------------------------------------- HRESULT InitD3D( HWND hWnd ) { // Create the D3D object. if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return E_FAIL; // Set up the structure used to create the D3DDevice. Since we are now // using more complex geometry, we will create a device with a zbuffer. D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; d3dpp.EnableAutoDepthStencil = TRUE; d3dpp.AutoDepthStencilFormat = D3DFMT_D16; // Create the D3DDevice if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) ) { return E_FAIL; } D3DXVECTOR3 vEyePt( 0.0f, 15.0f,-10.0f ); D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f ); D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f ); D3DXMATRIXA16 matView; D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec ); g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView ); D3DXMATRIXA16 matProj; D3DXMatrixPerspectiveFovLH( &matProj, D3DXToRadian(60.0f), 1.0f, 1.0f, 100.0f ); g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj ); //セットアップ レンダーステート g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); g_pd3dDevice->SetRenderState( D3DRS_DITHERENABLE, TRUE ); g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE ); g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x33333333 ); g_pd3dDevice->SetRenderState( D3DRS_NORMALIZENORMALS, TRUE ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); D3DXMatrixIdentity(&god); return S_OK; } //----------------------------------------------------------------------------- // Name: Cleanup() // Desc: Releases all previously initialized objects //----------------------------------------------------------------------------- VOID Cleanup() { if( g_pd3dDevice != NULL ) g_pd3dDevice->Release(); if( g_pD3D != NULL ) g_pD3D->Release(); } void QuaternionTest(void) { D3DXQUATERNION q(0,0,0,1); // 単位クォータニオン'q'を生成 D3DXQUATERNION q2(0,0,0,1); // 単位クォータニオン'q2'を生成 D3DXQUATERNION q3(0,0,0,1); // 単位クォータニオン'q3'を生成 D3DXMATRIX TurnMat; // 回転行列 D3DXMATRIX mat; //平行移動行列 D3DXVECTOR3 NAxis( 0, 0, 1); // 任意の中心軸 //何もしない行列を作る D3DXMatrixIdentity(&mat); D3DXMatrixIdentity(&TurnMat); //x座標に3、z座標に3移動する行列 D3DXMatrixTranslation(&mat,3,0,3); //z軸を中心に 0度 回転するクォータニオン'q'を生成 D3DXQuaternionRotationAxis( &q, &NAxis, D3DXToRadian(0)); //z軸を中心に 90度 回転するクォータニオン'q2'を生成 D3DXQuaternionRotationAxis( &q2, &NAxis, D3DXToRadian(90)); //'q'と、'q2'のちょうど中間(今回は45度)へ回転するクォータニオン'q3'を生成 D3DXQuaternionSlerp(&q3, &q, &q2, 0.5); if(GetKeyState(VK_RIGHT) < 0){ //クォータニオンをマトリックスに変換 D3DXMatrixRotationQuaternion(&TurnMat, &q); }else if(GetKeyState(VK_LEFT) < 0){ //クォータニオンをマトリックスに変換 D3DXMatrixRotationQuaternion(&TurnMat, &q2); }else if(GetKeyState(VK_UP) < 0){ //クォータニオンをマトリックスに変換 D3DXMatrixRotationQuaternion(&TurnMat, &q3); } //行列をかける(回転させた後、行列'mat'で平行移動させる) TurnMat*=mat; //回転マトリックスをパイオプラインにセット g_pd3dDevice->SetTransform( D3DTS_WORLD, &TurnMat); g_pd3dDevice->SetFVF(D3DFVF_VERTEX); g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,vtx2,sizeof(D3DVERTEXCOR)); } //----------------------------------------------------------------------------- // Name: Render() // Desc: Draws the scene //----------------------------------------------------------------------------- VOID Render() { g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,60), 1.0f, 0 ); if( SUCCEEDED( g_pd3dDevice->BeginScene() ) ) { QuaternionTest(); g_pd3dDevice->EndScene(); } g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); } //----------------------------------------------------------------------------- // Name: MsgProc() // Desc: The window's message handler //----------------------------------------------------------------------------- LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_DESTROY: Cleanup(); PostQuitMessage( 0 ); return 0; } return DefWindowProc( hWnd, msg, wParam, lParam ); } //----------------------------------------------------------------------------- // Name: WinMain() // Desc: The application's entry point //----------------------------------------------------------------------------- INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT ) { #ifdef _DEBUG _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif // Register the window class WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"D3D Tutorial", NULL }; RegisterClassEx( &wc ); // Create the application's window HWND hWnd = CreateWindow( L"D3D Tutorial", L"ゲームプログラミング", WS_OVERLAPPEDWINDOW, 100, 100, 640 + 8, 480 + 32, NULL, NULL, wc.hInstance, NULL ); // Initialize Direct3D if( SUCCEEDED( InitD3D( hWnd ) ) ) { // Show the window ShowWindow( hWnd, SW_SHOWDEFAULT ); UpdateWindow( hWnd ); // Enter the message loop MSG msg; ZeroMemory( &msg, sizeof(msg) ); while( msg.message!=WM_QUIT ) { if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); }else{ Render(); Sleep(1); } } } UnregisterClass( L"D3D Tutorial", wc.hInstance ); return 0; }