rev |
line source |
nuclear@0
|
1 #include <stdio.h>
|
nuclear@0
|
2 #include <stdlib.h>
|
nuclear@0
|
3 #include <vector>
|
nuclear@0
|
4 #include "d3dut.h"
|
nuclear@0
|
5 #include "win.h"
|
nuclear@0
|
6 #include "logmsg.h"
|
nuclear@0
|
7
|
nuclear@0
|
8 static void d3dut_cleanup();
|
nuclear@0
|
9
|
nuclear@0
|
10 D3DUTAPI ID3D11Device *d3dut_dev;
|
nuclear@0
|
11 D3DUTAPI ID3D11DeviceContext *d3dut_ctx;
|
nuclear@0
|
12 D3DUTAPI ID3D11RenderTargetView *d3dut_rtview;
|
nuclear@0
|
13
|
nuclear@0
|
14 static int init_xsz = 640;
|
nuclear@0
|
15 static int init_ysz = 480;
|
nuclear@0
|
16 static int init_dmflags = 0;
|
nuclear@0
|
17
|
nuclear@0
|
18 static long init_time = -1;
|
nuclear@0
|
19
|
nuclear@0
|
20 static D3DUT_IdleFunc idle_func;
|
nuclear@0
|
21
|
nuclear@0
|
22 void D3DUTAPI d3dut_init(int *argc, char **argv)
|
nuclear@0
|
23 {
|
nuclear@0
|
24 if(init_time >= 0) {
|
nuclear@0
|
25 warning("already initialized!\n");
|
nuclear@0
|
26 return;
|
nuclear@0
|
27 }
|
nuclear@0
|
28
|
nuclear@0
|
29 WNDCLASS wclass;
|
nuclear@0
|
30 memset(&wclass, 0, sizeof wclass);
|
nuclear@0
|
31 wclass.hInstance = GetModuleHandle(0);
|
nuclear@0
|
32 wclass.lpfnWndProc = win_handle_event;
|
nuclear@0
|
33 wclass.lpszClassName = WINCLASSNAME;
|
nuclear@0
|
34 wclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
|
nuclear@0
|
35 wclass.hIcon = LoadIcon(0, IDI_APPLICATION);
|
nuclear@0
|
36 wclass.hCursor = LoadCursor(0, IDC_ARROW);
|
nuclear@0
|
37 wclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
|
nuclear@0
|
38 RegisterClass(&wclass);
|
nuclear@0
|
39
|
nuclear@0
|
40 // create D3D device
|
nuclear@0
|
41 D3D_FEATURE_LEVEL feature_level[] = {
|
nuclear@0
|
42 D3D_FEATURE_LEVEL_11_0,
|
nuclear@0
|
43 D3D_FEATURE_LEVEL_10_1,
|
nuclear@0
|
44 D3D_FEATURE_LEVEL_10_0
|
nuclear@0
|
45 };
|
nuclear@0
|
46 if(D3D11CreateDevice(0, D3D_DRIVER_TYPE_HARDWARE, 0, 0, feature_level, 3, D3D11_SDK_VERSION,
|
nuclear@0
|
47 &d3dut_dev, 0, &d3dut_ctx) != 0) {
|
nuclear@0
|
48 fatal_error("failed to create D3D11 device\n");
|
nuclear@0
|
49 }
|
nuclear@0
|
50 atexit(d3dut_cleanup);
|
nuclear@0
|
51
|
nuclear@0
|
52 init_time = timeGetTime();
|
nuclear@0
|
53 }
|
nuclear@0
|
54
|
nuclear@0
|
55 static void d3dut_cleanup()
|
nuclear@0
|
56 {
|
nuclear@0
|
57 for(size_t i=0; i<windows.size(); i++) {
|
nuclear@0
|
58 if(windows[i]) {
|
nuclear@0
|
59 destroy_window(i);
|
nuclear@0
|
60 }
|
nuclear@0
|
61 }
|
nuclear@0
|
62 windows.clear();
|
nuclear@0
|
63
|
nuclear@0
|
64 if(d3dut_dev) {
|
nuclear@0
|
65 d3dut_dev->Release();
|
nuclear@0
|
66 d3dut_dev = 0;
|
nuclear@0
|
67 }
|
nuclear@0
|
68 if(d3dut_ctx) {
|
nuclear@0
|
69 d3dut_ctx->Release();
|
nuclear@0
|
70 d3dut_ctx = 0;
|
nuclear@0
|
71 }
|
nuclear@0
|
72 d3dut_rtview = 0;
|
nuclear@0
|
73
|
nuclear@0
|
74 UnregisterClass(WINCLASSNAME, GetModuleHandle(0));
|
nuclear@0
|
75 init_time = -1;
|
nuclear@0
|
76 }
|
nuclear@0
|
77
|
nuclear@0
|
78 void D3DUTAPI d3dut_init_display_mode(unsigned int dmflags)
|
nuclear@0
|
79 {
|
nuclear@0
|
80 init_dmflags = dmflags;
|
nuclear@0
|
81 }
|
nuclear@0
|
82
|
nuclear@0
|
83 void D3DUTAPI d3dut_init_window_size(int xsz, int ysz)
|
nuclear@0
|
84 {
|
nuclear@0
|
85 init_xsz = xsz;
|
nuclear@0
|
86 init_ysz = ysz;
|
nuclear@0
|
87 }
|
nuclear@0
|
88
|
nuclear@0
|
89
|
nuclear@0
|
90 int D3DUTAPI d3dut_create_window(const char *title)
|
nuclear@0
|
91 {
|
nuclear@0
|
92 return create_window(title, init_xsz, init_ysz, init_dmflags);
|
nuclear@0
|
93 }
|
nuclear@0
|
94
|
nuclear@0
|
95 void D3DUTAPI d3dut_destroy_window(int win)
|
nuclear@0
|
96 {
|
nuclear@0
|
97 destroy_window(win);
|
nuclear@0
|
98 }
|
nuclear@0
|
99
|
nuclear@0
|
100 void D3DUTAPI d3dut_set_window(int idx)
|
nuclear@0
|
101 {
|
nuclear@0
|
102 set_active_win(idx);
|
nuclear@0
|
103 }
|
nuclear@0
|
104
|
nuclear@0
|
105 int D3DUTAPI d3dut_get_window()
|
nuclear@0
|
106 {
|
nuclear@0
|
107 return get_active_win();
|
nuclear@0
|
108 }
|
nuclear@0
|
109
|
nuclear@0
|
110 void D3DUTAPI d3dut_display_func(D3DUT_DisplayFunc func)
|
nuclear@0
|
111 {
|
nuclear@0
|
112 Window *win = get_window();
|
nuclear@0
|
113 win->display_func = func;
|
nuclear@0
|
114 }
|
nuclear@0
|
115
|
nuclear@0
|
116 void D3DUTAPI d3dut_idle_func(D3DUT_IdleFunc func)
|
nuclear@0
|
117 {
|
nuclear@0
|
118 idle_func = func;
|
nuclear@0
|
119 }
|
nuclear@0
|
120
|
nuclear@0
|
121 void D3DUTAPI d3dut_reshape_func(D3DUT_ReshapeFunc func)
|
nuclear@0
|
122 {
|
nuclear@0
|
123 Window *win = get_window();
|
nuclear@0
|
124 win->reshape_func = func;
|
nuclear@0
|
125 }
|
nuclear@0
|
126
|
nuclear@0
|
127 void D3DUTAPI d3dut_keyboard_func(D3DUT_KeyboardFunc func)
|
nuclear@0
|
128 {
|
nuclear@0
|
129 Window *win = get_window();
|
nuclear@0
|
130 win->keyboard_func = func;
|
nuclear@0
|
131 }
|
nuclear@0
|
132
|
nuclear@0
|
133 void D3DUTAPI d3dut_keyboard_up_func(D3DUT_KeyboardUpFunc func)
|
nuclear@0
|
134 {
|
nuclear@0
|
135 Window *win = get_window();
|
nuclear@0
|
136 win->keyboard_up_func = func;
|
nuclear@0
|
137 }
|
nuclear@0
|
138
|
nuclear@0
|
139 void D3DUTAPI d3dut_special_func(D3DUT_SpecialFunc func)
|
nuclear@0
|
140 {
|
nuclear@0
|
141 Window *win = get_window();
|
nuclear@0
|
142 win->special_func = func;
|
nuclear@0
|
143 }
|
nuclear@0
|
144
|
nuclear@0
|
145 void D3DUTAPI d3dut_special_up_func(D3DUT_SpecialUpFunc func)
|
nuclear@0
|
146 {
|
nuclear@0
|
147 Window *win = get_window();
|
nuclear@0
|
148 win->special_up_func = func;
|
nuclear@0
|
149 }
|
nuclear@0
|
150
|
nuclear@0
|
151 void D3DUTAPI d3dut_mouse_func(D3DUT_MouseFunc func)
|
nuclear@0
|
152 {
|
nuclear@0
|
153 Window *win = get_window();
|
nuclear@0
|
154 win->mouse_func = func;
|
nuclear@0
|
155 }
|
nuclear@0
|
156
|
nuclear@0
|
157 void D3DUTAPI d3dut_motion_func(D3DUT_MotionFunc func)
|
nuclear@0
|
158 {
|
nuclear@0
|
159 Window *win = get_window();
|
nuclear@0
|
160 win->motion_func = func;
|
nuclear@0
|
161 }
|
nuclear@0
|
162
|
nuclear@0
|
163 void D3DUTAPI d3dut_passive_motion_func(D3DUT_PassiveMotionFunc func)
|
nuclear@0
|
164 {
|
nuclear@0
|
165 Window *win = get_window();
|
nuclear@0
|
166 win->passive_motion_func = func;
|
nuclear@0
|
167 }
|
nuclear@0
|
168
|
nuclear@0
|
169
|
nuclear@0
|
170 void D3DUTAPI d3dut_post_redisplay()
|
nuclear@0
|
171 {
|
nuclear@0
|
172 Window *win = get_window();
|
nuclear@0
|
173 win->must_redisplay = true;
|
nuclear@0
|
174 }
|
nuclear@0
|
175
|
nuclear@0
|
176 void D3DUTAPI d3dut_swap_buffers()
|
nuclear@0
|
177 {
|
nuclear@0
|
178 Window *win = get_window();
|
nuclear@0
|
179 win->swap->Present(0, 0);
|
nuclear@0
|
180 }
|
nuclear@0
|
181
|
nuclear@0
|
182 void D3DUTAPI d3dut_main_loop()
|
nuclear@0
|
183 {
|
nuclear@0
|
184 MSG msg;
|
nuclear@0
|
185
|
nuclear@0
|
186 for(;;) {
|
nuclear@0
|
187 bool must_redisplay = false;
|
nuclear@0
|
188 for(size_t i=0; i<windows.size(); i++) {
|
nuclear@0
|
189 Window *win = windows[i];
|
nuclear@0
|
190 if(win->changed_size && win->reshape_func) {
|
nuclear@0
|
191 win->changed_size = false;
|
nuclear@0
|
192 set_active_win(i);
|
nuclear@0
|
193 win->reshape_func(win->width, win->height);
|
nuclear@0
|
194 }
|
nuclear@0
|
195 if(win->must_redisplay) {
|
nuclear@0
|
196 must_redisplay = true;
|
nuclear@0
|
197 }
|
nuclear@0
|
198 }
|
nuclear@0
|
199
|
nuclear@0
|
200 if(idle_func || must_redisplay) {
|
nuclear@0
|
201 while(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
|
nuclear@0
|
202 TranslateMessage(&msg);
|
nuclear@0
|
203 DispatchMessage(&msg);
|
nuclear@0
|
204 if(msg.message == WM_QUIT) {
|
nuclear@0
|
205 return;
|
nuclear@0
|
206 }
|
nuclear@0
|
207 }
|
nuclear@0
|
208
|
nuclear@0
|
209 if(idle_func) { // checking again because a handler might have set this to 0
|
nuclear@0
|
210 idle_func();
|
nuclear@0
|
211 }
|
nuclear@0
|
212 } else {
|
nuclear@0
|
213 if(!GetMessage(&msg, 0, 0, 0)) {
|
nuclear@0
|
214 return;
|
nuclear@0
|
215 }
|
nuclear@0
|
216 TranslateMessage(&msg);
|
nuclear@0
|
217 DispatchMessage(&msg);
|
nuclear@0
|
218 }
|
nuclear@0
|
219
|
nuclear@0
|
220 for(size_t i=0; i<windows.size(); i++) {
|
nuclear@0
|
221 Window *win = windows[i];
|
nuclear@0
|
222 if(win->must_redisplay && win->display_func) {
|
nuclear@0
|
223 win->must_redisplay = false;
|
nuclear@0
|
224 set_active_win(i);
|
nuclear@0
|
225 win->display_func();
|
nuclear@0
|
226 ValidateRect(win->win, 0);
|
nuclear@0
|
227 }
|
nuclear@0
|
228 }
|
nuclear@0
|
229 }
|
nuclear@0
|
230 }
|
nuclear@0
|
231
|
nuclear@0
|
232
|
nuclear@0
|
233 int D3DUTAPI d3dut_get(unsigned int what)
|
nuclear@0
|
234 {
|
nuclear@0
|
235 Window *win = get_window();
|
nuclear@0
|
236
|
nuclear@0
|
237 switch(what) {
|
nuclear@0
|
238 case D3DUT_WINDOW_WIDTH:
|
nuclear@0
|
239 return win->width;
|
nuclear@0
|
240 case D3DUT_WINDOW_HEIGHT:
|
nuclear@0
|
241 return win->height;
|
nuclear@0
|
242
|
nuclear@0
|
243 case D3DUT_ELAPSED_TIME:
|
nuclear@0
|
244 return (long)timeGetTime() - init_time;
|
nuclear@0
|
245
|
nuclear@0
|
246 default:
|
nuclear@0
|
247 break;
|
nuclear@0
|
248 }
|
nuclear@0
|
249 return 0;
|
nuclear@0
|
250 }
|
nuclear@0
|
251
|
nuclear@0
|
252
|
nuclear@0
|
253 void D3DUTAPI d3dut_solid_sphere(double radius, int slices, int stacks)
|
nuclear@0
|
254 {
|
nuclear@0
|
255 }
|