diff --git a/docs/source/cam.rst b/docs/source/cam.rst index 6e4cc949..7d47fbcf 100644 --- a/docs/source/cam.rst +++ b/docs/source/cam.rst @@ -36,6 +36,7 @@ Functions: #. :c:func:`glm_ortho_default` #. :c:func:`glm_ortho_default_s` #. :c:func:`glm_perspective` +#. :c:func:`glm_persp_move_far` #. :c:func:`glm_perspective_default` #. :c:func:`glm_perspective_resize` #. :c:func:`glm_lookat` @@ -145,6 +146,16 @@ Functions documentation | *[in]* **farVal** far clipping planes | *[out]* **dest** result matrix +.. c:function:: void glm_persp_move_far(mat4 proj, float deltaFar) + + | extend perspective projection matrix's far distance + + | this function does not guarantee far >= near, be aware of that! + + Parameters: + | *[in, out]* **proj** projection matrix to extend + | *[in]* **deltaFar** distance from existing far (negative to shink) + .. c:function:: void glm_perspective_default(float aspect, mat4 dest) | set up perspective projection matrix with default near/far diff --git a/include/cglm/call/cam.h b/include/cglm/call/cam.h index befc9b4f..017b6fc2 100644 --- a/include/cglm/call/cam.h +++ b/include/cglm/call/cam.h @@ -61,6 +61,10 @@ glmc_perspective(float fovy, float farVal, mat4 dest); +CGLM_EXPORT +void +glmc_persp_move_far(mat4 proj, float deltaFar); + CGLM_EXPORT void glmc_perspective_default(float aspect, mat4 dest); diff --git a/include/cglm/cam.h b/include/cglm/cam.h index 9bb3cdf2..314b0656 100644 --- a/include/cglm/cam.h +++ b/include/cglm/cam.h @@ -271,6 +271,30 @@ glm_perspective(float fovy, dest[3][2] = 2.0f * nearVal * farVal * fn; } +/*! + * @brief extend perspective projection matrix's far distance + * + * this function does not guarantee far >= near, be aware of that! + * + * @param[in, out] proj projection matrix to extend + * @param[in] deltaFar distance from existing far (negative to shink) + */ +CGLM_INLINE +void +glm_persp_move_far(mat4 proj, float deltaFar) { + float fn, farVal, nearVal, p22, p32; + + p22 = proj[2][2]; + p32 = proj[3][2]; + + nearVal = p32 / (p22 - 1.0f); + farVal = p32 / (p22 + 1.0f) + deltaFar; + fn = 1.0f / (nearVal - farVal); + + proj[2][2] = (nearVal + farVal) * fn; + proj[3][2] = 2.0f * nearVal * farVal * fn; +} + /*! * @brief set up perspective projection matrix with default near/far * and angle values diff --git a/src/cam.c b/src/cam.c index 4a8567f6..39ac2102 100644 --- a/src/cam.c +++ b/src/cam.c @@ -88,6 +88,12 @@ glmc_perspective(float fovy, dest); } +CGLM_EXPORT +void +glmc_persp_move_far(mat4 proj, float deltaFar) { + glm_persp_move_far(proj, deltaFar); +} + CGLM_EXPORT void glmc_perspective_default(float aspect, mat4 dest) {