Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Mar 21, 2008, 6:14:31 PM (16 years ago)
Author:
rgrieder
Message:
  • merged all changes in the input branch into this one
  • moved Tickable to core (would have created circular library dependencies)
  • exported OrxListener to a separate file, soon to be deleted
changed
, &&, XOR back to or, and, xor because I found the necessary include file for VC++
  • created abortRequest() in Orxonox.cc to call for a smooth end of the game (an alternative would be to make tick() return a boolean, like it is with frameStarted())
Location:
code/branches/network/src
Files:
2 added
3 deleted
18 edited
2 copied

Legend:

Unmodified
Added
Removed
  • code/branches/network/src/network/Client.h

    r888 r917  
    1616#include <string>
    1717
    18 #include "orxonox/objects/Tickable.h"
     18#include "core/Tickable.h"
    1919
    2020#include "NetworkPrereqs.h"
  • code/branches/network/src/network/Server.cc

    r912 r917  
    1313#include <iostream>
    1414
     15#include "util/Sleep.h"
    1516#include "ConnectionManager.h"
    1617#include "PacketTypes.h"
     
    112113    processQueue();
    113114    updateGamestate();
     115
    114116    sleep(1); // TODO remove
    115117    return;
  • code/branches/network/src/network/Server.h

    r888 r917  
    1616#include <string>
    1717
    18 #include "orxonox/objects/Tickable.h"
     18#include "core/Tickable.h"
    1919
    2020#include "PacketManager.h"
  • code/branches/network/src/orxonox/Orxonox.cc

    r905 r917  
    4444#include <OgreOverlay.h>
    4545#include <OgreOverlayManager.h>
     46#include <OgreTimer.h>
     47#include <OgreWindowEventUtilities.h>
    4648
    4749//****** OIS *******
     
    5658#include "util/Sleep.h"
    5759
    58 // loader and audio
    59 //#include "loader/LevelLoader.h"
     60// audio
    6061#include "audio/AudioManager.h"
    6162
     
    6970
    7071// objects
    71 #include "objects/Tickable.h"
    7272#include "tools/Timer.h"
    73 #include "objects/NPC.h"
     73#include "tools/OrxListener.h"
    7474#include "core/ArgReader.h"
     75#include "core/Debug.h"
    7576#include "core/Factory.h"
    76 #include "core/Debug.h"
    7777#include "core/Loader.h"
     78#include "core/Tickable.h"
    7879#include "hud/HUD.h"
    7980#include "objects/weapon/BulletManager.h"
     
    8485namespace orxonox
    8586{
    86    // put this in a seperate Class or solve the problem in another fashion
    87   class OrxListener : public Ogre::FrameListener
    88   {
    89     public:
    90       OrxListener(OIS::Keyboard *keyboard, audio::AudioManager*  auMan, gameMode mode)
    91       {
    92         mKeyboard = keyboard;
    93         mode_=mode;
    94         auMan_ = auMan;
    95       }
    96 
    97       bool frameStarted(const Ogre::FrameEvent& evt)
    98       {
    99         auMan_->update();
    100         updateAI();
    101 
    102 //         if(mode_ == SERVER)
    103 //           server_g->tick(evt.timeSinceLastFrame);
    104 //         else if(mode_ == CLIENT)
    105 //           client_g->tick(evt.timeSinceLastFrame);
    106 
    107         usleep(10);
    108 
    109         if(mode_!=CLIENT){
    110         mKeyboard->capture();
    111         return !mKeyboard->isKeyDown(OIS::KC_ESCAPE);
    112         }else
    113           return true;
    114       }
    115 
    116       void updateAI()
    117       {
    118         for(Iterator<NPC> it = ObjectList<NPC>::start(); it; ++it)
    119         {
    120           it->update();
    121         }
    122       }
    123 
    124     private:
    125       gameMode mode_;
    126       OIS::Keyboard *mKeyboard;
    127       audio::AudioManager*  auMan_;
    128   };
    129 
    130   // init static singleton reference of Orxonox
     87  /// init static singleton reference of Orxonox
    13188  Orxonox* Orxonox::singletonRef_ = NULL;
    13289
     
    13895    this->ogre_ = new GraphicsEngine();
    13996    this->dataPath_ = "";
    140 //    this->loader_ = 0;
    14197    this->auMan_ = 0;
    14298    this->singletonRef_ = 0;
     
    146102    this->frameListener_ = 0;
    147103    this->root_ = 0;
     104    // turn frame smoothing on by setting a value different from 0
     105    this->frameSmoothingTime_ = 0.0f;
     106    this->bAbort_ = false;
    148107  }
    149108
     
    159118   * initialization of Orxonox object
    160119   * @param argc argument counter
    161    * @param argv list of arguments
     120   * @param argv list of argumenst
    162121   * @param path path to config (in home dir or something)
    163122   */
     
    281240    //TODO: destroy and destruct everything and print nice error msg
    282241    delete this;
     242  }
     243
     244  /**
     245    Asks the mainloop nicely to abort.
     246  */
     247  void Orxonox::abortRequest()
     248  {
     249    bAbort_ = true;
    283250  }
    284251
     
    365332  }
    366333
    367   /**
    368    *
    369    * @param
    370    */
    371334  void Orxonox::createScene(void)
    372335  {
     
    383346
    384347    Ogre::Overlay* hudOverlay = Ogre::OverlayManager::getSingleton().getByName("Orxonox/HUD1.2");
    385     HUD* orxonoxHud;
    386     orxonoxHud = new HUD();
    387     orxonoxHud->setEnergyValue(20);
    388     orxonoxHud->setEnergyDistr(20,20,60);
     348    //HUD* orxonoxHud;
     349    orxonoxHUD_ = new HUD();
     350    orxonoxHUD_->setEnergyValue(20);
     351    orxonoxHUD_->setEnergyDistr(20,20,60);
    389352    hudOverlay->show();
    390353
     
    398361
    399362
    400   /**
    401    *
    402    */
    403363  void Orxonox::setupScene()
    404364  {
     
    451411  void Orxonox::createFrameListener()
    452412  {
    453     TickFrameListener* TickFL = new TickFrameListener();
    454     ogre_->getRoot()->addFrameListener(TickFL);
    455 
    456     TimerFrameListener* TimerFL = new TimerFrameListener();
    457     ogre_->getRoot()->addFrameListener(TimerFL);
    458 
    459     //if(mode_!=CLIENT) // FIXME just a hack ------- remove this in future
    460       frameListener_ = new OrxListener(keyboard_, auMan_, mode_);
    461     ogre_->getRoot()->addFrameListener(frameListener_);
     413    frameListener_ = new OrxListener(keyboard_, auMan_, mode_);
    462414  }
    463415
     
    477429      ms.height = height;
    478430    }
    479     ogre_->getRoot()->startRendering();
     431    mainLoop();
     432  }
     433
     434  /**
     435    Main loop of the orxonox game.
     436    This is a new solution, using the ogre engine instead of beeing used by it.
     437    An alternative solution would be to simply use the timer of the Root object,
     438    but that implies using Ogre in any case. There would be no way to test
     439    our code without the help of the root object.
     440    There's even a chance that we can dispose of the root object entirely
     441    in server mode.
     442    About the loop: The design is almost exactly like the one in ogre, so that
     443    if any part of ogre registers a framelisteners, it will still behave
     444    correctly. Furthermore I have taken over the time smoothing feature from
     445    ogre. If turned on (see orxonox constructor), it will calculate the dt_n by
     446    means of the recent most dt_n-1, dt_n-2, etc.
     447  */
     448  void Orxonox::mainLoop()
     449  {
     450    // use the ogre timer class to measure time.
     451    Ogre::Timer *timer = new Ogre::Timer();
     452    timer->reset();
     453
     454    // Contains the times of recently fired events
     455    std::deque<unsigned long> eventTimes[3];
     456    // Clear event times
     457    for (int i = 0; i < 3; ++i)
     458      eventTimes[i].clear();
     459
     460          while (!bAbort_)
     461          {
     462                  // Pump messages in all registered RenderWindows
     463      Ogre::WindowEventUtilities::messagePump();
     464
     465      // get current time
     466      unsigned long now = timer->getMilliseconds();
     467
     468      // create an event to pass to the frameStarted method in ogre
     469      Ogre::FrameEvent evt;
     470      evt.timeSinceLastEvent = calculateEventTime(now, eventTimes[0]);
     471      evt.timeSinceLastFrame = calculateEventTime(now, eventTimes[1]);
     472
     473      // show the current time in the HUD
     474      orxonoxHUD_->setTime((int)now, 0);
     475
     476      // don't forget to call _fireFrameStarted in ogre to make sure
     477      // everything goes smoothly
     478      if (!ogre_->getRoot()->_fireFrameStarted(evt))
     479        break;
     480
     481      // Iterate through all Tickables and call their tick(dt) function
     482      for (Iterator<Tickable> it = ObjectList<Tickable>::start(); it; )
     483        (it++)->tick((float)evt.timeSinceLastFrame);
     484
     485      if (mode_ != SERVER)
     486      {
     487        // only render in non-server mode
     488        ogre_->getRoot()->_updateAllRenderTargets();
     489      }
     490
     491      // get current time
     492      now = timer->getMilliseconds();
     493
     494      // create an event to pass to the frameEnded method in ogre
     495      evt.timeSinceLastEvent = calculateEventTime(now, eventTimes[0]);
     496      evt.timeSinceLastFrame = calculateEventTime(now, eventTimes[2]);
     497
     498      // again, just to be sure ogre works fine
     499      if (!ogre_->getRoot()->_fireFrameEnded(evt))
     500        break;
     501          }
     502  }
     503
     504  /**
     505    Method for calculating the average time between recently fired events.
     506    Code directly taken from OgreRoot.cc
     507    @param now The current time in ms.
     508    @param type The type of event to be considered.
     509  */
     510  float Orxonox::calculateEventTime(unsigned long now, std::deque<unsigned long> &times)
     511  {
     512    // Calculate the average time passed between events of the given type
     513    // during the last mFrameSmoothingTime seconds.
     514
     515    times.push_back(now);
     516
     517    if(times.size() == 1)
     518      return 0;
     519
     520    // Times up to mFrameSmoothingTime seconds old should be kept
     521    unsigned long discardThreshold =
     522      static_cast<unsigned long>(frameSmoothingTime_ * 1000.0f);
     523
     524    // Find the oldest time to keep
     525    std::deque<unsigned long>::iterator it = times.begin(),
     526      end = times.end()-2; // We need at least two times
     527    while(it != end)
     528    {
     529      if (now - *it > discardThreshold)
     530        ++it;
     531      else
     532        break;
     533    }
     534
     535    // Remove old times
     536    times.erase(times.begin(), it);
     537
     538    return (float)(times.back() - times.front()) / ((times.size()-1) * 1000);
    480539  }
    481540}
  • code/branches/network/src/orxonox/Orxonox.h

    r888 r917  
    99
    1010#include <string>
     11#include <deque>
    1112
    1213#include <OgrePrerequisites.h>
     
    3738      // not sure if this should be private
    3839      void die(/* some error code */);
     40      void abortRequest();
    3941      static Orxonox* getSingleton();
    4042      inline Ogre::SceneManager* getSceneManager()         { return ogre_->getSceneManager(); };
     
    6567      void createFrameListener();
    6668      void startRenderLoop();
     69      void mainLoop();
     70      void updateTimers(float);
     71      float calculateEventTime(unsigned long, std::deque<unsigned long>&);
    6772
    6873    private:
     
    7883      OrxListener*          frameListener_;
    7984      Ogre::Root*           root_;
     85      // TODO: make this a config-value by creating a config class for orxonox
     86      float                 frameSmoothingTime_;
     87      // little hack to actually show something dynamic in the HUD
     88      HUD*                  orxonoxHUD_;
     89      bool                  bAbort_;
    8090
    8191      // this is used to identify the mode (server/client/...) we're in
  • code/branches/network/src/orxonox/OrxonoxPlatform.h

    r790 r917  
    210210//#   pragma warning (disable : 4503)
    211211
    212 // disable: "conversion from 'double' to 'float', possible loss of data
     212// disable: conversion from 'double' to 'float', possible loss of data
     213// disable: conversion from 'ogg_int64_t' to 'long', possible loss of data
     214// This has been dealt with in base_properties of the solution since the
     215// warning primarily occurs in library header files (which are mostly
     216// included before OrxonoxPlatform.h is)
    213217//#   pragma warning (disable : 4244)
    214218
     
    221225// disable: "<type> needs to have dll-interface to be used by clients'
    222226// Happens on STL member variables which are not public therefore is ok
     227// This has been dealt with in base_properties of the solution since the
     228// warning primarily occurs in library header files (which are mostly
     229// included before OrxonoxPlatform.h is)
    223230//#   pragma warning (disable : 4251)
     231
     232// disable: 'MultiTypeString' : multiple assignment operators specified
     233// Used in MultiType and works fine so far
     234#   pragma warning (disable : 4522)
    224235
    225236// disable: "non dll-interface class used as base for dll-interface class"
     
    251262#endif
    252263
     264
     265// Define the english written operators like and, or, xor
     266#if ORXONOX_COMPILER == ORXONOX_COMPILER_MSVC
     267#  include <iso646.h>
     268#endif
     269
    253270} /* namespace orxonox */
    254271
  • code/branches/network/src/orxonox/OrxonoxStableHeaders.h

    r871 r917  
    7373//#include "audio/AudioManager.h"
    7474
    75 //#include "core/CoreIncludes.h"
     75#include "core/CoreIncludes.h"
    7676#include "core/BaseObject.h"
    7777//#include "core/ArgReader.h"
    7878#include "core/Error.h"
     79#include "core/Loader.h"
     80#include "core/XMLPort.h"
     81#include "core/Tickable.h"
    7982
    8083#include "network/Synchronisable.h"
     
    8790#include "util/String2Number.h"
    8891#include "util/Tokenizer.h"
     92#include "util/Multitype.h"
     93#include "util/MultiTypeMath.h"
     94#include "util/MultiTypePrimitive.h"
     95#include "util/MultiTypeString.h"
     96#include "util/substring.h"
     97#include "util/XMLIncludes.h"
     98
    8999#include "util/tinyxml/ticpp.h"
    90100#include "util/tinyxml/tinyxml.h"
     
    106116//#include "objects/Skybox.h"
    107117//#include "objects/SpaceShipSteeringObject.h"
    108 #include "objects/Tickable.h"
    109118#include "objects/WorldEntity.h"
    110119//#include "particle/ParticleInterface.h"
  • code/branches/network/src/orxonox/core/Identifier.h

    r871 r917  
    206206    };
    207207
    208     std::ostream& operator<<(std::ostream& out, const std::list<const Identifier*>& list);
     208    _CoreExport std::ostream& operator<<(std::ostream& out, const std::list<const Identifier*>& list);
    209209
    210210
  • code/branches/network/src/orxonox/objects/WorldEntity.h

    r871 r917  
    1212//#include "util/tinyxml/tinyxml.h"
    1313#include "core/BaseObject.h"
    14 #include "Tickable.h"
     14#include "core/Tickable.h"
    1515#include "../tools/Mesh.h"
    1616
  • code/branches/network/src/orxonox/objects/weapon/BulletManager.h

    r871 r917  
    3939#include "util/tinyxml/tinyxml.h"
    4040#include "core/BaseObject.h"
    41 #include "../Tickable.h"
     41#include "core/Tickable.h"
    4242
    4343namespace orxonox {
  • code/branches/network/src/orxonox/tools/OrxListener.cc

    r916 r917  
    3131#include "objects/NPC.h"
    3232#include "audio/AudioManager.h"
     33#include "Orxonox.h"
    3334#include "OrxListener.h"
    3435
    3536namespace orxonox
    3637{
    37   OrxListener::OrxListener(audio::AudioManager*  auMan, gameMode mode)
     38  OrxListener::OrxListener(OIS::Keyboard *keyboard, audio::AudioManager*  auMan, gameMode mode)
    3839  {
     40    keyboard_ = keyboard;
    3941    mode_=mode;
    4042    auMan_ = auMan;
     
    4547    auMan_->update();
    4648    updateAI();
     49
     50    keyboard_->capture();
     51    if (keyboard_->isKeyDown(OIS::KC_ESCAPE))
     52      Orxonox::getSingleton()->abortRequest();
    4753  }
    4854
  • code/branches/network/src/orxonox/tools/OrxListener.h

    r916 r917  
    3434#define _OrxListener_H__
    3535
     36#include <OIS/OISPrereqs.h>
     37
    3638#include "../OrxonoxPrereqs.h"
    3739#include "audio/AudioPrereqs.h"
    3840#include "Orxonox.h"
    39 #include "objects/Tickable.h"
     41#include "core/Tickable.h"
    4042
    4143namespace orxonox
     
    4446  {
    4547    public:
    46       OrxListener(audio::AudioManager*  auMan, gameMode mode);
     48      OrxListener(OIS::Keyboard *keyboard, audio::AudioManager*  auMan, gameMode mode);
    4749
    4850      void tick(float dt);
     
    5254      gameMode mode_;
    5355      audio::AudioManager* auMan_;
     56      OIS::Keyboard *keyboard_;
    5457  };
    5558}
  • code/branches/network/src/orxonox/tools/Timer.cc

    r871 r917  
     1/*
     2 *   ORXONOX - the hottest 3D action shooter ever to exist
     3 *
     4 *
     5 *   License notice:
     6 *
     7 *   This program is free software; you can redistribute it and/or
     8 *   modify it under the terms of the GNU General Public License
     9 *   as published by the Free Software Foundation; either version 2
     10 *   of the License, or (at your option) any later version.
     11 *
     12 *   This program is distributed in the hope that it will be useful,
     13 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 *   GNU General Public License for more details.
     16 *
     17 *   You should have received a copy of the GNU General Public License
     18 *   along with this program; if not, write to the Free Software
     19 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
     20 *
     21 *   Author:
     22 *      Fabian 'x3n' Landau
     23 *   Co-authors:
     24 *      ...
     25 *
     26 */
     27
     28#include "OrxonoxStableHeaders.h"
     29
    130#include "core/CoreIncludes.h"
    231#include "Timer.h"
     
    1746        this->time_ = 0;
    1847    }
     48
     49    /**
     50        @brief Updates the timer before the frames are rendered.
     51    */
     52    void TimerBase::tick(float dt)
     53    {
     54        if (this->bActive_)
     55        {
     56            // If active: Decrease the timer by the duration of the last frame
     57            this->time_ -= dt;
     58
     59            if (this->time_ <= 0)
     60            {
     61                // It's time to call the function
     62                if (this->bLoop_)
     63                    // Q: Why '+=' and not '='? A: Think about it. It's more accurate like that. Seriously.
     64                    this->time_ += this->interval_;
     65                else
     66                    this->stopTimer(); // Stop the timer if we don't want to loop
     67
     68                this->run();
     69            }
     70        }
     71    }
     72
    1973}
  • code/branches/network/src/orxonox/tools/Timer.h

    r871 r917  
    5858#define _Timer_H__
    5959
    60 #include <OgreFrameListener.h>
    6160#include "../OrxonoxPrereqs.h"
     61#include "core/Tickable.h"
    6262
    6363namespace orxonox
    6464{
    6565    //! TimerBase is the parent of the Timer class.
    66     class _OrxonoxExport TimerBase : public OrxonoxClass
     66    class _OrxonoxExport TimerBase : public Tickable
    6767    {
    68         friend class TimerFrameListener;
    69 
    7068        public:
    7169            TimerBase();
     
    8381            /** @brief Returns true if the Timer is active (= not stoped, not paused). @return True = Time is active */
    8482            inline bool isActive() const { return this->bActive_; }
     83
     84            void tick(float dt);
    8585
    8686        protected:
     
    145145    };
    146146
    147     //! The TimerFrameListener manages all Timers in the game.
    148     class TimerFrameListener : public Ogre::FrameListener
    149     {
    150         private:
    151             /** @brief Gets called before a frame gets rendered. */
    152             bool frameStarted(const Ogre::FrameEvent &evt)
    153             {
    154                 // Iterate through all Timers
    155                 for (Iterator<TimerBase> it = ObjectList<TimerBase>::start(); it; )
    156                 {
    157                     if (it->isActive())
    158                     {
    159                         // If active: Decrease the timer by the duration of the last frame
    160                         it->time_ -= evt.timeSinceLastFrame;
    161 
    162                         if (it->time_ <= 0)
    163                         {
    164                             // It's time to call the function
    165                             if (it->bLoop_)
    166                                 it->time_ += it->interval_; // Q: Why '+=' and not '='? A: Think about it. It's more accurate like that. Seriously.
    167                             else
    168                                 it->stopTimer(); // Stop the timer if we don't want to loop
    169 
    170                             (it++)->run();
    171                         }
    172                         else
    173                             ++it;
    174                     }
    175                     else
    176                         ++it;
    177                 }
    178 
    179                 return FrameListener::frameStarted(evt);
    180             }
    181     };
    182147}
    183148
  • code/branches/network/src/util/Math.h

    r871 r917  
    147147
    148148#endif /* _Math_H__ */
     149
  • code/branches/network/src/util/MultiTypeMath.h

    r871 r917  
    153153};
    154154
    155 std::ostream& operator<<(std::ostream& out, MultiTypeMath& mtm);
     155_UtilExport std::ostream& operator<<(std::ostream& out, MultiTypeMath& mtm);
    156156
    157157#endif /* _MultiTypeMath_H__ */
  • code/branches/network/src/util/MultiTypePrimitive.h

    r871 r917  
    175175};
    176176
    177 std::ostream& operator<<(std::ostream& out, const MultiTypePrimitive& mtp);
     177_UtilExport std::ostream& operator<<(std::ostream& out, const MultiTypePrimitive& mtp);
    178178
    179179#endif /* _MultiTypePrimitive_H__ */
  • code/branches/network/src/util/MultiTypeString.h

    r871 r917  
    109109};
    110110
    111 std::ostream& operator<<(std::ostream& out, MultiTypeString& mts);
     111_UtilExport std::ostream& operator<<(std::ostream& out, MultiTypeString& mts);
    112112
    113113#endif /* _MultiTypeString_H__ */
  • code/branches/network/src/util/Sleep.h

    r790 r917  
    1 // hack for the usleep/Sleep problem
    2 #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
     1/*
     2 *   ORXONOX - the hottest 3D action shooter ever to exist
     3 *
     4 *
     5 *   License notice:
     6 *
     7 *   This program is free software; you can redistribute it and/or
     8 *   modify it under the terms of the GNU General Public License
     9 *   as published by the Free Software Foundation; either version 2
     10 *   of the License, or (at your option) any later version.
     11 *
     12 *   This program is distributed in the hope that it will be useful,
     13 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 *   GNU General Public License for more details.
     16 *
     17 *   You should have received a copy of the GNU General Public License
     18 *   along with this program; if not, write to the Free Software
     19 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
     20 *
     21 *   Author:
     22 *      Reto Grieder
     23 *   Co-authors:
     24 *      ...
     25 *
     26 */
     27
     28/**
     29 @file  Sleep.h
     30 @brief Macros for using sleep() and usleep() under windows
     31 */
     32
     33#include "OrxonoxPlatform.h"
     34
     35#if ORXONOX_PLATFORM == ORXONOX_PLATFORM_WIN32
    336#  include <windows.h>
    4 #  define usleep(x) Sleep((x)/1000)
     37#  define usleep(x) Sleep((x) / 1000)
     38#  define msleep(x) Sleep(x)
     39#  define  sleep(x) Sleep((x) * 1000)
    540#else
    641#  include <unistd.h>
     42#  define msleep(x) uleep((x) * 1000)
    743#endif
  • code/branches/network/src/util/XMLIncludes.h

    r871 r917  
    1 #include "util/tinyxml/TinyXMLPrereqs.h"
     1//-----------------------------------------------------------------------
     2// Forward declarations
     3//-----------------------------------------------------------------------
     4
     5class TiXmlString;
     6class TiXmlOutStream;
     7class TiXmlNode;
     8class TiXmlHandle;
     9class TiXmlDocument;
     10class TiXmlElement;
     11class TiXmlComment;
     12class TiXmlUnknown;
     13class TiXmlAttribute;
     14class TiXmlText;
     15class TiXmlDeclaration;
     16class TiXmlParsingData;
     17
     18namespace ticpp
     19{
     20    class Document;
     21    class Element;
     22    class Declaration;
     23    class StylesheetReference;
     24    class Text;
     25    class Comment;
     26    class Attribute;
     27}
    228
    329namespace orxonox
Note: See TracChangeset for help on using the changeset viewer.