Advertisement
vovan333

GOWNO CODE

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