Computergrafik

Szenengraph Basisklasse

Szenengraph Implementierung | | Szenengraph Traversierung

Die Implementieren aller Knoten basiert auf einer Basis-Klasse:

class lgl_Node
{
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

Options: