#include "X3DRoute.h" #include "X3DAbstractNode.h" #include "X3D_Scene.h" #include #include using namespace std; namespace X3DTK { MFRoute X3DRoute::_routes = MFRoute(); X3DRoute::X3DRoute(X3DAbstractNode *A, const SFString &fromField, X3DMemberFunctor *a, X3DAbstractNode *B, const SFString &toField, X3DMemberFunctor *b) : _aNode(A), _fromField(fromField), _a(a), _bNode(B), _toField(toField), _b(b) { } X3DRoute::~X3DRoute() { } X3DRoute *X3DRoute::create(X3DAbstractNode *A, const SFString &a_name, X3DAbstractNode *B, const SFString &b_name) { SFString ra_name, rb_name; if (A != 0) ra_name = A->getType()->getEventOut(a_name); else { cx3d << "X3DRoute::make: invalid fromNode!" << std::endl; return 0; } if (B != 0) rb_name = B->getType()->getEventIn(b_name); else { cx3d << "X3DRoute::make: invalid toNode!" << std::endl; return 0; } if (ra_name == "") { cx3d << "X3DRoute::make: invalid fromField!" << std::endl; return 0; } if (rb_name == "") { cx3d << "X3DRoute::make: invalid toField!" << std::endl; return 0; } X3DMemberFunctor *a = A->getType()->getMemberFunctor(ra_name); X3DMemberFunctor *b = B->getType()->getMemberFunctor(rb_name); if (a == 0) { cx3d << "X3DRoute::make: invalid fromField!" << std::endl; return 0; } if (b == 0) { cx3d << "X3DRoute::make: invalid toField!" << std::endl; return 0; } if (a->getValueOf(A).getType() == b->getValueOf(B).getType()) { X3DRoute *r = new X3DRoute(A, a_name, a, B, b_name, b); _routes.push_back(r); return r; } else { cx3d << "X3DRoute::make: incompatible types!" << std::endl; return 0; } return 0; } void X3DRoute::loadScene(X3D::Scene *S, const MFRoute &routes) { S->setRoutes(routes); } bool X3DRoute::remove(X3DRoute *route) { MFRoute::iterator it = std::find(_routes.begin(), _routes.end(), route); if (it != _routes.end()) { delete *it; _routes.erase(it); return true; } return false; } }