From 6694d7ac5f651ea03ea61a465330652cc26ecb38 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 17 Nov 2020 23:49:18 +1100 Subject: BMesh: add UV face transform and minmax utility functions --- source/blender/bmesh/intern/bmesh_query_uv.c | 22 ++++++++++++++++++++++ source/blender/bmesh/intern/bmesh_query_uv.h | 3 +++ 2 files changed, 25 insertions(+) (limited to 'source/blender/bmesh') diff --git a/source/blender/bmesh/intern/bmesh_query_uv.c b/source/blender/bmesh/intern/bmesh_query_uv.c index 1aa75bfb037..d3067109d4e 100644 --- a/source/blender/bmesh/intern/bmesh_query_uv.c +++ b/source/blender/bmesh/intern/bmesh_query_uv.c @@ -126,6 +126,28 @@ float BM_face_uv_calc_cross(const BMFace *f, const int cd_loop_uv_offset) return cross_poly_v2(uvs, f->len); } +void BM_face_uv_minmax(const BMFace *f, float min[2], float max[2], const int cd_loop_uv_offset) +{ + const BMLoop *l_iter; + const BMLoop *l_first; + l_iter = l_first = BM_FACE_FIRST_LOOP(f); + do { + const MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l_iter, cd_loop_uv_offset); + minmax_v2v2_v2(min, max, luv->uv); + } while ((l_iter = l_iter->next) != l_first); +} + +void BM_face_uv_transform(BMFace *f, const float matrix[2][2], const int cd_loop_uv_offset) +{ + BMLoop *l_iter; + BMLoop *l_first; + l_iter = l_first = BM_FACE_FIRST_LOOP(f); + do { + MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l_iter, cd_loop_uv_offset); + mul_m2_v2(matrix, luv->uv); + } while ((l_iter = l_iter->next) != l_first); +} + /** * Check if two loops that share an edge also have the same UV coordinates. */ diff --git a/source/blender/bmesh/intern/bmesh_query_uv.h b/source/blender/bmesh/intern/bmesh_query_uv.h index 0a86c0cbeae..9aad8e17ca0 100644 --- a/source/blender/bmesh/intern/bmesh_query_uv.h +++ b/source/blender/bmesh/intern/bmesh_query_uv.h @@ -37,6 +37,9 @@ void BM_face_uv_calc_center_median(const BMFace *f, const int cd_loop_uv_offset, float BM_face_uv_calc_cross(const BMFace *f, const int cd_loop_uv_offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); +void BM_face_uv_minmax(const BMFace *f, float min[2], float max[2], const int cd_loop_uv_offset); +void BM_face_uv_transform(BMFace *f, const float matix[2][2], const int cd_loop_uv_offset); + bool BM_loop_uv_share_edge_check_with_limit(BMLoop *l_a, BMLoop *l_b, const float limit[2], -- cgit v1.2.3