Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
May 30, 2008, 3:02:03 PM (16 years ago)
Author:
rgrieder
Message:
  • fixed the InputBufferListener bug in a proper way It looks a little bit ugly, but at least it's got a new feature: You don't need to derive from InputBufferListener (removed it)
  • commented the shader hack in Model.cc
Location:
code/branches/network/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • code/branches/network/src/core/InputBuffer.cc

    r1446 r1486  
    8888    }
    8989
    90     void InputBuffer::unregisterListener(InputBufferListener* listener)
    91     {
    92         for (std::list<InputBufferListenerTuple>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); )
    93         {
    94             if ((*it).listener_ == listener)
    95                 this->listeners_.erase(it++);
    96             else
    97                 ++it;
    98         }
    99     }
    100 
    10190    void InputBuffer::set(const std::string& input, bool update)
    10291    {
     
    165154    void InputBuffer::updated()
    166155    {
    167         for (std::list<InputBufferListenerTuple>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); ++it)
    168         {
    169             if ((*it).bListenToAllChanges_)
    170                 (*(*it).listener_.*(*it).function_)();
     156        for (std::list<BaseInputBufferListenerTuple*>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); ++it)
     157        {
     158            if ((*it)->bListenToAllChanges_)
     159                (*it)->callFunction();
    171160        }
    172161    }
     
    174163    void InputBuffer::updated(const char& update, bool bSingleInput)
    175164    {
    176         for (std::list<InputBufferListenerTuple>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); ++it)
    177         {
    178             if ((!(*it).trueKeyFalseChar_) && ((*it).bListenToAllChanges_ || ((*it).char_ == update)) && (!(*it).bOnlySingleInput_ || bSingleInput))
    179                 (*(*it).listener_.*(*it).function_)();
     165        for (std::list<BaseInputBufferListenerTuple*>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); ++it)
     166        {
     167            if ((!(*it)->trueKeyFalseChar_) && ((*it)->bListenToAllChanges_ || ((*it)->char_ == update)) && (!(*it)->bOnlySingleInput_ || bSingleInput))
     168                (*it)->callFunction();
    180169        }
    181170    }
     
    195184            return;
    196185
    197         for (std::list<InputBufferListenerTuple>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); ++it)
    198         {
    199             if ((*it).trueKeyFalseChar_ && ((*it).key_ == evt.key))
    200                 (*(*it).listener_.*(*it).function_)();
     186        for (std::list<BaseInputBufferListenerTuple*>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); ++it)
     187        {
     188            if ((*it)->trueKeyFalseChar_ && ((*it)->key_ == evt.key))
     189                (*it)->callFunction();
    201190        }
    202191
  • code/branches/network/src/core/InputBuffer.h

    r1461 r1486  
    4040namespace orxonox
    4141{
    42     class _CoreExport InputBufferListener
    43     {};
     42    class BaseInputBufferListenerTuple
     43    {
     44    public:
     45        BaseInputBufferListenerTuple(bool bListenToAllChanges, bool bOnlySingleInput,
     46            bool trueKeyFalseChar, char _char, KeyCode::Enum key)
     47            : bListenToAllChanges_(bListenToAllChanges), bOnlySingleInput_(bOnlySingleInput),
     48              trueKeyFalseChar_(trueKeyFalseChar), char_(_char), key_(key)
     49        { }
     50        virtual void callFunction() = 0;
     51        bool bListenToAllChanges_;
     52        bool bOnlySingleInput_;
     53        bool trueKeyFalseChar_;
     54        char char_;
     55        KeyCode::Enum key_;
     56    };
     57
     58    template <class T>
     59    class InputBufferListenerTuple : public BaseInputBufferListenerTuple
     60    {
     61    public:
     62        InputBufferListenerTuple(T* listener, void (T::*function)(), bool bListenToAllChanges,
     63            bool bOnlySingleInput, bool trueKeyFalseChar, char _char, KeyCode::Enum key)
     64            : BaseInputBufferListenerTuple(bListenToAllChanges, bOnlySingleInput, trueKeyFalseChar, _char, key),
     65              listener_(listener), function_(function)
     66        { }
     67        void InputBufferListenerTuple::callFunction()
     68        {
     69            (listener_->*function_)();
     70        }
     71        T* listener_;
     72        void (T::*function_)();
     73    };
    4474
    4575    class _CoreExport InputBuffer : public KeyHandler, public OrxonoxClass
    4676    {
    47         struct InputBufferListenerTuple
    48         {
    49             InputBufferListener* listener_;
    50             void (InputBufferListener::*function_)();
    51             bool bListenToAllChanges_;
    52             bool bOnlySingleInput_;
    53             bool trueKeyFalseChar_;
    54             char char_;
    55             KeyCode::Enum key_;
    56         };
    57 
    5877        public:
    5978            InputBuffer();
     
    6584            void registerListener(T* listener, void (T::*function)(), bool bOnlySingleInput)
    6685            {
    67                 struct InputBufferListenerTuple newListener = {listener, (void (InputBufferListener::*)())function, true, bOnlySingleInput, false, '\0', KeyCode::Unassigned};
    68                 // TODO: this is a major hack!!!
    69                 // Fix it properly
    70                 *((int*)(&newListener.listener_)) = (int)(listener);
    71 
    72                 this->listeners_.insert(this->listeners_.end(), newListener);
     86                InputBufferListenerTuple<T>* newTuple = new InputBufferListenerTuple<T>(listener, (void (T::*)())function, true, bOnlySingleInput, false, '\0', KeyCode::Unassigned);
     87                this->listeners_.insert(this->listeners_.end(), newTuple);
    7388            }
    7489            template <class T>
    7590            void registerListener(T* listener, void (T::*function)() const, bool bOnlySingleInput)
    7691            {
    77                 struct InputBufferListenerTuple newListener = {listener, (void (InputBufferListener::*)())function, true, bOnlySingleInput, false, '\0', KeyCode::Unassigned};
    78                 *((int*)(&newListener.listener_)) = (int)(listener);
    79                 this->listeners_.insert(this->listeners_.end(), newListener);
     92                InputBufferListenerTuple<T>* newTuple = new InputBufferListenerTuple<T>(listener, (void (T::*)())function, true, bOnlySingleInput, false, '\0', KeyCode::Unassigned);
     93                this->listeners_.insert(this->listeners_.end(), newTuple);
    8094            }
    81 
    8295            template <class T>
    8396            void registerListener(T* listener, void (T::*function)(), char _char, bool bOnlySingleInput)
    8497            {
    85                 struct InputBufferListenerTuple newListener = {listener, (void (InputBufferListener::*)())function, false, bOnlySingleInput, false, _char, KeyCode::Unassigned};
    86                 *((int*)(&newListener.listener_)) = (int)(listener);
    87                 this->listeners_.insert(this->listeners_.end(), newListener);
     98                InputBufferListenerTuple<T>* newTuple = new InputBufferListenerTuple<T>(listener, (void (T::*)())function, false, bOnlySingleInput, false, _char, KeyCode::Unassigned);
     99                this->listeners_.insert(this->listeners_.end(), newTuple);
    88100            }
    89101            template <class T>
    90102            void registerListener(T* listener, void (T::*function)() const, char _char, bool bOnlySingleInput)
    91103            {
    92                 struct InputBufferListenerTuple newListener = {listener, (void (InputBufferListener::*)())function, false, bOnlySingleInput, false, _char, KeyCode::Unassigned};
    93                 *((int*)(&newListener.listener_)) = (int)(listener);
    94                 this->listeners_.insert(this->listeners_.end(), newListener);
     104                InputBufferListenerTuple<T>* newTuple = new InputBufferListenerTuple<T>(listener, (void (T::*)())function, false, bOnlySingleInput, false, _char, KeyCode::Unassigned);
     105                this->listeners_.insert(this->listeners_.end(), newTuple);
    95106            }
    96107
     
    98109            void registerListener(T* listener, void (T::*function)(), KeyCode::Enum key)
    99110            {
    100                 struct InputBufferListenerTuple newListener = {listener, (void (InputBufferListener::*)())function, false, true, true, '\0', key};
    101                 *((int*)(&newListener.listener_)) = (int)(listener);
    102                 this->listeners_.insert(this->listeners_.end(), newListener);
     111                InputBufferListenerTuple<T>* newTuple = new InputBufferListenerTuple<T>(listener, (void (T::*)())function, false, true, true, '\0', key);
     112                this->listeners_.insert(this->listeners_.end(), newTuple);
    103113            }
    104114            template <class T>
    105115            void registerListener(T* listener, void (T::*function)() const, KeyCode::Enum key)
    106116            {
    107                 struct InputBufferListenerTuple newListener = {listener, (void (InputBufferListener::*)())function, false, true, true, '\0', key};
    108                 *((int*)(&newListener.listener_)) = (int)(listener);
    109                 this->listeners_.insert(this->listeners_.end(), newListener);
     117                InputBufferListenerTuple<T>* newTuple = new InputBufferListenerTuple<T>(listener, (void (T::*)())function, false, true, true, '\0', key);
     118                this->listeners_.insert(this->listeners_.end(), newTuple);
    110119            }
    111120
    112             void unregisterListener(InputBufferListener* listener);
     121            template <class T>
     122            void unregisterListener(T* listener)
     123            {
     124                for (std::list<BaseInputBufferListenerTuple*>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); )
     125                {
     126                    InputBufferListenerTuple<T>* refListener = dynamic_cast<InputBufferListenerTuple<T>*>(*it);
     127                    if (refListener && refListener->listener_ == listener)
     128                        this->listeners_.erase(it++);
     129                    else
     130                        it++;
     131                }
     132            }
    113133
    114134            void set(const std::string& input, bool update = true);
     
    151171
    152172            std::string buffer_;
    153             std::list<InputBufferListenerTuple> listeners_;
     173            std::list<BaseInputBufferListenerTuple*> listeners_;
    154174            std::string allowedChars_;
    155175            unsigned int cursor_;
  • code/branches/network/src/core/Shell.h

    r1446 r1486  
    5757    };
    5858
    59     class _CoreExport Shell : virtual public OrxonoxClass, public InputBufferListener, public OutputBufferListener
     59    class _CoreExport Shell : virtual public OrxonoxClass, public OutputBufferListener
    6060    {
    6161        public:
  • code/branches/network/src/orxonox/GraphicsEngine.cc

    r1477 r1486  
    149149#endif
    150150
    151 /*    // create a logManager
     151// TODO: LogManager doesn't work on specific systems. The why is unknown yet.
     152#if ORXONOX_PLATFORM == ORXONOX_PLATFORM_WIN32
     153    // create a logManager
    152154    // note: If there's already a logManager, Ogre will complain by a failed assertation.
    153155    // but that shouldn't happen, since this is the first time to create a logManager..
     
    164166
    165167    myLog->setLogDetail(Ogre::LL_BOREME);
    166     myLog->addListener(this);*/
     168    myLog->addListener(this);
     169#endif
    167170
    168171    // Root will detect that we've already created a Log
  • code/branches/network/src/orxonox/objects/Model.cc

    r1466 r1486  
    8585
    8686        //HACK!!
    87         if ((this->meshSrc_ == "assff.mesh") || (this->meshSrc_ == "ast1.mesh") || (this->meshSrc_ == "ast2.mesh") || (this->meshSrc_ == "ast3.mesh") || (this->meshSrc_ == "ast4.mesh") ||(this->meshSrc_ == "ast5.mesh") || (this->meshSrc_ == "ast6.mesh"))
     87        /*if ((this->meshSrc_ == "assff.mesh") || (this->meshSrc_ == "ast1.mesh") || (this->meshSrc_ == "ast2.mesh") || (this->meshSrc_ == "ast3.mesh") || (this->meshSrc_ == "ast4.mesh") ||(this->meshSrc_ == "ast5.mesh") || (this->meshSrc_ == "ast6.mesh"))
    8888        {
    8989          Ogre::MeshPtr pMesh = this->mesh_.getEntity()->getMesh();
     
    104104
    105105
    106         }
     106        }*/
    107107        COUT(4) << "Loader (Model.cc): Created model" << std::endl;
    108108      }
Note: See TracChangeset for help on using the changeset viewer.