Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/buildsystem2/src/orxonox/gamestates/GSRoot.cc @ 2643

Last change on this file since 2643 was 2639, checked in by rgrieder, 16 years ago

Cleanup in OrxonoxConfig.h.in. Made use of various CMake features like CheckInclude or CheckCompiles to determine some options and macros in the config header file.

Also removed util/Integers.h and placed the code directory in OrxonoxConfig.h.in.

  • Property svn:eol-style set to native
File size: 5.8 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Reto Grieder
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "OrxonoxStableHeaders.h"
30#include "GSRoot.h"
31
32#include "util/Exception.h"
33#include "util/Debug.h"
34#include "core/Factory.h"
35#include "core/ConfigValueIncludes.h"
36#include "core/CoreIncludes.h"
37#include "core/ConsoleCommand.h"
38#include "core/CommandLine.h"
39#include "core/Shell.h"
40#include "core/TclBind.h"
41#include "core/TclThreadManager.h"
42#include "tools/Timer.h"
43#include "objects/Tickable.h"
44#include "Settings.h"
45
46#ifdef ORXONOX_PLATFORM_WINDOWS
47#  ifndef WIN32_LEAN_AND_MEAN
48#    define WIN32_LEAN_AND_MEAN
49#  endif
50#  include "windows.h"
51
52   //Get around Windows hackery
53#  ifdef max
54#    undef max
55#  endif
56#  ifdef min
57#    undef min
58#  endif
59#endif
60
61namespace orxonox
62{
63    SetCommandLineArgument(dataPath, "").information("PATH");
64    SetCommandLineArgument(limitToCPU, 1).information("0: off | #cpu");
65
66    GSRoot::GSRoot()
67        : RootGameState("root")
68        , settings_(0)
69        , tclBind_(0)
70        , tclThreadManager_(0)
71        , shell_(0)
72    {
73        RegisterRootObject(GSRoot);
74        setConfigValues();
75    }
76
77    GSRoot::~GSRoot()
78    {
79    }
80
81    void GSRoot::setConfigValues()
82    {
83    }
84
85    void GSRoot::enter()
86    {
87        // creates the class hierarchy for all classes with factories
88        Factory::createClassHierarchy();
89
90        // instantiate Settings class
91        this->settings_ = new Settings();
92
93        std::string dataPath = CommandLine::getValue("dataPath");
94        if (dataPath != "")
95        {
96            if (*dataPath.end() != '/' && *dataPath.end() != '\\')
97                Settings::tsetDataPath(dataPath + "/");
98            else
99                Settings::tsetDataPath(dataPath);
100        }
101
102        // initialise TCL
103        this->tclBind_ = new TclBind(Settings::getDataPath());
104        this->tclThreadManager_ = new TclThreadManager(tclBind_->getTclInterpreter());
105
106        // create a shell
107        this->shell_ = new Shell();
108
109        // limit the main thread to the first core so that QueryPerformanceCounter doesn't jump
110        // do this after ogre has initialised. Somehow Ogre changes the settings again (not through
111        // the timer though).
112        int limitToCPU = CommandLine::getValue("limitToCPU");
113        if (limitToCPU > 0)
114            setThreadAffinity((unsigned int)(limitToCPU - 1));
115
116        // add console commands
117        FunctorMember<GSRoot>* functor1 = createFunctor(&GSRoot::exitGame);
118        functor1->setObject(this);
119        CommandExecutor::addConsoleCommandShortcut(createConsoleCommand(functor1, "exit"));
120
121        // add console commands
122        FunctorMember01<GameStateBase, const std::string&>* functor2 = createFunctor(&GameStateBase::requestState);
123        functor2->setObject(this);
124        CommandExecutor::addConsoleCommandShortcut(createConsoleCommand(functor2, "selectGameState"));
125    }
126
127    void GSRoot::leave()
128    {
129        // TODO: remove and destroy console commands
130
131        delete this->shell_;
132        delete this->tclThreadManager_;
133        delete this->tclBind_;
134
135        delete settings_;
136
137    }
138
139    void GSRoot::ticked(const Clock& time)
140    {
141        TclThreadManager::getInstance().tick(time.getDeltaTime());
142
143        for (ObjectList<TimerBase>::iterator it = ObjectList<TimerBase>::begin(); it; ++it)
144            it->tick(time);
145
146        /*** HACK *** HACK ***/
147        // Call the Tickable objects
148        for (ObjectList<Tickable>::iterator it = ObjectList<Tickable>::begin(); it; ++it)
149            it->tick(time.getDeltaTime());
150        /*** HACK *** HACK ***/
151
152        this->tickChild(time);
153    }
154
155    /**
156    @note
157        The code of this function has been copied and adjusted from OGRE, an open source graphics engine.
158            (Object-oriented Graphics Rendering Engine)
159        For the latest info, see http://www.ogre3d.org/
160
161        Copyright (c) 2000-2008 Torus Knot Software Ltd
162       
163        OGRE is licensed under the LGPL. For more info, see OGRE license.
164    */
165    void GSRoot::setThreadAffinity(unsigned int limitToCPU)
166    {
167#ifdef ORXONOX_PLATFORM_WINDOWS
168        // Get the current process core mask
169            DWORD procMask;
170            DWORD sysMask;
171#  if _MSC_VER >= 1400 && defined (_M_X64)
172            GetProcessAffinityMask(GetCurrentProcess(), (PDWORD_PTR)&procMask, (PDWORD_PTR)&sysMask);
173#  else
174            GetProcessAffinityMask(GetCurrentProcess(), &procMask, &sysMask);
175#  endif
176
177            // If procMask is 0, consider there is only one core available
178            // (using 0 as procMask will cause an infinite loop below)
179            if (procMask == 0)
180                    procMask = 1;
181
182        // if the core specified with limitToCPU is not available, take the lowest one
183        if (!(procMask & (1 << limitToCPU)))
184            limitToCPU = 0;
185
186            // Find the lowest core that this process uses and limitToCPU suggests
187        DWORD threadMask = 1;
188            while ((threadMask & procMask) == 0 || (threadMask < (1u << limitToCPU)))
189                    threadMask <<= 1;
190
191            // Set affinity to the first core
192            SetThreadAffinityMask(GetCurrentThread(), threadMask);
193#endif
194    }
195}
Note: See TracBrowser for help on using the repository browser.