// Computergraphik I // Prof. Dr. Juergen Doellner // Sommersemester 2001 // // Rahmenprogramm fuer Aufgabenzettel 8 #ifndef NODE_H #define NODE_H #include "attribute.h" #include "shape.h" // // Konstanten // // Maximale Anzahl an Attributen pro GroupNode static const unsigned int MAX_ATTRIBUTES = 20; // Maximale Anzahl an Kind-Knoten pro GroupNode static const unsigned int MAX_CHILD_NODES = 20; // // Node // class Node { public: // Wird zur Traversierung des Szenengraphen // aufgerufen. virtual void traverse() = 0; }; // // LeafNode // class LeafNode : public Node { public: LeafNode(Shape* shape); // Jeder Blatt-Knoten enthaelt genau ein Shape, // welches bei der Traversierung des Szenengraphen // gerendert wird (Shape::render()). virtual void traverse(); private: Shape* shape_; }; // // GroupNode // class GroupNode : public Node { public: GroupNode(); static GroupNode* GroupNode::shareNode(Node* nodeObject, int nCount, Attribute* attrTransform1 = NULL, Attribute* attrTransform2 = NULL); // Jeder Gruppen-Knoten kann maximal MAX_ATTRIBUTES-viele // Attribute und MAX_CHILD_NODES-viele Kind-Knoten aufnehmen. // Mit diesen Methoden koennen die Attribute ausgelesen und // gesetzt werden. Um ein Attribut zu entfernen schreibt man // an die entsprechende Stelle einen NULL-Zeiger. virtual Attribute* getAttribute(unsigned int index) const; virtual void setAttribute(unsigned int index, Attribute* attribute); // Mit diesen Methoden koennen die Kind-Knoten ausgelesen und // gesetzt werden. Um einen Kind-Knoten zu entfernen schreibt man // an die entsprechende Stelle einen NULL-Zeiger. virtual Node* getChildNode(unsigned int index) const; virtual void setChildNode(unsigned int index, Node* child); // Wird ein Gruppen-Knoten traversiert, so werden zuerst alle // enthaltenen Attribute in der angegebenen Reihenfolge gesetzt // (Attribute::set()). Dann werden alle Kind-Knoten traversiert // (Node::traverse()). Und anschliessend werden alle Attribute // wieder in umgekehrter Reihenfolge zurueckgenommen // (Attribute::unset()). virtual void traverse(); private: Attribute* attributes_[MAX_ATTRIBUTES]; Node* children_[MAX_CHILD_NODES]; }; #endif // NODE_H