1
0
forked from mirrors/0ad

Return by value from CCamera::BuildCameraRay

Some return values can be assigned to a `const auto`, somewhere `dir` is
mutated so the whole result has to be assigned to a non `const` variable
and once only dir is used, so structured binding isn't used there.
This commit is contained in:
phosit
2024-11-16 11:47:25 +01:00
committed by phosit
parent cf92c20020
commit 998dc30b6d
6 changed files with 29 additions and 26 deletions
+12 -10
View File
@@ -198,7 +198,7 @@ CCamera::Quad CCamera::GetViewQuad(const float dist) const
}};
}
void CCamera::BuildCameraRay(int px, int py, CVector3D& origin, CVector3D& dir) const
CCamera::Ray CCamera::BuildCameraRay(const int px, const int py) const
{
ENSURE(m_ProjType == ProjectionType::PERSPECTIVE || m_ProjType == ProjectionType::ORTHO);
@@ -216,19 +216,21 @@ void CCamera::BuildCameraRay(int px, int py, CVector3D& origin, CVector3D& dir)
const CVector3D basisX = points[1] - points[0];
const CVector3D basisY = points[3] - points[0];
Ray result;
if (m_ProjType == ProjectionType::PERSPECTIVE)
{
// Build direction for the camera origin to the target point.
origin = m_Orientation.GetTranslation();
result.origin = m_Orientation.GetTranslation();
CVector3D targetPoint = points[0] + (basisX * dx) + (basisY * dy);
dir = targetPoint - origin;
result.direction = targetPoint - result.origin;
}
else if (m_ProjType == ProjectionType::ORTHO)
{
origin = m_Orientation.GetTranslation() + (basisX * (dx - 0.5f)) + (basisY * (dy - 0.5f));
dir = m_Orientation.GetIn();
result.origin = m_Orientation.GetTranslation() + (basisX * (dx - 0.5f)) + (basisY * (dy - 0.5f));
result.direction = m_Orientation.GetIn();
}
dir.Normalize();
result.direction.Normalize();
return result;
}
void CCamera::GetScreenCoordinates(const CVector3D& world, float& x, float& y) const
@@ -247,9 +249,9 @@ CVector3D CCamera::GetWorldCoordinates(int px, int py, bool aboveWater) const
{
CHFTracer tracer(g_Game->GetWorld()->GetTerrain());
int x, z;
CVector3D origin, dir, delta, terrainPoint, waterPoint;
CVector3D delta, terrainPoint, waterPoint;
BuildCameraRay(px, py, origin, dir);
const auto [origin, dir] = BuildCameraRay(px, py);
bool gotTerrain = tracer.RayIntersect(origin, dir, x, z, terrainPoint);
@@ -315,9 +317,9 @@ CVector3D CCamera::GetWorldCoordinates(int px, int py, float h) const
CPlane plane;
plane.Set(CVector3D(0.f, 1.f, 0.f), CVector3D(0.f, h, 0.f)); // upwards normal, passes through h
CVector3D origin, dir, delta, currentTarget;
CVector3D delta, currentTarget;
BuildCameraRay(px, py, origin, dir);
const auto [origin, dir] = BuildCameraRay(px, py);
if (plane.FindRayIntersection(origin, dir, &currentTarget))
return currentTarget;
+6 -1
View File
@@ -87,7 +87,12 @@ class CCamera
// Builds a ray passing through the screen coordinate (px, py), calculates
// origin and direction of the ray.
void BuildCameraRay(int px, int py, CVector3D& origin, CVector3D& dir) const;
struct Ray
{
CVector3D origin;
CVector3D direction;
};
Ray BuildCameraRay(const int px, const int py) const;
// General helpers that seem to fit here
+4 -4
View File
@@ -335,8 +335,8 @@ public:
);
camera.SetPerspectiveProjection(1.0f, 101.0f, DEGTORAD(90.0f));
CVector3D origin, dir;
camera.BuildCameraRay(viewPort.m_Width / 2, viewPort.m_Height / 2, origin, dir);
const auto [origin, dir] =
camera.BuildCameraRay(viewPort.m_Width / 2, viewPort.m_Height / 2);
const CVector3D expectedOrigin = cameraPosition;
const CVector3D expectedDir = cameraDirection;
CompareVectors(origin, expectedOrigin, EPS);
@@ -365,8 +365,8 @@ public:
);
camera.SetOrthoProjection(2.0f, 128.0f, 10.0f);
CVector3D origin, dir;
camera.BuildCameraRay(viewPort.m_Width / 2, viewPort.m_Height / 2, origin, dir);
const auto [origin, dir] =
camera.BuildCameraRay(viewPort.m_Width / 2, viewPort.m_Height / 2);
const CVector3D expectedOrigin = cameraPosition;
const CVector3D expectedDir = cameraDirection;
CompareVectors(origin, expectedOrigin, EPS);
+3 -5
View File
@@ -1,4 +1,4 @@
/* Copyright (C) 2019 Wildfire Games.
/* Copyright (C) 2024 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@@ -137,8 +137,7 @@ void CTouchInput::OnFingerMotion(int id, int x, int y)
if (m_State == STATE_PANNING && id == 0)
{
CCamera& camera = *(g_Game->GetView()->GetCamera());
CVector3D origin, dir;
camera.BuildCameraRay(x, y, origin, dir);
auto [origin, dir] = camera.BuildCameraRay(x, y);
dir *= m_PanDist / dir.Y;
camera.GetOrientation().Translate(m_PanFocus - dir - origin);
camera.UpdateFrustum();
@@ -151,8 +150,7 @@ void CTouchInput::OnFingerMotion(int id, int x, int y)
float zoomDist = (newDist - oldDist) * -0.005f * m_PanDist;
CCamera& camera = *(g_Game->GetView()->GetCamera());
CVector3D origin, dir;
camera.BuildCameraRay(m_Pos[0].X, m_Pos[0].Y, origin, dir);
CVector3D dir{camera.BuildCameraRay(m_Pos[0].X, m_Pos[0].Y).direction};
dir *= zoomDist;
camera.GetOrientation().Translate(dir);
camera.UpdateFrustum();
+2 -3
View File
@@ -1,4 +1,4 @@
/* Copyright (C) 2022 Wildfire Games.
/* Copyright (C) 2024 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@@ -36,8 +36,7 @@
entity_id_t EntitySelection::PickEntityAtPoint(CSimulation2& simulation, const CCamera& camera, int screenX, int screenY, player_id_t player, bool allowEditorSelectables)
{
PROFILE2("PickEntityAtPoint");
CVector3D origin, dir;
camera.BuildCameraRay(screenX, screenY, origin, dir);
const auto [origin, dir] = camera.BuildCameraRay(screenX, screenY);
CmpPtr<ICmpUnitRenderer> cmpUnitRenderer(simulation.GetSimContext().GetSystemEntity());
ENSURE(cmpUnitRenderer);
@@ -1,4 +1,4 @@
/* Copyright (C) 2023 Wildfire Games.
/* Copyright (C) 2024 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@@ -114,10 +114,9 @@ MESSAGEHANDLER(Scroll)
}
else if (msg->type == eScrollType::TO)
{
CVector3D origin, dir;
float x, y;
msg->pos->GetScreenSpace(x, y);
g_Game->GetView()->GetCamera()->BuildCameraRay((int)x, (int)y, origin, dir);
auto [origin, dir] = g_Game->GetView()->GetCamera()->BuildCameraRay((int)x, (int)y);
dir *= targetDistance;
camera.Translate(targetPos - dir - origin);
g_Game->GetView()->GetCamera()->UpdateFrustum();