1 // Computergraphik I
2 // Prof. Dr. Juergen Doellner
3 // Sommersemester 2001
4 //
5 // Rahmenprogramm fuer Aufgabenzettel 8
6
7 #ifndef NODE_H
8 #define NODE_H
9
10 #include "attribute.h"
11 #include "shape.h"
12
13 //
14 // Konstanten
15 //
16
17 // Maximale Anzahl an Attributen pro GroupNode
18 static const unsigned int MAX_ATTRIBUTES = 20;
19
20 // Maximale Anzahl an Kind-Knoten pro GroupNode
21 static const unsigned int MAX_CHILD_NODES = 20;
22
23 //
24 // Node
25 //
26
27 class Node {
28 public:
29 // Wird zur Traversierung des Szenengraphen
30 // aufgerufen.
31 virtual void traverse() = 0;
32 };
33
34 //
35 // LeafNode
36 //
37
38 class LeafNode : public Node {
39 public:
40 LeafNode(Shape* shape);
41 // Jeder Blatt-Knoten enthaelt genau ein Shape,
42 // welches bei der Traversierung des Szenengraphen
43 // gerendert wird (Shape::render()).
44
45 virtual void traverse();
46
47 private:
48 Shape* shape_;
49 };
50
51 //
52 // GroupNode
53 //
54
55 class GroupNode : public Node {
56 public:
57 GroupNode();
58
59 static GroupNode* GroupNode::shareNode(Node* nodeObject, int nCount,
60 Attribute* attrTransform1 = NULL, Attribute* attrTransform2 = NULL);
61
62 // Jeder Gruppen-Knoten kann maximal MAX_ATTRIBUTES-viele
63 // Attribute und MAX_CHILD_NODES-viele Kind-Knoten aufnehmen.
64
65 // Mit diesen Methoden koennen die Attribute ausgelesen und
66 // gesetzt werden. Um ein Attribut zu entfernen schreibt man
67 // an die entsprechende Stelle einen NULL-Zeiger.
68 virtual Attribute* getAttribute(unsigned int index) const;
69 virtual void setAttribute(unsigned int index, Attribute* attribute);
70
71 // Mit diesen Methoden koennen die Kind-Knoten ausgelesen und
72 // gesetzt werden. Um einen Kind-Knoten zu entfernen schreibt man
73 // an die entsprechende Stelle einen NULL-Zeiger.
74 virtual Node* getChildNode(unsigned int index) const;
75 virtual void setChildNode(unsigned int index, Node* child);
76
77 // Wird ein Gruppen-Knoten traversiert, so werden zuerst alle
78 // enthaltenen Attribute in der angegebenen Reihenfolge gesetzt
79 // (Attribute::set()). Dann werden alle Kind-Knoten traversiert
80 // (Node::traverse()). Und anschliessend werden alle Attribute
81 // wieder in umgekehrter Reihenfolge zurueckgenommen
82 // (Attribute::unset()).
83 virtual void traverse();
84
85 private:
86 Attribute* attributes_[MAX_ATTRIBUTES];
87 Node* children_[MAX_CHILD_NODES];
88 };
89
90 #endif // NODE_H
91
92