[Orxonox-commit 7678] r12271 - in code/branches/MouseAPI_FS19: data/levels src/modules/MouseAPI
tkuonen at orxonox.net
tkuonen at orxonox.net
Thu Apr 4 15:28:50 CEST 2019
Author: tkuonen
Date: 2019-04-04 15:28:50 +0200 (Thu, 04 Apr 2019)
New Revision: 12271
Modified:
code/branches/MouseAPI_FS19/data/levels/MouseAPIExample.oxw
code/branches/MouseAPI_FS19/src/modules/MouseAPI/mouseapi.cc
code/branches/MouseAPI_FS19/src/modules/MouseAPI/mouseapi.h
code/branches/MouseAPI_FS19/src/modules/MouseAPI/mouseapiexample.cc
code/branches/MouseAPI_FS19/src/modules/MouseAPI/mouseapiexample.h
Log:
Begin extending MouseAPI
Modified: code/branches/MouseAPI_FS19/data/levels/MouseAPIExample.oxw
===================================================================
--- code/branches/MouseAPI_FS19/data/levels/MouseAPIExample.oxw 2019-04-04 13:22:31 UTC (rev 12270)
+++ code/branches/MouseAPI_FS19/data/levels/MouseAPIExample.oxw 2019-04-04 13:28:50 UTC (rev 12271)
@@ -11,10 +11,8 @@
include("templates/lodInformation.oxt")
?>
-<?lua
- include("templates/spaceshipEscort.oxt")
-?>
+
<Level >
<templates>
<Template link=lodtemplate_default />
@@ -24,14 +22,18 @@
ambientlight = "0.8, 0.8, 0.8"
skybox = "Orxonox/Starbox"
>
- <camerapositions>
- <CameraPosition position="0,0,0" lookat="100,0,0" absolute=true drag=true mouselook=true/>
- </camerapositions>
+
+ <CameraPosition position="0,0,0" lookat="100,0,0" absolute=true drag=false mouselook=false/>
+
<Light type=directional position="0,0,0" direction="0.253, 0.593, -0.765" diffuse="1.0, 0.9, 0.9, 1.0" specular="1.0, 0.9, 0.9, 1.0"/>
- <SpawnPoint team=0 position="0,0,0" lookat="0,0,0"/>
+ <SpawnPoint team=0 position="0,0,0" lookat="100,0,0"/>
- <MouseAPIExample position="100,0,0" direction="0,-1,0" collisionType=static mass=100000 friction=0.01 >
+
+<MouseAPIExample position="100,0,0" direction="0,-1,0" collisionType=dynamic mass=100000 friction=0.01 cameraOffset=100>
+ <camerapositions>
+ <CameraPosition position="0,0,0" absolute=true mouselook=false drag=false direction="1,0,0"/>
+ </camerapositions>
<attached>
<Model position="0,0,0" mesh="cube.mesh" scale3D="10,10,10" />
</attached>
@@ -39,7 +41,9 @@
<BoxCollisionShape position="0,0,0" halfExtents="10,10,10" />
</collisionShapes>
- </MouseAPIExample>
+</MouseAPIExample>
+
+
</Scene>
</Level>
Modified: code/branches/MouseAPI_FS19/src/modules/MouseAPI/mouseapi.cc
===================================================================
--- code/branches/MouseAPI_FS19/src/modules/MouseAPI/mouseapi.cc 2019-04-04 13:22:31 UTC (rev 12270)
+++ code/branches/MouseAPI_FS19/src/modules/MouseAPI/mouseapi.cc 2019-04-04 13:28:50 UTC (rev 12271)
@@ -1,7 +1,9 @@
#include "mouseapi.h"
-
+#include "core/singleton/ScopedSingletonIncludes.h"
namespace orxonox{
+ManageScopedSingleton(MouseAPI, ScopeID::GRAPHICS, false);
+
MouseAPI::MouseAPI()
{
@@ -9,6 +11,7 @@
void MouseAPI::activate()
{
+ active = true;
if(InputManager::exists())
{
//cam = CameraManager::getInstance().getActiveCamera()->getOgreCamera();
@@ -22,6 +25,7 @@
void MouseAPI::deactivate()
{
+ active = false;
if(InputManager::exists())
{
InputManager::getInstance().leaveState("MouseAPI");
@@ -28,6 +32,8 @@
state->setMouseHandler(nullptr);
InputManager::getInstance().destroyState("MouseAPI");
}
+ clickEvents.clear();
+ scrollEvents.clear();
}
MouseAPI::~MouseAPI()
@@ -37,7 +43,7 @@
void MouseAPI::buttonPressed(MouseButtonCode::ByEnum button)
{
- cam = CameraManager::getInstance().getActiveCamera()->getOgreCamera();
+ cam = CameraManager::getInstance().getActiveCamera()->getOgreCamera();//todo: trycatch
Ogre::Viewport *vp = GraphicsManager::getInstance().getViewport();
Ogre::Ray ray = cam->getCameraToViewportRay(mousePos.x/((float)vp->getActualWidth()),mousePos.y/((float)vp->getActualHeight()));
for(auto event: clickEvents)
@@ -56,30 +62,37 @@
void MouseAPI::mouseScrolled(int abs, int rel)
{
+ cam = CameraManager::getInstance().getActiveCamera()->getOgreCamera();
Ogre::Viewport *vp = GraphicsManager::getInstance().getViewport();
Ogre::Ray ray = cam->getCameraToViewportRay(mousePos.x/((float)vp->getActualWidth()),mousePos.y/((float)vp->getActualHeight()));
for(auto event:scrollEvents){
if(!event.considerPosition || ray.intersects(Ogre::Sphere(event.position,event.radius)).first)
- (*(event.onScrolledFunction))(abs,rel,mousePos);
+ event.onScrolledFunction(abs,rel,mousePos);
}
}
-void MouseAPI::addClickableObject(const Vector3& position, float radius, const std::list<MouseButtonCode::ByEnum>& buttons, std::function<void(MouseButtonCode::ByEnum)> onClickedFunction)
+ClickableObjectID MouseAPI::addClickableObject(const Vector3& position, float radius, const std::list<MouseButtonCode::ByEnum>& buttons, std::function<void(MouseButtonCode::ByEnum)> onClickedFunction)
{
- clickEvents.insert(clickEvents.begin(),{position,radius,buttons,onClickedFunction});
+ clickEvents.insert(clickEvents.begin(),{!clickEvents.empty() ? clickEvents.back().id + 1:0,position,radius,buttons,onClickedFunction});
+ return clickEvents.back().id;
}
-void MouseAPI::addScrollElement(const Vector3& position,float radius,void (*onScrolledFunction)(int abs,int rel,const IntVector2& mousePos))
+ScrollableElementID MouseAPI::addScrollElement(const Vector3& position, float radius, std::function<void(int abs,int rel,const IntVector2& mousePos)> onScrolledFunction)
{
- scrollEvents.insert(scrollEvents.begin(),{position,radius,onScrolledFunction});
+ scrollEvents.insert(scrollEvents.begin(),{!scrollEvents.empty() ? scrollEvents.back().id + 1:0,position,radius,onScrolledFunction});
+ return scrollEvents.back().id;
}
-void MouseAPI::addScrollElement(void (*onScrolledFunction)(int abs,int rel,const IntVector2& mousePos))
+ScrollableElementID MouseAPI::addScrollElement(std::function<void(int abs,int rel,const IntVector2& mousePos)> onScrolledFunction)
{
- scrollEvents.insert(scrollEvents.begin(),{onScrolledFunction});
+ scrollEvents.insert(scrollEvents.begin(),{!scrollEvents.empty() ? scrollEvents.back().id + 1:0,onScrolledFunction});
+ return scrollEvents.back().id;
}
-void MouseAPI::changeCamera(Camera& camera)
-{
- cam = camera.getOgreCamera();
-}
+//todo
+void MouseAPI::changePositionOfClickableObject(ClickableObjectID id,const Vector3& position){}
+void MouseAPI::changePositionOfScrollableElement(ScrollableElementID id,const Vector3& position){}
+void MouseAPI::changeRadiusOfClickableObject(ClickableObjectID id,float radius){}
+void MouseAPI::changeRadiusOfScrollableElement(ScrollableElementID id,float radius){}
+void MouseAPI::deleteClickableObject(ClickableObjectID){}
+void MouseAPI::deleteScrollableElement(ScrollableElementID){}
}
Modified: code/branches/MouseAPI_FS19/src/modules/MouseAPI/mouseapi.h
===================================================================
--- code/branches/MouseAPI_FS19/src/modules/MouseAPI/mouseapi.h 2019-04-04 13:22:31 UTC (rev 12270)
+++ code/branches/MouseAPI_FS19/src/modules/MouseAPI/mouseapi.h 2019-04-04 13:28:50 UTC (rev 12271)
@@ -19,41 +19,50 @@
namespace orxonox
{
-class MouseAPI : public InputHandler
+typedef uint ClickableObjectID;
+typedef uint ScrollableElementID;
+
+class MouseAPI : public InputHandler, public Singleton<MouseAPI>
{
-
+friend class Singleton<MouseAPI>;
private:
struct clickableElement
{
+ //static ClickableObjectID lastClID;
+ ClickableObjectID id;
Vector3 position;
float radius;
std::list<MouseButtonCode::ByEnum> buttons;
std::function<void(MouseButtonCode::ByEnum button)> onClickedFunction;
- clickableElement(const Vector3& position,float radius,const std::list<MouseButtonCode::ByEnum>& buttons,std::function<void(MouseButtonCode::ByEnum button)> onClickedFunction):position(position),
- radius(radius), buttons(buttons), onClickedFunction(onClickedFunction){}
+ clickableElement(ClickableObjectID id,const Vector3& position,float radius,const std::list<MouseButtonCode::ByEnum>& buttons,std::function<void(MouseButtonCode::ByEnum button)> onClickedFunction):position(position),
+ radius(radius), buttons(buttons), onClickedFunction(onClickedFunction),id(id){}
};
struct scrollElement
{
+ static ScrollableElementID lastScID;
+ ScrollableElementID id;
bool considerPosition;
Vector3 position;
float radius;
- void (*onScrolledFunction)(int abs,int rel,const IntVector2& mousePos);
- scrollElement(void (*onScrolledFunction)(int abs,int rel,const IntVector2& mousePos)):considerPosition(false),
- onScrolledFunction(onScrolledFunction){}
- scrollElement(const Vector3& position, float radius, void (*onScrolledFunction)(int abs,int rel,const IntVector2& mousePos)):considerPosition(true),
- position(position), radius(radius), onScrolledFunction(onScrolledFunction){}
+ std::function<void(int abs,int rel,const IntVector2& mousePos)> onScrolledFunction;
+ scrollElement(ScrollableElementID id,std::function<void(int abs,int rel,const IntVector2& mousePos)> onScrolledFunction):considerPosition(false),
+ onScrolledFunction(onScrolledFunction),id(id){}
+ scrollElement(ScrollableElementID id,const Vector3& position, float radius, std::function<void(int abs,int rel,const IntVector2& mousePos)> onScrolledFunction):considerPosition(true),
+ position(position), radius(radius), onScrolledFunction(onScrolledFunction),id(id){}
};
-
+ static MouseAPI* singletonPtr_s;
std::list<clickableElement> clickEvents;
std::list<scrollElement> scrollEvents;
Ogre::Camera *cam ;
IntVector2 mousePos;
InputState* state;
+ bool active = false;
+
public:
MouseAPI();
@@ -64,13 +73,19 @@
virtual void mouseMoved (IntVector2 abs, IntVector2 rel, IntVector2 clippingSize) override;
virtual void mouseScrolled (int abs, int rel) override;
- void addClickableObject(const Vector3& position,float radius,const std::list<MouseButtonCode::ByEnum>& buttons,std::function<void(MouseButtonCode::ByEnum button)> onClickedFunction);
- void addScrollElement(const Vector3& position,float radius,void (*onScrolledFunction)(int abs,int rel,const IntVector2& mousePos));
- void addScrollElement(void (*onScrolledFunction)(int abs,int rel,const IntVector2& mousePos));
+ ClickableObjectID addClickableObject(const Vector3& position,float radius,const std::list<MouseButtonCode::ByEnum>& buttons,std::function<void(MouseButtonCode::ByEnum button)> onClickedFunction);
+ ScrollableElementID addScrollElement(const Vector3& position,float radius,std::function<void(int abs,int rel,const IntVector2& mousePos)> onScrolledFunction);
+ ScrollableElementID addScrollElement(std::function<void(int abs,int rel,const IntVector2& mousePos)> onScrolledFunction);
- void changeCamera(Camera& camera);
+ void changePositionOfClickableObject(ClickableObjectID id,const Vector3& position);
+ void changePositionOfScrollableElement(ScrollableElementID id,const Vector3& position);
+ void changeRadiusOfClickableObject(ClickableObjectID id,float radius);
+ void changeRadiusOfScrollableElement(ScrollableElementID id,float radius);
+ void deleteClickableObject(ClickableObjectID);
+ void deleteScrollableElement(ScrollableElementID);
void activate();
+ static bool isActive(){return singletonPtr_s != nullptr && getInstance().active;}
void deactivate();
};
}
Modified: code/branches/MouseAPI_FS19/src/modules/MouseAPI/mouseapiexample.cc
===================================================================
--- code/branches/MouseAPI_FS19/src/modules/MouseAPI/mouseapiexample.cc 2019-04-04 13:22:31 UTC (rev 12270)
+++ code/branches/MouseAPI_FS19/src/modules/MouseAPI/mouseapiexample.cc 2019-04-04 13:28:50 UTC (rev 12271)
@@ -5,19 +5,25 @@
RegisterClass(MouseAPIExample);
-MouseAPIExample::MouseAPIExample(Context* context) : StaticEntity(context)
+MouseAPIExample::MouseAPIExample(Context* context) : ControllableEntity(context)
{
RegisterObject(MouseAPIExample);
- mouseapi.activate();
- mouseapi.addClickableObject(getPosition(),10,std::list<MouseButtonCode::ByEnum>{MouseButtonCode::Left},[this](MouseButtonCode::ByEnum mouse){this->testfunction(mouse);});
+ //mouseapi = MouseAPI::getInstance();
}
MouseAPIExample::~MouseAPIExample()
{
- mouseapi.deactivate();
+ if(MouseAPI::isActive())
+ MouseAPI::getInstance().deactivate();
}
+void MouseAPIExample::tick(float dt)
+{
+ ControllableEntity::tick(dt);
+
+}
+
void MouseAPIExample::testfunction(MouseButtonCode::ByEnum mouse)
{
orxout() << "MouseAPIExample: Object Clicked\n";
@@ -26,5 +32,8 @@
void MouseAPIExample::XMLPort(Element& xmlelement, XMLPort::Mode mode)
{
SUPER(MouseAPIExample, XMLPort, xmlelement, mode);
+ MouseAPI::getInstance().activate();
+ MouseAPI::getInstance().addClickableObject(this->getWorldPosition(),10,std::list<MouseButtonCode::ByEnum>{MouseButtonCode::Left},[this](MouseButtonCode::ByEnum mouse){this->testfunction(mouse);});
+
}
}
Modified: code/branches/MouseAPI_FS19/src/modules/MouseAPI/mouseapiexample.h
===================================================================
--- code/branches/MouseAPI_FS19/src/modules/MouseAPI/mouseapiexample.h 2019-04-04 13:22:31 UTC (rev 12270)
+++ code/branches/MouseAPI_FS19/src/modules/MouseAPI/mouseapiexample.h 2019-04-04 13:28:50 UTC (rev 12271)
@@ -6,19 +6,19 @@
#include "mouseapi.h"
#include "util/output/OutputManager.h"
#include "util/output/ConsoleWriter.h"
-#include "worldentities/StaticEntity.h"
+#include "worldentities/ControllableEntity.h"
#include "core/CoreIncludes.h"
namespace orxonox
{
-class MouseAPIExample : public StaticEntity
+class MouseAPIExample : public ControllableEntity
{
public:
MouseAPIExample(Context *context);
~MouseAPIExample();
virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
- MouseAPI mouseapi;
void testfunction(MouseButtonCode::ByEnum mouse);
+ virtual void tick(float dt) override;
};
}
#endif // MOUSEAPIEXAMPLE_H
More information about the Orxonox-commit
mailing list