Blender  V3.3
Classes | Typedefs | Functions
bmesh_interp.c File Reference
#include "MEM_guardedalloc.h"
#include "DNA_meshdata_types.h"
#include "BLI_alloca.h"
#include "BLI_linklist.h"
#include "BLI_math.h"
#include "BLI_memarena.h"
#include "BLI_task.h"
#include "BKE_customdata.h"
#include "BKE_multires.h"
#include "bmesh.h"
#include "intern/bmesh_private.h"

Go to the source code of this file.

Classes

struct  BMLoopInterpMultiresData
 
struct  LoopWalkCtx
 
struct  LoopGroupCD
 

Typedefs

typedef struct BMLoopInterpMultiresData BMLoopInterpMultiresData
 

Functions

static void bm_data_interp_from_elem (CustomData *data_layer, const BMElem *ele_src_1, const BMElem *ele_src_2, BMElem *ele_dst, const float fac)
 
void BM_data_interp_from_verts (BMesh *bm, const BMVert *v_src_1, const BMVert *v_src_2, BMVert *v_dst, const float fac)
 Data, Interpolate From Verts. More...
 
void BM_data_interp_from_edges (BMesh *bm, const BMEdge *e_src_1, const BMEdge *e_src_2, BMEdge *e_dst, const float fac)
 Data, Interpolate From Edges. More...
 
static void UNUSED_FUNCTION() BM_Data_Vert_Average (BMesh *UNUSED(bm), BMFace *UNUSED(f))
 Data Vert Average. More...
 
void BM_data_interp_face_vert_edge (BMesh *bm, const BMVert *v_src_1, const BMVert *UNUSED(v_src_2), BMVert *v, BMEdge *e, const float fac)
 
void BM_face_interp_from_face_ex (BMesh *bm, BMFace *f_dst, const BMFace *f_src, const bool do_vertex, const void **blocks_l, const void **blocks_v, float(*cos_2d)[2], float axis_mat[3][3])
 Data Interpolate From Face. More...
 
void BM_face_interp_from_face (BMesh *bm, BMFace *f_dst, const BMFace *f_src, const bool do_vertex)
 
static int compute_mdisp_quad (const BMLoop *l, const float l_f_center[3], float v1[3], float v2[3], float v3[3], float v4[3], float e1[3], float e2[3])
 Multires Interpolation. More...
 
static bool quad_co (const float v1[3], const float v2[3], const float v3[3], const float v4[3], const float p[3], const float n[3], float r_uv[2])
 
static void mdisp_axis_from_quad (const float v1[3], const float v2[3], float UNUSED(v3[3]), const float v4[3], float r_axis_x[3], float r_axis_y[3])
 
static bool mdisp_in_mdispquad (BMLoop *l_src, BMLoop *l_dst, const float l_dst_f_center[3], const float p[3], int res, float r_axis_x[3], float r_axis_y[3], float r_uv[2])
 
static float bm_loop_flip_equotion (float mat[2][2], float b[2], const float target_axis_x[3], const float target_axis_y[3], const float coord[3], int i, int j)
 
static void bm_loop_flip_disp (const float source_axis_x[3], const float source_axis_y[3], const float target_axis_x[3], const float target_axis_y[3], float disp[3])
 
static void loop_interp_multires_cb (void *__restrict userdata, const int ix, const TaskParallelTLS *__restrict UNUSED(tls))
 
void BM_loop_interp_multires_ex (BMesh *UNUSED(bm), BMLoop *l_dst, const BMFace *f_src, const float f_dst_center[3], const float f_src_center[3], const int cd_loop_mdisp_offset)
 
void BM_loop_interp_multires (BMesh *bm, BMLoop *l_dst, const BMFace *f_src)
 
void BM_face_interp_multires_ex (BMesh *bm, BMFace *f_dst, const BMFace *f_src, const float f_dst_center[3], const float f_src_center[3], const int cd_loop_mdisp_offset)
 
void BM_face_interp_multires (BMesh *bm, BMFace *f_dst, const BMFace *f_src)
 
void BM_face_multires_bounds_smooth (BMesh *bm, BMFace *f)
 
void BM_loop_interp_from_face (BMesh *bm, BMLoop *l_dst, const BMFace *f_src, const bool do_vertex, const bool do_multires)
 
void BM_vert_interp_from_face (BMesh *bm, BMVert *v_dst, const BMFace *f_src)
 
static void update_data_blocks (BMesh *bm, CustomData *olddata, CustomData *data)
 
void BM_data_layer_add (BMesh *bm, CustomData *data, int type)
 
void BM_data_layer_add_named (BMesh *bm, CustomData *data, int type, const char *name)
 
void BM_data_layer_free (BMesh *bm, CustomData *data, int type)
 
bool BM_data_layer_free_named (BMesh *bm, CustomData *data, const char *name)
 
void BM_data_layer_free_n (BMesh *bm, CustomData *data, int type, int n)
 
void BM_data_layer_copy (BMesh *bm, CustomData *data, int type, int src_n, int dst_n)
 
float BM_elem_float_data_get (CustomData *cd, void *element, int type)
 
void BM_elem_float_data_set (CustomData *cd, void *element, int type, const float val)
 
Loop interpolation functions: BM_vert_loop_groups_data_layer_***

Handling loop custom-data such as UV's, while keeping contiguous fans is rather tedious. Especially when a verts loops can have multiple CustomData layers, and each layer can have multiple (different) contiguous fans. Said differently, a single vertices loops may span multiple UV islands.

These functions snapshot vertices loops, storing each contiguous fan in its own group. The caller can manipulate the loops, then re-combine the CustomData values.

While these functions don't explicitly handle multiple layers at once, the caller can simply store its own list.

Note
Currently they are averaged back together (weighted by loop angle) but we could copy add other methods to re-combine CustomData-Loop-Fans.
static void bm_loop_walk_add (struct LoopWalkCtx *lwc, BMLoop *l)
 
static void bm_loop_walk_data (struct LoopWalkCtx *lwc, BMLoop *l_walk)
 
LinkNodeBM_vert_loop_groups_data_layer_create (BMesh *bm, BMVert *v, const int layer_n, const float *loop_weights, MemArena *arena)
 
static void bm_vert_loop_groups_data_layer_merge__single (BMesh *bm, void *lf_p, int layer_n, void *data_tmp)
 
static void bm_vert_loop_groups_data_layer_merge_weights__single (BMesh *bm, void *lf_p, const int layer_n, void *data_tmp, const float *loop_weights)
 
void BM_vert_loop_groups_data_layer_merge (BMesh *bm, LinkNode *groups, const int layer_n)
 
void BM_vert_loop_groups_data_layer_merge_weights (BMesh *bm, LinkNode *groups, const int layer_n, const float *loop_weights)
 

Detailed Description

Functions for interpolating data across the surface of a mesh.

Definition in file bmesh_interp.c.

Typedef Documentation

◆ BMLoopInterpMultiresData

Function Documentation

◆ BM_data_interp_face_vert_edge()

void BM_data_interp_face_vert_edge ( BMesh bm,
const BMVert v_src_1,
const BMVert UNUSEDv_src_2,
BMVert v,
BMEdge e,
const float  fac 
)

◆ BM_data_interp_from_edges()

void BM_data_interp_from_edges ( BMesh bm,
const BMEdge e_src_1,
const BMEdge e_src_2,
BMEdge e_dst,
float  fac 
)

Data, Interpolate From Edges.

Interpolates per-edge data from two sources to e_dst.

Note
This is an exact match to BM_data_interp_from_verts.

Definition at line 75 of file bmesh_interp.c.

References bm, bm_data_interp_from_elem(), and BMesh::edata.

Referenced by bm_edge_collapse().

◆ bm_data_interp_from_elem()

static void bm_data_interp_from_elem ( CustomData data_layer,
const BMElem ele_src_1,
const BMElem ele_src_2,
BMElem ele_dst,
const float  fac 
)
static

◆ BM_data_interp_from_verts()

