Blender V4.3
bmo_subdivide.cc File Reference
#include <array>
#include "MEM_guardedalloc.h"
#include "BLI_math_geom.h"
#include "BLI_math_vector.h"
#include "BLI_noise.h"
#include "BLI_rand.h"
#include "BLI_stack.h"
#include "BLI_vector.hh"
#include "BKE_customdata.hh"
#include "bmesh.hh"
#include "intern/bmesh_operators_private.hh"
#include "intern/bmesh_private.hh"

Go to the source code of this file.

Classes

struct  SubDParams
 
struct  SubDPattern
 
struct  SubDFaceData
 

Macros

#define SUBD_SPLIT   1
 
#define EDGE_PERCENT   2
 
#define FACE_CUSTOMFILL   4
 
#define ELE_INNER   8
 
#define ELE_SPLIT   16
 
#define FLT_FACE_SPLIT_EPSILON   0.00005f
 
#define USE_SPHERE_DUAL_BLEND
 
#define PATTERNS_TOT   ARRAY_SIZE(patterns)
 

Typedefs

typedef void(* subd_pattern_fill_fp) (BMesh *bm, BMFace *face, BMVert **verts, const SubDParams *params)
 

Functions

static void bmo_subd_init_shape_info (BMesh *bm, SubDParams *params)
 
static BMEdgeconnect_smallest_face (BMesh *bm, BMVert *v_a, BMVert *v_b, BMFace **r_f_new)
 
static void interp_slerp_co_no_v3 (const float co_a[3], const float no_a[3], const float co_b[3], const float no_b[3], const float no_dir[3], float fac, float r_co[3])
 
static void alter_co (BMVert *v, BMEdge *, const SubDParams *params, const float perc, const BMVert *v_a, const BMVert *v_b)
 
static BMVertbm_subdivide_edge_addvert (BMesh *bm, BMEdge *edge, BMEdge *e_orig, const SubDParams *params, const float factor_edge_split, const float factor_subd, BMVert *v_a, BMVert *v_b, BMEdge **r_edge)
 
static BMVertsubdivide_edge_num (BMesh *bm, BMEdge *edge, BMEdge *e_orig, int curpoint, int totpoint, const SubDParams *params, BMVert *v_a, BMVert *v_b, BMEdge **r_edge)
 
static void bm_subdivide_multicut (BMesh *bm, BMEdge *edge, const SubDParams *params, BMVert *v_a, BMVert *v_b)
 
static void quad_1edge_split (BMesh *bm, BMFace *, BMVert **verts, const SubDParams *params)
 
static void quad_2edge_split_path (BMesh *bm, BMFace *, BMVert **verts, const SubDParams *params)
 
static void quad_2edge_split_innervert (BMesh *bm, BMFace *, BMVert **verts, const SubDParams *params)
 
static void quad_2edge_split_fan (BMesh *bm, BMFace *, BMVert **verts, const SubDParams *params)
 
static void quad_3edge_split (BMesh *bm, BMFace *, BMVert **verts, const SubDParams *params)
 
static void quad_4edge_subdivide (BMesh *bm, BMFace *, BMVert **verts, const SubDParams *params)
 
static void tri_1edge_split (BMesh *bm, BMFace *, BMVert **verts, const SubDParams *params)
 
static void tri_3edge_subdivide (BMesh *bm, BMFace *, BMVert **verts, const SubDParams *params)
 
void bmo_subdivide_edges_exec (BMesh *bm, BMOperator *op)
 
void BM_mesh_esubdivide (BMesh *bm, const char edge_hflag, const float smooth, const short smooth_falloff, const bool use_smooth_even, const float fractal, const float along_normal, const int numcuts, const int seltype, const int cornertype, const short use_single_edge, const short use_grid_fill, const short use_only_quads, const int seed)
 
void bmo_bisect_edges_exec (BMesh *bm, BMOperator *op)
 

Variables

static const SubDPattern quad_1edge
 
static const SubDPattern quad_2edge_path
 
static const SubDPattern quad_2edge_innervert
 
static const SubDPattern quad_2edge_fan
 
static const SubDPattern quad_3edge
 
static const SubDPattern tri_1edge
 
static const SubDPattern tri_3edge
 
static const SubDPattern quad_4edge
 
static const SubDPatternpatterns []
 

Detailed Description

Edge based subdivision with various subdivision patterns.

Definition in file bmo_subdivide.cc.

