d3dut

annotate src/d3dut.cc @ 1:242535442d04

added license, readme, and gpl headers
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 22 Jun 2013 10:43:12 +0300
parents ecc040281dc9
children
rev   line source
nuclear@1 1 /*
nuclear@1 2 D3DUT - Simple window creation and event handling for Direct3D 11 applications.
nuclear@1 3 Copyright (C) 2013 John Tsiombikas <nuclear@member.fsf.org>
nuclear@1 4
nuclear@1 5 This program is free software: you can redistribute it and/or modify
nuclear@1 6 it under the terms of the GNU Lesser General Public License as published by
nuclear@1 7 the Free Software Foundation, either version 3 of the License, or
nuclear@1 8 (at your option) any later version.
nuclear@1 9
nuclear@1 10 This program is distributed in the hope that it will be useful,
nuclear@1 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
nuclear@1 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nuclear@1 13 GNU Lesser General Public License for more details.
nuclear@1 14
nuclear@1 15 You should have received a copy of the GNU Lesser General Public License
nuclear@1 16 along with this program. If not, see <http://www.gnu.org/licenses/>.
nuclear@1 17 */
nuclear@0 18 #include <stdio.h>
nuclear@0 19 #include <stdlib.h>
nuclear@0 20 #include <vector>
nuclear@0 21 #include "d3dut.h"
nuclear@0 22 #include "win.h"
nuclear@0 23 #include "logmsg.h"
nuclear@0 24
nuclear@0 25 static void d3dut_cleanup();
nuclear@0 26
nuclear@0 27 D3DUTAPI ID3D11Device *d3dut_dev;
nuclear@0 28 D3DUTAPI ID3D11DeviceContext *d3dut_ctx;
nuclear@0 29 D3DUTAPI ID3D11RenderTargetView *d3dut_rtview;
nuclear@0 30
nuclear@0 31 static int init_xsz = 640;
nuclear@0 32 static int init_ysz = 480;
nuclear@0 33 static int init_dmflags = 0;
nuclear@0 34
nuclear@0 35 static long init_time = -1;
nuclear@0 36
nuclear@0 37 static D3DUT_IdleFunc idle_func;
nuclear@0 38
nuclear@0 39 void D3DUTAPI d3dut_init(int *argc, char **argv)
nuclear@0 40 {
nuclear@0 41 if(init_time >= 0) {
nuclear@0 42 warning("already initialized!\n");
nuclear@0 43 return;
nuclear@0 44 }
nuclear@0 45
nuclear@0 46 WNDCLASS wclass;
nuclear@0 47 memset(&wclass, 0, sizeof wclass);
nuclear@0 48 wclass.hInstance = GetModuleHandle(0);
nuclear@0 49 wclass.lpfnWndProc = win_handle_event;
nuclear@0 50 wclass.lpszClassName = WINCLASSNAME;
nuclear@0 51 wclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
nuclear@0 52 wclass.hIcon = LoadIcon(0, IDI_APPLICATION);
nuclear@0 53 wclass.hCursor = LoadCursor(0, IDC_ARROW);
nuclear@0 54 wclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
nuclear@0 55 RegisterClass(&wclass);
nuclear@0 56
nuclear@0 57 // create D3D device
nuclear@0 58 D3D_FEATURE_LEVEL feature_level[] = {
nuclear@0 59 D3D_FEATURE_LEVEL_11_0,
nuclear@0 60 D3D_FEATURE_LEVEL_10_1,
nuclear@0 61 D3D_FEATURE_LEVEL_10_0
nuclear@0 62 };
nuclear@0 63 if(D3D11CreateDevice(0, D3D_DRIVER_TYPE_HARDWARE, 0, 0, feature_level, 3, D3D11_SDK_VERSION,
nuclear@0 64 &d3dut_dev, 0, &d3dut_ctx) != 0) {
nuclear@0 65 fatal_error("failed to create D3D11 device\n");
nuclear@0 66 }
nuclear@0 67 atexit(d3dut_cleanup);
nuclear@0 68
nuclear@0 69 init_time = timeGetTime();
nuclear@0 70 }
nuclear@0 71
nuclear@0 72 static void d3dut_cleanup()
nuclear@0 73 {
nuclear@0 74 for(size_t i=0; i<windows.size(); i++) {
nuclear@0 75 if(windows[i]) {
nuclear@0 76 destroy_window(i);
nuclear@0 77 }
nuclear@0 78 }
nuclear@0 79 windows.clear();
nuclear@0 80
nuclear@0 81 if(d3dut_dev) {
nuclear@0 82 d3dut_dev->Release();
nuclear@0 83 d3dut_dev = 0;
nuclear@0 84 }
nuclear@0 85 if(d3dut_ctx) {
nuclear@0 86 d3dut_ctx->Release();
nuclear@0 87 d3dut_ctx = 0;
nuclear@0 88 }
nuclear@0 89 d3dut_rtview = 0;
nuclear@0 90
nuclear@0 91 UnregisterClass(WINCLASSNAME, GetModuleHandle(0));
nuclear@0 92 init_time = -1;
nuclear@0 93 }
nuclear@0 94
nuclear@0 95 void D3DUTAPI d3dut_init_display_mode(unsigned int dmflags)
nuclear@0 96 {
nuclear@0 97 init_dmflags = dmflags;
nuclear@0 98 }
nuclear@0 99
nuclear@0 100 void D3DUTAPI d3dut_init_window_size(int xsz, int ysz)
nuclear@0 101 {
nuclear@0 102 init_xsz = xsz;
nuclear@0 103 init_ysz = ysz;
nuclear@0 104 }
nuclear@0 105
nuclear@0 106
nuclear@0 107 int D3DUTAPI d3dut_create_window(const char *title)
nuclear@0 108 {
nuclear@0 109 return create_window(title, init_xsz, init_ysz, init_dmflags);
nuclear@0 110 }
nuclear@0 111
nuclear@0 112 void D3DUTAPI d3dut_destroy_window(int win)
nuclear@0 113 {
nuclear@0 114 destroy_window(win);
nuclear@0 115 }
nuclear@0 116
nuclear@0 117 void D3DUTAPI d3dut_set_window(int idx)
nuclear@0 118 {
nuclear@0 119 set_active_win(idx);
nuclear@0 120 }
nuclear@0 121
nuclear@0 122 int D3DUTAPI d3dut_get_window()
nuclear@0 123 {
nuclear@0 124 return get_active_win();
nuclear@0 125 }
nuclear@0 126
nuclear@0 127 void D3DUTAPI d3dut_display_func(D3DUT_DisplayFunc func)
nuclear@0 128 {
nuclear@0 129 Window *win = get_window();
nuclear@0 130 win->display_func = func;
nuclear@0 131 }
nuclear@0 132
nuclear@0 133 void D3DUTAPI d3dut_idle_func(D3DUT_IdleFunc func)
nuclear@0 134 {
nuclear@0 135 idle_func = func;
nuclear@0 136 }
nuclear@0 137
nuclear@0 138 void D3DUTAPI d3dut_reshape_func(D3DUT_ReshapeFunc func)
nuclear@0 139 {
nuclear@0 140 Window *win = get_window();
nuclear@0 141 win->reshape_func = func;
nuclear@0 142 }
nuclear@0 143
nuclear@0 144 void D3DUTAPI d3dut_keyboard_func(D3DUT_KeyboardFunc func)
nuclear@0 145 {
nuclear@0 146 Window *win = get_window();
nuclear@0 147 win->keyboard_func = func;
nuclear@0 148 }
nuclear@0 149
nuclear@0 150 void D3DUTAPI d3dut_keyboard_up_func(D3DUT_KeyboardUpFunc func)
nuclear@0 151 {
nuclear@0 152 Window *win = get_window();
nuclear@0 153 win->keyboard_up_func = func;
nuclear@0 154 }
nuclear@0 155
nuclear@0 156 void D3DUTAPI d3dut_special_func(D3DUT_SpecialFunc func)
nuclear@0 157 {
nuclear@0 158 Window *win = get_window();
nuclear@0 159 win->special_func = func;
nuclear@0 160 }
nuclear@0 161
nuclear@0 162 void D3DUTAPI d3dut_special_up_func(D3DUT_SpecialUpFunc func)
nuclear@0 163 {
nuclear@0 164 Window *win = get_window();
nuclear@0 165 win->special_up_func = func;
nuclear@0 166 }
nuclear@0 167
nuclear@0 168 void D3DUTAPI d3dut_mouse_func(D3DUT_MouseFunc func)
nuclear@0 169 {
nuclear@0 170 Window *win = get_window();
nuclear@0 171 win->mouse_func = func;
nuclear@0 172 }
nuclear@0 173
nuclear@0 174 void D3DUTAPI d3dut_motion_func(D3DUT_MotionFunc func)
nuclear@0 175 {
nuclear@0 176 Window *win = get_window();
nuclear@0 177 win->motion_func = func;
nuclear@0 178 }
nuclear@0 179
nuclear@0 180 void D3DUTAPI d3dut_passive_motion_func(D3DUT_PassiveMotionFunc func)
nuclear@0 181 {
nuclear@0 182 Window *win = get_window();
nuclear@0 183 win->passive_motion_func = func;
nuclear@0 184 }
nuclear@0 185
nuclear@0 186
nuclear@0 187 void D3DUTAPI d3dut_post_redisplay()
nuclear@0 188 {
nuclear@0 189 Window *win = get_window();
nuclear@0 190 win->must_redisplay = true;
nuclear@0 191 }
nuclear@0 192
nuclear@0 193 void D3DUTAPI d3dut_swap_buffers()
nuclear@0 194 {
nuclear@0 195 Window *win = get_window();
nuclear@0 196 win->swap->Present(0, 0);
nuclear@0 197 }
nuclear@0 198
nuclear@0 199 void D3DUTAPI d3dut_main_loop()
nuclear@0 200 {
nuclear@0 201 MSG msg;
nuclear@0 202
nuclear@0 203 for(;;) {
nuclear@0 204 bool must_redisplay = false;
nuclear@0 205 for(size_t i=0; i<windows.size(); i++) {
nuclear@0 206 Window *win = windows[i];
nuclear@0 207 if(win->changed_size && win->reshape_func) {
nuclear@0 208 win->changed_size = false;
nuclear@0 209 set_active_win(i);
nuclear@0 210 win->reshape_func(win->width, win->height);
nuclear@0 211 }
nuclear@0 212 if(win->must_redisplay) {
nuclear@0 213 must_redisplay = true;
nuclear@0 214 }
nuclear@0 215 }
nuclear@0 216
nuclear@0 217 if(idle_func || must_redisplay) {
nuclear@0 218 while(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
nuclear@0 219 TranslateMessage(&msg);
nuclear@0 220 DispatchMessage(&msg);
nuclear@0 221 if(msg.message == WM_QUIT) {
nuclear@0 222 return;
nuclear@0 223 }
nuclear@0 224 }
nuclear@0 225
nuclear@0 226 if(idle_func) { // checking again because a handler might have set this to 0
nuclear@0 227 idle_func();
nuclear@0 228 }
nuclear@0 229 } else {
nuclear@0 230 if(!GetMessage(&msg, 0, 0, 0)) {
nuclear@0 231 return;
nuclear@0 232 }
nuclear@0 233 TranslateMessage(&msg);
nuclear@0 234 DispatchMessage(&msg);
nuclear@0 235 }
nuclear@0 236
nuclear@0 237 for(size_t i=0; i<windows.size(); i++) {
nuclear@0 238 Window *win = windows[i];
nuclear@0 239 if(win->must_redisplay && win->display_func) {
nuclear@0 240 win->must_redisplay = false;
nuclear@0 241 set_active_win(i);
nuclear@0 242 win->display_func();
nuclear@0 243 ValidateRect(win->win, 0);
nuclear@0 244 }
nuclear@0 245 }
nuclear@0 246 }
nuclear@0 247 }
nuclear@0 248
nuclear@0 249
nuclear@0 250 int D3DUTAPI d3dut_get(unsigned int what)
nuclear@0 251 {
nuclear@0 252 Window *win = get_window();
nuclear@0 253
nuclear@0 254 switch(what) {
nuclear@0 255 case D3DUT_WINDOW_WIDTH:
nuclear@0 256 return win->width;
nuclear@0 257 case D3DUT_WINDOW_HEIGHT:
nuclear@0 258 return win->height;
nuclear@0 259
nuclear@0 260 case D3DUT_ELAPSED_TIME:
nuclear@0 261 return (long)timeGetTime() - init_time;
nuclear@0 262
nuclear@0 263 default:
nuclear@0 264 break;
nuclear@0 265 }
nuclear@0 266 return 0;
nuclear@0 267 }
nuclear@0 268
nuclear@0 269
nuclear@0 270 void D3DUTAPI d3dut_solid_sphere(double radius, int slices, int stacks)
nuclear@0 271 {
nuclear@0 272 }