#include "MemReleaserAbstractVisitor.h" #include "X3D_Scene.h" #include "X3DAbstractNode.h" #include "MemReleaserStateVariables.h" #include using namespace std; namespace X3DTK { MemReleaserAbstractVisitor::MemReleaserAbstractVisitor() : AbstractVisitor() { // Enter functions. define(Recorder::getEnterFunction(&MemReleaserAbstractVisitor::enterX3DAbstractNode)); // Walk on functions. define(Recorder::getWalkOnFunction(&MemReleaserAbstractVisitor::walkOnX3DAbstractNode)); // Leave functions. define(Recorder::getLeaveFunction(&MemReleaserAbstractVisitor::leaveX3DAbstractNode)); } void MemReleaserAbstractVisitor::enterX3DAbstractNode(X3DAbstractNode *N) { MemReleaserStateVariables *stateVariables = Singleton::getInstance(); // if here, then the parent has to be deleted. SFNode P = stateVariables->getParent(); if (P != 0) P->removeChild(N); if (N->getParentList().size() == 0) { stateVariables->addNodeToDelete(N); stateVariables->setDelete(true); } else stateVariables->setDelete(false); stateVariables->pushParent(N); } bool MemReleaserAbstractVisitor::walkOnX3DAbstractNode(X3DAbstractNode *, SFNode) { MemReleaserStateVariables *stateVariables = Singleton::getInstance(); return stateVariables->getDelete(); } void MemReleaserAbstractVisitor::leaveX3DAbstractNode(X3DAbstractNode *N) { MemReleaserStateVariables *stateVariables = Singleton::getInstance(); stateVariables->popParent(); if (!stateVariables->getDelete()) stateVariables->setDelete(true); } }