created basic threads
[physics.git] / src / main.cpp
... / ...
CommitLineData
1/*
2 * Copyright (C) 2008 Patrik Gornicz, Gornicz_P (at) hotmail (dot) com.
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include <GL/gl.h>
19#include <GL/glu.h>
20#include <SDL/SDL.h>
21
22#include "debug.h"
23#include "handleSignal.h"
24
25#include "game.h"
26#include "ticks.h"
27
28#include "graphics/graphics.h"
29#include "input/inputManager.h"
30#include "config/config.h"
31
32/// ***** Private Method Headers *****
33
34void init();
35
36void sighandler( int sig );
37
38void run();
39void clean();
40
41void updateFPSCounters();
42
43void handleInput();
44void update(float);
45void draw();
46
47/// ***** Private Variables *****
48
49// variable used to determine if it is time to shutdown
50bool is_Running;
51
52/* Values for the main game loop
53 * target_UPS := the amount of updates that is wanted in one second
54 *
55 * ups := updates per second for the last second
56 * fps := frames per second for the last second
57 * update_Count := counts this seconds updates
58 * draw_Count := counts this seconds draws
59 * last_Second := stores the time of the last second, used for ups and fps
60 */
61int target_UPS = 100;
62
63int ups, fps;
64int update_Count, draw_Count;
65long int last_Second;
66
67int startUpdateThread(void*);
68int startDrawThread(void*);
69
70/// ***** MAIN Method *****
71int main(int argc, char** args)
72{
73 init();
74 run();
75 clean();
76 return 0;
77}
78
79/// ***** Initializers/Cleaners *****
80
81void init()
82{
83 installSignal();
84
85 graphics::init();
86 DPF(0, "Graphics initialized");
87
88 game::init();
89 DPF(0, "Game initialized");
90
91 input::init();
92 DPF(0, "Input initialized");
93
94 cfg::init();
95 DPF(0, "Configs initialized");
96
97 DPF(0, "Initialization Complete");
98}
99
100void clean()
101{
102 DPF(0, "Cleaning up");
103
104 cfg::clean();
105
106 input::clean();
107
108 game::clean();
109
110 graphics::clean();
111}
112
113/// ***** Private Methods *****
114
115void run()
116{
117 is_Running = true;
118
119 SDL_Thread* updates = SDL_CreateThread(startUpdateThread, NULL);
120
121 startDrawThread(NULL);
122
123 SDL_WaitThread(updates, NULL);
124}
125
126void updateFPSCounters()
127{
128 // Check if a second has passed to recalculate UPS and FPS
129 if (tickCountMicro() - last_Second >= 1000000)
130 {
131 ups = update_Count;
132 fps = draw_Count;
133
134 // NOT thread safe, but they're estimates anyways
135 update_Count -= ups;
136 draw_Count -= fps;
137
138 last_Second = tickCountMicro();
139
140#ifdef FPSUPS
141 cout << "ups:\t" << ups << endl;
142 cout << "fps:\t" << fps << endl;
143#endif
144 }
145}
146
147void handleInput()
148{
149 input::update();
150
151 game::handleInput();
152
153 if(cfg::endGame())
154 is_Running = false;
155}
156
157void update(float time_step)
158{
159 game::update(time_step);
160 update_Count++;
161}
162
163void draw()
164{
165 game::draw();
166
167 SDL_GL_SwapBuffers();
168
169 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
170
171 draw_Count++;
172}
173
174int startUpdateThread(void*)
175{
176 while(is_Running)
177 {
178 handleInput();
179 update(10);
180
181 updateFPSCounters();
182
183 SDL_Delay(10);
184 }
185
186 return 0;
187}
188
189int startDrawThread(void*)
190{
191 while(is_Running)
192 {
193 draw();
194 }
195
196 return 0;
197}