Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Aug 30, 2009, 2:22:00 AM (15 years ago)
Author:
rgrieder
Message:

Merged resource2 branch back to trunk.

IMPORTANT NOTE:
Upon this merge you need to specifically call your data directory "data_extern" when checking it out (when you don't provide a name, it will be just called 'trunk').
The new CMake variable is EXTERNAL_DATA_DIRECTORY. DATA_DIRECTORY now points to the one the source part of the repository.
UPDATE YOUR DATA DIRECTORY AS WELL!!!

Location:
code/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • code/trunk

  • code/trunk/src/core/input/InputManager.cc

    r3370 r5695  
    4141#include <boost/foreach.hpp>
    4242
     43#include "util/Convert.h"
    4344#include "util/Exception.h"
    4445#include "util/ScopeGuard.h"
     
    4950#include "core/CommandLine.h"
    5051#include "core/Functor.h"
     52#include "core/GraphicsManager.h"
    5153
    5254#include "InputBuffer.h"
     
    8284    // ##########                                        ##########
    8385    // ############################################################
    84     InputManager::InputManager(size_t windowHnd)
     86    InputManager::InputManager()
    8587        : internalState_(Bad)
    8688        , oisInputManager_(0)
    8789        , devices_(2)
    88         , windowHnd_(0)
     90        , bExclusiveMouse_(false)
    8991        , emptyState_(0)
    9092        , keyDetector_(0)
     
    9799        this->setConfigValues();
    98100
    99         this->loadDevices(windowHnd);
     101        this->loadDevices();
    100102
    101103        // Lowest priority empty InputState
     
    147149        Creates the OIS::InputMananger, the keyboard, the mouse and
    148150        the joys ticks. If either of the first two fail, this method throws an exception.
    149     @param windowHnd
    150         The window handle of the render window
    151151    @param windowWidth
    152152        The width of the render window
     
    154154        The height of the render window
    155155    */
    156     void InputManager::loadDevices(size_t windowHnd)
    157     {
    158         CCOUT(3) << "Loading input devices..." << std::endl;
     156    void InputManager::loadDevices()
     157    {
     158        CCOUT(4) << "Loading input devices..." << std::endl;
    159159
    160160        // When loading the devices they should not already be loaded
     
    164164        assert(devices_.size() == InputDeviceEnumerator::FirstJoyStick);
    165165
    166         // store handle internally so we can reload OIS
    167         windowHnd_ = windowHnd;
    168 
     166        // Fill parameter list
    169167        OIS::ParamList paramList;
    170         std::ostringstream windowHndStr;
    171 
    172         // Fill parameter list
    173         windowHndStr << static_cast<unsigned int>(windowHnd);
    174         paramList.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
     168        size_t windowHnd = GraphicsManager::getInstance().getRenderWindowHandle();
     169        paramList.insert(std::make_pair("WINDOW", multi_cast<std::string>(windowHnd)));
    175170#if defined(ORXONOX_PLATFORM_WINDOWS)
    176         //paramList.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE")));
    177         //paramList.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND")));
    178         //paramList.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_NONEXCLUSIVE")));
    179         //paramList.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_FOREGROUND")));
     171        paramList.insert(std::make_pair("w32_keyboard", "DISCL_NONEXCLUSIVE"));
     172        paramList.insert(std::make_pair("w32_keyboard", "DISCL_FOREGROUND"));
     173        paramList.insert(std::make_pair("w32_mouse", "DISCL_FOREGROUND"));
     174        if (bExclusiveMouse_ || GraphicsManager::getInstance().isFullScreen())
     175        {
     176            // Disable Windows key plus special keys (like play, stop, next, etc.)
     177            paramList.insert(std::make_pair("w32_keyboard", "DISCL_NOWINKEY"));
     178            paramList.insert(std::make_pair("w32_mouse", "DISCL_EXCLUSIVE"));
     179        }
     180        else
     181            paramList.insert(std::make_pair("w32_mouse", "DISCL_NONEXCLUSIVE"));
    180182#elif defined(ORXONOX_PLATFORM_LINUX)
    181         paramList.insert(std::make_pair(std::string("XAutoRepeatOn"), std::string("true")));
    182         paramList.insert(std::make_pair(std::string("x11_mouse_grab"), "true"));
    183         paramList.insert(std::make_pair(std::string("x11_mouse_hide"), "true"));
    184         bool kbNoGrab;
    185         CommandLine::getValue("keyboard_no_grab", &kbNoGrab);
    186         if (kbNoGrab)
    187             paramList.insert(std::make_pair(std::string("x11_keyboard_grab"), std::string("false")));
     183        // Enabling this is probably a bad idea, but whenever orxonox crashes, the setting stays on
     184        // Trouble might be that the Pressed event occurs a bit too often...
     185        paramList.insert(std::make_pair("XAutoRepeatOn", "true"));
     186
     187        if (bExclusiveMouse_ || GraphicsManager::getInstance().isFullScreen())
     188        {
     189            if (CommandLine::getValue("keyboard_no_grab").getBool())
     190                paramList.insert(std::make_pair("x11_keyboard_grab", "false"));
     191            else
     192                paramList.insert(std::make_pair("x11_keyboard_grab", "true"));
     193            paramList.insert(std::make_pair("x11_mouse_grab",  "true"));
     194            paramList.insert(std::make_pair("x11_mouse_hide", "true"));
     195        }
    188196        else
    189             paramList.insert(std::make_pair(std::string("x11_keyboard_grab"), std::string("true")));
     197        {
     198            paramList.insert(std::make_pair("x11_keyboard_grab", "false"));
     199            paramList.insert(std::make_pair("x11_mouse_grab",  "false"));
     200            paramList.insert(std::make_pair("x11_mouse_hide", "false"));
     201        }
    190202#endif
    191203
     
    212224        }
    213225
    214         // TODO: Remove the two parameters
    215226        this->loadMouse();
    216227        this->loadJoySticks();
     
    219230        this->updateActiveStates();
    220231
    221         CCOUT(3) << "Input devices loaded." << std::endl;
     232        CCOUT(4) << "Input devices loaded." << std::endl;
    222233    }
    223234
     
    275286    InputManager::~InputManager()
    276287    {
    277         CCOUT(4) << "Destroying..." << std::endl;
     288        CCOUT(3) << "Destroying..." << std::endl;
    278289
    279290        // Destroy calibrator helper handler and state
     
    293304            this->destroyDevices();
    294305
    295         CCOUT(4) << "Destruction complete." << std::endl;
     306        CCOUT(3) << "Destruction complete." << std::endl;
    296307    }
    297308
     
    304315    void InputManager::destroyDevices()
    305316    {
    306         CCOUT(3) << "Destroying devices..." << std::endl;
     317        CCOUT(4) << "Destroying devices..." << std::endl;
    307318
    308319        BOOST_FOREACH(InputDevice*& device, devices_)
     
    336347
    337348        internalState_ |= Bad;
    338         CCOUT(3) << "Destroyed devices." << std::endl;
     349        CCOUT(4) << "Destroyed devices." << std::endl;
    339350    }
    340351
     
    365376
    366377        this->destroyDevices();
    367         this->loadDevices(windowHnd_);
     378        this->loadDevices();
    368379
    369380        internalState_ &= ~Bad;
    370381        internalState_ &= ~ReloadRequest;
    371         CCOUT(3) << "Reloading complete." << std::endl;
     382        CCOUT(4) << "Reloading complete." << std::endl;
    372383    }
    373384
     
    481492    void InputManager::updateActiveStates()
    482493    {
     494        assert((internalState_ & InputManager::Ticking) == 0);
    483495        // temporary resize
    484496        for (unsigned int i = 0; i < devices_.size(); ++i)
     
    512524        for (std::set<InputState*>::const_iterator it = tempSet.begin();it != tempSet.end(); ++it)
    513525            activeStatesTicked_.push_back(*it);
     526
     527        // Check whether we have to change the mouse mode
     528        std::vector<InputState*>& mouseStates = devices_[InputDeviceEnumerator::Mouse]->getStateListRef();
     529        if (mouseStates.empty() && bExclusiveMouse_ ||
     530            !mouseStates.empty() && mouseStates.front()->getIsExclusiveMouse() != bExclusiveMouse_)
     531        {
     532            bExclusiveMouse_ = !bExclusiveMouse_;
     533            if (!GraphicsManager::getInstance().isFullScreen())
     534                this->reloadInternal();
     535        }
    514536    }
    515537
     
    556578    }
    557579
    558     // ############################################################
    559     // #####                    Iput States                   #####
     580    std::pair<int, int> InputManager::getMousePosition() const
     581    {
     582        Mouse* mouse = static_cast<Mouse*>(devices_[InputDeviceEnumerator::Mouse]);
     583        if (mouse != NULL)
     584        {
     585            const OIS::MouseState state = mouse->getOISDevice()->getMouseState();
     586            return std::make_pair(state.X.abs, state.Y.abs);
     587        }
     588        else
     589            return std::make_pair(0, 0);
     590    }
     591
     592    // ############################################################
     593    // #####                    Input States                  #####
    560594    // ##########                                        ##########
    561595    // ############################################################
Note: See TracChangeset for help on using the changeset viewer.