9#if defined(linux) || defined(__sparc) || defined(hpux) || defined(__GNUC__)
25 if (a == -1) return -1
29static void vector_cross (
const vrpn_float64 a [3],
const vrpn_float64 b [3],
32 c[0] = a[1] * b[2] - a[2] * b[1];
33 c[1] = a[2] * b[0] - a[0] * b[2];
34 c[2] = a[0] * b[1] - a[1] * b[0];
39static void rotate_vector (
const vrpn_float64 v [3],
const vrpn_float64 T [9],
40 vrpn_float64 vprime [3]) {
41 vprime[0] = v[0] * T[0] + v[1] * T[3] + v[2] * T[6];
42 vprime[1] = v[0] * T[1] + v[1] * T[4] + v[2] * T[7];
43 vprime[2] = v[0] * T[2] + v[1] * T[5] + v[2] * T[8];
46static vrpn_float64 vector_dot (
const vrpn_float64 a [3],
47 const vrpn_float64 b [3]) {
48 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
95 fprintf(stderr,
"vrpn_ForceDevice::setCustomEffect(): delete failed\n");
102 fprintf(stderr,
"vrpn_ForceDevice::setCustomEffect(): Out of memory\n");
113 d_connection->register_message_type(
"vrpn_ForceDevice Force");
115 d_connection->register_message_type(
"vrpn_ForceDevice Force_Field");
117 d_connection->register_message_type(
"vrpn_ForceDevice Plane");
119 d_connection->register_message_type(
"vrpn_ForceDevice Plane2");
121 d_connection->register_message_type(
"vrpn_ForceDevice addObject");
123 "vrpn_ForceDevice addObjectExScene");
125 d_connection->register_message_type(
"vrpn_ForceDevice moveToParent");
127 "vrpn_ForceDevice setObjectPosition");
129 "vrpn_ForceDevice setObjectOrientation");
131 d_connection->register_message_type(
"vrpn_ForceDevice setObjectScale");
133 d_connection->register_message_type(
"vrpn_ForceDevice removeObject");
135 d_connection->register_message_type(
"vrpn_ForceDevice setVertex");
137 d_connection->register_message_type(
"vrpn_ForceDevice setNormal");
139 d_connection->register_message_type(
"vrpn_ForceDevice setTriangle");
141 d_connection->register_message_type(
"vrpn_ForceDevice removeTriangle");
143 "vrpn_ForceDevice updateTrimeshChanges");
145 "vrpn_ForceDevice transformTrimesh");
147 d_connection->register_message_type(
"vrpn_ForceDevice setTrimeshType");
149 d_connection->register_message_type(
"vrpn_ForceDevice clearTrimesh");
152 d_connection->register_message_type(
"vrpn_ForceDevice setHapticOrigin");
154 d_connection->register_message_type(
"vrpn_ForceDevice setHapticScale");
156 d_connection->register_message_type(
"vrpn_ForceDevice setSceneOrigin");
159 d_connection->register_message_type(
"vrpn_ForceDevice getNewObjectID");
161 "vrpn_ForceDevice setObjectIsTouchable");
163 d_connection->register_message_type(
"vrpn_ForceDevice SCP");
165 d_connection->register_message_type(
"vrpn_ForceDevice Force_Error");
168 "vrpn_ForceDevice constraint_enable");
170 d_connection->register_message_type(
"vrpn_ForceDevice constraint_mode");
172 "vrpn_ForceDevice constraint_point");
174 "vrpn_ForceDevice constraint_linept");
176 "vrpn_ForceDevice constraint_linedir");
178 d_connection->register_message_type(
"vrpn_ForceDevice constraint_plpt");
180 "vrpn_ForceDevice constraint_plnorm");
182 "vrpn_ForceDevice constraint_KSpring");
186 d_connection->register_message_type(
"vrpn_ForceDevice Custom Effect");
199 fprintf(stderr,
"vrpn_ForceDevice::~vrpn_ForceDevice(): delete failed\n");
213 printf(
"Timestamp:%ld:%ld\n",
timestamp.tv_sec,
220 const vrpn_float64 *force)
230 length = 3 *
sizeof(vrpn_float64);
233 try { buf =
new char[length]; }
234 catch (...) {
return NULL; }
238 for (i = 0; i < 3; i++) {
247 const vrpn_int32 len,
251 const char *mptr = buffer;
253 if (len != (3 *
sizeof(vrpn_float64))) {
254 fprintf(stderr,
"vrpn_ForceDevice: force message payload error\n");
255 fprintf(stderr,
" (got %d, expected %lud)\n", len,
256 static_cast<unsigned long>(3 *
sizeof(vrpn_float64)));
260 for (i = 0; i < 3; i++)
268 vrpn_uint32 effectId,
269 const vrpn_float32 *params,
270 vrpn_uint32 nbParams)
276 len =
sizeof(vrpn_uint32) * 2 + nbParams *
sizeof(vrpn_float32);
279 try { buf =
new char[len]; }
280 catch (...) {
return NULL; }
286 for (
unsigned int i = 0; i < nbParams; i++) {
295 const vrpn_int32 len,
296 vrpn_uint32 *effectId,
297 vrpn_float32 **params,
298 vrpn_uint32 *nbParams)
300 const char *mptr = buffer;
304 if (
static_cast<size_t>(len) < (
sizeof(vrpn_uint32) * 2)) {
306 "vrpn_ForceDevice: custom effect message payload error\n");
307 fprintf(stderr,
" (got %d, expected at least %lud)\n", len,
308 static_cast<unsigned long>(2 *
sizeof(vrpn_uint32)));
315 if ((vrpn_uint32)(len) <
316 (2 *
sizeof(vrpn_uint32) + (*nbParams) *
sizeof(vrpn_float32))) {
318 "vrpn_ForceDevice: custom effect message payload error\n");
319 fprintf(stderr,
" (got %d, expected at least %lud)\n", len,
320 static_cast<unsigned long>(2 *
sizeof(vrpn_uint32) +
321 (*nbParams) *
sizeof(vrpn_float32)));
325 if (*params != NULL) {
329 fprintf(stderr,
"vrpn_ForceDevice::decode_custom_effect(): delete failed\n");
333 try { *params =
new vrpn_float32[(*nbParams)]; }
335 fprintf(stderr,
"vrpn_ForceDevice::decode_custom_effect(): Out of memory\n");
339 for (vrpn_uint32 i = 0; i < (*nbParams); i++) {
349 const vrpn_float64 *quat)
356 length = 7 *
sizeof(vrpn_float64);
359 try { buf =
new char[length]; }
360 catch (...) {
return NULL; }
363 for (i = 0; i < 3; i++) {
366 for (i = 0; i < 4; i++) {
375 const vrpn_int32 len, vrpn_float64 *pos,
379 const char *mptr = buffer;
380 int desiredLen = 7 *
sizeof(vrpn_float64);
382 if (len != desiredLen) {
383 fprintf(stderr,
"vrpn_ForceDevice: scp message payload error\n");
384 fprintf(stderr,
" (got %d, expected %d)\n", len,
389 for (i = 0; i < 3; i++)
391 for (i = 0; i < 4; i++)
399 vrpn_int32 &len,
const vrpn_float32 *
plane,
const vrpn_float32 kspring,
400 const vrpn_float32 kdamp,
const vrpn_float32 fdyn,
const vrpn_float32 fstat,
401 const vrpn_int32 plane_index,
const vrpn_int32 n_rec_cycles)
410 len = 8 *
sizeof(vrpn_float32) + 2 *
sizeof(vrpn_int32);
413 try { buf =
new char[len]; }
414 catch (...) {
return NULL; }
418 for (i = 0; i < 4; i++) {
434 const char *buffer,
const vrpn_int32 len, vrpn_float32 *
plane,
435 vrpn_float32 *kspring, vrpn_float32 *kdamp, vrpn_float32 *fdyn,
436 vrpn_float32 *fstat, vrpn_int32 *plane_index, vrpn_int32 *n_rec_cycles)
439 const char *mptr = buffer;
441 if (len != 8 *
sizeof(vrpn_float32) + 2 *
sizeof(vrpn_int32)) {
442 fprintf(stderr,
"vrpn_ForceDevice: plane message payload error\n");
443 fprintf(stderr,
" (got %d, expected %lud)\n", len,
444 static_cast<unsigned long>(8 *
sizeof(vrpn_float32) +
445 2 *
sizeof(vrpn_int32)));
449 for (i = 0; i < 4; i++)
463 vrpn_int32 &len,
const vrpn_float32 k_adhesion_normal,
464 const vrpn_float32 k_adhesion_lateral,
const vrpn_float32 tex_amp,
465 const vrpn_float32 tex_wl,
const vrpn_float32 buzz_amp,
466 const vrpn_float32 buzz_freq)
473 len = 6 *
sizeof(vrpn_float32);
476 try { buf =
new char[len]; }
477 catch (...) {
return NULL; }
493 const char *buffer,
const vrpn_int32 len, vrpn_float32 *k_adhesion_normal,
494 vrpn_float32 *k_adhesion_lateral, vrpn_float32 *tex_amp,
495 vrpn_float32 *tex_wl, vrpn_float32 *buzz_amp, vrpn_float32 *buzz_freq)
498 const char *mptr = buffer;
500 if (len != 6 *
sizeof(vrpn_float32)) {
501 fprintf(stderr,
"vrpn_ForceDevice: surface effects message payload ");
502 fprintf(stderr,
"error\n (got %d, expected %lud)\n", len,
503 static_cast<unsigned long>(6 *
sizeof(vrpn_float32)));
519 const vrpn_int32 vertNum,
520 const vrpn_float32 x,
521 const vrpn_float32 y,
522 const vrpn_float32 z)
529 len =
sizeof(objNum) +
sizeof(vertNum) + 3 *
sizeof(vrpn_float32);
532 try { buf =
new char[len]; }
533 catch (...) {
return NULL; }
548 const vrpn_int32 len,
550 vrpn_int32 *vertNum, vrpn_float32 *x,
551 vrpn_float32 *y, vrpn_float32 *z)
553 const char *mptr = buffer;
555 if (len != (
sizeof(objNum) +
sizeof(vertNum) + 3 *
sizeof(vrpn_float32))) {
556 fprintf(stderr,
"vrpn_ForceDevice: vertex message payload error\n");
557 fprintf(stderr,
" (got %d, expected %lud)\n", len,
558 static_cast<unsigned long>(
sizeof(objNum) +
sizeof(vertNum) +
559 3 *
sizeof(vrpn_float32)));
574 const vrpn_int32 normNum,
575 const vrpn_float32 x,
576 const vrpn_float32 y,
577 const vrpn_float32 z)
584 len =
sizeof(vrpn_int32) +
sizeof(vrpn_int32) + 3 *
sizeof(vrpn_float32);
587 try { buf =
new char[len]; }
588 catch (...) {
return NULL; }
602 const vrpn_int32 len,
604 vrpn_int32 *vertNum, vrpn_float32 *x,
605 vrpn_float32 *y, vrpn_float32 *z)
608 const char *mptr = buffer;
611 (
sizeof(vrpn_int32) +
sizeof(vrpn_int32) + 3 *
sizeof(vrpn_float32))) {
612 fprintf(stderr,
"vrpn_ForceDevice: normal message payload error\n");
613 fprintf(stderr,
" (got %d, expected %lud)\n", len,
614 static_cast<unsigned long>(
sizeof(vrpn_int32) +
616 3 *
sizeof(vrpn_float32)));
631 vrpn_int32 &len,
const vrpn_int32 objNum,
const vrpn_int32 triNum,
632 const vrpn_int32 vert0,
const vrpn_int32 vert1,
const vrpn_int32 vert2,
633 const vrpn_int32 norm0,
const vrpn_int32 norm1,
const vrpn_int32 norm2)
639 len =
sizeof(vrpn_int32) + 7 *
sizeof(vrpn_int32);
642 try { buf =
new char[len]; }
643 catch (...) {
return NULL; }
660 const char *buffer,
const vrpn_int32 len, vrpn_int32 *objNum,
661 vrpn_int32 *triNum, vrpn_int32 *vert0, vrpn_int32 *vert1, vrpn_int32 *vert2,
662 vrpn_int32 *norm0, vrpn_int32 *norm1, vrpn_int32 *norm2)
664 const char *mptr = buffer;
666 if (len != (
sizeof(vrpn_int32) + 7 *
sizeof(vrpn_int32))) {
667 fprintf(stderr,
"vrpn_ForceDevice: triangle message payload error\n");
668 fprintf(stderr,
" (got %d, expected %lud)\n", len,
669 static_cast<unsigned long>(
sizeof(vrpn_int32) +
670 7 *
sizeof(vrpn_int32)));
688 const vrpn_int32 objNum,
689 const vrpn_int32 triNum)
696 len =
sizeof(vrpn_int32) +
sizeof(vrpn_int32);
699 try { buf =
new char[len]; }
700 catch (...) {
return NULL; }
711 const vrpn_int32 len,
715 const char *mptr = buffer;
717 if (len != (
sizeof(vrpn_int32) +
sizeof(vrpn_int32))) {
718 fprintf(stderr,
"vrpn_ForceDevice: remove triangle message payload");
719 fprintf(stderr,
" error\n (got %d, expected %lud)\n", len,
720 static_cast<unsigned long>(
sizeof(vrpn_int32) +
721 sizeof(vrpn_int32)));
734 vrpn_int32 &len,
const vrpn_int32 objNum,
const vrpn_float32 kspring,
735 const vrpn_float32 kdamp,
const vrpn_float32 fstat,
const vrpn_float32 fdyn)
742 len =
sizeof(vrpn_int32) + 4 *
sizeof(vrpn_float32);
745 try { buf =
new char[len]; }
746 catch (...) {
return NULL; }
760 const char *buffer,
const vrpn_int32 len, vrpn_int32 *objNum,
761 vrpn_float32 *kspring, vrpn_float32 *kdamp, vrpn_float32 *fstat,
765 const char *mptr = buffer;
767 if (len != (
sizeof(vrpn_int32) + 4 *
sizeof(vrpn_float32))) {
768 fprintf(stderr,
"vrpn_ForceDevice: update trimesh message payload");
769 fprintf(stderr,
" error\n (got %d, expected %lud)\n", len,
770 static_cast<unsigned long>(
sizeof(vrpn_int32) +
771 4 *
sizeof(vrpn_float32)));
786 const vrpn_int32 objNum,
787 const vrpn_int32
type)
794 len =
sizeof(vrpn_int32) +
sizeof(vrpn_int32);
797 try { buf =
new char[len]; }
798 catch (...) {
return NULL; }
809 const vrpn_int32 len,
814 const char *mptr = buffer;
816 if (len != (
sizeof(vrpn_int32) +
sizeof(vrpn_int32))) {
817 fprintf(stderr,
"vrpn_ForceDevice: trimesh type message payload");
818 fprintf(stderr,
" error\n (got %d, expected %lud)\n", len,
819 static_cast<unsigned long>(
sizeof(vrpn_int32) +
820 sizeof(vrpn_int32)));
832 vrpn_int32 &len,
const vrpn_int32 objNum,
const vrpn_float32 homMatrix[16])
839 len =
sizeof(vrpn_int32) + 16 *
sizeof(vrpn_float32);
842 try { buf =
new char[len]; }
843 catch (...) {
return NULL; }
847 for (i = 0; i < 16; i++)
855 const vrpn_int32 len,
857 vrpn_float32 homMatrix[16])
860 const char *mptr = buffer;
862 if (len != (
sizeof(vrpn_int32) + 16 *
sizeof(vrpn_float32))) {
863 fprintf(stderr,
"vrpn_ForceDevice: trimesh transform message payload ");
864 fprintf(stderr,
"error\n (got %d, expected %lud)\n", len,
865 static_cast<unsigned long>(
sizeof(vrpn_int32) +
866 16 *
sizeof(vrpn_float32)));
871 for (i = 0; i < 16; i++)
878 const vrpn_int32 objNum,
879 const vrpn_int32 ParentNum)
885 len = 2 *
sizeof(vrpn_int32);
888 try { buf =
new char[len]; }
889 catch (...) {
return NULL; }
901 vrpn_int32 *ParentNum)
903 const char *mptr = buffer;
905 if (len != 2 *
sizeof(vrpn_int32)) {
906 fprintf(stderr,
"vrpn_ForceDevice: add object message payload ");
907 fprintf(stderr,
"error\n (got %d, expected %lud)\n", len,
908 static_cast<unsigned long>(2 *
sizeof(vrpn_int32)));
919 const vrpn_int32 objNum)
925 len =
sizeof(objNum);
928 try { buf =
new char[len]; }
929 catch (...) {
return NULL; }
941 const char *mptr = buffer;
943 if (len !=
sizeof(vrpn_int32)) {
944 fprintf(stderr,
"vrpn_ForceDevice: add object message payload ");
945 fprintf(stderr,
"error\n (got %d, expected %lud)\n", len,
946 static_cast<unsigned long>(
sizeof(vrpn_int32)));
956 const vrpn_int32 objNum,
957 const vrpn_float32 Pos[3])
963 len =
sizeof(vrpn_int32) + 3 *
sizeof(vrpn_float32);
966 try { buf =
new char[len]; }
967 catch (...) {
return NULL; }
983 const char *mptr = buffer;
985 if (len != (
sizeof(vrpn_int32) + 3 *
sizeof(vrpn_float32))) {
986 fprintf(stderr,
"vrpn_ForceDevice: object position message payload ");
987 fprintf(stderr,
"error\n (got %d, expected %lud)\n", len,
988 static_cast<unsigned long>(
sizeof(vrpn_int32) +
989 3 *
sizeof(vrpn_float32)));
1002 const vrpn_int32 objNum,
1003 const vrpn_float32 axis[3],
1004 const vrpn_float32 angle)
1010 len =
sizeof(vrpn_int32) + 4 *
sizeof(vrpn_float32);
1013 try { buf =
new char[len]; }
1014 catch (...) {
return NULL; }
1029 vrpn_float32 axis[3],
1030 vrpn_float32 *angle)
1032 const char *mptr = buffer;
1034 if (len != (
sizeof(vrpn_int32) + 4 *
sizeof(vrpn_float32))) {
1036 "vrpn_ForceDevice: object orientation message payload ");
1037 fprintf(stderr,
"error\n (got %d, expected %lud)\n", len,
1038 static_cast<unsigned long>(
sizeof(vrpn_int32) +
1039 4 *
sizeof(vrpn_float32)));
1053 const vrpn_int32 objNum,
1054 const vrpn_float32 Scale[3])
1060 len =
sizeof(vrpn_int32) + 3 *
sizeof(vrpn_float32);
1063 try { buf =
new char[len]; }
1064 catch (...) {
return NULL; }
1078 vrpn_float32 Scale[3])
1080 const char *mptr = buffer;
1082 if (len != (
sizeof(vrpn_int32) + 3 *
sizeof(vrpn_float32))) {
1083 fprintf(stderr,
"vrpn_ForceDevice: object scale message payload ");
1084 fprintf(stderr,
"error\n (got %d, expected %lud)\n", len,
1085 static_cast<unsigned long>(
sizeof(vrpn_int32) +
1086 3 *
sizeof(vrpn_float32)));
1099 const vrpn_int32 objNum)
1105 len =
sizeof(vrpn_int32);
1108 try { buf =
new char[len]; }
1109 catch (...) {
return NULL; }
1121 const char *mptr = buffer;
1123 if (len !=
sizeof(vrpn_int32)) {
1124 fprintf(stderr,
"vrpn_ForceDevice: remove object message payload ");
1125 fprintf(stderr,
"error\n (got %d, expected %lud)\n", len,
1126 static_cast<unsigned long>(
sizeof(vrpn_int32)));
1136 const vrpn_int32 objNum)
1142 len =
sizeof(vrpn_int32);
1145 try { buf =
new char[len]; }
1146 catch (...) {
return NULL; }
1158 const char *mptr = buffer;
1160 if (len !=
sizeof(vrpn_int32)) {
1161 fprintf(stderr,
"vrpn_ForceDevice: clear TriMesh message payload ");
1162 fprintf(stderr,
"error\n (got %d, expected %lud)\n", len,
1163 static_cast<unsigned long>(
sizeof(vrpn_int32)));
1173 const vrpn_int32 objNum,
1174 const vrpn_int32 parentNum)
1180 len =
sizeof(vrpn_int32) +
sizeof(vrpn_int32);
1183 try { buf =
new char[len]; }
1184 catch (...) {
return NULL; }
1196 vrpn_int32 *parentNum)
1198 const char *mptr = buffer;
1200 if (len != (
sizeof(vrpn_int32) +
sizeof(vrpn_int32))) {
1202 "vrpn_ForceDevice: move object to parent message payload ");
1203 fprintf(stderr,
"error\n (got %d, expected %lud)\n", len,
1204 static_cast<unsigned long>(
sizeof(vrpn_int32) +
1205 sizeof(vrpn_int32)));
1216 const vrpn_float32 Pos[3],
1217 const vrpn_float32 axis[3],
1218 const vrpn_float32 angle)
1225 len = 7 *
sizeof(vrpn_float32);
1228 try { buf =
new char[len]; }
1229 catch (...) {
return NULL; }
1232 for (i = 0; i < 3; i++)
1235 for (i = 0; i < 3; i++)
1245 vrpn_float32 Pos[3],
1246 vrpn_float32 axis[3],
1247 vrpn_float32 *angle)
1250 const char *mptr = buffer;
1252 if (len != 7 *
sizeof(vrpn_int32)) {
1254 "vrpn_ForceDevice: sethapticorigin message payload error\n");
1255 fprintf(stderr,
" (got %d, expected %lud)\n", len,
1256 static_cast<unsigned long>(7 *
sizeof(vrpn_int32)));
1260 for (i = 0; i < 3; i++)
1263 for (i = 0; i < 3; i++)
1271 const vrpn_float32 scale)
1277 len =
sizeof(vrpn_float32);
1280 try { buf =
new char[len]; }
1281 catch (...) {
return NULL; }
1291 vrpn_float32 *scale)
1293 const char *mptr = buffer;
1295 if (len !=
sizeof(vrpn_float32)) {
1297 "vrpn_ForceDevice: sethapticscale message payload error\n");
1298 fprintf(stderr,
" (got %d, expected %lud)\n", len,
1299 static_cast<unsigned long>(7 *
sizeof(vrpn_float32)));
1309 const vrpn_float32 Pos[3],
1310 const vrpn_float32 axis[3],
1311 const vrpn_float32 angle)
1318 len = 7 *
sizeof(vrpn_float32);
1321 try { buf =
new char[len]; }
1322 catch (...) {
return NULL; }
1325 for (i = 0; i < 3; i++)
1328 for (i = 0; i < 3; i++)
1338 vrpn_float32 Pos[3],
1339 vrpn_float32 axis[3],
1340 vrpn_float32 *angle)
1343 const char *mptr = buffer;
1345 if (len != 7 *
sizeof(vrpn_int32)) {
1347 "vrpn_ForceDevice: setsceneorigin message payload error\n");
1348 fprintf(stderr,
" (got %d, expected %lud)\n", len,
1349 static_cast<unsigned long>(7 *
sizeof(vrpn_int32)));
1353 for (i = 0; i < 3; i++)
1356 for (i = 0; i < 3; i++)
1365 const vrpn_int32 objNum,
1366 const vrpn_bool IsTouchable)
1372 len =
sizeof(vrpn_int32) +
sizeof(vrpn_bool);
1375 try { buf =
new char[len]; }
1376 catch (...) {
return NULL; }
1388 vrpn_bool *IsTouchable)
1390 const char *mptr = buffer;
1392 if (len != (
sizeof(vrpn_int32) +
sizeof(vrpn_bool))) {
1393 fprintf(stderr,
"vrpn_ForceDevice: set object is touchable message "
1396 stderr,
" (got %d, expected %lud)\n", len,
1397 static_cast<unsigned long>(
sizeof(vrpn_int32) +
sizeof(vrpn_bool)));
1409 const vrpn_float32 origin[3],
1410 const vrpn_float32 force[3],
1411 const vrpn_float32 jacobian[3][3],
1412 const vrpn_float32 radius)
1419 len = 16 *
sizeof(vrpn_float32);
1422 try { buf =
new char[len]; }
1423 catch (...) {
return NULL; }
1426 for (i = 0; i < 3; i++)
1429 for (i = 0; i < 3; i++)
1432 for (i = 0; i < 3; i++)
1433 for (j = 0; j < 3; j++)
1443 const char *buffer,
const vrpn_int32 len, vrpn_float32 origin[3],
1444 vrpn_float32 force[3], vrpn_float32 jacobian[3][3], vrpn_float32 *radius)
1447 const char *mptr = buffer;
1449 if (len != 16 *
sizeof(vrpn_float32)) {
1451 "vrpn_ForceDevice: force field message payload error\n");
1452 fprintf(stderr,
" (got %d, expected %lud)\n", len,
1453 static_cast<unsigned long>(16 *
sizeof(vrpn_float32)));
1457 for (i = 0; i < 3; i++)
1460 for (i = 0; i < 3; i++)
1463 for (i = 0; i < 3; i++)
1464 for (j = 0; j < 3; j++)
1473 const vrpn_int32 error_code)
1480 len =
sizeof(vrpn_int32);
1483 try { buf =
new char[len]; }
1484 catch (...) {
return NULL; }
1493 const vrpn_int32 len,
1494 vrpn_int32 *error_code)
1497 const char *mptr = buffer;
1499 if (len !=
sizeof(vrpn_int32)) {
1500 fprintf(stderr,
"vrpn_ForceDevice: error message payload error\n");
1501 fprintf(stderr,
" (got %d, expected %lud)\n", len,
1502 static_cast<unsigned long>(
sizeof(vrpn_int32)));
1513 for (
int i = 0; i < 4; i++) {
1529 for (
int i = 0; i < 3; i++) {
1530 plane[i] = normal[i];
1540 struct timeval current_time;
1544 timestamp.tv_usec = current_time.tv_usec;
1551 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
1556 fprintf(stderr,
"vrpn_ForceDevice::sendError(): delete failed\n");
1572 len =
sizeof(vrpn_int32);
1575 try { buf =
new char[len]; }
1576 catch (...) {
return NULL; }
1586 const vrpn_int32 len,
1589 const char *mptr = buffer;
1591 if (len !=
sizeof(vrpn_int32)) {
1592 fprintf(stderr,
"vrpn_ForceDevice: "
1593 "enable constraint message payload error\n"
1594 " (got %d, expected %lud)\n",
1595 len,
static_cast<unsigned long>(
sizeof(vrpn_int32)));
1613 len =
sizeof(vrpn_int32);
1616 try { buf =
new char[len]; }
1617 catch (...) {
return NULL; }
1634 fprintf(stderr,
"vrpn_ForceDevice: "
1635 "Unknown or illegal constraint mode.\n");
1647 const vrpn_int32 len,
1650 const char *mptr = buffer;
1653 if (len !=
sizeof(vrpn_int32)) {
1654 fprintf(stderr,
"vrpn_ForceDevice: "
1655 "constraint mode payload error\n"
1656 " (got %d, expected %lud)\n",
1657 len,
static_cast<unsigned long>(
sizeof(vrpn_int32)));
1677 fprintf(stderr,
"vrpn_ForceDevice: "
1678 "Unknown or illegal constraint mode.\n");
1697 const vrpn_int32 len,
1716 const vrpn_int32 len,
1735 const char *buffer,
const vrpn_int32 len, vrpn_float32 *x, vrpn_float32 *y,
1752 const char *buffer,
const vrpn_int32 len, vrpn_float32 *x, vrpn_float32 *y,
1769 const char *buffer,
const vrpn_int32 len, vrpn_float32 *x, vrpn_float32 *y,
1783 len =
sizeof(vrpn_float32);
1786 try { buf =
new char[len]; }
1787 catch (...) {
return NULL; }
1797 const vrpn_int32 len,
1800 const char *mptr = buffer;
1802 if (len !=
sizeof(vrpn_float32)) {
1803 fprintf(stderr,
"vrpn_ForceDevice: "
1804 "set constraint spring message payload error\n"
1805 " (got %d, expected %lud)\n",
1806 len,
static_cast<unsigned long>(
sizeof(vrpn_float32)));
1821 vrpn_float32 y, vrpn_float32 z)
1827 len = 3 *
sizeof(vrpn_float32);
1830 try { buf =
new char[len]; }
1831 catch (...) {
return NULL; }
1843 const vrpn_int32 len, vrpn_float32 *x,
1844 vrpn_float32 *y, vrpn_float32 *z)
1846 const char *mptr = buffer;
1848 if (len != 3 *
sizeof(vrpn_float32)) {
1849 fprintf(stderr,
"vrpn_ForceDevice: "
1850 "decode point message payload error\n"
1851 " (got size %d, expected %lud)\n",
1852 len,
static_cast<unsigned long>(3 *
sizeof(vrpn_float32)));
1875 fprintf(stderr,
"vrpn_ForceDevice_Remote: No connection\n");
1882 fprintf(stderr,
"vrpn_ForceDevice_Remote:can't register handler\n");
1889 fprintf(stderr,
"vrpn_ForceDevice_Remote:can't register handler\n");
1896 fprintf(stderr,
"vrpn_ForceDevice_Remote:can't register handler\n");
1911 struct timeval current_time;
1915 timestamp.tv_usec = current_time.tv_usec;
1924 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
1929 fprintf(stderr,
"vrpn_ForceDevice::sendSurface(): delete failed\n");
1940 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
1945 fprintf(stderr,
"vrpn_ForceDevice::sendSurface(): delete failed\n");
1955 struct timeval current_time;
1959 timestamp.tv_usec = current_time.tv_usec;
1968 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
1973 fprintf(stderr,
"vrpn_ForceDevice::startSurface(): delete failed\n");
1983 struct timeval current_time;
1987 timestamp.tv_usec = current_time.tv_usec;
1998 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2003 fprintf(stderr,
"vrpn_ForceDevice::stopSurface(): delete failed\n");
2010 vrpn_float32 y, vrpn_float32 z)
2016 vrpn_float32 y, vrpn_float32 z)
2022 vrpn_int32 vert1, vrpn_int32 vert2,
2023 vrpn_int32 norm0, vrpn_int32 norm1,
2053 vrpn_int32 ParentNum )
2057 struct timeval current_time;
2063 timestamp.tv_usec = current_time.tv_usec;
2070 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2075 fprintf(stderr,
"vrpn_ForceDevice::addObject(): delete failed\n");
2086 struct timeval current_time;
2092 timestamp.tv_usec = current_time.tv_usec;
2099 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2104 fprintf(stderr,
"vrpn_ForceDevice::addObectExScene(): delete failed\n");
2113 vrpn_float32 x, vrpn_float32 y,
2118 struct timeval current_time;
2122 timestamp.tv_usec = current_time.tv_usec;
2129 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2134 fprintf(stderr,
"vrpn_ForceDevice::setObjVert(): delete failed\n");
2144 vrpn_float32 x, vrpn_float32 y,
2149 struct timeval current_time;
2153 timestamp.tv_usec = current_time.tv_usec;
2160 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2165 fprintf(stderr,
"vrpn_ForceDevice::setObjectNormal(): delete failed\n");
2172 vrpn_int32 objNum, vrpn_int32 triNum, vrpn_int32 vert0, vrpn_int32 vert1,
2173 vrpn_int32 vert2, vrpn_int32 norm0 , vrpn_int32 norm1 ,
2178 struct timeval current_time;
2182 timestamp.tv_usec = current_time.tv_usec;
2186 norm0, norm1, norm2);
2190 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2195 fprintf(stderr,
"vrpn_ForceDevice::setObjectTriangle(): delete failed\n");
2206 struct timeval current_time;
2210 timestamp.tv_usec = current_time.tv_usec;
2217 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2222 fprintf(stderr,
"vrpn_ForceDevice::removeObjectTriangle(): delete failed\n");
2234 struct timeval current_time;
2238 timestamp.tv_usec = current_time.tv_usec;
2247 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2252 fprintf(stderr,
"vrpn_ForceDevice::updateObjectTrimeshChanges(): delete failed\n");
2260 vrpn_int32 objNum, vrpn_float32 homMatrix[16])
2264 struct timeval current_time;
2268 timestamp.tv_usec = current_time.tv_usec;
2275 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2280 fprintf(stderr,
"vrpn_ForceDevice::setObjectTrimeshTransform(): delete failed\n");
2288 vrpn_float32 Pos[3])
2292 struct timeval current_time;
2296 timestamp.tv_usec = current_time.tv_usec;
2303 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2308 fprintf(stderr,
"vrpn_ForceDevice::setObjectPosition(): delete failed\n");
2316 vrpn_float32 axis[3],
2321 struct timeval current_time;
2325 timestamp.tv_usec = current_time.tv_usec;
2332 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2337 fprintf(stderr,
"vrpn_ForceDevice::setObjectOrientation(): delete failed\n");
2345 vrpn_float32 Scale[3])
2349 struct timeval current_time;
2353 timestamp.tv_usec = current_time.tv_usec;
2360 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2365 fprintf(stderr,
"vrpn_ForceDevice::setObjectScale(): delete failed\n");
2376 struct timeval current_time;
2380 timestamp.tv_usec = current_time.tv_usec;
2387 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2392 fprintf(stderr,
"vrpn_ForceDevice::removeObject(): delete failed\n");
2400 char *msgbuf = NULL;
2402 struct timeval current_time;
2406 timestamp.tv_usec = current_time.tv_usec;
2413 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2418 fprintf(stderr,
"vrpn_ForceDevice::clearObjectTrimesh(): delete failed\n");
2428 vrpn_int32 ParentNum)
2432 struct timeval current_time;
2436 timestamp.tv_usec = current_time.tv_usec;
2443 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2448 fprintf(stderr,
"vrpn_ForceDevice::moveToParent(): delete failed\n");
2456 vrpn_float32 axis[3],
2461 struct timeval current_time;
2465 timestamp.tv_usec = current_time.tv_usec;
2472 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2477 fprintf(stderr,
"vrpn_ForceDevice::setHapticOrigin(): delete failed\n");
2488 struct timeval current_time;
2492 timestamp.tv_usec = current_time.tv_usec;
2499 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2504 fprintf(stderr,
"vrpn_ForceDevice::setHapticScale(): delete failed\n");
2511 vrpn_float32 axis[3],
2516 struct timeval current_time;
2520 timestamp.tv_usec = current_time.tv_usec;
2527 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2532 fprintf(stderr,
"vrpn_ForceDevice::setSceneOrigin(): delete failed\n");
2547 vrpn_int32 objNum, vrpn_bool IsTouchable )
2551 struct timeval current_time;
2555 timestamp.tv_usec = current_time.tv_usec;
2562 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2567 fprintf(stderr,
"vrpn_ForceDevice::setObjectIsTouchable(): delete failed\n");
2578 struct timeval current_time;
2582 timestamp.tv_usec = current_time.tv_usec;
2589 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2594 fprintf(stderr,
"vrpn_ForceDevice::useHcollide(): delete failed\n");
2604 struct timeval current_time;
2608 timestamp.tv_usec = current_time.tv_usec;
2615 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2620 fprintf(stderr,
"vrpn_ForceDevice::useGhost(): delete failed\n");
2631 struct timeval current_time;
2635 timestamp.tv_usec = current_time.tv_usec;
2643 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2648 fprintf(stderr,
"vrpn_ForceDevice::startEffect(): delete failed\n");
2658 struct timeval current_time;
2662 timestamp.tv_usec = current_time.tv_usec;
2672 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2677 fprintf(stderr,
"vrpn_ForceDevice::stopEffect(): delete failed\n");
2688#ifndef FD_SPRINGS_AS_FIELDS
2732 fprintf(stderr,
"vrpn_ForceDevice_Remote::enableConstraint: "
2733 "Illegal value of enable (%d).\n",
2771 vrpn_float32 direction[3])
2821 vrpn_float32 force[3],
2822 vrpn_float32 jacobian[3][3],
2823 vrpn_float32 radius)
2827 struct timeval current_time;
2831 timestamp.tv_usec = current_time.tv_usec;
2838 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2843 fprintf(stderr,
"vrpn_ForceDevice::sendForceField(): delete failed\n");
2852 vrpn_float32 origin[3] = {0, 0, 0};
2853 vrpn_float32 force[3] = {0, 0, 0};
2854 vrpn_float32 jacobian[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
2855 vrpn_float32 radius = 0;
2859 struct timeval current_time;
2863 timestamp.tv_usec = current_time.tv_usec;
2870 fprintf(stderr,
"Phantom: cannot write message: tossing\n");
2875 fprintf(stderr,
"vrpn_ForceDevice::stopForceField(): delete failed\n");
2922 fprintf(stderr,
"vrpn_ForceDevice: error message payload"
2923 " error\n(got %d, expected %lud)\n",
2924 p.
payload_len,
static_cast<unsigned long>(
sizeof(vrpn_int32)));
2946 "vrpn_ForceDevice_Remote::send: Can't pack message.\n");
2953 fprintf(stderr,
"vrpn_ForceDevice_Remote::send(): delete failed\n");
2958#ifdef FD_SPRINGS_AS_FIELDS
2970 const float largeRadius = 100.0f;
3017 q_vec_type norm_line_dir;
3018 vrpn_float64 norm_len =
3022 if (norm_len == 0) {
3025 for (i = 0; i < 3; i++) {
3031 q_vec_type z_dir = {0, 0, 1};
3033 q_matrix_type forward;
3035 q_matrix_type reverse;
3036 q_from_two_vecs(q_forward, norm_line_dir, z_dir);
3037 q_to_row_matrix(forward, q_forward);
3038 q_invert(q_reverse, q_forward);
3039 q_to_row_matrix(reverse, q_reverse);
3044 q_matrix_type diagonal, temp, jacobian;
3045 for (i = 0; i < 4; i++) {
3046 for (j = 0; j < 4; j++) {
3047 if ((i == j) && (i < 2)) {
3051 diagonal[i][j] = 0.0;
3055 q_matrix_mult(temp, diagonal, forward);
3056 q_matrix_mult(jacobian, reverse, temp);
3060 for (i = 0; i < 3; i++) {
3061 for (j = 0; j < 3; j++) {
3062 c[i + j * 3] = (vrpn_float32)jacobian[i][j];
3066 setFF_Jacobian(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8]);
3076 vrpn_float64 norm_plane_dir[3];
3077 vrpn_float64 norm_len =
3081 if (norm_len == 0) {
3084 for (i = 0; i < 3; i++) {
3092 for (i = 0; i < 3; i++)
3093 for (j = 0; j < 3; j++)
3094 c[i + j * 3] = (vrpn_float32)(
3095 -
d_conKSpring * norm_plane_dir[i] * norm_plane_dir[j]);
3097 setFF_Jacobian(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8]);
int register_autodeleted_handler(vrpn_int32 type, vrpn_MESSAGEHANDLER handler, void *userdata, vrpn_int32 sender=vrpn_ANY_SENDER)
Registers a handler with the connection, and remembers to delete at destruction.
vrpn_Connection * d_connection
Connection that this object talks to.
void client_mainloop(void)
Handles functions that all clients should provide in their mainloop() (warning of no server,...
vrpn_int32 d_sender_id
Sender ID registered with the connection.
vrpn_BaseClass(const char *name, vrpn_Connection *c=NULL)
Names the device and assigns or opens connection, calls registration methods.
virtual int init(void)
Initialize things that the constructor can't. Returns 0 on success, -1 on failure.
void call_handlers(const CALLBACK_STRUCT &info)
This will pass the referenced parameter as a const to all the callbacks.
void setSceneOrigin(vrpn_float32 Pos[3], vrpn_float32 axis[3], vrpn_float32 angle)
void removeTriangle(vrpn_int32 triNum)
void removeObject(vrpn_int32 objNum)
vrpn_float32 d_conKSpring
void setObjectOrientation(vrpn_int32 objNum, vrpn_float32 axis[3], vrpn_float32 angle)
void setConstraintMode(ConstraintGeometry mode)
vrpn_int32 m_NextAvailableObjectID
void updateTrimeshChanges()
void setConstraintLinePoint(vrpn_float32 point[3])
void setVertex(vrpn_int32 vertNum, vrpn_float32 x, vrpn_float32 y, vrpn_float32 z)
functions for a single object
vrpn_float32 d_conPoint[3]
vrpn_float64 d_conPlaneNormal[3]
void setObjectIsTouchable(vrpn_int32 objNum, vrpn_bool IsTouchable=true)
void setObjectPosition(vrpn_int32 objNum, vrpn_float32 Pos[3])
void moveToParent(vrpn_int32 objNum, vrpn_int32 ParentNum)
Functions to organize the scene.
void removeObjectTriangle(vrpn_int32 objNum, vrpn_int32 triNum)
void setConstraintPlanePoint(vrpn_float32 point[3])
static int VRPN_CALLBACK handle_scp_change_message(void *userdata, vrpn_HANDLERPARAM p)
void updateObjectTrimeshChanges(vrpn_int32 objNum)
void setHapticScale(vrpn_float32 Scale)
void sendForceField(void)
void setTrimeshTransform(vrpn_float32 homMatrix[16])
void setConstraintKSpring(vrpn_float32 k)
void clearObjectTrimesh(vrpn_int32 objNum)
void setObjectVertex(vrpn_int32 objNum, vrpn_int32 vertNum, vrpn_float32 x, vrpn_float32 y, vrpn_float32 z)
void setConstraintPlaneNormal(vrpn_float32 normal[3])
void setObjectScale(vrpn_int32 objNum, vrpn_float32 Scale[3])
void addObjectExScene(vrpn_int32 objNum)
void setConstraintLineDirection(vrpn_float32 direction[3])
vrpn_float32 d_conPlanePoint[3]
virtual void mainloop()
Called once through each main loop iteration to handle updates. Remote object mainloop() should call ...
ConstraintGeometry d_conMode
virtual ~vrpn_ForceDevice_Remote(void)
vrpn_ForceDevice_Remote(const char *name, vrpn_Connection *cn=NULL)
vrpn_int32 getNewObjectID()
void setTriangle(vrpn_int32 triNum, vrpn_int32 vert0, vrpn_int32 vert1, vrpn_int32 vert2, vrpn_int32 norm0=-1, vrpn_int32 norm1=-1, vrpn_int32 norm2=-1)
void setHapticOrigin(vrpn_float32 Pos[3], vrpn_float32 axis[3], vrpn_float32 angle)
void addObject(vrpn_int32 objNum, vrpn_int32 ParentNum=-1)
functions for multiple objects in the haptic scene
void constraintToForceField(void)
void setObjectNormal(vrpn_int32 objNum, vrpn_int32 normNum, vrpn_float32 x, vrpn_float32 y, vrpn_float32 z)
void enableConstraint(vrpn_int32 enable)
void setConstraintPoint(vrpn_float32 point[3])
vrpn_Callback_List< vrpn_FORCESCPCB > d_scp_change_list
vrpn_Callback_List< vrpn_FORCEERRORCB > d_error_change_list
static int VRPN_CALLBACK handle_error_change_message(void *userdata, vrpn_HANDLERPARAM p)
void setObjectTriangle(vrpn_int32 objNum, vrpn_int32 triNum, vrpn_int32 vert0, vrpn_int32 vert1, vrpn_int32 vert2, vrpn_int32 norm0=-1, vrpn_int32 norm1=-1, vrpn_int32 norm2=-1)
static int VRPN_CALLBACK handle_force_change_message(void *userdata, vrpn_HANDLERPARAM p)
void send(const char *msgbuf, vrpn_int32 len, vrpn_int32 type)
vrpn_float32 d_conLinePoint[3]
void setNormal(vrpn_int32 normNum, vrpn_float32 x, vrpn_float32 y, vrpn_float32 z)
vrpn_Callback_List< vrpn_FORCECB > d_change_list
void stopForceField(void)
vrpn_float64 d_conLineDirection[3]
void setObjectTrimeshTransform(vrpn_int32 objNum, vrpn_float32 homMatrix[16])
vrpn_uint32 nbCustomEffectParams
static vrpn_int32 decode_objectScale(const char *buffer, vrpn_int32 len, vrpn_int32 *objNum, vrpn_float32 Scale[3])
static char * encode_setObjectIsTouchable(vrpn_int32 &len, const vrpn_int32 objNum, const vrpn_bool isTouchable)
void setFF_Radius(vrpn_float32 r)
static vrpn_int32 decode_enableConstraint(const char *buffer, const vrpn_int32 len, vrpn_int32 *enable)
vrpn_int32 setConstraintLineDirection_message_id
vrpn_int32 setConstraintKSpring_message_id
static vrpn_int32 decode_trimeshTransform(const char *buffer, const vrpn_int32 len, vrpn_int32 *objNum, vrpn_float32 homMatrix[16])
static vrpn_int32 decode_setHapticOrigin(const char *buffer, vrpn_int32 len, vrpn_float32 Pos[3], vrpn_float32 axis[3], vrpn_float32 *angle)
vrpn_float32 SurfaceKspring
vrpn_int32 force_message_id
static vrpn_int32 decode_setConstraintPoint(const char *buffer, const vrpn_int32 len, vrpn_float32 *x, vrpn_float32 *y, vrpn_float32 *z)
static char * encode_setHapticOrigin(vrpn_int32 &len, const vrpn_float32 Pos[3], const vrpn_float32 axis[3], const vrpn_float32 angle)
static vrpn_int32 decode_setConstraintLineDirection(const char *buffer, const vrpn_int32 len, vrpn_float32 *x, vrpn_float32 *y, vrpn_float32 *z)
static vrpn_int32 decode_objectPosition(const char *buffer, vrpn_int32 len, vrpn_int32 *objNum, vrpn_float32 Pos[3])
static char * encode_plane(vrpn_int32 &length, const vrpn_float32 *plane, const vrpn_float32 kspring, const vrpn_float32 kdamp, const vrpn_float32 fdyn, const vrpn_float32 fstat, const vrpn_int32 plane_index, const vrpn_int32 n_rec_cycles)
static vrpn_int32 decode_normal(const char *buffer, const vrpn_int32 len, vrpn_int32 *objNum, vrpn_int32 *vertNum, vrpn_float32 *x, vrpn_float32 *y, vrpn_float32 *z)
static char * encode_clearTrimesh(vrpn_int32 &len, const vrpn_int32 objNum)
vrpn_int32 addObject_message_id
vrpn_int32 setConstraintMode_message_id
static vrpn_int32 decode_forcefield(const char *buffer, const vrpn_int32 len, vrpn_float32 origin[3], vrpn_float32 force[3], vrpn_float32 jacobian[3][3], vrpn_float32 *radius)
void set_plane(vrpn_float32 *p)
vrpn_int32 setObjectScale_message_id
vrpn_float32 SurfaceKdamping
vrpn_int32 setHapticOrigin_message_id
static char * encode_triangle(vrpn_int32 &len, const vrpn_int32 objNum, const vrpn_int32 triNum, const vrpn_int32 vert0, const vrpn_int32 vert1, const vrpn_int32 vert2, const vrpn_int32 norm0, const vrpn_int32 norm1, const vrpn_int32 norm2)
vrpn_int32 moveToParent_message_id
vrpn_int32 setConstraintLinePoint_message_id
vrpn_float32 SurfaceBuzzFreq
vrpn_float32 SurfaceTextureWavelength
vrpn_float32 ff_origin[3]
static char * encode_setConstraintPoint(vrpn_int32 &len, vrpn_float32 x, vrpn_float32 y, vrpn_float32 z)
static vrpn_int32 decode_error(const char *buffer, const vrpn_int32 len, vrpn_int32 *error_code)
static vrpn_int32 decode_setConstraintKSpring(const char *buffer, const vrpn_int32 len, vrpn_float32 *k)
static char * encode_removeObject(vrpn_int32 &len, const vrpn_int32 objNum)
static vrpn_int32 decode_addObjectExScene(const char *buffer, vrpn_int32 len, vrpn_int32 *objNum)
static char * encode_normal(vrpn_int32 &len, const vrpn_int32 objNum, const vrpn_int32 vertNum, const vrpn_float32 x, const vrpn_float32 y, const vrpn_float32 z)
vrpn_int32 setSceneOrigin_message_id
static char * encode_objectPosition(vrpn_int32 &len, const vrpn_int32 objNum, const vrpn_float32 Pos[3])
static vrpn_int32 decode_setConstraintMode(const char *buffer, const vrpn_int32 len, ConstraintGeometry *mode)
static vrpn_int32 decode_setSceneOrigin(const char *buffer, vrpn_int32 len, vrpn_float32 Pos[3], vrpn_float32 axis[3], vrpn_float32 *angle)
static vrpn_int32 decode_removeTriangle(const char *buffer, const vrpn_int32 len, vrpn_int32 *objNum, vrpn_int32 *triNum)
static char * encode_updateTrimeshChanges(vrpn_int32 &len, const vrpn_int32 objNum, const vrpn_float32 kspring, const vrpn_float32 kdamp, const vrpn_float32 fdyn, const vrpn_float32 fstat)
static char * encode_scp(vrpn_int32 &length, const vrpn_float64 *pos, const vrpn_float64 *quat)
static char * encode_setConstraintMode(vrpn_int32 &len, ConstraintGeometry mode)
vrpn_int32 enableConstraint_message_id
static char * encode_removeTriangle(vrpn_int32 &len, const vrpn_int32 objNum, const vrpn_int32 triNum)
vrpn_int32 scp_message_id
static char * encodePoint(vrpn_int32 &len, vrpn_float32 x, vrpn_float32 y, vrpn_float32 z)
vrpn_float32 SurfaceBuzzAmp
static vrpn_int32 decode_updateTrimeshChanges(const char *buffer, const vrpn_int32 len, vrpn_int32 *objNum, vrpn_float32 *kspring, vrpn_float32 *kdamp, vrpn_float32 *fdyn, vrpn_float32 *fstat)
static char * encode_addObject(vrpn_int32 &len, const vrpn_int32 objNum, const vrpn_int32 ParentNum)
static char * encode_setTrimeshType(vrpn_int32 &len, const vrpn_int32 objNum, const vrpn_int32 type)
virtual int register_types(void)
Register the types of messages this device sends/receives. Return 0 on success, -1 on fail.
vrpn_int32 error_message_id
vrpn_int32 setObjectPosition_message_id
vrpn_int32 setConstraintPlaneNormal_message_id
static char * encode_setHapticScale(vrpn_int32 &len, const vrpn_float32 Scale)
static char * encode_forcefield(vrpn_int32 &len, const vrpn_float32 origin[3], const vrpn_float32 force[3], const vrpn_float32 jacobian[3][3], const vrpn_float32 radius)
static vrpn_int32 decode_setConstraintPlaneNormal(const char *buffer, const vrpn_int32 len, vrpn_float32 *x, vrpn_float32 *y, vrpn_float32 *z)
vrpn_int32 clearTrimesh_message_id
static char * encode_objectScale(vrpn_int32 &len, const vrpn_int32 objNum, const vrpn_float32 Scale[3])
static vrpn_int32 decode_setConstraintPlanePoint(const char *buffer, const vrpn_int32 len, vrpn_float32 *x, vrpn_float32 *y, vrpn_float32 *z)
static vrpn_int32 decode_scp(const char *buffer, const vrpn_int32 len, vrpn_float64 *pos, vrpn_float64 *quat)
static char * encode_vertex(vrpn_int32 &len, const vrpn_int32 objNum, const vrpn_int32 vertNum, const vrpn_float32 x, const vrpn_float32 y, const vrpn_float32 z)
void setFF_Origin(vrpn_float32 x, vrpn_float32 y, vrpn_float32 z)
static char * encode_error(vrpn_int32 &len, const vrpn_int32 error_code)
static vrpn_int32 decode_setConstraintLinePoint(const char *buffer, const vrpn_int32 len, vrpn_float32 *x, vrpn_float32 *y, vrpn_float32 *z)
static char * encode_trimeshTransform(vrpn_int32 &len, const vrpn_int32 objNum, const vrpn_float32 homMatrix[16])
vrpn_int32 setTriangle_message_id
static vrpn_int32 decode_surface_effects(const char *buffer, const vrpn_int32 len, vrpn_float32 *k_adhesion_norm, vrpn_float32 *k_adhesion_lat, vrpn_float32 *tex_amp, vrpn_float32 *tex_wl, vrpn_float32 *buzz_amp, vrpn_float32 *buzz_freq)
vrpn_int32 customEffectId
void setFF_Force(vrpn_float32 fx, vrpn_float32 fy, vrpn_float32 fz)
static char * encode_setConstraintKSpring(vrpn_int32 &len, vrpn_float32 k)
static char * encode_setConstraintLineDirection(vrpn_int32 &len, vrpn_float32 x, vrpn_float32 y, vrpn_float32 z)
vrpn_int32 plane_message_id
static char * encode_setConstraintPlaneNormal(vrpn_int32 &len, vrpn_float32 x, vrpn_float32 y, vrpn_float32 z)
static char * encode_custom_effect(vrpn_int32 &len, vrpn_uint32 effectId, const vrpn_float32 *params, vrpn_uint32 nbParams)
static vrpn_int32 decode_addObject(const char *buffer, vrpn_int32 len, vrpn_int32 *objNum, vrpn_int32 *ParentNum)
static vrpn_int32 decode_setTrimeshType(const char *buffer, const vrpn_int32 len, vrpn_int32 *objNum, vrpn_int32 *type)
static char * encode_setConstraintLinePoint(vrpn_int32 &len, vrpn_float32 x, vrpn_float32 y, vrpn_float32 z)
virtual ~vrpn_ForceDevice(void)
static vrpn_int32 decode_setObjectIsTouchable(const char *buffer, vrpn_int32 len, vrpn_int32 *objNum, vrpn_bool *isTouchable)
vrpn_float32 SurfaceKadhesionNormal
vrpn_int32 setConstraintPoint_message_id
vrpn_float32 SurfaceTextureAmplitude
vrpn_int32 updateTrimeshChanges_message_id
static vrpn_int32 decode_custom_effect(const char *buffer, const vrpn_int32 len, vrpn_uint32 *effectId, vrpn_float32 **params, vrpn_uint32 *nbParams)
vrpn_int32 setConstraintPlanePoint_message_id
static vrpn_int32 decode_objectOrientation(const char *buffer, vrpn_int32 len, vrpn_int32 *objNum, vrpn_float32 axis[3], vrpn_float32 *angle)
static vrpn_int32 decode_clearTrimesh(const char *buffer, vrpn_int32 len, vrpn_int32 *objNum)
vrpn_ForceDevice(const char *name, vrpn_Connection *c)
vrpn_int32 setHapticScale_message_id
static vrpn_int32 decode_triangle(const char *buffer, const vrpn_int32 len, vrpn_int32 *objNum, vrpn_int32 *triNum, vrpn_int32 *vert0, vrpn_int32 *vert1, vrpn_int32 *vert2, vrpn_int32 *norm0, vrpn_int32 *norm1, vrpn_int32 *norm2)
vrpn_int32 addObjectExScene_message_id
static vrpn_int32 decode_force(const char *buffer, const vrpn_int32 len, vrpn_float64 *force)
void sendError(int error_code)
static char * encode_objectOrientation(vrpn_int32 &len, const vrpn_int32 objNum, const vrpn_float32 axis[3], const vrpn_float32 angle)
vrpn_int32 transformTrimesh_message_id
vrpn_int32 setObjectOrientation_message_id
vrpn_int32 getNewObjectID_message_id
void setCustomEffect(vrpn_int32 effectId, vrpn_float32 *params=NULL, vrpn_uint32 nbParams=0)
static char * encode_addObjectExScene(vrpn_int32 &len, const vrpn_int32 objNum)
vrpn_int32 removeTriangle_message_id
static vrpn_int32 decode_moveToParent(const char *buffer, vrpn_int32 len, vrpn_int32 *objNum, vrpn_int32 *parentNum)
vrpn_int32 setNormal_message_id
vrpn_int32 setTrimeshType_message_id
static char * encode_surface_effects(vrpn_int32 &len, const vrpn_float32 k_adhesion_norm, const vrpn_float32 k_adhesion_lat, const vrpn_float32 tex_amp, const vrpn_float32 tex_wl, const vrpn_float32 buzz_amp, const vrpn_float32 buzz_freq)
vrpn_int32 custom_effect_message_id
vrpn_int32 forcefield_message_id
static vrpn_int32 decodePoint(const char *buffer, const vrpn_int32 len, vrpn_float32 *x, vrpn_float32 *y, vrpn_float32 *z)
static char * encode_setConstraintPlanePoint(vrpn_int32 &len, vrpn_float32 x, vrpn_float32 y, vrpn_float32 z)
vrpn_float32 SurfaceFdynamic
static char * encode_enableConstraint(vrpn_int32 &len, vrpn_int32 enable)
vrpn_float32 SurfaceFstatic
static char * encode_force(vrpn_int32 &length, const vrpn_float64 *force)
static char * encode_moveToParent(vrpn_int32 &len, const vrpn_int32 objNum, const vrpn_int32 parentNum)
vrpn_int32 removeObject_message_id
static vrpn_int32 decode_vertex(const char *buffer, const vrpn_int32 len, vrpn_int32 *objNum, vrpn_int32 *vertNum, vrpn_float32 *x, vrpn_float32 *y, vrpn_float32 *z)
vrpn_int32 setVertex_message_id
static char * encode_setSceneOrigin(vrpn_int32 &len, const vrpn_float32 Pos[3], const vrpn_float32 axis[3], const vrpn_float32 angle)
static vrpn_int32 decode_removeObject(const char *buffer, vrpn_int32 len, vrpn_int32 *objNum)
static vrpn_int32 decode_setHapticScale(const char *buffer, vrpn_int32 len, vrpn_float32 *Scale)
vrpn_float32 * customEffectParams
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)
vrpn_int32 plane_effects_message_id
vrpn_float32 SurfaceKadhesionLateral
vrpn_float32 ff_jacobian[3][3]
vrpn_int32 setObjectIsTouchable_message_id
static vrpn_int32 decode_plane(const char *buffer, const vrpn_int32 len, vrpn_float32 *plane, vrpn_float32 *kspring, vrpn_float32 *kdamp, vrpn_float32 *fdyn, vrpn_float32 *fstat, vrpn_int32 *plane_index, vrpn_int32 *n_rec_cycles)
This structure is what is passed to a vrpn_Connection message callback.
const vrpn_uint32 vrpn_CONNECTION_RELIABLE
Classes of service for messages, specify multiple by ORing them together Priority of satisfying these...
const vrpn_uint32 vrpn_CONNECTION_LOW_LATENCY
class VRPN_API vrpn_Connection
VRPN_API int vrpn_unbuffer(const char **buffer, timeval *t)
Utility routine for taking a struct timeval from a buffer that was sent as a message.
VRPN_API int vrpn_buffer(char **insertPt, vrpn_int32 *buflen, const timeval t)
Utility routine for placing a timeval struct into a buffer that is to be sent as a message.
#define vrpn_gettimeofday