kamilosxd678

Grafika Lab - D3DX

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