vovan333

D3DProject1/main.cpp

Jan 29th, 2017
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #pragma warning (disable:4996)
  2.  
  3. #pragma comment (lib, "d3d11.lib")
  4. #pragma comment (lib, "d3dx11.lib")
  5. #pragma comment (lib, "d3dx10.lib")
  6.  
  7. #include <Windows.h>
  8. #include <D3D11.h>
  9. #include <D3DX11.h>
  10. #include <D3DX10.h>
  11. #include <gdiplus.h>
  12. #include <string>
  13. #include <vector>
  14.  
  15. using namespace Gdiplus;
  16. using namespace std;
  17.  
  18. namespace D3DProject1
  19. {
  20.     UINT windowStyle = WS_OVERLAPPEDWINDOW;
  21.     HWND hMainWindow;
  22.     HINSTANCE hCurrentInstance;
  23.     IDXGISwapChain* swapchain;
  24.     ID3D11RenderTargetView* backbuffer;
  25.     ID3D11Device* dev;
  26.     ID3D11DeviceContext* devcon;
  27.     ID3D10Blob* vsBlob;
  28.     ID3D10Blob* psBlob;
  29.     ID3D11VertexShader* vs;
  30.     ID3D11PixelShader* ps;
  31.     ID3D11Buffer* vertexBuffer;
  32.     ID3D11InputLayout *vertexBufferLayout;
  33.     int numberOfVertices = 0;
  34.     int viewportWidth = 800;
  35.     int viewportHeight = 600;
  36.     wstring shadersFile = L"Shaders.fx";
  37.  
  38.     wchar_t* W(wstring str)
  39.     {
  40.         wchar_t* result = new wchar_t[str.size()];
  41.         wcscpy(result, str.c_str());
  42.         return result;
  43.     }
  44.  
  45.     char* S(string str)
  46.     {
  47.         char* result = new char[str.size()];
  48.         strcpy(result, str.c_str());
  49.         return result;
  50.     }
  51.  
  52.     struct Vertex
  53.     {
  54.         float X, Y, Z;
  55.         D3DXCOLOR Color;
  56.     };
  57.  
  58.     D3D11_INPUT_ELEMENT_DESC VertexIED[] =
  59.     {
  60.         { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
  61.         { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }
  62.     };
  63.  
  64.     void CreateWC(wstring name, WNDPROC OnMessage)
  65.     {
  66.         WNDCLASSEX wc;
  67.         ZeroMemory(&wc, sizeof(wc));
  68.  
  69.         wc.cbSize = sizeof(WNDCLASSEX);
  70.         wc.style = CS_HREDRAW | CS_VREDRAW;
  71.         wc.lpfnWndProc = OnMessage;
  72.         wc.hInstance = hCurrentInstance;
  73.         wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  74.         wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
  75.         wc.lpszClassName = W(name);
  76.  
  77.         RegisterClassEx(&wc);
  78.     }
  79.  
  80.     Size AdjustWndSzToViewportSz(int viewportWidth, int viewportHeight, UINT wndStyle = windowStyle)
  81.     {
  82.         RECT wr = { 0, 0, viewportWidth, viewportHeight };
  83.         AdjustWindowRect(&wr, wndStyle, FALSE);
  84.         return Size(wr.right - wr.left, wr.bottom - wr.top);
  85.     }
  86.  
  87.     DXGI_SWAP_CHAIN_DESC CreateSCD(HWND hWnd, int width, int height)
  88.     {
  89.         DXGI_SWAP_CHAIN_DESC scd;
  90.         ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));
  91.  
  92.         scd.BufferCount = 1;
  93.         scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
  94.         scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
  95.         scd.BufferDesc.Width = width;
  96.         scd.BufferDesc.Height = height;
  97.         scd.OutputWindow = hWnd;
  98.         scd.SampleDesc.Count = 4;
  99.         scd.Windowed = TRUE;
  100.         scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
  101.  
  102.         return scd;
  103.     }
  104.  
  105.     void InitD3DDeviceAndSwapChain(DXGI_SWAP_CHAIN_DESC& scd, IDXGISwapChain*& sc, ID3D11Device*& dev, ID3D11DeviceContext*& devCon)
  106.     {
  107.         D3D11CreateDeviceAndSwapChain
  108.         (
  109.             NULL,
  110.             D3D_DRIVER_TYPE_HARDWARE,
  111.             NULL,
  112.             NULL,
  113.             NULL,
  114.             NULL,
  115.             D3D11_SDK_VERSION,
  116.             &scd,
  117.             &swapchain,
  118.             &dev,
  119.             NULL,
  120.             &devcon
  121.         );
  122.     }
  123.  
  124.     D3D11_VIEWPORT CreateViewport(int width, int height)
  125.     {
  126.         D3D11_VIEWPORT viewport;
  127.         ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));
  128.  
  129.         viewport.TopLeftX = 0;
  130.         viewport.TopLeftY = 0;
  131.         viewport.Width = width;
  132.         viewport.Height = height;
  133.        
  134.         return viewport;
  135.     }
  136.  
  137.     void SetRenderTarget(ID3D11RenderTargetView*& renderTarget)
  138.     {
  139.         ID3D11Texture2D* pBackBuffer;
  140.         swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&pBackBuffer);
  141.         dev->CreateRenderTargetView(pBackBuffer, NULL, &renderTarget);
  142.         devcon->OMSetRenderTargets(1, &renderTarget, NULL);
  143.         pBackBuffer->Release();
  144.     }
  145.  
  146.     void ClearRenderTarget(ID3D11RenderTargetView*& renderTarget)
  147.     {
  148.         devcon->ClearRenderTargetView(backbuffer, D3DXCOLOR(0.3f, 0.2f, 0.4f, 1.0f));
  149.     }
  150.  
  151.     void SwapSCBuffers(IDXGISwapChain*& swapChain)
  152.     {
  153.         swapChain->Present(0, 0);
  154.     }
  155.  
  156.     void LoadVertexShader(wstring filename, string shaderName, string version, ID3D11VertexShader*& shader, ID3D10Blob*& blob)
  157.     {
  158.         D3DX11CompileFromFile(W(filename), 0, 0, S(shaderName), S(version), 0, 0, 0, &blob, 0, 0);
  159.         dev->CreateVertexShader(blob->GetBufferPointer(), blob->GetBufferSize(), NULL, &shader);
  160.     }
  161.  
  162.     void LoadPixelShader(wstring filename, string shaderName, string version, ID3D11PixelShader*& shader, ID3D10Blob*& blob)
  163.     {
  164.         D3DX11CompileFromFile(W(filename), 0, 0, S(shaderName), S(version), 0, 0, 0, &blob, 0, 0);
  165.         dev->CreatePixelShader(blob->GetBufferPointer(), blob->GetBufferSize(), NULL, &shader);
  166.     }
  167.  
  168.     ID3D11InputLayout* CreateInputLayout(D3D11_INPUT_ELEMENT_DESC* ied, ID3D10Blob* vsBlob)
  169.     {
  170.         ID3D11InputLayout* layout;
  171.         dev->CreateInputLayout(ied, 2, vsBlob->GetBufferPointer(), vsBlob->GetBufferSize(), &layout);
  172.         return layout;
  173.     }
  174.  
  175.     void InitRenderingPipeline()
  176.     {
  177.         LoadVertexShader(shadersFile, "VShader", "vs_4_0", vs, vsBlob);
  178.         LoadPixelShader(shadersFile, "PShader", "ps_4_0", ps, psBlob);
  179.         devcon->VSSetShader(vs, 0, 0);
  180.         devcon->PSSetShader(ps, 0, 0);
  181.     }
  182.  
  183.     D3D11_BUFFER_DESC CreateBD(int vertexCount)
  184.     {
  185.         D3D11_BUFFER_DESC bd;
  186.         ZeroMemory(&bd, sizeof(bd));
  187.  
  188.         bd.Usage = D3D11_USAGE_DYNAMIC;
  189.         bd.ByteWidth = sizeof(Vertex) * vertexCount;
  190.         bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
  191.         bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
  192.  
  193.         return bd;
  194.     }
  195.  
  196.     void CreateVertexBuffer(ID3D11Buffer*& buffer, int size)
  197.     {
  198.         auto bd = CreateBD(size);
  199.         dev->CreateBuffer(&bd, NULL, &buffer);
  200.     }
  201.  
  202.     void WriteVertexBuffer(ID3D11Buffer*& buffer, vector<Vertex>& vertices)
  203.     {
  204.         D3D11_MAPPED_SUBRESOURCE ms;
  205.         devcon->Map(buffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms);
  206.         memcpy(ms.pData, &vertices[0], sizeof(Vertex) * vertices.size());
  207.         devcon->Unmap(buffer, NULL);
  208.     }
  209.  
  210.     void LoadGeometry()
  211.     {
  212.         vector<Vertex> vertices =
  213.         {
  214.             { -0.45f, -0.5f, 0.0f, D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f) },
  215.             { 0.0f, 0.5f, 0.0f, D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f) },
  216.             { 0.45f, -0.5, 0.0f, D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f) },
  217.         };
  218.  
  219.         numberOfVertices = vertices.size();
  220.  
  221.         CreateVertexBuffer(vertexBuffer, numberOfVertices);
  222.         WriteVertexBuffer(vertexBuffer, vertices);
  223.  
  224.         vertexBufferLayout = CreateInputLayout(VertexIED, vsBlob);
  225.         devcon->IASetInputLayout(vertexBufferLayout);
  226.     }
  227.  
  228.     void InitD3D(HWND hWnd = hMainWindow)
  229.     {
  230.         auto scd = CreateSCD(hWnd, viewportWidth, viewportHeight);
  231.         InitD3DDeviceAndSwapChain(scd, swapchain, dev, devcon);
  232.         SetRenderTarget(backbuffer);
  233.         auto viewport = CreateViewport(viewportWidth, viewportHeight);
  234.         devcon->RSSetViewports(1, &viewport);
  235.         InitRenderingPipeline();
  236.         LoadGeometry();
  237.     }
  238.  
  239.     void RenderFrame()
  240.     {
  241.         devcon->Draw(numberOfVertices, 0);
  242.     }
  243.  
  244.     void ReleaseD3D()
  245.     {
  246.         vs->Release();
  247.         ps->Release();
  248.         swapchain->SetFullscreenState(FALSE, NULL);
  249.         swapchain->Release();
  250.         backbuffer->Release();
  251.         dev->Release();
  252.         devcon->Release();
  253.     }
  254.  
  255.     void SelectVertexBuffer(ID3D11Buffer*& buffer)
  256.     {
  257.         UINT stride = sizeof(Vertex);
  258.         UINT offset = 0;
  259.         devcon->IASetVertexBuffers(0, 1, &buffer, &stride, &offset);
  260.         devcon->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
  261.     }
  262.  
  263.     LRESULT CALLBACK OnMessage(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  264.     {
  265.         switch (message)
  266.         {
  267.             case WM_DESTROY:
  268.                 ReleaseD3D();
  269.                 ExitProcess(0);
  270.                 break;
  271.         }
  272.         return DefWindowProc(hWnd, message, wParam, lParam);
  273.     }
  274.  
  275.     HWND CreateWnd(int width, int height, wstring title, UINT wndStyle = windowStyle)
  276.     {
  277.         CreateWC(title, OnMessage);
  278.         HWND hWnd = CreateWindow
  279.         (
  280.             W(title),
  281.             W(title),
  282.             wndStyle,
  283.             300,
  284.             300,
  285.             width,
  286.             height,
  287.             NULL,
  288.             NULL,
  289.             hCurrentInstance,
  290.             NULL
  291.         );
  292.         ShowWindow(hWnd, SW_RESTORE);
  293.         return hWnd;
  294.     }
  295.  
  296.     void InitMessageLoop()
  297.     {
  298.         MSG msg;
  299.         while (true)
  300.         {
  301.             if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  302.             {
  303.                 TranslateMessage(&msg);
  304.                 DispatchMessage(&msg);
  305.             }
  306.             else
  307.             {
  308.                 ClearRenderTarget(backbuffer);
  309.                 SelectVertexBuffer(vertexBuffer);
  310.                 RenderFrame();
  311.                 SwapSCBuffers(swapchain);
  312.             }
  313.         }
  314.     }
  315.  
  316.     int WinMain(HINSTANCE hInstance, string cmdLine, int showCmd)
  317.     {
  318.         hCurrentInstance = hInstance;
  319.         Size wndSz = AdjustWndSzToViewportSz(viewportWidth, viewportHeight);
  320.         hMainWindow = CreateWnd(wndSz.Width, wndSz.Height, L"D3DProject1 Main Window");
  321.         InitD3D(hMainWindow);
  322.         InitMessageLoop();
  323.         return 0;
  324.     }
  325. }
  326.  
  327. int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int showCmd)
  328. {
  329.     return D3DProject1::WinMain(hInstance, cmdLine, showCmd);
  330. }
Add Comment
Please, Sign In to add comment