OSG  3.4.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Callback.h
Go to the documentation of this file.
1 /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
2  *
3  * This library is open source and may be redistributed and/or modified under
4  * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5  * (at your option) any later version. The full license is in LICENSE file
6  * included with this distribution, and on the openscenegraph.org website.
7  *
8  * This library is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * OpenSceneGraph Public License for more details.
12 */
13 
14 #ifndef OSG_CALLBACK
15 #define OSG_CALLBACK 1
16 
17 #include <osg/Object>
18 #include <osg/UserDataContainer>
19 
20 namespace osg {
21 
22 
23 class OSG_EXPORT Callback : public virtual Object {
24 
25  public :
26 
28 
29  Callback(const Callback& cb,const CopyOp& copyop):
30  osg::Object(cb, copyop),
31  _nestedCallback(cb._nestedCallback) {}
32 
34 
42  virtual bool run(osg::Object* object, osg::Object* data)
43  {
44  return traverse(object, data);
45  }
46 
48  bool traverse(osg::Object* object, osg::Object* data);
49 
50  void setNestedCallback(osg::Callback* cb) { _nestedCallback = cb; }
51  osg::Callback* getNestedCallback() { return _nestedCallback.get(); }
52  const osg::Callback* getNestedCallback() const { return _nestedCallback.get(); }
53 
55  {
56  if (nc)
57  {
58  if (_nestedCallback.valid())
59  {
60  _nestedCallback->addNestedCallback(nc);
61  }
62  else
63  {
64  _nestedCallback = nc;
65  }
66  }
67  }
68 
70  {
71  if (nc)
72  {
73  if (_nestedCallback==nc)
74  {
75  ref_ptr<osg::Callback> new_nested_callback = _nestedCallback->getNestedCallback();
76  _nestedCallback->setNestedCallback(0);
77  _nestedCallback = new_nested_callback;
78  }
79  else if (_nestedCallback.valid())
80  {
81  _nestedCallback->removeNestedCallback(nc);
82  }
83  }
84  }
85 
86  protected:
87 
88  virtual ~Callback() {}
90 };
91 
92 typedef std::vector< osg::ref_ptr<osg::Object> > Parameters;
93 
95 class OSG_EXPORT CallbackObject : public virtual osg::Callback
96 {
97 public:
99  CallbackObject(const std::string& name) { setName(name); }
101  osg::Object(co, copyop),
102  osg::Callback(co,copyop) {}
103 
105 
106  virtual CallbackObject* asCallbackObject() { return this; }
107  virtual const CallbackObject* asCallbackObject() const { return this; }
108 
110  bool run(osg::Object* object, osg::Object* data);
111 
112  inline bool run(osg::Object* object) const
113  {
114  osg::Parameters inputParameters;
115  osg::Parameters outputParameters;
116  return run(object, inputParameters, outputParameters);
117  }
118 
119  virtual bool run(osg::Object* object, osg::Parameters& inputParameters, osg::Parameters& outputParameters) const;
120 
121 };
122 
124 inline CallbackObject* getCallbackObject(osg::Object* object, const std::string& name)
125 {
127  return udc ? dynamic_cast<osg::CallbackObject*>(udc->getUserObject(name)) : 0;
128 }
129 
130 
132 inline const CallbackObject* getCallbackObject(const osg::Object* object, const std::string& name)
133 {
134  const osg::UserDataContainer* udc = object->getUserDataContainer();
135  return udc ? dynamic_cast<const osg::CallbackObject*>(udc->getUserObject(name)) : 0;
136 }
137 
139 inline bool runNamedCallbackObjects(osg::Object* object, const std::string& name, osg::Parameters& inputParameters, osg::Parameters& outputParameters)
140 {
141  bool result = false;
143  if (udc)
144  {
145  for(unsigned int i = 0; i<udc->getNumUserObjects(); ++i)
146  {
147  osg::Object* obj = udc->getUserObject(i);
148  if (obj && obj->getName()==name)
149  {
150  osg::CallbackObject* co = dynamic_cast<osg::CallbackObject*>(obj);
151  if (co) result = co->run(object, inputParameters, outputParameters) | result;
152  }
153  }
154  }
155 
156  return result;
157 }
158 
159 
160 
161 // forward declare
162 class Node;
163 class NodeVisitor;
164 
165 
167 class OSG_EXPORT NodeCallback : public virtual Callback {
168 
169  public :
170 
171 
173 
174  NodeCallback(const NodeCallback& nc,const CopyOp& copyop):
175  Callback(nc,copyop) {}
176 
178 
180  virtual bool run(osg::Object* object, osg::Object* data);
181 
183  virtual void operator()(Node* node, NodeVisitor* nv);
184 
185  protected:
186 
187  virtual ~NodeCallback() {}
188 };
189 
190 // forward declare
191 class StateAttribute;
192 
195 {
196  public:
198 
200 
202 
204  virtual bool run(osg::Object* object, osg::Object* data);
205 
207  virtual void operator () (StateAttribute*, NodeVisitor*) {}
208 };
209 
210 // forward declare
211 class Uniform;
212 
215 {
216 public:
218 
220 
222 
224  virtual bool run(osg::Object* object, osg::Object* data);
225 
227  virtual void operator () (Uniform*, NodeVisitor*) {}
228 };
229 
230 
231 } // namespace
232 
233 #endif
234 
virtual const CallbackObject * asCallbackObject() const
Definition: Callback.h:107
#define OSG_EXPORT
Definition: Export.h:43
virtual CallbackObject * asCallbackObject()
Definition: Callback.h:106
CallbackObject * getCallbackObject(osg::Object *object, const std::string &name)
Definition: Callback.h:124
CallbackObject(const std::string &name)
Definition: Callback.h:99
bool run(osg::Object *object, osg::Object *data)
NodeCallback(const NodeCallback &nc, const CopyOp &copyop)
Definition: Callback.h:174
virtual ~NodeCallback()
Definition: Callback.h:187
std::vector< osg::ref_ptr< osg::Object > > Parameters
Definition: Callback.h:92
virtual ~Callback()
Definition: Callback.h:88
virtual Object * getUserObject(unsigned int i)=0
#define META_Object(library, name)
Definition: Object.h:42
virtual bool run(osg::Object *object, osg::Object *data)
Definition: Callback.h:42
const std::string & getName() const
Definition: Object.h:144
void setNestedCallback(osg::Callback *cb)
Definition: Callback.h:50
const osg::Callback * getNestedCallback() const
Definition: Callback.h:52
StateAttributeCallback(const StateAttributeCallback &, const CopyOp &)
Definition: Callback.h:199
osg::Callback * getNestedCallback()
Definition: Callback.h:51
bool runNamedCallbackObjects(osg::Object *object, const std::string &name, osg::Parameters &inputParameters, osg::Parameters &outputParameters)
Definition: Callback.h:139
void removeNestedCallback(osg::Callback *nc)
Definition: Callback.h:69
bool run(osg::Object *object) const
Definition: Callback.h:112
osg::UserDataContainer * getUserDataContainer()
Definition: Object.h:172
Definition: Node.h:71
Definition: AlphaFunc.h:19
UniformCallback(const UniformCallback &, const CopyOp &)
Definition: Callback.h:219
Callback(const Callback &cb, const CopyOp &copyop)
Definition: Callback.h:29
virtual unsigned int getNumUserObjects() const =0
void addNestedCallback(osg::Callback *nc)
Definition: Callback.h:54
ref_ptr< Callback > _nestedCallback
Definition: Callback.h:89
CallbackObject(const CallbackObject &co, const osg::CopyOp copyop=osg::CopyOp::SHALLOW_COPY)
Definition: Callback.h:100