From d06251ce7f27c15a086125f92a4599f163d80555 Mon Sep 17 00:00:00 2001 From: Vulpovile Date: Thu, 16 Nov 2023 16:36:05 -0800 Subject: [PATCH] Finished signal service --- Blocks3D VS2003.vcproj | 3 + src/include/DataModelV3/DataModelInstance.h | 5 ++ src/include/DataModelV3/Instance.h | 2 + src/include/DataModelV3/SignalService.h | 15 ++-- src/include/SignalTypes.h | 13 ++++ src/source/DataModelV3/DataModelInstance.cpp | 7 ++ src/source/DataModelV3/InputService.cpp | 11 ++- src/source/DataModelV3/Instance.cpp | 5 ++ src/source/DataModelV3/SignalService.cpp | 73 +++++++++++++++++++- 9 files changed, 125 insertions(+), 9 deletions(-) create mode 100644 src/include/SignalTypes.h diff --git a/Blocks3D VS2003.vcproj b/Blocks3D VS2003.vcproj index 1722483..3a75a92 100644 --- a/Blocks3D VS2003.vcproj +++ b/Blocks3D VS2003.vcproj @@ -296,6 +296,9 @@ + + diff --git a/src/include/DataModelV3/DataModelInstance.h b/src/include/DataModelV3/DataModelInstance.h index 6b1f8be..68008f0 100644 --- a/src/include/DataModelV3/DataModelInstance.h +++ b/src/include/DataModelV3/DataModelInstance.h @@ -14,6 +14,8 @@ using namespace B3D; #include "SoundService.h" #include "LightingInstance.h" +#include "SignalService.h" + // Libraries //#include "rapidxml/rapidxml.hpp" namespace B3D { @@ -34,6 +36,7 @@ namespace B3D { // ThumbnailGeneratorInstance* getThumbnailGenerator(); SoundService* getSoundService(); LightingInstance* getLighting(); + SignalService * getSignalService(); std::string message; bool showMessage; @@ -57,6 +60,8 @@ namespace B3D { XplicitNgine* xplicitNgine; SoundService* soundService; LightingInstance* lightingInstance; + SignalService * signalService; + bool running; }; diff --git a/src/include/DataModelV3/Instance.h b/src/include/DataModelV3/Instance.h index edc5ee5..c51c02b 100644 --- a/src/include/DataModelV3/Instance.h +++ b/src/include/DataModelV3/Instance.h @@ -3,6 +3,7 @@ #include "Reflection/ReflectionDataTable.h" #include "Reflection/ReflectionProperty.h" #include +#include "SignalTypes.h" namespace B3D @@ -44,6 +45,7 @@ namespace B3D Reflection::ReflectionProperty name; bool canDelete; + virtual bool postMessage(SigMesg msgId, void* lParam, void* wParam); protected: //Constructor diff --git a/src/include/DataModelV3/SignalService.h b/src/include/DataModelV3/SignalService.h index 9e5f959..14f7c5d 100644 --- a/src/include/DataModelV3/SignalService.h +++ b/src/include/DataModelV3/SignalService.h @@ -1,19 +1,24 @@ #pragma once #include "Instance.h" +#include "SignalTypes.h" +#include + namespace B3D { - typedef unsigned short SigMesg; - const SigMesg OPT_DESTROY_LPARAM = 0x8000; - const SigMesg OPT_DESTROY_WPARAM = 0x4000; class SignalService : public Instance { public: SignalService(void); ~SignalService(void); - bool registerInstance(Instance * instance); + bool registerInstance(Instance * instance, SigMesg msgType); + bool revokeInstance(Instance * instance, SigMesg msgType); bool revokeInstance(Instance * instance); + void revokeType(SigMesg msgType); void revokeAll(); - void dispatchSignal(SigMesg& msgId, void* lParam, void* wParam); + bool postMessage(SigMesg msgId, void* lParam, void* wParam); + private: + static const SigMesg MSG_MASK = 0x3F; + std::set messengerTable[SignalService::MSG_LENGTH]; }; } \ No newline at end of file diff --git a/src/include/SignalTypes.h b/src/include/SignalTypes.h new file mode 100644 index 0000000..96de982 --- /dev/null +++ b/src/include/SignalTypes.h @@ -0,0 +1,13 @@ +#pragma once +namespace B3D{ + typedef unsigned char SigMesg; + + const SigMesg OPT_DESTROY_LPARAM = 0x80; + const SigMesg OPT_DESTROY_WPARAM = 0x40; + + const SigMesg MSG_MOUSECLICK = 0; + const SigMesg MSG_KEY_STATE = 1; + const SigMesg MSG_MOUSE_BUTTON_STATE = 2; + const SigMesg MSG_MOUSE_WHEEL_STEP = 3; + const SigMesg MSG_LENGTH = 4; +} \ No newline at end of file diff --git a/src/source/DataModelV3/DataModelInstance.cpp b/src/source/DataModelV3/DataModelInstance.cpp index 19d8e5b..b0a212b 100644 --- a/src/source/DataModelV3/DataModelInstance.cpp +++ b/src/source/DataModelV3/DataModelInstance.cpp @@ -19,6 +19,8 @@ DataModelInstance::DataModelInstance(void) : Instance("DataModel") selectionService = new SelectionService(); + signalService = new SignalService(); + //TODO change how property window is either passed or accessed //selectionService->setPropertyWindow(g_usableApp->_propWindow); showMessage = false; @@ -54,6 +56,11 @@ XplicitNgine * DataModelInstance::getEngine() return xplicitNgine; } +SignalService * DataModelInstance::getSignalService() +{ + return signalService; +} + void DataModelInstance::toggleRun() { running = !running; diff --git a/src/source/DataModelV3/InputService.cpp b/src/source/DataModelV3/InputService.cpp index eb1ce90..4e4e12c 100644 --- a/src/source/DataModelV3/InputService.cpp +++ b/src/source/DataModelV3/InputService.cpp @@ -1,4 +1,6 @@ #include "DataModelV3/InputService.h" +#include "DataModelV3/SignalService.h" +#include "DataModelV3/DataModelInstance.h" #include "win32Defines.h" using namespace B3D; @@ -41,13 +43,16 @@ void InputService::updateFocus(bool focus){ //Signal void InputService::signalKeyState(unsigned char keyCode, bool isDown){ - //TODO Signal Service + SignalService * signalService = this->parentDataModel->getSignalService(); + signalService->postMessage(MSG_KEY_STATE, (void*)keyCode, (void*)isDown); } void InputService::signalMouseButtonState(unsigned char button, bool isDown){ - //TODO Signal service + SignalService * signalService = this->parentDataModel->getSignalService(); + signalService->postMessage(MSG_MOUSE_BUTTON_STATE, (void*)button, (void*)isDown); } void InputService::signalMouseWheelState(int step){ - //TODO Signal service + SignalService * signalService = this->parentDataModel->getSignalService(); + signalService->postMessage(MSG_MOUSE_WHEEL_STEP, (void*)step, NULL); } //Targeting and mouse actions diff --git a/src/source/DataModelV3/Instance.cpp b/src/source/DataModelV3/Instance.cpp index 7a275b7..3092322 100644 --- a/src/source/DataModelV3/Instance.cpp +++ b/src/source/DataModelV3/Instance.cpp @@ -151,4 +151,9 @@ Instance* Instance::findFirstChild(std::string searchName) } } return NULL; +} + +bool Instance::postMessage(SigMesg msgId, void* lParam, void* wParam){ + //Consume + return false; } \ No newline at end of file diff --git a/src/source/DataModelV3/SignalService.cpp b/src/source/DataModelV3/SignalService.cpp index f3d6e35..dd353c8 100644 --- a/src/source/DataModelV3/SignalService.cpp +++ b/src/source/DataModelV3/SignalService.cpp @@ -1 +1,72 @@ -#include "DataModelV3/SignalService.h" \ No newline at end of file +#include "DataModelV3/SignalService.h" +using namespace B3D; + +SignalService::SignalService(void) : Instance() { + +} + +SignalService::~SignalService(void){ + +} + +bool SignalService::registerInstance(Instance * instance, SigMesg msgType){ + SigMesg maskedMessage = (msgType & MSG_MASK); + if(maskedMessage < MSG_LENGTH) + { + return this->messengerTable[maskedMessage].insert(instance).second; + } + //Perhaps throw error in the future + return false; +} + +bool SignalService::revokeInstance(Instance * instance, SigMesg msgType){ + SigMesg maskedMessage = (msgType & MSG_MASK); + if(maskedMessage < MSG_LENGTH) + { + this->messengerTable[maskedMessage].erase(instance); + return true; + } + return false; +} + +bool SignalService::revokeInstance(Instance * instance){ + for(SigMesg i = 0; i < MSG_LENGTH; i++) + { + this->messengerTable[i].erase(instance); + } + return true; +} + +void SignalService::revokeType(SigMesg msgType){ + SigMesg maskedMessage = (msgType & MSG_MASK); + if(maskedMessage < MSG_LENGTH) + { + this->messengerTable[maskedMessage].clear(); + } +} + +void SignalService::revokeAll(){ + for(SigMesg i = 0; i < MSG_LENGTH; i++) + { + this->messengerTable[i].clear(); + } +} + +bool SignalService::postMessage(SigMesg msgType, void* lParam, void* wParam){ + SigMesg maskedMessage = (msgType & MSG_MASK); + if(maskedMessage < MSG_LENGTH) + { + std::set::iterator itr; + for(itr = this->messengerTable[maskedMessage].begin(); itr != this->messengerTable[maskedMessage].end(); itr++) + { + if((*itr)->postMessage(msgType, lParam, wParam)) + break; + } + } + if(msgType & OPT_DESTROY_LPARAM) + delete lParam; + if(msgType & OPT_DESTROY_WPARAM) + delete wParam; + //There should be no signal service that posts messages to signal service!!! + return true; +} \ No newline at end of file