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:
+12
-10
@@ -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, ¤tTarget))
|
||||
return currentTarget;
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user