// shot effector stuff void CActor::update_camera (CCameraShotEffector* effector) { if (!effector) return; // if (Level().CurrentViewEntity() != this) return; CCameraBase* pACam = cam_FirstEye(); if (!pACam) return; if (pACam->bClampPitch) { while (pACam->pitch < pACam->lim_pitch[0]) pACam->pitch += PI_MUL_2; while (pACam->pitch > pACam->lim_pitch[1]) pACam->pitch -= PI_MUL_2; } effector->ChangeHP( &(pACam->pitch), &(pACam->yaw) ); if (pACam->bClampYaw) clamp(pACam->yaw,pACam->lim_yaw[0],pACam->lim_yaw[1]); if (pACam->bClampPitch) clamp(pACam->pitch,pACam->lim_pitch[0],pACam->lim_pitch[1]); if (effector && !effector->IsActive()) { Cameras().RemoveCamEffector(eCEShot); } }
// ****************************** Update actor orientation according to camera orientation void CActor::g_cl_Orientate (u32 mstate_rl, float dt) { // capture camera into torso (only for FirstEye & LookAt cameras) if (eacFreeLook!=cam_active) { r_torso.yaw = cam_Active()->GetWorldYaw (); r_torso.pitch = cam_Active()->GetWorldPitch (); } else { r_torso.yaw = cam_FirstEye()->GetWorldYaw (); r_torso.pitch = cam_FirstEye()->GetWorldPitch (); } unaffected_r_torso.yaw = r_torso.yaw; unaffected_r_torso.pitch = r_torso.pitch; unaffected_r_torso.roll = r_torso.roll; CWeaponMagazined *pWM = smart_cast<CWeaponMagazined*>(inventory().GetActiveSlot() != NO_ACTIVE_SLOT ? inventory().ItemFromSlot(inventory().GetActiveSlot())/*inventory().m_slots[inventory().GetActiveSlot()].m_pIItem*/ : NULL); if (pWM && pWM->GetCurrentFireMode() == 1 && eacFirstEye != cam_active) { Fvector dangle = weapon_recoil_last_delta(); r_torso.yaw = unaffected_r_torso.yaw + dangle.y; r_torso.pitch = unaffected_r_torso.pitch + dangle.x; } // если есть движение - выровнять модель по камере if (mstate_rl&mcAnyMove) { r_model_yaw = angle_normalize(r_torso.yaw); mstate_real &=~mcTurn; } else { // if camera rotated more than 45 degrees - align model with it float ty = angle_normalize(r_torso.yaw); if (_abs(r_model_yaw-ty)>PI_DIV_4) { r_model_yaw_dest = ty; // mstate_real |= mcTurn; } if (_abs(r_model_yaw-r_model_yaw_dest)<EPS_L){ mstate_real &=~mcTurn; } if (mstate_rl&mcTurn){ angle_lerp (r_model_yaw,r_model_yaw_dest,PI_MUL_2,dt); } } }
// shot effector stuff void CActor::update_camera (CCameraShotEffector* effector) { if (!effector) return; // if (Level().CurrentViewEntity() != this) return; CCameraBase* pACam = cam_FirstEye(); if (!pACam) return; if (pACam->bClampPitch) { while (pACam->pitch < pACam->lim_pitch[0]) pACam->pitch += PI_MUL_2; while (pACam->pitch > pACam->lim_pitch[1]) pACam->pitch -= PI_MUL_2; }; effector->ApplyLastAngles(&(pACam->pitch), &(pACam->yaw)); if (pACam->bClampYaw) clamp(pACam->yaw,pACam->lim_yaw[0],pACam->lim_yaw[1]); if (pACam->bClampPitch) clamp(pACam->pitch,pACam->lim_pitch[0],pACam->lim_pitch[1]); }