vrpn  07.33
Virtual Reality Peripheral Network
vrpn_ForceDevice.h
Go to the documentation of this file.
1 #ifndef FORCEDEVICE_H
2 #define FORCEDEVICE_H
3 
4 #include <stddef.h> // for NULL
5 
6 #include "vrpn_BaseClass.h" // for vrpn_Callback_List, etc
7 #include "vrpn_Configure.h" // for VRPN_CALLBACK, VRPN_API
8 #include "vrpn_Shared.h" // for timeval
9 #include "vrpn_Types.h" // for vrpn_int32, vrpn_float32, etc
10 
12 struct vrpn_HANDLERPARAM;
13 
14 #define MAXPLANE 4 // maximum number of planes in the scene
15 
16 // for recovery:
17 #define DEFAULT_NUM_REC_CYCLES (10)
18 
19 // possible values for errorCode:
20 #define FD_VALUE_OUT_OF_RANGE 0 // surface parameter out of range
21 #define FD_DUTY_CYCLE_ERROR 1 // servo loop is taking too long
22 #define FD_FORCE_ERROR 2 // max force exceeded, or motors overheated
23  // or amplifiers not enabled
24 #define FD_MISC_ERROR 3 // everything else
25 #define FD_OK 4 // no error
26 
27 // If defined, springs are implemented in the client as force fields.
28 // If not, springs are implemented with special messages
29 // and extra Ghost classes. Either way support for the messages
30 // is compiled into the parent class so that servers can support
31 // both kinds of clients.
32 
33 // (Springs as force fields require some knotty mathematical programming
34 // at the clients that I can't seem to get right, but avoid lots of
35 // extra message types and an awful lot of bug-prone Ghost.)
36 
37 #define FD_SPRINGS_AS_FIELDS
38 
40 
41 public:
42  vrpn_ForceDevice(const char *name, vrpn_Connection *c);
43  virtual ~vrpn_ForceDevice(void);
44 
45  void print_report(void);
46  void print_plane(void);
47 
48  void setSurfaceKspring(vrpn_float32 k) { SurfaceKspring = k; }
49  void setSurfaceKdamping(vrpn_float32 d) { SurfaceKdamping = d; }
50  void setSurfaceFstatic(vrpn_float32 ks) { SurfaceFstatic = ks; }
51  void setSurfaceFdynamic(vrpn_float32 kd) { SurfaceFdynamic = kd; }
52  void setRecoveryTime(int rt) { numRecCycles = rt; }
53 
54  // additional surface properties
55  void setSurfaceKadhesionNormal(vrpn_float32 k)
56  {
57  SurfaceKadhesionNormal = k;
58  }
59  void setSurfaceKadhesionLateral(vrpn_float32 k)
60  {
61  SurfaceKadhesionLateral = k;
62  }
63  void setSurfaceBuzzFrequency(vrpn_float32 freq) { SurfaceBuzzFreq = freq; }
64  void setSurfaceBuzzAmplitude(vrpn_float32 amp) { SurfaceBuzzAmp = amp; }
65  void setSurfaceTextureWavelength(vrpn_float32 wl)
66  {
67  SurfaceTextureWavelength = wl;
68  }
69  void setSurfaceTextureAmplitude(vrpn_float32 amp)
70  {
71  SurfaceTextureAmplitude = amp;
72  }
73 
74  void setCustomEffect(vrpn_int32 effectId, vrpn_float32 *params = NULL,
75  vrpn_uint32 nbParams = 0);
76 
77  void setFF_Origin(vrpn_float32 x, vrpn_float32 y, vrpn_float32 z)
78  {
79  ff_origin[0] = x;
80  ff_origin[1] = y;
81  ff_origin[2] = z;
82  }
83  void setFF_Origin(vrpn_float32 x[3])
84  {
85  ff_origin[0] = x[0];
86  ff_origin[1] = x[1];
87  ff_origin[2] = x[2];
88  }
89  void setFF_Force(vrpn_float32 fx, vrpn_float32 fy, vrpn_float32 fz)
90  {
91  ff_force[0] = fx;
92  ff_force[1] = fy;
93  ff_force[2] = fz;
94  }
95  void setFF_Force(vrpn_float32 f[3])
96  {
97  ff_force[0] = f[0];
98  ff_force[1] = f[1];
99  ff_force[2] = f[2];
100  }
101  void setFF_Jacobian(vrpn_float32 dfxdx, vrpn_float32 dfxdy,
102  vrpn_float32 dfxdz, vrpn_float32 dfydx,
103  vrpn_float32 dfydy, vrpn_float32 dfydz,
104  vrpn_float32 dfzdx, vrpn_float32 dfzdy,
105  vrpn_float32 dfzdz)
106  {
107  ff_jacobian[0][0] = dfxdx;
108  ff_jacobian[0][1] = dfxdy;
109  ff_jacobian[0][2] = dfxdz;
110  ff_jacobian[1][0] = dfydx;
111  ff_jacobian[1][1] = dfydy;
112  ff_jacobian[1][2] = dfydz;
113  ff_jacobian[2][0] = dfzdx;
114  ff_jacobian[2][1] = dfzdy;
115  ff_jacobian[2][2] = dfzdz;
116  }
117  void setFF_Radius(vrpn_float32 r) { ff_radius = r; }
118 
119  void set_plane(vrpn_float32 *p);
120  void set_plane(vrpn_float32 *p, vrpn_float32 d);
121  void set_plane(vrpn_float32 a, vrpn_float32 b, vrpn_float32 c,
122  vrpn_float32 d);
123 
124  void sendError(int error_code);
125 
126  int getRecoveryTime(void) { return numRecCycles; }
127  int connectionAvailable(void) { return (d_connection != NULL); }
128 
129  // constants for constraint messages
130 
135  PLANE_CONSTRAINT
136  };
137 
138 protected:
139  virtual int register_types(void);
140 
141  vrpn_int32 force_message_id; // ID of force message to connection
142  vrpn_int32 plane_message_id; // ID of plane equation message
143  vrpn_int32 plane_effects_message_id; // additional plane properties
144  vrpn_int32 forcefield_message_id; // ID of force field message
145  vrpn_int32 scp_message_id; // ID of surface contact point message
146 
147  // constraint messages
148 
157  // vrpn_int32 set_constraint_message_id;// ID of constraint force message
158 
159  // XXX - error messages should be put into the vrpn base class
160  // whenever someone makes one
161 
162  vrpn_int32 error_message_id; // ID of force device error message
163 
164  // IDs for trimesh messages
165 
181 
182  // IDs for scene messages
188 
189  // ajout ONDIM
191  // fni ajout ONDIM
192 
193  // ENCODING
194  // ajout ONDIM
195  static char *encode_custom_effect(vrpn_int32 &len, vrpn_uint32 effectId,
196  const vrpn_float32 *params,
197  vrpn_uint32 nbParams);
198  // fin ajout ONDIM
199  static char *encode_force(vrpn_int32 &length, const vrpn_float64 *force);
200  static char *encode_scp(vrpn_int32 &length, const vrpn_float64 *pos,
201  const vrpn_float64 *quat);
202  static char *encode_plane(vrpn_int32 &length, const vrpn_float32 *plane,
203  const vrpn_float32 kspring,
204  const vrpn_float32 kdamp, const vrpn_float32 fdyn,
205  const vrpn_float32 fstat,
206  const vrpn_int32 plane_index,
207  const vrpn_int32 n_rec_cycles);
208  static char *encode_surface_effects(vrpn_int32 &len,
209  const vrpn_float32 k_adhesion_norm,
210  const vrpn_float32 k_adhesion_lat,
211  const vrpn_float32 tex_amp,
212  const vrpn_float32 tex_wl,
213  const vrpn_float32 buzz_amp,
214  const vrpn_float32 buzz_freq);
215  static char *encode_vertex(vrpn_int32 &len, const vrpn_int32 objNum,
216  const vrpn_int32 vertNum, const vrpn_float32 x,
217  const vrpn_float32 y, const vrpn_float32 z);
218  static char *encode_normal(vrpn_int32 &len, const vrpn_int32 objNum,
219  const vrpn_int32 vertNum, const vrpn_float32 x,
220  const vrpn_float32 y, const vrpn_float32 z);
221  static char *encode_triangle(vrpn_int32 &len, const vrpn_int32 objNum,
222  const vrpn_int32 triNum,
223  const vrpn_int32 vert0, const vrpn_int32 vert1,
224  const vrpn_int32 vert2, const vrpn_int32 norm0,
225  const vrpn_int32 norm1,
226  const vrpn_int32 norm2);
227  static char *encode_removeTriangle(vrpn_int32 &len, const vrpn_int32 objNum,
228  const vrpn_int32 triNum);
229  static char *encode_updateTrimeshChanges(vrpn_int32 &len,
230  const vrpn_int32 objNum,
231  const vrpn_float32 kspring,
232  const vrpn_float32 kdamp,
233  const vrpn_float32 fdyn,
234  const vrpn_float32 fstat);
235  static char *encode_setTrimeshType(vrpn_int32 &len, const vrpn_int32 objNum,
236  const vrpn_int32 type);
237  static char *encode_trimeshTransform(vrpn_int32 &len,
238  const vrpn_int32 objNum,
239  const vrpn_float32 homMatrix[16]);
240 
241  //*added encodes*//
242  static char *encode_addObject(vrpn_int32 &len, const vrpn_int32 objNum,
243  const vrpn_int32 ParentNum);
244  static char *encode_addObjectExScene(vrpn_int32 &len,
245  const vrpn_int32 objNum);
246  static char *encode_objectPosition(vrpn_int32 &len, const vrpn_int32 objNum,
247  const vrpn_float32 Pos[3]);
248  static char *encode_objectOrientation(vrpn_int32 &len,
249  const vrpn_int32 objNum,
250  const vrpn_float32 axis[3],
251  const vrpn_float32 angle);
252  static char *encode_objectScale(vrpn_int32 &len, const vrpn_int32 objNum,
253  const vrpn_float32 Scale[3]);
254  static char *encode_removeObject(vrpn_int32 &len, const vrpn_int32 objNum);
255  static char *encode_clearTrimesh(vrpn_int32 &len, const vrpn_int32 objNum);
256  static char *encode_moveToParent(vrpn_int32 &len, const vrpn_int32 objNum,
257  const vrpn_int32 parentNum);
258 
259  static char *encode_setHapticOrigin(vrpn_int32 &len,
260  const vrpn_float32 Pos[3],
261  const vrpn_float32 axis[3],
262  const vrpn_float32 angle);
263  static char *encode_setSceneOrigin(vrpn_int32 &len,
264  const vrpn_float32 Pos[3],
265  const vrpn_float32 axis[3],
266  const vrpn_float32 angle);
267  static char *encode_setHapticScale(vrpn_int32 &len,
268  const vrpn_float32 Scale);
269  static char *encode_setObjectIsTouchable(vrpn_int32 &len,
270  const vrpn_int32 objNum,
271  const vrpn_bool isTouchable);
272 
273  static char *encode_forcefield(vrpn_int32 &len,
274  const vrpn_float32 origin[3],
275  const vrpn_float32 force[3],
276  const vrpn_float32 jacobian[3][3],
277  const vrpn_float32 radius);
278  static char *encode_error(vrpn_int32 &len, const vrpn_int32 error_code);
279 
280  // DECODING
281  // ajout ONDIM
282  static vrpn_int32 decode_custom_effect(const char *buffer,
283  const vrpn_int32 len,
284  vrpn_uint32 *effectId,
285  vrpn_float32 **params,
286  vrpn_uint32 *nbParams);
287  // fin ajout ONDIM
288  static vrpn_int32 decode_force(const char *buffer, const vrpn_int32 len,
289  vrpn_float64 *force);
290  static vrpn_int32 decode_scp(const char *buffer, const vrpn_int32 len,
291  vrpn_float64 *pos, vrpn_float64 *quat);
292  static vrpn_int32 decode_plane(const char *buffer, const vrpn_int32 len,
293  vrpn_float32 *plane, vrpn_float32 *kspring,
294  vrpn_float32 *kdamp, vrpn_float32 *fdyn,
295  vrpn_float32 *fstat, vrpn_int32 *plane_index,
296  vrpn_int32 *n_rec_cycles);
297  static vrpn_int32 decode_surface_effects(
298  const char *buffer, const vrpn_int32 len, vrpn_float32 *k_adhesion_norm,
299  vrpn_float32 *k_adhesion_lat, vrpn_float32 *tex_amp,
300  vrpn_float32 *tex_wl, vrpn_float32 *buzz_amp, vrpn_float32 *buzz_freq);
301  static vrpn_int32 decode_vertex(const char *buffer, const vrpn_int32 len,
302  vrpn_int32 *objNum, vrpn_int32 *vertNum,
303  vrpn_float32 *x, vrpn_float32 *y,
304  vrpn_float32 *z);
305  static vrpn_int32 decode_normal(const char *buffer, const vrpn_int32 len,
306  vrpn_int32 *objNum, vrpn_int32 *vertNum,
307  vrpn_float32 *x, vrpn_float32 *y,
308  vrpn_float32 *z);
309  static vrpn_int32 decode_triangle(const char *buffer, const vrpn_int32 len,
310  vrpn_int32 *objNum, vrpn_int32 *triNum,
311  vrpn_int32 *vert0, vrpn_int32 *vert1,
312  vrpn_int32 *vert2, vrpn_int32 *norm0,
313  vrpn_int32 *norm1, vrpn_int32 *norm2);
314  static vrpn_int32 decode_removeTriangle(const char *buffer,
315  const vrpn_int32 len,
316  vrpn_int32 *objNum,
317  vrpn_int32 *triNum);
318  static vrpn_int32
319  decode_updateTrimeshChanges(const char *buffer, const vrpn_int32 len,
320  vrpn_int32 *objNum, vrpn_float32 *kspring,
321  vrpn_float32 *kdamp, vrpn_float32 *fdyn,
322  vrpn_float32 *fstat);
323  static vrpn_int32 decode_setTrimeshType(const char *buffer,
324  const vrpn_int32 len,
325  vrpn_int32 *objNum,
326  vrpn_int32 *type);
327  static vrpn_int32 decode_trimeshTransform(const char *buffer,
328  const vrpn_int32 len,
329  vrpn_int32 *objNum,
330  vrpn_float32 homMatrix[16]);
331 
332  //*added decodes*//
333  static vrpn_int32 decode_addObject(const char *buffer, vrpn_int32 len,
334  vrpn_int32 *objNum,
335  vrpn_int32 *ParentNum);
336  static vrpn_int32 decode_addObjectExScene(const char *buffer,
337  vrpn_int32 len,
338  vrpn_int32 *objNum);
339  static vrpn_int32 decode_objectPosition(const char *buffer, vrpn_int32 len,
340  vrpn_int32 *objNum,
341  vrpn_float32 Pos[3]);
342  static vrpn_int32 decode_objectOrientation(const char *buffer,
343  vrpn_int32 len,
344  vrpn_int32 *objNum,
345  vrpn_float32 axis[3],
346  vrpn_float32 *angle);
347  static vrpn_int32 decode_objectScale(const char *buffer, vrpn_int32 len,
348  vrpn_int32 *objNum,
349  vrpn_float32 Scale[3]);
350  static vrpn_int32 decode_removeObject(const char *buffer, vrpn_int32 len,
351  vrpn_int32 *objNum);
352  static vrpn_int32 decode_clearTrimesh(const char *buffer, vrpn_int32 len,
353  vrpn_int32 *objNum);
354  static vrpn_int32 decode_moveToParent(const char *buffer, vrpn_int32 len,
355  vrpn_int32 *objNum,
356  vrpn_int32 *parentNum);
357 
358  static vrpn_int32 decode_setHapticOrigin(const char *buffer, vrpn_int32 len,
359  vrpn_float32 Pos[3],
360  vrpn_float32 axis[3],
361  vrpn_float32 *angle);
362  static vrpn_int32 decode_setHapticScale(const char *buffer, vrpn_int32 len,
363  vrpn_float32 *Scale);
364  static vrpn_int32 decode_setSceneOrigin(const char *buffer, vrpn_int32 len,
365  vrpn_float32 Pos[3],
366  vrpn_float32 axis[3],
367  vrpn_float32 *angle);
368  static vrpn_int32 decode_setObjectIsTouchable(const char *buffer,
369  vrpn_int32 len,
370  vrpn_int32 *objNum,
371  vrpn_bool *isTouchable);
372 
373  static vrpn_int32
374  decode_forcefield(const char *buffer, const vrpn_int32 len,
375  vrpn_float32 origin[3], vrpn_float32 force[3],
376  vrpn_float32 jacobian[3][3], vrpn_float32 *radius);
377  static vrpn_int32 decode_error(const char *buffer, const vrpn_int32 len,
378  vrpn_int32 *error_code);
379 
380  // constraint encoding & decoding
381 
382  static char *encode_enableConstraint(vrpn_int32 &len, vrpn_int32 enable);
383  static vrpn_int32 decode_enableConstraint(const char *buffer,
384  const vrpn_int32 len,
385  vrpn_int32 *enable);
386 
387  static char *encode_setConstraintMode(vrpn_int32 &len,
388  ConstraintGeometry mode);
389  static vrpn_int32 decode_setConstraintMode(const char *buffer,
390  const vrpn_int32 len,
391  ConstraintGeometry *mode);
392 
393  static char *encode_setConstraintPoint(vrpn_int32 &len, vrpn_float32 x,
394  vrpn_float32 y, vrpn_float32 z);
395  static vrpn_int32 decode_setConstraintPoint(const char *buffer,
396  const vrpn_int32 len,
397  vrpn_float32 *x,
398  vrpn_float32 *y,
399  vrpn_float32 *z);
400 
401  static char *encode_setConstraintLinePoint(vrpn_int32 &len, vrpn_float32 x,
402  vrpn_float32 y, vrpn_float32 z);
403  static vrpn_int32 decode_setConstraintLinePoint(const char *buffer,
404  const vrpn_int32 len,
405  vrpn_float32 *x,
406  vrpn_float32 *y,
407  vrpn_float32 *z);
408 
409  static char *encode_setConstraintLineDirection(vrpn_int32 &len,
410  vrpn_float32 x,
411  vrpn_float32 y,
412  vrpn_float32 z);
413  static vrpn_int32 decode_setConstraintLineDirection(const char *buffer,
414  const vrpn_int32 len,
415  vrpn_float32 *x,
416  vrpn_float32 *y,
417  vrpn_float32 *z);
418 
419  static char *encode_setConstraintPlanePoint(vrpn_int32 &len, vrpn_float32 x,
420  vrpn_float32 y, vrpn_float32 z);
421  static vrpn_int32 decode_setConstraintPlanePoint(const char *buffer,
422  const vrpn_int32 len,
423  vrpn_float32 *x,
424  vrpn_float32 *y,
425  vrpn_float32 *z);
426 
427  static char *encode_setConstraintPlaneNormal(vrpn_int32 &len,
428  vrpn_float32 x, vrpn_float32 y,
429  vrpn_float32 z);
430  static vrpn_int32 decode_setConstraintPlaneNormal(const char *buffer,
431  const vrpn_int32 len,
432  vrpn_float32 *x,
433  vrpn_float32 *y,
434  vrpn_float32 *z);
435 
436  static char *encode_setConstraintKSpring(vrpn_int32 &len, vrpn_float32 k);
437  static vrpn_int32 decode_setConstraintKSpring(const char *buffer,
438  const vrpn_int32 len,
439  vrpn_float32 *k);
440 
441  // utility functions
442 
443  static char *encodePoint(vrpn_int32 &len, vrpn_float32 x, vrpn_float32 y,
444  vrpn_float32 z);
445  static vrpn_int32 decodePoint(const char *buffer, const vrpn_int32 len,
446  vrpn_float32 *x, vrpn_float32 *y,
447  vrpn_float32 *z);
448 
449  struct timeval timestamp;
450 
451  vrpn_int32 which_plane;
452 
453  vrpn_float64 d_force[3];
456 
457  vrpn_float64 scp_pos[3];
458  vrpn_float64 scp_quat[4]; // for torque
459  vrpn_float32 plane[4];
460 
461  vrpn_float32 ff_origin[3];
462  vrpn_float32 ff_force[3];
463  vrpn_float32 ff_jacobian[3][3]; // J[i][j] = dF[i]/dx[j]
464  vrpn_float32 ff_radius;
465 
466  vrpn_float32 SurfaceKspring;
467  vrpn_float32 SurfaceKdamping;
468  vrpn_float32 SurfaceFstatic;
469  vrpn_float32 SurfaceFdynamic;
470  vrpn_int32 numRecCycles;
471  vrpn_int32 errorCode;
472 
475  vrpn_float32 SurfaceBuzzFreq;
476  vrpn_float32 SurfaceBuzzAmp;
479 
480  // ajout ONDIM
481  vrpn_int32 customEffectId;
482  vrpn_float32 *customEffectParams;
483  vrpn_uint32 nbCustomEffectParams;
484  // fin ajout ONDIM
485 };
486 
487 // User routine to handle position reports for surface contact point (SCP)
488 // This is in vrpn_ForceDevice rather than vrpn_Tracker because only
489 // a force feedback device should know anything about SCPs as this is a
490 // part of the force feedback model. It may be preferable to use the SCP
491 // rather than the tracker position for graphics so the hand position
492 // doesn't appear to go below the surface making the surface look very
493 // compliant.
494 typedef struct _vrpn_FORCESCPCB {
495  struct timeval msg_time; // Time of the report
496  vrpn_float64 pos[3]; // position of SCP
497  vrpn_float64 quat[4]; // orientation of SCP
499 typedef void(VRPN_CALLBACK *vrpn_FORCESCPHANDLER)(void *userdata,
500  const vrpn_FORCESCPCB info);
501 
502 typedef struct _vrpn_FORCECB {
503  struct timeval msg_time; // Time of the report
504  vrpn_float64 force[3]; // force value
505 } vrpn_FORCECB;
506 typedef void(VRPN_CALLBACK *vrpn_FORCECHANGEHANDLER)(void *userdata,
507  const vrpn_FORCECB info);
508 
509 typedef struct _vrpn_FORCEERRORCB {
510  struct timeval msg_time; // time of the report
511  vrpn_int32 error_code; // type of error
514  void *userdata, const vrpn_FORCEERRORCB info);
515 
517 public:
518  // The name of the force device to connect to.
519  // The connection argument is used only if you already have a connection
520  // the device must listen on (it is not normally used).
521  vrpn_ForceDevice_Remote(const char *name, vrpn_Connection *cn = NULL);
522  virtual ~vrpn_ForceDevice_Remote(void);
523 
524  void sendSurface(void);
525  void startSurface(void);
526  void stopSurface(void);
527 
530  // vertNum normNum and triNum start at 0
531  void setVertex(vrpn_int32 vertNum, vrpn_float32 x, vrpn_float32 y,
532  vrpn_float32 z);
533  // NOTE: ghost doesn't take normals,
534  // and normals still aren't implemented for Hcollide
535  void setNormal(vrpn_int32 normNum, vrpn_float32 x, vrpn_float32 y,
536  vrpn_float32 z);
537  void setTriangle(vrpn_int32 triNum, vrpn_int32 vert0, vrpn_int32 vert1,
538  vrpn_int32 vert2, vrpn_int32 norm0 = -1,
539  vrpn_int32 norm1 = -1, vrpn_int32 norm2 = -1);
540  void removeTriangle(vrpn_int32 triNum);
541  // should be called to incorporate the above changes into the
542  // displayed trimesh
543  void updateTrimeshChanges();
544  // set the trimesh's homogen transform matrix (in row major order)
545  void setTrimeshTransform(vrpn_float32 homMatrix[16]);
546  void clearTrimesh(void);
547 
550  // Add an object to the haptic scene as root (parent -1 = default) or as
551  // child (ParentNum =the number of the parent)
552  void addObject(vrpn_int32 objNum, vrpn_int32 ParentNum = -1);
553  // Add an object next to the haptic scene as root
554  void addObjectExScene(vrpn_int32 objNum);
555  // vertNum normNum and triNum start at 0
556  void setObjectVertex(vrpn_int32 objNum, vrpn_int32 vertNum, vrpn_float32 x,
557  vrpn_float32 y, vrpn_float32 z);
558  // NOTE: ghost doesn't take normals,
559  // and normals still aren't implemented for Hcollide
560  void setObjectNormal(vrpn_int32 objNum, vrpn_int32 normNum, vrpn_float32 x,
561  vrpn_float32 y, vrpn_float32 z);
562  void setObjectTriangle(vrpn_int32 objNum, vrpn_int32 triNum,
563  vrpn_int32 vert0, vrpn_int32 vert1, vrpn_int32 vert2,
564  vrpn_int32 norm0 = -1, vrpn_int32 norm1 = -1,
565  vrpn_int32 norm2 = -1);
566  void removeObjectTriangle(vrpn_int32 objNum, vrpn_int32 triNum);
567  // should be called to incorporate the above changes into the
568  // displayed trimesh
569  void updateObjectTrimeshChanges(vrpn_int32 objNum);
570  // set the trimesh's homogen transform matrix (in row major order)
571  void setObjectTrimeshTransform(vrpn_int32 objNum,
572  vrpn_float32 homMatrix[16]);
573  // set position of an object
574  void setObjectPosition(vrpn_int32 objNum, vrpn_float32 Pos[3]);
575  // set orientation of an object
576  void setObjectOrientation(vrpn_int32 objNum, vrpn_float32 axis[3],
577  vrpn_float32 angle);
578  // set Scale of an object only x scale is supported at the moment
579  void setObjectScale(vrpn_int32 objNum, vrpn_float32 Scale[3]);
580  // remove an object from the scene
581  void removeObject(vrpn_int32 objNum);
582  void clearObjectTrimesh(vrpn_int32 objNum);
583 
586  // Change The parent of an object
587  void moveToParent(vrpn_int32 objNum, vrpn_int32 ParentNum);
588  // Set the Origin of the haptic device
589  void setHapticOrigin(vrpn_float32 Pos[3], vrpn_float32 axis[3],
590  vrpn_float32 angle);
591  // Set the scale factor of the haptic device
592  void setHapticScale(vrpn_float32 Scale);
593  // Set the Origin of the scene
594  void setSceneOrigin(vrpn_float32 Pos[3], vrpn_float32 axis[3],
595  vrpn_float32 angle);
596  // get new ID, use only if wish to use vrpn ids and do not want to manage
597  // them yourself: ids need to be unique
598  vrpn_int32 getNewObjectID();
599  // make an object touchable or not
600  void setObjectIsTouchable(vrpn_int32 objNum, vrpn_bool IsTouchable = true);
601 
602  // the next time we send a trimesh we will use the following type
603  void useHcollide();
604  void useGhost();
605 
606  // Generalized constraint code.
607  // Constrains as a spring connected to a point, sliding along a line
608  // (constraint forces in a plane perpendicular to the line), or
609  // sliding along a plane (constraint forces only along the plane's
610  // normal). LineDirection and PlaneNormal should be normalized
611  // (vector length == 1).
612 
613  // Constraints are implemented as force fields, so both cannot
614  // run at once.
615 
616  // XXX it would be safer if changes (especially enable/disable)
617  // had better relaxation support
618 
619  void enableConstraint(vrpn_int32 enable); // zero disables
620  void setConstraintMode(ConstraintGeometry mode);
621  void setConstraintPoint(vrpn_float32 point[3]);
622  void setConstraintLinePoint(vrpn_float32 point[3]);
623  void setConstraintLineDirection(vrpn_float32 direction[3]);
624  void setConstraintPlanePoint(vrpn_float32 point[3]);
625  void setConstraintPlaneNormal(vrpn_float32 normal[3]);
626  void setConstraintKSpring(vrpn_float32 k);
627 
628  // void sendConstraint (vrpn_int32 enable, vrpn_float32 x,
629  // vrpn_float32 y, vrpn_float32 z, vrpn_float32 kSpr);
630 
631  // At the <origin> of the field, user feels the specified <force>.
632  // As the user moves away from the origin, the force felt changes
633  // according to the jacobian. If the user moves further than <radius>
634  // from <origin>, the field cuts out.
635 
636  // XXX it would be safer for the field to attenuate rapidly
637  // from the value at the radius if the user moves beyond the radius
638 
639  void sendForceField(vrpn_float32 origin[3], vrpn_float32 force[3],
640  vrpn_float32 jacobian[3][3], vrpn_float32 radius);
641  void sendForceField(void);
642  void stopForceField(void);
643 
644  // ajout ONDIM
645  void startEffect(void);
646  void stopEffect(void);
647  // fin ajout ONDIM
648 
649  // This routine calls the mainloop of the connection it is on
650  virtual void mainloop();
651 
652  // (un)Register a callback handler to handle a force change
653  // and plane equation change and trimesh change
654  virtual int register_force_change_handler(void *userdata,
655  vrpn_FORCECHANGEHANDLER handler)
656  {
657  return d_change_list.register_handler(userdata, handler);
658  };
659  virtual int unregister_force_change_handler(void *userdata,
660  vrpn_FORCECHANGEHANDLER handler)
661  {
662  return d_change_list.unregister_handler(userdata, handler);
663  };
664 
665  virtual int register_scp_change_handler(void *userdata,
666  vrpn_FORCESCPHANDLER handler)
667  {
668  return d_scp_change_list.register_handler(userdata, handler);
669  };
670  virtual int unregister_scp_change_handler(void *userdata,
671  vrpn_FORCESCPHANDLER handler)
672  {
673  return d_scp_change_list.unregister_handler(userdata, handler);
674  };
675 
676  virtual int register_error_handler(void *userdata,
677  vrpn_FORCEERRORHANDLER handler)
678  {
679  return d_error_change_list.register_handler(userdata, handler);
680  };
681  virtual int unregister_error_handler(void *userdata,
682  vrpn_FORCEERRORHANDLER handler)
683  {
684  return d_error_change_list.unregister_handler(userdata, handler);
685  };
686 
687 protected:
688  vrpn_Callback_List<vrpn_FORCECB> d_change_list;
689  static int VRPN_CALLBACK
690  handle_force_change_message(void *userdata, vrpn_HANDLERPARAM p);
691 
693  static int VRPN_CALLBACK
694  handle_scp_change_message(void *userdata, vrpn_HANDLERPARAM p);
695 
697  static int VRPN_CALLBACK
698  handle_error_change_message(void *userdata, vrpn_HANDLERPARAM p);
699 
700  // constraint types
701 
702  vrpn_int32 d_conEnabled;
704  vrpn_float32 d_conPoint[3];
705  vrpn_float32 d_conLinePoint[3];
706  vrpn_float64 d_conLineDirection[3]; // (assumed) normalized
707  vrpn_float32 d_conPlanePoint[3];
708  vrpn_float64 d_conPlaneNormal[3]; // (assumed) normalized
709  vrpn_float32 d_conKSpring;
710 
711  // haptic scene variables
713 
714  // utility functions
715 
716  void send(const char *msgbuf, vrpn_int32 len, vrpn_int32 type);
717 // Takes a pointer to a buffer, the length of the buffer, and the
718 // vrpn message type id to send. Sends the buffer reliably
719 // over connection AND DELETES THE BUFFER.
720 
721 #ifdef FD_SPRINGS_AS_FIELDS
722 
723  void constraintToForceField(void);
724 // takes the current cs_* settings and translates them into
725 // a force field.
726 
727 #endif // FD_SPRINGS_AS_FIELDS
728 };
729 
730 #endif
vrpn_float32 SurfaceTextureAmplitude
void setFF_Origin(vrpn_float32 x, vrpn_float32 y, vrpn_float32 z)
void setSurfaceKadhesionLateral(vrpn_float32 k)
vrpn_int32 removeObject_message_id
vrpn_int32 setConstraintPoint_message_id
void setRecoveryTime(int rt)
vrpn_float32 ff_radius
vrpn_int32 transformTrimesh_message_id
vrpn_int32 setObjectPosition_message_id
void setSurfaceKdamping(vrpn_float32 d)
virtual int register_force_change_handler(void *userdata, vrpn_FORCECHANGEHANDLER handler)
int connectionAvailable(void)
virtual int unregister_error_handler(void *userdata, vrpn_FORCEERRORHANDLER handler)
vrpn_float32 SurfaceBuzzAmp
vrpn_float32 SurfaceFstatic
vrpn_int32 setConstraintMode_message_id
vrpn_float32 SurfaceKadhesionLateral
vrpn_Callback_List< vrpn_FORCEERRORCB > d_error_change_list
void setFF_Radius(vrpn_float32 r)
virtual int unregister_scp_change_handler(void *userdata, vrpn_FORCESCPHANDLER handler)
vrpn_int32 setConstraintLinePoint_message_id
vrpn_int32 addObjectExScene_message_id
vrpn_int32 setConstraintLineDirection_message_id
ConstraintGeometry d_conMode
vrpn_int32 setConstraintPlaneNormal_message_id
vrpn_int32 addObject_message_id
vrpn_int32 setHapticScale_message_id
vrpn_int32 numRecCycles
void setFF_Force(vrpn_float32 fx, vrpn_float32 fy, vrpn_float32 fz)
Generic connection class not specific to the transport mechanism.
vrpn_int32 setTrimeshType_message_id
virtual int register_types(void)=0
Register the types of messages this device sends/receives. Return 0 on success, -1 on fail...
vrpn_int32 setConstraintKSpring_message_id
virtual int register_scp_change_handler(void *userdata, vrpn_FORCESCPHANDLER handler)
vrpn_int32 setVertex_message_id
#define VRPN_CALLBACK
void setSurfaceFstatic(vrpn_float32 ks)
#define VRPN_API
vrpn_int32 removeTriangle_message_id
virtual int register_error_handler(void *userdata, vrpn_FORCEERRORHANDLER handler)
All types of client/server/peer objects in VRPN should be derived from the vrpn_BaseClass type descri...
vrpn_float32 SurfaceTextureWavelength
virtual void mainloop()=0
Called once through each main loop iteration to handle updates. Remote object mainloop() should call ...
void setFF_Jacobian(vrpn_float32 dfxdx, vrpn_float32 dfxdy, vrpn_float32 dfxdz, vrpn_float32 dfydx, vrpn_float32 dfydy, vrpn_float32 dfydz, vrpn_float32 dfzdx, vrpn_float32 dfzdy, vrpn_float32 dfzdz)
void(VRPN_CALLBACK * vrpn_FORCECHANGEHANDLER)(void *userdata, const vrpn_FORCECB info)
vrpn_int32 forcefield_message_id
vrpn_int32 custom_effect_message_id
This structure is what is passed to a vrpn_Connection message callback.
vrpn_Callback_List< vrpn_FORCESCPCB > d_scp_change_list
void setSurfaceFdynamic(vrpn_float32 kd)
vrpn_float32 SurfaceKadhesionNormal
vrpn_int32 setObjectScale_message_id
void setFF_Force(vrpn_float32 f[3])
vrpn_int32 setHapticOrigin_message_id
vrpn_int32 enableConstraint_message_id
void(VRPN_CALLBACK * vrpn_FORCEERRORHANDLER)(void *userdata, const vrpn_FORCEERRORCB info)
vrpn_int32 error_message_id
vrpn_int32 updateTrimeshChanges_message_id
vrpn_float32 SurfaceKspring
void setFF_Origin(vrpn_float32 x[3])
vrpn_int32 setSceneOrigin_message_id
vrpn_int32 which_plane
vrpn_int32 setConstraintPlanePoint_message_id
vrpn_float32 * customEffectParams
vrpn_int32 setObjectOrientation_message_id
void setSurfaceKadhesionNormal(vrpn_float32 k)
void setSurfaceTextureAmplitude(vrpn_float32 amp)
vrpn_int32 force_message_id
vrpn_int32 customEffectId
Class from which all user-level (and other) classes that communicate with vrpn_Connections should der...
vrpn_int32 plane_message_id
void setSurfaceBuzzFrequency(vrpn_float32 freq)
vrpn_float32 SurfaceBuzzFreq
void setSurfaceTextureWavelength(vrpn_float32 wl)
void setSurfaceKspring(vrpn_float32 k)
vrpn_int32 plane_effects_message_id
void setSurfaceBuzzAmplitude(vrpn_float32 amp)
void(VRPN_CALLBACK * vrpn_FORCESCPHANDLER)(void *userdata, const vrpn_FORCESCPCB info)
virtual int unregister_force_change_handler(void *userdata, vrpn_FORCECHANGEHANDLER handler)
vrpn_int32 getNewObjectID_message_id
int getRecoveryTime(void)
vrpn_uint32 nbCustomEffectParams
vrpn_int32 moveToParent_message_id
vrpn_int32 scp_message_id
vrpn_float32 SurfaceKdamping
vrpn_int32 setTriangle_message_id
vrpn_int32 setNormal_message_id
vrpn_float32 SurfaceFdynamic
vrpn_int32 setObjectIsTouchable_message_id
vrpn_int32 clearTrimesh_message_id