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
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{
128public:
130 {
131 }
132
134 virtual void call(SoField* theField) = 0;
135
136private:
137 static void sensorCB(void * data, SoSensor* sensor) {
138 ((SoFieldSensorCallback*)data)->call(((SoFieldSensor*)sensor)->getAttachedField());
139 }
140};
141
143template<class Object, class Method>
145
146public:
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
159private:
160 Object* _object;
161 Method _method;
162};
163
165template<class Object, class Method>
166inline 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:77
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.
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.
SoFieldSensor(SoSensorCB *func, void *data)
Creation methods.
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.
SoField * getAttachedField() const
Returns the field that this sensor is sensing, or NULL if it is not attached to any 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.