Blender V5.0
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

using subd_pattern_fill_fp

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

#define ELE_INNER   8

◆ 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

A value of 0.00005 means we get face splits at a little under 1.0 degrees, see #32665.

Definition at line 109 of file bmo_subdivide.cc.

Referenced by bmo_subdivide_edges_exec().

◆ PATTERNS_TOT

#define PATTERNS_TOT   ARRAY_SIZE(patterns)

Definition at line 901 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

Initial value:
void (*)(BMesh *bm,
BMFace *face,
BMesh * bm
static float verts[][3]
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]

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

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

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

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 910 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, i, l, BMFace::len, 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, blender::Vector< T, InlineBufferCapacity, Allocator >::size(), BMOperator::slots_in, BMOperator::slots_out, 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, and verts.

◆ connect_smallest_face()

◆ interp_slerp_co_no_v3()

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

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

Definition at line 484 of file bmo_subdivide.cc.

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

◆ quad_2edge_split_fan()

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 604 of file bmo_subdivide.cc.

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

◆ quad_2edge_split_innervert()

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 560 of file bmo_subdivide.cc.

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

◆ quad_2edge_split_path()

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 530 of file bmo_subdivide.cc.

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

◆ quad_3edge_split()

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 639 of file bmo_subdivide.cc.

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

◆ quad_4edge_subdivide()

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 680 of file bmo_subdivide.cc.

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

◆ subdivide_edge_num()

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

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

Definition at line 763 of file bmo_subdivide.cc.

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

◆ tri_3edge_subdivide()

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

Definition at line 791 of file bmo_subdivide.cc.

References b, bm, BMO_edge_flag_enable, BMO_face_flag_enable, connect_smallest_face(), e, ELE_INNER, i, MEM_calloc_arrayN(), 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 892 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 514 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 621 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 588 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 544 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 662 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 886 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 773 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 880 of file bmo_subdivide.cc.

Referenced by bmo_subdivide_edges_exec().