26 const bNode *node =
b.node_or_null();
28 auto &first_geometry =
b.add_input<
decl::Geometry>(
"Mesh 1").only_realized_data().supported_type(
31 if (node !=
nullptr) {
50 auto &output_edges =
b.add_output<
decl::Bool>(
"Intersecting Edges")
56 if (node !=
nullptr) {
65 first_geometry.available(
false);
106 const bool use_self =
params.get_input<
bool>(
"Self Intersection");
107 const bool hole_tolerant =
params.get_input<
bool>(
"Hole Tolerant");
121 meshes.append(mesh_in_a);
123 if (mesh_in_a->totcol == 0) {
125 materials.add(
nullptr);
128 materials.add_multiple({mesh_in_a->mat, mesh_in_a->totcol});
130 material_remaps.
append({});
136 for (
const GeometrySet &geometry : geometry_sets) {
137 if (
const Mesh *mesh = geometry.get_mesh()) {
140 material_remaps.
append(calc_mesh_material_map(*mesh, materials));
144 const Span<int> handles = instances->reference_handles();
145 const Span<float4x4> instance_transforms = instances->transforms();
146 for (
const int i : handles.index_range()) {
148 switch (reference.type()) {
154 transforms.
append(instance_transforms[i]);
155 material_remaps.
append(calc_mesh_material_map(*mesh, materials));
160 if (
const Mesh *mesh = reference.geometry_set().get_mesh()) {
162 transforms.
append(instance_transforms[i]);
163 material_remaps.
append(calc_mesh_material_map(*mesh, materials));
178 "Intersecting Edges");
196 params.set_default_remaining_outputs();
201 result->mat =
static_cast<Material **
>(
203 result->totcol = materials.size();
212 selection.
span.fill(
false);
213 for (
const int i : intersecting_edges) {
214 selection.span[i] =
true;
221 all_geometries.
append(set_a);
222 all_geometries.
extend(geometry_sets);
226 all_geometries, {}, std::make_optional(types_to_join));
230 params.set_output(
"Mesh", std::move(result_geometry));
232 params.error_message_add(NodeWarningType::Error,
233 TIP_(
"Disabled, Blender was compiled without GMP"));
234 params.set_default_remaining_outputs();
245 "Keep the part of the mesh that is common between all operands"},
250 "Combine meshes in an additive way"},
255 "Combine meshes in a subtractive way"},
256 {0,
nullptr, 0,
nullptr,
nullptr},
263 "Exact solver for the best results"},
268 "Simple solver for the best performance, without support for overlapping geometry"},
269 {0,
nullptr, 0,
nullptr,
nullptr},
276 rna_node_geometry_boolean_method_items,
284 rna_geometry_boolean_solver_items,
#define NODE_CLASS_GEOMETRY
Object is a sort of wrapper for general info.
#define NOD_REGISTER_NODE(REGISTER_FUNC)
#define NOD_inline_enum_accessors(member)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
constexpr void copy_from(Span< T > values) const
int64_t index_of_or_add(const Key &key)
void append(const T &value)
void extend(Span< T > array)
void make_available(bNode &node) const
local_group_size(16, 16) .push_constant(Type b
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
GeometrySet object_get_evaluated_geometry_set(const Object &object)
void node_register_type(bNodeType *ntype)
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)
bke::GeometrySet join_geometries(Span< bke::GeometrySet > geometries, const bke::AttributeFilter &attribute_filter, const std::optional< Span< bke::GeometryComponent::Type > > &component_types_to_join=std::nullopt)
static void node_init(bNodeTree *, bNode *node)
static void node_layout(uiLayout *layout, bContext *, PointerRNA *ptr)
static void node_geo_exec(GeoNodeExecParams params)
static void node_register()
static void node_rna(StructRNA *srna)
static void node_declare(NodeDeclarationBuilder &b)
PropertyRNA * RNA_def_node_enum(StructRNA *srna, const char *identifier, const char *ui_name, const char *ui_description, const EnumPropertyItem *static_items, const EnumRNAAccessors accessors, std::optional< int > default_value, const EnumPropertyItemFunc item_func, const bool allow_animation)
void geo_node_type_base(blender::bke::bNodeType *ntype, int type, const char *name, short nclass)
static MatBase identity()
const Mesh * get_mesh() const
void replace_mesh(Mesh *mesh, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
MutableVArraySpan< T > span
void(* initfunc)(bNodeTree *ntree, bNode *node)
NodeGeometryExecFunction geometry_node_execute
void(* draw_buttons)(uiLayout *, bContext *C, PointerRNA *ptr)
NodeDeclareFunction declare
bool no_self_intersections
bool no_nested_components
std::optional< std::string > intersecting_edges_id