From: <vo...@us...> - 2009-01-03 12:58:51
|
Revision: 1083 http://opde.svn.sourceforge.net/opde/?rev=1083&view=rev Author: volca Date: 2009-01-03 12:58:43 +0000 (Sat, 03 Jan 2009) Log Message: ----------- Changed the handling of new state (sim service should already work now) Modified Paths: -------------- trunk/src/services/sim/SimService.cpp trunk/src/services/sim/SimService.h Modified: trunk/src/services/sim/SimService.cpp =================================================================== --- trunk/src/services/sim/SimService.cpp 2009-01-03 12:57:16 UTC (rev 1082) +++ trunk/src/services/sim/SimService.cpp 2009-01-03 12:58:43 UTC (rev 1083) @@ -32,7 +32,7 @@ /*----------------------------------------------------*/ /*-------------------- Sim Listener ------------------*/ /*----------------------------------------------------*/ - SimListener::SimListener() : mSimTime(0), mPaused(false), mSimRunning(false) { + SimListener::SimListener() : mSimTime(0), mSimTimeFlow(1), mSimPaused(false), mSimRunning(false) { } @@ -54,15 +54,20 @@ //------------------------------------------------------ void SimListener::simPaused() { - mPaused = true; + mSimPaused = true; } //------------------------------------------------------ void SimListener::simUnPaused() { - mPaused = false; + mSimPaused = false; } //------------------------------------------------------ + void SimListener::simFlowChange(float newFlow) { + mSimTimeFlow = newFlow; + } + + //------------------------------------------------------ void SimListener::simStep(float simTime, float delta) { mSimTime = simTime; } @@ -70,7 +75,10 @@ /*----------------------------------------------------*/ /*-------------------- Sim Service -------------------*/ /*----------------------------------------------------*/ - SimService::SimService(ServiceManager *manager, const std::string& name) : Service(manager, name), mTimeCoeff(1), mSimTime(0), mPaused(false) { + SimService::SimService(ServiceManager *manager, const std::string& name) : Service(manager, name), + mTimeCoeff(1), + mSimTime(0), + mPaused(false) { } //------------------------------------------------------ @@ -84,11 +92,43 @@ //------------------------------------------------------ void SimService::loopStep(float deltaTime) { + SimListeners::iterator it; + + if (mStartStopReq.getIfReq(mSimRunning)) { + if (mSimRunning) + mSimTime = 0; + + it = mSimListeners.begin(); + while (it != mSimListeners.end()) { + if (mSimRunning) + (it++)->second->simStarted(); + else + (it++)->second->simEnded(); + } + } + + // has to happen here, otherwise half of the sim could get different scaling + if (mPauseChangeReq.getIfReq(mPaused)) { + it = mSimListeners.begin(); + while (it != mSimListeners.end()) { + if (mPaused) + (it++)->second->simPaused(); + else + (it++)->second->simUnPaused(); + } + } + + if (mFlowChangeReq.getIfReq(mTimeCoeff)) { + it = mSimListeners.begin(); + while (it != mSimListeners.end()) { + (it++)->second->simFlowChange(mTimeCoeff); + } + } + if (!mPaused && mSimRunning) { float delta = mTimeCoeff * deltaTime; - SimListeners::iterator it; - + it = mSimListeners.begin(); while (it != mSimListeners.end()) { (it++)->second->simStep(mSimTime, delta); } @@ -100,6 +140,19 @@ //------------------------------------------------------ void SimService::registerListener(SimListener* listener) { mSimListeners.insert(std::make_pair(listener->getPriority(), listener)); + + // to be sure + if (mSimRunning) + listener->simStarted(); + else + listener->simEnded(); + + if (mPaused) + listener->simPaused(); + else + listener->simUnPaused(); + + listener->simFlowChange(mTimeCoeff); } //------------------------------------------------------ @@ -121,13 +174,7 @@ if (mPaused || !mSimRunning) return; - SimListeners::iterator it; - - while (it != mSimListeners.end()) { - (it++)->second->simPaused(); - } - - mPaused = true; + mPauseChangeReq.set(true); } //------------------------------------------------------ @@ -135,13 +182,7 @@ if (!mPaused || !mSimRunning) return; - SimListeners::iterator it; - - while (it != mSimListeners.end()) { - (it++)->second->simUnPaused(); - } - - mPaused = false; + mPauseChangeReq.set(false); } //------------------------------------------------------ @@ -149,13 +190,7 @@ if (mSimRunning) return; - mSimTime = 0; - - SimListeners::iterator it; - - while (it != mSimListeners.end()) { - (it++)->second->simStarted(); - } + mStartStopReq.set(true); } //------------------------------------------------------ @@ -163,11 +198,13 @@ if (!mSimRunning) return; - SimListeners::iterator it; + mStartStopReq.set(false); + } - while (it != mSimListeners.end()) { - (it++)->second->simEnded(); - } + //------------------------------------------------------ + void SimService::setFlowCoeff(float flowCoeff) { + if (flowCoeff > 0) + mFlowChangeReq.set(flowCoeff); } Modified: trunk/src/services/sim/SimService.h =================================================================== --- trunk/src/services/sim/SimService.h 2009-01-03 12:57:16 UTC (rev 1082) +++ trunk/src/services/sim/SimService.h 2009-01-03 12:58:43 UTC (rev 1083) @@ -31,6 +31,7 @@ #include "OpdeService.h" #include "LoopService.h" #include "SharedPtr.h" +#include "ValueChangeRequest.h" namespace Opde { /** Abstract Simulation listener - a class that does something related to simulation extends this @@ -53,6 +54,9 @@ /** Called when the simulation is un-paused. Unsets mPaused */ virtual void simUnPaused(); + /** Called every time time flow change happens. */ + virtual void simFlowChange(float newFlow); + /** simulation time step happened * @param simTime the new sim time * @param delta the time increment that happened @@ -64,7 +68,8 @@ protected: float mSimTime; - bool mPaused; + float mSimTimeFlow; + bool mSimPaused; bool mSimRunning; }; @@ -129,6 +134,15 @@ /// Time flow coefficient - 1.0 means the sim time is 1:1 with real time. 0.5 means sim time flows 2 times slower than normal time float mTimeCoeff; + /// Request for new flow value + ValueChangeRequest<float> mFlowChangeReq; + + /// Request for Pause/UnPause + ValueChangeRequest<bool> mPauseChangeReq; + + // Request for Start/Stop + ValueChangeRequest<bool> mStartStopReq; + /// Sim time. Set to zero on simulation start float mSimTime; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |