d3dut

annotate 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
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 }