Szenengraph Basisklasse
← Szenengraph Implementierung | ● | Szenengraph Traversierung →
Die Implementieren aller Knoten basiert auf einer Basis-Klasse:
{
public:
//! ctor
lgl_Node() : children_()
{}
//! dtor
virtual ~lgl_Node()
{
for (unsigned int i=0; i<children_.size(); i++)
delete children_[i];
}
//! get the number of children of the node
unsigned int children() const
{
return(children_.size());
}
//! add a child node with a specific type
template <class T>
T *add(T *node)
{
if (lgl_Node *child=dynamic_cast<lgl_Node*>(node))
{
children_.push_back(node);
return(node);
}
return(NULL);
}
//! count all nodes
unsigned int countAll()
{
unsigned int count = 1;
for (unsigned int i=0; i<children_.size(); i++)
count += children_[i]->countAll();
return(count);
}
protected:
std::vector<lgl_Node*> children_; // dynamic array containing all children
};
Die Basis-Klasse enthält im Wesentlichen Methoden, um durch Hinzufügen von Knoten einen Graphen zu konstruieren.
Hinweis: Das gezeigte Schema funktioniert prinzipiell fĂĽr Bäume. Um auch vollwertige Graphen repräsentieren zu können, verwendet man im Allgemeinen anstelle von normalen Zeigern lgl_Node*, das Prinzip des sog. “ref-counting” in Form von Smart-Pointern std::unique_ptr<lgl_Node>. Dies wurde der Einfachheit halber hier weggelassen.
Alle Knoten wie Kamera-, Transformations- oder Geometrie-Knoten sind nun von dieser Basis-Klasse abgeleitet und spezialisieren diese hinsichtlich ihrer jeweiligen Aufgabe, sie erben aber alle Methoden und Instanzvariablen der Basis-Klasse, so dass sie wiederum Kinder enthalten können.
Bemerkung: Die Methode delete() ruft sich rekursiv auf (Tiefensuche bzw. Depth First Traversal), um jeweils auch alle dynamisch erzeugten Kinder zu löschen.
← Szenengraph Implementierung | ● | Szenengraph Traversierung →