45 void print_report(
void);
46 void print_plane(
void);
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; }
55 void setSurfaceKadhesionNormal(vrpn_float32 k)
57 SurfaceKadhesionNormal = k;
59 void setSurfaceKadhesionLateral(vrpn_float32 k)
61 SurfaceKadhesionLateral = k;
63 void setSurfaceBuzzFrequency(vrpn_float32 freq) { SurfaceBuzzFreq = freq; }
64 void setSurfaceBuzzAmplitude(vrpn_float32 amp) { SurfaceBuzzAmp = amp; }
65 void setSurfaceTextureWavelength(vrpn_float32 wl)
67 SurfaceTextureWavelength = wl;
69 void setSurfaceTextureAmplitude(vrpn_float32 amp)
71 SurfaceTextureAmplitude = amp;
74 void setCustomEffect(vrpn_int32 effectId, vrpn_float32 *params = NULL,
75 vrpn_uint32 nbParams = 0);
77 void setFF_Origin(vrpn_float32 x, vrpn_float32 y, vrpn_float32 z)
83 void setFF_Origin(vrpn_float32 x[3])
89 void setFF_Force(vrpn_float32 fx, vrpn_float32 fy, vrpn_float32 fz)
95 void setFF_Force(vrpn_float32 f[3])
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,
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;
117 void setFF_Radius(vrpn_float32 r) { ff_radius = r; }
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,
124 void sendError(
int error_code);
126 int getRecoveryTime(
void) {
return numRecCycles; }
127 int connectionAvailable(
void) {
return (d_connection != NULL); }
131 enum ConstraintGeometry {
141 vrpn_int32 force_message_id;
142 vrpn_int32 plane_message_id;
143 vrpn_int32 plane_effects_message_id;
144 vrpn_int32 forcefield_message_id;
145 vrpn_int32 scp_message_id;
149 vrpn_int32 enableConstraint_message_id;
150 vrpn_int32 setConstraintMode_message_id;
151 vrpn_int32 setConstraintPoint_message_id;
152 vrpn_int32 setConstraintLinePoint_message_id;
153 vrpn_int32 setConstraintLineDirection_message_id;
154 vrpn_int32 setConstraintPlanePoint_message_id;
155 vrpn_int32 setConstraintPlaneNormal_message_id;
156 vrpn_int32 setConstraintKSpring_message_id;
162 vrpn_int32 error_message_id;
166 vrpn_int32 addObject_message_id;
167 vrpn_int32 addObjectExScene_message_id;
168 vrpn_int32 moveToParent_message_id;
169 vrpn_int32 setObjectPosition_message_id;
170 vrpn_int32 setObjectOrientation_message_id;
171 vrpn_int32 setObjectScale_message_id;
172 vrpn_int32 removeObject_message_id;
173 vrpn_int32 setVertex_message_id;
174 vrpn_int32 setNormal_message_id;
175 vrpn_int32 setTriangle_message_id;
176 vrpn_int32 removeTriangle_message_id;
177 vrpn_int32 updateTrimeshChanges_message_id;
178 vrpn_int32 transformTrimesh_message_id;
179 vrpn_int32 setTrimeshType_message_id;
180 vrpn_int32 clearTrimesh_message_id;
183 vrpn_int32 setHapticOrigin_message_id;
184 vrpn_int32 setHapticScale_message_id;
185 vrpn_int32 setSceneOrigin_message_id;
186 vrpn_int32 getNewObjectID_message_id;
187 vrpn_int32 setObjectIsTouchable_message_id;
190 vrpn_int32 custom_effect_message_id;
195 static char *encode_custom_effect(vrpn_int32 &len, vrpn_uint32 effectId,
196 const vrpn_float32 *params,
197 vrpn_uint32 nbParams);
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]);
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);
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);
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);
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);
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,
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,
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,
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,
327 static vrpn_int32 decode_trimeshTransform(
const char *buffer,
328 const vrpn_int32 len,
330 vrpn_float32 homMatrix[16]);
333 static vrpn_int32 decode_addObject(
const char *buffer, vrpn_int32 len,
335 vrpn_int32 *ParentNum);
336 static vrpn_int32 decode_addObjectExScene(
const char *buffer,
339 static vrpn_int32 decode_objectPosition(
const char *buffer, vrpn_int32 len,
341 vrpn_float32 Pos[3]);
342 static vrpn_int32 decode_objectOrientation(
const char *buffer,
345 vrpn_float32 axis[3],
346 vrpn_float32 *angle);
347 static vrpn_int32 decode_objectScale(
const char *buffer, vrpn_int32 len,
349 vrpn_float32 Scale[3]);
350 static vrpn_int32 decode_removeObject(
const char *buffer, vrpn_int32 len,
352 static vrpn_int32 decode_clearTrimesh(
const char *buffer, vrpn_int32 len,
354 static vrpn_int32 decode_moveToParent(
const char *buffer, vrpn_int32 len,
356 vrpn_int32 *parentNum);
358 static vrpn_int32 decode_setHapticOrigin(
const char *buffer, vrpn_int32 len,
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,
366 vrpn_float32 axis[3],
367 vrpn_float32 *angle);
368 static vrpn_int32 decode_setObjectIsTouchable(
const char *buffer,
371 vrpn_bool *isTouchable);
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);
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,
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);
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,
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,
409 static char *encode_setConstraintLineDirection(vrpn_int32 &len,
413 static vrpn_int32 decode_setConstraintLineDirection(
const char *buffer,
414 const vrpn_int32 len,
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,
427 static char *encode_setConstraintPlaneNormal(vrpn_int32 &len,
428 vrpn_float32 x, vrpn_float32 y,
430 static vrpn_int32 decode_setConstraintPlaneNormal(
const char *buffer,
431 const vrpn_int32 len,
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,
443 static char *encodePoint(vrpn_int32 &len, vrpn_float32 x, vrpn_float32 y,
445 static vrpn_int32 decodePoint(
const char *buffer,
const vrpn_int32 len,
446 vrpn_float32 *x, vrpn_float32 *y,
449 struct timeval timestamp;
451 vrpn_int32 which_plane;
453 vrpn_float64 d_force[3];
457 vrpn_float64 scp_pos[3];
458 vrpn_float64 scp_quat[4];
459 vrpn_float32 plane[4];
461 vrpn_float32 ff_origin[3];
462 vrpn_float32 ff_force[3];
463 vrpn_float32 ff_jacobian[3][3];
464 vrpn_float32 ff_radius;
466 vrpn_float32 SurfaceKspring;
467 vrpn_float32 SurfaceKdamping;
468 vrpn_float32 SurfaceFstatic;
469 vrpn_float32 SurfaceFdynamic;
470 vrpn_int32 numRecCycles;
471 vrpn_int32 errorCode;
473 vrpn_float32 SurfaceKadhesionLateral;
474 vrpn_float32 SurfaceKadhesionNormal;
475 vrpn_float32 SurfaceBuzzFreq;
476 vrpn_float32 SurfaceBuzzAmp;
477 vrpn_float32 SurfaceTextureWavelength;
478 vrpn_float32 SurfaceTextureAmplitude;
481 vrpn_int32 customEffectId;
482 vrpn_float32 *customEffectParams;
483 vrpn_uint32 nbCustomEffectParams;
524 void sendSurface(
void);
525 void startSurface(
void);
526 void stopSurface(
void);
531 void setVertex(vrpn_int32 vertNum, vrpn_float32 x, vrpn_float32 y,
535 void setNormal(vrpn_int32 normNum, vrpn_float32 x, vrpn_float32 y,
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);
543 void updateTrimeshChanges();
545 void setTrimeshTransform(vrpn_float32 homMatrix[16]);
546 void clearTrimesh(
void);
552 void addObject(vrpn_int32 objNum, vrpn_int32 ParentNum = -1);
554 void addObjectExScene(vrpn_int32 objNum);
556 void setObjectVertex(vrpn_int32 objNum, vrpn_int32 vertNum, vrpn_float32 x,
557 vrpn_float32 y, vrpn_float32 z);
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);
569 void updateObjectTrimeshChanges(vrpn_int32 objNum);
571 void setObjectTrimeshTransform(vrpn_int32 objNum,
572 vrpn_float32 homMatrix[16]);
574 void setObjectPosition(vrpn_int32 objNum, vrpn_float32 Pos[3]);
576 void setObjectOrientation(vrpn_int32 objNum, vrpn_float32 axis[3],
579 void setObjectScale(vrpn_int32 objNum, vrpn_float32 Scale[3]);
581 void removeObject(vrpn_int32 objNum);
582 void clearObjectTrimesh(vrpn_int32 objNum);
589 void setHapticOrigin(vrpn_float32 Pos[3], vrpn_float32 axis[3],
592 void setHapticScale(vrpn_float32 Scale);
594 void setSceneOrigin(vrpn_float32 Pos[3], vrpn_float32 axis[3],
598 vrpn_int32 getNewObjectID();
600 void setObjectIsTouchable(vrpn_int32 objNum, vrpn_bool IsTouchable =
true);
619 void enableConstraint(vrpn_int32 enable);
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);
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);
645 void startEffect(
void);
646 void stopEffect(
void);
654 virtual int register_force_change_handler(
void *userdata,
655 vrpn_FORCECHANGEHANDLER handler)
657 return d_change_list.register_handler(userdata, handler);
659 virtual int unregister_force_change_handler(
void *userdata,
660 vrpn_FORCECHANGEHANDLER handler)
662 return d_change_list.unregister_handler(userdata, handler);
665 virtual int register_scp_change_handler(
void *userdata,
666 vrpn_FORCESCPHANDLER handler)
668 return d_scp_change_list.register_handler(userdata, handler);
670 virtual int unregister_scp_change_handler(
void *userdata,
671 vrpn_FORCESCPHANDLER handler)
673 return d_scp_change_list.unregister_handler(userdata, handler);
676 virtual int register_error_handler(
void *userdata,
677 vrpn_FORCEERRORHANDLER handler)
679 return d_error_change_list.register_handler(userdata, handler);
681 virtual int unregister_error_handler(
void *userdata,
682 vrpn_FORCEERRORHANDLER handler)
684 return d_error_change_list.unregister_handler(userdata, handler);
689 static int VRPN_CALLBACK
693 static int VRPN_CALLBACK
697 static int VRPN_CALLBACK
702 vrpn_int32 d_conEnabled;
703 ConstraintGeometry d_conMode;
704 vrpn_float32 d_conPoint[3];
705 vrpn_float32 d_conLinePoint[3];
706 vrpn_float64 d_conLineDirection[3];
707 vrpn_float32 d_conPlanePoint[3];
708 vrpn_float64 d_conPlaneNormal[3];
709 vrpn_float32 d_conKSpring;
712 vrpn_int32 m_NextAvailableObjectID;
716 void send(
const char *msgbuf, vrpn_int32 len, vrpn_int32 type);
721#ifdef FD_SPRINGS_AS_FIELDS
723 void constraintToForceField(
void);