[Bf-blender-cvs] [bb063ec31e3] blender2.8: DRW: Add DRW_viewport_far/near_distance_get functions.

Clément Foucault noreply at git.blender.org
Fri May 4 19:14:15 CEST 2018


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)



More information about the Bf-blender-cvs mailing list