From 452cc00e578cc023acc1ad6fde29111dda2ecfc6 Mon Sep 17 00:00:00 2001 From: anulax1225 Date: Thu, 18 Jan 2024 13:06:17 +0100 Subject: [PATCH] Added event abstraction --- bakara/src/bakara/events/app_event.h | 20 +++++++ bakara/src/bakara/events/event.cpp | 24 ++++++++ bakara/src/bakara/events/event.h | 73 +++++++++++++++++++++++++ bakara/src/bakara/events/key_event.h | 0 bakara/src/bakara/events/mouse_event.h | 0 bakara/src/bakara/events/window_event.h | 30 ++++++++++ bakara/src/bakara/math/base.h | 3 + 7 files changed, 150 insertions(+) create mode 100644 bakara/src/bakara/events/app_event.h create mode 100644 bakara/src/bakara/events/event.cpp create mode 100644 bakara/src/bakara/events/event.h create mode 100644 bakara/src/bakara/events/key_event.h create mode 100644 bakara/src/bakara/events/mouse_event.h create mode 100644 bakara/src/bakara/events/window_event.h create mode 100644 bakara/src/bakara/math/base.h diff --git a/bakara/src/bakara/events/app_event.h b/bakara/src/bakara/events/app_event.h new file mode 100644 index 0000000..daf784d --- /dev/null +++ b/bakara/src/bakara/events/app_event.h @@ -0,0 +1,20 @@ +#pragma once + +#include "event.h" + +namespace Bk { + class AppTickEvent : public Event + { + + } + + class AppRenderEvent : public Event + { + + } + + class AppUpdateEvent : public Event + { + + } +} \ No newline at end of file diff --git a/bakara/src/bakara/events/event.cpp b/bakara/src/bakara/events/event.cpp new file mode 100644 index 0000000..f35e5cd --- /dev/null +++ b/bakara/src/bakara/events/event.cpp @@ -0,0 +1,24 @@ +#include "event.h" + +namespace Bk { + EventDispatcher::EventDispatcher(Event& event) + { + p_event = event; + } + + bool ventDispatcher::Dispatch(const F& func) + { + if (p_event.GetEventType() == T::GetStaticType()) + { + p_event.handled |= func(static_cast(p_event)); + return true; + } + return false; + } + + inline std::ostream& operator<<(std::ostream& os, Event& e) + { + return os << e.ToString(); + } + +} \ No newline at end of file diff --git a/bakara/src/bakara/events/event.h b/bakara/src/bakara/events/event.h new file mode 100644 index 0000000..8dafdce --- /dev/null +++ b/bakara/src/bakara/events/event.h @@ -0,0 +1,73 @@ +#pragma once + +#include + +namespace Bk { + enum class EventType + { + None = 0, + AppTick, + AppUpdate, + AppRender, + WindowClose, + WindowResize, + WindowFocus, + WindowLostFocus, + WindowMove, + KeyPress, + KeyRelease, + KeyTyped, + MouseButtonPress, + MouseButtonRelease, + MouseMove, + MouseScroll + }; + + enum class EventCategory + { + None = 0, + AppEvent = BIT_SHIFT(0), + InputEvent = BIT_SHIFT(1), + KeyboardEvent = BIT_SHIFT(2), + MouseEvent = BIT_SHIFT(3), + MouseButtonEvent = BIT_SHIFT(4) + }; + + #define EVENT_CLASS_TYPE(type) static EventType GetStaticType() { return EventType::type; }\ + virtual EventType GetEventType() const override { return GetStaticType(); }\ + virtual const char* GetName() const override { return #type; } + + #define EVENT_CLASS_CATEGORY(category) virtual int GetCategoryFlags() const override { return category; } + + class Event + { + public: + virtual ~Event() = default; + + bool handled = false; + + virtual EventType GetEventType() const = 0; + virtual const char* GetName() const = 0; + virtual int GetCategoryFlags() const = 0; + virtual std::string ToString() const { return GetName(); } + + bool IsInCategory(EventCategory category) + { + return GetCategoryFlags() & (int)category == GetCategoryFlags(); + } + }; + inline std::ostream& operator<<(std::ostream& os, Event& e); + + + class EventDispatcher + { + public: + EventDispatcher(Event& event); + + // F will be deduced by the compiler + template + bool Dispatch(const F& func); + private: + Event& p_event; + }; +} \ No newline at end of file diff --git a/bakara/src/bakara/events/key_event.h b/bakara/src/bakara/events/key_event.h new file mode 100644 index 0000000..e69de29 diff --git a/bakara/src/bakara/events/mouse_event.h b/bakara/src/bakara/events/mouse_event.h new file mode 100644 index 0000000..e69de29 diff --git a/bakara/src/bakara/events/window_event.h b/bakara/src/bakara/events/window_event.h new file mode 100644 index 0000000..b180cc2 --- /dev/null +++ b/bakara/src/bakara/events/window_event.h @@ -0,0 +1,30 @@ +pragma once + +#include "event.h" + +namespace Bk { + class WindowResizeEvent : public Event + { + + } + + class WindowCloseEvent : public Event + { + + } + + class WindowFocusEvent : public Event + { + + } + + class WindowLostFocusEvent : public Event + { + + } + + class WindowMoveEvent : public Event + { + + } +} \ No newline at end of file diff --git a/bakara/src/bakara/math/base.h b/bakara/src/bakara/math/base.h new file mode 100644 index 0000000..01ab12b --- /dev/null +++ b/bakara/src/bakara/math/base.h @@ -0,0 +1,3 @@ +#pragma once + +#define BIT_SHIFT(x) (1 << x) \ No newline at end of file