Open Inventor Reference
SoFieldSensor.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (C) 2000 Silicon Graphics, Inc. All Rights Reserved.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * Further, this software is distributed without any warranty that it is
16  * free of the rightful claim of any third person regarding infringement
17  * or the like. Any license provided herein, whether implied or
18  * otherwise, applies only to this software file. Patent licenses, if
19  * any, provided herein do not apply to combinations of this program with
20  * other software, or any other product whatsoever.
21  *
22  * You should have received a copy of the GNU Lesser General Public
23  * License along with this library; if not, write to the Free Software
24  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25  *
26  * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
27  * Mountain View, CA 94043, or:
28  *
29  * http://www.sgi.com
30  *
31  * For further information regarding this notice, see:
32  *
33  * http://oss.sgi.com/projects/GenInfo/NoticeExplan/
34  *
35  */
36 
37 
38 /*
39  * Copyright (C) 1990,91,92 Silicon Graphics, Inc.
40  *
41  _______________________________________________________________________
42  ______________ S I L I C O N G R A P H I C S I N C . ____________
43  |
44  | $Revision: 1.1.1.1 $
45  |
46  | Description:
47  | Data sensor that is attached to a field in a node or elsewhere.
48  | The sensor is scheduled when a change is made to that field. Note:
49  | the field must be contained within a node or function, or
50  | attachment will not work.
51  |
52  | Author(s) : Paul Strauss
53  |
54  ______________ S I L I C O N G R A P H I C S I N C . ____________
55  _______________________________________________________________________
56  */
57 
58 #ifndef _SO_FIELD_SENSOR_
59 #define _SO_FIELD_SENSOR_
60 
62 
63 class SoFieldContainer;
64 
67 
79 
81 
82  public:
83 
89  SoFieldSensor(SoSensorCB *func, void *data);
90 
93  virtual ~SoFieldSensor();
94 
97  void attach(SoField *field);
98 
101  void detach();
102 
105  SoField * getAttachedField() const { return field; }
106 
107  SoINTERNAL public:
110  virtual void trigger();
111 
112  private:
113  SoField * field;
114 
118  virtual void notify(SoNotList *list);
119 
121  virtual void dyingReference();
122 };
123 
124 
127 {
128 public:
130  {
131  }
132 
134  virtual void call(SoField* theField) = 0;
135 
136 private:
137  static void sensorCB(void * data, SoSensor* sensor) {
138  ((SoFieldSensorCallback*)data)->call(((SoFieldSensor*)sensor)->getAttachedField());
139  }
140 };
141 
143 template<class Object, class Method>
145 
146 public:
147 
148  SoTypedFieldSensorCallback(Object* object, Method method) :
149  _object(object), _method(method)
150  {}
151 
153  {}
154 
155  virtual void call(SoField* theField) {
156  (_object->*_method)(theField);
157  }
158 
159 private:
160  Object* _object;
161  Method _method;
162 };
163 
165 template<class Object, class Method>
166 inline SoFieldSensor* SoCreateFieldSensor(Object* object, Method method, SoField& field)
167 {
168  SoFieldSensor* sensor = new SoTypedFieldSensorCallback<Object, Method>(object, method);
169  sensor->attach(&field);
170  return sensor;
171 }
172 
175 #define SO_NODE_ADD_FIELD_CALLBACK(field, method) \
176  this->addManagedSensor(SoCreateFieldSensor(this, &InventorThisClass::method, field));
177 
180 #define SO_NODE_ADD_FIELD_CALLBACK_WITH_PRIORITY(field, method, priority) \
181  { SoFieldSensor* invInternalSen = SoCreateFieldSensor(this, &InventorThisClass::method, field); \
182  invInternalSen->setPriority(priority); \
183  this->addManagedSensor(invInternalSen); \
184  }
185 
186 #endif /* _SO_FIELD_SENSOR_ */
#define SoINTERNAL
Definition: SbBasic.h:155
#define INVENTOR_API
Disable some annoying warnings on MSVC 6.
Definition: SbSystem.h:81
SoFieldSensor * SoCreateFieldSensor(Object *object, Method method, SoField &field)
Helper method to create a field sensor by type inference.
void SoSensorCB(void *data, SoSensor *sensor)
This typedef defines the calling sequence for all callbacks from sensors.
Definition: SoSensor.h:89
Abstract base class for sensors attached to parts of a scene.
Definition: SoDataSensor.h:93
virtual void dyingReference()=0
This is called when the base (path, field, node, whatever) is deleted.
virtual void notify(SoNotList *list)
Propagates modification notification through an instance.
Abstract base class for objects that contain fields.
Base class for typed field sensor callbacks.
virtual void call(SoField *theField)=0
called when the SoFieldSensor is triggered.
Sensor class that can be attached to Inventor fields.
Definition: SoFieldSensor.h:80
SoFieldSensor(SoSensorCB *func, void *data)
Creation methods.
SoField * getAttachedField() const
Returns the field that this sensor is sensing, or NULL if it is not attached to any field.
void detach()
Unschedules this sensor (if it is scheduled) and makes it ignore changes to the scene graph.
virtual void trigger()
Override trigger to evaluate the field we're connected to, just in case the trigger method doesn't ge...
virtual ~SoFieldSensor()
Destroys the sensor, freeing up any memory associated with it after unscheduling it.
void attach(SoField *field)
Makes this sensor detect changes to the given field.
SoFieldSensor()
Creation methods.
Base class for all fields.
Definition: SoField.h:185
Holds a list of SoNotRec notification records.
Abstract base class for Inventor sensors.
Definition: SoSensor.h:108
Typed field sensor that called given member function on object when triggered.
SoTypedFieldSensorCallback(Object *object, Method method)
virtual void call(SoField *theField)
called when the SoFieldSensor is triggered.