Macro Definition Documentation

◆ EDGE_PERCENT

#define EDGE_PERCENT   2

◆ ELE_INNER

◆ ELE_SPLIT

#define ELE_SPLIT   16

◆ FACE_CUSTOMFILL

#define FACE_CUSTOMFILL   4

Definition at line 102 of file bmo_subdivide.cc.

Referenced by bmo_subdivide_edges_exec().

◆ FLT_FACE_SPLIT_EPSILON

#define FLT_FACE_SPLIT_EPSILON   0.00005f

Definition at line 107 of file bmo_subdivide.cc.

Referenced by bmo_subdivide_edges_exec().

◆ PATTERNS_TOT

#define PATTERNS_TOT   ARRAY_SIZE(patterns)

Definition at line 902 of file bmo_subdivide.cc.

Referenced by bmo_subdivide_edges_exec().

◆ SUBD_SPLIT

#define SUBD_SPLIT   1

Flags for all elements share a common bit-field space.

Definition at line 96 of file bmo_subdivide.cc.

Referenced by bm_subdivide_multicut(), and bmo_subdivide_edges_exec().

◆ USE_SPHERE_DUAL_BLEND

#define USE_SPHERE_DUAL_BLEND

Typedef Documentation

◆ subd_pattern_fill_fp

typedef void(* subd_pattern_fill_fp) (BMesh *bm, BMFace *face, BMVert **verts, const SubDParams *params)

Definition at line 68 of file bmo_subdivide.cc.

Function Documentation

◆ alter_co()

◆ BM_mesh_esubdivide()

void BM_mesh_esubdivide ( BMesh * bm,
const char edge_hflag,
const float smooth,
const short smooth_falloff,
const bool use_smooth_even,
const float fractal,
const float along_normal,
const int numcuts,
const int seltype,
const int cornertype,
const short use_single_edge,
const short use_grid_fill,
const short use_only_quads,
const int seed )

◆ bm_subdivide_edge_addvert()

static BMVert * bm_subdivide_edge_addvert ( BMesh * bm,
BMEdge * edge,
BMEdge * e_orig,
const SubDParams * params,
const float factor_edge_split,
const float factor_subd,
BMVert * v_a,
BMVert * v_b,
BMEdge ** r_edge )
static

◆ bm_subdivide_multicut()

static void bm_subdivide_multicut ( BMesh * bm,
BMEdge * edge,
const SubDParams * params,
BMVert * v_a,
BMVert * v_b )
static

◆ bmo_bisect_edges_exec()

◆ bmo_subd_init_shape_info()

static void bmo_subd_init_shape_info ( BMesh * bm,
SubDParams * params )
static

◆ bmo_subdivide_edges_exec()

void bmo_subdivide_edges_exec ( BMesh * bm,
BMOperator * op )

Definition at line 911 of file bmo_subdivide.cc.

References b, BLI_assert, BLI_rng_free(), BLI_rng_get_float(), BLI_rng_new_srandom(), BLI_stack_discard(), BLI_stack_free(), BLI_stack_is_empty(), BLI_stack_new, BLI_stack_peek(), BLI_stack_push_r(), bm, BM_ALL_NOLOOP, BM_CHECK_ELEMENT, BM_data_layer_add(), BM_data_layer_free_n(), BM_EDGE, BM_edge_exists(), BM_edge_share_vert_check(), BM_ELEM_CD_GET_VOID_P, BM_FACE, BM_face_split(), BM_FACES_OF_MESH, BM_ITER_ELEM, BM_ITER_ELEM_INDEX, BM_ITER_MESH, BM_LOOPS_OF_FACE, BM_LOOPS_OF_VERT, bm_subdivide_multicut(), BM_vert_in_face(), BM_VERTS_OF_MESH, BMO_edge_flag_enable, BMO_edge_flag_test, BMO_face_flag_enable, BMO_face_flag_test, BMO_slot_bool_get(), BMO_slot_buffer_flag_enable(), BMO_slot_buffer_from_enabled_flag(), BMO_slot_float_get(), BMO_slot_get(), BMO_slot_int_get(), BMO_slot_map_to_flag(), bmo_subd_init_shape_info(), BMO_vert_flag_test, BMOpSlot::buf, CD_SHAPEKEY, BMVert::co, SubDPattern::connectexec, copy_v3_v3(), BMOpSlot::data, dot_v3v3(), BMLoop::e, EDGE_PERCENT, ELE_INNER, ELE_SPLIT, BMLoop::f, fabsf, SubDFaceData::face, FACE_CUSTOMFILL, FLT_FACE_SPLIT_EPSILON, l, BMOpSlot::len, SubDPattern::len, BMLoop::next, normalize_v3(), params, SubDFaceData::pat, patterns, PATTERNS_TOT, BMLoop::prev, quad_1edge, quad_2edge_fan, quad_2edge_innervert, quad_2edge_path, quad_4edge, blender::Vector< T, InlineBufferCapacity, Allocator >::reinitialize(), seed, SubDPattern::seledges, BMOperator::slots_in, BMOperator::slots_out, smooth(), SubDFaceData::start, sub_v3_v3v3(), SUBD_CORNER_FAN, SUBD_CORNER_INNERVERT, SUBD_CORNER_PATH, SUBD_SPLIT, SubDFaceData::totedgesel, tri_1edge, tri_3edge, BMLoop::v, v, BMEdge::v1, BMEdge::v2, BMesh::vdata, and verts.

◆ connect_smallest_face()

◆ interp_slerp_co_no_v3()

static void interp_slerp_co_no_v3 ( const float co_a[3],
const float no_a[3],
const float co_b[3],
const float no_b[3],
const float no_dir[3],
float fac,
float r_co[3] )
static

◆ quad_1edge_split()

static void quad_1edge_split ( BMesh * bm,
BMFace * ,
BMVert ** verts,
const SubDParams * params )
static
 v3---------v2
 |          |
 |          |
 |          |
 |          |
 v4---v0---v1

Definition at line 482 of file bmo_subdivide.cc.

References add(), bm, connect_smallest_face(), params, and verts.

◆ quad_2edge_split_fan()

static void quad_2edge_split_fan ( BMesh * bm,
BMFace * ,
BMVert ** verts,
const SubDParams * params )
static
 v6--------v5
 |          |
 |          |v4s
 |          |v3s
 |   s  s   |
 v7-v0--v1-v2

Definition at line 602 of file bmo_subdivide.cc.

References bm, connect_smallest_face(), params, and verts.

◆ quad_2edge_split_innervert()

static void quad_2edge_split_innervert ( BMesh * bm,
BMFace * ,
BMVert ** verts,
const SubDParams * params )
static
 v6--------v5
 |          |
 |          |v4s
 |          |v3s
 |   s  s   |
 v7-v0--v1-v2

Definition at line 558 of file bmo_subdivide.cc.

References bm, bm_subdivide_edge_addvert(), connect_smallest_face(), e, params, v, and verts.

◆ quad_2edge_split_path()

static void quad_2edge_split_path ( BMesh * bm,
BMFace * ,
BMVert ** verts,
const SubDParams * params )
static
 v6--------v5
 |          |
 |          |v4s
 |          |v3s
 |   s  s   |
 v7-v0--v1-v2

Definition at line 528 of file bmo_subdivide.cc.

References bm, connect_smallest_face(), params, and verts.

◆ quad_3edge_split()

static void quad_3edge_split ( BMesh * bm,
BMFace * ,
BMVert ** verts,
const SubDParams * params )
static
     s   s
 v8--v7--v6-v5
 |          |
 |          v4 s
 |          |
 |          v3 s
 |   s  s   |
 v9-v0--v1-v2

Definition at line 637 of file bmo_subdivide.cc.

References bm, connect_smallest_face(), params, and verts.

◆ quad_4edge_subdivide()

static void quad_4edge_subdivide ( BMesh * bm,
BMFace * ,
BMVert ** verts,
const SubDParams * params )
static
           v8--v7-v6--v5
           |     s    |
           |v9 s     s|v4
first line |          |   last line
           |v10s s   s|v3
           v11-v0--v1-v2

           it goes from bottom up

Definition at line 678 of file bmo_subdivide.cc.

References b, bm, BMESH_ASSERT, BMO_edge_flag_enable, BMO_face_flag_enable, connect_smallest_face(), e, ELE_INNER, MEM_callocN, MEM_freeN(), params, subdivide_edge_num(), v, v2, and verts.

◆ subdivide_edge_num()

static BMVert * subdivide_edge_num ( BMesh * bm,
BMEdge * edge,
BMEdge * e_orig,
int curpoint,
int totpoint,
const SubDParams * params,
BMVert * v_a,
BMVert * v_b,
BMEdge ** r_edge )
static

