Advertisement
Guest User

Untitled

a guest
Dec 8th, 2016
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.44 KB | None | 0 0
  1. //-----------------------------------------------------------------------------
  2. ///
  3. // Kształt obiektu definiowany jest w przestrzeni modelu. Obiekty możemy
  4. // przemieszczać (translacja), obracać (rotacja), a także zmieniać ich wielkość
  5. // (skalowanie), używając "transformacji świata" (ang. world transform).
  6. // Umieszczamy w ten sposób obiekt w układzie współrzędnych sceny. Następnie
  7. // musimy w tym układzie ustawić kamerę (oko obserwatora), przez którą będziemy
  8. // widzieć to, co znajduje się na scenie. Robimy to za pośrednictwem tzw. macierzy
  9. // widoku. Ostatnim przekształceniem jest tzw. transformacja rzutowania
  10. // (ang. projection transform), która umożliwia wykonanie dwuwymiarowego "zdjęcia"
  11. // naszej trójwymiarowej sceny.
  12. //
  13. // W niniejszym programie korzystamy z D3DX, zestawu narzędzi pomocniczych dla D3D.
  14. // Używamy np. funkcji inicjujących macierze transformacji. Aby skorzystać z D3DX
  15. // należy dołączyć plik nagłówkowy <d3dx9.h> i linkować program z biblioteką d3dx9.lib.
  16. //
  17. // Copyright (c) Microsoft Corporation. All rights reserved.
  18. //-----------------------------------------------------------------------------
  19. #include <Windows.h>
  20. #include <mmsystem.h>
  21. #include <d3dx9.h>
  22. #include <math.h>
  23.  
  24. //-----------------------------------------------------------------------------
  25. // zmienne globalne
  26. //-----------------------------------------------------------------------------
  27. LPDIRECT3D9 g_pD3D = NULL; // obiekt Direct3D (obiekt COM)
  28. LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // urządzenie wyjściowe (odpowiednik kontekstu graficznego GDI)
  29. LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // bufor wierzchołków
  30. float sth = 0.0;
  31. int g_nTriangles;
  32. bool enabled = false;
  33. float xspeed = 1.0f;
  34. // definicja typu wierzchołka
  35. struct CUSTOMVERTEX
  36. {
  37. FLOAT x, y, z; // współrzędne wierzchołka
  38. FLOAT norm_x, norm_y, norm_z; // normalna do powierzchni obiektu wyprowadzona z wierzchołka
  39. };
  40.  
  41. // definiujemy "flexible vertex format" (FVF)
  42. #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)
  43. FLOAT fAngle1=0.0001f;
  44.  
  45. //-----------------------------------------------------------------------------
  46. // Nazwa: InitD3D()
  47. // Opis: inicjacja Direct3D
  48. //-----------------------------------------------------------------------------
  49. HRESULT InitD3D( HWND hWnd )
  50. {
  51. // tworzymy obiekt D3D (obiekt COM)
  52. if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
  53. return E_FAIL;
  54.  
  55. // Ustawiamy strukturę, służącą do utworzenia urządzenia wyjściowego (D3DDevice)
  56. // Ponieważ tworzymy grafikę 3D, urządzenie musi mieć bufor z.
  57. D3DPRESENT_PARAMETERS d3dpp;
  58. ZeroMemory( &d3dpp, sizeof(d3dpp) );
  59. d3dpp.Windowed = TRUE;
  60. d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  61. d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
  62. d3dpp.EnableAutoDepthStencil = TRUE; // włączamy bufor z
  63. d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
  64.  
  65. // tworzymy urządzenie wyjściowe (D3DDevice)
  66. if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
  67. D3DCREATE_SOFTWARE_VERTEXPROCESSING,
  68. &d3dpp, &g_pd3dDevice ) ) )
  69. {
  70. return E_FAIL;
  71. }
  72.  
  73. // wyłączamy usuwanie niewidocznych powierzchni
  74. g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
  75.  
  76. // włączamy bufor z
  77. g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
  78.  
  79. return S_OK;
  80. }
  81.  
  82.  
  83.  
  84.  
  85. //-----------------------------------------------------------------------------
  86. // Nazwa: InitGeometry()
  87. // Opis: tworzenie obiektów (zawartości sceny)
  88. //-----------------------------------------------------------------------------
  89. HRESULT InitGeometry()
  90. {
  91. // Tworzymy dwa trójkąty - każdy ma 3 wierzchołki opisane przez 6 liczb.
  92.  
  93. CUSTOMVERTEX g_Vertices[] =
  94. {
  95. // trójkąt 1 (przedni)
  96. { 0.0f, 0.0f, 0.25f, 0.0f, 0.0f, 1.0f, },
  97. { 0.0f, 1.5f, 0.25f, 0.0f, 0.0f, 1.0f, },
  98. { 0.5f, 1.5f, 0.25f, 0.0f, 0.0f, 1.0f, },
  99.  
  100. { 0.5f, 0.0f, 0.25f, 0.0f, 0.0f, 1.0f, },
  101. { 0.5f, 1.5f, 0.25f, 0.0f, 0.0f, 1.0f, },
  102. { 0.0f, 0.0f, 0.25f, 0.0f, 0.0f, 1.0f, },
  103.  
  104. { 0.5f, 1.5f, 0.25f, 0.0f, 0.0f, 1.0f, },
  105. { 0.5f, 1.0f, 0.25f, 0.0f, 0.0f, 1.0f, },
  106. { 1.0f, 0.0f, 0.25f, 0.0f, 0.0f, 1.0f, },
  107.  
  108. { 1.0f, 0.0f, 0.25f, 0.0f, 0.0f, 1.0f, },
  109. { 1.0f, 0.5f, 0.25f, 0.0f, 0.0f, 1.0f, },
  110. { 0.5f, 1.5f, 0.25f, 0.0f, 0.0f, 1.0f, },
  111.  
  112. { 1.0f, 0.0f, 0.25f, 0.0f, 0.0f, 1.0f, },
  113. { 1.0f, 1.5f, 0.25f, 0.0f, 0.0f, 1.0f, },
  114. { 1.5f, 1.5f, 0.25f, 0.0f, 0.0f, 1.0f, },
  115.  
  116. { 1.0f, 0.0f, 0.25f, 0.0f, 0.0f, 1.0f, },
  117. { 1.5f, 1.5f, 0.25f, 0.0f, 0.0f, 1.0f, },
  118. { 1.5f, 0.0f, 0.25f, 0.0f, 0.0f, 1.0f, },
  119.  
  120.  
  121. { 0.7f, 2.0f, 0.25f, 0.0f, 0.0f, 1.0f, },
  122. { 0.7f, 2.5f, 0.25f, 0.0f, 0.0f, 1.0f, },
  123. { 1.2f, 2.5f, 0.25f, 0.0f, 0.0f, 1.0f, },
  124.  
  125. { 0.7f, 2.0f, 0.25f, 0.0f, 0.0f, 1.0f, },
  126. { 1.2f, 2.5f, 0.25f, 0.0f, 0.0f, 1.0f, },
  127. { 1.2f, 2.0f, 0.25f, 0.0f, 0.0f, 1.0f, },
  128.  
  129.  
  130.  
  131. { 0.0f, 0.0f, 0.00f, 0.0f, 0.0f, -1.0f, },
  132. { 0.0f, 1.5f, 0.00f, 0.0f, 0.0f, -1.0f, },
  133. { 0.5f, 1.5f, 0.00f, 0.0f, 0.0f, -1.0f, },
  134.  
  135. { 0.5f, 0.0f, 0.00f, 0.0f, 0.0f, -1.0f, },
  136. { 0.5f, 1.5f, 0.00f, 0.0f, 0.0f, -1.0f, },
  137. { 0.0f, 0.0f, 0.00f, 0.0f, 0.0f, -1.0f, },
  138.  
  139. { 0.5f, 1.5f, 0.00f, 0.0f, 0.0f, -1.0f, },
  140. { 0.5f, 1.0f, 0.00f, 0.0f, 0.0f, -1.0f, },
  141. { 1.0f, 0.0f, 0.00f, 0.0f, 0.0f, -1.0f, },
  142.  
  143. { 1.0f, 0.0f, 0.00f, 0.0f, 0.0f, -1.0f, },
  144. { 1.0f, 0.5f, 0.00f, 0.0f, 0.0f, -1.0f, },
  145. { 0.5f, 1.5f, 0.00f, 0.0f, 0.0f, -1.0f, },
  146.  
  147. { 1.0f, 0.0f, 0.00f, 0.0f, 0.0f, -1.0f, },
  148. { 1.0f, 1.5f, 0.00f, 0.0f, 0.0f, -1.0f, },
  149. { 1.5f, 1.5f, 0.00f, 0.0f, 0.0f, -1.0f, },
  150.  
  151. { 1.0f, 0.0f, 0.00f, 0.0f, 0.0f, -1.0f, },
  152. { 1.5f, 1.5f, 0.00f, 0.0f, 0.0f, -1.0f, },
  153. { 1.5f, 0.0f, 0.00f, 0.0f, 0.0f, -1.0f, },
  154.  
  155.  
  156. { 0.7f, 2.0f, 0.00f, 0.0f, 0.0f, -1.0f, },
  157. { 0.7f, 2.5f, 0.00f, 0.0f, 0.0f, -1.0f, },
  158. { 1.2f, 2.5f, 0.00f, 0.0f, 0.0f, -1.0f, },
  159.  
  160. { 0.7f, 2.0f, 0.00f, 0.0f, 0.0f, -1.0f, },
  161. { 1.2f, 2.5f, 0.00f, 0.0f, 0.0f, -1.0f, },
  162. { 1.2f, 2.0f, 0.00f, 0.0f, 0.0f, -1.0f, },
  163.  
  164.  
  165. { 0.0f, 0.0f, 0.25f, -1.0f, 0.0f, 0.0f, },
  166. { 0.0f, 1.5f, 0.25f, -1.0f, 0.0f, 0.0f, },
  167. { 0.0f, 1.5f, 0.00f, -1.0f, 0.0f, 0.0f, },
  168.  
  169. { 0.0f, 1.5f, 0.00f, -1.0f, 0.0f, 0.0f, },
  170. { 0.0f, 0.0f, 0.00f, -1.0f, 0.0f, 0.0f, },
  171. { 0.0f, 0.0f, 0.25f, -1.0f, 0.0f, 0.0f, },
  172.  
  173.  
  174. { 0.0f, 1.5f, 0.25f, 0.0f, 1.0f, 0.0f, },
  175. { 0.5f, 1.5f, 0.25f, 0.0f, 1.0f, 0.0f, },
  176. { 0.5f, 1.5f, 0.00f, 0.0f, 1.0f, 0.0f, },
  177.  
  178. { 0.0f, 1.5f, 0.00f, 0.0f, 1.0f, 0.0f, },
  179. { 0.5f, 1.5f, 0.00f, 0.0f, 1.0f, 0.0f, },
  180. { 0.0f, 1.5f, 0.25f, 0.0f, 1.0f, 0.0f, },
  181.  
  182. };
  183.  
  184. // WAŻNE - LICZBA TRÓJKĄTÓW
  185. g_nTriangles = 20;
  186.  
  187. // tworzenie bufora wierchołków
  188. if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*g_nTriangles*sizeof(CUSTOMVERTEX),
  189. 0, D3DFVF_CUSTOMVERTEX,
  190. D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
  191. {
  192. return E_FAIL;
  193. }
  194.  
  195. // kopiujemy dane wierzchołków z tablicy g_Vertices[] do bufora DX
  196. VOID* pVertices;
  197. if( FAILED( g_pVB->Lock( 0, sizeof(g_Vertices), (void**)&pVertices, 0 ) ) )
  198. return E_FAIL;
  199. memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
  200. g_pVB->Unlock();
  201.  
  202. return S_OK;
  203. }
  204.  
  205.  
  206.  
  207.  
  208. //-----------------------------------------------------------------------------
  209. // Nazwa: Cleanup()
  210. // Opis: zwalnianie zainicjowanych wcześniej obiektów
  211. //-----------------------------------------------------------------------------
  212. VOID Cleanup()
  213. {
  214. if( g_pVB != NULL )
  215. g_pVB->Release();
  216.  
  217. if( g_pd3dDevice != NULL )
  218. g_pd3dDevice->Release();
  219.  
  220. if( g_pD3D != NULL )
  221. g_pD3D->Release();
  222. }
  223.  
  224.  
  225.  
  226. //-----------------------------------------------------------------------------
  227. // Nazwa: SetupMatrices()
  228. // Opis: ustawienie macierzy świata, widoku i rzutowania
  229. //-----------------------------------------------------------------------------
  230. VOID SetupMatrices()
  231. {
  232. // macierz świata będzie definiować jedynie obrót obiektów w okół osi Y
  233. D3DXMATRIXA16 matWorld;
  234. D3DXMatrixIdentity(&matWorld);
  235.  
  236. // Ustawiamy macierz obrotu tak, aby uzyskać 1 pełny obrót (2*PI radianów)
  237. // co 10 sekund (czyli 10000ms). Aby uniknąć kłopotów związanych z wykonywaniem
  238. // obliczeń na bardzo dużych liczbach zmiennoprzecinkowych, wyznaczamy resztę
  239. // z dzielenia czasu systemowego przez okres obrotu przed dokonaniem konwersji
  240. // na kąt w radianach.
  241. D3DXMATRIXA16 matRotation;
  242. D3DXMATRIXA16 matRotation1;
  243. UINT iTime = timeGetTime() % 10000;
  244. FLOAT fAngle = (iTime * (2.0f * D3DX_PI) / 10000.0f);
  245. fAngle1 = fAngle1+(float)xspeed;
  246.  
  247.  
  248. D3DXMatrixRotationY(&matRotation, fAngle );
  249. D3DXMatrixRotationX(&matRotation1, fAngle1);
  250. D3DXMatrixMultiply(&matWorld, &matRotation, &matWorld);
  251. D3DXMatrixMultiply(&matWorld, &matRotation1, &matWorld);
  252. g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
  253.  
  254. // Tworzymy macierz widoku. Można ją zdefiniować podając położenie oka,
  255. // punkt, na który patrzymy, oraz kierunek pionu. Poniżej ustawiamy oko
  256. // 4 jednostki od początku układu wzdłuż osi Z i 3 jednostki ponad powierzchnią
  257. // XZ, patrzymy w początek układu współrzędnych, a pion wskazuje oś Y.
  258. D3DXVECTOR3 vEyePt( 0.0f, 3.0f, 4.0f );
  259. D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
  260. D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
  261. D3DXMATRIXA16 matView;
  262. D3DXMatrixLookAtRH( &matView, &vEyePt, &vLookatPt, &vUpVec );
  263. g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
  264.  
  265.  
  266. // Dla macierzy rzutowania ustawiamy przekształcenie perspektywiczne
  267. // (dzięki któremu transformacja sceny trójwymiarowej na obraz
  268. // dwuwymiarowy przebiega z uwzględnieniem perspektywy, a więc obiekty
  269. // znajdujące się dalej są odwzorowywane jako mniejsze). Aby stworzyć
  270. // przekształcenie perspektywiczne, musimy podać pole widzenia (1/4 PI
  271. // to typowa wartość), proporcje osi oraz bliską i daleką płaszczyznę
  272. // odcinającą (które określają odległości od oka, przy jakich obiekty nie są
  273. // już renderowane).
  274. D3DXMATRIXA16 matProj;
  275. D3DXMatrixPerspectiveFovRH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
  276. g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
  277. }
  278.  
  279.  
  280. //-----------------------------------------------------------------------------
  281. // Nazwa: SetupLights()
  282. // Opis: ustawienie oświetlenia sceny
  283. //-----------------------------------------------------------------------------
  284. VOID SetupLights()
  285. {
  286. // Tworzymy materiał, z którego zbudowany jest obiekt. W danej chwili możemy
  287. // używać tylko jednego materiału.
  288. D3DMATERIAL9 mtrl;
  289. ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );
  290. mtrl.Diffuse.r = mtrl.Ambient.r = 0.2f;
  291. mtrl.Diffuse.g = mtrl.Ambient.g = 0.8f;
  292. mtrl.Diffuse.b = mtrl.Ambient.b = 0.2f;
  293. mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
  294. g_pd3dDevice->SetMaterial( &mtrl );
  295.  
  296. // Tworzymy jedno, kierunkowe białe światło
  297. // Musimy też uruchomić oświetlenie używając stałej D3DRS_LIGHTING w funkcji SetRenderState
  298. D3DXVECTOR3 vecDir;
  299. D3DLIGHT9 light;
  300. ZeroMemory( &light, sizeof(D3DLIGHT9) );
  301. light.Type = D3DLIGHT_DIRECTIONAL;
  302. light.Diffuse.r = 1.0f;
  303. light.Diffuse.g = 1.0f;
  304. light.Diffuse.b = 1.0f;
  305.  
  306. vecDir = D3DXVECTOR3(0.0f,
  307. -0.2f,
  308. -1.0f);
  309.  
  310. D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );
  311. light.Range = 1000.0f;
  312.  
  313. g_pd3dDevice->SetLight( 0, &light );
  314. g_pd3dDevice->LightEnable( 0, TRUE );
  315. g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
  316.  
  317. }
  318.  
  319.  
  320.  
  321.  
  322. //-----------------------------------------------------------------------------
  323. // Nazwa: Render()
  324. // Opis: rysowanie sceny
  325. //-----------------------------------------------------------------------------
  326. VOID Render()
  327. {
  328. // ustawiamy kolor tła
  329. g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
  330. D3DCOLOR_XRGB(0,70,70), 1.0f, 0 );
  331.  
  332. // rozpoczęcie rysowania sceny
  333. if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
  334. {
  335. // ustawienie świateł i materiałów
  336. SetupLights();
  337.  
  338. // ustawienie macierzy świata, widoku i rzutowania
  339. SetupMatrices();
  340.  
  341. g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
  342.  
  343. // renderowanie zawartości bufora wierzchołków
  344. g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
  345. g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
  346. g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, g_nTriangles );
  347.  
  348. g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00202020 );
  349.  
  350. // zakończenie rysowania sceny
  351. g_pd3dDevice->EndScene();
  352. }
  353.  
  354. // wyświetlenie sceny na ekranie
  355. g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
  356. }
  357.  
  358.  
  359.  
  360.  
  361. //-----------------------------------------------------------------------------
  362. // Nazwa: MsgProc()
  363. // Opis: obsługa komunikatów wysyłanych do naszego okna
  364. //-----------------------------------------------------------------------------
  365. LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
  366. {
  367. static int x, y;
  368. switch( msg )
  369. {
  370. case WM_DESTROY:
  371. Cleanup();
  372. PostQuitMessage( 0 );
  373. return 0;
  374.  
  375. case WM_LBUTTONDOWN: //reakcja na lewy przycisk myszki
  376. {
  377. x = LOWORD(lParam);
  378. y = HIWORD(lParam);
  379. enabled = true;
  380. return 0;
  381. }
  382. case WM_LBUTTONUP: //reakcja na lewy przycisk myszki
  383. {
  384. enabled = false;
  385. sth = xspeed;
  386. return 0;
  387. }
  388. case WM_MOUSEMOVE: //reakcja na lewy przycisk myszki
  389. {
  390. if (enabled == true)
  391. {
  392.  
  393. xspeed = sth+(HIWORD(lParam) - y)/1000.0f;
  394. }
  395.  
  396. return 0;
  397. }
  398.  
  399. }
  400.  
  401. return DefWindowProc( hWnd, msg, wParam, lParam );
  402. }
  403.  
  404.  
  405.  
  406.  
  407. //-----------------------------------------------------------------------------
  408. // Nazwa: WinMain()
  409. // Opis: program główny
  410. //-----------------------------------------------------------------------------
  411. INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
  412. {
  413. // rejestracja klasy okna
  414. WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
  415. GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
  416. "GK D3D", NULL };
  417. RegisterClassEx( &wc );
  418.  
  419. // utworzenie okna naszej aplikacji
  420. HWND hWnd = CreateWindow( "GK D3D", "Grafika Komputerowa: DirectX",
  421. WS_OVERLAPPEDWINDOW, 100, 100, 512, 512,
  422. GetDesktopWindow(), NULL, wc.hInstance, NULL );
  423.  
  424. // inicjacja Direct3D
  425. if( SUCCEEDED( InitD3D( hWnd ) ) )
  426. {
  427. // utworzenie obiektów sceny
  428. if( SUCCEEDED( InitGeometry() ) )
  429. {
  430. // wyświetlenie okna
  431. ShowWindow( hWnd, SW_SHOWDEFAULT );
  432. UpdateWindow( hWnd );
  433.  
  434. // uruchomienie pętli obsługi komunikatów
  435. MSG msg;
  436. ZeroMemory( &msg, sizeof(msg) );
  437. while( msg.message!=WM_QUIT )
  438. {
  439. if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
  440. {
  441. TranslateMessage( &msg );
  442. DispatchMessage( &msg );
  443. }
  444. else
  445. Render(); // <-- RYSOWANIE SCENY
  446. }
  447. }
  448. }
  449.  
  450. UnregisterClass( "GK D3D", wc.hInstance );
  451. return 0;
  452. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement