rev |
line source |
nuclear@0
|
1 #include <stdio.h>
|
nuclear@0
|
2 #include <stddef.h>
|
nuclear@0
|
3 #include <math.h>
|
nuclear@0
|
4 #include "d3dut.h"
|
nuclear@0
|
5
|
nuclear@0
|
6 struct Vertex {
|
nuclear@0
|
7 float pos[3];
|
nuclear@0
|
8 float color[4];
|
nuclear@0
|
9 };
|
nuclear@0
|
10
|
nuclear@0
|
11 struct RenderState {
|
nuclear@0
|
12 float modelview[16];
|
nuclear@0
|
13 float projection[16];
|
nuclear@0
|
14 };
|
nuclear@0
|
15
|
nuclear@0
|
16 static bool init();
|
nuclear@0
|
17 static void cleanup();
|
nuclear@0
|
18 static void display();
|
nuclear@0
|
19 static void reshape(int x, int y);
|
nuclear@0
|
20 static void keyb(unsigned char key, int x, int y);
|
nuclear@0
|
21
|
nuclear@0
|
22 static int width, height;
|
nuclear@0
|
23
|
nuclear@0
|
24 static ID3D11InputLayout *vertex_layout;
|
nuclear@0
|
25 static ID3D11VertexShader *vsdr;
|
nuclear@0
|
26 static ID3D11PixelShader *psdr;
|
nuclear@0
|
27 static ID3D11Buffer *vbuf;
|
nuclear@0
|
28 static ID3D11Buffer *rstate_buf;
|
nuclear@0
|
29
|
nuclear@0
|
30 static RenderState rstate;
|
nuclear@0
|
31
|
nuclear@0
|
32 int main(int argc, char **argv)
|
nuclear@0
|
33 {
|
nuclear@0
|
34 d3dut_init(&argc, argv);
|
nuclear@0
|
35 d3dut_init_window_size(800, 600);
|
nuclear@0
|
36 d3dut_init_display_mode(D3DUT_RGB | D3DUT_DEPTH | D3DUT_DOUBLE);
|
nuclear@0
|
37 d3dut_create_window("d3dut example");
|
nuclear@0
|
38
|
nuclear@0
|
39 d3dut_display_func(display);
|
nuclear@0
|
40 d3dut_idle_func(d3dut_post_redisplay);
|
nuclear@0
|
41 d3dut_reshape_func(reshape);
|
nuclear@0
|
42 d3dut_keyboard_func(keyb);
|
nuclear@0
|
43
|
nuclear@0
|
44 if(!init()) {
|
nuclear@0
|
45 return 1;
|
nuclear@0
|
46 }
|
nuclear@0
|
47 atexit(cleanup);
|
nuclear@0
|
48
|
nuclear@0
|
49 d3dut_main_loop();
|
nuclear@0
|
50 return 0;
|
nuclear@0
|
51 }
|
nuclear@0
|
52
|
nuclear@0
|
53 static bool init()
|
nuclear@0
|
54 {
|
nuclear@0
|
55 unsigned int sdrflags = 0;//D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG;
|
nuclear@0
|
56
|
nuclear@0
|
57 ID3DBlob *vsbuf, *psbuf, *msgblob = 0;
|
nuclear@0
|
58 if(D3DX11CompileFromFile("shader.hlsl", 0, 0, "vertex_main", "vs_4_0", sdrflags, 0, 0, &vsbuf, &msgblob, 0) != 0) {
|
nuclear@0
|
59 fprintf(stderr, "failed to load vertex shader\n");
|
nuclear@0
|
60 if(msgblob && msgblob->GetBufferSize() > 0) {
|
nuclear@0
|
61 fprintf(stderr, "Vertex Shader:\n%s\n", (char*)msgblob->GetBufferPointer());
|
nuclear@0
|
62 }
|
nuclear@0
|
63 return false;
|
nuclear@0
|
64 }
|
nuclear@0
|
65 if(D3DX11CompileFromFile("shader.hlsl", 0, 0, "pixel_main", "ps_4_0", sdrflags, 0, 0, &psbuf, &msgblob, 0) != 0) {
|
nuclear@0
|
66 fprintf(stderr, "failed to load pixel shader\n");
|
nuclear@0
|
67 if(msgblob && msgblob->GetBufferSize() > 0) {
|
nuclear@0
|
68 fprintf(stderr, "Pixel Shader:\n%s\n", (char*)msgblob->GetBufferPointer());
|
nuclear@0
|
69 }
|
nuclear@0
|
70 return false;
|
nuclear@0
|
71 }
|
nuclear@0
|
72
|
nuclear@0
|
73 if(d3dut_dev->CreateVertexShader(vsbuf->GetBufferPointer(), vsbuf->GetBufferSize(), 0, &vsdr) != 0) {
|
nuclear@0
|
74 fprintf(stderr, "failed to create vertex shader\n");
|
nuclear@0
|
75 return false;
|
nuclear@0
|
76 }
|
nuclear@0
|
77 if(d3dut_dev->CreatePixelShader(psbuf->GetBufferPointer(), psbuf->GetBufferSize(), 0, &psdr) != 0) {
|
nuclear@0
|
78 fprintf(stderr, "failed to create pixel shader\n");
|
nuclear@0
|
79 return false;
|
nuclear@0
|
80 }
|
nuclear@0
|
81
|
nuclear@0
|
82 D3D11_INPUT_ELEMENT_DESC elem_desc[2];
|
nuclear@0
|
83 elem_desc[0].SemanticName = "position";
|
nuclear@0
|
84 elem_desc[0].SemanticIndex = 0;
|
nuclear@0
|
85 elem_desc[0].Format = DXGI_FORMAT_R32G32B32_FLOAT;
|
nuclear@0
|
86 elem_desc[0].InputSlot = 0;
|
nuclear@0
|
87 elem_desc[0].AlignedByteOffset = 0;
|
nuclear@0
|
88 elem_desc[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
|
nuclear@0
|
89 elem_desc[0].InstanceDataStepRate = 0;
|
nuclear@0
|
90
|
nuclear@0
|
91 elem_desc[1].SemanticName = "color";
|
nuclear@0
|
92 elem_desc[1].SemanticIndex = 0;
|
nuclear@0
|
93 elem_desc[1].Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
|
nuclear@0
|
94 elem_desc[1].InputSlot = 0;
|
nuclear@0
|
95 elem_desc[1].AlignedByteOffset = offsetof(Vertex, color);
|
nuclear@0
|
96 elem_desc[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
|
nuclear@0
|
97 elem_desc[1].InstanceDataStepRate = 0;
|
nuclear@0
|
98
|
nuclear@0
|
99 if(d3dut_dev->CreateInputLayout(elem_desc, 2, vsbuf->GetBufferPointer(), vsbuf->GetBufferSize(), &vertex_layout) != 0) {
|
nuclear@0
|
100 fprintf(stderr, "failed to create vertex layout\n");
|
nuclear@0
|
101 return 0;
|
nuclear@0
|
102 }
|
nuclear@0
|
103 vsbuf->Release();
|
nuclear@0
|
104 psbuf->Release();
|
nuclear@0
|
105
|
nuclear@0
|
106 // --- create vertex buffer ---
|
nuclear@0
|
107 Vertex varr[] = {
|
nuclear@0
|
108 {{-0.6, -0.4, 0}, {1, 0, 0, 1}},
|
nuclear@0
|
109 {{0.0, 0.6, 0}, {0, 1, 0, 1}},
|
nuclear@0
|
110 {{0.6, -0.4, 0}, {0, 0, 1, 1}}
|
nuclear@0
|
111 };
|
nuclear@0
|
112
|
nuclear@0
|
113 D3D11_BUFFER_DESC buf_desc;
|
nuclear@0
|
114 memset(&buf_desc, 0, sizeof buf_desc);
|
nuclear@0
|
115 buf_desc.Usage = D3D11_USAGE_DEFAULT;
|
nuclear@0
|
116 buf_desc.ByteWidth = sizeof varr;
|
nuclear@0
|
117 buf_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
|
nuclear@0
|
118
|
nuclear@0
|
119 D3D11_SUBRESOURCE_DATA subdata;
|
nuclear@0
|
120 memset(&subdata, 0, sizeof subdata);
|
nuclear@0
|
121 subdata.pSysMem = varr;
|
nuclear@0
|
122 if(d3dut_dev->CreateBuffer(&buf_desc, &subdata, &vbuf) != 0) {
|
nuclear@0
|
123 fprintf(stderr, "failed to create vertex buffer\n");
|
nuclear@0
|
124 return false;
|
nuclear@0
|
125 }
|
nuclear@0
|
126
|
nuclear@0
|
127 // render state buffer
|
nuclear@0
|
128 memset(&buf_desc, 0, sizeof buf_desc);
|
nuclear@0
|
129 buf_desc.Usage = D3D11_USAGE_DEFAULT;
|
nuclear@0
|
130 buf_desc.ByteWidth = sizeof(RenderState);
|
nuclear@0
|
131 buf_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
|
nuclear@0
|
132
|
nuclear@0
|
133 memset(&subdata, 0, sizeof subdata);
|
nuclear@0
|
134 subdata.pSysMem = &rstate;
|
nuclear@0
|
135 if(d3dut_dev->CreateBuffer(&buf_desc, &subdata, &rstate_buf) != 0) {
|
nuclear@0
|
136 fprintf(stderr, "failed to create render state buffer\n");
|
nuclear@0
|
137 return false;
|
nuclear@0
|
138 }
|
nuclear@0
|
139
|
nuclear@0
|
140 return true;
|
nuclear@0
|
141 }
|
nuclear@0
|
142
|
nuclear@0
|
143 static void cleanup()
|
nuclear@0
|
144 {
|
nuclear@0
|
145 vbuf->Release();
|
nuclear@0
|
146 rstate_buf->Release();
|
nuclear@0
|
147 vsdr->Release();
|
nuclear@0
|
148 psdr->Release();
|
nuclear@0
|
149 vertex_layout->Release();
|
nuclear@0
|
150 }
|
nuclear@0
|
151
|
nuclear@0
|
152 static void set_identity(float *mat)
|
nuclear@0
|
153 {
|
nuclear@0
|
154 mat[0] = mat[5] = mat[10] = mat[15] = 1.0;
|
nuclear@0
|
155 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;
|
nuclear@0
|
156 }
|
nuclear@0
|
157
|
nuclear@0
|
158 static void set_rotation_z(float *mat, float angle)
|
nuclear@0
|
159 {
|
nuclear@0
|
160 set_identity(mat);
|
nuclear@0
|
161
|
nuclear@0
|
162 mat[0] = cos(angle);
|
nuclear@0
|
163 mat[1] = -sin(angle);
|
nuclear@0
|
164 mat[4] = sin(angle);
|
nuclear@0
|
165 mat[5] = cos(angle);
|
nuclear@0
|
166 }
|
nuclear@0
|
167
|
nuclear@0
|
168 static void set_ortho(float *mat, float aspect)
|
nuclear@0
|
169 {
|
nuclear@0
|
170 set_identity(mat);
|
nuclear@0
|
171 mat[0] = 1.0 / aspect;
|
nuclear@0
|
172 }
|
nuclear@0
|
173
|
nuclear@0
|
174 static void display()
|
nuclear@0
|
175 {
|
nuclear@0
|
176 unsigned int msec = timeGetTime();
|
nuclear@0
|
177
|
nuclear@0
|
178 float fbcolor[] = {0.2f, 0.2f, 0.2f, 1.0f};
|
nuclear@0
|
179 d3dut_ctx->ClearRenderTargetView(d3dut_rtview, fbcolor);
|
nuclear@0
|
180
|
nuclear@0
|
181 // set render state constant buffer data
|
nuclear@0
|
182 set_ortho(rstate.projection, (float)width / (float)height);
|
nuclear@0
|
183 set_rotation_z(rstate.modelview, msec / 1000.0);
|
nuclear@0
|
184
|
nuclear@0
|
185 d3dut_ctx->UpdateSubresource(rstate_buf, 0, 0, &rstate, 0, 0);
|
nuclear@0
|
186 d3dut_ctx->VSSetConstantBuffers(0, 1, &rstate_buf);
|
nuclear@0
|
187
|
nuclear@0
|
188
|
nuclear@0
|
189 unsigned int stride = sizeof(Vertex);
|
nuclear@0
|
190 unsigned int offset = 0;
|
nuclear@0
|
191 d3dut_ctx->IASetVertexBuffers(0, 1, &vbuf, &stride, &offset);
|
nuclear@0
|
192 d3dut_ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
|
nuclear@0
|
193 d3dut_ctx->IASetInputLayout(vertex_layout);
|
nuclear@0
|
194
|
nuclear@0
|
195 d3dut_ctx->VSSetShader(vsdr, 0, 0);
|
nuclear@0
|
196 d3dut_ctx->PSSetShader(psdr, 0, 0);
|
nuclear@0
|
197
|
nuclear@0
|
198 d3dut_ctx->Draw(3, 0);
|
nuclear@0
|
199
|
nuclear@0
|
200 d3dut_swap_buffers();
|
nuclear@0
|
201 }
|
nuclear@0
|
202
|
nuclear@0
|
203 static void reshape(int x, int y)
|
nuclear@0
|
204 {
|
nuclear@0
|
205 width = x;
|
nuclear@0
|
206 height = y;
|
nuclear@0
|
207
|
nuclear@0
|
208 D3D11_VIEWPORT vp;
|
nuclear@0
|
209 vp.Width = (float)x;
|
nuclear@0
|
210 vp.Height = (float)y;
|
nuclear@0
|
211 vp.MinDepth = 0;
|
nuclear@0
|
212 vp.MaxDepth = 1;
|
nuclear@0
|
213 vp.TopLeftX = 0;
|
nuclear@0
|
214 vp.TopLeftY = 0;
|
nuclear@0
|
215 d3dut_ctx->RSSetViewports(1, &vp);
|
nuclear@0
|
216
|
nuclear@0
|
217 // TODO probably we also need to resize render targets or whatever...
|
nuclear@0
|
218 }
|
nuclear@0
|
219
|
nuclear@0
|
220 static void keyb(unsigned char key, int x, int y)
|
nuclear@0
|
221 {
|
nuclear@0
|
222 switch(key) {
|
nuclear@0
|
223 case 27:
|
nuclear@0
|
224 exit(0);
|
nuclear@0
|
225
|
nuclear@0
|
226 case ' ':
|
nuclear@0
|
227 {
|
nuclear@0
|
228 static bool anim = true;
|
nuclear@0
|
229 anim = !anim;
|
nuclear@0
|
230 d3dut_idle_func(anim ? d3dut_post_redisplay : 0);
|
nuclear@0
|
231 }
|
nuclear@0
|
232 break;
|
nuclear@0
|
233 }
|
nuclear@0
|
234 } |