93 bool UNUSED(useRenderParams))
157 const int mverts_len =
result->totvert;
160 for (
int i = 0; i < mverts_len; i++,
mv++) {
179 #define BM_FACE_TAG BM_ELEM_DRAW
194 bool error_returns_result =
false;
204 error_returns_result =
false;
209 if (operand_collection && operation_intersect && !use_exact) {
211 error_returns_result =
true;
215 if (operand_collection) {
218 error_returns_result =
true;
224 if (operand_ob->type !=
OB_MESH) {
226 ob, md,
"Cannot execute, the selected collection contains non mesh objects");
227 error_returns_result =
true;
234 return error_returns_result;
280 Mesh *mesh_operand_ob,
305 const int i_verts_end = mesh_operand_ob->
totvert;
306 const int i_faces_end = mesh_operand_ob->
totpoly;
317 if (++i == i_verts_end) {
352 if (++i == i_faces_end) {
362 bool use_separate =
false;
363 bool use_dissolve =
true;
364 bool use_island_connect =
true;
385 bmd->double_threshold);
425 material_remaps.
append({});
432 meshes.
append(mesh_operand);
443 if (!collection_mesh) {
447 meshes.
append(collection_mesh);
449 material_remaps.
append(get_material_remap(ctx->
object, ob));
482 return exact_boolean_mesh(bmd, ctx,
mesh);
491 if (bmd->
object ==
nullptr) {
500 if (mesh_operand_ob) {
527 if (collection ==
nullptr) {
532 if (operand_ob->type ==
OB_MESH && operand_ob != ctx->
object) {
536 if (mesh_operand_ob) {
548 params.calc_object_remap =
false;
581 uiItemR(layout,
ptr,
"operand_type", 0,
nullptr, ICON_NONE);
583 uiItemR(layout,
ptr,
"object", 0,
nullptr, ICON_NONE);
586 uiItemR(layout,
ptr,
"collection", 0,
nullptr, ICON_NONE);
609 uiItemR(
col,
ptr,
"use_hole_tolerant", 0,
nullptr, ICON_NONE);
612 uiItemR(
col,
ptr,
"double_threshold", 0,
nullptr, ICON_NONE);
629 "BooleanModifierData",
#define FOREACH_COLLECTION_OBJECT_RECURSIVE_END
#define FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(_collection, _object)
bool BKE_collection_is_empty(const struct Collection *collection)
int CustomData_get_offset(const struct CustomData *data, int type)
struct ID * BKE_id_copy_ex(struct Main *bmain, const struct ID *id, struct ID **r_newid, const int flag)
General operations, lookup, etc. for materials.
void BKE_object_material_remap_calc(struct Object *ob_dst, struct Object *ob_src, short *remap_src_to_dst)
struct Mesh * BKE_mesh_new_nomain(int verts_len, int edges_len, int tessface_len, int loops_len, int polys_len)
struct Mesh * BKE_mesh_from_bmesh_for_eval_nomain(struct BMesh *bm, const struct CustomData_MeshMasks *cd_mask_extra, const struct Mesh *me_settings)
void BKE_mesh_wrapper_ensure_mdata(struct Mesh *me)
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void BKE_modifier_copydata_generic(const struct ModifierData *md, struct ModifierData *md_dst, const int flag)
@ eModifierTypeType_Nonconstructive
void BKE_modifier_set_error(const struct Object *ob, struct ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
struct Mesh * BKE_modifier_get_evaluated_mesh_from_evaluated_object(struct Object *ob_eval, const bool get_cage_mesh)
MINLINE int poly_to_tri_count(const int poly_count, const int corner_count)
void negate_m3(float R[3][3])
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void copy_m3_m4(float m1[3][3], const float m2[4][4])
bool invert_m4_m4(float R[4][4], const float A[4][4])
void mul_m4_v3(const float M[4][4], float r[3])
bool is_negative_m4(const float mat[4][4])
bool invert_m3(float R[3][3])
void mul_transposed_m3_v3(const float M[3][3], float r[3])
MINLINE float normalize_v3(float r[3])
#define SCOPED_TIMER(name)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
void DEG_add_object_relation(struct DepsNodeHandle *node_handle, struct Object *object, eDepsObjectComponentType component, const char *description)
void DEG_add_modifier_to_transform_relation(struct DepsNodeHandle *node_handle, const char *description)
void DEG_add_collection_geometry_relation(struct DepsNodeHandle *node_handle, struct Collection *collection, const char *description)
Object groups, one object can be in many groups at once.
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
@ eBooleanModifierSolver_Exact
@ eBooleanModifierBMeshFlag_BMesh_NoDissolve
@ eBooleanModifierBMeshFlag_BMesh_Separate
@ eBooleanModifierBMeshFlag_BMesh_NoConnectRegions
@ eBooleanModifierFlag_Collection
@ eBooleanModifierFlag_Self
@ eBooleanModifierFlag_HoleTolerant
@ eBooleanModifierFlag_Object
struct BooleanModifierData BooleanModifierData
@ eBooleanModifierOp_Intersect
@ eBooleanModifierOp_Union
@ eBooleanModifierOp_Difference
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
static Mesh * modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
static bool isDisabled(const struct Scene *UNUSED(scene), ModifierData *md, bool UNUSED(useRenderParams))
static void BMD_mesh_intersection(BMesh *bm, ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh_operand_ob, Object *object, Object *operand_ob, bool is_flip)
static void requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md), CustomData_MeshMasks *r_cddata_masks)
static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
static bool BMD_error_messages(const Object *ob, ModifierData *md)
static BMesh * BMD_mesh_bm_create(Mesh *mesh, Object *object, Mesh *mesh_operand_ob, Object *operand_ob, bool *r_is_flip)
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
static Mesh * get_quick_mesh(Object *ob_self, Mesh *mesh_self, Object *ob_operand_ob, Mesh *mesh_operand_ob, int operation)
static void initData(ModifierData *md)
static void panelRegister(ARegionType *region_type)
static void solver_options_panel_draw(const bContext *UNUSED(C), Panel *panel)
ModifierTypeInfo modifierType_Boolean
static int bm_face_isect_pair(BMFace *f, void *UNUSED(user_data))
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PanelType * modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
StructRNA RNA_BooleanModifier
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
void BM_mesh_copy_init_customdata_from_mesh(BMesh *bm_dst, const Mesh *me_src, const BMAllocTemplate *allocsize)
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_enable(ele, hflag)
bool BM_mesh_intersect(BMesh *bm, struct BMLoop *(*looptris)[3], const int looptris_tot, int(*test_fn)(BMFace *f, void *user_data), void *user_data, const bool use_self, const bool use_separate, const bool use_dissolve, const bool use_island_connect, const bool use_partial_connect, const bool use_edge_tag, const int boolean_mode, const float eps)
#define BM_ITER_MESH(ele, iter, bm, itype)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_mesh_free(BMesh *bm)
BMesh Free Mesh.
BMesh * BM_mesh_create(const BMAllocTemplate *allocsize, const struct BMeshCreateParams *params)
BMesh Make Mesh.
#define BMALLOC_TEMPLATE_FROM_ME(...)
char BM_mesh_cd_flag_from_bmesh(BMesh *bm)
void BM_mesh_bm_from_me(BMesh *bm, const Mesh *me, const struct BMeshFromMeshParams *params)
Mesh -> BMesh.
void BM_mesh_cd_flag_apply(BMesh *bm, const char cd_flag)
void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *me, const struct BMeshToMeshParams *params)
void BM_mesh_calc_tessellation_beauty(BMesh *bm, BMLoop *(*looptris)[3], int *r_looptris_tot)
void BM_face_normal_flip_ex(BMesh *bm, BMFace *f, const int cd_loop_mdisp_offset, const bool use_loop_mdisp_flip)
Face Flip Normal.
void append(const T &value)
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void(* MEM_freeN)(void *vmemh)
Mesh * direct_mesh_boolean(blender::Span< const Mesh * > meshes, blender::Span< const float4x4 * > obmats, const float4x4 &target_transform, blender::Span< blender::Array< short >> material_remaps, const bool use_self, const bool hole_tolerant, const int boolean_mode)
int RNA_enum_get(PointerRNA *ptr, const char *name)
struct Collection * collection
struct DepsNodeHandle * node