Esempio n. 1
0
void	CAnimationTrack::Sample( float animTime, Transform& fromKeyFrame, Transform& toKeyFrame, float& weight ) const
{
	size_t fromKeyIndex = size_t(animTime * AnimationFrameRate) % (m_keyFrameCount - 1);
	size_t toKeyIndex = ( fromKeyIndex + 1 ) % (m_keyFrameCount - 1);// Min( fromKeyIndex + 1, m_keyFrameCount - 1 );

	GetKeyFrame( fromKeyIndex, fromKeyFrame );
	GetKeyFrame( toKeyIndex, toKeyFrame );
	weight = animTime * AnimationFrameRate - ((float)fromKeyIndex);
}
Esempio n. 2
0
bool ViewerIBA::OnKeyDown(int key) {
#ifdef __linux__
  if (key == VW_KEY_CTRL_KEY_VALUE) {
    m_ctrlDown = true;
    return true;
  }
  if (m_ctrlDown) {
    key = key - 'a' + 1;
  }
#endif
  if (Viewer::OnKeyDown(key)) {
    return true;
  }
//#ifdef CFG_DEBUG
#if 0
//#if 1
  UT::Print("%d\n", key);
#endif
//#ifdef CFG_DEBUG
#if 0
  if (key == '+' || key == '-') {
    Camera &C = m_LBA->m_CsLF[m_iLFActive];
    if (key == '+') {
      C.m_p.y() += 0.1f;
    } else {
      C.m_p.y() -= 0.1f;
    }
    C.m_T.SetPosition(C.m_p);
    return true;
  }
#endif
#ifdef CFG_STEREO
  if (key == '1' || key == '2') {
     ActivateCamera(key == '2');
    return true;
  }
#endif
  const int nKFs = GetKeyFrames();
  const bool activeKF = m_iFrmActive < nKFs;
  switch (key) {
  case VW_KEY_XD_DRAW_VIEW_TYPE:
    if (m_keyDrawViewType == DRAW_VIEW_PROFILE) {
      m_keyDrawViewType = m_keyDrawViewTypeBkp;
    } else {
      m_keyDrawViewType.Press();
    }
    return true;
  case VW_KEY_XD_PAUSE:   m_keyPause.Press();   return true;
  case VW_KEY_XD_STEP:    m_keyStep.Press();    return true;
  case VW_KEY_XD_SAVE:
    if (m_fileNameSave == "") {
      m_fileNameSave = UT::Input<std::string>("save_file");
    }
    m_iFrmSave = GetLocalFrame(m_iLF)->m_T.m_iFrm;
    m_keyStep.Press();
    //m_handler.Quit();
    return true;
  case VW_KEY_XD_SCREEN:
    if (m_fileNameScreen == "") {
      m_fileNameScreen = UT::Input<std::string>("screen_file");
    }
    if (m_fileNameScreen != "" && UT::FileNameExtractSuffix<int>(m_fileNameScreen) == -1) {
      bool resize = m_pWnd->size().x != m_K.m_K.w() || m_pWnd->size().y != m_K.m_K.h();
      if (resize) {
        const char inp = UT::Input<char>("resize (y/n)");
        if (inp != 'y' && inp != 'Y') {
          resize = false;
        }
      }
      SaveScreen(UT::FileNameAppendSuffix(m_fileNameScreen), resize);
    }
    return true;
  //case VW_KEY_XD_ACTIVATE_NEXT_FRAME:   ActivateFrame(m_iFrmActive + 1);  return true;
  //case VW_KEY_XD_ACTIVATE_LAST_FRAME:   ActivateFrame(m_iFrmActive - 1);  return true;
  case VW_KEY_XD_ACTIVATE_NEXT_FRAME:
  case VW_KEY_XD_ACTIVATE_LAST_FRAME: {
    const bool next = key == VW_KEY_XD_ACTIVATE_NEXT_FRAME;
    int iFrm = next ? m_iFrmActive + 1 : m_iFrmActive - 1;
    if (m_iFtrActive.Valid()) {
      const int nLFs = GetLocalFrames(), nFrms = nKFs + nLFs;
      const int iKF = m_iFtrActive.m_ix.m_iKF, ix = m_iFtrActive.m_ix.m_ix;
      while (iFrm >= 0 && iFrm < nFrms && iFrm != iKF) {
        const FRM::Frame &F = *(iFrm < nKFs ? GetKeyFrame(iFrm) :
                                              GetLocalFrame((iFrm - nKFs + m_iLF + 1) % nLFs));
        const int iz = F.SearchFeatureMeasurement(iKF, ix);
        if (iz != -1
#ifdef CFG_STEREO
        && (!m_rightActive && F.m_zs[iz].m_z.Valid() || m_rightActive && F.m_zs[iz].m_zr.Valid())
#endif
        ) {
          break;
        }
        iFrm = next ? iFrm + 1 : iFrm - 1;
      }
    }
    ActivateFrame(iFrm);
    return true;
  }
  case VW_KEY_XD_ACTIVATE_KEY_FRAME:
    if (m_iFtrActive.m_ix.Valid()) {
      ActivateFrame(m_iFtrActive.m_ix.m_iKF);
    } else {
      ActivateFrame(m_iKFActive);
    }
    return true;
  case VW_KEY_XD_ACTIVATE_LOCAL_FRAME:
    if (m_iFtrActive.m_iz.Valid() && m_iFtrActive.m_iz.m_iLF != -1) {
      ActivateLocalFrame(m_iFtrActive.m_iz.m_iLF);
    } else if (activeKF) {
      ActivateLocalFrame(m_iLFActive);
    } else {
      ActivateLocalFrame(m_iLFActiveLast);
    }
    return true;
  case VW_KEY_XD_ACTIVATE_CURRENT_FRAME:
    ActivateLocalFrame(m_iLF);
    return true;
  case VW_KEY_XD_DRAW_CAMERA_TYPE_NEXT:
  case VW_KEY_XD_DRAW_CAMERA_TYPE_LAST:
    if (activeKF) {
      m_keyDrawCamTypeKF.Press(key == VW_KEY_XD_DRAW_CAMERA_TYPE_NEXT, false);
      switch (m_keyDrawCamTypeKF) {
      case DRAW_CAM_KF_LBA:
        m_keyDrawCamTypeLF = DRAW_CAM_LF_LBA;
        m_keyDrawDepType = DRAW_DEP_LBA;
        break;
      case DRAW_CAM_KF_GBA:
        m_keyDrawDepType = DRAW_DEP_GBA;
        break;
#ifdef CFG_GROUND_TRUTH
      case DRAW_CAM_KF_GT:
        m_keyDrawCamTypeLF = DRAW_CAM_LF_GT;
        if (!m_solver->m_internal->m_DsGT.empty()) {
          m_keyDrawDepType = DRAW_DEP_GT;
        }
        break;
#endif
      }
    } else {
      m_keyDrawCamTypeLF.Press(key == VW_KEY_XD_DRAW_CAMERA_TYPE_NEXT, false);
      switch (m_keyDrawCamTypeLF) {
      case DRAW_CAM_LF_LBA:
        m_keyDrawCamTypeKF = DRAW_CAM_KF_LBA;
        m_keyDrawDepType = DRAW_DEP_LBA;
        break;
#ifdef CFG_GROUND_TRUTH
      case DRAW_CAM_LF_GT:
        m_keyDrawCamTypeKF = DRAW_CAM_KF_GT;
        if (!m_solver->m_internal->m_DsGT.empty()) {
          m_keyDrawDepType = DRAW_DEP_GT;
        }
        break;
#endif
      }
    }
    ActivateFrame(m_iFrmActive);
    return true;
#ifdef CFG_GROUND_TRUTH
  case VW_KEY_XD_DRAW_CAMERA_TYPE_GROUND_TRUTH:
    if (activeKF && m_keyDrawCamTypeKF == DRAW_CAM_KF_GT) {
      m_keyDrawCamTypeKF.Set(DRAW_CAM_KF_GBA);
      m_keyDrawDepType = DRAW_DEP_GBA;
    } else if (!activeKF && m_keyDrawCamTypeLF == DRAW_CAM_LF_GT) {
      m_keyDrawCamTypeKF.Set(DRAW_CAM_KF_LBA);
      m_keyDrawCamTypeLF = DRAW_CAM_LF_LBA;
      m_keyDrawDepType = DRAW_DEP_LBA;
    } else if (activeKF && GetCameraKF(m_iKFActive, DRAW_CAM_KF_GT).Valid() ||
              !activeKF && GetCameraLF(m_iLFActive, DRAW_CAM_LF_GT).Valid()) {
      m_keyDrawCamTypeKF.Set(DRAW_CAM_KF_GT);
      m_keyDrawCamTypeLF = DRAW_CAM_LF_GT;
      if (!m_solver->m_internal->m_DsGT.empty()) {
        m_keyDrawDepType = DRAW_DEP_GT;
      }
    }
    ActivateFrame(m_iFrmActive);
    return true;
#endif
  case VW_KEY_XD_DRAW_DEPTH_TYPE_NEXT:
  case VW_KEY_XD_DRAW_DEPTH_TYPE_LAST:
    m_keyDrawDepType.Press(key == VW_KEY_XD_DRAW_DEPTH_TYPE_NEXT, false);
    return true;
  case VW_KEY_XD_DRAW_STRING:     m_keyDrawString.Press();  return true;
  case VW_KEY_XD_DRAW_TIME_LINE:  m_keyDrawTlnType.Press(); return true;
  case VW_KEY_XD_DRAW_TIME_LINE_BRIGHTNESS_INCREASE_1:
  case VW_KEY_XD_DRAW_TIME_LINE_BRIGHTNESS_DECREASE_1:
  case VW_KEY_XD_DRAW_TIME_LINE_BRIGHTNESS_INCREASE_2:
  case VW_KEY_XD_DRAW_TIME_LINE_BRIGHTNESS_DECREASE_2:
    if (m_keyDrawTlnType == DRAW_TLN_FEATURE_MATCH) {
      m_keyDrawTlnMaxFtrMatches.Press(key == VW_KEY_XD_DRAW_TIME_LINE_BRIGHTNESS_DECREASE_1 ||
                                      key == VW_KEY_XD_DRAW_TIME_LINE_BRIGHTNESS_DECREASE_2);
    } else if (key == VW_KEY_XD_DRAW_TIME_LINE_BRIGHTNESS_INCREASE_1 ||
               key == VW_KEY_XD_DRAW_TIME_LINE_BRIGHTNESS_DECREASE_1) {
      m_keyDrawTlnPriorVarPos.Press(key == VW_KEY_XD_DRAW_TIME_LINE_BRIGHTNESS_INCREASE_1);
    } else {
      m_keyDrawTlnPriorVarRot.Press(key == VW_KEY_XD_DRAW_TIME_LINE_BRIGHTNESS_INCREASE_2);
    }
    return true;
  }
  if (m_keyDrawViewType == DRAW_VIEW_2D || m_keyDrawViewType == DRAW_VIEW_3D) {
    switch (key) {
    case VW_KEY_XD_DRAW_AXIS:
      m_keyDrawAxis.Press();
      return true;
    case VW_KEY_XD_DRAW_AXIS_LENGTH_INCREASE:
    case VW_KEY_XD_DRAW_AXIS_LENGTH_DECREASE:
      if (m_keyDrawAxis != DRAW_AXIS_NONE) {
        m_keyDrawAxisLen.Press(key == VW_KEY_XD_DRAW_AXIS_LENGTH_INCREASE);
        m_frustrum.SetAxisLength(m_keyDrawAxisLen);
        m_frustrumActive.SetAxisLength(m_keyDrawAxisLen);
        return true;
      }
      break;
    case VW_KEY_XD_DRAW_DEPTH_PLANE:
      m_keyDrawDepPlane.Press();
      return true;
    case VW_KEY_XD_DRAW_DEPTH_VARIANCE_INCREASE:
    case VW_KEY_XD_DRAW_DEPTH_VARIANCE_DECREASE:
      m_keyDrawDepVar.Press(key == VW_KEY_XD_DRAW_DEPTH_VARIANCE_INCREASE);
      return true;
    case VW_KEY_XD_DRAW_COVARIANCE_PROBABILITY_INCREASE:
    case VW_KEY_XD_DRAW_COVARIANCE_PROBABILITY_DECREASE:
      if (m_keyDrawTlnType != DRAW_TLN_NONE ||
         (m_keyDrawViewType == DRAW_VIEW_2D && (m_keyDrawErrType2D == DRAW_ERR_ALL ||
                                                m_keyDrawErrType2D == DRAW_ERR_COVARIANCE)) ||
         (m_keyDrawViewType == DRAW_VIEW_3D && (m_keyDrawErrType3D == DRAW_ERR_ALL ||
                                                m_keyDrawErrType3D == DRAW_ERR_COVARIANCE))) {
        m_keyDrawCovProb.Press(key == VW_KEY_XD_DRAW_COVARIANCE_PROBABILITY_INCREASE);
        return true;
      }
      break;
    case VW_KEY_XD_DRAW_COVARIANCE_SCALE_INCREASE:
    case VW_KEY_XD_DRAW_COVARIANCE_SCALE_DECREASE:
      if (m_keyDrawTlnType != DRAW_TLN_NONE ||
         (m_keyDrawViewType == DRAW_VIEW_2D && (m_keyDrawErrType2D == DRAW_ERR_ALL ||
                                                m_keyDrawErrType2D == DRAW_ERR_COVARIANCE)
       || m_keyDrawViewType == DRAW_VIEW_3D && (m_keyDrawErrType3D == DRAW_ERR_ALL ||
                                                m_keyDrawErrType3D == DRAW_ERR_COVARIANCE))) {
        m_keyDrawCovScale.Press(key == VW_KEY_XD_DRAW_COVARIANCE_SCALE_INCREASE);
        return true;
      }
      break;
    case VW_KEY_XD_INPUT_ACTIVE_FEATURE: {
      const int iFrm = UT::Input<int>(" Frame");
      const std::vector<KeyFrame>::const_iterator iKF = std::lower_bound(m_GBA->m_KFs.begin(),
                                                                         m_GBA->m_KFs.end(), iFrm);
      if (iKF != m_GBA->m_KFs.end() && *iKF == iFrm) {
        const int ix = UT::Input<int>("Source");
        if (ix < 0 || ix >= static_cast<int>(iKF->m_xs.size())) {
          return false;
        }
        const int _iKF = static_cast<int>(iKF - m_GBA->m_KFs.begin());
        const FRM::Frame &F = *(activeKF ? GetKeyFrame(m_iKFActive) : GetLocalFrame(m_iLFActive));
        const int iz = F.SearchFeatureMeasurement(_iKF, ix);
        ActivateFeature(FeatureIndex::Source(_iKF, ix), iz);
      }
      return false;
    }
    case VW_KEY_PROFILE_ACTIVATE:
      if (m_keyDrawViewType != DRAW_VIEW_PROFILE) {
        m_keyDrawViewTypeBkp = m_keyDrawViewType;
        m_keyDrawViewType = DRAW_VIEW_PROFILE;
      }
      return true;
    }
  } else if (m_keyDrawViewType == DRAW_VIEW_PROFILE) {
    switch (key) {
    case VW_KEY_PROFILE_ACTIVATE:
      m_keyDrawViewType = m_keyDrawViewTypeBkp;
      return true;
    case VM_KEY_PROFILE_LEVEL_1_NEXT:
    case VM_KEY_PROFILE_LEVEL_1_LAST: {
      const int types[] = {DRAW_PRF_ACCELERATION, DRAW_PRF_IMU_DELTA_ROTATION_STATE,
                           DRAW_PRF_CAMERA_PRIOR_ROTATION_STATE, DRAW_PRF_REPROJECTION_ERROR,
                           DRAW_PRF_STATE_ROTATION_ABSOLUTE,
                           DRAW_PRF_TYPES};
      const int N = sizeof(types) / sizeof(int);
      DrawProfileTypeStep(types, N, key == VM_KEY_PROFILE_LEVEL_1_NEXT);
      return true; }
    case VM_KEY_PROFILE_LEVEL_2_NEXT:
    case VM_KEY_PROFILE_LEVEL_2_LAST: {
      const int types[] = {DRAW_PRF_ACCELERATION, DRAW_PRF_GYROSCOPE,
                           DRAW_PRF_IMU_DELTA_ROTATION_STATE,
                           DRAW_PRF_IMU_DELTA_POSITION_STATE,
                           DRAW_PRF_IMU_DELTA_VELOCITY_STATE,
                           DRAW_PRF_IMU_DELTA_BIAS_ACCELERATION_STATE,
                           DRAW_PRF_IMU_DELTA_BIAS_GYROSCOPE_STATE,
                           DRAW_PRF_CAMERA_PRIOR_ROTATION_STATE,
                           DRAW_PRF_CAMERA_PRIOR_POSITION_STATE,
                           DRAW_PRF_CAMERA_PRIOR_VELOCITY_STATE,
                           DRAW_PRF_CAMERA_PRIOR_BIAS_ACCELERATION_STATE,
                           DRAW_PRF_CAMERA_PRIOR_BIAS_GYROSCOPE_STATE,
                           DRAW_PRF_REPROJECTION_ERROR,
                           DRAW_PRF_STATE_ROTATION_ABSOLUTE,
                           DRAW_PRF_STATE_POSITION_ABSOLUTE,
                           DRAW_PRF_STATE_VELOCITY,
                           DRAW_PRF_STATE_BIAS_ACCELERATION,
                           DRAW_PRF_STATE_BIAS_GYROSCOPE,
                           DRAW_PRF_TYPES};
      const int N = sizeof(types) / sizeof(int);
      DrawProfileTypeStep(types, N, key == VM_KEY_PROFILE_LEVEL_2_NEXT);
      return true; }
    case VM_KEY_PROFILE_LEVEL_3_NEXT:
    case VM_KEY_PROFILE_LEVEL_3_LAST: {
      const int typeBkp = m_keyDrawPrfType;
      while (m_keyDrawPrfType.Press(key == VM_KEY_PROFILE_LEVEL_3_NEXT, false) &&
             !DrawProfileTypeValid()) {}
      if (!DrawProfileTypeValid()) {
        m_keyDrawPrfType = typeBkp;
      }
      return true; }
    }
  }
  if (m_keyDrawViewType == DRAW_VIEW_2D) {
    switch (key) {
    case VW_KEY_2D_DRAW_FEATURE_TYPE:     m_keyDrawFtrType.Press();   return true;
    case VW_KEY_2D_DRAW_PROJECTION_TYPE:  m_keyDrawPrjType.Press();   return true;
    case VW_KEY_2D_DRAW_ERROR_TYPE:       m_keyDrawErrType2D.Press(); return true;
    }
  } else if (m_keyDrawViewType == DRAW_VIEW_3D) {
    switch (key) {
    case VW_KEY_3D_DRAW_MOTION_TYPE:
      if (activeKF) {
        m_keyDrawMotTypeKF.Press();
      } else {
        m_keyDrawMotTypeLF.Press();
      }
      return true;
    case VW_KEY_3D_DRAW_STRUCTURE_TYPE:
      m_keyDrawStrType.Press();
      return true;
    case VW_KEY_3D_DRAW_DEPTH_COMPARE_TYPE:
      if (m_keyDrawErrType3D == DRAW_ERR_ALL || m_keyDrawErrType3D == DRAW_ERR_MEAN) {
        m_keyDrawDepTypeCMP.Press();
        //while(m_keyDrawDepTypeCMP == m_keyDrawDepType)
        //  m_keyDrawDepTypeCMP.Press();
      }
      return true;
    case VW_KEY_3D_DRAW_CAMERA_SIZE_INCREASE:
    case VW_KEY_3D_DRAW_CAMERA_SIZE_DECREASE:
      m_keyDrawCamSize.Press(key == VW_KEY_3D_DRAW_CAMERA_SIZE_INCREASE);
      m_frustrum.SetSize(m_keyDrawCamSize);
      m_frustrumActive.SetSize(m_keyDrawCamSize * VW_CAMERA_SIZE_ACTIVE_RATIO);
      return true;
    case VW_KEY_3D_DRAW_CAMERA_VELOCITY:      m_keyDrawCamVelocity.Press(); break;
    case VW_KEY_3D_DRAW_CAMERA_TEXTURE:       m_keyDrawCamTex.Press();      break;
#ifdef CFG_GROUND_TRUTH
    case VW_KEY_3D_DRAW_CAMERA_GROUND_TRUTH:  m_keyDrawCamGT.Press();       break;
#endif
    case VW_KEY_3D_DRAW_ERROR_TYPE:
      m_keyDrawErrType3D.Press();
      return true;
    case VW_KEY_3D_DRAW_BACKGROUND_COLOR:
      m_keyDrawBgClr.Press();
      Update3DBackgroundColor();
      return true;
    case VW_KEY_3D_RESET_VIEW_POINT_ACTIVE:
    case VW_KEY_3D_RESET_VIEW_POINT_VIRTUAL:
      Reset3DViewPoint(key == VW_KEY_3D_RESET_VIEW_POINT_ACTIVE);
      return true;
    }
  }
  return false;
}