group.H

Go to the documentation of this file.
00001 /*
00002  * This file is part of the "Archon" framework.
00003  * (http://files3d.sourceforge.net)
00004  *
00005  * Copyright © 2002 by Kristian Spangsege and Brian Kristiansen.
00006  *
00007  * Permission to use, copy, modify, and distribute this software and
00008  * its documentation under the terms of the GNU General Public License is
00009  * hereby granted. No representations are made about the suitability of
00010  * this software for any purpose. It is provided "as is" without express
00011  * or implied warranty. See the GNU General Public License
00012  * (http://www.gnu.org/copyleft/gpl.html) for more details.
00013  *
00014  * The characters in this file are ISO8859-1 encoded.
00015  *
00016  * The documentation in this file is in "Doxygen" style
00017  * (http://www.doxygen.org).
00018  */
00019 
00020 #ifndef ARCHON_X3D_GROUP_H
00021 #define ARCHON_X3D_GROUP_H
00022 
00029 #include <vector>
00030 #include <string>
00031 
00032 #include <archon/math/rotation.H>
00033 
00034 #include <archon/x3d/server/core.H>
00035 
00036 namespace Archon
00037 {
00038   namespace X3D
00039   {
00040     using namespace Math;
00041 
00042 
00046     struct BoundedObject: virtual NodeBase
00047     {
00048       static const NodeType *type;
00049 
00050       const Vector3 &getBboxCenter() const { return bboxCenter; }
00051       const Vector3 &getBboxSize() const { return bboxSize; }
00052 
00053     protected:
00054       BoundedObject():
00055         bboxCenter(0, 0, 0), bboxSize(-1, -1, -1) {}
00056 
00057     private:
00058       friend void initializeGroupComponent();
00059 
00060       Vector3 bboxCenter;
00061       Vector3 bboxSize;
00062     };
00063 
00064 
00068     struct GroupingNode: virtual ChildNode
00069     {
00070       static const NodeType *type;
00071       static const NodeSequenceFieldBase *childrenField;
00072 
00073       typedef vector<Ref<ChildNode> >::iterator       iterator;
00074       typedef vector<Ref<ChildNode> >::const_iterator const_iterator;
00075 
00076       iterator       begin()       { return children.begin(); }
00077       const_iterator begin() const { return children.begin(); }
00078       iterator       end()         { return children.end(); }
00079       const_iterator end()   const { return children.end(); }
00080 
00081     protected:
00082       GroupingNode() {}
00083 
00084     private:
00085       friend void initializeGroupComponent();
00086 
00087       vector<Ref<ChildNode> > children;
00088 
00089       EventSource childrenChanged;
00090 
00091       Time childrenStamp;
00092 
00093       bool addChildren(const vector<Ref<ChildNode> > &, const Time &);
00094       bool removeChildren(const vector<Ref<ChildNode> > &, const Time &);
00095     };
00096 
00097 
00101     struct Group: GroupingNode, BoundedObject
00102     {
00103       static Ref<NodeBase> instantiate(BackRef<ExecutionContext> c)
00104       {
00105         return new Group(c);
00106       }
00107 
00108       static const NodeType *type;
00109       const NodeType *getType() const { return type; }
00110 
00111       Group(BackRef<ExecutionContext> c): NodeBase(c) {}
00112 
00113       friend void initializeGroupComponent();
00114     };
00115 
00116 
00120     struct Switch: GroupingNode, BoundedObject
00121     {
00122       static Ref<NodeBase> instantiate(BackRef<ExecutionContext> c)
00123       {
00124         return new Switch(c);
00125       }
00126 
00127       static const NodeType *type;
00128       const NodeType *getType() const { return type; }
00129 
00130       Switch(BackRef<ExecutionContext> c): NodeBase(c), whichChoice(-1) {}
00131 
00132       int getWhichChoise() const { return whichChoice; }
00133 
00134     private:
00135       friend void initializeGroupComponent();
00136 
00137       int whichChoice;
00138 
00139       EventSource whichChoiceChanged;
00140 
00141       Time whichChoiceStamp;
00142     };
00143 
00144 
00148     struct Transform: GroupingNode, BoundedObject
00149     {
00150       static Ref<NodeBase> instantiate(BackRef<ExecutionContext> c)
00151       {
00152         return new Transform(c);
00153       }
00154 
00155       static const NodeType *type;
00156       const NodeType *getType() const { return type; }
00157 
00158       Transform(BackRef<ExecutionContext> c):
00159         NodeBase(c),
00160         center(0, 0, 0),
00161         rotation(Rotation3(Vector3(0, 0, 1), 0)),
00162         scale(1, 1, 1),
00163         scaleOrientation(Rotation3(Vector3(0, 0, 1), 0)),
00164         translation(0, 0, 0) {}
00165 
00166       const Vector3 &getCenter()             const { return center; }
00167       const Rotation3 &getRotation()         const { return rotation; }
00168       const Vector3 &getScale()              const { return scale; }
00169       const Rotation3 &getScaleOrientation() const { return scaleOrientation; }
00170       const Vector3 &getTranslation()        const { return translation; }
00171 
00172     private:
00173       friend void initializeGroupComponent();
00174 
00175       Vector3   center;
00176       Rotation3 rotation;
00177       Vector3   scale;
00178       Rotation3 scaleOrientation;
00179       Vector3   translation;
00180 
00181       EventSource centerChanged;
00182       EventSource rotationChanged;
00183       EventSource scaleChanged;
00184       EventSource scaleOrientationChanged;
00185       EventSource translationChanged;
00186 
00187       Time centerStamp;
00188       Time rotationStamp;
00189       Time scaleStamp;
00190       Time scaleOrientationStamp;
00191       Time translationStamp;
00192     };
00193   }
00194 }
00195 
00196 #endif // ARCHON_X3D_GROUP_H

Generated on Sun Jul 30 22:55:49 2006 for Archon by  doxygen 1.4.4