Advertisement
Guest User

Untitled

a guest
Jan 9th, 2020
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //Подключаем библиотеки
  2. #pragma comment(lib,"d3d9.lib")
  3. #pragma comment(lib,"d3dx9.lib")
  4. #pragma comment(lib,"winmm.lib")
  5. #pragma comment(lib, "dinput8.lib")
  6. #pragma comment(lib , "dxguid.lib")
  7.  
  8. //Подключаем закголовчные файлы
  9. #include <windows.h>
  10. #include <d3d9.h>
  11. #include <d3dx9.h>
  12. #include <mmsystem.h>
  13. #include <dinput.h>
  14. #include <iostream>
  15.  
  16. #define KEYDOWN(name , key)(name[key]&0x80)
  17.  
  18. //Глобальные переменные
  19. HINSTANCE g_hInstance = NULL;           //Дескриптор приложения
  20. HWND g_hWnd = NULL;                     //Дескриптор окна
  21. int g_iWindowWidth = 800;               //Ширина окна
  22. int g_iWindowHeight = 600;              //Высота окна
  23. bool g_bApplicationState = true;        //Состояние приложения (true - работает/false - неработает)
  24. IDirect3D9* g_pDirect3D = NULL;         //Интерфейс для создания устройства рендеринга
  25. IDirect3DDevice9* g_pDirect3DDevice = NULL; //Интерфейс устройства рендеринга
  26. char key[256];
  27. IDirectInput8* i_pinput;
  28. IDirectInputDevice8* i_pDevice;
  29. ID3DXMesh* mesh = 0;
  30. float x = 0.0f;
  31. float y = 0.0f;
  32. float z = 0.0f;
  33. float speedTransform = 0.1f;
  34.  
  35.  
  36. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow); //Точка старта приложения
  37. long WINAPI WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam);//Обработчик сообщений
  38. bool InitDirect3D(D3DFORMAT ColorFormat, D3DFORMAT DepthFormat);        //Инициализация Direct3D
  39. void DrawFrame();                                                   //Рисуем кадр
  40. void Shutdown();                                                    //Освобождаем память
  41.  
  42.  
  43. VOID LightMaterial()
  44. {
  45.     D3DMATERIAL9 Material; // Материал
  46.     D3DLIGHT9 Light; // Свет
  47.     ZeroMemory(&Material, sizeof(D3DMATERIAL9));
  48.     Material.Diffuse.r = Material.Ambient.r = 1.0f;
  49.     Material.Diffuse.g = Material.Ambient.g = 1.0f;
  50.     Material.Diffuse.b = Material.Ambient.b = 1.0f;
  51.     Material.Diffuse.a = Material.Ambient.a = 1.0f;
  52.     // Установка свойств материала
  53.     g_pDirect3DDevice->SetMaterial(&Material);
  54.     ZeroMemory(&Light, sizeof(D3DLIGHT9));
  55.     // Тип источника света
  56.     Light.Type = D3DLIGHT_DIRECTIONAL;
  57.     // Задается белый свет
  58.     Light.Diffuse.r = 1.0f;
  59.     Light.Diffuse.g = 1.0f;
  60.     Light.Diffuse.b = 1.0f;
  61.     // Максимальное расстояние, на которое будет действовать источник света
  62.     Light.Range = 1000.0f;
  63.     // Вектор для определения направления света
  64.     D3DXVECTOR3 VectorDir;
  65.     VectorDir = D3DXVECTOR3(0, 0, 1),
  66.         // Установка нормали для вектора VectorDir
  67.         D3DXVec3Normalize((D3DXVECTOR3*)&Light.Direction, &VectorDir);
  68.     // Установка света
  69.     g_pDirect3DDevice->SetLight(0, &Light);
  70.     // Разрешение использовать созданные свойства для источника света
  71.     g_pDirect3DDevice->LightEnable(0, TRUE);
  72.     // Разрешение работы света
  73.     g_pDirect3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
  74.     // Включение окружающего освещения
  75.     g_pDirect3DDevice->SetRenderState(D3DRS_AMBIENT, 0);
  76.  
  77.     D3DXMATRIX matProj;
  78.  
  79.     D3DXMatrixPerspectiveFovLH(&matProj, D3DXToRadian(60), (FLOAT)g_iWindowWidth / (FLOAT)g_iWindowHeight, 1.0f, 100.0f);
  80.  
  81.     g_pDirect3DDevice->SetTransform(D3DTS_PROJECTION, &matProj);
  82. }
  83.  
  84. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
  85. {
  86.     g_hInstance = GetModuleHandle(NULL);
  87.  
  88.     WNDCLASSEX wc;
  89.     wc.cbSize = sizeof(WNDCLASSEX);             //Размер структуры
  90.     wc.style = CS_HREDRAW | CS_VREDRAW;         //Стили класса окна
  91.     wc.lpfnWndProc = WndProc;                           //Функция обработки сообщений
  92.     wc.cbClsExtra = 0;                              //Количество выделяемой памяти при создании приложения
  93.     wc.cbWndExtra = 0;                              //Количество выделяемой памяти при создании приложения
  94.     wc.hInstance = g_hInstance;                     //Дескриптор приложения
  95.     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //Загружаем стандартную иконку
  96.     wc.hCursor = LoadCursor(0, IDC_ARROW);          //Загружаем стандартный курсор
  97.     wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//Окно будет закрашено в белый цвет
  98.     wc.lpszMenuName = 0;                                //Не используем меню
  99.     wc.lpszClassName = "Курсовая";                      //Названия класса
  100.     wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);   //Загружаем стандартную иконку
  101.  
  102.     if (!RegisterClassEx(&wc))                              //Регестрируем класс в Windows
  103.     {
  104.         Shutdown();                                     //Освобаждем память
  105.         MessageBox(NULL, "Can`t register window class", "Error", MB_OK | MB_ICONERROR); //Выводим сообщение
  106.         return 0;                                       //Завершаем работу приложения
  107.     }
  108.  
  109.     g_hWnd = CreateWindowEx(                            //Создаем окно
  110.         WS_EX_APPWINDOW | WS_EX_WINDOWEDGE,             //Расшыренный стиль окна
  111.         "Курсовая",                                     //Названия класса окна
  112.         "Курсовая - Create Window. Init Direct3D",      //Названия окна
  113.         WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,//Стиль окна
  114.         0,                                          //Позиция окна по оси Х
  115.         0,                                          //Позиция окна по оси У
  116.         g_iWindowWidth,                             //Ширина окна
  117.         g_iWindowHeight,                            //Высота окна
  118.         NULL,                                       //Это наше главное окно
  119.         NULL,                                       //Нету меню
  120.         g_hInstance,                                //Дескриптор приложения
  121.         NULL);                                      //Дополнительный настройек неиспользуем
  122.  
  123.     if (g_hWnd == NULL)                             //Если не создали окно
  124.     {
  125.         Shutdown();
  126.         MessageBox(NULL, "Can`t create window", "Error", MB_OK | MB_ICONERROR);//Выводим сообщение
  127.         return 0;                                   //Завершаем работу приложения
  128.     }
  129.  
  130.     if (!InitDirect3D(D3DFMT_R5G6B5, D3DFMT_D16))       //Если не смогли инициализировать Direct3D
  131.     {
  132.         Shutdown();
  133.         MessageBox(NULL, "Can`t create direct3d", "Error", MB_OK | MB_ICONERROR);//Выводим сообщение
  134.         return 0;                                   //Завершаем работу приложения
  135.     }
  136.     ShowWindow(g_hWnd, SW_SHOW);                        //Отображаем окно
  137.     UpdateWindow(g_hWnd);                           //Обновляем окно
  138.     SetFocus(g_hWnd);                               //Устанавливаем фокус на наше окно
  139.     SetForegroundWindow(g_hWnd);                    //Устанавливаем приоритет окна выше среднего
  140.     MSG msg;
  141.     ZeroMemory(&msg, sizeof(msg));
  142.     D3DXCreateTeapot(g_pDirect3DDevice, &mesh, 0);
  143.     while (g_bApplicationState)                     //Начинаем бесконечный цыкл обработки сообщений
  144.     {
  145.         if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))//Получаем сообщения
  146.         {
  147.             TranslateMessage(&msg);                 //Обрабатываем сообщения
  148.             DispatchMessage(&msg);                  //Обрабатываем сообщения
  149.         }
  150.         else {
  151.             DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&i_pinput, NULL);
  152.             i_pinput->CreateDevice(GUID_SysKeyboard, &i_pDevice, NULL);
  153.             i_pDevice->SetDataFormat(&c_dfDIKeyboard);
  154.             i_pDevice->SetCooperativeLevel(g_hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
  155.             i_pDevice->Acquire();
  156.             i_pDevice->GetDeviceState(sizeof(key), (LPVOID)&key);
  157.             if (KEYDOWN(key, DIK_UP)) {
  158.                 z+= speedTransform;
  159.             }
  160.             if (KEYDOWN(key, DIK_DOWN)) {
  161.                 z-= speedTransform;
  162.             }
  163.             if (KEYDOWN(key, DIK_RIGHT)) {
  164.                 x+= speedTransform;
  165.             }
  166.             if (KEYDOWN(key, DIK_LEFT)) {
  167.                 x-= speedTransform;
  168.             }
  169.             if (KEYDOWN(key, DIK_1)) {
  170.                 y+= speedTransform;
  171.             }
  172.             if (KEYDOWN(key, DIK_2)) {
  173.                 y-= speedTransform;
  174.             }
  175.             if (KEYDOWN(key, DIK_3)) {
  176.                 speedTransform += 0.01;
  177.             }
  178.             if (KEYDOWN(key, DIK_4)) {
  179.                 speedTransform -= 0.01;
  180.             }
  181.             DrawFrame();                            //Если сообщений нету рисуем кадры
  182.         }
  183.     }
  184.  
  185.     Shutdown();                                     //Освобаждем память
  186.     return 0;                                       //Завершаем работу приложения
  187. }
  188.  
  189. long WINAPI WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
  190. {
  191.     switch (iMsg)
  192.     {
  193.     case WM_DESTROY:                            //Если получаем сообщение о разрушении окна
  194.     {
  195.         g_bApplicationState = false;            //Устанавливаем состояния приложения в false (это значит что цыкл обработки сообщений остановиться)
  196.         return 0;                               //Говорим виндовс что мы это сообщение обработали
  197.     }
  198.     }
  199.  
  200.     return DefWindowProc(hWnd, iMsg, wParam, lParam);   //Если ету для нас нужных сооющений, пусть это обрабатывает виндовс
  201. }
  202.  
  203. bool InitDirect3D(D3DFORMAT ColorFormat, D3DFORMAT DepthFormat)
  204. {
  205.     if ((g_pDirect3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)//Создаем интерфейс Direct3D
  206.         return false;                               //Иначе возвращяем false
  207.  
  208.     D3DPRESENT_PARAMETERS PresParam;                //Структура с помощью которой передаем информацию устройству рендеринга при его создании
  209.     ZeroMemory(&PresParam, sizeof(PresParam));      //Обнуляем
  210.  
  211.     HRESULT hr = NULL;                              //Создаем переменную для записи в неё резуельтатов работы функций
  212.  
  213.     D3DDISPLAYMODE DisplayMode;                     //Структура для получения информации о режиме отображения в виндовс
  214.     hr = g_pDirect3D->GetAdapterDisplayMode(        //Получаем режим отображения
  215.         D3DADAPTER_DEFAULT,                         //Используем первичную видеокарту
  216.         &DisplayMode);                              //Записываем режим отображения в DisplayMode
  217.  
  218.     if (FAILED(hr))                                 //Если не получилось
  219.         return false;                               //Возвращяем false
  220.  
  221.     PresParam.hDeviceWindow = g_hWnd;               //Дескриптор окна
  222.     PresParam.Windowed = true;                      //Оконный режим?
  223.     PresParam.BackBufferWidth = g_iWindowWidth;     //Ширина заднего буфера
  224.     PresParam.BackBufferHeight = g_iWindowHeight;   //Высота заднего буфера
  225.     PresParam.BackBufferCount = 1;                  //Количество задних буферов
  226.     PresParam.EnableAutoDepthStencil = true;        //Используем буфер глубины и стенцил буфер
  227.     PresParam.AutoDepthStencilFormat = DepthFormat; //Формат буфера глубины
  228.     PresParam.SwapEffect = D3DSWAPEFFECT_DISCARD;       //Режим смены кадров
  229.     PresParam.BackBufferFormat = DisplayMode.Format;//Устанавливаем формат пикселя определеный в виндовс
  230.  
  231.  
  232.     hr = g_pDirect3D->CreateDevice(             //Создаем устройство рендеринга
  233.         D3DADAPTER_DEFAULT,                         //Используем первичную видеокарту
  234.         D3DDEVTYPE_HAL,                             //Устройства рендеринга использует возможности видеокарты
  235.         g_hWnd,                                     //Дескриптор окна
  236.         D3DCREATE_HARDWARE_VERTEXPROCESSING,        //Обрабатываем вершинны видеокартой
  237.         &PresParam,                                 //Отдаем параметры устройства
  238.         &g_pDirect3DDevice);                        //Создаем устройство рендеринга
  239.  
  240.     g_pDirect3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
  241.  
  242.     g_pDirect3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
  243.  
  244.     if (SUCCEEDED(hr))                              //Если получилось
  245.         return true;                                //Возвращяем true
  246.  
  247.     return false;                                   //Возвращяем false
  248. }
  249.  
  250. void DrawFrame()
  251. {
  252.     HRESULT hr = g_pDirect3DDevice->TestCooperativeLevel();//Проверяем потерял ли Direct3DDevice устройство
  253.  
  254.     if (hr == D3DERR_DEVICELOST)                        //Если да то
  255.         return;                                     //Выходи из функции 
  256.  
  257.     g_pDirect3DDevice->Clear(                       //Очищаем задний буфер
  258.         0L,                                         //Размер буфера, 0 - весь буфер
  259.         NULL,                                       //Область которую будем очищать, NULL - весь буфер
  260.         D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,         //Чистим задний буфер и буфер глубины
  261.         D3DCOLOR_XRGB(128, 128, 128),                       //Цвет в который очищаем задний буфер, в нашем случае черный
  262.         1.0f,                                       //Очищаем буфер глубины, заполнив его единицами
  263.         0L);                                        //Этот параметрт игнорируеться так как не выстовлен соответсвующий флаг
  264.  
  265.     g_pDirect3DDevice->BeginScene();                //Начало сцены
  266.     LightMaterial();
  267.     mesh->DrawSubset(0);
  268.     D3DXMATRIX trans;
  269.     D3DXMatrixTranslation(&trans, x , y, z);
  270.     g_pDirect3DDevice->SetTransform(D3DTS_WORLD, &trans);
  271.     g_pDirect3DDevice->EndScene();                  //Конец сцены
  272.     g_pDirect3DDevice->Present(NULL, NULL, NULL, NULL);//Отображаем весь задний буфер
  273.  
  274. }
  275.  
  276. void Shutdown()
  277. {
  278.     if (g_pDirect3DDevice != NULL)                  //Если мы еще не освободили интерфейс рендеринга
  279.     {
  280.         g_pDirect3DDevice->Release();               //То освобождаем его
  281.         g_pDirect3DDevice = NULL;                   //И устанавливаем в ноль
  282.     }
  283.  
  284.     if (g_pDirect3D != NULL)                            //Если мы еще не освободили интерфейс d3d
  285.     {
  286.         g_pDirect3D->Release();                     //То освобождаем его
  287.         g_pDirect3D = NULL;                         //И устанавливаем в ноль
  288.     }
  289.  
  290.     if (!DestroyWindow(g_hWnd))                     //Если не получилось разрушить окно
  291.         g_hWnd = NULL;                              //Устанавливаем дескриптор окна в ноль
  292.  
  293.     if (!UnregisterClass("Курсовая", g_hInstance))  //Если не получилось удалить наше зарегестрированое окно
  294.         g_hInstance = NULL;                         //Устанавливаем дескриптор приложения в ноль
  295. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement