44 #include "RNA_prototypes.h"
83 bool UNUSED(useRenderParams))
147 const int mverts_len =
result->totvert;
150 for (
int i = 0; i < mverts_len; i++,
mv++) {
169 #define BM_FACE_TAG BM_ELEM_DRAW
184 bool error_returns_result =
false;
194 error_returns_result =
false;
199 if (operand_collection && operation_intersect && !use_exact) {
201 error_returns_result =
true;
205 if (operand_collection) {
208 error_returns_result =
true;
214 if (operand_ob->type !=
OB_MESH) {
216 ob, md,
"Cannot execute, the selected collection contains non mesh objects");
217 error_returns_result =
true;
224 return error_returns_result;
247 const Mesh *mesh_array[2] = {
mesh, mesh_operand_ob};
252 bmesh_from_mesh_params.calc_vert_normal =
true;
272 Mesh *mesh_operand_ob,
296 const int i_verts_end = mesh_operand_ob->
totvert;
297 const int i_faces_end = mesh_operand_ob->
totpoly;
308 if (++i == i_verts_end) {
343 if (++i == i_faces_end) {
353 bool use_separate =
false;
354 bool use_dissolve =
true;
355 bool use_island_connect =
true;
390 if (material_num == 0) {
395 for (
const int i :
IndexRange(material_num)) {
422 material_remaps.
append({});
437 meshes.
append(mesh_operand);
448 if (!collection_mesh) {
452 meshes.
append(collection_mesh);
454 material_remaps.
append(get_material_remap(*ob, *collection_mesh,
materials));
493 return exact_boolean_mesh(bmd, ctx,
mesh);
502 if (bmd->
object ==
nullptr) {
510 if (mesh_operand_ob) {
536 if (collection ==
nullptr) {
541 if (operand_ob->type ==
OB_MESH && operand_ob != ctx->
object) {
544 if (mesh_operand_ob ==
nullptr) {
593 uiItemR(layout,
ptr,
"operand_type", 0,
nullptr, ICON_NONE);
595 uiItemR(layout,
ptr,
"object", 0,
nullptr, ICON_NONE);
598 uiItemR(layout,
ptr,
"collection", 0,
nullptr, ICON_NONE);
621 uiItemR(
col,
ptr,
"use_hole_tolerant", 0,
nullptr, ICON_NONE);
624 uiItemR(
col,
ptr,
"double_threshold", 0,
nullptr, ICON_NONE);
641 "BooleanModifierData",
643 &RNA_BooleanModifier,
#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, 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)
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_tag_coords_changed(struct Mesh *mesh)
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, int flag)
struct Mesh * BKE_modifier_get_evaluated_mesh_from_evaluated_object(struct Object *ob_eval)
@ eModifierTypeType_Nonconstructive
void BKE_modifier_set_error(const struct Object *ob, struct 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])
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
@ eBooleanModifierFlag_Collection
@ eBooleanModifierFlag_Self
@ eBooleanModifierFlag_HoleTolerant
@ eBooleanModifierFlag_Object
struct BooleanModifierData BooleanModifierData
@ eBooleanModifierOp_Intersect
@ eBooleanModifierOp_Union
@ eBooleanModifierOp_Difference
@ eBooleanModifierBMeshFlag_BMesh_NoDissolve
@ eBooleanModifierBMeshFlag_BMesh_Separate
@ eBooleanModifierBMeshFlag_BMesh_NoConnectRegions
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)
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_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, 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)
#define BMALLOC_TEMPLATE_FROM_ME(...)
void BM_mesh_bm_from_me(BMesh *bm, const Mesh *me, const struct BMeshFromMeshParams *params)
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])
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)
void append(const T &value)
smooth(Type::VEC4, "color_mul") .smooth(Type gpFillTexture gpSceneDepthTexture materials[GPENCIL_MATERIAL_BUFFER_LEN]
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void(* MEM_freeN)(void *vmemh)
Mesh * direct_mesh_boolean(Span< const Mesh * > meshes, Span< const float4x4 * > transforms, const float4x4 &target_transform, Span< Array< short >> material_remaps, bool use_self, bool hole_tolerant, int boolean_mode, Vector< int > *r_intersecting_edges)
SocketIndexByIdentifierMap * map
int RNA_enum_get(PointerRNA *ptr, const char *name)
struct Collection * collection
struct DepsNodeHandle * node