◆ tri_1edge_split()

static void tri_1edge_split ( BMesh * bm,
BMFace * ,
BMVert ** verts,
const SubDParams * params )
static
       v3
      / \
     /   \
    /     \
   /       \
  /         \
 v4--v0--v1--v2
     s    s

Definition at line 762 of file bmo_subdivide.cc.

References bm, connect_smallest_face(), params, and verts.

◆ tri_3edge_subdivide()

static void tri_3edge_subdivide ( BMesh * bm,
BMFace * ,
BMVert ** verts,
const SubDParams * params )
static
        v5
       / \
  s v6/---\ v4 s
     / \ / \
 sv7/---v---\ v3 s
   /  \/  \/ \
  v8--v0--v1--v2
     s    s
        v5
       / \
  s v6/---\ v4 s
     / \ / \
 sv7/---v---\ v3 s
   /  \/  \/ \
  v8--v0--v1--v2
     s    s

Definition at line 790 of file bmo_subdivide.cc.

References b, bm, BMO_edge_flag_enable, BMO_face_flag_enable, connect_smallest_face(), e, ELE_INNER, MEM_callocN, MEM_freeN(), params, subdivide_edge_num(), v, BMEdge::v1, BMEdge::v2, and verts.

Variable Documentation

◆ patterns

const SubDPattern* patterns[]
static
Initial value:
= {
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
}
static const SubDPattern quad_3edge

Definition at line 893 of file bmo_subdivide.cc.

Referenced by bmo_subdivide_edges_exec(), and blender::io::usd::split_udim_pattern().

◆ quad_1edge

const SubDPattern quad_1edge
static
Initial value:
= {
{1, 0, 0, 0},
4,
}
static void quad_1edge_split(BMesh *bm, BMFace *, BMVert **verts, const SubDParams *params)

Definition at line 512 of file bmo_subdivide.cc.

Referenced by bmo_subdivide_edges_exec().

◆ quad_2edge_fan

const SubDPattern quad_2edge_fan
static
Initial value:
= {
{1, 1, 0, 0},
4,
}
static void quad_2edge_split_fan(BMesh *bm, BMFace *, BMVert **verts, const SubDParams *params)

Definition at line 619 of file bmo_subdivide.cc.

Referenced by bmo_subdivide_edges_exec().

◆ quad_2edge_innervert

const SubDPattern quad_2edge_innervert
static
Initial value:
= {
{1, 1, 0, 0},
4,
}
static void quad_2edge_split_innervert(BMesh *bm, BMFace *, BMVert **verts, const SubDParams *params)

Definition at line 586 of file bmo_subdivide.cc.

Referenced by bmo_subdivide_edges_exec().

◆ quad_2edge_path

const SubDPattern quad_2edge_path
static
Initial value:
= {
{1, 1, 0, 0},
4,
}
static void quad_2edge_split_path(BMesh *bm, BMFace *, BMVert **verts, const SubDParams *params)

Definition at line 542 of file bmo_subdivide.cc.

Referenced by bmo_subdivide_edges_exec().

◆ quad_3edge

const SubDPattern quad_3edge
static
Initial value:
= {
{1, 1, 1, 0},
4,
}
static void quad_3edge_split(BMesh *bm, BMFace *, BMVert **verts, const SubDParams *params)

Definition at line 660 of file bmo_subdivide.cc.

◆ quad_4edge

const SubDPattern quad_4edge
static
Initial value:
= {
{1, 1, 1, 1},
4,
}
static void quad_4edge_subdivide(BMesh *bm, BMFace *, BMVert **verts, const SubDParams *params)

Definition at line 887 of file bmo_subdivide.cc.

Referenced by bmo_subdivide_edges_exec().

◆ tri_1edge

const SubDPattern tri_1edge
static
Initial value:
= {
{1, 0, 0},
3,
}
static void tri_1edge_split(BMesh *bm, BMFace *, BMVert **verts, const SubDParams *params)

Definition at line 772 of file bmo_subdivide.cc.

Referenced by bmo_subdivide_edges_exec().

◆ tri_3edge

const SubDPattern tri_3edge
static
Initial value:
= {
{1, 1, 1},
3,
}
static void tri_3edge_subdivide(BMesh *bm, BMFace *, BMVert **verts, const SubDParams *params)

Definition at line 881 of file bmo_subdivide.cc.

Referenced by bmo_subdivide_edges_exec().