Пример #1
0
/*
 * Class:     visad_java3d_TrackdJNI
 * Method:    get_trackd_c
 * Signature: ([I[F[F[F[I[I)V
 */
  JNIEXPORT void JNICALL Java_visad_java3d_TrackdJNI_get_1trackd_1c
    (JNIEnv *env, jobject obj, jintArray number_of_sensors_j,
     jfloatArray sensor_positions_j, jfloatArray sensor_angles_j,
     jfloatArray sensor_matrices_j, jintArray number_of_buttons_j,
     jintArray button_states_j) {

     int ns, nb, is, ib, i, j, k;
     float pos[3];
     float mat[4][4];

     jint *number_of_sensors =
       (*env)->GetIntArrayElements(env, number_of_sensors_j, 0);
     jfloat *sensor_positions =
       (*env)->GetFloatArrayElements(env, sensor_positions_j, 0);
     jfloat *sensor_angles =
       (*env)->GetFloatArrayElements(env, sensor_angles_j, 0);
     jfloat *sensor_matrices =
       (*env)->GetFloatArrayElements(env, sensor_matrices_j, 0);
     jint *number_of_buttons =
       (*env)->GetIntArrayElements(env, number_of_buttons_j, 0);
     jint *button_states =
       (*env)->GetIntArrayElements(env, button_states_j, 0);

     ns = trackdGetNumberOfSensors(tracker);
     if (ns > number_of_sensors[0]) ns = number_of_sensors[0];
     number_of_sensors[0] = ns;
     for (is=0; is<ns; is++) {
       trackdGetPosition(tracker, is, pos);
       sensor_positions[3*is] = pos[0];
       sensor_positions[3*is+1] = pos[1];
       sensor_positions[3*is+2] = pos[2];
       trackdGetEulerAngles(tracker, is, pos);
       sensor_angles[3*is] = pos[0];
       sensor_angles[3*is+1] = pos[1];
       sensor_angles[3*is+2] = pos[2];
       trackdGetMatrix(tracker, is, mat);
       k = 0;
       for (i=0; i<4; i++) {
         for (j=0; j<4; j++) {
           sensor_matrices[16*is+k] = mat[i][j];
           k++;
         }
       }
     }

     nb = trackdGetNumberOfButtons(controller);
     if (nb > number_of_buttons[0]) nb = number_of_buttons[0];
     number_of_buttons[0] = nb;
     for (ib=0; ib<nb; ib++) {
       button_states[ib] = trackdGetButton(controller, ib);
     }
     (*env)->ReleaseIntArrayElements(env, number_of_sensors_j, number_of_sensors, 0);
     (*env)->ReleaseFloatArrayElements(env, sensor_positions_j, sensor_positions, 0);
     (*env)->ReleaseFloatArrayElements(env, sensor_angles_j, sensor_angles, 0);
     (*env)->ReleaseFloatArrayElements(env, sensor_matrices_j, sensor_matrices, 0);
     (*env)->ReleaseIntArrayElements(env, number_of_buttons_j, number_of_buttons, 0);
     (*env)->ReleaseIntArrayElements(env, button_states_j, button_states, 0);
  }
Пример #2
0
TrackDClient::TrackDClient(
        int                          trackerShMemKey,
        int                          wandShMemKey,
        const Array<std::string>     &trackerEventsToGenerate,
        const double                 &trackerUnitsToRoomUnitsScale,
        const CoordinateFrame        &deviceToRoom,
        const Array<CoordinateFrame> &propToTracker,
        const Array<CoordinateFrame> &finalOffset,
        const Array<std::string>     &buttonEventsToGenerate,
        const Array<std::string>     &valuatorEventsToGenerate)
{
  _tEventNames = trackerEventsToGenerate;
  _trackerUnitsToRoomUnitsScale = trackerUnitsToRoomUnitsScale;
  _deviceToRoom = deviceToRoom;
  _propToTracker = propToTracker;
  _finalOffset = finalOffset;
  _bEventNames = buttonEventsToGenerate;
  _vEventNames = valuatorEventsToGenerate;
  
  _trackerMemory = trackdInitTrackerReader(trackerShMemKey);
  if (_trackerMemory == NULL) {
    cerr << "TrackDClient:: Could not initialize tracker reader." << endl;
    exit(1);
  }
  
  _wandMemory = trackdInitControllerReader(wandShMemKey);
  if (_wandMemory == NULL) {
    cerr << "TrackDClient:: Could not initialize wand reader." << endl;
    exit(1);
  }
  
  _numSensors = trackdGetNumberOfSensors(_trackerMemory);
  _numButtons = trackdGetNumberOfButtons(_wandMemory);
  for (int i=0;i<_numButtons;i++) {
    _buttonStates.append(0);
  }
  _numValuators = trackdGetNumberOfValuators(_wandMemory);
  for (int i=0;i<_numValuators;i++) {
    _valuatorStates.append(0.0);
  }
}