2016-04-16 21:49:47 +00:00
|
|
|
#include "CCameraManager.hpp"
|
2016-04-16 23:48:29 +00:00
|
|
|
#include "CCameraShakeData.hpp"
|
2016-09-16 00:56:46 +00:00
|
|
|
#include "CFirstPersonCamera.hpp"
|
2016-04-17 02:50:45 +00:00
|
|
|
#include "Audio/CSfxManager.hpp"
|
|
|
|
#include "CGameCamera.hpp"
|
|
|
|
#include "CStateManager.hpp"
|
|
|
|
#include "Input/CRumbleManager.hpp"
|
|
|
|
#include "World/CScriptWater.hpp"
|
2016-08-15 01:19:04 +00:00
|
|
|
#include "World/CPlayer.hpp"
|
2016-10-31 22:56:44 +00:00
|
|
|
#include "World/CScriptWater.hpp"
|
|
|
|
#include "CPlayerState.hpp"
|
|
|
|
#include "GameGlobalObjects.hpp"
|
|
|
|
#include "Graphics/CGraphics.hpp"
|
2017-02-12 04:43:33 +00:00
|
|
|
#include "Particle/CGenDescription.hpp"
|
2016-10-31 22:56:44 +00:00
|
|
|
#include "CObjectList.hpp"
|
2017-01-15 03:07:01 +00:00
|
|
|
#include "TCastTo.hpp"
|
2017-02-18 02:19:50 +00:00
|
|
|
#include "CCinematicCamera.hpp"
|
2017-01-15 03:07:01 +00:00
|
|
|
|
2016-04-16 21:49:47 +00:00
|
|
|
namespace urde
|
|
|
|
{
|
2016-10-31 22:56:44 +00:00
|
|
|
float CCameraManager::sAspect = 1.42f;
|
|
|
|
float CCameraManager::sFarPlane = 750.f;
|
|
|
|
float CCameraManager::sNearPlane = 0.2f;
|
|
|
|
float CCameraManager::sFirstPersonFOV = 55.f;
|
|
|
|
float CCameraManager::sThirdPersonFOV = 60.f;
|
2016-04-16 21:49:47 +00:00
|
|
|
|
2016-09-16 00:56:46 +00:00
|
|
|
CCameraManager::CCameraManager(TUniqueId curCameraId) : x0_curCameraId(curCameraId)
|
2016-04-16 21:49:47 +00:00
|
|
|
{
|
2017-01-23 07:22:17 +00:00
|
|
|
CSfxManager::AddListener(CSfxManager::ESfxChannels::Game, zeus::CVector3f::skZero, zeus::CVector3f::skZero,
|
2016-04-17 02:50:45 +00:00
|
|
|
{1.f, 0.f, 0.f}, {0.f, 0.f, 1.f}, 50.f, 50.f, 1000.f, 1, 0x7f);
|
2017-03-03 07:18:12 +00:00
|
|
|
sAspect = float(g_Viewport.x8_width / g_Viewport.xc_height);
|
2016-10-31 22:56:44 +00:00
|
|
|
sFirstPersonFOV = g_tweakGame->GetFirstPersonFOV();
|
2016-04-17 02:50:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
zeus::CVector3f CCameraManager::GetGlobalCameraTranslation(const CStateManager& stateMgr) const
|
|
|
|
{
|
2017-02-13 00:00:07 +00:00
|
|
|
TCastToConstPtr<CGameCamera> camera(GetCurrentCamera(stateMgr));
|
2016-04-17 02:50:45 +00:00
|
|
|
return camera->GetTransform() * x30_shakeOffset;
|
|
|
|
}
|
|
|
|
|
|
|
|
zeus::CTransform CCameraManager::GetCurrentCameraTransform(const CStateManager& stateMgr) const
|
|
|
|
{
|
2017-02-13 00:00:07 +00:00
|
|
|
TCastToConstPtr<CGameCamera> camera(GetCurrentCamera(stateMgr));
|
2016-04-17 02:50:45 +00:00
|
|
|
return camera->GetTransform() * zeus::CTransform::Translate(x30_shakeOffset);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCameraManager::RemoveCameraShaker(int id)
|
|
|
|
{
|
2016-09-16 00:56:46 +00:00
|
|
|
for (auto it = x18_shakers.begin(); it != x18_shakers.end(); ++it)
|
2016-04-17 02:50:45 +00:00
|
|
|
if (it->x20_shakerId == id)
|
|
|
|
{
|
|
|
|
x18_shakers.erase(it);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int CCameraManager::AddCameraShaker(const CCameraShakeData& data)
|
|
|
|
{
|
|
|
|
x18_shakers.emplace_back(data);
|
|
|
|
x18_shakers.back().x20_shakerId = ++x2c_lastShakeId;
|
|
|
|
return x2c_lastShakeId;
|
|
|
|
}
|
|
|
|
|
2016-09-16 00:56:46 +00:00
|
|
|
void CCameraManager::AddCinemaCamera(TUniqueId id, CStateManager& stateMgr) { x4_cineCameras.push_back(id); }
|
2016-04-17 02:50:45 +00:00
|
|
|
|
|
|
|
void CCameraManager::SetInsideFluid(bool val, TUniqueId fluidId)
|
|
|
|
{
|
|
|
|
if (val)
|
|
|
|
{
|
|
|
|
++x74_fluidCounter;
|
|
|
|
x78_fluidId = fluidId;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
--x74_fluidCounter;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCameraManager::Update(float dt, CStateManager& stateMgr)
|
|
|
|
{
|
2016-10-31 22:56:44 +00:00
|
|
|
sub800097AC(dt, stateMgr);
|
|
|
|
ThinkCameras(dt, stateMgr);
|
|
|
|
UpdateListener(stateMgr);
|
|
|
|
UpdateRumble(dt, stateMgr);
|
|
|
|
UpdateFog(dt, stateMgr);
|
|
|
|
|
|
|
|
#if 0
|
2016-04-17 02:50:45 +00:00
|
|
|
const CGameCamera* camera = GetCurrentCamera(stateMgr);
|
2016-04-29 10:08:46 +00:00
|
|
|
zeus::CVector3f heading = camera->GetTransform().basis * zeus::CVector3f{0.f, 1.f, 0.f};
|
2016-09-16 00:56:46 +00:00
|
|
|
CSfxManager::UpdateListener(camera->GetTransform().origin, zeus::CVector3f::skZero, heading, {0.f, 0.f, 1.f}, 0x7f);
|
2016-04-17 02:50:45 +00:00
|
|
|
x30_shakeOffset = zeus::CVector3f::skZero;
|
|
|
|
|
2016-09-16 00:56:46 +00:00
|
|
|
for (auto it = x18_shakers.begin(); it != x18_shakers.end();)
|
2016-04-17 02:50:45 +00:00
|
|
|
{
|
|
|
|
if (it->x1c_curTime >= it->x18_duration)
|
|
|
|
{
|
|
|
|
it = x18_shakers.erase(it);
|
|
|
|
continue;
|
|
|
|
}
|
2016-08-21 20:39:18 +00:00
|
|
|
x30_shakeOffset += it->GeneratePoint(dt, *stateMgr.GetActiveRandom());
|
2016-04-17 02:50:45 +00:00
|
|
|
++it;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (x18_shakers.size())
|
|
|
|
{
|
2016-10-31 22:56:44 +00:00
|
|
|
if (!xa0_25_rumbling || xa0_24_)
|
2016-04-17 02:50:45 +00:00
|
|
|
{
|
|
|
|
stateMgr.GetRumbleManager().Rumble(ERumbleFxId::Seven, stateMgr, ERumblePriority::Two);
|
2016-10-31 22:56:44 +00:00
|
|
|
xa0_25_rumbling = true;
|
2016-04-17 02:50:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2016-10-31 22:56:44 +00:00
|
|
|
xa0_25_rumbling = false;
|
2016-04-17 02:50:45 +00:00
|
|
|
if (x84_rumbleId != -1)
|
|
|
|
{
|
|
|
|
stateMgr.GetRumbleManager().StopRumble(x84_rumbleId);
|
|
|
|
x84_rumbleId = -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (x74_fluidCounter)
|
|
|
|
{
|
2017-01-15 03:07:01 +00:00
|
|
|
const CScriptWater* water = TCastToConstPtr<CScriptWater>(stateMgr.GetObjectById(x78_fluidId));
|
2016-04-17 02:50:45 +00:00
|
|
|
if (water)
|
|
|
|
{
|
|
|
|
// TODO: Finish
|
2016-09-16 00:56:46 +00:00
|
|
|
zeus::CColor tmpColor; // Get from water
|
2016-04-17 02:50:45 +00:00
|
|
|
zeus::CVector2f tmpVector; // Get from camera
|
2016-08-08 04:48:18 +00:00
|
|
|
x3c_fog.SetFogExplicit(ERglFogMode::PerspExp, tmpColor, tmpVector);
|
2016-08-20 04:22:13 +00:00
|
|
|
stateMgr.GetCameraFilterPass(4).SetFilter(CCameraFilterPass::EFilterType::Multiply,
|
2016-09-16 00:56:46 +00:00
|
|
|
CCameraFilterPass::EFilterShape::Fullscreen, 0.f, tmpColor, -1);
|
2016-04-17 02:50:45 +00:00
|
|
|
}
|
2016-10-31 22:56:44 +00:00
|
|
|
xa0_26_inWater = true;
|
2016-04-17 02:50:45 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2016-10-31 22:56:44 +00:00
|
|
|
xa0_26_inWater = false;
|
2016-04-17 02:50:45 +00:00
|
|
|
x3c_fog.DisableFog();
|
|
|
|
stateMgr.GetCameraFilterPass(4).DisableFilter(dt);
|
|
|
|
}
|
|
|
|
|
|
|
|
x3c_fog.Update(dt);
|
2016-10-31 22:56:44 +00:00
|
|
|
#endif
|
2016-04-17 02:50:45 +00:00
|
|
|
}
|
|
|
|
|
2017-03-05 17:54:00 +00:00
|
|
|
CGameCamera* CCameraManager::GetCurrentCamera(CStateManager& stateMgr) const
|
2016-04-17 02:50:45 +00:00
|
|
|
{
|
2016-04-17 05:35:32 +00:00
|
|
|
CObjectList* camList = stateMgr.ObjectListById(EGameObjectList::GameCamera);
|
2017-03-05 17:54:00 +00:00
|
|
|
return static_cast<CGameCamera*>(camList->GetObjectById(GetCurrentCameraId()));
|
2016-04-17 02:50:45 +00:00
|
|
|
}
|
|
|
|
|
2017-03-05 17:54:00 +00:00
|
|
|
const CGameCamera* CCameraManager::GetCurrentCamera(const CStateManager& stateMgr) const
|
2016-04-17 02:50:45 +00:00
|
|
|
{
|
|
|
|
const CObjectList* camList = stateMgr.GetObjectListById(EGameObjectList::GameCamera);
|
2017-03-05 17:54:00 +00:00
|
|
|
return static_cast<const CGameCamera*>(camList->GetObjectById(GetCurrentCameraId()));
|
2016-04-16 21:49:47 +00:00
|
|
|
}
|
|
|
|
|
2017-02-18 02:19:50 +00:00
|
|
|
void CCameraManager::SkipCinematic(CStateManager& stateMgr)
|
|
|
|
{
|
|
|
|
TUniqueId camId = GetCurrentCameraId();
|
|
|
|
CCinematicCamera* ent = static_cast<CCinematicCamera*>(stateMgr.ObjectById(camId));
|
|
|
|
while (ent)
|
|
|
|
{
|
|
|
|
ent->SetActive(false);
|
|
|
|
ent->WasDeactivated(stateMgr);
|
|
|
|
ent = TCastToPtr<CCinematicCamera>(GetCurrentCamera(stateMgr)).GetPtr();
|
|
|
|
}
|
|
|
|
stateMgr.GetPlayer().UpdateCinematicState(stateMgr);
|
|
|
|
x7c_fpCamera->SkipCinematic();
|
|
|
|
}
|
|
|
|
|
2016-09-16 00:56:46 +00:00
|
|
|
float CCameraManager::sub80009148() const
|
|
|
|
{
|
|
|
|
const zeus::CVector3f uVec = x7c_fpCamera->GetTransform().upVector();
|
2017-02-12 03:51:59 +00:00
|
|
|
return 1.f - std::min(std::fabs(std::min(std::fabs(uVec.dot(zeus::CVector3f::skUp)), 1.f) /
|
|
|
|
std::cos(zeus::degToRad(30.f))), 1.f);
|
2016-09-16 00:56:46 +00:00
|
|
|
}
|
|
|
|
|
2016-10-31 22:56:44 +00:00
|
|
|
void CCameraManager::sub800097AC(float, CStateManager& mgr)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCameraManager::ThinkCameras(float dt, CStateManager& mgr)
|
|
|
|
{
|
|
|
|
CGameCameraList gcList = mgr.GetCameraObjectList();
|
|
|
|
|
|
|
|
for (CEntity* ent : gcList)
|
|
|
|
{
|
2017-01-15 03:59:37 +00:00
|
|
|
TCastToPtr<CGameCamera> gc(ent);
|
2016-10-31 22:56:44 +00:00
|
|
|
if (gc)
|
|
|
|
{
|
|
|
|
gc->Think(dt, mgr);
|
|
|
|
gc->UpdatePerspective(dt);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (IsInCinematicCamera())
|
|
|
|
return;
|
|
|
|
|
|
|
|
TUniqueId camId = GetLastCameraId();
|
2017-01-15 03:07:01 +00:00
|
|
|
const CGameCamera* cam = TCastToConstPtr<CGameCamera>(mgr.GetObjectById(camId));
|
2016-10-31 22:56:44 +00:00
|
|
|
|
|
|
|
if (cam)
|
|
|
|
x3bc_curFov = cam->GetFov();
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCameraManager::UpdateFog(float, CStateManager&)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCameraManager::UpdateRumble(float, CStateManager&)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCameraManager::UpdateListener(CStateManager& mgr)
|
|
|
|
{
|
|
|
|
const zeus::CTransform xf = GetCurrentCameraTransform(mgr);
|
|
|
|
CSfxManager::UpdateListener(xf.origin, zeus::CVector3f::skZero, xf.frontVector(), xf.upVector(), 127);
|
|
|
|
}
|
|
|
|
|
|
|
|
float CCameraManager::CalculateFogDensity(CStateManager& mgr, const CScriptWater* water)
|
|
|
|
{
|
|
|
|
float f31 = 1.f /* 1.f - water->x1b4_->x40_; */;
|
|
|
|
float f1 = 0;
|
|
|
|
if (mgr.GetPlayerState()->HasPowerUp(CPlayerState::EItemType::GravitySuit))
|
|
|
|
f1 = (g_tweakPlayer->GetX54() * g_tweakPlayer->GetX50()) + f31;
|
|
|
|
else
|
|
|
|
f1 = (g_tweakPlayer->GetX5C() * g_tweakPlayer->GetX58()) + f31;
|
|
|
|
|
|
|
|
return f1 * x94_;
|
|
|
|
}
|
|
|
|
|
2016-08-15 01:19:04 +00:00
|
|
|
void CCameraManager::ResetCameras(CStateManager& mgr)
|
|
|
|
{
|
|
|
|
zeus::CTransform xf = mgr.GetPlayer().CreateTransformFromMovementDirection();
|
|
|
|
xf.origin = mgr.GetPlayer().GetEyePosition();
|
|
|
|
|
2016-08-15 20:58:07 +00:00
|
|
|
for (CEntity* ent : mgr.GetCameraObjectList())
|
2016-08-15 01:19:04 +00:00
|
|
|
{
|
2017-01-15 03:59:37 +00:00
|
|
|
TCastToPtr<CGameCamera> camObj(ent);
|
2016-08-15 01:19:04 +00:00
|
|
|
camObj->Reset(xf, mgr);
|
|
|
|
}
|
|
|
|
}
|
2016-10-15 19:18:50 +00:00
|
|
|
|
|
|
|
void CCameraManager::SetSpecialCameras(CFirstPersonCamera& fp, CBallCamera& ball)
|
|
|
|
{
|
|
|
|
x7c_fpCamera = &fp;
|
|
|
|
x80_ballCamera = &ball;
|
|
|
|
}
|
2016-04-16 21:49:47 +00:00
|
|
|
}
|