summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Event.cpp130
-rw-r--r--src/Event.hpp241
2 files changed, 0 insertions, 371 deletions
diff --git a/src/Event.cpp b/src/Event.cpp
index 1f3a9e8..00f67c0 100644
--- a/src/Event.cpp
+++ b/src/Event.cpp
@@ -1,131 +1 @@
#include "Event.hpp"
-
-#include <easylogging++.h>
-
-#include "Utility.hpp"
-
-std::queue<Event> EventAgregator::eventsToHandle;
-std::mutex EventAgregator::queueMutex;
-bool EventAgregator::isStarted = false;
-std::vector<EventListener *> EventAgregator::listeners;
-std::mutex EventAgregator::listenersMutex;
-
-EventListener::EventListener() {
- EventAgregator::RegisterListener(*this);
-}
-
-EventListener::~EventListener() {
- EventAgregator::UnregisterListener(*this);
-}
-
-void EventListener::PushEvent(Event event) {
- eventsMutex.lock();
- handlersMutex.lock();
- if (handlers[event.type]) {
- events.push(event);
- }
- handlersMutex.unlock();
- eventsMutex.unlock();
-}
-
-void EventListener::DirectCall(Event event)
-{
- handlersMutex.lock();
- if (handlers[event.type])
- handlers[event.type](event.data);
- handlersMutex.unlock();
-}
-
-bool EventListener::IsEventsQueueIsNotEmpty() {
- eventsMutex.lock();
- bool value = !events.empty();
- eventsMutex.unlock();
- return value;
-}
-
-
-void EventListener::RegisterHandler(EventType type, EventListener::HandlerFunc handler) {
- handlersMutex.lock();
- handlers[type] = handler;
- handlersMutex.unlock();
-}
-
-void EventListener::HandleEvent() {
- eventsMutex.lock();
- if (events.empty()) {
- eventsMutex.unlock();
- return;
- }
- Event event = events.front();
- events.pop();
- eventsMutex.unlock();
- handlersMutex.lock();
- auto function = handlers[event.type];
- handlersMutex.unlock();
- function(event.data);
-}
-
-
-void EventAgregator::RegisterListener(EventListener &listener) {
- listenersMutex.lock();
- //LOG(WARNING) << "Registered handler " << &listener;
- listeners.push_back(&listener);
- listenersMutex.unlock();
-}
-
-void EventAgregator::UnregisterListener(EventListener &listener) {
- listenersMutex.lock();
- //LOG(WARNING) << "Unregistered handler " << &listener;
- listeners.erase(std::find(listeners.begin(), listeners.end(), &listener));
- listenersMutex.unlock();
-}
-
-void EventAgregator::PushEvent(EventType type, EventData data) {
- Event event;
- event.type = type;
- event.data = data;
- queueMutex.lock();
- eventsToHandle.push(event);
- queueMutex.unlock();
- if (!isStarted) {
- isStarted = true;
- std::thread(&EventAgregator::EventHandlingLoop).detach();
- }
-}
-
-void EventAgregator::DirectEventCall(EventType type, EventData data)
-{
- Event event {type, data};
- listenersMutex.lock();
- for (auto &listener : listeners) {
- listenersMutex.unlock();
- listener->DirectCall(event);
- listenersMutex.lock();
- }
- listenersMutex.unlock();
-}
-
-void EventAgregator::EventHandlingLoop() {
- LoopExecutionTimeController timer(std::chrono::milliseconds(5));
- while (true) {
- queueMutex.lock();
- if (!eventsToHandle.empty()) {
- auto queue = std::move(eventsToHandle);
- queueMutex.unlock();
-
- while (!queue.empty()) {
- auto event = queue.front();
- listenersMutex.lock();
- for (auto &listener : listeners) {
- listener->PushEvent(event);
- }
- listenersMutex.unlock();
- queue.pop();
- }
-
- queueMutex.lock();
- }
- queueMutex.unlock();
- timer.Update();
- }
-} \ No newline at end of file
diff --git a/src/Event.hpp b/src/Event.hpp
index 4962ee9..3f59c93 100644
--- a/src/Event.hpp
+++ b/src/Event.hpp
@@ -1,243 +1,2 @@
#pragma once
-#include <queue>
-#include <map>
-#include <thread>
-#include <mutex>
-#include <variant>
-#include <functional>
-
-#include <SDL.h>
-
-#include "Vector.hpp"
-#include "Chat.hpp"
-
-class Packet;
-
-enum class EventType {
- Echo,
- ChunkChanged,
- ConnectToServer,
- ConnectionSuccessfull,
- Disconnect,
- RequestNetworkClient,
- RegisterNetworkClient,
- PlayerConnected,
- RemoveLoadingScreen,
- ConnectionFailed,
- Exit,
- Disconnected,
- Connecting,
- NetworkClientException,
- MouseMoved,
- KeyPressed,
- KeyReleased,
- InitalizeSectionRender,
- UpdateSectionsRender,
- CreateSectionRender,
- CreatedSectionRender,
- PlayerPosChanged,
- DeleteSectionRender,
- EntityChanged,
- NewRenderDataAvailable,
- BlockChange,
- RendererWorkerTask,
- ChunkDeleted,
- ChatMessageReceived,
- SendChatMessage,
- StateUpdated,
-};
-
-struct EchoData {
- std::chrono::time_point<std::chrono::high_resolution_clock> time;
-};
-
-struct ChunkChangedData {
- Vector chunkPosition;
-};
-
-struct ConnectToServerData {
- std::string username;
- std::string address;
- unsigned short port;
-};
-
-struct ConnectionSuccessfullData {
-};
-
-struct DisconnectData {
- std::string reason;
-};
-
-struct SendPacketData {
- std::shared_ptr<Packet> packet;
-};
-
-struct ReceivePacketData {
- std::shared_ptr<Packet> packet;
-};
-
-struct RequestNetworkClientData {
-
-};
-
-struct RegisterNetworkClientData {
-};
-
-struct PlayerConnectedData {
-};
-
-struct RemoveLoadingScreenData {
-
-};
-
-struct ConnectionFailedData {
- std::string reason;
-};
-
-struct ExitData {
-
-};
-
-struct DisconnectedData {
- std::string reason;
-};
-
-struct ConnectingData {
-
-};
-
-struct NetworkClientExceptionData {
- std::string what;
-};
-
-struct MouseMovedData {
- double x, y;
-};
-
-struct KeyPressedData {
- SDL_Scancode key;
-};
-
-struct KeyReleasedData {
- SDL_Scancode key;
-};
-
-struct InitalizeSectionRenderData {
- Vector pos;
-};
-
-struct CreateSectionRenderData {
- Vector pos;
-};
-
-struct CreatedSectionRenderData {
- Vector pos;
-};
-
-struct PlayerPosChangedData {
- VectorF newPos;
-};
-
-struct UpdateSectionsRenderData {
-
-};
-
-struct DeleteSectionRenderData {
- Vector pos;
-};
-
-struct EntityChangedData {
- unsigned int EntityId;
-};
-
-struct NewRenderDataAvailableData {
-
-};
-
-struct BlockChangeData {
- Vector SectionPos;
-};
-
-struct RendererWorkerTaskData {
- size_t WorkerId;
- Vector Task;
-};
-
-struct ChunkDeletedData {
- Vector pos;
-};
-
-struct ChatMessageReceivedData {
- Chat message;
- unsigned char position;
-};
-
-struct SendChatMessageData {
- std::string message;
-};
-
-struct StateUpdatedData {
-
-};
-
-using EventData = std::variant<EchoData, ChunkChangedData, ConnectToServerData, ConnectionSuccessfullData,
- DisconnectData, SendPacketData, ReceivePacketData, RequestNetworkClientData, RegisterNetworkClientData,
- PlayerConnectedData, RemoveLoadingScreenData, ConnectionFailedData, ExitData, DisconnectedData,
- ConnectingData, NetworkClientExceptionData, MouseMovedData, KeyPressedData, KeyReleasedData,
- InitalizeSectionRenderData, CreateSectionRenderData, CreatedSectionRenderData, PlayerPosChangedData,
- UpdateSectionsRenderData, DeleteSectionRenderData, EntityChangedData, NewRenderDataAvailableData,
- BlockChangeData, RendererWorkerTaskData, ChunkDeletedData, ChatMessageReceivedData,
- SendChatMessageData, StateUpdatedData>;
-
-struct Event {
- EventType type;
- EventData data;
-};
-
-class EventListener {
- friend class EventAgregator;
-
- using HandlerFunc = std::function<void(EventData)>;
-
- std::map<EventType, HandlerFunc> handlers; //TODO: There must be more elegant solution than std::variant of all data
-
- std::mutex handlersMutex;
-
- std::queue<Event> events;
-
- std::mutex eventsMutex;
-
- void PushEvent(Event event);
-
- void DirectCall(Event event);
-
-public:
- EventListener();
- ~EventListener();
- bool IsEventsQueueIsNotEmpty();
-
- void RegisterHandler(EventType type, HandlerFunc handler);
-
- void HandleEvent();
-};
-
-class EventAgregator {
- friend EventListener;
-
- EventAgregator() = default;
- static std::queue<Event> eventsToHandle;
- static std::mutex queueMutex;
- static bool isStarted;
- static std::vector<EventListener *> listeners;
- static std::mutex listenersMutex;
-
- static void EventHandlingLoop();
-
- static void RegisterListener(EventListener &listener);
- static void UnregisterListener(EventListener &listener);
-
-public:
- static void PushEvent(EventType type, EventData data);
- static void DirectEventCall(EventType, EventData data);
-}; \ No newline at end of file