void BM_data_interp_from_verts ( BMesh bm,
const BMVert v_src_1,
const BMVert v_src_2,
BMVert v_dst,
float  fac 
)

Data, Interpolate From Verts.

Interpolates per-vertex data from two sources to v_dst

Note
This is an exact match to BM_data_interp_from_edges.

Definition at line 68 of file bmesh_interp.c.

References bm, bm_data_interp_from_elem(), and BMesh::vdata.

Referenced by bm_bridge_splice_loops(), bm_edge_collapse(), BM_edge_split(), BM_vert_collapse_faces(), and bpy_bmvert_copy_from_vert_interp().

◆ BM_data_layer_add()

void BM_data_layer_add ( BMesh bm,
CustomData data,
int  type 
)

◆ BM_data_layer_add_named()

void BM_data_layer_add_named ( BMesh bm,
CustomData data,
int  type,
const char *  name 
)

◆ BM_data_layer_copy()

void BM_data_layer_copy ( BMesh bm,
CustomData data,
int  type,
int  src_n,
int  dst_n 
)

◆ BM_data_layer_free()

void BM_data_layer_free ( BMesh bm,
CustomData data,
int  type 
)

◆ BM_data_layer_free_n()

void BM_data_layer_free_n ( BMesh bm,
CustomData data,
int  type,
int  n 
)

◆ BM_data_layer_free_named()

bool BM_data_layer_free_named ( BMesh bm,
CustomData data,
const char *  name 
)

Remove a named custom data layer, if it existed. Return true if the layer was removed.

Definition at line 897 of file bmesh_interp.c.

References bm, CustomData_free_layer_named(), data, CustomData::layers, MEM_dupallocN, MEM_freeN, NULL, CustomData::pool, and update_data_blocks().

Referenced by BKE_id_attribute_remove().

◆ BM_Data_Vert_Average()

static void UNUSED_FUNCTION() BM_Data_Vert_Average ( BMesh UNUSEDbm,
BMFace UNUSED
)
static

Data Vert Average.

Sets all the customdata (e.g. vert, loop) associated with a vert to the average of the face regions surrounding it.

Definition at line 88 of file bmesh_interp.c.

◆ BM_elem_float_data_get()

float BM_elem_float_data_get ( CustomData cd,
void element,
int  type 
)

◆ BM_elem_float_data_set()

void BM_elem_float_data_set ( CustomData cd,
void element,
int  type,
const float  val 
)

Definition at line 996 of file bmesh_interp.c.

References CustomData_bmesh_get(), data, element, and type.

Referenced by edgetag_set_cb(), and TEST().

◆ BM_face_interp_from_face()

void BM_face_interp_from_face ( BMesh bm,
BMFace f_dst,
const BMFace f_src,
const bool  do_vertex 
)

◆ BM_face_interp_from_face_ex()

void BM_face_interp_from_face_ex ( BMesh bm,
BMFace f_dst,
const BMFace f_src,
bool  do_vertex,
const void **  blocks,
const void **  blocks_v,
float(*)  cos_2d[2],
float  axis_mat[3][3] 
)

Data Interpolate From Face.

Projects target onto source, and pulls interpolated custom-data from source.

Note
Only handles loop custom-data. multi-res is handled.

Definition at line 136 of file bmesh_interp.c.

References BLI_array_alloca, bm, BM_elem_attrs_copy(), BM_FACE_FIRST_LOOP, BMVert::co, CustomData_bmesh_interp(), BMHeader::data, BMVert::head, BMLoop::head, interp_weights_poly_v2(), BMesh::ldata, BMFace::len, mul_v2_m3v3(), BMLoop::next, NULL, BMLoop::v, BMesh::vdata, and w().

Referenced by BM_face_interp_from_face(), bmo_face_inset_individual(), and bmo_inset_region_exec().

◆ BM_face_interp_multires()

void BM_face_interp_multires ( BMesh bm,
BMFace f_dst,
const BMFace f_src 
)

◆ BM_face_interp_multires_ex()

void BM_face_interp_multires_ex ( BMesh bm,
BMFace f_dst,
const BMFace f_src,
const float  f_dst_center[3],
const float  f_src_center[3],
const int  cd_loop_mdisp_offset 
)

◆ BM_face_multires_bounds_smooth()

void BM_face_multires_bounds_smooth ( BMesh bm,
BMFace f 
)

Smooths boundaries between multi-res grids, including some borders in adjacent faces.

mdisps is a grid of displacements, ordered thus:

                   v4/next
                     |
 |      v1/cent-----mid2 ---> x
 |         |         |
 |         |         |
v2/prev---mid1-----v3/cur
           |
           V
           y

mdisps is a grid of displacements, ordered thus:

                   v4/next
                     |
 |      v1/cent-----mid2 ---> x
 |         |         |
 |         |         |
v2/prev---mid1-----v3/cur
           |
           V
           y

Definition at line 574 of file bmesh_interp.c.

References add_v3_v3v3(), bm, BM_ELEM_CD_GET_VOID_P, BM_ITER_ELEM, BM_LOOPS_OF_FACE, CD_MDISPS, copy_v3_v3(), CustomData_get_offset(), MDisps::disps, l, BMesh::ldata, mid_v3_v3v3(), mul_v3_fl(), BMLoop::next, BMLoop::prev, BMLoop::radial_next, sqrt(), MDisps::totdisp, BMLoop::v, and y.

Referenced by BM_edge_split(), and BM_face_split().

◆ bm_loop_flip_disp()

static void bm_loop_flip_disp ( const float  source_axis_x[3],
const float  source_axis_y[3],
const float  target_axis_x[3],
const float  target_axis_y[3],
float  disp[3] 
)
static

◆ bm_loop_flip_equotion()

static float bm_loop_flip_equotion ( float  mat[2][2],
float  b[2],
const float  target_axis_x[3],
const float  target_axis_y[3],
const float  coord[3],
int  i,
int  j 
)
static

Definition at line 355 of file bmesh_interp.c.

References usdtokens::b(), and cross_v2v2().

Referenced by bm_loop_flip_disp().

◆ BM_loop_interp_from_face()

void BM_loop_interp_from_face ( BMesh bm,
BMLoop l_dst,
const BMFace f_src,
bool  do_vertex,
bool  do_multires 
)

◆ BM_loop_interp_multires()

void BM_loop_interp_multires ( BMesh bm,
BMLoop l_dst,
const BMFace f_src 
)

Project the multi-resolution grid in target onto f_src's set of multi-resolution grids.

Definition at line 529 of file bmesh_interp.c.

References bm, BM_face_calc_center_median(), BM_loop_interp_multires_ex(), CD_MDISPS, CustomData_get_offset(), BMLoop::f, and BMesh::ldata.

Referenced by BM_loop_interp_from_face().

◆ BM_loop_interp_multires_ex()

void BM_loop_interp_multires_ex ( BMesh UNUSEDbm,
BMLoop l_dst,
const BMFace f_src,
const float  f_dst_center[3],
const float  f_src_center[3],
const int  cd_loop_mdisp_offset 
)

◆ bm_loop_walk_add()

static void bm_loop_walk_add ( struct LoopWalkCtx lwc,
BMLoop l 
)
static

◆ bm_loop_walk_data()

static void bm_loop_walk_data ( struct LoopWalkCtx lwc,
BMLoop l_walk 
)
static

called recursively, keep stack-usage minimal.

Note
called for fan matching so we're pretty much safe not to break the stack

Definition at line 1076 of file bmesh_interp.c.

References BLI_assert, BM_ELEM_CD_GET_VOID_P, BM_elem_flag_test, BM_ELEM_INTERNAL_TAG, bm_loop_walk_add(), LoopWalkCtx::cd_layer_offset, CustomData_data_equals(), LoopWalkCtx::data_ref, BMLoop::next, BMLoop::prev, BMLoop::radial_next, LoopWalkCtx::type, and BMLoop::v.

Referenced by BM_vert_loop_groups_data_layer_create().

◆ BM_vert_interp_from_face()

