# HG changeset patch # User John Tsiombikas # Date 1371796644 -10800 # Node ID aa1497adac80d456b472f24ef7eabf9fd08930e8 # Parent 87ecd7292c23b2cdb37fb20db71a7a313e6eba93 fixed line endings diff -r 87ecd7292c23 -r aa1497adac80 shader.hlsl --- a/shader.hlsl Fri Jun 21 09:09:09 2013 +0300 +++ b/shader.hlsl Fri Jun 21 09:37:24 2013 +0300 @@ -1,31 +1,31 @@ -cbuffer RenderState : register(b0) { - matrix modelview_matrix : packoffset(c0); - matrix projection_matrix : packoffset(c4); -}; - -struct VSInput { - float4 pos : POSITION; - float4 color : COLOR; -}; - -struct VSOutput { - float4 pos : SV_POSITION; - float4 color : COLOR0; -}; - -VSOutput vertex_main(VSInput input) -{ - VSOutput res; - - float4 vpos = mul(input.pos, modelview_matrix); - - res.pos = mul(vpos, projection_matrix); - res.color = input.color; - return res; -} - - -float4 pixel_main(VSOutput input) : SV_TARGET -{ - return input.color; +cbuffer RenderState : register(b0) { + matrix modelview_matrix : packoffset(c0); + matrix projection_matrix : packoffset(c4); +}; + +struct VSInput { + float4 pos : POSITION; + float4 color : COLOR; +}; + +struct VSOutput { + float4 pos : SV_POSITION; + float4 color : COLOR0; +}; + +VSOutput vertex_main(VSInput input) +{ + VSOutput res; + + float4 vpos = mul(input.pos, modelview_matrix); + + res.pos = mul(vpos, projection_matrix); + res.color = input.color; + return res; +} + + +float4 pixel_main(VSOutput input) : SV_TARGET +{ + return input.color; } \ No newline at end of file diff -r 87ecd7292c23 -r aa1497adac80 src/main.cc --- a/src/main.cc Fri Jun 21 09:09:09 2013 +0300 +++ b/src/main.cc Fri Jun 21 09:37:24 2013 +0300 @@ -1,341 +1,341 @@ -#include -#include -#include -#include -#include -#include - -struct Vertex { - float pos[3]; - float color[4]; -}; - -struct RenderState { - float modelview[16]; - float projection[16]; -}; - -static bool init(); -static void cleanup(); -static void display(); -static void reshape(int x, int y); -static void keyb(int key, bool pressed); -static HWND create_window(int xsz, int ysz); -static void destroy_window(HWND win); -static void main_loop(); -static long CALLBACK win_proc(HWND win, unsigned int msg, unsigned int wparam, long lparam); - -static int width, height; - -static HWND win; -static IDXGISwapChain *swap; -static ID3D11Device *dev; -static ID3D11DeviceContext *ctx; -static ID3D11RenderTargetView *rtarg_view; -static ID3D11InputLayout *vertex_layout; -static ID3D11VertexShader *vsdr; -static ID3D11PixelShader *psdr; -static ID3D11Buffer *vbuf; -static ID3D11Buffer *rstate_buf; - -static RenderState rstate; - -int main() -{ - if(!init()) { - return 1; - } - atexit(cleanup); - - main_loop(); - return 0; -} - -static bool init() -{ - if(!(win = create_window(800, 600))) { - return false; - } - - unsigned int sdrflags = 0;//D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG; - - ID3DBlob *vsbuf, *psbuf, *msgblob; - if(D3DX11CompileFromFile("shader.hlsl", 0, 0, "vertex_main", "vs_4_0", sdrflags, 0, 0, &vsbuf, &msgblob, 0) != 0) { - fprintf(stderr, "failed to load vertex shader\n"); - if(msgblob->GetBufferSize() > 0) { - fprintf(stderr, "Vertex Shader:\n%s\n", (char*)msgblob->GetBufferPointer()); - } - return false; - } - if(D3DX11CompileFromFile("shader.hlsl", 0, 0, "pixel_main", "ps_4_0", sdrflags, 0, 0, &psbuf, &msgblob, 0) != 0) { - fprintf(stderr, "failed to load pixel shader\n"); - if(msgblob->GetBufferSize() > 0) { - fprintf(stderr, "Pixel Shader:\n%s\n", (char*)msgblob->GetBufferPointer()); - } - return false; - } - - if(dev->CreateVertexShader(vsbuf->GetBufferPointer(), vsbuf->GetBufferSize(), 0, &vsdr) != 0) { - fprintf(stderr, "failed to create vertex shader\n"); - return false; - } - if(dev->CreatePixelShader(psbuf->GetBufferPointer(), psbuf->GetBufferSize(), 0, &psdr) != 0) { - fprintf(stderr, "failed to create pixel shader\n"); - return false; - } - - D3D11_INPUT_ELEMENT_DESC elem_desc[2]; - elem_desc[0].SemanticName = "position"; - elem_desc[0].SemanticIndex = 0; - elem_desc[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; - elem_desc[0].InputSlot = 0; - elem_desc[0].AlignedByteOffset = 0; - elem_desc[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; - elem_desc[0].InstanceDataStepRate = 0; - - elem_desc[1].SemanticName = "color"; - elem_desc[1].SemanticIndex = 0; - elem_desc[1].Format = DXGI_FORMAT_R32G32B32A32_FLOAT; - elem_desc[1].InputSlot = 0; - elem_desc[1].AlignedByteOffset = offsetof(Vertex, color); - elem_desc[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; - elem_desc[1].InstanceDataStepRate = 0; - - if(dev->CreateInputLayout(elem_desc, 2, vsbuf->GetBufferPointer(), vsbuf->GetBufferSize(), &vertex_layout) != 0) { - fprintf(stderr, "failed to create vertex layout\n"); - return 0; - } - vsbuf->Release(); - psbuf->Release(); - - // --- create vertex buffer --- - Vertex varr[] = { - {{-0.6, -0.4, 0}, {1, 0, 0, 1}}, - {{0.0, 0.6, 0}, {0, 1, 0, 1}}, - {{0.6, -0.4, 0}, {0, 0, 1, 1}} - }; - - D3D11_BUFFER_DESC buf_desc; - memset(&buf_desc, 0, sizeof buf_desc); - buf_desc.Usage = D3D11_USAGE_DEFAULT; - buf_desc.ByteWidth = sizeof varr; - buf_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - - D3D11_SUBRESOURCE_DATA subdata; - memset(&subdata, 0, sizeof subdata); - subdata.pSysMem = varr; - if(dev->CreateBuffer(&buf_desc, &subdata, &vbuf) != 0) { - fprintf(stderr, "failed to create vertex buffer\n"); - return false; - } - - // render state buffer - memset(&buf_desc, 0, sizeof buf_desc); - buf_desc.Usage = D3D11_USAGE_DEFAULT; - buf_desc.ByteWidth = sizeof(RenderState); - buf_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - - memset(&subdata, 0, sizeof subdata); - subdata.pSysMem = &rstate; - if(dev->CreateBuffer(&buf_desc, &subdata, &rstate_buf) != 0) { - fprintf(stderr, "failed to create render state buffer\n"); - return false; - } - - return true; -} - -static void cleanup() -{ - vbuf->Release(); - rstate_buf->Release(); - vsdr->Release(); - psdr->Release(); - vertex_layout->Release(); - destroy_window(win); -} - -static void set_identity(float *mat) -{ - mat[0] = mat[5] = mat[10] = mat[15] = 1.0; - mat[1] = mat[2] = mat[3] = mat[4] = mat[6] = mat[7] = mat[8] = mat[9] = mat[11] = mat[12] = mat[13] = mat[14] = 0.0; -} - -static void set_rotation_z(float *mat, float angle) -{ - set_identity(mat); - - mat[0] = cos(angle); - mat[1] = -sin(angle); - mat[4] = sin(angle); - mat[5] = cos(angle); -} - -static void set_ortho(float *mat, float aspect) -{ - set_identity(mat); - mat[0] = 1.0 / aspect; -} - -static void display() -{ - unsigned int msec = timeGetTime(); - - float fbcolor[] = {0.2f, 0.2f, 0.2f, 1.0f}; - ctx->ClearRenderTargetView(rtarg_view, fbcolor); - - // set render state constant buffer data - set_ortho(rstate.projection, (float)width / (float)height); - set_rotation_z(rstate.modelview, msec / 1000.0); - - ctx->UpdateSubresource(rstate_buf, 0, 0, &rstate, 0, 0); - ctx->VSSetConstantBuffers(0, 1, &rstate_buf); - - - unsigned int stride = sizeof(Vertex); - unsigned int offset = 0; - ctx->IASetVertexBuffers(0, 1, &vbuf, &stride, &offset); - ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - ctx->IASetInputLayout(vertex_layout); - - ctx->VSSetShader(vsdr, 0, 0); - ctx->PSSetShader(psdr, 0, 0); - - ctx->Draw(3, 0); - - swap->Present(0, 0); -} - -static void reshape(int x, int y) -{ - width = x; - height = y; - - D3D11_VIEWPORT vp; - vp.Width = (float)x; - vp.Height = (float)y; - vp.MinDepth = 0; - vp.MaxDepth = 1; - vp.TopLeftX = 0; - vp.TopLeftY = 0; - ctx->RSSetViewports(1, &vp); - - // TODO probably we also need to resize render targets or whatever... -} - -static void keyb(int key, bool pressed) -{ - if(key == 27) { - exit(0); - } -} - -// ---- system crap ---- - -static HWND create_window(int xsz, int ysz) -{ - HINSTANCE app_inst = GetModuleHandle(0); - - WNDCLASS wclass; - memset(&wclass, 0, sizeof wclass); - wclass.hInstance = app_inst; - wclass.lpfnWndProc = win_proc; - wclass.lpszClassName = "mutantstargoatwin"; - wclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; - wclass.hIcon = LoadIcon(0, IDI_APPLICATION); - wclass.hCursor = LoadCursor(0, IDC_ARROW); - wclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); - RegisterClass(&wclass); - - int posx = (GetSystemMetrics(SM_CXSCREEN) - xsz) / 2; - int posy = (GetSystemMetrics(SM_CYSCREEN) - ysz) / 2; - - HWND win = CreateWindow("mutantstargoatwin", "DX11 Test", WS_OVERLAPPEDWINDOW, posx, posy, - xsz, ysz, 0, 0, app_inst, 0); - ShowWindow(win, SW_SHOW); - - // initialize D3D device - DXGI_SWAP_CHAIN_DESC swap_desc; - memset(&swap_desc, 0, sizeof swap_desc); - swap_desc.BufferCount = 1; - swap_desc.BufferDesc.Width = xsz; - swap_desc.BufferDesc.Height = ysz; - swap_desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - swap_desc.BufferDesc.RefreshRate.Numerator = 60; - swap_desc.BufferDesc.RefreshRate.Denominator = 1; - swap_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - swap_desc.OutputWindow = win; - swap_desc.SampleDesc.Count = 1; - swap_desc.SampleDesc.Quality = 0; - swap_desc.Windowed = 1; - - D3D_FEATURE_LEVEL feature_level = D3D_FEATURE_LEVEL_11_0; - - if(D3D11CreateDeviceAndSwapChain(0, D3D_DRIVER_TYPE_HARDWARE, 0, 0, &feature_level, 1, - D3D11_SDK_VERSION, &swap_desc, &swap, &dev, 0, &ctx) != 0) { - fprintf(stderr, "Failed to create d3d device and swap chain\n"); - return 0; - } - - ID3D11Texture2D *rtex; - if(swap->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&rtex) != 0) { - fprintf(stderr, "Failed to get default render target texture\n"); - return 0; - } - if(dev->CreateRenderTargetView(rtex, 0, &rtarg_view) != 0) { - fprintf(stderr, "Failed to create render target view\n"); - rtex->Release(); - return 0; - } - rtex->Release(); - ctx->OMSetRenderTargets(1, &rtarg_view, 0); - - reshape(xsz, ysz); - return win; -} - -static void destroy_window(HWND win) -{ - CloseWindow(win); - UnregisterClass("mutantstargoatwin", GetModuleHandle(0)); - - rtarg_view->Release(); - ctx->Release(); - dev->Release(); - swap->Release(); -} - -static void main_loop() -{ - MSG msg; - - for(;;) { - while(PeekMessage(&msg, win, 0, 0, PM_REMOVE)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - - if(msg.message == WM_QUIT) { - return; - } - } - - display(); - } -} - -static long CALLBACK win_proc(HWND win, unsigned int msg, unsigned int wparam, long lparam) -{ - switch(msg) { - case WM_KEYDOWN: - keyb(wparam, true); - break; - - case WM_KEYUP: - keyb(wparam, false); - break; - - default: - return DefWindowProc(win, msg, wparam, lparam); - } - return 0; -} +#include +#include +#include +#include +#include +#include + +struct Vertex { + float pos[3]; + float color[4]; +}; + +struct RenderState { + float modelview[16]; + float projection[16]; +}; + +static bool init(); +static void cleanup(); +static void display(); +static void reshape(int x, int y); +static void keyb(int key, bool pressed); +static HWND create_window(int xsz, int ysz); +static void destroy_window(HWND win); +static void main_loop(); +static long CALLBACK win_proc(HWND win, unsigned int msg, unsigned int wparam, long lparam); + +static int width, height; + +static HWND win; +static IDXGISwapChain *swap; +static ID3D11Device *dev; +static ID3D11DeviceContext *ctx; +static ID3D11RenderTargetView *rtarg_view; +static ID3D11InputLayout *vertex_layout; +static ID3D11VertexShader *vsdr; +static ID3D11PixelShader *psdr; +static ID3D11Buffer *vbuf; +static ID3D11Buffer *rstate_buf; + +static RenderState rstate; + +int main() +{ + if(!init()) { + return 1; + } + atexit(cleanup); + + main_loop(); + return 0; +} + +static bool init() +{ + if(!(win = create_window(800, 600))) { + return false; + } + + unsigned int sdrflags = 0;//D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG; + + ID3DBlob *vsbuf, *psbuf, *msgblob; + if(D3DX11CompileFromFile("shader.hlsl", 0, 0, "vertex_main", "vs_4_0", sdrflags, 0, 0, &vsbuf, &msgblob, 0) != 0) { + fprintf(stderr, "failed to load vertex shader\n"); + if(msgblob->GetBufferSize() > 0) { + fprintf(stderr, "Vertex Shader:\n%s\n", (char*)msgblob->GetBufferPointer()); + } + return false; + } + if(D3DX11CompileFromFile("shader.hlsl", 0, 0, "pixel_main", "ps_4_0", sdrflags, 0, 0, &psbuf, &msgblob, 0) != 0) { + fprintf(stderr, "failed to load pixel shader\n"); + if(msgblob->GetBufferSize() > 0) { + fprintf(stderr, "Pixel Shader:\n%s\n", (char*)msgblob->GetBufferPointer()); + } + return false; + } + + if(dev->CreateVertexShader(vsbuf->GetBufferPointer(), vsbuf->GetBufferSize(), 0, &vsdr) != 0) { + fprintf(stderr, "failed to create vertex shader\n"); + return false; + } + if(dev->CreatePixelShader(psbuf->GetBufferPointer(), psbuf->GetBufferSize(), 0, &psdr) != 0) { + fprintf(stderr, "failed to create pixel shader\n"); + return false; + } + + D3D11_INPUT_ELEMENT_DESC elem_desc[2]; + elem_desc[0].SemanticName = "position"; + elem_desc[0].SemanticIndex = 0; + elem_desc[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; + elem_desc[0].InputSlot = 0; + elem_desc[0].AlignedByteOffset = 0; + elem_desc[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; + elem_desc[0].InstanceDataStepRate = 0; + + elem_desc[1].SemanticName = "color"; + elem_desc[1].SemanticIndex = 0; + elem_desc[1].Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + elem_desc[1].InputSlot = 0; + elem_desc[1].AlignedByteOffset = offsetof(Vertex, color); + elem_desc[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; + elem_desc[1].InstanceDataStepRate = 0; + + if(dev->CreateInputLayout(elem_desc, 2, vsbuf->GetBufferPointer(), vsbuf->GetBufferSize(), &vertex_layout) != 0) { + fprintf(stderr, "failed to create vertex layout\n"); + return 0; + } + vsbuf->Release(); + psbuf->Release(); + + // --- create vertex buffer --- + Vertex varr[] = { + {{-0.6, -0.4, 0}, {1, 0, 0, 1}}, + {{0.0, 0.6, 0}, {0, 1, 0, 1}}, + {{0.6, -0.4, 0}, {0, 0, 1, 1}} + }; + + D3D11_BUFFER_DESC buf_desc; + memset(&buf_desc, 0, sizeof buf_desc); + buf_desc.Usage = D3D11_USAGE_DEFAULT; + buf_desc.ByteWidth = sizeof varr; + buf_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + + D3D11_SUBRESOURCE_DATA subdata; + memset(&subdata, 0, sizeof subdata); + subdata.pSysMem = varr; + if(dev->CreateBuffer(&buf_desc, &subdata, &vbuf) != 0) { + fprintf(stderr, "failed to create vertex buffer\n"); + return false; + } + + // render state buffer + memset(&buf_desc, 0, sizeof buf_desc); + buf_desc.Usage = D3D11_USAGE_DEFAULT; + buf_desc.ByteWidth = sizeof(RenderState); + buf_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + + memset(&subdata, 0, sizeof subdata); + subdata.pSysMem = &rstate; + if(dev->CreateBuffer(&buf_desc, &subdata, &rstate_buf) != 0) { + fprintf(stderr, "failed to create render state buffer\n"); + return false; + } + + return true; +} + +static void cleanup() +{ + vbuf->Release(); + rstate_buf->Release(); + vsdr->Release(); + psdr->Release(); + vertex_layout->Release(); + destroy_window(win); +} + +static void set_identity(float *mat) +{ + mat[0] = mat[5] = mat[10] = mat[15] = 1.0; + mat[1] = mat[2] = mat[3] = mat[4] = mat[6] = mat[7] = mat[8] = mat[9] = mat[11] = mat[12] = mat[13] = mat[14] = 0.0; +} + +static void set_rotation_z(float *mat, float angle) +{ + set_identity(mat); + + mat[0] = cos(angle); + mat[1] = -sin(angle); + mat[4] = sin(angle); + mat[5] = cos(angle); +} + +static void set_ortho(float *mat, float aspect) +{ + set_identity(mat); + mat[0] = 1.0 / aspect; +} + +static void display() +{ + unsigned int msec = timeGetTime(); + + float fbcolor[] = {0.2f, 0.2f, 0.2f, 1.0f}; + ctx->ClearRenderTargetView(rtarg_view, fbcolor); + + // set render state constant buffer data + set_ortho(rstate.projection, (float)width / (float)height); + set_rotation_z(rstate.modelview, msec / 1000.0); + + ctx->UpdateSubresource(rstate_buf, 0, 0, &rstate, 0, 0); + ctx->VSSetConstantBuffers(0, 1, &rstate_buf); + + + unsigned int stride = sizeof(Vertex); + unsigned int offset = 0; + ctx->IASetVertexBuffers(0, 1, &vbuf, &stride, &offset); + ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + ctx->IASetInputLayout(vertex_layout); + + ctx->VSSetShader(vsdr, 0, 0); + ctx->PSSetShader(psdr, 0, 0); + + ctx->Draw(3, 0); + + swap->Present(0, 0); +} + +static void reshape(int x, int y) +{ + width = x; + height = y; + + D3D11_VIEWPORT vp; + vp.Width = (float)x; + vp.Height = (float)y; + vp.MinDepth = 0; + vp.MaxDepth = 1; + vp.TopLeftX = 0; + vp.TopLeftY = 0; + ctx->RSSetViewports(1, &vp); + + // TODO probably we also need to resize render targets or whatever... +} + +static void keyb(int key, bool pressed) +{ + if(key == 27) { + exit(0); + } +} + +// ---- system crap ---- + +static HWND create_window(int xsz, int ysz) +{ + HINSTANCE app_inst = GetModuleHandle(0); + + WNDCLASS wclass; + memset(&wclass, 0, sizeof wclass); + wclass.hInstance = app_inst; + wclass.lpfnWndProc = win_proc; + wclass.lpszClassName = "mutantstargoatwin"; + wclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; + wclass.hIcon = LoadIcon(0, IDI_APPLICATION); + wclass.hCursor = LoadCursor(0, IDC_ARROW); + wclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); + RegisterClass(&wclass); + + int posx = (GetSystemMetrics(SM_CXSCREEN) - xsz) / 2; + int posy = (GetSystemMetrics(SM_CYSCREEN) - ysz) / 2; + + HWND win = CreateWindow("mutantstargoatwin", "DX11 Test", WS_OVERLAPPEDWINDOW, posx, posy, + xsz, ysz, 0, 0, app_inst, 0); + ShowWindow(win, SW_SHOW); + + // initialize D3D device + DXGI_SWAP_CHAIN_DESC swap_desc; + memset(&swap_desc, 0, sizeof swap_desc); + swap_desc.BufferCount = 1; + swap_desc.BufferDesc.Width = xsz; + swap_desc.BufferDesc.Height = ysz; + swap_desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + swap_desc.BufferDesc.RefreshRate.Numerator = 60; + swap_desc.BufferDesc.RefreshRate.Denominator = 1; + swap_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + swap_desc.OutputWindow = win; + swap_desc.SampleDesc.Count = 1; + swap_desc.SampleDesc.Quality = 0; + swap_desc.Windowed = 1; + + D3D_FEATURE_LEVEL feature_level = D3D_FEATURE_LEVEL_11_0; + + if(D3D11CreateDeviceAndSwapChain(0, D3D_DRIVER_TYPE_HARDWARE, 0, 0, &feature_level, 1, + D3D11_SDK_VERSION, &swap_desc, &swap, &dev, 0, &ctx) != 0) { + fprintf(stderr, "Failed to create d3d device and swap chain\n"); + return 0; + } + + ID3D11Texture2D *rtex; + if(swap->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&rtex) != 0) { + fprintf(stderr, "Failed to get default render target texture\n"); + return 0; + } + if(dev->CreateRenderTargetView(rtex, 0, &rtarg_view) != 0) { + fprintf(stderr, "Failed to create render target view\n"); + rtex->Release(); + return 0; + } + rtex->Release(); + ctx->OMSetRenderTargets(1, &rtarg_view, 0); + + reshape(xsz, ysz); + return win; +} + +static void destroy_window(HWND win) +{ + CloseWindow(win); + UnregisterClass("mutantstargoatwin", GetModuleHandle(0)); + + rtarg_view->Release(); + ctx->Release(); + dev->Release(); + swap->Release(); +} + +static void main_loop() +{ + MSG msg; + + for(;;) { + while(PeekMessage(&msg, win, 0, 0, PM_REMOVE)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + + if(msg.message == WM_QUIT) { + return; + } + } + + display(); + } +} + +static long CALLBACK win_proc(HWND win, unsigned int msg, unsigned int wparam, long lparam) +{ + switch(msg) { + case WM_KEYDOWN: + keyb(wparam, true); + break; + + case WM_KEYUP: + keyb(wparam, false); + break; + + default: + return DefWindowProc(win, msg, wparam, lparam); + } + return 0; +}