annotate trunk/tests/ChipmunkDemos/framework.d @ 19:eb61cc181345

platform independant timing method
author Extrawurst
date Thu, 09 Dec 2010 22:20:19 +0100
parents a376e5d3eb00
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
1
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
2 // written in the D programming language
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
3
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
4 /++
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
5 + Authors: Stephan Dilly, www.extrawurst.org
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
6 +/
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
7
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
8 module framework;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
9
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
10 import derelict.sdl.sdl;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
11 import derelict.opengl.gl;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
12 import derelict.opengl.glu;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
13
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
14 import std.string;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
15 import std.stdio;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
16
18
a376e5d3eb00 option to enable/disable vsync
Extrawurst
parents: 16
diff changeset
17 void startup(string _title,int _width,int _height,bool _disableVsync=true)
16
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
18 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
19 DerelictGL.load();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
20 DerelictGLU.load();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
21 DerelictSDL.load();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
22
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
23 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
24 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
25 throw new Exception("Failed to initialize SDL");
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
26 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
27
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
28 // Enable key repeating
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
29 if ((SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL)))
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
30 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
31 throw new Exception("Failed to set key repeat");
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
32 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
33
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
34 //enable to get ascii/unicode info of key event
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
35 SDL_EnableUNICODE(1);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
36
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
37 // Set the OpenGL attributes
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
38 SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
39 SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
40 SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
41 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
18
a376e5d3eb00 option to enable/disable vsync
Extrawurst
parents: 16
diff changeset
42 SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL,_disableVsync?0:1);
16
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
43
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
44 // Set the window title
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
45 SDL_WM_SetCaption(cast(char*)toStringz(_title), null);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
46
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
47 int mode = SDL_OPENGL;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
48
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
49 // Now open a SDL OpenGL window with the given parameters
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
50 if (SDL_SetVideoMode(_width, _height, 32, mode) is null)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
51 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
52 throw new Exception("Failed to open SDL window");
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
53 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
54 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
55
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
56 alias void delegate(int,int,bool) MouseButton;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
57 alias void delegate(int,int) MouseMove;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
58 alias void delegate(int,bool) KeyEvent;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
59 public bool processEvents(KeyEvent _keyevent,MouseMove _mmove,MouseButton _mbutton)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
60 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
61 SDL_Event event;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
62 while (SDL_PollEvent(&event))
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
63 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
64 switch (event.type)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
65 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
66 case SDL_KEYUP:
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
67 case SDL_KEYDOWN:
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
68 _keyevent(event.key.keysym.sym,event.type == SDL_KEYDOWN);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
69 break;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
70
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
71 case SDL_MOUSEMOTION:
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
72 _mmove(event.motion.x,event.motion.y);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
73 break;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
74
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
75 case SDL_MOUSEBUTTONUP:
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
76 case SDL_MOUSEBUTTONDOWN:
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
77 _mbutton(event.button.x,event.button.y,event.type == SDL_MOUSEBUTTONDOWN);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
78 break;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
79
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
80 case SDL_QUIT:
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
81 return false;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
82
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
83 default:
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
84 break;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
85 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
86 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
87
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
88 return true;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
89 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
90
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
91 void shutdown()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
92 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
93 SDL_Quit();
19
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
94 }
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
95
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
96 version (Win32)
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
97 {
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
98 import std.c.windows.windows;
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
99
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
100 static long winfrequ;
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
101
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
102 static this()
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
103 {
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
104 QueryPerformanceFrequency(&winfrequ);
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
105 }
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
106
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
107 ulong tickCount(){
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
108 long ret;
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
109 QueryPerformanceCounter(&ret);
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
110 return (cast(ulong)(cast(float)ret / winfrequ * 1000));
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
111 }
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
112 }
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
113 else version (linux)
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
114 {
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
115 import std.c.linux.linux;
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
116
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
117 ulong tickCount(){
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
118
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
119 timeval val;
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
120 gettimeofday(&val,null);
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
121
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
122 //return time(null);
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
123 return val.tv_usec/1000;
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
124 }
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
125 }
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
126 else version (OSX)
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
127 {
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
128 import std.date;
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
129
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
130 ulong tickCount(){
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
131
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
132 return cast(ulong)getUTCtime();
eb61cc181345 platform independant timing method
Extrawurst
parents: 18
diff changeset
133 }
16
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
134 }