61 "Use a difference boolean operation"},
67 "Join the new mesh as separate geometry, without performing any boolean operation"},
68 {0,
nullptr, 0,
nullptr,
nullptr},
80 "Use the view to orientate the trimming shape"},
85 "Use the surface normal to orientate the trimming shape"},
86 {0,
nullptr, 0,
nullptr,
nullptr},
99 "Align trim geometry with the perspective of the current view for a tapered shape"},
104 "Align trim geometry orthogonally for a shape with 90 degree angles"},
105 {0,
nullptr, 0,
nullptr,
nullptr},
113 "Slower solver with the best results for coplanar faces"},
118 "Simple solver with good performance, without support for overlapping geometry"},
123 "Fastest solver that works only on manifold meshes but gives better results"},
124 {0,
nullptr, 0,
nullptr,
nullptr},
152 Mesh *trim_mesh = trim_operation->
mesh;
168 "recalc_face_normals faces=%hf",
195 gesture_data.
vc.
obact->object_to_world().ptr(),
202 gesture_data.
vc.
obact->object_to_world().ptr(),
214 float &r_depth_front,
222 float shape_plane[4];
223 float shape_origin[3];
224 float shape_normal[3];
232 const float4x4 &object_to_world = vc.
obact->object_to_world();
240 depth_front = std::min(dist, depth_front);
241 depth_back = std::max(dist, depth_back);
245 float world_space_gesture_initial_location[3];
247 object_to_world.
ptr(),
250 float mid_point_depth;
255 (depth_back + depth_front) * 0.5f;
261 mid_point_depth = trim_operation->
initial_hit ? 0.0f : (depth_back + depth_front) * 0.5f;
282 depth_front = mid_point_depth - depth_radius;
283 depth_back = mid_point_depth + depth_radius;
286 r_depth_front = depth_front;
287 r_depth_back = depth_back;
324 end = end + dir * expand_factor;
325 start = start - dir * expand_factor;
328 float2 perp(dir.y, -dir.x);
334 const float2 parallel_start = start + perp * expand_factor;
335 const float2 parallel_end = end + perp * expand_factor;
337 return {start, end, parallel_end, parallel_start};
349 const int trim_totverts = screen_points.
size() * 2;
350 const int trim_faces_nums = (2 * (screen_points.
size() - 2)) + (2 * screen_points.
size());
352 trim_totverts, 0, trim_faces_nums, trim_faces_nums * 3);
355 float shape_origin[3];
356 float shape_normal[3];
357 float shape_plane[4];
361 const float (*ob_imat)[4] = vc.
obact->world_to_object().ptr();
371 float pad_factor = (depth_back - depth_front) * 0.01f + 0.001f;
376 depth_front -= pad_factor;
377 depth_back += pad_factor;
380 float depth_point[3];
390 madd_v3_v3v3fl(depth_point, shape_origin, shape_normal, depth_front);
412 madd_v3_v3v3fl(depth_point, shape_origin, shape_normal, depth_back);
429 madd_v3_v3fl(new_point, shape_normal, depth_back - dist);
436 for (
int i = 0;
i < screen_points.
size() * 2;
i++) {
448 screen_points.
size(),
450 reinterpret_cast<uint(*)[3]
>(tris.
data()));
458 face_offsets[face_index] = corner;
459 corner_verts[corner + 0] = tris[
i][0];
460 corner_verts[corner + 1] = tris[
i][1];
461 corner_verts[corner + 2] = tris[
i][2];
468 face_offsets[face_index] = corner;
469 corner_verts[corner + 0] = tris[
i][0] + screen_points.
size();
470 corner_verts[corner + 1] = tris[
i][1] + screen_points.
size();
471 corner_verts[corner + 2] = tris[
i][2] + screen_points.
size();
478 face_offsets[face_index] = corner;
479 int current_index =
i;
480 int next_index = current_index + 1;
481 if (next_index >= screen_points.
size()) {
484 corner_verts[corner + 0] = next_index + screen_points.
size();
485 corner_verts[corner + 1] = next_index;
486 corner_verts[corner + 2] = current_index;
492 face_offsets[face_index] = corner;
493 int current_index =
i;
494 int next_index = current_index + 1;
495 if (next_index >= screen_points.
size()) {
498 corner_verts[corner + 0] = current_index;
499 corner_verts[corner + 1] = current_index + screen_points.
size();
500 corner_verts[corner + 2] = next_index + screen_points.
size();
517 switch (pbvh.
type()) {
544 Mesh &sculpt_mesh = *
static_cast<Mesh *
>(
object->data);
545 Mesh &trim_mesh = *trim_operation->
mesh;
548 switch (trim_operation->
mode) {
582 trim_operation->
reports,
RPT_ERROR,
"Boolean result is too big for solver to handle");
587 trim_operation->
reports,
RPT_ERROR,
"Boolean solver not available (compiled without it)");
601 Mesh *trim_mesh = trim_operation->
mesh;
685 "Use Cursor for Depth",
686 "Use cursor location and radius for the dimensions and position of the trimming shape");
742 if (
static_cast<const Mesh *
>(
object.
data)->faces_num == 0) {
762 const float mval_fl[2] = {
float(mval[0]),
float(mval[1])};
898 ot->name =
"Trim Lasso Gesture";
899 ot->idname =
"SCULPT_OT_trim_lasso_gesture";
900 ot->description =
"Execute a boolean operation on the mesh and a shape defined by the cursor";
919 ot->name =
"Trim Box Gesture";
920 ot->idname =
"SCULPT_OT_trim_box_gesture";
922 "Execute a boolean operation on the mesh and a rectangle defined by the cursor";
941 ot->name =
"Trim Line Gesture";
942 ot->idname =
"SCULPT_OT_trim_line_gesture";
943 ot->description =
"Remove a portion of the mesh on one side of a line";
962 ot->name =
"Trim Polyline Gesture";
963 ot->idname =
"SCULPT_OT_trim_polyline_gesture";
965 "Execute a boolean operation on the mesh and a polygonal shape defined by the cursor";
Object * CTX_data_active_object(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Base * CTX_data_active_base(const bContext *C)
ToolSettings * CTX_data_tool_settings(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
bool BKE_base_is_visible(const View3D *v3d, const Base *base)
void BKE_id_free(Main *bmain, void *idv)
void BKE_mesh_batch_cache_dirty_tag(Mesh *mesh, eMeshBatchDirtyMode mode)
Mesh * BKE_mesh_from_bmesh_nomain(BMesh *bm, const BMeshToMeshParams *params, const Mesh *me_settings)
Mesh * BKE_mesh_new_nomain(int verts_num, int edges_num, int faces_num, int corners_num)
void BKE_mesh_nomain_to_mesh(Mesh *mesh_src, Mesh *mesh_dst, Object *ob, bool process_shape_keys=true)
@ BKE_MESH_BATCH_DIRTY_ALL
General operations, lookup, etc. for blender objects.
std::optional< blender::Bounds< blender::float3 > > BKE_object_boundbox_get(const Object *ob)
void BKE_sculptsession_free_pbvh(Object &object)
Brush * BKE_paint_brush(Paint *paint)
void BKE_report(ReportList *reports, eReportType type, const char *message)
#define BLI_assert_unreachable()
void plane_from_point_normal_v3(float r_plane[4], const float plane_co[3], const float plane_no[3])
float dist_signed_to_plane_v3(const float p[3], const float plane[4])
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
void mul_mat3_m4_v3(const float mat[4][4], float r[3])
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void negate_v3(float r[3])
MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
void BLI_polyfill_calc(const float(*coords)[2], unsigned int coords_num, int coords_sign, unsigned int(*r_tris)[3])
void DEG_id_tag_update(ID *id, unsigned int flags)
void ED_view3d_win_to_3d(const View3D *v3d, const ARegion *region, const float depth_pt[3], const float mval[2], float r_out[3])
bool ED_view3d_win_to_3d_on_plane(const ARegion *region, const float plane[4], const float mval[2], bool do_clip, float r_out[3])
static void View(GHOST_IWindow *window, bool stereo, int eye=0)
@ OPTYPE_DEPENDS_ON_CURSOR
BMesh const char void * data
void BM_mesh_elem_hflag_enable_all(BMesh *bm, const char htype, const char hflag, const bool respecthide)
void BM_mesh_elem_hflag_disable_all(BMesh *bm, const char htype, const char hflag, const bool respecthide)
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)
bool BMO_op_callf(BMesh *bm, int flag, const char *fmt,...)
#define BMO_FLAG_DEFAULTS
DBVT_INLINE bool Intersect(const btDbvtAabbMm &a, const btDbvtAabbMm &b)
IndexRange index_range() const
constexpr IndexRange index_range() const
void * MEM_callocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
static void error(const char *str)
int face_triangles_num(const int face_size)
pbvh::Tree * pbvh_get(Object &object)
Span< float3 > vert_positions_eval(const Depsgraph &depsgraph, const Object &object_orig)
void mesh_smooth_set(Mesh &mesh, bool use_smooth, bool keep_sharp_edges=false)
void mesh_calc_edges(Mesh &mesh, bool keep_existing_edges, bool select_new_edges)
int find_next_available_id(Object &object)
bool create_face_sets_mesh(Object &object)
void initialize_none_to_id(Mesh *mesh, int new_id)
std::unique_ptr< GestureData > init_from_box(bContext *C, wmOperator *op)
void operator_properties(wmOperatorType *ot, ShapeType shapeType)
std::unique_ptr< GestureData > init_from_polyline(bContext *C, wmOperator *op)
std::unique_ptr< GestureData > init_from_line(bContext *C, const wmOperator *op)
void apply(bContext &C, GestureData &gesture_data, wmOperator &op)
std::unique_ptr< GestureData > init_from_lasso(bContext *C, wmOperator *op)
void invalidate(SculptSession &ss)
void SCULPT_OT_trim_lasso_gesture(wmOperatorType *ot)
static void init_operation(gesture::GestureData &gesture_data, wmOperator &op)
static void operator_properties(wmOperatorType *ot)
static void generate_geometry(gesture::GestureData &gesture_data)
static void initialize_cursor_info(bContext &C, const wmOperator &op, gesture::GestureData &gesture_data)
static EnumPropertyItem extrude_modes[]
static void get_origin_and_normal(gesture::GestureData &gesture_data, float *r_origin, float *r_normal)
static void apply_join_operation(Object &object, Mesh &sculpt_mesh, Mesh &trim_mesh)
static void gesture_end(bContext &, gesture::GestureData &gesture_data)
static void gesture_begin(bContext &C, wmOperator &op, gesture::GestureData &gesture_data)
static void apply_trim(gesture::GestureData &gesture_data)
static wmOperatorStatus gesture_line_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static bool can_exec(const bContext &C, ReportList &reports)
void SCULPT_OT_trim_box_gesture(wmOperatorType *ot)
static float calc_expand_factor(const gesture::GestureData &gesture_data)
static void report_invalid_mode(const blender::bke::pbvh::Type pbvh_type, ReportList &reports)
static void gesture_apply_for_symmetry_pass(bContext &, gesture::GestureData &gesture_data)
static bool can_invoke(const bContext &C)
static void calculate_depth(gesture::GestureData &gesture_data, float &r_depth_front, float &r_depth_back)
static void free_geometry(gesture::GestureData &gesture_data)
static EnumPropertyItem operation_types[]
static wmOperatorStatus gesture_box_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus gesture_polyline_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void SCULPT_OT_trim_line_gesture(wmOperatorType *ot)
static wmOperatorStatus gesture_lasso_exec(bContext *C, wmOperator *op)
static wmOperatorStatus gesture_line_exec(bContext *C, wmOperator *op)
static wmOperatorStatus gesture_lasso_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static wmOperatorStatus gesture_box_exec(bContext *C, wmOperator *op)
static const EnumPropertyItem solver_items[]
static EnumPropertyItem orientation_types[]
static wmOperatorStatus gesture_polyline_exec(bContext *C, wmOperator *op)
void SCULPT_OT_trim_polyline_gesture(wmOperatorType *ot)
static void update_normals(gesture::GestureData &gesture_data)
static Array< float2 > gesture_to_screen_points(gesture::GestureData &gesture_data)
void geometry_begin(const Scene &scene, Object &ob, const wmOperator *op)
void geometry_end(Object &ob)
void vert_random_access_ensure(Object &object)
float3 symmetry_flip(const float3 &src, const ePaintSymmetryFlags symm)
bool cursor_geometry_info_update(bContext *C, CursorGeometryInfo *out, const float2 &mval, const bool use_sampled_normal)
float object_space_radius_get(const ViewContext &vc, const Paint &paint, const Brush &brush, const float3 &location, const float scale_factor)
Mesh * mesh_boolean(Span< const Mesh * > meshes, Span< float4x4 > transforms, Span< Array< short > > material_remaps, BooleanOpParameters op_params, Solver solver, Vector< int > *r_intersecting_edges, BooleanError *r_error)
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, bool allow_merging_instance_references=true)
T distance(const T &a, const T &b)
MatBase< T, NumCol, NumRow > normalize(const MatBase< T, NumCol, NumRow > &a)
VecBase< T, 3 > transform_point(const CartesianBasis &basis, const VecBase< T, 3 > &v)
MatBase< float, 4, 4 > float4x4
VecBase< float, 2 > float2
VecBase< float, 3 > float3
bool paint_convert_bb_to_rect(rcti *rect, const float bb_min[3], const float bb_max[3], const ARegion ®ion, const RegionView3D &rv3d, const Object &ob)
void RNA_int_set_array(PointerRNA *ptr, const char *name, const int *values)
void RNA_int_get_array(PointerRNA *ptr, const char *name, int *values)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_int_vector(StructOrFunctionRNA *cont_, const char *identifier, const int len, const int *default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
bool SCULPT_mode_poll_view3d(bContext *C)
const c_style_mat & ptr() const
static MatBase identity()
GeometryComponent & get_component_for_write(GeometryComponent::Type component_type)
static GeometrySet from_mesh(Mesh *mesh, GeometryOwnershipType ownership=GeometryOwnershipType::Owned)
ePaintSymmetryFlags symmpass
Array< float2 > gesture_points
float3 world_space_view_normal
void(* end)(bContext &, GestureData &)
void(* begin)(bContext &, wmOperator &, GestureData &)
void(* apply_for_symmetry_pass)(bContext &, GestureData &)
blender::float3 initial_location
OrientationType orientation
blender::float3 initial_normal
geometry::boolean::Solver solver_mode
bool no_self_intersections
bool no_nested_components
struct ReportList * reports
wmOperatorStatus WM_gesture_polyline_modal(bContext *C, wmOperator *op, const wmEvent *event)
wmOperatorStatus WM_gesture_lasso_modal(bContext *C, wmOperator *op, const wmEvent *event)
wmOperatorStatus WM_gesture_box_modal(bContext *C, wmOperator *op, const wmEvent *event)
wmOperatorStatus WM_gesture_box_invoke(bContext *C, wmOperator *op, const wmEvent *event)
wmOperatorStatus WM_gesture_straightline_active_side_invoke(bContext *C, wmOperator *op, const wmEvent *event)
wmOperatorStatus WM_gesture_polyline_invoke(bContext *C, wmOperator *op, const wmEvent *event)
wmOperatorStatus WM_gesture_lasso_invoke(bContext *C, wmOperator *op, const wmEvent *event)
wmOperatorStatus WM_gesture_straightline_oneshot_modal(bContext *C, wmOperator *op, const wmEvent *event)
void WM_operator_properties_gesture_straightline(wmOperatorType *ot, int cursor)
void WM_operator_properties_border(wmOperatorType *ot)
void WM_operator_properties_gesture_lasso(wmOperatorType *ot)
void WM_operator_properties_gesture_polyline(wmOperatorType *ot)