Commit: bb063ec31e388b18ea9e94629a66fa8d0612c853
Author: Clément Foucault
Date:   Fri May 4 17:32:53 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBbb063ec31e388b18ea9e94629a66fa8d0612c853

DRW: Add DRW_viewport_far/near_distance_get functions.

===================================================================

M       source/blender/draw/intern/DRW_render.h
M       source/blender/draw/intern/draw_manager.c

===================================================================

diff --git a/source/blender/draw/intern/DRW_render.h 
b/source/blender/draw/intern/DRW_render.h
index 0912e5dde29..1429c532590 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -400,6 +400,11 @@ void DRW_viewport_matrix_override_set_all(DRWMatrixState 
*state);
 void DRW_viewport_matrix_override_unset(DRWViewportMatrixType type);
 void DRW_viewport_matrix_override_unset_all(void);
 
+/* Thoses are in viewspace so negative if in persp.
+ * Extract near and far clip distance from the projection matrix. */
+float DRW_viewport_near_distance_get(void);
+float DRW_viewport_far_distance_get(void);
+
 const float *DRW_viewport_size_get(void);
 const float *DRW_viewport_invert_size_get(void);
 const float *DRW_viewport_screenvecs_get(void);
diff --git a/source/blender/draw/intern/draw_manager.c 
b/source/blender/draw/intern/draw_manager.c
index b171d758832..906ceac728d 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -611,8 +611,32 @@ bool DRW_viewport_is_persp_get(void)
        else {
                return DST.view_data.matstate.mat[DRW_MAT_WIN][3][3] == 0.0f;
        }
-       BLI_assert(0);
-       return false;
+}
+
+float DRW_viewport_near_distance_get(void)
+{
+       float projmat[4][4];
+       DRW_viewport_matrix_get(projmat, DRW_MAT_WIN);
+
+       if (DRW_viewport_is_persp_get()) {
+               return -projmat[3][2] / (projmat[2][2] - 1.0f);
+       }
+       else {
+               return -(projmat[3][2] + 1.0f) / projmat[2][2];
+       }
+}
+
+float DRW_viewport_far_distance_get(void)
+{
+       float projmat[4][4];
+       DRW_viewport_matrix_get(projmat, DRW_MAT_WIN);
+
+       if (DRW_viewport_is_persp_get()) {
+               return -projmat[3][2] / (projmat[2][2] + 1.0f);
+       }
+       else {
+               return -(projmat[3][2] - 1.0f) / projmat[2][2];
+       }
 }
 
 DefaultFramebufferList *DRW_viewport_framebuffer_list_get(void)

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to