Advertisement
Guest User

Untitled

a guest
Dec 16th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.51 KB | None | 0 0
  1. //Подключаем библиотеки
  2. #pragma comment(lib,"d3d9.lib")
  3. #pragma comment(lib,"d3dx9.lib")
  4. #pragma comment(lib,"winmm.lib")
  5.  
  6. //Подключаем закголовчные файлы
  7. #include <windows.h>
  8. #include <d3d9.h>
  9. #include <d3dx9.h>
  10.  
  11. //Глобальные переменные
  12. HINSTANCE g_hInstance = NULL; //Дескриптор приложения
  13. HWND g_hWnd = NULL; //Дескриптор окна
  14. int g_iWindowWidth = 800; //Ширина окна
  15. int g_iWindowHeight = 600; //Высота окна
  16. bool g_bApplicationState = true; //Состояние приложения (true - работает/false - неработает)
  17. IDirect3D9* g_pDirect3D = NULL; //Интерфейс для создания устройства рендеринга
  18. IDirect3DDevice9* g_pDirect3DDevice = NULL; //Интерфейс устройства рендеринга
  19. IDirect3DVertexBuffer9* g_vertex = NULL;
  20.  
  21. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow); //Точка старта приложения
  22. long WINAPI WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam);//Обработчик сообщений
  23. bool InitDirect3D(D3DFORMAT ColorFormat, D3DFORMAT DepthFormat); //Инициализация Direct3D
  24. void DrawFrame(); //Рисуем кадр
  25. void Shutdown(); //Освобождаем память
  26.  
  27. struct Vert {
  28. float x, y, z; // Переменные координат
  29. DWORD color; //Цвет вершин
  30. };
  31. //Функция инициализации вершин
  32. HRESULT InitialBufferVershin() {
  33. // Инициализация вершин
  34. Vert Versh[] = {
  35. //Координаты буквы Х
  36. { -5.0, -4.5, 3, 0x0000ff },
  37. {-5.0, -5.0, 3, 0x0000ff },
  38. { -1.5, -1.0, 3, 0x0000ff },
  39.  
  40. {-5.0 , -5.0 , 3, 0x0000ff},
  41. {-1.5 , -1.0 , 3, 0x0000ff},
  42. {-1.5 , -2.5 , 3, 0x0000ff},
  43.  
  44. { -4.5, -1.0, 3, 0x0000ff },
  45. {-1.5 , -4.5, 3, 0x0000ff },
  46. { -2, -5.0, 3, 0x0000ff },
  47.  
  48. {-4.5 , -1.0 , 3, 0x0000ff},
  49. {-2.0 , -5.0 , 3, 0x0000ff},
  50. {-5 , -1 , 3, 0x0000ff},
  51.  
  52. //В
  53.  
  54. { 1, -1, 3, 0x0000ff },
  55. { 2, -1, 3, 0x0000ff },
  56. { 1, -5, 3, 0x0000ff },
  57.  
  58. { 2, -1, 3, 0x0000ff },
  59. { 1, -5, 3, 0x0000ff },
  60. { 2, -5, 3, 0x0000ff },
  61.  
  62. { 2, -1, 3, 0x0000ff },
  63. { 4, -1.5, 3, 0x0000ff },
  64. { 2, -2, 3, 0x0000ff },
  65.  
  66. { 2, -3.0, 3, 0x0000ff },
  67. { 4, -1.5, 3, 0x0000ff },
  68. { 2, -3.5, 3, 0x0000ff },
  69.  
  70. { 2, -3.0, 3, 0x0000ff },
  71. { 4, -4.5, 3, 0x0000ff },
  72. { 2, -3.5, 3, 0x0000ff },
  73.  
  74. { 2, -4.5, 3, 0x0000ff },
  75. { 4, -4.5, 3, 0x0000ff },
  76. { 2, -5.0, 3, 0x0000ff },
  77.  
  78. //В
  79.  
  80. { 5, -1, 3, 0x0000ff },
  81. { 6, -1, 3, 0x0000ff },
  82. { 5, -5, 3, 0x0000ff },
  83.  
  84. { 6, -1, 3, 0x0000ff },
  85. { 5, -5, 3, 0x0000ff },
  86. { 6, -5, 3, 0x0000ff },
  87.  
  88. { 6, -1, 3, 0x0000ff },
  89. { 8, -1.5, 3, 0x0000ff },
  90. { 6, -2, 3, 0x0000ff },
  91.  
  92. { 6, -3.0, 3, 0x0000ff },
  93. { 8, -1.5, 3, 0x0000ff },
  94. { 6, -3.5, 3, 0x0000ff },
  95.  
  96. { 6, -3.0, 3, 0x0000ff },
  97. { 8, -4.5, 3, 0x0000ff },
  98. { 6, -3.5, 3, 0x0000ff },
  99.  
  100. { 6, -4.5, 3, 0x0000ff },
  101. { 8, -4.5, 3, 0x0000ff },
  102. { 6, -5.0, 3, 0x0000ff },
  103.  
  104. };
  105. // Создание буфера вершин
  106. if (FAILED(g_pDirect3DDevice->CreateVertexBuffer(70 * sizeof(Vert), 0, D3DFVF_XYZRHW | D3DFVF_DIFFUSE, D3DPOOL_DEFAULT, &g_vertex, NULL)))
  107. return E_FAIL;
  108. // Заполнение буфера вершин данными
  109. void* pBV;
  110. // Блокировка буфера вершин
  111. if (FAILED(g_vertex->Lock(0, sizeof(Versh), &pBV, 0)))
  112. return E_FAIL;
  113. // Копирование в буфер
  114. memcpy(pBV, Versh, sizeof(Versh));
  115. // Разблокировка буфера вершин
  116. g_vertex->Unlock();
  117. return S_OK;
  118. }
  119.  
  120. VOID Matrix() {
  121. D3DXMATRIX MW, MW1, MW2; // мировая матрица
  122. D3DXMATRIX MV; // матрица вида
  123. D3DXMATRIX MP; // матрица проекции
  124. UINT Time = timeGetTime() % 5000;
  125. FLOAT Var = Time * (2 * D3DX_PI) / 5000;;
  126. // Привязка буфера вершин к устройству
  127. g_pDirect3DDevice->SetStreamSource(0, g_vertex, 0, sizeof(Vert));
  128. // Установка формата вершин
  129. g_pDirect3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE);
  130.  
  131. // Вращение вокруг оси X и оси Y
  132. // Мировая матрица
  133. // Вращение вокруг оси X
  134. D3DXMatrixRotationX(&MW1, Var);
  135. // Вращение вокруг оси Y
  136. D3DXMatrixRotationZ(&MW2, Var);
  137. // Объединение матриц
  138. D3DXMatrixMultiply(&MW, &MW1, &MW2);
  139. // Установка преобразования
  140. g_pDirect3DDevice->SetTransform(D3DTS_WORLD, &MW);
  141. // Матрица вида
  142. // Установка камеры
  143. D3DXMatrixLookAtLH(&MV, &D3DXVECTOR3(0, 0, -19), &D3DXVECTOR3(0, 0, 0), &D3DXVECTOR3(0, 1, 0));
  144. // Установка преобразования
  145. g_pDirect3DDevice->SetTransform(D3DTS_VIEW, &MV);
  146. // Матрица проекции
  147. // Установка матрицы проекций для отображения трехмерной сцены на двумерной плоскости монитора
  148. D3DXMatrixPerspectiveFovLH(&MP, D3DX_PI / 4, 1, 1, 100);
  149. // Установка преобразования
  150. g_pDirect3DDevice->SetTransform(D3DTS_PROJECTION, &MP);
  151. }
  152.  
  153. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
  154. {
  155. g_hInstance = GetModuleHandle(NULL);
  156.  
  157. WNDCLASSEX wc;
  158. wc.cbSize = sizeof(WNDCLASSEX); //Размер структуры
  159. wc.style = CS_HREDRAW | CS_VREDRAW; //Стили класса окна
  160. wc.lpfnWndProc = WndProc; //Функция обработки сообщений
  161. wc.cbClsExtra = 0; //Количество выделяемой памяти при создании приложения
  162. wc.cbWndExtra = 0; //Количество выделяемой памяти при создании приложения
  163. wc.hInstance = g_hInstance; //Дескриптор приложения
  164. wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //Загружаем стандартную иконку
  165. wc.hCursor = LoadCursor(0, IDC_ARROW); //Загружаем стандартный курсор
  166. wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//Окно будет закрашено в белый цвет
  167. wc.lpszMenuName = 0; //Не используем меню
  168. wc.lpszClassName = "Вторая работа"; //Названия класса
  169. wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //Загружаем стандартную иконку
  170.  
  171. if (!RegisterClassEx(&wc)) //Регестрируем класс в Windows
  172. {
  173. Shutdown(); //Освобаждем память
  174. MessageBox(NULL, "Can`t register window class", "Error", MB_OK | MB_ICONERROR); //Выводим сообщение
  175. return 0; //Завершаем работу приложения
  176. }
  177.  
  178. g_hWnd = CreateWindowEx( //Создаем окно
  179. WS_EX_APPWINDOW | WS_EX_WINDOWEDGE, //Расшыренный стиль окна
  180. "Вторая работа", //Названия класса окна
  181. "Вторая работа - Create Window. Init Direct3D", //Названия окна
  182. WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,//Стиль окна
  183. 0, //Позиция окна по оси Х
  184. 0, //Позиция окна по оси У
  185. g_iWindowWidth, //Ширина окна
  186. g_iWindowHeight, //Высота окна
  187. NULL, //Это наше главное окно
  188. NULL, //Нету меню
  189. g_hInstance, //Дескриптор приложения
  190. NULL); //Дополнительный настройек неиспользуем
  191.  
  192. if (g_hWnd == NULL) //Если не создали окно
  193. {
  194. Shutdown();
  195. MessageBox(NULL, "Can`t create window", "Error", MB_OK | MB_ICONERROR);//Выводим сообщение
  196. return 0; //Завершаем работу приложения
  197. }
  198.  
  199. if (!InitDirect3D(D3DFMT_R5G6B5, D3DFMT_D16)) //Если не смогли инициализировать Direct3D
  200. {
  201. Shutdown();
  202. MessageBox(NULL, "Can`t create direct3d", "Error", MB_OK | MB_ICONERROR);//Выводим сообщение
  203. return 0; //Завершаем работу приложения
  204. }
  205.  
  206. ShowWindow(g_hWnd, SW_SHOW); //Отображаем окно
  207. UpdateWindow(g_hWnd); //Обновляем окно
  208. SetFocus(g_hWnd); //Устанавливаем фокус на наше окно
  209. SetForegroundWindow(g_hWnd); //Устанавливаем приоритет окна выше среднего
  210. MSG msg;
  211. ZeroMemory(&msg, sizeof(msg));
  212. if (SUCCEEDED(InitialBufferVershin())) {
  213. while (g_bApplicationState) //Начинаем бесконечный цыкл обработки сообщений
  214. {
  215. if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))//Получаем сообщения
  216. {
  217. TranslateMessage(&msg); //Обрабатываем сообщения
  218. DispatchMessage(&msg); //Обрабатываем сообщения
  219. }
  220. else
  221. DrawFrame(); //Если сообщений нету рисуем кадры
  222. }
  223. }
  224.  
  225. Shutdown(); //Освобаждем память
  226. return 0; //Завершаем работу приложения
  227. }
  228.  
  229. long WINAPI WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
  230. {
  231. switch (iMsg)
  232. {
  233. case WM_DESTROY: //Если получаем сообщение о разрушении окна
  234. {
  235. g_bApplicationState = false; //Устанавливаем состояния приложения в false (это значит что цыкл обработки сообщений остановиться)
  236. return 0; //Говорим виндовс что мы это сообщение обработали
  237. }
  238. }
  239.  
  240. return DefWindowProc(hWnd, iMsg, wParam, lParam); //Если ету для нас нужных сооющений, пусть это обрабатывает виндовс
  241. }
  242.  
  243. bool InitDirect3D(D3DFORMAT ColorFormat, D3DFORMAT DepthFormat)
  244. {
  245. if ((g_pDirect3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)//Создаем интерфейс Direct3D
  246. return false; //Иначе возвращяем false
  247.  
  248. D3DPRESENT_PARAMETERS PresParam; //Структура с помощью которой передаем информацию устройству рендеринга при его создании
  249. ZeroMemory(&PresParam, sizeof(PresParam)); //Обнуляем
  250.  
  251. HRESULT hr = NULL; //Создаем переменную для записи в неё резуельтатов работы функций
  252.  
  253. D3DDISPLAYMODE DisplayMode; //Структура для получения информации о режиме отображения в виндовс
  254. hr = g_pDirect3D->GetAdapterDisplayMode( //Получаем режим отображения
  255. D3DADAPTER_DEFAULT, //Используем первичную видеокарту
  256. &DisplayMode); //Записываем режим отображения в DisplayMode
  257.  
  258. if (FAILED(hr)) //Если не получилось
  259. return false; //Возвращяем false
  260.  
  261. PresParam.hDeviceWindow = g_hWnd; //Дескриптор окна
  262. PresParam.Windowed = true; //Оконный режим?
  263. PresParam.BackBufferWidth = g_iWindowWidth; //Ширина заднего буфера
  264. PresParam.BackBufferHeight = g_iWindowHeight; //Высота заднего буфера
  265. PresParam.BackBufferCount = 1; //Количество задних буферов
  266. PresParam.EnableAutoDepthStencil = true; //Используем буфер глубины и стенцил буфер
  267. PresParam.AutoDepthStencilFormat = DepthFormat; //Формат буфера глубины
  268. PresParam.SwapEffect = D3DSWAPEFFECT_FLIP; //Режим смены кадров
  269. PresParam.BackBufferFormat = DisplayMode.Format;//Устанавливаем формат пикселя определеный в виндовс
  270.  
  271. hr = g_pDirect3D->CreateDevice( //Создаем устройство рендеринга
  272. D3DADAPTER_DEFAULT, //Используем первичную видеокарту
  273. D3DDEVTYPE_HAL, //Устройства рендеринга использует возможности видеокарты
  274. g_hWnd, //Дескриптор окна
  275. D3DCREATE_HARDWARE_VERTEXPROCESSING, //Обрабатываем вершинны видеокартой
  276. &PresParam, //Отдаем параметры устройства
  277. &g_pDirect3DDevice); //Создаем устройство рендеринга
  278.  
  279. g_pDirect3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
  280. // Отключение освещения
  281. g_pDirect3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
  282.  
  283. if (SUCCEEDED(hr)) //Если получилось
  284. return true; //Возвращяем true
  285.  
  286. return false; //Возвращяем false
  287. }
  288.  
  289. void DrawFrame()
  290. {
  291. HRESULT hr = g_pDirect3DDevice->TestCooperativeLevel();//Проверяем потерял ли Direct3DDevice устройство
  292.  
  293. if (hr == D3DERR_DEVICELOST) //Если да то
  294. return; //Выходи из функции
  295.  
  296. g_pDirect3DDevice->Clear( //Очищаем задний буфер
  297. 0L, //Размер буфера, 0 - весь буфер
  298. NULL, //Область которую будем очищать, NULL - весь буфер
  299. D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, //Чистим задний буфер и буфер глубины
  300. D3DCOLOR_XRGB(0, 0, 0), //Цвет в который очищаем задний буфер, в нашем случае черный
  301. 1.0f, //Очищаем буфер глубины, заполнив его единицами
  302. 0L); //Этот параметрт игнорируеться так как не выстовлен соответсвующий флаг
  303.  
  304. g_pDirect3DDevice->BeginScene(); //Начало сцены
  305. Matrix();
  306. // Рисование примитивов
  307. g_pDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 40);
  308. g_pDirect3DDevice->EndScene(); //Конец сцены
  309. g_pDirect3DDevice->Present(NULL, NULL, NULL, NULL);//Отображаем весь задний буфер
  310.  
  311. }
  312.  
  313. void Shutdown()
  314. {
  315. if (g_pDirect3DDevice != NULL) //Если мы еще не освободили интерфейс рендеринга
  316. {
  317. g_pDirect3DDevice->Release(); //То освобождаем его
  318. g_pDirect3DDevice = NULL; //И устанавливаем в ноль
  319. }
  320.  
  321. if (g_pDirect3D != NULL) //Если мы еще не освободили интерфейс d3d
  322. {
  323. g_pDirect3D->Release(); //То освобождаем его
  324. g_pDirect3D = NULL; //И устанавливаем в ноль
  325. }
  326.  
  327. if (!DestroyWindow(g_hWnd)) //Если не получилось разрушить окно
  328. g_hWnd = NULL; //Устанавливаем дескриптор окна в ноль
  329.  
  330. if (!UnregisterClass("Вторая работа", g_hInstance)) //Если не получилось удалить наше зарегестрированое окно
  331. g_hInstance = NULL; //Устанавливаем дескриптор приложения в ноль
  332. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement