]>
Dogcows Code - chaz/yoink/blob - src/Moof/Engine.cc
2 /*******************************************************************************
4 Copyright (c) 2009, Charles McGarvey
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions are met:
10 * Redistributions of source code must retain the above copyright notice,
11 this list of conditions and the following disclaimer.
12 * Redistributions in binary form must reproduce the above copyright notice,
13 this list of conditions and the following disclaimer in the documentation
14 and/or other materials provided with the distribution.
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
20 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *******************************************************************************/
29 #include <cstdlib> // exit
33 #include "fastevents.h"
36 #include "Dispatcher.hh"
40 #include "Settings.hh"
51 Impl(int argc
, char* argv
[], const std::string
& configFile
,
52 const std::string
& name
, const std::string
& iconFile
,
58 #if defined(_WIN32) || defined (_WIN64) || defined(__WIN32__)
59 if (SDL_Init(SDL_INIT_VIDEO
| SDL_INIT_TIMER
) != 0)
61 if (SDL_Init(SDL_INIT_VIDEO
| SDL_INIT_EVENTTHREAD
) != 0)
64 logError("sdl is complaining: %s", SDL_GetError());
65 throw Exception(Exception::SDL_ERROR
);
69 logError("fast events error: %s", FE_GetError());
70 throw Exception(Exception::SDL_ERROR
);
72 alutInit(&argc
, argv
);
74 Settings
& settings
= Settings::getInstance();
75 settings
.loadFromFile(configFile
);
76 settings
.parseArgs(argc
, argv
);
79 if (settings
.get("rngseed", randomSeed
)) setSeed(randomSeed
);
82 settings
.get("timestep", timestep
);
85 settings
.get("maxfps", maxFps
);
86 drawRate
= 1.0 / Scalar(maxFps
);
88 settings
.get("printfps", printFps
);
90 video
= Video::alloc(name
, iconFile
);
96 // the video object must be destroyed before we can shutdown SDL
106 * The main loop. This just calls dispatchEvents(), update(), and draw()
107 * over and over again. The timing of the update and draw are decoupled.
108 * The actual frame rate is also calculated here. This function will return
109 * the exit code used to stop the loop.
114 Scalar ticksNow
= Timer::getTicks();
116 Scalar nextStep
= ticksNow
;
117 Scalar nextDraw
= ticksNow
;
118 Scalar nextFpsUpdate
= ticksNow
+ 1.0;
120 Scalar totalTime
= 0.0;
121 Scalar deltaTime
= 0.0;
122 Scalar accumulator
= timestep
;
130 Scalar newTicks
= Timer::getTicks();
131 deltaTime
= newTicks
- ticksNow
;
134 if (deltaTime
>= 0.25) deltaTime
= 0.25;
135 accumulator
+= deltaTime
;
137 Timer::fireIfExpired(ticksNow
);
139 while (accumulator
>= timestep
)
142 interface
->update(totalTime
, timestep
);
144 totalTime
+= timestep
;
145 accumulator
-= timestep
;
147 nextStep
+= timestep
;
149 if (ticksNow
>= nextStep
)
151 nextStep
= ticksNow
+ timestep
;
154 if (ticksNow
>= nextDraw
)
158 if (ticksNow
>= nextFpsUpdate
) // determine the actual fps
163 nextFpsUpdate
+= 1.0;
164 if (ticksNow
>= nextFpsUpdate
)
166 nextFpsUpdate
= ticksNow
+ 1.0;
171 logInfo("%d fps", fps
);
175 interface
->draw(accumulator
/ timestep
);
178 nextDraw
+= drawRate
;
179 if (ticksNow
>= nextDraw
)
181 // we missed some scheduled draws, so reset the schedule
182 nextDraw
= ticksNow
+ drawRate
;
186 // be a good citizen and give back what you don't need
187 Timer::sleep(std::min(std::min(nextStep
, nextDraw
),
188 Timer::getNextFire()), true);
196 void dispatchEvents()
200 while (FE_PollEvent(&event
) == 1)
205 if (event
.key
.keysym
.sym
== SDLK_ESCAPE
&&
206 (SDL_GetModState() & KMOD_CTRL
) )
212 case SDL_VIDEORESIZE
:
213 video
->resize(event
.resize
.w
, event
.resize
.h
);
217 interface
->handleEvent(event
);
237 Engine::Engine(int argc
, char* argv
[], const std::string
& configFile
,
238 const std::string
& name
, const std::string
& iconFile
) :
239 impl_(new Engine::Impl(argc
, argv
, configFile
, name
, iconFile
, this)) {}
249 void Engine::stop(int exitCode
)
251 impl_
->running
= false;
252 impl_
->exitCode
= exitCode
;
256 void Engine::setTimestep(Scalar ts
)
258 impl_
->timestep
= ts
;
261 Scalar
Engine::getTimestep()
263 return impl_
->timestep
;
266 void Engine::setMaxFrameRate(long maxFps
)
268 impl_
->drawRate
= 1.0 / Scalar(maxFps
);
271 long Engine::getMaxFrameRate()
273 return long(1.0 / impl_
->drawRate
);
277 Video
& Engine::getVideo()
279 return *impl_
->video
;
282 long Engine::getFrameRate()
288 void Engine::update(Scalar t
, Scalar dt
) {}
289 void Engine::draw(Scalar alpha
) {}
290 void Engine::handleEvent(const Event
& event
) {}
295 /** vim: set ts=4 sw=4 tw=80: *************************************************/
This page took 0.047199 seconds and 4 git commands to generate.