buildat/src/impl/magic_event_handler.cpp

81 lines
2.2 KiB
C++

// http://www.apache.org/licenses/LICENSE-2.0
// Copyright 2014 Perttu Ahola <celeron55@gmail.com>
#include "interface/magic_event_handler.h"
#include "core/log.h"
#include <SceneEvents.h>
#include <PhysicsEvents.h>
#include <IOEvents.h>
#include <Node.h>
#include <Component.h>
#include <RigidBody.h>
#define ERASE_FIELD(name){\
event_data.Erase(#name);\
}
#define POINTER_TO_ID(type, name){\
type *pointer = static_cast<type*>(event_data[#name].GetVoidPtr());\
event_data[#name "ID"] = pointer->GetID();\
event_data.Erase(#name);\
}
namespace interface {
using namespace Urho3D;
void MagicEventHandler::on_event(StringHash event_type, VariantMap &event_data)
{
auto *evreg = interface::getGlobalEventRegistry();
if(log_get_max_level() >= CORE_DEBUG){
log_d(MODULE, "MagicEventHandler::on_event(): %s (%zu)",
cs(evreg->name(m_buildat_event_type)), m_buildat_event_type);
}
// Convert pointers to IDs because the event will be queued for later
// handling and pointers may become invalid. This operates like a
// whitelist because passing the pointers around is so unsafe it's
// going to cause way too much trouble.
if(event_type == E_LOGMESSAGE){
emit_event(event_type, event_data);
return;
}
if(event_type == E_NODEADDED || event_type == E_NODEREMOVED){
POINTER_TO_ID(Node, Parent);
POINTER_TO_ID(Node, Node);
emit_event(event_type, event_data);
return;
}
if(event_type == E_COMPONENTADDED || event_type == E_COMPONENTREMOVED){
POINTER_TO_ID(Node, Node);
POINTER_TO_ID(Component, Component);
emit_event(event_type, event_data);
return;
}
if(event_type == E_PHYSICSCOLLISIONSTART){
ERASE_FIELD(World);
POINTER_TO_ID(Node, NodeA);
POINTER_TO_ID(Node, NodeB);
POINTER_TO_ID(RigidBody, BodyA);
POINTER_TO_ID(RigidBody, BodyB);
emit_event(event_type, event_data);
return;
}
if(event_type == E_PHYSICSCOLLISION){
ERASE_FIELD(World);
POINTER_TO_ID(Node, NodeA);
POINTER_TO_ID(Node, NodeB);
POINTER_TO_ID(RigidBody, BodyA);
POINTER_TO_ID(RigidBody, BodyB);
emit_event(event_type, event_data);
return;
}
throw Exception(ss_()+"MagicEventHandler::on_event(): Urho3D event "
"not whitelisted: "+cs(evreg->name(m_buildat_event_type)));
}
}
// vim: set noet ts=4 sw=4: