//------------------------------------------------------------------------ bool CVehicleWeapon::FilterView(SViewParams& viewParams) { if (m_pOwnerSeat != m_pSeatUser) return false; if (m_camerastats.animating && !m_camerastats.helper.empty()) { viewParams.position = GetSlotHelperPos(eIGS_FirstPerson, m_camerastats.helper, true); viewParams.rotation = Quat(GetSlotHelperRotation(eIGS_FirstPerson, m_camerastats.helper, true)); viewParams.blend = false; if (g_pGameCVars->v_debugMountedWeapon) { Vec3 local = GetSlotHelperPos(eIGS_FirstPerson, m_camerastats.helper, false, true); Vec3 entity = GetSlotHelperPos(eIGS_FirstPerson, m_camerastats.helper, false, false); float color[] = {1,1,1,1}; gEnv->pRenderer->Draw2dLabel(50,400,1.3f,color,false,"cam_pos local(%.3f %.3f %.3f), entity(%.3f %.3f %.3f)", local.x, local.y, local.z, entity.x, entity.y, entity.z); Ang3 angLocal(GetSlotHelperRotation(eIGS_FirstPerson, m_camerastats.helper, false, true)); Ang3 angEntity(GetSlotHelperRotation(eIGS_FirstPerson, m_camerastats.helper, false, true)); gEnv->pRenderer->Draw2dLabel(50,420,1.3f,color,false,"cam_rot local(%.3f %.3f %.3f), entity(%.3f %.3f %.3f)", angLocal.x, angLocal.y, angLocal.z, angEntity.x, angEntity.y, angEntity.z); } return true; } return false; }
//------------------------------------------------------------------------ void CItem::UpdateFPView(float frameTime) { if (!m_stats.selected) return; CheckViewChange(); if (!m_stats.fp && !m_stats.mounted) return; if (GetGameObject()->GetAspectProfile(eEA_Physics)!=eIPhys_NotPhysicalized) return; if (m_camerastats.animating) { if (m_camerastats.position) m_camerastats.pos=GetSlotHelperPos(eIGS_FirstPerson, m_camerastats.helper.c_str(), false, true); if (m_camerastats.rotation) m_camerastats.rot=Quat(GetSlotHelperRotation(eIGS_FirstPerson, m_camerastats.helper.c_str(), false, true)); //*Quat::CreateRotationZ(-gf_PI); } if (!m_stats.mounted) { UpdateFPPosition(frameTime); UpdateFPCharacter(frameTime); } if (IItem *pSlave = GetDualWieldSlave()) pSlave->UpdateFPView(frameTime); //UpdateMounted() is only updated in CItem::Update() //if (m_stats.mounted && GetOwnerActor() && GetOwnerActor()->IsClient()) //UpdateMounted(frameTime); }
//------------------------------------------------------------------------ void CItem::PostFilterView(struct SViewParams &viewParams) { if (m_camerastats.animating && !m_camerastats.follow) { const Matrix34 tm = GetEntity()->GetSlotWorldTM(eIGS_FirstPerson); Vec3 offset(0.0f,0.0f,0.0f); offset += tm.GetColumn(0).GetNormalized()*m_camerastats.pos.x; offset += tm.GetColumn(1).GetNormalized()*m_camerastats.pos.y; offset += tm.GetColumn(2).GetNormalized()*m_camerastats.pos.z; viewParams.position+=offset; viewParams.rotation*=m_camerastats.rot; viewParams.blend=true; viewParams.viewID=5; } if (m_camerastats.animating && m_stats.mounted && !m_camerastats.helper.empty() && IsOwnerFP()) { viewParams.position = GetSlotHelperPos(eIGS_FirstPerson, m_camerastats.helper, true); viewParams.rotation = Quat(GetSlotHelperRotation(eIGS_FirstPerson, m_camerastats.helper, true)); viewParams.blend = true; viewParams.viewID=5; viewParams.nearplane = 0.1f; } }
//-------------------------------------------- void CLaser::GetLaserPositionAndDirection(CWeapon* pParentWeapon, Vec3& pos, Vec3& dir) { const char* entityLocationHelper = m_laserHelperFP.c_str(); const char* laserTermHelper = "laser_term"; const bool relative = false; const bool absolute = true; const int slot = pParentWeapon->IsOwnerFP() ? eIGS_FirstPerson : eIGS_ThirdPerson; Matrix34 entityLocation = Matrix34::CreateTranslationMat(pParentWeapon->GetSlotHelperPos(slot, entityLocationHelper, absolute)) * pParentWeapon->GetSlotHelperRotation(slot, entityLocationHelper, absolute); Matrix34 helperLocation = Matrix34::CreateTranslationMat(GetSlotHelperPos(slot, laserTermHelper, relative)) * GetSlotHelperRotation(slot, laserTermHelper, relative); Matrix34 finalLocation = entityLocation * helperLocation; pos = finalLocation.GetTranslation(); dir = finalLocation.GetColumn1(); }
void CJaw::UpdateLaser(const SEntityUpdateContext& ctx) { if (!GetEntity()->IsHidden()) { switch (GetZoomState()) { case eZS_ZoomedOut: case eZS_ZoomingOut: if (m_laserGuider.IsLaserActivated()) { m_laserGuider.TurnOffLaser(); } break; case eZS_ZoomingIn: case eZS_ZoomedIn: if (!m_laserGuider.IsLaserActivated()) { m_laserGuider.TurnOnLaser(); } break; } } else { if (m_laserGuider.IsLaserActivated()) { m_laserGuider.TurnOffLaser(); } } m_laserGuider.UpdateLaser(CLaserBeam::SLaserUpdateDesc( GetSlotHelperPos(0, "laser_term", true), GetSlotHelperRotation(0, "laser_term", true).GetColumn1(), ctx.fFrameTime, GetEntity()->IsHidden())); }
//------------------------------------------------------------------------ void CGunTurret::UpdateOrientation(float deltaTime) { FUNCTION_PROFILER(GetISystem(), PROFILE_GAME); bool changed = false; bool searching = (m_targetId==0 && m_turretparams.searching); float speed = searching ? m_turretparams.search_speed : m_turretparams.turn_speed; assert(m_goalYaw >= 0.f && m_goalYaw <= gf_PI2); // update turret Matrix34 turretTM = GetEntity()->GetSlotLocalTM(eIGS_Aux0, false); Ang3 turretAngles(turretTM); if(turretAngles.z < 0.0f) turretAngles.z+=gf_PI2; if(cry_fabsf(m_goalYaw-turretAngles.z) > gf_PI) { if(m_goalYaw >= gf_PI) turretAngles.z += gf_PI2; else turretAngles.z -= gf_PI2; } if(m_turretparams.yaw_range < 360.f) { // reverse, to avoid forbidden range if(m_goalYaw > gf_PI && turretAngles.z < gf_PI) turretAngles.z += gf_PI2; else if(m_goalYaw < gf_PI && turretAngles.z > gf_PI) turretAngles.z -= gf_PI2; } if(cry_fabsf(turretAngles.z-m_goalYaw) > 0.001f) { Interp(turretAngles.z, m_goalYaw, speed, deltaTime, 0.25f*speed); if(m_turretSound == INVALID_SOUNDID && gEnv->IsClient()) m_turretSound = PlayAction(g_pItemStrings->turret); changed = true; } else if(m_turretSound != INVALID_SOUNDID) { StopSound(m_turretSound); m_turretSound = INVALID_SOUNDID; } if(changed) { turretTM.SetRotationXYZ(turretAngles,turretTM.GetTranslation()); GetEntity()->SetSlotLocalTM(eIGS_Aux0, turretTM); } // update weapon Matrix34 weaponTM = GetEntity()->GetSlotLocalTM(eIGS_ThirdPerson, false); Ang3 weaponAngles(weaponTM); weaponAngles.z = turretAngles.z; if(cry_fabsf(weaponAngles.x-m_goalPitch) > 0.001f) { Interp(weaponAngles.x, m_goalPitch, speed, deltaTime, 0.25f*speed); if(m_cannonSound == INVALID_SOUNDID && gEnv->IsClient()) m_cannonSound = PlayAction(g_pItemStrings->cannon); changed = true; } else if(m_cannonSound != INVALID_SOUNDID) { StopSound(m_cannonSound); m_cannonSound = INVALID_SOUNDID; } if(changed) { weaponTM.SetRotationXYZ(weaponAngles); Vec3 w_trans = turretTM.TransformPoint(m_radarHelperPos); //Vec3 w_trans = GetSlotHelperPos(eIGS_Aux0,m_radarHelper.c_str(),false); weaponTM.SetTranslation(w_trans); GetEntity()->SetSlotLocalTM(eIGS_ThirdPerson, weaponTM); if(GetEntity()->IsSlotValid(eIGS_Aux1)) { Vec3 b_trans = weaponTM.TransformPoint(m_barrelHelperPos); //Vec3 b_trans = GetSlotHelperPos(eIGS_ThirdPerson,m_barrelHelper.c_str(),false); weaponTM.SetTranslation(b_trans); GetEntity()->SetSlotLocalTM(eIGS_Aux1, weaponTM*m_barrelRotation); } if(gEnv->IsClient()) { for(TEffectInfoMap::const_iterator it=m_effects.begin(); it!=m_effects.end(); ++it) { Matrix34 tm(GetSlotHelperRotation(eIGS_ThirdPerson,it->second.helper.c_str(),true), GetSlotHelperPos(eIGS_ThirdPerson,it->second.helper.c_str(),true)); SetEffectWorldTM(it->first, tm); } } } UpdatePhysics(); if(g_pGameCVars->i_debug_turrets == eGTD_Basic) { DrawDebug(); //gEnv->pRenderer->DrawLabel(GetEntity()->GetWorldPos(), 1.4f, "%s yaw: %.2f, goalYaw: %.2f (%.2f), goalPitch: %.2f (%.2f/%.2f)", searching?"[search]":"", RAD2DEG(turretAngles.z), RAD2DEG(m_goalYaw), 0.5f*(m_turretparams.yaw_range), RAD2DEG(m_goalPitch), m_turretparams.min_pitch, m_turretparams.max_pitch); } }