Advertisement
Guest User

Untitled

a guest
Jul 7th, 2015
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.56 KB | None | 0 0
  1. #pragma comment(lib, "ScrnSavw.lib")
  2.  
  3. #else
  4.  
  5. #pragma comment(lib, "ScrnSave.lib")
  6.  
  7. #endif
  8.  
  9. #pragma comment(lib, "Comctl32.lib")
  10.  
  11. #include <windows.h>
  12. #include <ScrnSave.h>
  13. #include <CommCtrl.h>
  14. #include <mmsystem.h>
  15. #include <d3d9.h>
  16. #include <d3dx9.h>
  17.  
  18. #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)
  19.  
  20. LPDIRECT3D9 Direct3D = NULL;
  21. LPDIRECT3DDEVICE9 DirectDevice = NULL;
  22. LPDIRECT3DVERTEXBUFFER9 VBuffer = NULL;
  23. LPDIRECT3DINDEXBUFFER9 IBuffer = NULL;
  24.  
  25. D3DXMATRIX WorldR;
  26. D3DXMATRIX View;
  27. RECT winRect;
  28.  
  29. UINT Time = 0;
  30. FLOAT Angle = 0;
  31. UINT timer_id;
  32.  
  33. //структура, описывающая вершину:
  34. struct CUSTOMVERTEX {
  35. FLOAT X, Y, Z;
  36. DWORD Color;
  37. };
  38.  
  39. //Массив вершин:
  40. CUSTOMVERTEX CubeVertex[] =
  41. {
  42. //куб
  43. //грань 1
  44. { 1.0f, -1.0f, -1.0f, 0x00ff0000 },
  45. { 1.0f, 1.0f, -1.0f, 0x0000ff00 },
  46. { -1.0f, 1.0f, -1.0f, 0x000000ff },
  47. { -1.0f, -1.0f, -1.0f, 0x00ffff00 },
  48. //грань 2
  49. { -1.0f, -1.0f, -1.0f, 0x0000ff00 },
  50. { -1.0f, 1.0f, -1.0f, 0x000000ff },
  51. { -1.0f, 1.0f, 1.0f, 0x00ffff00 },
  52. { -1.0f, -1.0f, 1.0f, 0x0000ffff },
  53. //грань 3
  54. { -1.0f, -1.0f, 1.0f, 0x000000ff },
  55. { -1.0f, 1.0f, 1.0f, 0x00ffff00 },
  56. { 1.0f, 1.0f, 1.0f, 0x0000ffff },
  57. { 1.0f, -1.0f, 1.0f, 0x00ff00ff },
  58. //грань 4
  59. { 1.0f, -1.0f, 1.0f, 0x00ffff00 },
  60. { 1.0f, 1.0f, 1.0f, 0x0000ffff },
  61. { 1.0f, 1.0f, -1.0f, 0x00ff00ff },
  62. { 1.0f, -1.0f, -1.0f, 0x00ff0000 },
  63. //грань 5
  64. { 1.0f, -1.0f, -1.0f, 0x0000ffff },
  65. { -1.0f, -1.0f, -1.0f, 0x00ff00ff },
  66. { -1.0f, -1.0f, 1.0f, 0x00ff0000 },
  67. { 1.0f, -1.0f, 1.0f, 0x0000ff00 },
  68. //грань 6
  69. { 1.0f, 1.0f, 1.0f, 0x00ff00ff },
  70. { -1.0f, 1.0f, 1.0f, 0x00ff0000 },
  71. { -1.0f, 1.0f, -1.0f, 0x0000ff00 },
  72. { 1.0f, 1.0f, -1.0f, 0x000000ff }
  73. };
  74.  
  75. //Массив индексов:
  76. unsigned short CubeIndex[] =
  77. {
  78. 0, 1, 2, 2, 3, 0,
  79. 4, 5, 6, 6, 7, 4,
  80. 8, 9, 10, 10, 11, 8,
  81. 12, 13, 14, 14, 15, 12,
  82. 16, 17, 18, 18, 19, 16,
  83. 20, 21, 22, 22, 23, 20
  84. };
  85. float iWidth = (float)winRect.right - (float)winRect.left;
  86. float iHeight = (float)winRect.bottom - (float)winRect.top;
  87. float Aspect = iWidth / iHeight;
  88. float x = 1.0f / sqrt(2.0f);
  89. float y = x;
  90.  
  91. // Отправить объявления функций, включенных в этот модуль кода:
  92. LONG WINAPI ScreenSaverProc(HWND, UINT, WPARAM, LPARAM);
  93. BOOL WINAPI ScreenSaverConfigureDialog(HWND, UINT, WPARAM, LPARAM);
  94. BOOL WINAPI RegisterDialogClasses(HANDLE);
  95.  
  96. HRESULT DInit(HWND hWnd)
  97. {
  98. if (FAILED(Direct3D = Direct3DCreate9(D3D_SDK_VERSION)))
  99. return E_FAIL;
  100.  
  101. D3DDISPLAYMODE Display;
  102. if (FAILED(Direct3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Display)))
  103. return E_FAIL;
  104. D3DPRESENT_PARAMETERS Device;
  105. ZeroMemory(&Device, sizeof(Device));
  106. //Device.hDeviceWindow = hWnd;
  107. Device.BackBufferFormat = D3DFMT_R5G6B5;
  108. Device.BackBufferHeight = GetSystemMetrics(SM_CYSCREEN);
  109. Device.BackBufferWidth = GetSystemMetrics(SM_CXSCREEN);
  110. Device.Windowed = FALSE;
  111. Device.SwapEffect = D3DSWAPEFFECT_DISCARD;
  112. Device.FullScreen_RefreshRateInHz = Display.RefreshRate;
  113. Device.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
  114.  
  115. if (FAILED(Direct3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_MIXED_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &Device, &DirectDevice)))
  116. return E_FAIL;
  117. DirectDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
  118. //(*DirectDevice)->SetRenderState(D3DRS_AMBIENT, 0x00ffffff);
  119. DirectDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
  120.  
  121. return S_OK;
  122. }
  123.  
  124. HRESULT ObjInit()
  125. {
  126. VOID *vBuf;
  127. VOID *iBuf;
  128.  
  129. if (FAILED(DirectDevice->CreateVertexBuffer(sizeof(CUSTOMVERTEX)*24, 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &VBuffer, 0)))
  130. return E_FAIL;
  131.  
  132. if (FAILED(VBuffer->Lock(0, sizeof(CUSTOMVERTEX) * 24 , (void**)&vBuf, 0)))
  133. return E_FAIL;
  134. memcpy(vBuf, CubeVertex, sizeof(CUSTOMVERTEX) * 24 );
  135. VBuffer->Unlock();
  136.  
  137. if (FAILED(DirectDevice->CreateIndexBuffer(sizeof(short)*36, 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &IBuffer, 0)))
  138. return E_FAIL;
  139.  
  140. if (FAILED(IBuffer->Lock(0, sizeof(short) * 36 , (void**)&iBuf, 0)))
  141. return E_FAIL;
  142. memcpy(iBuf, CubeIndex, sizeof(short) * 36 );
  143. IBuffer->Unlock();
  144.  
  145. return S_OK;
  146. }
  147.  
  148. VOID Matrix(LPDIRECT3DDEVICE9 DirectDevice, D3DXMATRIX World, D3DXMATRIX View, float Aspect)
  149. {
  150. D3DXMATRIX Projection;
  151.  
  152. DirectDevice->SetTransform(D3DTS_WORLD, &World);
  153. DirectDevice->SetTransform(D3DTS_VIEW, &View);
  154. D3DXMatrixPerspectiveFovLH(&Projection, D3DX_PI / 4, Aspect, 0.25f, 10000.0f);
  155. DirectDevice->SetTransform(D3DTS_PROJECTION, &Projection);
  156. }
  157.  
  158. LONG WINAPI ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  159. {
  160. switch (message)
  161. {
  162. case WM_CREATE:
  163. GetWindowRect(hWnd, &winRect);
  164. timer_id = SetTimer(hWnd, 1, 1000, NULL);
  165. if (FAILED(DInit(hWnd)))
  166. return FALSE;
  167. //Иинциализация объекта:
  168. else if (FAILED(ObjInit()))
  169. return FALSE;
  170. break;
  171. case WM_TIMER:
  172. Time = timeGetTime() % 5000;
  173. Angle = Time * (2.0f * D3DX_PI) / 5000.0f;
  174. WorldR =
  175. {
  176. cos(Angle * 2) + (1 - cos(Angle * 2))*x*x, (1 - cos(Angle * 2))*x*y, sin(Angle * 2)*y, 0,
  177. (1 - cos(Angle * 2))*x*y, cos(Angle * 2) + (1 - cos(Angle * 2))*y*y, -sin(Angle * 2)*x, 0,
  178. -sin(Angle * 2)*y, sin(Angle * 2)*x, cos(Angle * 2), 0,
  179. 0, 0, 0, 1
  180. };
  181.  
  182. View =
  183. {
  184. abs(cos(Angle)), 0, 0, 0,
  185. 0, abs(cos(Angle)), 0, 0,
  186. 0, 0, abs(cos(Angle)), 0,
  187. 0, 0, 5, 1
  188. };
  189.  
  190. DirectDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0, 20, 20, 20), 1.0f, 0);
  191. DirectDevice->BeginScene();
  192. Matrix(DirectDevice, WorldR, View, Aspect);
  193. DirectDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
  194. DirectDevice->SetStreamSource(0, VBuffer, 0, sizeof(CUSTOMVERTEX));
  195. DirectDevice->SetIndices(IBuffer);
  196. DirectDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
  197. DirectDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 24, 0, 12);
  198. DirectDevice->EndScene();
  199. DirectDevice->Present(NULL, NULL, NULL, NULL);
  200. break;
  201. case WM_DESTROY:
  202. if (timer_id)
  203. KillTimer(hWnd, timer_id);
  204. if (IBuffer != NULL)
  205. IBuffer->Release();
  206. if (VBuffer != NULL)
  207. VBuffer->Release();
  208. if (DirectDevice != NULL)
  209. DirectDevice->Release();
  210. if (Direct3D != NULL)
  211. Direct3D->Release();
  212. PostQuitMessage(0);
  213. break;
  214. default:
  215. return DefScreenSaverProc(hWnd, message, wParam, lParam);
  216. }
  217.  
  218. return 0;
  219. }
  220. BOOL WINAPI ScreenSaverConfigureDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  221. {
  222. return FALSE;
  223. }
  224.  
  225. BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
  226. {
  227. return TRUE;
  228. }
  229.  
  230. Device.Windowed = TRUE;
  231.  
  232. Device.Windowed = FALSE;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement