Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2019-05-15 07:16:35 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-05-15 07:16:35 +0300
commit5005210f407b8f3426c0137a70443b2e53a02be1 (patch)
tree0fa87ece1aa14715e896dc4cad26cce8b42aaade /source/blender/gpu
parentd09289ff7a8e8fe6d4da6b46dd153033d7cfd426 (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.h5
-rw-r--r--source/blender/gpu/intern/gpu_matrix.c32
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;
}