1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
#pragma once
#include "ilayer.h"
#include "imap.h"
namespace scene
{
class LayerValidityCheckWalker :
public NodeVisitor
{
private:
std::size_t _numFixed;
public:
LayerValidityCheckWalker() :
_numFixed(0)
{}
// scene::NodeVisitor
bool pre(const INodePtr& node)
{
if (ProcessNode(node))
{
_numFixed++;
}
return true;
}
// Returns true if the node has been "fixed"
static bool ProcessNode(const INodePtr& node)
{
auto rootNode = node->getRootNode();
if (!rootNode) return false;
LayerList list = node->getLayers(); // create a copy of the list
bool fixed = false;
for (auto id : list)
{
if (!rootNode->getLayerManager().layerExists(id))
{
node->removeFromLayer(id);
fixed = true;
}
}
return fixed;
}
std::size_t getNumFixed() const
{
return _numFixed;
}
};
}
|