DRW: Add DRW_viewport_far/near_distance_get functions.

This commit is contained in:
Clément Foucault 2018-05-04 17:32:53 +02:00
parent 9cb397238d
commit bb063ec31e
2 changed files with 31 additions and 2 deletions

View File

@ -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);

View File

@ -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)