H3D API  2.4.1
H3DHapticsDevice.h
Go to the documentation of this file.
1 // Copyright 2004-2019, SenseGraphics AB
3 //
4 // This file is part of H3D API.
5 //
6 // H3D API is free software; you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License as published by
8 // the Free Software Foundation; either version 2 of the License, or
9 // (at your option) any later version.
10 //
11 // H3D API is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 //
16 // You should have received a copy of the GNU General Public License
17 // along with H3D API; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 //
20 // A commercial license is also available. Please contact us at
21 // www.sensegraphics.com for more information.
22 //
23 //
27 //
29 #ifndef __H3DHAPTICSDEVICE_H__
30 #define __H3DHAPTICSDEVICE_H__
31 
32 // H3D includes
33 #include <H3D/FieldTemplates.h>
34 #include <H3D/SFNode.h>
35 #include <H3D/SFRotation.h>
36 #include <H3D/SFFloat.h>
37 #include <H3D/SFInt32.h>
38 #include <H3D/SFBool.h>
39 #include <H3D/SFString.h>
40 #include <H3D/SFMatrix4f.h>
41 #include <H3D/SFVec3f.h>
42 #include <H3D/MFVec3f.h>
43 #include <H3D/SFTime.h>
45 
46 // H3DUtil includes
47 #include <H3DUtil/Threads.h>
48 
49 // HAPI includes
50 #include <HAPI/HAPIHapticShape.h>
51 #include <HAPI/HAPIHapticsDevice.h>
52 #include <HAPI/HAPIForceEffect.h>
53 
54 
55 namespace H3D {
56 
68  class H3DAPI_API H3DHapticsDevice: public Node {
69  protected:
70  H3DUniquePtr< HAPI::HAPIHapticsDevice > hapi_device;
71 
72  public:
73 
74  typedef HAPI::HAPIHapticsDevice::ErrorCode ErrorCode;
75  typedef HAPI::HAPIHapticsDevice::DeviceState DeviceState;
76  typedef SFBool MainButton;
77  typedef SFBool SecondaryButton;
78 
80  typedef
82  DEPRECATED("SFMatrix4f", )
85 
87  typedef
89  DEPRECATED("SFRotation", )
92 
100  class H3DAPI_API TrackerPosition:
101  public TypedField< SFVec3f, Types< SFMatrix4f, SFVec3f > > {
102  protected:
103 
105  virtual void update() {
106  H3DHapticsDevice *hd = static_cast< H3DHapticsDevice *>(owner);
107  Matrix4f m;
108  if( hd->followViewpoint->getValue() ) {
109  m = hd->adjustedPositionCalibration->getValue();
110  }
111  else {
112  m = static_cast< SFMatrix4f * >( routes_in[0] )->getValue();
113  }
114  const Vec3f &d_pos =
115  static_cast< SFVec3f * >( routes_in[1] )->getValue();
116  value = m * d_pos;
117  }
118  };
119 
128  class H3DAPI_API TrackerVelocity:
129  public TypedField< SFVec3f, Types< SFMatrix4f, SFVec3f > > {
130 
132  virtual void update() {
133  H3DHapticsDevice *hd = static_cast< H3DHapticsDevice *>(owner);
134  Matrix4f m;
135  if( hd->followViewpoint->getValue() ) {
136  m = hd->adjustedPositionCalibration->getValue();
137  }
138  else {
139  m = static_cast< SFMatrix4f * >( routes_in[0] )->getValue();
140  }
141  const Vec3f &d_vel =
142  static_cast< SFVec3f * >( routes_in[1] )->getValue();
143 
144  value = m.getScaleRotationPart() * d_vel;
145  }
146  };
147 
155  class H3DAPI_API TrackerOrientation:
156  public TypedField< SFRotation, Types< SFRotation, SFRotation > > {
157  protected:
158 
159  virtual void update() {
160  H3DHapticsDevice *hd = static_cast< H3DHapticsDevice *>(owner);
161  Rotation cal;
162  if( hd->followViewpoint->getValue() ) {
163  cal = hd->adjustedOrnCalibration->getValue();
164  }
165  else {
166  cal =
167  static_cast< SFRotation * >( routes_in[0] )->getValue();
168  }
169 
170  const Rotation &d_orn =
171  static_cast< SFRotation * >( routes_in[1] )->getValue();
172  value = cal * d_orn;
173  }
174 
175  };
176 
186  class H3DAPI_API WeightedProxy:
187  public TypedField< SFVec3f, Types< SFVec3f, SFVec3f, SFFloat > > {
188  virtual void update() {
189  const Vec3f &proxy_pos =
190  static_cast< SFVec3f * >( routes_in[0] )->getValue();
191  const Vec3f &tracker_pos =
192  static_cast< SFVec3f * >( routes_in[1] )->getValue();
193  H3DFloat weighting =
194  static_cast< SFFloat * >( routes_in[2] )->getValue();
195  value = tracker_pos + weighting * ( proxy_pos - tracker_pos );
196  }
197  };
198 
202  class H3DAPI_API SFHapticsRendererNode:
203  public TypedSFNode< H3DHapticsRendererNode > {
204  virtual void onAdd( Node *n ) {
206  H3DHapticsRendererNode *renderer =
207  static_cast< H3DHapticsRendererNode * >( n );
208  H3DHapticsDevice *device =
209  static_cast< H3DHapticsDevice * >( getOwner() );
210  if( renderer && device->hapi_device.get() ) {
211  for( unsigned int i = 0; i < device->hapi_device->nrLayers(); ++i )
212  device->hapi_device->setHapticsRenderer(
213  renderer->getHapticsRenderer( i ), i );
214  }
215  }
216  virtual void onRemove( Node *n ) {
217  H3DHapticsRendererNode *renderer = static_cast< H3DHapticsRendererNode * >( n );
218  H3DHapticsDevice *device = static_cast< H3DHapticsDevice * >( getOwner() );
219  if( renderer && device->hapi_device.get() ) {
220  for( unsigned int i = 0; i < device->hapi_device->nrLayers(); ++i ) {
221  renderer->hapticsRendererRemoved( i );
222  device->hapi_device->setHapticsRenderer( NULL, i );
223  }
224  }
226  }
227 
228  };
229 
230 
233  class H3DAPI_API SetEnabled: public OnValueChangeSField< SFBool > {
234  virtual void onValueChange( const bool &v ) {
235  H3DHapticsDevice *hd =
236  static_cast< H3DHapticsDevice * >( getOwner() );
237  if( v ) hd->enableDevice();
238  else hd->disableDevice();
239  }
240  };
241 
243 
245  H3DHapticsDevice( Inst< SFVec3f > _devicePosition = 0,
246  Inst< SFRotation > _deviceOrientation = 0,
247  Inst< TrackerPosition > _trackerPosition = 0,
248  Inst< TrackerOrientation > _trackerOrientation = 0,
249  Inst< SFMatrix4f > _positionCalibration = 0,
250  Inst< SFRotation > _orientationCalibration = 0,
251  Inst< SFVec3f > _proxyPosition = 0,
252  Inst< WeightedProxy > _weightedProxyPosition = 0,
253  Inst< SFFloat > _proxyWeighting = 0,
254  Inst< SFBool > _mainButton = 0,
255  Inst< SFBool > _secondaryButton = 0,
256  Inst< SFInt32 > _buttons = 0,
257  Inst< SFVec3f > _force = 0,
258  Inst< SFVec3f > _torque = 0,
259  Inst< SFInt32 > _inputDOF = 0,
260  Inst< SFInt32 > _outputDOF = 0,
261  Inst< SFInt32 > _hapticsRate = 0,
262  Inst< SFInt32 > _desiredHapticsRate = 0,
263  Inst< SFNode > _stylus = 0,
264  Inst< SFHapticsRendererNode > _hapticsRenderer = 0,
265  Inst< MFVec3f > _proxyPositions = 0,
266  Inst< SFBool > _followViewpoint = 0,
267  Inst< SFVec3f > _deviceVelocity = 0,
268  Inst< TrackerVelocity > _trackerVelocity = 0,
269  #ifdef HAVE_PROFILER
270  Inst< SFString > _profiledResult = 0,
271  #endif
272  Inst< SFVec3f > _deviceAngularVelocity = 0,
273  Inst< TrackerAngularVelocity > _trackerAngularVelocity = 0
274  );
275 
277  virtual ~H3DHapticsDevice() {
278  releaseDevice();
279  }
280 
285  inline Vec3f getPreviousProxyPosition( unsigned int layer = 0 ) {
286  return previous_proxy_pos[layer];
287  }
288 
290  inline const vector< Vec3f > &getPreviousProxyPositions() {
291  return previous_proxy_pos;
292  }
293 
296  virtual string defaultXMLContainerField() {
297  return "device";
298  }
299 
301  inline HAPI::HAPIHapticsDevice *getHAPIDevice() {
302  return hapi_device.get();
303  }
304 
307  virtual ErrorCode initDevice();
308 
312  virtual ErrorCode releaseDevice();
313 
315  virtual ErrorCode enableDevice();
316 
319  virtual ErrorCode disableDevice();
320 
323  if( hapi_device.get() ) {
324  return hapi_device->getThread();
325  } else {
326  return NULL;
327  }
328  }
329 
334  virtual void postInit() {}
335 
339  virtual void updateDeviceValues();
340 
345  virtual void preRender() {}
346 
350  virtual void postRender() {}
351 
357  virtual void renderShapes( const HapticShapeVector &shapes,
358  unsigned int layer = 0 );
359 
361  virtual void renderStylus();
362 
367  virtual void renderEffects( const HapticEffectVector &effects );
368 
375  H3DUniquePtr< SFVec3f > devicePosition;
376 
383  H3DUniquePtr< SFRotation > deviceOrientation;
384 
390  H3DUniquePtr< TrackerPosition > trackerPosition;
391 #ifdef HAVE_PROFILER
392  H3DUniquePtr< SFString > profiledResult;
393 #endif
399  H3DUniquePtr< TrackerOrientation > trackerOrientation;
400 
407  H3DUniquePtr< SFMatrix4f > positionCalibration;
408 
411  H3DUniquePtr< SFMatrix4f > adjustedPositionCalibration;
412 
420  H3DUniquePtr< SFRotation > orientationCalibration;
421 
424  H3DUniquePtr< SFRotation > adjustedOrnCalibration;
425 
431  H3DUniquePtr< SFVec3f > proxyPosition;
432 
440  H3DUniquePtr< WeightedProxy > weightedProxyPosition;
441 
451  H3DUniquePtr< SFFloat > proxyWeighting;
452 
459  H3DUniquePtr< SFBool > mainButton;
460 
467  H3DUniquePtr< SFBool > secondaryButton;
468 
477  H3DUniquePtr< SFInt32 > buttons;
478 
485  H3DUniquePtr< SFVec3f > force;
486 
493  H3DUniquePtr< SFVec3f > torque;
494 
500  H3DUniquePtr< SFInt32 > inputDOF;
501 
507  H3DUniquePtr< SFInt32 > outputDOF;
508 
514  H3DUniquePtr< SFInt32 > hapticsRate;
515 
535  H3DUniquePtr< SFInt32 > desiredHapticsRate;
536 
545  H3DUniquePtr< SFTime > hapticsLoopTime;
546 
552  H3DUniquePtr< SFNode > stylus;
553 
562  H3DUniquePtr< SFBool > initialized;
563 
570  H3DUniquePtr< SFHapticsRendererNode > hapticsRenderer;
571 
578  H3DUniquePtr< MFVec3f > proxyPositions;
579 
587  H3DUniquePtr< SetEnabled > set_enabled;
588 
596  H3DUniquePtr< SFBool > enabled;
597 
604  H3DUniquePtr< SFBool > followViewpoint;
605 
612  H3DUniquePtr< SFVec3f > deviceVelocity;
613 
620  H3DUniquePtr< TrackerVelocity > trackerVelocity;
621 
630  H3DUniquePtr< SFFloat > forceLimit;
631 
639  H3DUniquePtr < SFFloat > forceScale;
640 
650  H3DUniquePtr< SFBool > deadmansSwitch;
651 
660  H3DUniquePtr< SFFloat > torqueLimit;
661 
664  protected:
665  vector< Vec3f > previous_proxy_pos;
666 
667  // int because traverseSG is not run for the viewpoint
668  // before the first call to updateDeviceValues
669  // Over 1 when a default_vp_pos is found.
670  int vp_initialized;
671 
672  // the position in global coordinates of the viewpoint which should
673  // be used as default reference if the haptic device should follow
674  // viewpoint movement.
675  Matrix4f default_vp_pos_mtx;
676  Vec3f default_vp_scaling;
677 
678  // the orientation in global coordinates of the viewpoint which should
679  // be used as default reference if the haptic device should follow
680  // viewpoint movement.
681  Matrix3f default_vp_orn_mtx;
682 
683  // The time of the last call to updateDeviceValues.
684  TimeStamp last_update_values;
685 
688 
689  HAPI::HAPIHapticsRenderer::Contacts last_contacts;
690 
691  bool error_msg_printed;
692 
693  // Used to set the haptics renderer for a layer.
694  void setHapticsRenderer( unsigned int layer );
695 
696  public:
704  class H3DAPI_API TrackerAngularVelocity:
705  public TypedField< SFVec3f, Types< SFRotation, SFVec3f > > {
706  protected:
707 
708  virtual void update() {
709  H3DHapticsDevice *hd = static_cast< H3DHapticsDevice *>(owner);
710  Rotation cal;
711  if( hd->followViewpoint->getValue() ) {
712  cal = hd->adjustedOrnCalibration->getValue();
713  } else {
714  cal = static_cast< SFRotation * >( routes_in[0] )->getValue();
715  }
716 
717  value = cal * static_cast< SFVec3f * >( routes_in[1] )->getValue();
718  }
719 
720  };
721 
729  H3DUniquePtr< SFVec3f > deviceAngularVelocity;
730 
738  H3DUniquePtr< TrackerAngularVelocity > trackerAngularVelocity;
739  };
740 }
741 
742 #endif
Contains different templates to modify field behaviour.
Header file for H3DHapticsRendererNode.
Contains the MFVec3f field class.
Contains the SFBool field class.
Contains the SFFloat field class.
Contains the SFInt32 field class.
Contains the SFMatrix4f field class.
Contains the SFNode class.
Contains the SFRotation field class.
Contains the SFString field class.
Contains the SFTime field class.
Contains the SFVec3f field class.
SFHapticsRendererNode extends TypedSFNode< H3DHapticsRendererNode > in order to change the haptics re...
Definition: H3DHapticsDevice.h:203
SetEnabled specializes SFBool to go into reset mode when a true event is received.
Definition: H3DHapticsDevice.h:233
The TrackerAngularVelocity field updates itself from the deviceAngularVelocity and orientationCalibra...
Definition: H3DHapticsDevice.h:705
virtual void update()
Make the field up to date given that an event has occured.
Definition: H3DHapticsDevice.h:708
The TrackerOrientation field updates itself from the deviceOrientation and orientationCalibration fie...
Definition: H3DHapticsDevice.h:156
virtual void update()
Make the field up to date given that an event has occured.
Definition: H3DHapticsDevice.h:159
The TrackerPosition field updates itself from the devicePosition and positionCalibration fields.
Definition: H3DHapticsDevice.h:101
virtual void update()
value = positionCalibration * devicePosition.
Definition: H3DHapticsDevice.h:105
The TrackerVelocity field updates itself from the deviceVelocity and positionCalibration fields.
Definition: H3DHapticsDevice.h:129
The WeightedProxy field updates to be a value between the proxy position and tracker position dependi...
Definition: H3DHapticsDevice.h:187
Base class for all haptic devices.
Definition: H3DHapticsDevice.h:68
H3DUniquePtr< SFFloat > proxyWeighting
The weighting between proxyPosition and trackerPosition when calculating weightedProxyPosition.
Definition: H3DHapticsDevice.h:451
H3DUniquePtr< TrackerAngularVelocity > trackerAngularVelocity
The angular velocity of the device in the world coordinates of the API.
Definition: H3DHapticsDevice.h:738
H3DUniquePtr< SFInt32 > desiredHapticsRate
The desired update rate of the servoloop of the H3DHapticsDevice.
Definition: H3DHapticsDevice.h:535
H3DUniquePtr< SFMatrix4f > positionCalibration
The calibration matrix between devicePosition and trackerPosition.
Definition: H3DHapticsDevice.h:407
H3DUniquePtr< SFBool > secondaryButton
The state of the secondary button (button 1).
Definition: H3DHapticsDevice.h:467
H3DUniquePtr< SFRotation > deviceOrientation
The orientation of the device given in the coordinate system of the device.
Definition: H3DHapticsDevice.h:383
H3DUniquePtr< SFBool > enabled
true if the device is enabled, e.g.
Definition: H3DHapticsDevice.h:596
H3DUniquePtr< SFTime > hapticsLoopTime
The time spent in the last haptics loop(in seconds) A value of -1 means that no haptics loop has been...
Definition: H3DHapticsDevice.h:545
static H3DNodeDatabase database
Node database entry.
Definition: H3DHapticsDevice.h:663
Vec3f getPreviousProxyPosition(unsigned int layer=0)
Get the proxy position from the previous loop for a certain layer.
Definition: H3DHapticsDevice.h:285
H3DUniquePtr< SFVec3f > torque
The approximation of the torque that has been rendered during the last scenegraph loop.
Definition: H3DHapticsDevice.h:493
H3DUniquePtr< SFVec3f > deviceVelocity
The velocity of the device in the coordinate system of the device.
Definition: H3DHapticsDevice.h:612
H3DUniquePtr< SFInt32 > buttons
The state of all buttons.
Definition: H3DHapticsDevice.h:477
H3DUniquePtr< SFRotation > orientationCalibration
The calibration rotation between deviceOrientation and trackerOrientation.
Definition: H3DHapticsDevice.h:420
virtual ErrorCode disableDevice()
Temporarily disable the device.
Definition: H3DHapticsDevice.cpp:218
H3DUniquePtr< MFVec3f > proxyPositions
The positions of the proxies for each layer used in haptic rendering(layer 0).
Definition: H3DHapticsDevice.h:578
H3DUniquePtr< SFBool > deadmansSwitch
This is an alternative operational safety mode.
Definition: H3DHapticsDevice.h:650
H3DUniquePtr< SFFloat > forceScale
Set the scaling of the output force.
Definition: H3DHapticsDevice.h:639
H3DUniquePtr< SFVec3f > proxyPosition
The position of the proxy used in the haptic rendering(layer 0).
Definition: H3DHapticsDevice.h:431
virtual void postInit()
This function is called for all devices in a DeviceInfo node for which the initDevice has been called...
Definition: H3DHapticsDevice.h:334
H3DUniquePtr< SFNode > stylus
The Node used as the visual representation of the stylus.
Definition: H3DHapticsDevice.h:552
H3DUniquePtr< SFInt32 > inputDOF
The degrees of freedom supported as input.
Definition: H3DHapticsDevice.h:500
virtual ErrorCode enableDevice()
Enable the device. Positions can be read and force can be sent.
Definition: H3DHapticsDevice.cpp:206
H3DUniquePtr< SFVec3f > deviceAngularVelocity
The angular velocity of the device in the coordinate system of the device.
Definition: H3DHapticsDevice.h:729
H3DUniquePtr< SFMatrix4f > adjustedPositionCalibration
The calibration matrix between devicePosition and trackerPosition adjusted with the movement of the v...
Definition: H3DHapticsDevice.h:411
H3DUniquePtr< SFRotation > adjustedOrnCalibration
The calibration rotation between deviceOrientation and trackerOrientation adjusted with the movement ...
Definition: H3DHapticsDevice.h:424
H3DUniquePtr< SFBool > followViewpoint
true if the device should follow the viewpoint.
Definition: H3DHapticsDevice.h:604
virtual string defaultXMLContainerField()
Returns the default xml containerField attribute value.
Definition: H3DHapticsDevice.h:296
HAPI::HAPIHapticsDevice * getHAPIDevice()
Get the HAPIHapticsDevice that is encapsulated by this node.
Definition: H3DHapticsDevice.h:301
H3DUniquePtr< SFFloat > torqueLimit
The maximum torque(in Nm) we want the device to render.
Definition: H3DHapticsDevice.h:660
H3DUniquePtr< SFVec3f > force
The approximation of the force that has been rendered during the last scenegraph loop.
Definition: H3DHapticsDevice.h:485
H3DUniquePtr< SetEnabled > set_enabled
Enable/disable the device.
Definition: H3DHapticsDevice.h:587
H3DUniquePtr< WeightedProxy > weightedProxyPosition
A weighted position between proxyPosition and trackerPosition.
Definition: H3DHapticsDevice.h:440
virtual void postRender()
This function is called at the end of each scenegraph loop after all calls to other HapticDevice func...
Definition: H3DHapticsDevice.h:350
H3DUniquePtr< SFBool > initialized
true if the device is initialized and ready for calls to updateDeviceValues() and renderObjects().
Definition: H3DHapticsDevice.h:562
H3DUniquePtr< SFInt32 > hapticsRate
The update rate of the servoloop of the H3DHapticsDevice.
Definition: H3DHapticsDevice.h:514
H3DUniquePtr< SFInt32 > outputDOF
The degrees of freedom supported as output, i.e.
Definition: H3DHapticsDevice.h:507
virtual void preRender()
This function is called at the start of each scenegraph loop before any calls to other HapticDevice f...
Definition: H3DHapticsDevice.h:345
virtual ~H3DHapticsDevice()
Destuctor.
Definition: H3DHapticsDevice.h:277
H3DUtil::PeriodicThreadBase * getThread()
Get the thread that is used to run this haptics device.
Definition: H3DHapticsDevice.h:322
TimeStamp last_effect_change
The time for the last call to the renderEffects function.
Definition: H3DHapticsDevice.h:687
H3DUniquePtr< SFVec3f > devicePosition
The position of the device given in the coordinate system of the device.
Definition: H3DHapticsDevice.h:375
H3DUniquePtr< SFFloat > forceLimit
The maximum force(in N) we want the device to render.
Definition: H3DHapticsDevice.h:630
H3DUniquePtr< SFBool > mainButton
The state of the main button(button 0).
Definition: H3DHapticsDevice.h:459
H3DUniquePtr< TrackerPosition > trackerPosition
The position of the device in the world coordinates of the API.
Definition: H3DHapticsDevice.h:390
H3DUniquePtr< TrackerOrientation > trackerOrientation
The orientation of the device in the world coordinates of the API.
Definition: H3DHapticsDevice.h:399
const vector< Vec3f > & getPreviousProxyPositions()
Get all previous proxy positions.
Definition: H3DHapticsDevice.h:290
H3DUniquePtr< SFHapticsRendererNode > hapticsRenderer
Specifies the haptics rendering algorithm to use to generate forces from geometric shapes.
Definition: H3DHapticsDevice.h:570
H3DUniquePtr< TrackerVelocity > trackerVelocity
The velocity of the device in the world coordinates of the API.
Definition: H3DHapticsDevice.h:620
Base class for all haptic renderers, i.e.
Definition: H3DHapticsRendererNode.h:44
virtual HAPI::HAPIHapticsRenderer * getHapticsRenderer(unsigned int layer)
Get the haptics renderer to use for a certain layer.
Definition: H3DHapticsRendererNode.h:53
virtual void hapticsRendererRemoved(unsigned int layer)
This function should only be called if the HAPI::HAPIHapticsRenderer obtained for the given layer is ...
Definition: H3DHapticsRendererNode.h:69
Node is the base class for all classes that can be part of the H3D scene-graph.
Definition: Node.h:46
Template for adding the virtual function onValueChange that can be overridden in subclasses in order ...
Definition: FieldTemplates.h:49
virtual void onRemove(Node *n)
This function will be called when the value of RefCountSField changes.
Definition: RefCountSField.h:176
The SFBool field contains a single boolean value.
Definition: SFBool.h:41
The SFFloat field contains one single-precision floating point number.
Definition: SFFloat.h:41
The SFMatrix4f field contains a Matrix4f.
Definition: SFMatrix4f.h:41
The SFRotation field contains one arbitrary Rotation.
Definition: SFRotation.h:41
The SFVec3f field contains a Vec3f.
Definition: SFVec3f.h:41
A template modifier class for adding type checking on the routes to any Field class.
Definition: TypedField.h:84
Template to make sure that the Node that is set in a SFNode is of a specified Node type.
Definition: SFNode.h:97
virtual void onAdd(Node *n)
We check that the type of the Node is of the correct type.
Definition: SFNode.h:108
Rotation()
float H3DFloat
Type getValue(const char *s, const char *&rest)
Function that reads characters from a char * and converts them to a given type.
Definition: X3DFieldConversion.h:134
H3D API namespace.
Definition: Anchor.h:38
The H3DNodeDatabase contains a mapping between a name of a Node and the constructor for the Node with...
Definition: H3DNodeDatabase.h:194
The Types template can be used in the RequiredArgTypes or OptionalArgTypes arguments of a TypedField ...
Definition: TypedFieldTypesTmpl.h:60