void BM_vert_interp_from_face ( BMesh bm,
BMVert v_dst,
const BMFace f_src 
)

◆ BM_vert_loop_groups_data_layer_create()

LinkNode* BM_vert_loop_groups_data_layer_create ( BMesh bm,
BMVert v,
const int  layer_n,
const float loop_weights,
MemArena arena 
)

◆ BM_vert_loop_groups_data_layer_merge()

void BM_vert_loop_groups_data_layer_merge ( BMesh bm,
struct LinkNode groups,
int  layer_n 
)

◆ bm_vert_loop_groups_data_layer_merge__single()

static void bm_vert_loop_groups_data_layer_merge__single ( BMesh bm,
void lf_p,
int  layer_n,
void data_tmp 
)
static

◆ BM_vert_loop_groups_data_layer_merge_weights()

void BM_vert_loop_groups_data_layer_merge_weights ( BMesh bm,
struct LinkNode groups,
int  layer_n,
const float loop_weights 
)

◆ bm_vert_loop_groups_data_layer_merge_weights__single()

static void bm_vert_loop_groups_data_layer_merge_weights__single ( BMesh bm,
void lf_p,
const int  layer_n,
void data_tmp,
const float loop_weights 
)
static

◆ compute_mdisp_quad()

static int compute_mdisp_quad ( const BMLoop l,
const float  l_f_center[3],
float  v1[3],
float  v2[3],
float  v3[3],
float  v4[3],
float  e1[3],
float  e2[3] 
)
static

Multires Interpolation.

mdisps is a grid of displacements, ordered thus:

     v1/center----v4/next -> x
         |           |
         |           |
      v2/prev------v3/cur
         |
         V
         y

Definition at line 211 of file bmesh_interp.c.

References BLI_assert, BM_face_calc_center_median(), BMVert::co, copy_v3_v3(), equals_v3v3(), BMLoop::f, l, mid_v3_v3v3(), BMLoop::next, BMLoop::prev, sub_v3_v3v3(), BMLoop::v, v1, and v2.

Referenced by BM_loop_interp_multires_ex(), and mdisp_in_mdispquad().

◆ loop_interp_multires_cb()

static void loop_interp_multires_cb ( void *__restrict  userdata,
const int  ix,
const TaskParallelTLS *__restrict   UNUSEDtls 
)
static

◆ mdisp_axis_from_quad()

static void mdisp_axis_from_quad ( const float  v1[3],
const float  v2[3],
float   UNUSEDv3[3],
const float  v4[3],
float  r_axis_x[3],
float  r_axis_y[3] 
)
static

Definition at line 287 of file bmesh_interp.c.

References normalize_v3(), sub_v3_v3v3(), v1, and v2.

Referenced by BM_loop_interp_multires_ex(), and mdisp_in_mdispquad().

◆ mdisp_in_mdispquad()

static bool mdisp_in_mdispquad ( BMLoop l_src,
BMLoop l_dst,
const float  l_dst_f_center[3],
const float  p[3],
int  res,
float  r_axis_x[3],
float  r_axis_y[3],
float  r_uv[2] 
)
static
Parameters
l_srcis loop whose internal displacement.
l_dstis loop to project onto.
pThe point being projected.
r_axis_x,r_axis_yThe location in loop's CD_MDISPS grid of point p.

Definition at line 307 of file bmesh_interp.c.

References add_v3_v3(), BM_vert_normal_update_all(), Freestyle::c, compute_mdisp_quad(), eps, is_zero_v3(), mdisp_axis_from_quad(), mid_v3_v3v3v3v3(), mul_v2_fl(), mul_v3_fl(), BMVert::no, quad_co(), sub_v3_v3(), BMLoop::v, v1, and v2.

Referenced by loop_interp_multires_cb().

◆ quad_co()

static bool quad_co ( const float  v1[3],
const float  v2[3],
const float  v3[3],
const float  v4[3],
const float  p[3],
const float  n[3],
float  r_uv[2] 
)
static

◆ update_data_blocks()

static void update_data_blocks ( BMesh bm,
CustomData olddata,
CustomData data 
)
static