BLI_rect: Function to calculate a matrix from 2 rctf's
authorCampbell Barton <ideasman42@gmail.com>
Sun, 27 Aug 2017 06:01:06 +0000 (16:01 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Sun, 27 Aug 2017 06:19:34 +0000 (16:19 +1000)
source/blender/blenlib/BLI_rect.h
source/blender/blenlib/intern/rct.c

index 21b9c75ac35d6b18d12cb27a17f19dfa128a7ced..471d875c9afc44381d3cf79d09540d0bf5e9792f 100644 (file)
@@ -55,6 +55,8 @@ void BLI_rcti_do_minmax_v(struct rcti *rect, const int xy[2]);
 void BLI_rctf_do_minmax_v(struct rctf *rect, const float xy[2]);
 
 void BLI_rctf_transform_pt_v(const rctf *dst, const rctf *src, float xy_dst[2], const float xy_src[2]);
+void BLI_rctf_transform_calc_m4_pivot_min_ex(const rctf *dst, const rctf *src, float matrix[4][4], uint x, uint y);
+void BLI_rctf_transform_calc_m4_pivot_min(const rctf *dst, const rctf *src, float matrix[4][4]);
 
 void BLI_rctf_translate(struct rctf *rect, float x, float y);
 void BLI_rcti_translate(struct rcti *rect, int x, int y);
index e0c4cbe999055bf572fc0dc849c02c5fc291c231..3adc6b30f6eae952cf83373d0912176995c9a377 100644 (file)
@@ -32,6 +32,7 @@
  * A minimalist lib for functions doing stuff with rectangle structs.
  */
 
+#include <stdlib.h>
 #include <stdio.h>
 #include <math.h>
 
@@ -41,6 +42,9 @@
 #include "DNA_vec_types.h"
 #include "BLI_rect.h"
 
+/* avoid including BLI_math */
+static void unit_m4(float m[4][4]);
+
 /**
  * Determine if a rect is empty. An empty
  * rect is one with a zero (or negative)
@@ -405,6 +409,31 @@ void BLI_rctf_transform_pt_v(const rctf *dst, const rctf *src, float xy_dst[2],
        xy_dst[1] =               dst->ymin + ((dst->ymax - dst->ymin) * xy_dst[1]);
 }
 
+/**
+ * Calculate a 4x4 matrix representing the transformation between two rectangles.
+ *
+ * \note Multiplying a vector by this matrix does *not* give the same value as #BLI_rctf_transform_pt_v.
+ */
+void BLI_rctf_transform_calc_m4_pivot_min_ex(
+        const rctf *dst, const rctf *src, float matrix[4][4],
+        uint x, uint y)
+{
+       BLI_assert(x < 3 && y < 3);
+
+       unit_m4(matrix);
+
+       matrix[x][x] = BLI_rctf_size_x(src) / BLI_rctf_size_x(dst);
+       matrix[y][y] = BLI_rctf_size_y(src) / BLI_rctf_size_y(dst);
+       matrix[3][x] = (src->xmin - dst->xmin) * matrix[x][x];
+       matrix[3][y] = (src->ymin - dst->ymin) * matrix[y][y];
+}
+
+void BLI_rctf_transform_calc_m4_pivot_min(
+        const rctf *dst, const rctf *src, float matrix[4][4])
+{
+       BLI_rctf_transform_calc_m4_pivot_min_ex(dst, src, matrix, 0, 1);
+}
+
 void BLI_rcti_translate(rcti *rect, int x, int y)
 {
        rect->xmin += x;
@@ -763,3 +792,12 @@ void BLI_rctf_rotate_expand(rctf *dst, const rctf *src, const float angle)
 #undef ROTATE_SINCOS
 
 /** \} */
+
+static void unit_m4(float m[4][4])
+{
+       m[0][0] = m[1][1] = m[2][2] = m[3][3] = 1.0f;
+       m[0][1] = m[0][2] = m[0][3] = 0.0f;
+       m[1][0] = m[1][2] = m[1][3] = 0.0f;
+       m[2][0] = m[2][1] = m[2][3] = 0.0f;
+       m[3][0] = m[3][1] = m[3][2] = 0.0f;
+}