[Bf-blender-cvs] [c90452e111a] master: BLI_rect: Function to calculate a matrix from 2 rctf's

Campbell Barton noreply at git.blender.org
Sun Aug 27 08:15:15 CEST 2017


Commit: c90452e111abae7817b02ad848b358eb77a44252
Author: Campbell Barton
Date:   Sun Aug 27 16:01:06 2017 +1000
Branches: master
https://developer.blender.org/rBc90452e111abae7817b02ad848b358eb77a44252

BLI_rect: Function to calculate a matrix from 2 rctf's

===================================================================

M	source/blender/blenlib/BLI_rect.h
M	source/blender/blenlib/intern/rct.c

===================================================================

diff --git a/source/blender/blenlib/BLI_rect.h b/source/blender/blenlib/BLI_rect.h
index 21b9c75ac35..471d875c9af 100644
--- a/source/blender/blenlib/BLI_rect.h
+++ b/source/blender/blenlib/BLI_rect.h
@@ -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);
diff --git a/source/blender/blenlib/intern/rct.c b/source/blender/blenlib/intern/rct.c
index e0c4cbe9990..3adc6b30f6e 100644
--- a/source/blender/blenlib/intern/rct.c
+++ b/source/blender/blenlib/intern/rct.c
@@ -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;
+}



More information about the Bf-blender-cvs mailing list