Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Подключаем библиотеки
- #pragma comment(lib,"d3d9.lib")
- #pragma comment(lib,"d3dx9.lib")
- #pragma comment(lib,"winmm.lib")
- //Подключаем закголовчные файлы
- #include <windows.h>
- #include <d3d9.h>
- #include <d3dx9.h>
- //Глобальные переменные
- HINSTANCE g_hInstance = NULL; //Дескриптор приложения
- HWND g_hWnd = NULL; //Дескриптор окна
- int g_iWindowWidth = 800; //Ширина окна
- int g_iWindowHeight = 600; //Высота окна
- bool g_bApplicationState = true; //Состояние приложения (true - работает/false - неработает)
- IDirect3D9* g_pDirect3D = NULL; //Интерфейс для создания устройства рендеринга
- IDirect3DDevice9* g_pDirect3DDevice = NULL; //Интерфейс устройства рендеринга
- IDirect3DVertexBuffer9* g_vertex = NULL;
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow); //Точка старта приложения
- long WINAPI WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam);//Обработчик сообщений
- bool InitDirect3D(D3DFORMAT ColorFormat, D3DFORMAT DepthFormat); //Инициализация Direct3D
- void DrawFrame(); //Рисуем кадр
- void Shutdown(); //Освобождаем память
- struct Vert {
- float x, y, z; // Переменные координат
- DWORD color; //Цвет вершин
- };
- //Функция инициализации вершин
- HRESULT InitialBufferVershin() {
- // Инициализация вершин
- Vert Versh[] = {
- //Координаты буквы Х
- { -5.0, -4.5, 3, 0x0000ff },
- {-5.0, -5.0, 3, 0x0000ff },
- { -1.5, -1.0, 3, 0x0000ff },
- {-5.0 , -5.0 , 3, 0x0000ff},
- {-1.5 , -1.0 , 3, 0x0000ff},
- {-1.5 , -2.5 , 3, 0x0000ff},
- { -4.5, -1.0, 3, 0x0000ff },
- {-1.5 , -4.5, 3, 0x0000ff },
- { -2, -5.0, 3, 0x0000ff },
- {-4.5 , -1.0 , 3, 0x0000ff},
- {-2.0 , -5.0 , 3, 0x0000ff},
- {-5 , -1 , 3, 0x0000ff},
- //В
- { 1, -1, 3, 0x0000ff },
- { 2, -1, 3, 0x0000ff },
- { 1, -5, 3, 0x0000ff },
- { 2, -1, 3, 0x0000ff },
- { 1, -5, 3, 0x0000ff },
- { 2, -5, 3, 0x0000ff },
- { 2, -1, 3, 0x0000ff },
- { 4, -1.5, 3, 0x0000ff },
- { 2, -2, 3, 0x0000ff },
- { 2, -3.0, 3, 0x0000ff },
- { 4, -1.5, 3, 0x0000ff },
- { 2, -3.5, 3, 0x0000ff },
- { 2, -3.0, 3, 0x0000ff },
- { 4, -4.5, 3, 0x0000ff },
- { 2, -3.5, 3, 0x0000ff },
- { 2, -4.5, 3, 0x0000ff },
- { 4, -4.5, 3, 0x0000ff },
- { 2, -5.0, 3, 0x0000ff },
- //В
- { 5, -1, 3, 0x0000ff },
- { 6, -1, 3, 0x0000ff },
- { 5, -5, 3, 0x0000ff },
- { 6, -1, 3, 0x0000ff },
- { 5, -5, 3, 0x0000ff },
- { 6, -5, 3, 0x0000ff },
- { 6, -1, 3, 0x0000ff },
- { 8, -1.5, 3, 0x0000ff },
- { 6, -2, 3, 0x0000ff },
- { 6, -3.0, 3, 0x0000ff },
- { 8, -1.5, 3, 0x0000ff },
- { 6, -3.5, 3, 0x0000ff },
- { 6, -3.0, 3, 0x0000ff },
- { 8, -4.5, 3, 0x0000ff },
- { 6, -3.5, 3, 0x0000ff },
- { 6, -4.5, 3, 0x0000ff },
- { 8, -4.5, 3, 0x0000ff },
- { 6, -5.0, 3, 0x0000ff },
- };
- // Создание буфера вершин
- if (FAILED(g_pDirect3DDevice->CreateVertexBuffer(70 * sizeof(Vert), 0, D3DFVF_XYZRHW | D3DFVF_DIFFUSE, D3DPOOL_DEFAULT, &g_vertex, NULL)))
- return E_FAIL;
- // Заполнение буфера вершин данными
- void* pBV;
- // Блокировка буфера вершин
- if (FAILED(g_vertex->Lock(0, sizeof(Versh), &pBV, 0)))
- return E_FAIL;
- // Копирование в буфер
- memcpy(pBV, Versh, sizeof(Versh));
- // Разблокировка буфера вершин
- g_vertex->Unlock();
- return S_OK;
- }
- VOID Matrix() {
- D3DXMATRIX MW, MW1, MW2; // мировая матрица
- D3DXMATRIX MV; // матрица вида
- D3DXMATRIX MP; // матрица проекции
- UINT Time = timeGetTime() % 5000;
- FLOAT Var = Time * (2 * D3DX_PI) / 5000;;
- // Привязка буфера вершин к устройству
- g_pDirect3DDevice->SetStreamSource(0, g_vertex, 0, sizeof(Vert));
- // Установка формата вершин
- g_pDirect3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE);
- // Вращение вокруг оси X и оси Y
- // Мировая матрица
- // Вращение вокруг оси X
- D3DXMatrixRotationX(&MW1, Var);
- // Вращение вокруг оси Y
- D3DXMatrixRotationZ(&MW2, Var);
- // Объединение матриц
- D3DXMatrixMultiply(&MW, &MW1, &MW2);
- // Установка преобразования
- g_pDirect3DDevice->SetTransform(D3DTS_WORLD, &MW);
- // Матрица вида
- // Установка камеры
- D3DXMatrixLookAtLH(&MV, &D3DXVECTOR3(0, 0, -19), &D3DXVECTOR3(0, 0, 0), &D3DXVECTOR3(0, 1, 0));
- // Установка преобразования
- g_pDirect3DDevice->SetTransform(D3DTS_VIEW, &MV);
- // Матрица проекции
- // Установка матрицы проекций для отображения трехмерной сцены на двумерной плоскости монитора
- D3DXMatrixPerspectiveFovLH(&MP, D3DX_PI / 4, 1, 1, 100);
- // Установка преобразования
- g_pDirect3DDevice->SetTransform(D3DTS_PROJECTION, &MP);
- }
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
- {
- g_hInstance = GetModuleHandle(NULL);
- WNDCLASSEX wc;
- wc.cbSize = sizeof(WNDCLASSEX); //Размер структуры
- wc.style = CS_HREDRAW | CS_VREDRAW; //Стили класса окна
- wc.lpfnWndProc = WndProc; //Функция обработки сообщений
- wc.cbClsExtra = 0; //Количество выделяемой памяти при создании приложения
- wc.cbWndExtra = 0; //Количество выделяемой памяти при создании приложения
- wc.hInstance = g_hInstance; //Дескриптор приложения
- wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //Загружаем стандартную иконку
- wc.hCursor = LoadCursor(0, IDC_ARROW); //Загружаем стандартный курсор
- wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//Окно будет закрашено в белый цвет
- wc.lpszMenuName = 0; //Не используем меню
- wc.lpszClassName = "Вторая работа"; //Названия класса
- wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //Загружаем стандартную иконку
- if (!RegisterClassEx(&wc)) //Регестрируем класс в Windows
- {
- Shutdown(); //Освобаждем память
- MessageBox(NULL, "Can`t register window class", "Error", MB_OK | MB_ICONERROR); //Выводим сообщение
- return 0; //Завершаем работу приложения
- }
- g_hWnd = CreateWindowEx( //Создаем окно
- WS_EX_APPWINDOW | WS_EX_WINDOWEDGE, //Расшыренный стиль окна
- "Вторая работа", //Названия класса окна
- "Вторая работа - Create Window. Init Direct3D", //Названия окна
- WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,//Стиль окна
- 0, //Позиция окна по оси Х
- 0, //Позиция окна по оси У
- g_iWindowWidth, //Ширина окна
- g_iWindowHeight, //Высота окна
- NULL, //Это наше главное окно
- NULL, //Нету меню
- g_hInstance, //Дескриптор приложения
- NULL); //Дополнительный настройек неиспользуем
- if (g_hWnd == NULL) //Если не создали окно
- {
- Shutdown();
- MessageBox(NULL, "Can`t create window", "Error", MB_OK | MB_ICONERROR);//Выводим сообщение
- return 0; //Завершаем работу приложения
- }
- if (!InitDirect3D(D3DFMT_R5G6B5, D3DFMT_D16)) //Если не смогли инициализировать Direct3D
- {
- Shutdown();
- MessageBox(NULL, "Can`t create direct3d", "Error", MB_OK | MB_ICONERROR);//Выводим сообщение
- return 0; //Завершаем работу приложения
- }
- ShowWindow(g_hWnd, SW_SHOW); //Отображаем окно
- UpdateWindow(g_hWnd); //Обновляем окно
- SetFocus(g_hWnd); //Устанавливаем фокус на наше окно
- SetForegroundWindow(g_hWnd); //Устанавливаем приоритет окна выше среднего
- MSG msg;
- ZeroMemory(&msg, sizeof(msg));
- if (SUCCEEDED(InitialBufferVershin())) {
- while (g_bApplicationState) //Начинаем бесконечный цыкл обработки сообщений
- {
- if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))//Получаем сообщения
- {
- TranslateMessage(&msg); //Обрабатываем сообщения
- DispatchMessage(&msg); //Обрабатываем сообщения
- }
- else
- DrawFrame(); //Если сообщений нету рисуем кадры
- }
- }
- Shutdown(); //Освобаждем память
- return 0; //Завершаем работу приложения
- }
- long WINAPI WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
- {
- switch (iMsg)
- {
- case WM_DESTROY: //Если получаем сообщение о разрушении окна
- {
- g_bApplicationState = false; //Устанавливаем состояния приложения в false (это значит что цыкл обработки сообщений остановиться)
- return 0; //Говорим виндовс что мы это сообщение обработали
- }
- }
- return DefWindowProc(hWnd, iMsg, wParam, lParam); //Если ету для нас нужных сооющений, пусть это обрабатывает виндовс
- }
- bool InitDirect3D(D3DFORMAT ColorFormat, D3DFORMAT DepthFormat)
- {
- if ((g_pDirect3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)//Создаем интерфейс Direct3D
- return false; //Иначе возвращяем false
- D3DPRESENT_PARAMETERS PresParam; //Структура с помощью которой передаем информацию устройству рендеринга при его создании
- ZeroMemory(&PresParam, sizeof(PresParam)); //Обнуляем
- HRESULT hr = NULL; //Создаем переменную для записи в неё резуельтатов работы функций
- D3DDISPLAYMODE DisplayMode; //Структура для получения информации о режиме отображения в виндовс
- hr = g_pDirect3D->GetAdapterDisplayMode( //Получаем режим отображения
- D3DADAPTER_DEFAULT, //Используем первичную видеокарту
- &DisplayMode); //Записываем режим отображения в DisplayMode
- if (FAILED(hr)) //Если не получилось
- return false; //Возвращяем false
- PresParam.hDeviceWindow = g_hWnd; //Дескриптор окна
- PresParam.Windowed = true; //Оконный режим?
- PresParam.BackBufferWidth = g_iWindowWidth; //Ширина заднего буфера
- PresParam.BackBufferHeight = g_iWindowHeight; //Высота заднего буфера
- PresParam.BackBufferCount = 1; //Количество задних буферов
- PresParam.EnableAutoDepthStencil = true; //Используем буфер глубины и стенцил буфер
- PresParam.AutoDepthStencilFormat = DepthFormat; //Формат буфера глубины
- PresParam.SwapEffect = D3DSWAPEFFECT_FLIP; //Режим смены кадров
- PresParam.BackBufferFormat = DisplayMode.Format;//Устанавливаем формат пикселя определеный в виндовс
- hr = g_pDirect3D->CreateDevice( //Создаем устройство рендеринга
- D3DADAPTER_DEFAULT, //Используем первичную видеокарту
- D3DDEVTYPE_HAL, //Устройства рендеринга использует возможности видеокарты
- g_hWnd, //Дескриптор окна
- D3DCREATE_HARDWARE_VERTEXPROCESSING, //Обрабатываем вершинны видеокартой
- &PresParam, //Отдаем параметры устройства
- &g_pDirect3DDevice); //Создаем устройство рендеринга
- g_pDirect3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
- // Отключение освещения
- g_pDirect3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
- if (SUCCEEDED(hr)) //Если получилось
- return true; //Возвращяем true
- return false; //Возвращяем false
- }
- void DrawFrame()
- {
- HRESULT hr = g_pDirect3DDevice->TestCooperativeLevel();//Проверяем потерял ли Direct3DDevice устройство
- if (hr == D3DERR_DEVICELOST) //Если да то
- return; //Выходи из функции
- g_pDirect3DDevice->Clear( //Очищаем задний буфер
- 0L, //Размер буфера, 0 - весь буфер
- NULL, //Область которую будем очищать, NULL - весь буфер
- D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, //Чистим задний буфер и буфер глубины
- D3DCOLOR_XRGB(0, 0, 0), //Цвет в который очищаем задний буфер, в нашем случае черный
- 1.0f, //Очищаем буфер глубины, заполнив его единицами
- 0L); //Этот параметрт игнорируеться так как не выстовлен соответсвующий флаг
- g_pDirect3DDevice->BeginScene(); //Начало сцены
- Matrix();
- // Рисование примитивов
- g_pDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 40);
- g_pDirect3DDevice->EndScene(); //Конец сцены
- g_pDirect3DDevice->Present(NULL, NULL, NULL, NULL);//Отображаем весь задний буфер
- }
- void Shutdown()
- {
- if (g_pDirect3DDevice != NULL) //Если мы еще не освободили интерфейс рендеринга
- {
- g_pDirect3DDevice->Release(); //То освобождаем его
- g_pDirect3DDevice = NULL; //И устанавливаем в ноль
- }
- if (g_pDirect3D != NULL) //Если мы еще не освободили интерфейс d3d
- {
- g_pDirect3D->Release(); //То освобождаем его
- g_pDirect3D = NULL; //И устанавливаем в ноль
- }
- if (!DestroyWindow(g_hWnd)) //Если не получилось разрушить окно
- g_hWnd = NULL; //Устанавливаем дескриптор окна в ноль
- if (!UnregisterClass("Вторая работа", g_hInstance)) //Если не получилось удалить наше зарегестрированое окно
- g_hInstance = NULL; //Устанавливаем дескриптор приложения в ноль
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement