Files
qt6-migration-pipeline/external/dtEntity/include/dtEntityOSG/osginputinterface.h
T
torsten 99e70069ad
Qt6 Migration CI / migrate (push) Canceled after 0s
Adds external dep dtentity
2026-10-24 09:01:01 +00:00

238 lines
7.3 KiB
C++

#pragma once
/* -*-c++-*-
* dtEntity Game and Simulation Engine
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Martin Scheffler
*/
#include <dtEntity/core.h>
#include <dtEntity/inputinterface.h>
#include <dtEntityOSG/export.h>
#include <osgGA/GUIEventHandler>
#include <sstream>
namespace dtEntity
{
class MessagePump;
}
namespace dtEntityOSG
{
////////////////////////////////////////////////////////////////////////////////
// for use with GuiEventAdapter user event
class MouseEnterLeaveEvent : public osg::Referenced
{
public:
bool mFocused;
};
////////////////////////////////////////////////////////////////////////////////
class DTENTITY_OSG_EXPORT OSGInputInterface
: public dtEntity::InputInterface
{
public:
// can't make OSGInputInterface derive from osgGA::GUIEventHandler because
// we don't want to inherit osg::Referenced stuff
class EventHandler : public osgGA::GUIEventHandler
{
OSGInputInterface* mIface;
public:
EventHandler(OSGInputInterface* i)
: mIface(i)
{
}
virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa, osg::Object* o, osg::NodeVisitor* nv)
{
return mIface->handle(ea, aa, o, nv);
}
};
osgGA::GUIEventHandler* GetEventHandler() { return mEventHandler; }
typedef std::map<std::string, osgGA::GUIEventAdapter::KeySymbol> KeyNames;
typedef std::map<int, std::string> KeyNamesReverse;
OSGInputInterface(dtEntity::MessagePump&);
virtual ~OSGInputInterface();
//virtual void operator()(osg::Node* node, osg::NodeVisitor* nv);
virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor*);
virtual void AddInputCallback(dtEntity::InputCallbackInterface*);
virtual bool RemoveInputCallback(dtEntity::InputCallbackInterface*);
/**
* Stores if current system is multitouch-capable
*/
virtual bool GetMultiTouchEnabled() const { return mMultiTouchEnabled; }
virtual void SetMultiTouchEnabled(bool v) { mMultiTouchEnabled = v; }
virtual bool GetLockCursor() const { return mLockCursor; }
virtual void SetLockCursor(bool v) { mLockCursor = v; }
/**
* Multitouch interface: return number of touch points
*/
virtual size_t GetNumTouches() const { return mNumTouches; }
/**
* Multitouch interface: return touch points
*/
virtual std::vector<dtEntity::TouchPoint> GetTouches() const { return mTouches; }
/**
* Return true if key is pressed, else false
*/
bool GetKey(const std::string& name, unsigned int contextId = 0) const;
/**
* Return true if key was released this frame, else false
*/
virtual bool GetKeyUp(const std::string& name, unsigned int contextId = 0) const;
/**
* Return true if key was pressed down this frame, else false
*/
virtual bool GetKeyDown(const std::string& name, unsigned int contextId = 0) const;
/**
* Returns true if any keyboard key is currently pressed
*/
virtual bool AnyKeyDown() const;
/**
* Return string entered this frame
*/
virtual std::string GetInputString() const;
/**
* Return true if given mouse button is currently pressed.
* 0 for left button, 1 for right, 2 for center
*/
virtual bool GetMouseButton(int button, unsigned int contextId = 0) const;
/**
* Return true if given mouse button was pressed this frame.
* 0 for left button, 1 for right, 2 for center
*/
virtual bool GetMouseButtonDown(int button, unsigned int contextId = 0) const;
/**
* Return true if given mouse button was released this frame.
* 0 for left button, 1 for right, 2 for center
*/
virtual bool GetMouseButtonUp(int button, unsigned int contextId = 0) const;
/**
* Return axis value from -1 to 1
* @TODO: Axes are currently hard coded
*/
virtual double GetAxis(dtEntity::StringId axisname) const;
/**
* Return current mouse wheel state. -1 = down, 1 = up, 0 = no motion
*/
virtual int GetMouseWheelState(unsigned int contextId = 0) const;
/**
* Return a list containing names of all registered keys
*/
void GetKeyNames(std::map<std::string, unsigned int>&) const;
/**
* Get OSG key symbol from key name
*/
osgGA::GUIEventAdapter::KeySymbol GetKeySymbol(const std::string& name) const;
/**
* Clear stuff at end of frame
*/
void Reset();
/**
* React to OSG input events
*/
bool handleInternal(const osgGA::GUIEventAdapter& ea);
private:
osg::ref_ptr<osgGA::GUIEventHandler> mEventHandler;
void HandleMultiTouch(const osgGA::GUIEventAdapter& ea);
void HandleKeyUp(const osgGA::GUIEventAdapter& ea);
void HandleKeyDown(const osgGA::GUIEventAdapter& ea);
void HandleMouseUp(const osgGA::GUIEventAdapter& ea);
void HandleMouseDown(const osgGA::GUIEventAdapter& ea);
void HandleMouseMove(const osgGA::GUIEventAdapter& ea);
void HandleMouseWheel(const osgGA::GUIEventAdapter& ea);
void HandleMouseEnterLeave(const osgGA::GUIEventAdapter& ea);
dtEntity::MessagePump* mMessagePump;
bool mMultiTouchEnabled;
bool mLockCursor;
size_t mNumTouches;
std::vector<dtEntity::TouchPoint> mTouches;
typedef std::vector<dtEntity::InputCallbackInterface*> Callbacks;
Callbacks mCallbacks;
// pair of context id, key
typedef std::set<std::pair<unsigned int, int> > ContextKeyMap;
ContextKeyMap mKeyPressedSet;
ContextKeyMap mKeyUpSet;
ContextKeyMap mKeyDownSet;
KeyNames mKeyNames;
KeyNamesReverse mKeyNamesReverse;
typedef std::set<std::pair<unsigned int, int> > ContextButtonMap;
ContextButtonMap mMouseButtonPressed;
ContextButtonMap mMouseButtonUp;
ContextButtonMap mMouseButtonDown;
float mMouseX;
float mMouseY;
int mMouseXRaw;
int mMouseYRaw;
int mMouseDeltaXRaw;
int mMouseDeltaYRaw;
float mMouseDeltaX;
float mMouseDeltaY;
unsigned int mFrameNumber;
int mMouseScroll;
unsigned int mMouseScrollContext;
std::ostringstream mInputString;
bool mNeedReset; // internal flag to check when to reset
};
inline OSGInputInterface* GetOSGInputInterface()
{
return static_cast<OSGInputInterface*>(dtEntity::GetInputInterface());
}
}