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