Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- char FontShader[] =
- "\
- Texture2D tex2D;\
- SamplerState linearSampler\
- {\
- Filter = MIN_MAG_MIP_POINT;\
- AddressU = Wrap;\
- AddressV = Wrap;\
- };\
- struct _FONTVS\
- {\
- float4 Pos : POSITION;\
- float4 Color : COLOR;\
- float2 Tex : TEXCOORD;\
- };\
- struct _FONTPS\
- {\
- float4 Pos : SV_POSITION;\
- float4 Color : COLOR;\
- float2 Tex : TEXCOORD;\
- };\
- _FONTPS FONT_VS( _FONTVS input )\
- {\
- _FONTPS output;\
- output.Pos = input.Pos;\
- output.Color = input.Color;\
- output.Tex = input.Tex;\
- return output;\
- }\
- float4 FONT_PS( _FONTPS input ) : SV_Target\
- {\
- float4 color = tex2D.Sample( linearSampler, input.Tex );\
- if (color.r == 0)\
- color = 0;\
- else\
- {\
- color = input.Color;\
- color.w = 1;\
- }\
- return color;\
- }";
- char DrawShader[] =
- "\
- struct _DRAWVS\
- {\
- float4 Pos : POSITION;\
- float4 Color : COLOR;\
- };\
- struct _DRAWPS\
- {\
- float4 Pos : SV_POSITION;\
- float4 Color : COLOR;\
- };\
- _DRAWPS DRAW_VS( _DRAWVS input )\
- {\
- _DRAWPS output;\
- output.Pos = input.Pos;\
- output.Color = input.Color;\
- return output;\
- }\
- float4 DRAW_PS( _DRAWPS input ) : SV_Target\
- {\
- return input.Color;\
- }";
- ------------------------------------
- #pragma once
- //Only include this in the .cpp file that will init/draw the menus!!!
- #include "MenuSystem.h"
- #include <d3d11.h>
- #include <d3dx11.h>
- #include <d3dx10.h>
- // include the Direct3D Library file
- #pragma comment (lib, "d3d11.lib")
- #pragma comment (lib, "d3dx11.lib")
- #pragma comment (lib, "d3dx10.lib")
- #include "fontdx11.h"
- #define SAFE_RELEASE(p) { if ( (p) ) { (p)->Release(); (p) = 0; } }
- struct VERTEX
- {
- D3DXVECTOR3 Pos;
- D3DXCOLOR Color;
- D3DXVECTOR2 Tex;
- };
- struct DRAWVERTEX
- {
- D3DXVECTOR3 Pos;
- D3DXCOLOR Color;
- };
- class CDX11Canvas : public CCanvas
- {
- public:
- int ScreenWidth;
- int ScreenHeight;
- IDXGISwapChain* swapchain;
- ID3D11Device* dev;
- ID3D11DeviceContext* devcon;
- //Saved
- ID3D11RasterizerState* pSavedRS;
- ID3D11ShaderResourceView* pSavedRV;
- ID3D11BlendState* pSavedBlendState;
- FLOAT SavedBlendFactor[4];
- UINT SaveSampleMask;
- //Font
- ID3D11Buffer* pFontVBuffer;
- ID3D11VertexShader* pFontVS;
- ID3D11PixelShader* pFontPS;
- ID3D11InputLayout* pFontLayout;
- ID3D11RasterizerState* pFontRS;
- ID3D11ShaderResourceView* pFontRV;
- ID3D11BlendState* pFontBlendState;
- //Drawing
- ID3D11Buffer* pDrawVBuffer;
- ID3D11VertexShader* pDrawVS;
- ID3D11PixelShader* pDrawPS;
- ID3D11InputLayout* pDrawLayout;
- ID3D11RasterizerState* pDrawRS;
- ID3D11BlendState* pDrawBlendState;
- public:
- CDX11Canvas()
- {
- swapchain = NULL;
- dev = NULL;
- devcon = NULL;
- pFontVBuffer = NULL;
- pFontVS = NULL;
- pFontPS = NULL;
- pFontLayout = NULL;
- pFontRS = NULL;
- pFontRV = NULL;
- pFontBlendState = NULL;
- pDrawVBuffer = NULL;
- pDrawVS = NULL;
- pDrawPS = NULL;
- pDrawLayout = NULL;
- pDrawRS = NULL;
- pDrawBlendState = NULL;
- }
- virtual void Init(void* Pram)
- {
- HRESULT hr;
- swapchain = (IDXGISwapChain *)Pram;
- if (!swapchain) return;
- swapchain->GetDevice(__uuidof(ID3D11Device),(LPVOID*)&dev);
- dev->GetImmediateContext(&devcon);
- if (!pFontVBuffer)
- {
- D3D11_BUFFER_DESC bd;
- ZeroMemory(&bd, sizeof(bd));
- bd.Usage = D3D11_USAGE_DYNAMIC; // write access access by CPU and GPU
- bd.ByteWidth = sizeof(VERTEX) * 256 * 6; // size is the VERTEX struct * 3
- bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; // use as a vertex buffer
- bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; // allow CPU to write in buffer
- dev->CreateBuffer(&bd, NULL, &pFontVBuffer); // create the buffer
- }
- if (!pFontVS)
- {
- ID3D10Blob *VS;
- hr = D3DX11CompileFromMemory(FontShader,sizeof(FontShader),0,0,0,"FONT_VS","vs_4_0", 0, 0, 0, &VS, 0, 0);
- //D3DX11CompileFromFile("D:\\dx11\\font.hlsl", 0, 0, "FONT_VS", "vs_4_0", 0, 0, 0, &VS, 0, 0);
- dev->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), NULL, &pFontVS);
- D3D11_INPUT_ELEMENT_DESC ied[] =
- {
- {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
- {"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0},
- {"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 28, D3D11_INPUT_PER_VERTEX_DATA, 0 },
- };
- dev->CreateInputLayout(ied, 3, VS->GetBufferPointer(), VS->GetBufferSize(), &pFontLayout);
- }
- if (!pFontPS)
- {
- ID3D10Blob *PS;
- hr = D3DX11CompileFromMemory(FontShader,sizeof(FontShader),0,0,0,"FONT_PS","ps_4_0", 0, 0, 0, &PS, 0, 0);
- //D3DX11CompileFromFile("D:\\dx11\\font.hlsl", 0, 0, "FONT_PS", "ps_4_0", 0, 0, 0, &PS, 0, 0);
- dev->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), NULL, &pFontPS);
- }
- if (!pFontRV)
- {
- D3DX11CreateShaderResourceViewFromMemory(dev,FontTexture,sizeof(FontTexture),0,0,&pFontRV,0);
- //D3DX11CreateShaderResourceViewFromFile( dev, "D:\\dx11\\font.bmp", NULL, NULL,&pFontRV, NULL );
- }
- if (!pFontRS)
- {
- D3D11_RASTERIZER_DESC rasterizerState;
- rasterizerState.CullMode = D3D11_CULL_NONE;
- rasterizerState.FillMode = D3D11_FILL_SOLID;
- rasterizerState.FrontCounterClockwise = true;
- rasterizerState.DepthBias = false;
- rasterizerState.DepthBiasClamp = 0;
- rasterizerState.SlopeScaledDepthBias = 0;
- rasterizerState.DepthClipEnable = false;
- rasterizerState.ScissorEnable = false;
- rasterizerState.MultisampleEnable = false;
- rasterizerState.AntialiasedLineEnable = false;
- dev->CreateRasterizerState( &rasterizerState, &pFontRS);
- }
- if (!pFontBlendState)
- {
- D3D11_BLEND_DESC BlendStateDescription;
- ZeroMemory(&BlendStateDescription, sizeof(D3D11_BLEND_DESC) );
- BlendStateDescription.RenderTarget[0].BlendEnable = true;
- BlendStateDescription.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
- BlendStateDescription.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
- BlendStateDescription.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA;
- BlendStateDescription.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_DEST_ALPHA;
- BlendStateDescription.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
- BlendStateDescription.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
- BlendStateDescription.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
- dev->CreateBlendState(&BlendStateDescription,&pFontBlendState);
- }
- if (!pDrawVBuffer)
- {
- D3D11_BUFFER_DESC bd;
- ZeroMemory(&bd, sizeof(bd));
- bd.Usage = D3D11_USAGE_DYNAMIC; // write access access by CPU and GPU
- bd.ByteWidth = sizeof(DRAWVERTEX) * 256 * 2; // size is the VERTEX struct * 3
- bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; // use as a vertex buffer
- bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; // allow CPU to write in buffer
- dev->CreateBuffer(&bd, NULL, &pDrawVBuffer); // create the buffer
- }
- if (!pDrawVS)
- {
- ID3D10Blob *VS;
- hr = D3DX11CompileFromMemory(DrawShader,sizeof(DrawShader),0,0,0,"DRAW_VS","vs_4_0", 0, 0, 0, &VS, 0, 0);
- //hr = D3DX11CompileFromFile("D:\\dx11\\draw.hlsl", 0, 0, "DRAW_VS", "vs_4_0", 0, 0, 0, &VS, 0, 0);
- dev->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), NULL, &pDrawVS);
- D3D11_INPUT_ELEMENT_DESC ied[] =
- {
- {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
- {"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0},
- };
- dev->CreateInputLayout(ied, 2, VS->GetBufferPointer(), VS->GetBufferSize(), &pDrawLayout);
- }
- if (!pDrawPS)
- {
- ID3D10Blob *PS;
- hr = D3DX11CompileFromMemory(DrawShader,sizeof(DrawShader),0,0,0,"DRAW_PS","ps_4_0", 0, 0, 0, &PS, 0, 0);
- //hr = D3DX11CompileFromFile("D:\\dx11\\draw.hlsl", 0, 0, "DRAW_PS", "ps_5_0", 0, 0, 0, &PS, 0, 0);
- dev->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), NULL, &pDrawPS);
- }
- if (!pDrawRS)
- {
- D3D11_RASTERIZER_DESC rasterizerState;
- rasterizerState.CullMode = D3D11_CULL_NONE;
- rasterizerState.FillMode = D3D11_FILL_SOLID;
- rasterizerState.FrontCounterClockwise = true;
- rasterizerState.DepthBias = false;
- rasterizerState.DepthBiasClamp = 0;
- rasterizerState.SlopeScaledDepthBias = 0;
- rasterizerState.DepthClipEnable = false;
- rasterizerState.ScissorEnable = false;
- rasterizerState.MultisampleEnable = false;
- rasterizerState.AntialiasedLineEnable = false;
- dev->CreateRasterizerState( &rasterizerState, &pDrawRS);
- }
- if (!pDrawBlendState)
- {
- D3D11_BLEND_DESC BlendStateDescription;
- ZeroMemory(&BlendStateDescription, sizeof(D3D11_BLEND_DESC) );
- BlendStateDescription.RenderTarget[0].BlendEnable = false;
- BlendStateDescription.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
- BlendStateDescription.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
- BlendStateDescription.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA;
- BlendStateDescription.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_DEST_ALPHA;
- BlendStateDescription.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
- BlendStateDescription.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
- BlendStateDescription.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
- dev->CreateBlendState(&BlendStateDescription,&pDrawBlendState);
- }
- }
- virtual void Begin()
- {
- if (!IsValid()) return;
- ID3D11Texture2D *pBackBuffer;
- swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);
- D3D11_TEXTURE2D_DESC desc;
- pBackBuffer->GetDesc(&desc);
- ScreenWidth = desc.Width;
- ScreenHeight = desc.Height;
- pBackBuffer->Release();
- devcon->RSGetState(&pSavedRS);
- devcon->PSGetShaderResources(0,1,&pSavedRV);
- devcon->OMGetBlendState(&pSavedBlendState,SavedBlendFactor,&SaveSampleMask);
- }
- virtual bool IsValid()
- {
- if (!swapchain) return false;
- if (!dev) return false;
- if (!devcon) return false;
- if (!pFontVBuffer) return false;
- if (!pFontVS) return false;
- if (!pFontPS) return false;
- if (!pFontLayout) return false;
- if (!pFontRS) return false;
- if (!pFontRV) return false;
- if (!pFontBlendState) return false;
- if (!pDrawVBuffer) return false;
- if (!pDrawVS) return false;
- if (!pDrawPS) return false;
- if (!pDrawLayout) return false;
- if (!pDrawRS) return false;
- if (!pDrawBlendState) return false;
- return true;
- }
- virtual void End()
- {
- if (pSavedRS) devcon->RSSetState(pSavedRS);
- if (pSavedRV) devcon->PSSetShaderResources(0,1,&pSavedRV);
- if (pSavedBlendState) devcon->OMSetBlendState(pSavedBlendState,SavedBlendFactor,SaveSampleMask);
- SAFE_RELEASE(dev);
- SAFE_RELEASE(devcon);
- SAFE_RELEASE(pSavedRS);
- SAFE_RELEASE(pSavedRV);
- SAFE_RELEASE(pSavedBlendState);
- }
- virtual void Reset()
- {
- SAFE_RELEASE(pFontVBuffer);
- SAFE_RELEASE(pFontVS);
- SAFE_RELEASE(pFontPS);
- SAFE_RELEASE(pFontLayout);
- SAFE_RELEASE(pFontRS);
- SAFE_RELEASE(pFontRV);
- SAFE_RELEASE(pFontBlendState);
- SAFE_RELEASE(pDrawVBuffer);
- SAFE_RELEASE(pDrawVS);
- SAFE_RELEASE(pDrawPS);
- SAFE_RELEASE(pDrawLayout);
- SAFE_RELEASE(pDrawRS);
- SAFE_RELEASE(pDrawBlendState);
- }
- D3DXVECTOR3 ToScreen(float X,float Y)
- {
- float hx = (X/((float)ScreenWidth * .5))-1;
- float hy = 1- (Y/((float)ScreenHeight * .5));
- return D3DXVECTOR3( hx,hy,0);
- }
- virtual void Text(char* text,int x, int y, DWORD color)
- {
- if (!IsValid()) return;
- color |= 0xFF000000;
- VERTEX vChar[6*256];
- char* c = text;
- int count = 0;
- int vidx = 0;
- int cx = x;
- int cy = y;
- while(*c)
- {
- float tsx = (float)((*c)*16) / 4096;
- float tex = (float)((*c)*16) / 4096 + (16.0f/4096.0f);
- vChar[vidx+0].Pos = ToScreen(cx,cy);
- vChar[vidx+0].Color = color;
- vChar[vidx+0].Tex = D3DXVECTOR2(tsx,0);
- vChar[vidx+1].Pos = ToScreen(cx+16,cy);
- vChar[vidx+1].Color = color;
- vChar[vidx+1].Tex = D3DXVECTOR2(tex,0);
- vChar[vidx+2].Pos = ToScreen(cx,cy+16);
- vChar[vidx+2].Color = color;
- vChar[vidx+2].Tex = D3DXVECTOR2(tsx,1);
- vChar[vidx+3].Pos = ToScreen(cx+16,cy);
- vChar[vidx+3].Color = color;
- vChar[vidx+3].Tex = D3DXVECTOR2(tex,0);
- vChar[vidx+4].Pos = ToScreen(cx+16,cy+16);
- vChar[vidx+4].Color = color;
- vChar[vidx+4].Tex = D3DXVECTOR2(tex,1);
- vChar[vidx+5].Pos = ToScreen(cx,cy+16);
- vChar[vidx+5].Color = color;
- vChar[vidx+5].Tex = D3DXVECTOR2(tsx,1);
- cx += FONTCHARWIDTH[*c+17];
- c++;
- count++;
- vidx += 6;
- }
- devcon->VSSetShader(pFontVS, 0, 0);
- devcon->PSSetShader(pFontPS, 0, 0);
- devcon->IASetInputLayout(pFontLayout);
- devcon->PSSetShaderResources( 0, 1, &pFontRV );
- devcon->RSSetState(pFontRS);
- devcon->OMSetBlendState( pFontBlendState,NULL,0xffffffff);
- D3D11_MAPPED_SUBRESOURCE ms;
- devcon->Map(pFontVBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms);
- memcpy(ms.pData, vChar, sizeof(VERTEX)*count*6);
- devcon->Unmap(pFontVBuffer, NULL);
- UINT stride = sizeof(VERTEX);
- UINT offset = 0;
- devcon->IASetVertexBuffers(0, 1, &pFontVBuffer, &stride, &offset);
- devcon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
- devcon->Draw(count*6, 0);
- }
- virtual int TextWidth(char* text)
- {
- char* c = text;
- int cx = 0;
- while(*c)
- {
- cx += FONTCHARWIDTH[*c+17];
- c++;
- }
- return cx;
- }
- virtual int TextHeight(char* text)
- {
- return 16;
- }
- virtual void Line(float x1,float y1,float x2,float y2,DWORD color)
- {
- if (!IsValid()) return;
- DRAWVERTEX points[2];
- points[0].Pos = ToScreen(x1,y1);
- points[0].Color = color;
- points[1].Pos = ToScreen(x2,y2);
- points[1].Color = color;
- devcon->VSSetShader(pDrawVS, 0, 0);
- devcon->PSSetShader(pDrawPS, 0, 0);
- devcon->IASetInputLayout(pDrawLayout);
- devcon->RSSetState(pDrawRS);
- devcon->OMSetBlendState( pDrawBlendState,NULL,0xffffffff);
- D3D11_MAPPED_SUBRESOURCE ms;
- devcon->Map(pDrawVBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms);
- memcpy(ms.pData, points, sizeof(DRAWVERTEX)*2);
- devcon->Unmap(pDrawVBuffer, NULL);
- UINT stride = sizeof(DRAWVERTEX);
- UINT offset = 0;
- devcon->IASetVertexBuffers(0, 1, &pDrawVBuffer, &stride, &offset);
- devcon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST);
- devcon->Draw(2, 0);
- }
- virtual void FillGradient(float x,float y,float w,float h,DWORD color1,DWORD color2,DWORD color3,DWORD color4)
- {
- if (!IsValid()) return;
- DRAWVERTEX points[6];
- points[0].Pos = ToScreen(x,y);
- points[0].Color = color1;
- points[1].Pos = ToScreen(x+w,y);
- points[1].Color = color2;
- points[2].Pos = ToScreen(x,y+h);
- points[2].Color = color4;
- points[3].Pos = ToScreen(x+w,y);
- points[3].Color = color2;
- points[4].Pos = ToScreen(x+w,y+h);
- points[4].Color = color3;
- points[5].Pos = ToScreen(x,y+h);
- points[5].Color = color4;
- devcon->VSSetShader(pDrawVS, 0, 0);
- devcon->PSSetShader(pDrawPS, 0, 0);
- devcon->IASetInputLayout(pDrawLayout);
- devcon->RSSetState(pDrawRS);
- devcon->OMSetBlendState( pDrawBlendState,NULL,0xffffffff);
- D3D11_MAPPED_SUBRESOURCE ms;
- devcon->Map(pDrawVBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms);
- memcpy(ms.pData, points, sizeof(DRAWVERTEX)*6);
- devcon->Unmap(pDrawVBuffer, NULL);
- UINT stride = sizeof(DRAWVERTEX);
- UINT offset = 0;
- devcon->IASetVertexBuffers(0, 1, &pDrawVBuffer, &stride, &offset);
- devcon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
- devcon->Draw(6, 0);
- }
- virtual void Poly(POINT* points,int count,DWORD color)
- {
- if (!IsValid()) return;
- if (count<3) return;
- DRAWVERTEX* pPoints = new DRAWVERTEX[count+1];
- pPoints[0].Pos = ToScreen(points[0].x,points[0].y);
- pPoints[0].Color = color;
- pPoints[1].Pos = ToScreen(points[1].x,points[1].y);
- pPoints[1].Color = color;
- pPoints[2].Pos = ToScreen(points[count-1].x,points[count-1].y);
- pPoints[2].Color = color;
- for (int i=3; i < count;i++)
- {
- pPoints[i].Pos = ToScreen(points[i-1].x,points[i-1].y);
- pPoints[i].Color = color;
- }
- devcon->VSSetShader(pDrawVS, 0, 0);
- devcon->PSSetShader(pDrawPS, 0, 0);
- devcon->IASetInputLayout(pDrawLayout);
- devcon->RSSetState(pDrawRS);
- devcon->OMSetBlendState( pDrawBlendState,NULL,0xffffffff);
- D3D11_MAPPED_SUBRESOURCE ms;
- devcon->Map(pDrawVBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms);
- memcpy(ms.pData, pPoints, sizeof(DRAWVERTEX)*count);
- devcon->Unmap(pDrawVBuffer, NULL);
- UINT stride = sizeof(DRAWVERTEX);
- UINT offset = 0;
- devcon->IASetVertexBuffers(0, 1, &pDrawVBuffer, &stride, &offset);
- devcon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
- devcon->Draw(count, 0);
- delete pPoints;
- }
- };
- CCanvas* pCanvas = NULL;
Add Comment
Please, Sign In to add comment