From: <vo...@us...> - 2008-01-02 21:39:51
|
Revision: 524 http://opde.svn.sourceforge.net/opde/?rev=524&view=rev Author: volca Date: 2008-01-02 13:39:56 -0800 (Wed, 02 Jan 2008) Log Message: ----------- Added a must-have function to set loop mode by name (woo hoo), and rewritten a bit to at-least make it run. It didn't before, to be honest :) Modified Paths: -------------- trunk/src/services/loop/LoopService.cpp trunk/src/services/loop/LoopService.h Modified: trunk/src/services/loop/LoopService.cpp =================================================================== --- trunk/src/services/loop/LoopService.cpp 2008-01-02 21:38:41 UTC (rev 523) +++ trunk/src/services/loop/LoopService.cpp 2008-01-02 21:39:56 UTC (rev 524) @@ -114,7 +114,7 @@ /*-------------------- LoopService -------------------*/ /*----------------------------------------------------*/ LoopService::LoopService(ServiceManager *manager, const std::string& name) : Service(manager, name), - mTerminationRequested(false), mNewLoopModeID(0), mLastFrameTime(0), mNewModeRequested(false) { + mTerminationRequested(false), mNewLoopMode(NULL), mLastFrameTime(0), mNewModeRequested(false) { mActiveMode.setNull(); } @@ -137,16 +137,24 @@ LOG_DEBUG("LoopService::createLoopMode: Creating new loop mode '%s'", modeDef.name.c_str()); // First, look if the ID is not already reserved - LoopModeMap::const_iterator it = mLoopModes.find(modeDef.id); + LoopModeIDMap::const_iterator it = mLoopModes.find(modeDef.id); if (it != mLoopModes.end()) { - LOG_ERROR("LoopService::createLoopMode: Loop mode ID %llX already reserved by '%s'", it->second->getLoopModeName().c_str()); + LOG_ERROR("LoopService::createLoopMode: Loop mode ID %llX already reserved by '%s'", modeDef.id, it->second->getLoopModeName().c_str()); return; } + LoopModeNameMap::const_iterator it1 = mLoopNamedModes.find(modeDef.name); + + if (it1 != mLoopNamedModes.end()) { + LOG_ERROR("LoopService::createLoopMode: Loop mode name %s already reserved by '%s'", modeDef.name, it->second->getLoopModeName().c_str()); + return; + } + LoopModePtr mode = new LoopMode(modeDef, this); - mLoopModes.insert(make_pair(modeDef.id, mode)); + mLoopModes[modeDef.id] = mode; + mLoopNamedModes[modeDef.name] = mode; // Loop mode created... } @@ -154,7 +162,7 @@ //------------------------------------------------------ void LoopService::addLoopClient(LoopClient* client) { // iterate through the loop modes. If the mask complies, add the client - LoopModeMap::const_iterator it = mLoopModes.begin(); + LoopModeIDMap::const_iterator it = mLoopModes.begin(); while( it != mLoopModes.end()) { if (it->second->getLoopMask() & client->getLoopMask()) { @@ -168,7 +176,7 @@ //------------------------------------------------------ void LoopService::removeLoopClient(LoopClient* client) { // iterate through the loop modes. If the mask complies, add the client - LoopModeMap::const_iterator it = mLoopModes.begin(); + LoopModeIDMap::const_iterator it = mLoopModes.begin(); while( it != mLoopModes.end()) { // The worst thing that could happen is that there was no client in that loop @@ -178,15 +186,35 @@ it++; } } + //------------------------------------------------------ - void LoopService::requestLoopMode(LoopModeID newLoopMode) { - mNewLoopModeID = newLoopMode; - mNewModeRequested = true; + bool LoopService::requestLoopMode(LoopModeID newLoopMode) { + LoopModeIDMap::const_iterator it = mLoopModes.find(newLoopMode); + + if (it != mLoopModes.end()) { + mNewLoopMode = it->second; + mNewModeRequested = true; + return true; + } else { + return false; + } } - - + //------------------------------------------------------ + bool LoopService::requestLoopMode(const std::string& name) { + LoopModeNameMap::const_iterator it = mLoopNamedModes.find(name); + + if (it != mLoopNamedModes.end()) { + mNewLoopMode = it->second; + mNewModeRequested = true; + return true; + } else { + return false; + } + } + + //------------------------------------------------------ void LoopService::requestTermination() { LOG_DEBUG("LoopService: Termination was requested!"); mTerminationRequested = true; @@ -197,6 +225,12 @@ void LoopService::run() { float deltaTime = 0.0; + if (mNewModeRequested) { // See if there is a loop mode pending... + mNewModeRequested = false; + setLoopMode(mNewLoopMode); + mActiveMode->loopModeStarted(); + } + if (mActiveMode.isNull()) { LOG_FATAL("LoopService::run: No loop mode set prior to run(). Terminating"); return; @@ -221,14 +255,16 @@ mNewModeRequested = false; mActiveMode->loopModeEnded(); - // Search for the new loop mode. If not found, log fatal, terminate - if (!setLoopMode(mNewLoopModeID)) { - LOG_FATAL("LoopService::run: The new requested loop mode (%llX) is invalid. Terminating", mNewLoopModeID); + if (!mNewLoopMode.isNull()) { + setLoopMode(mNewLoopMode); + } else { + LOG_FATAL("LoopService::run: The new requested loop mode is invalid (NULL mode pointer encountered). Terminating"); mTerminationRequested = true; - } else { - mActiveMode->loopModeStarted(); } + + // Signalize the start of the loop + mActiveMode->loopModeStarted(); } if (debugFrame) { @@ -245,15 +281,8 @@ } //------------------------------------------------------ - bool LoopService::setLoopMode(LoopModeID newModeID) { - LoopModeMap::const_iterator it = mLoopModes.find(newModeID); - - if (it != mLoopModes.end()) { - mActiveMode = it->second; - return true; - } else { - return false; - } + void LoopService::setLoopMode(LoopModePtr newMode) { + mActiveMode = mNewLoopMode; } //------------------------------------------------------ Modified: trunk/src/services/loop/LoopService.h =================================================================== --- trunk/src/services/loop/LoopService.h 2008-01-02 21:38:41 UTC (rev 523) +++ trunk/src/services/loop/LoopService.h 2008-01-02 21:39:56 UTC (rev 524) @@ -197,9 +197,16 @@ /** Requests a transition to a new loop mode * @param newLoopMode The new loop mode to be used. If the loop mode is invalid, the loop service's run() method will terminate + * @return true if the loop mode was found and request was queued, false otherwise */ - void requestLoopMode(LoopModeID newLoopMode); + bool requestLoopMode(LoopModeID newLoopMode); + /** Requests a transition to a new loop mode + * @param newLoopMode The new loop mode to be used. If the loop mode is invalid, the loop service's run() method will terminate + * @return true if the loop mode was found and request was queued, false otherwise + */ + bool requestLoopMode(const std::string& name); + /// Requests the termination of the loop (program exit) void requestTermination(); @@ -217,15 +224,14 @@ bool init(); /** sets a new loop mode - * @returns true on success (new loop mode was found, the mActiveMode was set), false if the loop mode with the given ID was not found */ - bool setLoopMode(LoopModeID newModeID); + void setLoopMode(LoopModePtr newMode); /// Termination was requested bool mTerminationRequested; /// The new requested loop mode (if the mNewModeRequested is true) - LoopModeID mNewLoopModeID; + LoopModePtr mNewLoopMode; /// True if something requested a change in the loop mode bool mNewModeRequested; @@ -233,10 +239,13 @@ /// The active loop mode LoopModePtr mActiveMode; - typedef std::map<LoopModeID, LoopModePtr > LoopModeMap; + typedef std::map<LoopModeID, LoopModePtr > LoopModeIDMap; + typedef std::map<std::string, LoopModePtr > LoopModeNameMap; - /// Loop mode map - LoopModeMap mLoopModes; + /// Loop mode map - per ID + LoopModeIDMap mLoopModes; + /// Loop mode map - per Name + LoopModeNameMap mLoopNamedModes; /// Ogre::Root for timing purposes Ogre::Root* mRoot; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |