diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-05-15 07:16:35 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-05-15 07:16:35 +0300 |
commit | 5005210f407b8f3426c0137a70443b2e53a02be1 (patch) | |
tree | 0fa87ece1aa14715e896dc4cad26cce8b42aaade /source/blender/gpu | |
parent | d09289ff7a8e8fe6d4da6b46dd153033d7cfd426 (diff) |
GPU: Add a matrix unproject function that takes an inverted matrix
This is normally already calculated so add a version that takes the
inverted matrix.
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/GPU_matrix.h | 5 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_matrix.c | 32 |
2 files changed, 25 insertions, 12 deletions
diff --git a/source/blender/gpu/GPU_matrix.h b/source/blender/gpu/GPU_matrix.h index 67fb2bb2bd4..6f7d25dafa7 100644 --- a/source/blender/gpu/GPU_matrix.h +++ b/source/blender/gpu/GPU_matrix.h @@ -106,6 +106,11 @@ bool GPU_matrix_unproject(const float win[3], const float proj[4][4], const int view[4], float world[3]); +void GPU_matrix_unproject_model_inverted(const float win[3], + const float model_inverted[4][4], + const float proj[4][4], + const int view[4], + float world[3]); /* 2D Projection Matrix */ diff --git a/source/blender/gpu/intern/gpu_matrix.c b/source/blender/gpu/intern/gpu_matrix.c index 5d65861c1e2..cc89da19705 100644 --- a/source/blender/gpu/intern/gpu_matrix.c +++ b/source/blender/gpu/intern/gpu_matrix.c @@ -502,19 +502,13 @@ static void gpu_mul_invert_projmat_m4_unmapped_v3(const float projmat[4][4], flo co[2] *= -1; } -bool GPU_matrix_unproject(const float win[3], - const float model[4][4], - const float proj[4][4], - const int view[4], - float world[3]) +void GPU_matrix_unproject_model_inverted(const float win[3], + const float model_inverted[4][4], + const float proj[4][4], + const int view[4], + float world[3]) { float in[3]; - float viewinv[4][4]; - - if (!invert_m4_m4(viewinv, model)) { - zero_v3(world); - return false; - } copy_v3_v3(in, win); @@ -523,8 +517,22 @@ bool GPU_matrix_unproject(const float win[3], in[1] = (in[1] - view[1]) / view[3]; gpu_mul_invert_projmat_m4_unmapped_v3(proj, in); - mul_v3_m4v3(world, viewinv, in); + mul_v3_m4v3(world, model_inverted, in); +} +bool GPU_matrix_unproject(const float win[3], + const float model[4][4], + const float proj[4][4], + const int view[4], + float world[3]) +{ + float model_inverted[4][4]; + + if (!invert_m4_m4(model_inverted, model)) { + zero_v3(world); + return false; + } + GPU_matrix_unproject_model_inverted(win, model_inverted, proj, view, world); return true; } |