diff --git a/source/graphics/Camera.cpp b/source/graphics/Camera.cpp index 4d08d244a3..fe276e8a19 100644 --- a/source/graphics/Camera.cpp +++ b/source/graphics/Camera.cpp @@ -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; diff --git a/source/graphics/Camera.h b/source/graphics/Camera.h index 3bfe261191..d994b00aa2 100644 --- a/source/graphics/Camera.h +++ b/source/graphics/Camera.h @@ -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 diff --git a/source/graphics/tests/test_Camera.h b/source/graphics/tests/test_Camera.h index cfa0e3ccd0..9fe6738da3 100644 --- a/source/graphics/tests/test_Camera.h +++ b/source/graphics/tests/test_Camera.h @@ -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); diff --git a/source/ps/TouchInput.cpp b/source/ps/TouchInput.cpp index 68b4620006..07d57f4a70 100644 --- a/source/ps/TouchInput.cpp +++ b/source/ps/TouchInput.cpp @@ -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(); diff --git a/source/simulation2/helpers/Selection.cpp b/source/simulation2/helpers/Selection.cpp index c5f25c2858..13f4b6c9fa 100644 --- a/source/simulation2/helpers/Selection.cpp +++ b/source/simulation2/helpers/Selection.cpp @@ -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 cmpUnitRenderer(simulation.GetSimContext().GetSystemEntity()); ENSURE(cmpUnitRenderer); diff --git a/source/tools/atlas/GameInterface/Handlers/CameraCtrlHandlers.cpp b/source/tools/atlas/GameInterface/Handlers/CameraCtrlHandlers.cpp index 070579d58d..6130022079 100644 --- a/source/tools/atlas/GameInterface/Handlers/CameraCtrlHandlers.cpp +++ b/source/tools/atlas/GameInterface/Handlers/CameraCtrlHandlers.cpp @@ -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();