[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