d3dut

view src/d3dut.cc @ 0:ecc040281dc9

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