diff --git a/src/celengine/fisheyeprojectionmode.cpp b/src/celengine/fisheyeprojectionmode.cpp index 782d5e5e72..c9753eb652 100644 --- a/src/celengine/fisheyeprojectionmode.cpp +++ b/src/celengine/fisheyeprojectionmode.cpp @@ -59,7 +59,7 @@ float FisheyeProjectionMode::getFieldCorrection(float /*zoom*/) const } celmath::Frustum -FisheyeProjectionMode::getFrustum(float nearZ, float farZ, float zoom) const +FisheyeProjectionMode::getFrustum(float nearZ, std::optional farZ, float zoom) const { return celmath::Frustum(getFOV(zoom), width / height, nearZ, farZ); } diff --git a/src/celengine/fisheyeprojectionmode.h b/src/celengine/fisheyeprojectionmode.h index cb3453ca6a..505c53ca0e 100644 --- a/src/celengine/fisheyeprojectionmode.h +++ b/src/celengine/fisheyeprojectionmode.h @@ -32,7 +32,7 @@ class FisheyeProjectionMode : public ProjectionMode float getZoom(float fov) const override; float getPixelSize(float zoom) const override; float getFieldCorrection(float zoom) const override; - celmath::Frustum getFrustum(float nearZ, float farZ, float zoom) const override; + celmath::Frustum getFrustum(float nearZ, std::optional farZ, float zoom) const override; double getViewConeAngleMax(float zoom) const override; float getNormalizedDeviceZ(float nearZ, float farZ, float z) const override; diff --git a/src/celengine/perspectiveprojectionmode.cpp b/src/celengine/perspectiveprojectionmode.cpp index bf344077ad..9534dfba2c 100644 --- a/src/celengine/perspectiveprojectionmode.cpp +++ b/src/celengine/perspectiveprojectionmode.cpp @@ -56,7 +56,7 @@ float PerspectiveProjectionMode::getFieldCorrection(float zoom) const } celmath::Frustum -PerspectiveProjectionMode::getFrustum(float nearZ, float farZ, float zoom) const +PerspectiveProjectionMode::getFrustum(float nearZ, std::optional farZ, float zoom) const { return celmath::Frustum(getFOV(zoom), width / height, nearZ, farZ); } diff --git a/src/celengine/perspectiveprojectionmode.h b/src/celengine/perspectiveprojectionmode.h index 8013d9ab29..3176ae8723 100644 --- a/src/celengine/perspectiveprojectionmode.h +++ b/src/celengine/perspectiveprojectionmode.h @@ -32,7 +32,7 @@ class PerspectiveProjectionMode : public ProjectionMode float getZoom(float fov) const override; float getPixelSize(float zoom) const override; float getFieldCorrection(float zoom) const override; - celmath::Frustum getFrustum(float nearZ, float farZ, float zoom) const override; + celmath::Frustum getFrustum(float nearZ, std::optional farZ, float zoom) const override; double getViewConeAngleMax(float zoom) const override; float getNormalizedDeviceZ(float nearZ, float farZ, float z) const override; diff --git a/src/celengine/projectionmode.h b/src/celengine/projectionmode.h index 950ee6eaac..ac6d4502fa 100644 --- a/src/celengine/projectionmode.h +++ b/src/celengine/projectionmode.h @@ -10,6 +10,7 @@ #pragma once #include +#include class ShaderManager; @@ -36,7 +37,7 @@ class ProjectionMode virtual float getZoom(float fov) const = 0; virtual float getPixelSize(float zoom) const = 0; virtual float getFieldCorrection(float zoom) const = 0; - virtual celmath::Frustum getFrustum(float nearZ, float farZ, float zoom) const = 0; + virtual celmath::Frustum getFrustum(float nearZ, std::optional farZ, float zoom) const = 0; // Calculate the cosine of half the maximum field of view. We'll use this for // fast testing of object visibility. diff --git a/src/celengine/render.cpp b/src/celengine/render.cpp index c0cbe2e66e..fd1a8a635f 100644 --- a/src/celengine/render.cpp +++ b/src/celengine/render.cpp @@ -1531,7 +1531,7 @@ void Renderer::draw(const Observer& observer, m_cameraOrientation = Quaterniond(m_cameraTransform) * observer.getOrientation(); // Get the view frustum used for culling in camera space. - auto frustum = projectionMode->getFrustum(MinNearPlaneDistance, std::numeric_limits::infinity(), zoom); + auto frustum = projectionMode->getFrustum(MinNearPlaneDistance, std::nullopt, zoom); // Get the transformed frustum, used for culling in the astrocentric coordinate // system. @@ -3939,7 +3939,7 @@ void Renderer::renderDeepSkyObjects(const Universe& universe, dsoRenderer.renderFlags = renderFlags; dsoRenderer.labelMode = labelMode; - dsoRenderer.frustum = projectionMode->getFrustum(MinNearPlaneDistance, std::numeric_limits::infinity(), observer.getZoom()); + dsoRenderer.frustum = projectionMode->getFrustum(MinNearPlaneDistance, std::nullopt, observer.getZoom()); // Use pixelSize * screenDpi instead of FoV, to eliminate windowHeight dependence. // = 1.0 at startup float effDistanceToScreen = mmToInches((float) REF_DISTANCE_TO_SCREEN) * pixelSize * getScreenDpi(); diff --git a/src/celmath/frustum.cpp b/src/celmath/frustum.cpp index fe5a742bf3..df35f71ed4 100644 --- a/src/celmath/frustum.cpp +++ b/src/celmath/frustum.cpp @@ -23,16 +23,16 @@ Frustum::Frustum(float fov, float aspectRatio, float n) : init(fov, aspectRatio, n, n); } -Frustum::Frustum(float fov, float aspectRatio, float n, float f) : - infinite(std::isinf(f)) +Frustum::Frustum(float fov, float aspectRatio, float n, std::optional f) : + infinite(!f.has_value()) { - init(fov, aspectRatio, n, infinite ? n : f); + init(fov, aspectRatio, n, infinite ? n : f.value()); } -Frustum::Frustum(float l, float r, float t, float b, float n, float f) : - infinite(std::isinf(f)) +Frustum::Frustum(float l, float r, float t, float b, float n, std::optional f) : + infinite(!f.has_value()) { - init(l, r, t, b, n, infinite ? n : f); + init(l, r, t, b, n, infinite ? n : f.value()); } void Frustum::init(float fov, float aspectRatio, float n, float f) diff --git a/src/celmath/frustum.h b/src/celmath/frustum.h index e379f404d2..939ef34f3d 100644 --- a/src/celmath/frustum.h +++ b/src/celmath/frustum.h @@ -12,6 +12,7 @@ #include #include +#include namespace celmath { @@ -22,8 +23,8 @@ class Frustum using PlaneType = Eigen::Hyperplane; Frustum(float fov, float aspectRatio, float nearDist); - Frustum(float fov, float aspectRatio, float nearDist, float farDist); - Frustum(float left, float right, float top, float bottom, float nearDist, float farDist); + Frustum(float fov, float aspectRatio, float nearDist, std::optional farDist); + Frustum(float left, float right, float top, float bottom, float nearDist, std::optional farDist); inline Eigen::Hyperplane plane(unsigned int which) const {