41#include "RNA_prototypes.hh"
120 Mesh *result =
nullptr;
139 mul_m4_m4m4(omat, imat, ob_operand_ob->object_to_world().ptr());
142 for (
const int i : positions.index_range()) {
146 result->tag_positions_changed();
161#define BM_FACE_TAG BM_ELEM_DRAW
176 bool error_returns_result =
false;
186 error_returns_result =
false;
191 if (operand_collection && operation_intersect && !use_exact) {
193 error_returns_result =
true;
197 if (operand_collection) {
200 error_returns_result =
true;
206 if (operand_ob->type !=
OB_MESH) {
208 ob, md,
"Cannot execute, the selected collection contains non mesh objects");
209 error_returns_result =
true;
216 return error_returns_result;
240 const Mesh *mesh_array[2] = {
mesh, mesh_operand_ob};
245 bmesh_from_mesh_params.calc_vert_normal =
true;
265 Mesh *mesh_operand_ob,
287 const int i_verts_end = mesh_operand_ob->
verts_num;
288 const int i_faces_end = mesh_operand_ob->
faces_num;
293 mul_m4_m4m4(omat, imat, operand_ob->object_to_world().ptr());
299 if (++i == i_verts_end) {
337 if (++i == i_faces_end) {
347 bool use_separate =
false;
348 bool use_dissolve =
true;
349 bool use_island_connect =
true;
379 const int n = src_ob->
totcol;
394 const int material_num = mesh.totcol;
396 for (
const int i :
IndexRange(material_num)) {
398 map[i] = material ? materials.index_of_or_add(material) : -1;
422 material_remaps.
append({});
428 if (mesh->totcol == 0) {
430 materials.
add(
nullptr);
433 materials.add_multiple({mesh->mat, mesh->totcol});
443 meshes.
append(mesh_operand);
449 material_remaps.
append(get_material_remap_transfer(*bmd->
object, *mesh_operand, materials));
459 if (!collection_mesh) {
463 meshes.
append(collection_mesh);
464 obmats.
append(ob->object_to_world());
466 material_remaps.
append(get_material_remap_index_based(ctx->
object, ob));
469 material_remaps.
append(get_material_remap_transfer(*ob, *collection_mesh, materials));
487 ctx->
object->object_to_world(),
496 result->totcol = materials.size();
520 return exact_boolean_mesh(bmd, ctx, mesh);
529 if (bmd->
object ==
nullptr) {
537 if (mesh_operand_ob) {
546 if (result ==
nullptr) {
557 if (result ==
nullptr) {
563 if (collection ==
nullptr) {
568 if (operand_ob->type ==
OB_MESH && operand_ob != ctx->
object) {
571 if (mesh_operand_ob ==
nullptr) {
585 if (result == mesh) {
669 "BooleanModifierData",
671 &RNA_BooleanModifier,
#define FOREACH_COLLECTION_OBJECT_RECURSIVE_END
bool BKE_collection_is_empty(const Collection *collection)
#define FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(_collection, _object)
int CustomData_get_offset(const CustomData *data, eCustomDataType type)
ID * BKE_id_copy_ex(Main *bmain, const ID *id, ID **new_id_p, 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 Material * BKE_object_material_get_eval(struct Object *ob, short act)
Mesh * BKE_mesh_new_nomain(int verts_num, int edges_num, int faces_num, int corners_num)
Mesh * BKE_mesh_from_bmesh_for_eval_nomain(BMesh *bm, const CustomData_MeshMasks *cd_mask_extra, const Mesh *me_settings)
void BKE_mesh_wrapper_ensure_mdata(Mesh *mesh)
Mesh * BKE_modifier_get_evaluated_mesh_from_evaluated_object(Object *ob_eval)
void BKE_modifier_copydata_generic(const ModifierData *md, ModifierData *md_dst, int flag)
@ eModifierTypeFlag_SupportsEditmode
@ eModifierTypeFlag_AcceptsMesh
void(*)(void *user_data, Object *ob, ID **idpoin, int cb_flag) IDWalkFunc
void BKE_modifier_set_error(const Object *ob, ModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(3
MINLINE int poly_to_tri_count(int poly_count, 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])
void mul_m4_v3(const float M[4][4], float r[3])
bool is_negative_m4(const float mat[4][4])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
void mul_transposed_m3_v3(const float M[3][3], float r[3])
bool invert_m3(float mat[3][3])
MINLINE float normalize_v3(float n[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_depends_on_transform_relation(DepsNodeHandle *node_handle, const char *description)
void DEG_add_collection_geometry_relation(DepsNodeHandle *node_handle, Collection *collection, const char *description)
void DEG_add_object_relation(DepsNodeHandle *node_handle, Object *object, eDepsObjectComponentType component, const char *description)
#define CD_MASK_MDEFORMVERT
#define DNA_struct_default_get(struct_name)
@ eBooleanModifierSolver_Mesh_Arr
@ eBooleanModifierBMeshFlag_BMesh_NoDissolve
@ eBooleanModifierBMeshFlag_BMesh_Separate
@ eBooleanModifierBMeshFlag_BMesh_NoConnectRegions
BooleanModifierMaterialMode
@ eBooleanModifierMaterialMode_Index
@ eBooleanModifierMaterialMode_Transfer
struct BooleanModifierData BooleanModifierData
@ eBooleanModifierOp_Intersect
@ eBooleanModifierOp_Union
@ eBooleanModifierOp_Difference
@ eBooleanModifierFlag_Collection
@ eBooleanModifierFlag_Self
@ eBooleanModifierFlag_HoleTolerant
@ eBooleanModifierFlag_Object
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
static void init_data(ModifierData *md)
static void solver_options_panel_draw(const bContext *, Panel *panel)
static void panel_register(ARegionType *region_type)
static BMesh * BMD_mesh_bm_create(Mesh *mesh, Object *object, Mesh *mesh_operand_ob, Object *operand_ob, bool *r_is_flip)
static void required_data_mask(ModifierData *, CustomData_MeshMasks *r_cddata_masks)
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 Mesh * modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
static Mesh * get_quick_mesh(Object *ob_self, Mesh *mesh_self, Object *ob_operand_ob, Mesh *mesh_operand_ob, int operation)
static bool BMD_error_messages(const Object *ob, ModifierData *md)
static void panel_draw(const bContext *, Panel *panel)
static void foreach_ID_link(ModifierData *md, Object *ob, IDWalkFunc walk, void *user_data)
static void update_depsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
ModifierTypeInfo modifierType_Boolean
static int bm_face_isect_pair(BMFace *f, void *)
PanelType * modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
void modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * modifier_panel_register(ARegionType *region_type, ModifierType type, PanelDrawFn draw)
PointerRNA * modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
void BM_mesh_copy_init_customdata_from_mesh_array(BMesh *bm_dst, const Mesh *me_src_array[], const int me_src_array_len, const BMAllocTemplate *allocsize)
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_enable(ele, hflag)
bool BM_mesh_intersect(BMesh *bm, const blender::Span< std::array< BMLoop *, 3 > > looptris, 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 BMeshCreateParams *params)
BMesh Make Mesh.
#define BMALLOC_TEMPLATE_FROM_ME(...)
void BM_mesh_bm_from_me(BMesh *bm, const Mesh *mesh, const BMeshFromMeshParams *params)
void BM_mesh_bm_to_me(Main *bmain, BMesh *bm, Mesh *mesh, const BMeshToMeshParams *params)
void BM_mesh_calc_tessellation_beauty(BMesh *bm, MutableSpan< std::array< BMLoop *, 3 > > looptris)
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.
constexpr void copy_from(Span< T > values) const
void append(const T &value)
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
Mesh * mesh_boolean(Span< const Mesh * > meshes, Span< float4x4 > transforms, const float4x4 &target_transform, Span< Array< short > > material_remaps, BooleanOpParameters op_params, Solver solver, Vector< int > *r_intersecting_edges)
void debug_randomize_mesh_order(Mesh *mesh)
int RNA_enum_get(PointerRNA *ptr, const char *name)
struct Collection * collection
bool no_self_intersections
bool no_nested_components