d3dut
diff example/src/example.cc @ 0:ecc040281dc9
initial commit
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sat, 22 Jun 2013 10:11:39 +0300 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/example/src/example.cc Sat Jun 22 10:11:39 2013 +0300 1.3 @@ -0,0 +1,234 @@ 1.4 +#include <stdio.h> 1.5 +#include <stddef.h> 1.6 +#include <math.h> 1.7 +#include "d3dut.h" 1.8 + 1.9 +struct Vertex { 1.10 + float pos[3]; 1.11 + float color[4]; 1.12 +}; 1.13 + 1.14 +struct RenderState { 1.15 + float modelview[16]; 1.16 + float projection[16]; 1.17 +}; 1.18 + 1.19 +static bool init(); 1.20 +static void cleanup(); 1.21 +static void display(); 1.22 +static void reshape(int x, int y); 1.23 +static void keyb(unsigned char key, int x, int y); 1.24 + 1.25 +static int width, height; 1.26 + 1.27 +static ID3D11InputLayout *vertex_layout; 1.28 +static ID3D11VertexShader *vsdr; 1.29 +static ID3D11PixelShader *psdr; 1.30 +static ID3D11Buffer *vbuf; 1.31 +static ID3D11Buffer *rstate_buf; 1.32 + 1.33 +static RenderState rstate; 1.34 + 1.35 +int main(int argc, char **argv) 1.36 +{ 1.37 + d3dut_init(&argc, argv); 1.38 + d3dut_init_window_size(800, 600); 1.39 + d3dut_init_display_mode(D3DUT_RGB | D3DUT_DEPTH | D3DUT_DOUBLE); 1.40 + d3dut_create_window("d3dut example"); 1.41 + 1.42 + d3dut_display_func(display); 1.43 + d3dut_idle_func(d3dut_post_redisplay); 1.44 + d3dut_reshape_func(reshape); 1.45 + d3dut_keyboard_func(keyb); 1.46 + 1.47 + if(!init()) { 1.48 + return 1; 1.49 + } 1.50 + atexit(cleanup); 1.51 + 1.52 + d3dut_main_loop(); 1.53 + return 0; 1.54 +} 1.55 + 1.56 +static bool init() 1.57 +{ 1.58 + unsigned int sdrflags = 0;//D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG; 1.59 + 1.60 + ID3DBlob *vsbuf, *psbuf, *msgblob = 0; 1.61 + if(D3DX11CompileFromFile("shader.hlsl", 0, 0, "vertex_main", "vs_4_0", sdrflags, 0, 0, &vsbuf, &msgblob, 0) != 0) { 1.62 + fprintf(stderr, "failed to load vertex shader\n"); 1.63 + if(msgblob && msgblob->GetBufferSize() > 0) { 1.64 + fprintf(stderr, "Vertex Shader:\n%s\n", (char*)msgblob->GetBufferPointer()); 1.65 + } 1.66 + return false; 1.67 + } 1.68 + if(D3DX11CompileFromFile("shader.hlsl", 0, 0, "pixel_main", "ps_4_0", sdrflags, 0, 0, &psbuf, &msgblob, 0) != 0) { 1.69 + fprintf(stderr, "failed to load pixel shader\n"); 1.70 + if(msgblob && msgblob->GetBufferSize() > 0) { 1.71 + fprintf(stderr, "Pixel Shader:\n%s\n", (char*)msgblob->GetBufferPointer()); 1.72 + } 1.73 + return false; 1.74 + } 1.75 + 1.76 + if(d3dut_dev->CreateVertexShader(vsbuf->GetBufferPointer(), vsbuf->GetBufferSize(), 0, &vsdr) != 0) { 1.77 + fprintf(stderr, "failed to create vertex shader\n"); 1.78 + return false; 1.79 + } 1.80 + if(d3dut_dev->CreatePixelShader(psbuf->GetBufferPointer(), psbuf->GetBufferSize(), 0, &psdr) != 0) { 1.81 + fprintf(stderr, "failed to create pixel shader\n"); 1.82 + return false; 1.83 + } 1.84 + 1.85 + D3D11_INPUT_ELEMENT_DESC elem_desc[2]; 1.86 + elem_desc[0].SemanticName = "position"; 1.87 + elem_desc[0].SemanticIndex = 0; 1.88 + elem_desc[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; 1.89 + elem_desc[0].InputSlot = 0; 1.90 + elem_desc[0].AlignedByteOffset = 0; 1.91 + elem_desc[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; 1.92 + elem_desc[0].InstanceDataStepRate = 0; 1.93 + 1.94 + elem_desc[1].SemanticName = "color"; 1.95 + elem_desc[1].SemanticIndex = 0; 1.96 + elem_desc[1].Format = DXGI_FORMAT_R32G32B32A32_FLOAT; 1.97 + elem_desc[1].InputSlot = 0; 1.98 + elem_desc[1].AlignedByteOffset = offsetof(Vertex, color); 1.99 + elem_desc[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; 1.100 + elem_desc[1].InstanceDataStepRate = 0; 1.101 + 1.102 + if(d3dut_dev->CreateInputLayout(elem_desc, 2, vsbuf->GetBufferPointer(), vsbuf->GetBufferSize(), &vertex_layout) != 0) { 1.103 + fprintf(stderr, "failed to create vertex layout\n"); 1.104 + return 0; 1.105 + } 1.106 + vsbuf->Release(); 1.107 + psbuf->Release(); 1.108 + 1.109 + // --- create vertex buffer --- 1.110 + Vertex varr[] = { 1.111 + {{-0.6, -0.4, 0}, {1, 0, 0, 1}}, 1.112 + {{0.0, 0.6, 0}, {0, 1, 0, 1}}, 1.113 + {{0.6, -0.4, 0}, {0, 0, 1, 1}} 1.114 + }; 1.115 + 1.116 + D3D11_BUFFER_DESC buf_desc; 1.117 + memset(&buf_desc, 0, sizeof buf_desc); 1.118 + buf_desc.Usage = D3D11_USAGE_DEFAULT; 1.119 + buf_desc.ByteWidth = sizeof varr; 1.120 + buf_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; 1.121 + 1.122 + D3D11_SUBRESOURCE_DATA subdata; 1.123 + memset(&subdata, 0, sizeof subdata); 1.124 + subdata.pSysMem = varr; 1.125 + if(d3dut_dev->CreateBuffer(&buf_desc, &subdata, &vbuf) != 0) { 1.126 + fprintf(stderr, "failed to create vertex buffer\n"); 1.127 + return false; 1.128 + } 1.129 + 1.130 + // render state buffer 1.131 + memset(&buf_desc, 0, sizeof buf_desc); 1.132 + buf_desc.Usage = D3D11_USAGE_DEFAULT; 1.133 + buf_desc.ByteWidth = sizeof(RenderState); 1.134 + buf_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; 1.135 + 1.136 + memset(&subdata, 0, sizeof subdata); 1.137 + subdata.pSysMem = &rstate; 1.138 + if(d3dut_dev->CreateBuffer(&buf_desc, &subdata, &rstate_buf) != 0) { 1.139 + fprintf(stderr, "failed to create render state buffer\n"); 1.140 + return false; 1.141 + } 1.142 + 1.143 + return true; 1.144 +} 1.145 + 1.146 +static void cleanup() 1.147 +{ 1.148 + vbuf->Release(); 1.149 + rstate_buf->Release(); 1.150 + vsdr->Release(); 1.151 + psdr->Release(); 1.152 + vertex_layout->Release(); 1.153 +} 1.154 + 1.155 +static void set_identity(float *mat) 1.156 +{ 1.157 + mat[0] = mat[5] = mat[10] = mat[15] = 1.0; 1.158 + 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; 1.159 +} 1.160 + 1.161 +static void set_rotation_z(float *mat, float angle) 1.162 +{ 1.163 + set_identity(mat); 1.164 + 1.165 + mat[0] = cos(angle); 1.166 + mat[1] = -sin(angle); 1.167 + mat[4] = sin(angle); 1.168 + mat[5] = cos(angle); 1.169 +} 1.170 + 1.171 +static void set_ortho(float *mat, float aspect) 1.172 +{ 1.173 + set_identity(mat); 1.174 + mat[0] = 1.0 / aspect; 1.175 +} 1.176 + 1.177 +static void display() 1.178 +{ 1.179 + unsigned int msec = timeGetTime(); 1.180 + 1.181 + float fbcolor[] = {0.2f, 0.2f, 0.2f, 1.0f}; 1.182 + d3dut_ctx->ClearRenderTargetView(d3dut_rtview, fbcolor); 1.183 + 1.184 + // set render state constant buffer data 1.185 + set_ortho(rstate.projection, (float)width / (float)height); 1.186 + set_rotation_z(rstate.modelview, msec / 1000.0); 1.187 + 1.188 + d3dut_ctx->UpdateSubresource(rstate_buf, 0, 0, &rstate, 0, 0); 1.189 + d3dut_ctx->VSSetConstantBuffers(0, 1, &rstate_buf); 1.190 + 1.191 + 1.192 + unsigned int stride = sizeof(Vertex); 1.193 + unsigned int offset = 0; 1.194 + d3dut_ctx->IASetVertexBuffers(0, 1, &vbuf, &stride, &offset); 1.195 + d3dut_ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 1.196 + d3dut_ctx->IASetInputLayout(vertex_layout); 1.197 + 1.198 + d3dut_ctx->VSSetShader(vsdr, 0, 0); 1.199 + d3dut_ctx->PSSetShader(psdr, 0, 0); 1.200 + 1.201 + d3dut_ctx->Draw(3, 0); 1.202 + 1.203 + d3dut_swap_buffers(); 1.204 +} 1.205 + 1.206 +static void reshape(int x, int y) 1.207 +{ 1.208 + width = x; 1.209 + height = y; 1.210 + 1.211 + D3D11_VIEWPORT vp; 1.212 + vp.Width = (float)x; 1.213 + vp.Height = (float)y; 1.214 + vp.MinDepth = 0; 1.215 + vp.MaxDepth = 1; 1.216 + vp.TopLeftX = 0; 1.217 + vp.TopLeftY = 0; 1.218 + d3dut_ctx->RSSetViewports(1, &vp); 1.219 + 1.220 + // TODO probably we also need to resize render targets or whatever... 1.221 +} 1.222 + 1.223 +static void keyb(unsigned char key, int x, int y) 1.224 +{ 1.225 + switch(key) { 1.226 + case 27: 1.227 + exit(0); 1.228 + 1.229 + case ' ': 1.230 + { 1.231 + static bool anim = true; 1.232 + anim = !anim; 1.233 + d3dut_idle_func(anim ? d3dut_post_redisplay : 0); 1.234 + } 1.235 + break; 1.236 + } 1.237 +} 1.238 \ No newline at end of file