Blender V4.3
bmesh_interp.cc File Reference
#include "MEM_guardedalloc.h"
#include "DNA_meshdata_types.h"
#include "BLI_alloca.h"
#include "BLI_linklist.h"
#include "BLI_math_geom.h"
#include "BLI_math_matrix.h"
#include "BLI_math_vector.h"
#include "BLI_memarena.h"
#include "BLI_task.h"
#include "BKE_attribute.hh"
#include "BKE_customdata.hh"
#include "BKE_multires.hh"
#include "bmesh.hh"
#include "intern/bmesh_private.hh"

Go to the source code of this file.

Classes

struct  BMLoopInterpMultiresData
 
struct  LoopWalkCtx
 
struct  LoopGroupCD
 

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.
 
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.
 
static void UNUSED_FUNCTION BM_Data_Vert_Average (BMesh *, BMFace *)
 Data Vert Average.
 
void BM_data_interp_face_vert_edge (BMesh *bm, const BMVert *v_src_1, const BMVert *, BMVert *v, BMEdge *e, const float fac)
 Data Face-Vert Edge Interpolate.
 
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.
 
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.
 
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[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)
 
void BM_loop_interp_multires_ex (BMesh *, 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_ensure_named (BMesh *bm, CustomData *data, int type, const char *name)
 
void BM_uv_map_ensure_select_and_pin_attrs (BMesh *bm)
 
void BM_uv_map_ensure_vert_select_attr (BMesh *bm, const char *uv_map_name)
 
void BM_uv_map_ensure_edge_select_attr (BMesh *bm, const char *uv_map_name)
 
void BM_uv_map_ensure_pin_attr (BMesh *bm, const char *uv_map_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 UVs, 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 (LoopWalkCtx *lwc, BMLoop *l)
 
static void bm_loop_walk_data (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.cc.

Function Documentation

◆ BM_data_interp_face_vert_edge()

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

Data Face-Vert Edge Interpolate.

Walks around the faces of e and interpolates the loop data between two sources.

Definition at line 93 of file bmesh_interp.cc.

References bm, CustomData_bmesh_interp(), BMHeader::data, e, BMLoop::head, BMesh::ldata, BMLoop::next, BMLoop::prev, BMLoop::radial_next, BMLoop::v, v, and w().

Referenced by BM_edge_split().

◆ 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.cc.

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

Referenced by bm_edge_collapse(), and blender::bke::pbvh::merge_edge_data().

◆ 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.cc.

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(), bpy_bmvert_copy_from_vert_interp(), and blender::bke::pbvh::pbvh_bmesh_vert_create().

◆ BM_data_layer_add()

◆ BM_data_layer_add_named()

◆ BM_data_layer_copy()

◆ BM_data_layer_ensure_named()

◆ BM_data_layer_free()

◆ BM_data_layer_free_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 945 of file bmesh_interp.cc.

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

Referenced by BKE_attribute_remove(), and blender::ed::sculpt_paint::dyntopo::disable().

◆ BM_Data_Vert_Average()

static void UNUSED_FUNCTION BM_Data_Vert_Average ( BMesh * ,
BMFace *  )
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.cc.

◆ BM_elem_float_data_get()

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

Definition at line 1041 of file bmesh_interp.cc.

References CustomData_bmesh_get().

Referenced by TEST().

◆ BM_elem_float_data_set()

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

Definition at line 1048 of file bmesh_interp.cc.

References CustomData_bmesh_get().

Referenced by TEST().

◆ BM_face_interp_from_face()

◆ 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.
Attributes such as selection, material & normals must be handled with a separate call to BM_elem_attrs_copy.

Definition at line 136 of file bmesh_interp.cc.

References BLI_array_alloca, bm, BM_FACE_FIRST_LOOP, BMVert::co, CustomData_bmesh_interp(), BMHeader::data, BMLoop::head, BMVert::head, interp_weights_poly_v2(), BMesh::ldata, BMFace::len, mul_v2_m3v3(), BMLoop::next, 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 572 of file bmesh_interp.cc.

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, int, 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 351 of file bmesh_interp.cc.

References 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 527 of file bmesh_interp.cc.

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()

◆ bm_loop_walk_add()

◆ bm_loop_walk_data()

static void bm_loop_walk_data ( 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 1129 of file bmesh_interp.cc.

References BLI_assert, BM_ELEM_CD_GET_VOID_P, BM_elem_flag_test, BM_ELEM_INTERNAL_TAG, bm_loop_walk_add(), bm_loop_walk_data(), 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_loop_walk_data(), and BM_vert_loop_groups_data_layer_create().

◆ BM_uv_map_ensure_edge_select_attr()

◆ BM_uv_map_ensure_pin_attr()

void BM_uv_map_ensure_pin_attr ( BMesh * bm,
const char * uv_map_name )

◆ BM_uv_map_ensure_select_and_pin_attrs()

◆ BM_uv_map_ensure_vert_select_attr()

◆ BM_vert_interp_from_face()

◆ BM_vert_loop_groups_data_layer_create()

◆ BM_vert_loop_groups_data_layer_merge()

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

Take existing custom data and merge each fan's data.

Definition at line 1275 of file bmesh_interp.cc.

References bm, bm_vert_loop_groups_data_layer_merge__single(), CustomData_sizeof(), CustomData::layers, BMesh::ldata, and CustomDataLayer::type.

Referenced by mesh_customdatacorrect_apply_vert().

◆ 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,
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 207 of file bmesh_interp.cc.

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, 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 )
static

◆ mdisp_axis_from_quad()

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

Definition at line 283 of file bmesh_interp.cc.

References normalize_v3(), sub_v3_v3v3(), 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 303 of file bmesh_interp.cc.

References add_v3_v3(), BM_vert_normal_update_all(), 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, 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()