00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef VRS_SCENETHING_H
00021 #define VRS_SCENETHING_H
00022
00023 #include <vrs/scenenode.h>
00024 #include <vrs/bounds.h>
00025 #include <vrs/matrix.h>
00026
00027 #include <map>
00028 #include <vector>
00029
00030 namespace VRS {
00031
00032 class Engine;
00033 template<typename T> class DataIterator;
00034
00036 class VRS_CORE_API SceneThing : public SceneNode {
00037
00038 public:
00039 SceneThing(SceneThing* parent = NULL);
00049 virtual void append(SharedObj* obj);
00050 virtual void append(Iterator<SO<SharedObj> >* iter);
00051 virtual void prepend(SharedObj* obj);
00052 virtual void prepend(Iterator<SO<SharedObj> >* iter);
00053 virtual void insert(int position, SharedObj* obj);
00054 virtual void insert(int position, Iterator<SO<SharedObj> >* iter);
00055 virtual int replace(SharedObj* oldObj, SharedObj* newObj);
00056 virtual void remove(int position);
00057 virtual void remove(SharedObj* obj);
00058 virtual void clear();
00066 virtual void appendContent(SceneThing* obj);
00067 virtual void prependContent(SceneThing* obj);
00068 virtual void insertContent(int position,SceneThing* obj);
00072 virtual int objects() const;
00073 virtual SharedObj* object(int i) const;
00079 virtual bool contains(SharedObj* obj) const;
00080 virtual Iterator<SO<SharedObj> >* find(const ID& objClassName) const;
00081 virtual int find(SharedObj* obj, int startIndex = 0) const;
00091 void setFilter(unsigned int value);
00092 unsigned int getFilter() const;
00093 void setMask(SharedObj* obj, unsigned int value);
00094 void setMask(int position, unsigned int value);
00095 unsigned int getMask(SharedObj* obj) const;
00096 unsigned int getMask(int position) const;
00106 enum { ModelView=1, Projection=2, Orientation = 4, All=7 };
00107 void setWatching(int onOff);
00108 int getWatching() const;
00112 Matrix modelviewMatrix(Engine* engine) const;
00113 Matrix projectionMatrix(Engine* engine) const;
00114 Matrix orientationMatrix(Engine* engine) const;
00120 void setLocalMatrix(const Matrix& matrix);
00121 Matrix getLocalMatrix() const;
00125 virtual int childNodes() const;
00126 virtual SceneNode* childNode(int i) const;
00130 virtual void install(Engine* engine);
00131 virtual void deinstall(Engine* engine);
00136 virtual void evaluate(Engine* engine);
00138
00143 virtual SceneNodeVisitor::TraversalFlag traverse(SceneNodeVisitor* visitor);
00145 virtual Bounds boundingBox(Engine* engine) const;
00147
00148 VRS_TYPEINFO(SceneThing, SceneNode);
00149
00150 VRS_SERIALIZABLE(SceneThing);
00151
00152 protected:
00153 virtual bool accepts (const SharedObj*) const;
00157 int evaluateForward (Engine*, int from, int to);
00158 void evaluateBackward (Engine*, int from, int to);
00165 virtual void preEvaluate(Engine*);
00166 virtual void postEvaluate(Engine*);
00167 virtual SceneNodeVisitor::TraversalFlag preTraverse(SceneNodeVisitor*);
00168 virtual SceneNodeVisitor::TraversalFlag postTraverse(SceneNodeVisitor*);
00172 protected:
00173 virtual void acceptChildren(std::vector<Visitable*>& appendChildrenHere) const;
00174
00175 private:
00176 enum ObjectType {
00177 SCENENODE, MONOATTRIBUTE, POLYATTRIBUTE, SWITCH,
00178 TECHNIQUE, HANDLER, SHAPE, TRANSFORM, UNKNOWN
00179 };
00180
00181 enum ShaderEvalState {
00182 SHADER_EVAL, SHADER_BLOCK
00183 };
00184
00185
00186 SO<DataIterator<SO<SharedObj> > > objects_;
00187 SO<DataIterator<ObjectType> > objTypes_;
00188 SO<DataIterator<unsigned int> > objMasks_;
00189 std::vector<ShaderEvalState> objShaderState_;
00190 unsigned int filter_;
00191
00192 ObjectType getType(SharedObj*);
00193 VRS_SERIALIZABLE_CLASS_ENUM(ObjectType);
00194
00195 int watching_;
00196 mutable std::map<Engine*, Matrix> modelviewMatrix_;
00197 mutable std::map<Engine*, Matrix> projectionMatrix_;
00198 mutable std::map<Engine*, Matrix> orientationMatrix_;
00199
00200 Matrix localTf_;
00201 bool localTfFlag_;
00202 };
00203
00204 }
00205
00206 #endif // VRS_SCENETHING_H