Blender  V3.3
Classes | Macros | Typedefs | Functions | Variables
bmo_subdivide.c File Reference
#include "MEM_guardedalloc.h"
#include "BLI_array.h"
#include "BLI_math.h"
#include "BLI_noise.h"
#include "BLI_rand.h"
#include "BLI_stack.h"
#include "BKE_customdata.h"
#include "bmesh.h"
#include "intern/bmesh_operators_private.h"
#include "intern/bmesh_private.h"

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 struct SubDParams SubDParams
 
typedef void(* subd_pattern_fill_fp) (BMesh *bm, BMFace *face, BMVert **verts, const SubDParams *params)
 
typedef struct SubDPattern SubDPattern
 
typedef struct SubDFaceData SubDFaceData
 

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 *UNUSED(e_orig), 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 *UNUSED(face), BMVert **verts, const SubDParams *params)
 
static void quad_2edge_split_path (BMesh *bm, BMFace *UNUSED(face), BMVert **verts, const SubDParams *params)
 
static void quad_2edge_split_innervert (BMesh *bm, BMFace *UNUSED(face), BMVert **verts, const SubDParams *params)
 
static void quad_2edge_split_fan (BMesh *bm, BMFace *UNUSED(face), BMVert **verts, const SubDParams *params)
 
static void quad_3edge_split (BMesh *bm, BMFace *UNUSED(face), BMVert **verts, const SubDParams *params)
 
static void quad_4edge_subdivide (BMesh *bm, BMFace *UNUSED(face), BMVert **verts, const SubDParams *params)
 
static void tri_1edge_split (BMesh *bm, BMFace *UNUSED(face), BMVert **verts, const SubDParams *params)
 
static void tri_3edge_subdivide (BMesh *bm, BMFace *UNUSED(face), 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.c.

Macro Definition Documentation

◆ EDGE_PERCENT

#define EDGE_PERCENT   2

Definition at line 92 of file bmo_subdivide.c.

◆ ELE_INNER

#define ELE_INNER   8

Definition at line 97 of file bmo_subdivide.c.

◆ ELE_SPLIT

#define ELE_SPLIT   16

Definition at line 98 of file bmo_subdivide.c.

◆ FACE_CUSTOMFILL

#define FACE_CUSTOMFILL   4

Definition at line 96 of file bmo_subdivide.c.

◆ FLT_FACE_SPLIT_EPSILON

#define FLT_FACE_SPLIT_EPSILON   0.00005f

Definition at line 101 of file bmo_subdivide.c.

◆ PATTERNS_TOT

#define PATTERNS_TOT   ARRAY_SIZE(patterns)

Definition at line 891 of file bmo_subdivide.c.

◆ SUBD_SPLIT

#define SUBD_SPLIT   1

Definition at line 90 of file bmo_subdivide.c.

◆ 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 62 of file bmo_subdivide.c.

◆ SubDFaceData

typedef struct SubDFaceData SubDFaceData

◆ SubDParams

typedef struct SubDParams SubDParams

◆ SubDPattern

typedef struct SubDPattern SubDPattern

Function Documentation

◆ alter_co()

static void alter_co ( BMVert v,
BMEdge UNUSEDe_orig,
const SubDParams params,
const float  perc,
const BMVert v_a,
const BMVert v_b 
)
static

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

void bmo_bisect_edges_exec ( BMesh bm,
BMOperator op 
)

◆ 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 900 of file bmo_subdivide.c.

References Freestyle::a, usdtokens::b(), BLI_array_clear, BLI_array_declare, BLI_array_free, BLI_array_grow_items, BLI_array_len, 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, if(), l, BMFace::len, BMOpSlot::len, SubDPattern::len, BMLoop::next, normalize_v3(), NULL, params, SubDFaceData::pat, patterns, PATTERNS_TOT, BMLoop::prev, quad_1edge, quad_2edge_fan, quad_2edge_innervert, quad_2edge_path, quad_4edge, 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()

static BMEdge* connect_smallest_face ( BMesh bm,
BMVert v_a,
BMVert v_b,
BMFace **  r_f_new 
)
static

◆ 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 UNUSEDface,
BMVert **  verts,
const SubDParams params 
)
static
 v3---------v2
 |          |
 |          |
 |          |
 |          |
 v4---v0---v1

Definition at line 472 of file bmo_subdivide.c.

References blender::bke::attribute_accessor_functions::add(), bm, connect_smallest_face(), params, and verts.

◆ quad_2edge_split_fan()

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

Definition at line 592 of file bmo_subdivide.c.

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

◆ quad_2edge_split_innervert()

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

Definition at line 548 of file bmo_subdivide.c.

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 UNUSEDface,
BMVert **  verts,
const SubDParams params 
)
static
 v6--------v5
 |          |
 |          |v4s
 |          |v3s
 |   s  s   |
 v7-v0--v1-v2

Definition at line 518 of file bmo_subdivide.c.

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

◆ quad_3edge_split()

static void quad_3edge_split ( BMesh bm,
BMFace UNUSEDface,
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 627 of file bmo_subdivide.c.

References blender::bke::attribute_accessor_functions::add(), bm, connect_smallest_face(), params, and verts.

◆ quad_4edge_subdivide()

static void quad_4edge_subdivide ( BMesh bm,
BMFace UNUSEDface,
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 668 of file bmo_subdivide.c.

References Freestyle::a, usdtokens::b(), bm, BMESH_ASSERT, BMO_edge_flag_enable, BMO_face_flag_enable, connect_smallest_face(), e, ELE_INNER, MEM_callocN, MEM_freeN, NULL, params, subdivide_edge_num(), v, v1, 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 UNUSEDface,
BMVert **  verts,
const SubDParams params 
)
static
       v3
      / \
     /   \
    /     \
   /       \
  /         \
 v4--v0--v1--v2
     s    s

Definition at line 751 of file bmo_subdivide.c.

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

◆ tri_3edge_subdivide()

static void tri_3edge_subdivide ( BMesh bm,
BMFace UNUSEDface,
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 782 of file bmo_subdivide.c.

References Freestyle::a, usdtokens::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:
= {
NULL,
NULL,
NULL,
}
static const SubDPattern quad_3edge

Definition at line 882 of file bmo_subdivide.c.

Referenced by bmo_subdivide_edges_exec().

◆ quad_1edge

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

Definition at line 502 of file bmo_subdivide.c.

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 *UNUSED(face), BMVert **verts, const SubDParams *params)

Definition at line 609 of file bmo_subdivide.c.

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 *UNUSED(face), BMVert **verts, const SubDParams *params)

Definition at line 576 of file bmo_subdivide.c.

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 *UNUSED(face), BMVert **verts, const SubDParams *params)

Definition at line 532 of file bmo_subdivide.c.

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 *UNUSED(face), BMVert **verts, const SubDParams *params)

Definition at line 650 of file bmo_subdivide.c.

◆ quad_4edge

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

Definition at line 876 of file bmo_subdivide.c.

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 *UNUSED(face), BMVert **verts, const SubDParams *params)

Definition at line 764 of file bmo_subdivide.c.

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 *UNUSED(face), BMVert **verts, const SubDParams *params)

Definition at line 870 of file bmo_subdivide.c.

Referenced by bmo_subdivide_edges_exec().