Advertisement
Guest User

Untitled

a guest
May 21st, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.80 KB | None | 0 0
  1. void CWeapon::UpdateHudAdditonal(Fmatrix& trans)
  2. {
  3.     CActor* pActor = smart_cast<CActor*>(H_Parent());
  4.     if (!pActor)        return;
  5.  
  6.     attachable_hud_item* hi = HudItemData();
  7.     R_ASSERT(hi);
  8.  
  9.     u8 idx = GetCurrentHudOffsetIdx();
  10.  
  11.     if ((IsZoomed() && m_zoom_params.m_fZoomRotationFactor <= 1.f) || (!IsZoomed() && m_zoom_params.m_fZoomRotationFactor > 0.f))
  12.     {
  13.         Fvector                     curr_offs, curr_rot;
  14.         curr_offs = hi->m_measures.m_hands_offset[0][idx];//pos,aim
  15.         curr_rot = hi->m_measures.m_hands_offset[1][idx];//rot,aim
  16.         curr_offs.mul(m_zoom_params.m_fZoomRotationFactor);
  17.         curr_rot.mul(m_zoom_params.m_fZoomRotationFactor);
  18.  
  19.         Fmatrix                     hud_rotation;
  20.         hud_rotation.identity();
  21.         hud_rotation.rotateX(curr_rot.x);
  22.  
  23.         Fmatrix                     hud_rotation_y;
  24.         hud_rotation_y.identity();
  25.         hud_rotation_y.rotateY(curr_rot.y);
  26.         hud_rotation.mulA_43(hud_rotation_y);
  27.  
  28.         hud_rotation_y.identity();
  29.         hud_rotation_y.rotateZ(curr_rot.z);
  30.         hud_rotation.mulA_43(hud_rotation_y);
  31.  
  32.         hud_rotation.translate_over(curr_offs);
  33.         trans.mulB_43(hud_rotation);
  34.  
  35.         if (pActor->IsZoomAimingMode())
  36.             m_zoom_params.m_fZoomRotationFactor += Device.fTimeDelta / m_zoom_params.m_fZoomRotateTime;
  37.         else
  38.             m_zoom_params.m_fZoomRotationFactor -= Device.fTimeDelta / m_zoom_params.m_fZoomRotateTime;
  39.  
  40.         clamp(m_zoom_params.m_fZoomRotationFactor, 0.f, 1.f);
  41.     }
  42.  
  43.     // Рассчитываем фактор боковой ходьбы
  44.     float fStrafeMaxTime = hi->m_measures.m_strafe_offset[2][idx].y; // Макс. время в секундах, за которое мы наклонимся из центрального положения
  45.     if (fStrafeMaxTime <= EPS)
  46.         fStrafeMaxTime = 0.01f;
  47.  
  48.     float fStepPerUpd = Device.fTimeDelta / fStrafeMaxTime; // Величина изменение фактора поворота
  49.  
  50.                                                     // Добавляем боковой наклон от движения камеры
  51.     float fCamReturnSpeedMod = 1.5f; // Восколько ускоряем нормализацию наклона, полученного от движения камеры (только от бедра)
  52.     float fCamLimitNoAim = 0.5f; // Максимальный фактор наклона от камеры от бедра
  53.     float fYMag = pActor->fFPCamYawMagnitude;
  54.  
  55.     if (fYMag != 0.0f)
  56.     { //--> Камера крутится по оси Y
  57.         m_fLR_CameraFactor -= (fYMag * 0.005f);
  58.  
  59.         float fCamLimitBlend = 1.0f - ((1.0f - fCamLimitNoAim) * (1.0f - m_zoom_params.m_fZoomRotationFactor));
  60.         clamp(m_fLR_CameraFactor, -fCamLimitBlend, fCamLimitBlend);
  61.     }
  62.     else
  63.     { //--> Камера не поворачивается - убираем наклон
  64.         if (m_fLR_CameraFactor < 0.0f)
  65.         {
  66.             m_fLR_CameraFactor += fStepPerUpd * fCamReturnSpeedMod;
  67.             clamp(m_fLR_CameraFactor, -1.0f, 0.0f);
  68.         }
  69.         else
  70.         {
  71.             m_fLR_CameraFactor -= fStepPerUpd * fCamReturnSpeedMod;
  72.             clamp(m_fLR_CameraFactor, 0.0f, 1.0f);
  73.         }
  74.     }
  75.  
  76.     // Добавляем боковой наклон от ходьбы вбок
  77.     float fChangeDirSpeedMod = 3; // Восколько быстро меняем направление направление наклона, если оно в другую сторону от текущего
  78.  
  79.     u32 iMovingState = pActor->MovingState();
  80.     if ((iMovingState & mcLStrafe) != 0)
  81.     { // Движемся влево
  82.         float fVal = (m_fLR_MovingFactor > 0.f ? fStepPerUpd * fChangeDirSpeedMod : fStepPerUpd);
  83.         m_fLR_MovingFactor -= fVal;
  84.     }
  85.     else if ((iMovingState & mcRStrafe) != 0)
  86.     { // Движемся вправо
  87.         float fVal = (m_fLR_MovingFactor < 0.f ? fStepPerUpd * fChangeDirSpeedMod : fStepPerUpd);
  88.         m_fLR_MovingFactor += fVal;
  89.     }
  90.     else
  91.     { // Двигаемся в любом другом направлении
  92.         if (m_fLR_MovingFactor < 0.0f)
  93.         {
  94.             m_fLR_MovingFactor += fStepPerUpd;
  95.             clamp(m_fLR_MovingFactor, -1.0f, 0.0f);
  96.         }
  97.         else
  98.         {
  99.             m_fLR_MovingFactor -= fStepPerUpd;
  100.             clamp(m_fLR_MovingFactor, 0.0f, 1.0f);
  101.         }
  102.     }
  103.  
  104.     clamp(m_fLR_MovingFactor, -1.0f, 1.0f); // Фактор боковой ходьбы не должен превышать эти лимиты
  105.  
  106.                                             // Вычисляем и нормализируем итоговый фактор наклона
  107.     float fLR_Factor = m_fLR_MovingFactor + m_fLR_CameraFactor;
  108.     clamp(fLR_Factor, -1.0f, 1.0f); // Фактор боковой ходьбы не должен превышать эти лимиты
  109.  
  110.     // Производим наклон ствола для нормального режима и аима
  111.     if (idx == 0 && hi->m_measures.m_strafe_offset[2][0].x);
  112.     {
  113.         Fvector curr_offs, curr_rot;
  114.  
  115.         // Смещение позиции худа в стрейфе
  116.         curr_offs = hi->m_measures.m_strafe_offset[0][0]; //pos
  117.         curr_offs.mul(fLR_Factor);                   // Умножаем на фактор стрейфа
  118.  
  119.                                                              // Поворот худа в стрейфе
  120.         curr_rot = hi->m_measures.m_strafe_offset[1][0]; //rot
  121.         curr_rot.mul(-PI / 180.f);                          // Преобразуем углы в радианы
  122.         curr_rot.mul(fLR_Factor);                   // Умножаем на фактор стрейфа
  123.  
  124.         curr_offs.mul(1.f - m_zoom_params.m_fZoomRotationFactor);
  125.         curr_rot.mul(1.f - m_zoom_params.m_fZoomRotationFactor);
  126.  
  127.         Fmatrix hud_rotation;
  128.         Fmatrix hud_rotation_y;
  129.  
  130.         hud_rotation.identity();
  131.         hud_rotation.rotateX(curr_rot.x);
  132.  
  133.         hud_rotation_y.identity();
  134.         hud_rotation_y.rotateY(curr_rot.y);
  135.         hud_rotation.mulA_43(hud_rotation_y);
  136.  
  137.         hud_rotation_y.identity();
  138.         hud_rotation_y.rotateZ(curr_rot.z);
  139.         hud_rotation.mulA_43(hud_rotation_y);
  140.  
  141.         hud_rotation.translate_over(curr_offs);
  142.         trans.mulB_43(hud_rotation);
  143.     }
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement