Advertisement
vovan333

PRODUCTIONNEUH

Jan 5th, 2017
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #pragma warning (disable:4996)
  2. #pragma comment (lib, "d3d11.lib")
  3.  
  4. #include <Windows.h>
  5. #include <D3D11.h>
  6. #include <D3DX11.h>
  7. #include <D3DX10.h>
  8. #include <gdiplus.h>
  9. #include <string>
  10.  
  11. using namespace Gdiplus;
  12. using namespace std;
  13.  
  14. namespace D3DProject1
  15. {
  16.     UINT windowStyle = WS_OVERLAPPEDWINDOW;
  17.     HWND hMainWindow;
  18.     HINSTANCE hCurrentInstance;
  19.     IDXGISwapChain* swapchain;
  20.     ID3D11RenderTargetView* backbuffer;
  21.     ID3D11Device* dev;
  22.     ID3D11DeviceContext* devcon;
  23.     ID3D11VertexShader* vs;
  24.     ID3D11PixelShader* ps;
  25.     int viewportWidth = 800;
  26.     int viewportHeight = 600;
  27.  
  28.     wchar_t* W(wstring str)
  29.     {
  30.         wchar_t* result = new wchar_t[str.size()];
  31.         wcscpy(result, str.c_str());
  32.         return result;
  33.     }
  34.  
  35.     void CreateWC(wstring name, WNDPROC OnMessage)
  36.     {
  37.         WNDCLASSEX wc;
  38.         ZeroMemory(&wc, sizeof(wc));
  39.  
  40.         wc.cbSize = sizeof(WNDCLASSEX);
  41.         wc.style = CS_HREDRAW | CS_VREDRAW;
  42.         wc.lpfnWndProc = OnMessage;
  43.         wc.hInstance = hCurrentInstance;
  44.         wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  45.         wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
  46.         wc.lpszClassName = W(name);
  47.  
  48.         RegisterClassEx(&wc);
  49.     }
  50.  
  51.     Size AdjustWndSzToViewportSz(int viewportWidth, int viewportHeight, UINT wndStyle = windowStyle)
  52.     {
  53.         RECT wr = { 0, 0, viewportWidth, viewportHeight };
  54.         AdjustWindowRect(&wr, wndStyle, FALSE);
  55.         return Size(wr.right - wr.left, wr.bottom - wr.top);
  56.     }
  57.  
  58.     DXGI_SWAP_CHAIN_DESC CreateSCD(HWND hWnd, int width, int height)
  59.     {
  60.         DXGI_SWAP_CHAIN_DESC scd;
  61.         ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));
  62.  
  63.         scd.BufferCount = 1;
  64.         scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
  65.         scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
  66.         scd.BufferDesc.Width = width;
  67.         scd.BufferDesc.Height = height;
  68.         scd.OutputWindow = hWnd;
  69.         scd.SampleDesc.Count = 4;
  70.         scd.Windowed = TRUE;
  71.         scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
  72.  
  73.         return scd;
  74.     }
  75.  
  76.     void InitD3DDeviceAndSwapChain(DXGI_SWAP_CHAIN_DESC& scd, IDXGISwapChain*& sc, ID3D11Device*& dev, ID3D11DeviceContext*& devCon)
  77.     {
  78.         D3D11CreateDeviceAndSwapChain
  79.         (
  80.             NULL,
  81.             D3D_DRIVER_TYPE_HARDWARE,
  82.             NULL,
  83.             NULL,
  84.             NULL,
  85.             NULL,
  86.             D3D11_SDK_VERSION,
  87.             &scd,
  88.             &swapchain,
  89.             &dev,
  90.             NULL,
  91.             &devcon
  92.         );
  93.     }
  94.  
  95.     D3D11_VIEWPORT CreateViewport(int width, int height)
  96.     {
  97.         D3D11_VIEWPORT viewport;
  98.         ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));
  99.  
  100.         viewport.TopLeftX = 0;
  101.         viewport.TopLeftY = 0;
  102.         viewport.Width = width;
  103.         viewport.Height = height;
  104.        
  105.         return viewport;
  106.     }
  107.  
  108.     void SetRenderTarget(ID3D11RenderTargetView*& pRenderTarget)
  109.     {
  110.         ID3D11Texture2D* pBackBuffer;
  111.         swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&pBackBuffer);
  112.         dev->CreateRenderTargetView(pBackBuffer, NULL, &pRenderTarget);
  113.         devcon->OMSetRenderTargets(1, &pRenderTarget, NULL);
  114.         pBackBuffer->Release();
  115.     }
  116.  
  117.     void ClearRenderTarget(ID3D11RenderTargetView*& renderTarget)
  118.     {
  119.         devcon->ClearRenderTargetView(backbuffer, D3DXCOLOR(0.0f, 0.2f, 0.4f, 1.0f));
  120.     }
  121.  
  122.     void SwapSCBuffers(IDXGISwapChain*& swapChain)
  123.     {
  124.         swapChain->Present(0, 0);
  125.     }
  126.  
  127.     void InitRenderingPipeline()
  128.     {
  129.         ID3D10Blob* vsBlob;
  130.         ID3D10Blob* psBlob;
  131.         D3DX11CompileFromFile(L"shaders.shader", 0, 0, "VertexShader", "vs_4_0", 0, 0, 0, &vsBlob, 0, 0);
  132.         D3DX11CompileFromFile(L"shaders.shader", 0, 0, "PixelShader", "ps_4_0", 0, 0, 0, &psBlob, 0, 0);
  133.  
  134.         dev->CreateVertexShader(vsBlob->GetBufferPointer(), vsBlob->GetBufferSize(), NULL, &vs);
  135.         dev->CreatePixelShader(psBlob->GetBufferPointer(), psBlob->GetBufferSize(), NULL, &ps);
  136.  
  137.         devcon->VSSetShader(vs, 0, 0);
  138.         devcon->PSSetShader(ps, 0, 0);
  139.     }
  140.  
  141.     void InitD3D(HWND hWnd = hMainWindow)
  142.     {
  143.         auto scd = CreateSCD(hWnd, viewportWidth, viewportHeight);
  144.         InitD3DDeviceAndSwapChain(scd, swapchain, dev, devcon);
  145.         SetRenderTarget(backbuffer);
  146.         auto viewport = CreateViewport(viewportWidth, viewportHeight);
  147.         devcon->RSSetViewports(1, &viewport);
  148.         InitRenderingPipeline();
  149.     }
  150.  
  151.     void RenderFrame()
  152.     {
  153.  
  154.     }
  155.  
  156.     void ReleaseD3D()
  157.     {
  158.         swapchain->SetFullscreenState(FALSE, NULL);
  159.         swapchain->Release();
  160.         backbuffer->Release();
  161.         dev->Release();
  162.         devcon->Release();
  163.     }
  164.  
  165.     LRESULT CALLBACK OnMessage(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  166.     {
  167.         switch (message)
  168.         {
  169.             case WM_DESTROY:
  170.                 ReleaseD3D();
  171.                 ExitProcess(0);
  172.                 break;
  173.         }
  174.         return DefWindowProc(hWnd, message, wParam, lParam);
  175.     }
  176.  
  177.     HWND CreateWnd(int width, int height, wstring title, UINT wndStyle = windowStyle)
  178.     {
  179.         CreateWC(title, OnMessage);
  180.         HWND hWnd = CreateWindow
  181.         (
  182.             W(title),
  183.             W(title),
  184.             wndStyle,
  185.             300,
  186.             300,
  187.             width,
  188.             height,
  189.             NULL,
  190.             NULL,
  191.             hCurrentInstance,
  192.             NULL
  193.         );
  194.         ShowWindow(hWnd, SW_RESTORE);
  195.         return hWnd;
  196.     }
  197.  
  198.     void InitMessageLoop()
  199.     {
  200.         MSG msg;
  201.         while (true)
  202.         {
  203.             if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  204.             {
  205.                 TranslateMessage(&msg);
  206.                 DispatchMessage(&msg);
  207.             }
  208.             else
  209.             {
  210.                 ClearRenderTarget(backbuffer);
  211.                 RenderFrame();
  212.                 SwapSCBuffers(swapchain);
  213.             }
  214.         }
  215.     }
  216.  
  217.     int WinMain(HINSTANCE hInstance, string cmdLine, int showCmd)
  218.     {
  219.         hCurrentInstance = hInstance;
  220.         Size wndSz = AdjustWndSzToViewportSz(viewportWidth, viewportHeight);
  221.         hMainWindow = CreateWnd(wndSz.Width, wndSz.Height, L"D3DProject1 Main Window");
  222.         InitD3D(hMainWindow);
  223.         InitMessageLoop();
  224.         return 0;
  225.     }
  226. }
  227.  
  228. int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int showCmd)
  229. {
  230.     return D3DProject1::WinMain(hInstance, cmdLine, showCmd);
  231. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement