diff --git a/Aeon/Aeon.cpp b/Aeon/Aeon.cpp index 8a71b39..4eb0dc1 100644 --- a/Aeon/Aeon.cpp +++ b/Aeon/Aeon.cpp @@ -13,6 +13,7 @@ App::App( const DisplayProperties& props ) , mInput() { RegisterAsSink( "ENGINE_DISPLAY_CORE", 0 ); + RegisterAsSink( "ENGINE_INPUT_MOUSE", 0 ); mDisplay.Create( props ); @@ -33,7 +34,10 @@ const Display& App::GetDisplay() bool App::EventRecieved( GenericEvent& e ) { - std::cout << e.Type << std::endl; + if ( e.Type == "DISPLAY_CLOSED" ) + { + mSIGTERM = true; + } return false; } diff --git a/Aeon/Core/Display.cpp b/Aeon/Core/Display.cpp index 19491a2..9a0c1eb 100644 --- a/Aeon/Core/Display.cpp +++ b/Aeon/Core/Display.cpp @@ -80,5 +80,19 @@ void Display::Destroy() bool Display::EventRecieved( GenericEvent& e ) { + if ( e.Type == "DISPLAY_RESIZE" ) + { + mWidth = e.x; + mHeight = e.y; + return true; + } + + if ( e.Type == "DISPLAY_MOVE" ) + { + mX = e.x; + mY = e.y; + return true; + } + return false; } diff --git a/Aeon/Core/Display.hpp b/Aeon/Core/Display.hpp index fb90110..805e1e6 100644 --- a/Aeon/Core/Display.hpp +++ b/Aeon/Core/Display.hpp @@ -45,6 +45,7 @@ private: SDL_GLContext mContext; unsigned int mWidth, mHeight; + unsigned int mX, mY; private: Display( Display const& ) = delete; diff --git a/Aeon/Core/Events.cpp b/Aeon/Core/Events.cpp index c53e488..3d96b43 100644 --- a/Aeon/Core/Events.cpp +++ b/Aeon/Core/Events.cpp @@ -53,6 +53,7 @@ void EventDispatcher::RegisterAsSource( std::string system ) { mDispatcherID = EventManager::GetInstance().RegisterSource( this, system ); AEON_ASSERT( mDispatcherID != -1, "Cannot register event source" ); + mSystem = system; } void EventDispatcher::DeRegisterAsSource( std::string system ) @@ -62,6 +63,7 @@ void EventDispatcher::DeRegisterAsSource( std::string system ) void EventDispatcher::Dispatch( GenericEvent e ) { + e.System = mSystem; EventManager::GetInstance().Dispatch( mDispatcherID, e ); } @@ -69,6 +71,7 @@ void EventDispatcher::Dispatch( std::string type ) { GenericEvent e; e.Type = type; + e.System = mSystem; EventManager::GetInstance().Dispatch( mDispatcherID, e ); } @@ -122,6 +125,8 @@ void EventManager::RemoveSink( int listenerID, std::string system ) void EventManager::Dispatch( int dispatcherID, GenericEvent e ) { + // TODO: if there's no sinks, discard the event because it would be + // unneccesary effort to keep going with it std::string targetSink = mSources[dispatcherID]; auto sinks = mSinks[targetSink]; diff --git a/Aeon/Core/Events.hpp b/Aeon/Core/Events.hpp index 00fa050..74ba82c 100644 --- a/Aeon/Core/Events.hpp +++ b/Aeon/Core/Events.hpp @@ -8,6 +8,7 @@ - Event listeners are layered, 0 is front, larger is back so events propogate from the front to the back, not going further once handled + - Event sources can only dispatch events to a single system - Systems can request to only receive events from a certain "system" category, or multiple - Events are blocking for now @@ -37,6 +38,16 @@ namespace Aeon::Core { * DISPLAY_MOUSE_LEAVE - no data * DISPLAY_FOCUS - no data * DISPLAY_OUT_OF_FOCUS - no data +* ENGINE_INPUT_MOUSE +* MOUSE_LEFT_DOWN - no data +* MOUSE_LEFT_UP - no data +* MOUSE_RIGHT_DOWN - no data +* MOUSE_RIGHT_UP - no data +* MOUSE_MIDDLE_DOWN - no data +* MOUSE_MIDDLE_UP - no data +* MOUSE_SCROLL - y+- +* MOUSE_MOVE - move to x, y relative dx, dy +* ENGINE_INPUT_KEYBOARD * */ @@ -49,8 +60,10 @@ struct GenericEvent // the rest can be empty std::string Data; - // DISPLAY_RESIZE DISPLAY_MOVE + // DISPLAY_RESIZE DISPLAY_MOVE MOUSE_MOVE int x, y; + // MOUSE_MOVE + int dx, dy; bool Handled = false; }; @@ -90,6 +103,7 @@ public: void Dispatch( std::string type ); private: + std::string mSystem; int mDispatcherID = -1; friend class EventManager; diff --git a/Aeon/Input/Input.cpp b/Aeon/Input/Input.cpp index cd8c409..a0caf68 100644 --- a/Aeon/Input/Input.cpp +++ b/Aeon/Input/Input.cpp @@ -13,11 +13,15 @@ Input::Input() , mMouseEventDispatcher() { mDisplayEventDispatcher.RegisterAsSource( "ENGINE_DISPLAY_CORE" ); + mMouseEventDispatcher.RegisterAsSource( "ENGINE_INPUT_MOUSE" ); + mKeyboardEventDispatcher.RegisterAsSource( "ENGINE_INPUT_KEYBOARD" ); } Input::~Input() { - + mDisplayEventDispatcher.DeRegisterAsSource( "ENGINE_DISPLAY_CORE" ); + mMouseEventDispatcher.DeRegisterAsSource( "ENGINE_INPUT_MOUSE" ); + mKeyboardEventDispatcher.DeRegisterAsSource( "ENGINE_INPUT_KEYBOARD" ); } void Input::PollInput() @@ -26,74 +30,26 @@ void Input::PollInput() { switch ( mEvent.type ) { - case SDL_WINDOWEVENT: + case SDL_WINDOWEVENT: + { + mPollDisplay(); + break; + } + case SDL_MOUSEWHEEL: { - switch ( mEvent.window.event ) - { - case SDL_WINDOWEVENT_SHOWN: - { - mDisplayEventDispatcher.Dispatch( "DISPLAY_SHOW" ); - break; - } - case SDL_WINDOWEVENT_HIDDEN: - { - mDisplayEventDispatcher.Dispatch( "DISPLAY_HIDE" ); - break; - } - case SDL_WINDOWEVENT_MOVED: - { - Aeon::Core::GenericEvent e; - e.x = mEvent.window.data1; - e.y = mEvent.window.data2; - e.Type = "DISPLAY_MOVE"; - mDisplayEventDispatcher.Dispatch( e ); - break; - } - case SDL_WINDOWEVENT_RESIZED: - { - Aeon::Core::GenericEvent e; - e.x = mEvent.window.data1; - e.y = mEvent.window.data2; - e.Type = "DISPLAY_RESIZE"; - mDisplayEventDispatcher.Dispatch( e ); - break; - } - case SDL_WINDOWEVENT_MINIMIZED: - { - mDisplayEventDispatcher.Dispatch( "DISPLAY_MINIMISED" ); - break; - } - case SDL_WINDOWEVENT_MAXIMIZED: - { - mDisplayEventDispatcher.Dispatch( "DISPLAY_MAXIMISED" ); - break; - } - case SDL_WINDOWEVENT_ENTER: - { - mDisplayEventDispatcher.Dispatch( "DISPLAY_MOUSE_ENTER" ); - break; - } - case SDL_WINDOWEVENT_LEAVE: - { - mDisplayEventDispatcher.Dispatch( "DISPLAY_MOUSE_LEAVE" ); - break; - } - case SDL_WINDOWEVENT_FOCUS_GAINED: - { - mDisplayEventDispatcher.Dispatch( "DISPLAY_FOCUS" ); - break; - } - case SDL_WINDOWEVENT_FOCUS_LOST: - { - mDisplayEventDispatcher.Dispatch( "DISPLAY_OUT_OF_FOCUS" ); - break; - } - case SDL_WINDOWEVENT_CLOSE: - { - mDisplayEventDispatcher.Dispatch( "DISPLAY_CLOSED" ); - break; - } - } + mPollScroll(); + break; + } + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + { + mPollClick(); + break; + } + case SDL_MOUSEMOTION: + { + mPollMouse(); + break; } } } @@ -103,3 +59,142 @@ void Input::PollInput() //std::cout << std::endl; } +void Input::mPollDisplay() +{ + switch ( mEvent.window.event ) + { + case SDL_WINDOWEVENT_SHOWN: + { + mDisplayEventDispatcher.Dispatch( "DISPLAY_SHOW" ); + break; + } + case SDL_WINDOWEVENT_HIDDEN: + { + mDisplayEventDispatcher.Dispatch( "DISPLAY_HIDE" ); + break; + } + case SDL_WINDOWEVENT_MOVED: + { + Aeon::Core::GenericEvent e; + e.x = mEvent.window.data1; + e.y = mEvent.window.data2; + e.Type = "DISPLAY_MOVE"; + mDisplayEventDispatcher.Dispatch( e ); + break; + } + case SDL_WINDOWEVENT_RESIZED: + { + Aeon::Core::GenericEvent e; + e.x = mEvent.window.data1; + e.y = mEvent.window.data2; + e.Type = "DISPLAY_RESIZE"; + mDisplayEventDispatcher.Dispatch( e ); + break; + } + case SDL_WINDOWEVENT_MINIMIZED: + { + mDisplayEventDispatcher.Dispatch( "DISPLAY_MINIMISED" ); + break; + } + case SDL_WINDOWEVENT_MAXIMIZED: + { + mDisplayEventDispatcher.Dispatch( "DISPLAY_MAXIMISED" ); + break; + } + case SDL_WINDOWEVENT_ENTER: + { + mDisplayEventDispatcher.Dispatch( "DISPLAY_MOUSE_ENTER" ); + break; + } + case SDL_WINDOWEVENT_LEAVE: + { + mDisplayEventDispatcher.Dispatch( "DISPLAY_MOUSE_LEAVE" ); + break; + } + case SDL_WINDOWEVENT_FOCUS_GAINED: + { + mDisplayEventDispatcher.Dispatch( "DISPLAY_FOCUS" ); + break; + } + case SDL_WINDOWEVENT_FOCUS_LOST: + { + mDisplayEventDispatcher.Dispatch( "DISPLAY_OUT_OF_FOCUS" ); + break; + } + case SDL_WINDOWEVENT_CLOSE: + { + mDisplayEventDispatcher.Dispatch( "DISPLAY_CLOSED" ); + break; + } + } +} + +void Input::mPollMouse() +{ + Aeon::Core::GenericEvent e; + e.x = mEvent.motion.x; + e.y = mEvent.motion.y; + e.dx = mEvent.motion.xrel; + e.dy = mEvent.motion.yrel; + e.Type = "MOUSE_MOVE"; + mMouseEventDispatcher.Dispatch( e ); +} + +void Input::mPollScroll() +{ + Aeon::Core::GenericEvent e; + e.y = mEvent.wheel.y; + e.Type = "MOUSE_SCROLL"; + mMouseEventDispatcher.Dispatch( e ); +} + +void Input::mPollClick() +{ + if ( mEvent.button.state == SDL_PRESSED ) + { + switch ( mEvent.button.button ) + { + case SDL_BUTTON_LEFT: + { + mDisplayEventDispatcher.Dispatch( "MOUSE_LEFT_DOWN" ); + break; + } + case SDL_BUTTON_RIGHT: + { + mDisplayEventDispatcher.Dispatch( "MOUSE_RIGHT_DOWN" ); + break; + } + case SDL_BUTTON_MIDDLE: + { + mDisplayEventDispatcher.Dispatch( "MOUSE_MIDDLE_DOWN" ); + break; + } + } + } + if ( mEvent.button.state == SDL_RELEASED ) + { + switch ( mEvent.button.button ) + { + case SDL_BUTTON_LEFT: + { + mDisplayEventDispatcher.Dispatch( "MOUSE_LEFT_UP" ); + break; + } + case SDL_BUTTON_RIGHT: + { + mDisplayEventDispatcher.Dispatch( "MOUSE_RIGHT_UP" ); + break; + } + case SDL_BUTTON_MIDDLE: + { + mDisplayEventDispatcher.Dispatch( "MOUSE_MIDDLE_UP" ); + break; + } + } + } +} + +void Input::mPollKeyboard() +{ + +} diff --git a/Aeon/Input/Input.hpp b/Aeon/Input/Input.hpp index 85efc9c..95a47cd 100644 --- a/Aeon/Input/Input.hpp +++ b/Aeon/Input/Input.hpp @@ -16,6 +16,15 @@ public: void PollInput(); private: + + void mPollDisplay(); + void mPollMouse(); + void mPollScroll(); + void mPollClick(); + void mPollKeyboard(); + +private: + SDL_Event mEvent; Aeon::Core::EventDispatcher mDisplayEventDispatcher;