10#include <fmt/format.h>
55#include "RNA_prototypes.hh"
106 for (
int axis = 0; axis < 3; axis++) {
108 vectors[
i][axis] = 0.0f;
118 for (
int axis = 0; axis < 3; axis++) {
123 vectors[
i] = orientation_to_object *
vector;
133 const float mval_fl[2],
134 float area_normal_radius,
135 float start_strength)
147 return !node_fully_masked_or_hidden(node);
200 mul_m4_v3(ob.object_to_world().ptr(), co);
213 float3 viewDir{0.0f, 0.0f, 1.0f};
249 "Smooth the edges of all the Face Sets"},
254 "Smooth the surface of the mesh, preserving the volume"},
260 "Enhance the high frequency surface detail"},
262 "ERASE_DISPLACEMENT",
264 "Erase Displacement",
265 "Deletes the displacement of the Multires Modifier"},
266 {0,
nullptr, 0,
nullptr,
nullptr},
279 {0,
nullptr, 0,
nullptr,
nullptr},
287 "Use the local axis to limit the displacement"},
292 "Use the global axis to limit the displacement"},
297 "Use the view axis to limit the displacement"},
298 {0,
nullptr, 0,
nullptr,
nullptr},
303 return ELEM(filter_type,
325 for (
float &factor : factors) {
326 factor = std::clamp(factor,
min,
max);
332 const float strength,
335 const bool use_original_position)
347 switch (pbvh.
type()) {
358 LocalData &tls = all_tls.
local();
363 tls.factors.resize(
verts.size());
378 tls.neighbor_offsets,
381 tls.new_positions.resize(
verts.size());
384 position_data.
eval,
verts, neighbors, new_positions);
386 tls.translations.resize(
verts.size());
388 if (use_original_position) {
395 if (use_original_position) {
406 const Mesh &base_mesh = *
static_cast<const Mesh *
>(
object.data);
408 const Span<int> corner_verts = base_mesh.corner_verts();
414 LocalData &tls = all_tls.
local();
419 tls.factors.resize(positions.
size());
427 tls.new_positions.resize(positions.
size());
432 tls.translations.resize(positions.
size());
434 if (use_original_position) {
441 if (use_original_position) {
456 LocalData &tls = all_tls.
local();
462 tls.factors.resize(
verts.size());
470 tls.new_positions.resize(
verts.size());
474 tls.translations.resize(
verts.size());
476 if (use_original_position) {
483 if (use_original_position) {
498 const float strength,
509 switch (pbvh.
type()) {
519 LocalData &tls = all_tls.
local();
523 tls.factors.resize(
verts.size());
530 tls.translations.resize(
verts.size());
537 position_data.deform(translations,
verts);
546 LocalData &tls = all_tls.
local();
551 tls.factors.resize(positions.
size());
558 tls.translations.resize(positions.
size());
574 LocalData &tls = all_tls.
local();
581 tls.factors.resize(
verts.size());
588 tls.translations.resize(
verts.size());
604 const float strength,
615 switch (pbvh.
type()) {
623 LocalData &tls = all_tls.
local();
627 tls.factors.resize(
verts.size());
635 tls.translations.resize(
verts.size());
651 LocalData &tls = all_tls.
local();
656 tls.factors.resize(positions.
size());
663 tls.translations.resize(positions.
size());
679 LocalData &tls = all_tls.
local();
685 tls.factors.resize(
verts.size());
692 tls.translations.resize(positions.
size());
718 const float strength,
729 switch (pbvh.
type()) {
737 LocalData &tls = all_tls.
local();
741 tls.factors.resize(
verts.size());
749 tls.translations.resize(
verts.size());
764 LocalData &tls = all_tls.
local();
768 tls.factors.resize(positions.
size());
775 tls.translations.resize(positions.
size());
790 LocalData &tls = all_tls.
local();
794 tls.factors.resize(
verts.size());
801 tls.translations.resize(
verts.size());
820 const uint *hash_co = (
const uint *)&positions[
i];
822 factors[
i] *= (
hash * (1.0f / float(0xFFFFFFFF)) - 0.5f);
828 const float strength,
839 switch (pbvh.
type()) {
847 LocalData &tls = all_tls.
local();
852 tls.factors.resize(
verts.size());
861 tls.translations.resize(
verts.size());
877 LocalData &tls = all_tls.
local();
882 tls.factors.resize(positions.
size());
890 tls.translations.resize(positions.
size());
906 LocalData &tls = all_tls.
local();
913 tls.factors.resize(
verts.size());
921 tls.translations.resize(
verts.size());
937 const float strength,
944 switch (pbvh.
type()) {
960 LocalData &tls = all_tls.
local();
963 tls.factors.resize(
verts.size());
972 tls.translations.resize(
verts.size());
999 const Mesh &base_mesh = *
static_cast<const Mesh *
>(
object.data);
1001 const Span<int> corner_verts = base_mesh.corner_verts();
1010 LocalData &tls = all_tls.
local();
1014 tls.factors.resize(positions.
size());
1022 tls.translations.resize(positions.
size());
1054 LocalData &tls = all_tls.
local();
1058 tls.factors.resize(
verts.size());
1066 tls.translations.resize(
verts.size());
1069 verts, positions, face_set_offset,
false, factors, translations);
1082 const float strength,
1095 switch (pbvh.
type()) {
1112 LocalData &tls = all_tls.
local();
1115 tls.factors.resize(
verts.size());
1125 vert_to_face_map, attribute_data.
face_sets, relax_face_sets,
verts, factors);
1127 tls.translations.resize(
verts.size());
1154 const Mesh &base_mesh = *
static_cast<const Mesh *
>(
object.data);
1156 const Span<int> corner_verts = base_mesh.corner_verts();
1166 LocalData &tls = all_tls.
local();
1170 tls.factors.resize(positions.
size());
1187 tls.translations.resize(positions.
size());
1218 LocalData &tls = all_tls.
local();
1222 tls.factors.resize(
verts.size());
1231 face_set_offset, relax_face_sets,
verts, factors);
1233 tls.translations.resize(
verts.size());
1236 verts, positions, face_set_offset, relax_face_sets, factors, translations);
1249 const float strength,
1267 switch (pbvh.
type()) {
1278 LocalData &tls = all_tls.
local();
1283 tls.factors.resize(
verts.size());
1297 tls.neighbor_offsets,
1300 tls.average_positions.reinitialize(
verts.size());
1303 position_data.
eval,
verts, neighbors, average_positions);
1305 tls.laplacian_disp.reinitialize(
verts.size());
1307 tls.translations.reinitialize(
verts.size());
1324 LocalData &tls = all_tls.
local();
1327 tls.factors.resize(
verts.size());
1337 all_laplacian_disp.
as_span(),
verts, tls.laplacian_disp);
1344 tls.neighbor_offsets,
1347 tls.average_positions.resize(
verts.size());
1350 all_laplacian_disp.
as_span(),
verts, neighbors, average_laplacian_disps);
1352 tls.translations.resize(
verts.size());
1355 laplacian_disp, average_laplacian_disps,
beta, translations);
1369 LocalData &tls = all_tls.
local();
1374 tls.factors.resize(positions.
size());
1382 tls.average_positions.resize(positions.
size());
1385 subdiv_ccg, subdiv_ccg.
positions.as_span(), grids, average_positions);
1387 tls.laplacian_disp.resize(positions.
size());
1389 tls.translations.resize(positions.
size());
1406 LocalData &tls = all_tls.
local();
1410 tls.factors.resize(positions.
size());
1419 subdiv_ccg, all_laplacian_disp.
as_span(), grids, tls.laplacian_disp);
1421 tls.average_positions.resize(positions.
size());
1424 subdiv_ccg, all_laplacian_disp.
as_span(), grids, average_laplacian_disps);
1426 tls.translations.resize(positions.
size());
1429 laplacian_disp, average_laplacian_disps,
beta, translations);
1443 LocalData &tls = all_tls.
local();
1450 tls.factors.resize(
verts.size());
1458 tls.average_positions.resize(
verts.size());
1462 tls.laplacian_disp.resize(
verts.size());
1464 tls.translations.resize(
verts.size());
1467 positions, orig_positions, average_positions, alpha, laplacian_disp, translations);
1477 LocalData &tls = all_tls.
local();
1481 tls.factors.resize(
verts.size());
1490 all_laplacian_disp.
as_span(),
verts, tls.laplacian_disp);
1492 tls.average_positions.resize(
verts.size());
1496 tls.translations.resize(
verts.size());
1499 laplacian_disp, average_laplacian_disps,
beta, translations);
1519 float3 disp_avg = smooth_positions[
i] - positions[
i];
1521 translations[
i] += disp_avg;
1524 float3 detail_strength = detail_directions[
i];
1533 const float strength,
1549 switch (pbvh.
type()) {
1561 LocalData &tls = all_tls.
local();
1565 tls.factors.resize(
verts.size());
1586 tls.neighbor_offsets,
1589 tls.smooth_positions.resize(
verts.size());
1592 position_data.
eval,
verts, neighbors, smooth_positions);
1597 tls.translations.resize(
verts.size());
1599 for (
const int i :
verts.index_range()) {
1600 const int vert =
verts[
i];
1601 const float3 &position = position_data.
eval[vert];
1603 float3 disp_sharpen(0.0f);
1604 for (
const int neighbor : neighbors[
i]) {
1605 float3 disp_n = position_data.
eval[neighbor] - position;
1607 disp_sharpen += disp_n;
1610 disp_sharpen *= (1.0f - sharpen_factors[
i]);
1611 translations[
i] = disp_sharpen;
1639 LocalData &tls = all_tls.
local();
1643 tls.factors.resize(positions.
size());
1658 tls.smooth_positions.resize(positions.
size());
1661 subdiv_ccg, subdiv_ccg.
positions.as_span(), grids, smooth_positions);
1666 tls.translations.resize(positions.
size());
1669 const int node_verts_start =
i * key.
grid_area;
1670 const int grid = grids[
i];
1674 const int node_vert = node_verts_start + offset;
1676 const float3 &position = positions[node_vert];
1678 float3 disp_sharpen(0.0f);
1683 float3 disp_n = vert_positions[neighbor.
to_index(key)] - position;
1685 disp_sharpen += disp_n;
1688 disp_sharpen *= (1.0f - sharpen_factors[node_vert]);
1689 translations[node_vert] = disp_sharpen;
1698 tls.detail_directions);
1720 LocalData &tls = all_tls.
local();
1724 tls.factors.resize(
verts.size());
1739 tls.smooth_positions.resize(
verts.size());
1746 tls.translations.resize(
verts.size());
1753 const float3 position = vert->co;
1755 float3 disp_sharpen(0.0f);
1759 disp_sharpen += disp_n;
1762 disp_sharpen *= (1.0f - sharpen_factors[
i]);
1763 translations[
i] = disp_sharpen;
1789 const float strength,
1793 const float final_strength = -std::abs(strength);
1801 switch (pbvh.
type()) {
1809 LocalData &tls = all_tls.
local();
1812 tls.factors.resize(
verts.size());
1835 LocalData &tls = all_tls.
local();
1839 tls.factors.resize(positions.
size());
1861 LocalData &tls = all_tls.
local();
1865 tls.factors.resize(
verts.size());
1887 const float strength,
1903 LocalData &tls = all_tls.
local();
1907 tls.factors.resize(positions.
size());
1917 tls.translations.resize(positions.
size());
1929 const float shape_preservation,
1930 const float current_vertex_displacement)
1949 for (const int grid : range) {
1950 MutableSpan grid_dst = limit_positions.slice(bke::ccg::grid_range(key, grid));
1951 BKE_subdiv_ccg_eval_limit_positions(subdiv_ccg, key, grid, grid_dst);
1958 const float smooth_ratio,
1959 const float intensify_detail_strength,
1960 const int curvature_smooth_iterations,
1978 for (
int i = 0;
i < totvert;
i++) {
1982 float max_factor = 0.0f;
1983 for (
int i = 0;
i < totvert;
i++) {
1984 max_factor = std::max(sharpen_factors[
i], max_factor);
1988 for (
int i = 0;
i < totvert;
i++) {
1989 sharpen_factors[
i] *= max_factor;
1990 sharpen_factors[
i] = 1.0f -
pow2f(1.0f - sharpen_factors[
i]);
2003 switch (pbvh.
type()) {
2012 LocalData &tls = all_tls.
local();
2018 attribute_data.hide_poly,
2020 tls.neighbor_offsets,
2023 tls.smooth_directions.resize(
verts.size());
2027 tls.smooth_directions.as_mutable_span());
2030 tls.smooth_factors.resize(
verts.size());
2032 sharpen_factors.
as_span(),
verts, neighbors, tls.smooth_factors.as_mutable_span());
2042 LocalData &tls = all_tls.
local();
2046 tls.smooth_directions.resize(grid_verts_num);
2050 tls.smooth_directions.as_mutable_span());
2052 subdiv_ccg, tls.smooth_directions.as_span(), grids, detail_directions);
2054 tls.smooth_factors.resize(grid_verts_num);
2056 subdiv_ccg, sharpen_factors.
as_span(), grids, tls.smooth_factors.as_mutable_span());
2057 scatter_data_grids(subdiv_ccg, tls.smooth_factors.as_span(), grids, sharpen_factors);
2064 LocalData &tls = all_tls.
local();
2068 tls.smooth_directions.resize(
verts.size());
2070 detail_directions.
as_span(),
verts, tls.smooth_directions.as_mutable_span());
2073 tls.smooth_factors.resize(
verts.size());
2075 sharpen_factors.
as_span(),
verts, tls.smooth_factors.as_mutable_span());
2093 {0,
nullptr, 0,
nullptr,
nullptr},
2113 status.
item(
IFACE_(
"Confirm"), ICON_EVENT_RETURN);
2114 status.
item(
IFACE_(
"Cancel"), ICON_EVENT_ESC, ICON_MOUSE_RMB);
2134 switch (filter_type) {
2189 const float len = prev_press_mouse[0] - mouse[0];
2214 start_mouse = mouse;
2277 switch (event->
val) {
2318 float2 mouse(
float(event->
xy[0]),
float(event->
xy[1]));
2327 float2 mval(
float(event->
xy[0]),
float(event->
xy[1]));
2344 switch (filter_type) {
2413 if (deform_axis == 0) {
2418 float2 mval_fl{float(mval[0]), float(mval[1])};
2419 if (use_automasking) {
2427 if (needs_topology_info) {
2480 for (
int i = 0;
i < iterations;
i++) {
2496 ot->srna,
"start_mouse", 2,
nullptr, 0, 1 << 14,
"Starting Mouse",
"", 0, 1 << 14);
2499 "area_normal_radius",
2504 "Radius used for calculating area normal on initial click,\nin percentage "
2509 ot->srna,
"strength", 1.0f, -10.0f, 10.0f,
"Strength",
"Filter strength", -10.0f, 10.0f);
2517 "How many times to repeat the filter",
2533 layout = &layout->
row(
true);
2539 ot->name =
"Filter Mesh";
2540 ot->idname =
"SCULPT_OT_mesh_filter";
2541 ot->description =
"Applies a filter to modify the current mesh";
2563 "Operation that is going to be applied to the mesh");
2570 "Apply the deformation in the selected axis");
2576 "Orientation of the axis to limit the filter displacement");
2580 "surface_smooth_shape_preservation",
2584 "Shape Preservation",
2585 "How much of the original shape is preserved when smoothing",
2589 "surface_smooth_current_vertex",
2593 "Per Vertex Displacement",
2594 "How much the position of each individual vertex influences the final result",
2598 "sharpen_smooth_ratio",
2603 "How much smoothing is applied to polished surfaces",
2608 "sharpen_intensify_detail_strength",
2612 "Intensify Details",
2613 "How much creases and valleys are intensified",
2618 "sharpen_curvature_smooth_iterations",
2622 "Curvature Smooth Iterations",
2623 "How much smooth the resulting shape is, ignoring high frequency details",
int CCG_grid_xy_to_index(const int grid_size, const int x, const int y)
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
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)
int CustomData_get_offset_named(const CustomData *data, eCustomDataType type, blender::StringRef name)
bool BKE_base_is_visible(const View3D *v3d, const Base *base)
#define SCULPT_FACE_SET_NONE
const Brush * BKE_paint_brush_for_read(const Paint *paint)
void BKE_sculpt_update_object_for_edit(Depsgraph *depsgraph, Object *ob_orig, bool is_paint_tool)
A BVH for high poly meshes.
const blender::Set< BMVert *, 0 > & BKE_pbvh_bmesh_node_unique_verts(blender::bke::pbvh::BMeshNode *node)
CCGKey BKE_subdiv_ccg_key_top_level(const SubdivCCG &subdiv_ccg)
void BKE_subdiv_ccg_neighbor_coords_get(const SubdivCCG &subdiv_ccg, const SubdivCCGCoord &coord, bool include_duplicates, SubdivCCGNeighbors &r_neighbors)
#define BLI_assert_unreachable()
BLI_INLINE unsigned int BLI_hash_int_2d(unsigned int kx, unsigned int ky)
MINLINE float pow2f(float x)
void mul_m3_v3(const float M[3][3], float r[3])
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])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE float normalize_v3_v3(float r[3], const float a[3])
MINLINE void add_v3_v3(float r[3], const float a[3])
#define BLT_I18NCONTEXT_AMOUNT
#define BLT_I18NCONTEXT_OPERATOR_DEFAULT
@ BRUSH_AUTOMASKING_CAVITY_ALL
void ED_workspace_status_text(bContext *C, const char *str)
ViewContext ED_view3d_viewcontext_init(bContext *C, Depsgraph *depsgraph)
Read Guarded memory(de)allocation.
#define RNA_BEGIN(sptr, itemptr, propname)
@ OPTYPE_DEPENDS_ON_CURSOR
#define BM_elem_index_get(ele)
BPy_StructRNA * depsgraph
static unsigned long seed
Span< T > as_span() const
void reinitialize(const int64_t new_size)
void item(std::string text, int icon1, int icon2=0)
constexpr int64_t size() const
constexpr Span< T > as_span() const
constexpr IndexRange index_range() const
constexpr void copy_from(Span< T > values) const
constexpr int64_t size() const
constexpr IndexRange index_range() const
GAttributeReader lookup(const StringRef attribute_id) const
void tag_positions_changed(const IndexMask &node_mask)
Span< NodeT > nodes() const
void update_bounds(const Depsgraph &depsgraph, const Object &object)
void foreach_index(Fn &&fn) const
ccl_device_inline float beta(const float x, const float y)
pbvh::Tree * pbvh_get(Object &object)
IndexMask search_nodes(const Tree &pbvh, IndexMaskMemory &memory, FunctionRef< bool(const Node &)> filter_fn)
void update_normals(const Depsgraph &depsgraph, Object &object_orig, Tree &pbvh)
Span< float3 > vert_normals_eval(const Depsgraph &depsgraph, const Object &object_orig)
Cache & filter_cache_ensure(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob)
void calc_vert_factors(const Depsgraph &depsgraph, const Object &object, const Cache &automasking, const bke::pbvh::MeshNode &node, Span< int > verts, MutableSpan< float > factors)
void calc_grids_factors(const Depsgraph &depsgraph, const Object &object, const Cache &automasking, const bke::pbvh::GridsNode &node, Span< int > grids, MutableSpan< float > factors)
bool is_enabled(const Sculpt &sd, const Object &object, const Brush *br)
void ensure_boundary_info(Object &object)
void filter_verts_with_unique_face_sets_mesh(const GroupedSpan< int > vert_to_face_map, const Span< int > face_sets, const bool unique, const Span< int > verts, const MutableSpan< float > factors)
void filter_verts_with_unique_face_sets_bmesh(int face_set_offset, const bool unique, const Set< BMVert *, 0 > &verts, const MutableSpan< float > factors)
void filter_verts_with_unique_face_sets_grids(const OffsetIndices< int > faces, const Span< int > corner_verts, const GroupedSpan< int > vert_to_face_map, const Span< int > face_sets, const SubdivCCG &subdiv_ccg, const bool unique, const Span< int > grids, const MutableSpan< float > factors)
@ FILTER_MESH_MODAL_CANCEL
@ FILTER_MESH_MODAL_CONFIRM
static void calc_inflate_filter(const Depsgraph &depsgraph, const Sculpt &sd, const float strength, Object &object, const IndexMask &node_mask)
static wmOperatorStatus sculpt_mesh_filter_modal(bContext *C, wmOperator *op, const wmEvent *event)
static void sculpt_mesh_update_strength(wmOperator *op, SculptSession &ss, float2 prev_press_mouse, float2 mouse)
static EnumPropertyItem prop_mesh_filter_types[]
void cache_init(bContext *C, Object &ob, const Sculpt &sd, undo::Type undo_type, const float mval_fl[2], float area_normal_radius, float start_strength)
static void sculpt_mesh_filter_apply_with_history(bContext *C, wmOperator *op)
static void calc_sharpen_filter(const Depsgraph &depsgraph, const Sculpt &sd, const float strength, Object &object, const IndexMask &node_mask)
static void calc_random_filter(const Depsgraph &depsgraph, const Sculpt &sd, const float strength, Object &object, const IndexMask &node_mask)
static bool sculpt_mesh_filter_is_continuous(MeshFilterType type)
static BLI_NOINLINE void calc_sharpen_detail_translations(const filter::Cache &filter_cache, const Span< float3 > positions, const Span< float3 > smooth_positions, const Span< float > sharpen_factors, const Span< float3 > detail_directions, const MutableSpan< float3 > translations)
static void sculpt_filter_specific_init(const Depsgraph &depsgraph, const MeshFilterType filter_type, wmOperator *op, Object &object)
static void sculpt_mesh_filter_end(bContext *C)
static void calc_enhance_details_filter(const Depsgraph &depsgraph, const Sculpt &sd, const float strength, Object &object, const IndexMask &node_mask)
static void calc_smooth_filter(const Depsgraph &depsgraph, const Sculpt &sd, const float strength, Object &object, const IndexMask &node_mask, const bool use_original_position)
void zero_disabled_axis_components(const filter::Cache &filter_cache, MutableSpan< float3 > vectors)
static void calc_scale_filter(const Depsgraph &depsgraph, const Sculpt &sd, const float strength, Object &object, const IndexMask &node_mask)
static wmOperatorStatus sculpt_mesh_filter_confirm(SculptSession &ss, wmOperator *op, const MeshFilterType filter_type)
float3x3 to_orientation_space(const filter::Cache &filter_cache)
static void calc_sphere_filter(const Depsgraph &depsgraph, const Sculpt &sd, const float strength, Object &object, const IndexMask &node_mask)
static void mesh_filter_sharpen_init(const Depsgraph &depsgraph, const Object &object, const float smooth_ratio, const float intensify_detail_strength, const int curvature_smooth_iterations, filter::Cache &filter_cache)
static BLI_NOINLINE void calc_sphere_translations(const Span< float3 > positions, const Span< float > factors, const MutableSpan< float3 > translations)
static void calc_relax_filter(const Depsgraph &depsgraph, const Sculpt &sd, const float strength, Object &object, const IndexMask &node_mask)
static wmOperatorStatus sculpt_mesh_filter_exec(bContext *C, wmOperator *op)
static void calc_erase_displacement_filter(const Depsgraph &depsgraph, const Sculpt &sd, const float strength, Object &object, const IndexMask &node_mask)
static BLI_NOINLINE void clamp_factors(const MutableSpan< float > factors, const float min, const float max)
static void sculpt_mesh_ui_exec(bContext *, wmOperator *op)
static void sculpt_mesh_filter_cancel(bContext *C, wmOperator *)
static EnumPropertyItem prop_mesh_filter_orientation_items[]
static wmOperatorStatus sculpt_mesh_filter_start(bContext *C, wmOperator *op)
static void calc_surface_smooth_filter(const Depsgraph &depsgraph, const Sculpt &sd, const float strength, Object &object, const IndexMask &node_mask)
static void mesh_filter_surface_smooth_init(Object &object, const float shape_preservation, const float current_vertex_displacement)
static void calc_limit_surface_positions(const Object &object, MutableSpan< float3 > limit_positions)
float3x3 to_object_space(const filter::Cache &filter_cache)
static void sculpt_mesh_filter_apply(bContext *C, wmOperator *op, bool is_replay=false)
void SCULPT_OT_mesh_filter(wmOperatorType *ot)
static bool sculpt_mesh_filter_needs_pmap(MeshFilterType filter_type)
static EnumPropertyItem prop_mesh_filter_deform_axis_items[]
static BLI_NOINLINE void randomize_factors(const Span< float3 > positions, const int seed, const MutableSpan< float > factors)
wmKeyMap * modal_keymap(wmKeyConfig *keyconf)
static void sculpt_mesh_update_status_bar(bContext *C, wmOperator *)
void register_operator_props(wmOperatorType *ot)
static wmOperatorStatus sculpt_mesh_filter_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void calc_relax_face_sets_filter(const Depsgraph &depsgraph, const Sculpt &sd, const float strength, Object &object, const IndexMask &node_mask)
void average_data_bmesh(const Span< T > src, const Set< BMVert *, 0 > &verts, const MutableSpan< T > dst)
void neighbor_position_average_interior_grids(const OffsetIndices< int > faces, const Span< int > corner_verts, const BitSpan boundary_verts, const SubdivCCG &subdiv_ccg, const Span< int > grids, const MutableSpan< float3 > new_positions)
void neighbor_data_average_mesh_check_loose(const Span< T > src, const Span< int > verts, const GroupedSpan< int > vert_neighbors, const MutableSpan< T > dst)
void neighbor_position_average_interior_bmesh(const Set< BMVert *, 0 > &verts, const Span< float > factors, const MutableSpan< float3 > new_positions)
void surface_smooth_laplacian_step(const Span< float3 > positions, const Span< float3 > orig_positions, const Span< float3 > average_positions, const float alpha, MutableSpan< float3 > laplacian_disp, MutableSpan< float3 > translations)
void surface_smooth_displace_step(const Span< float3 > laplacian_disp, const Span< float3 > average_laplacian_disp, const float beta, const MutableSpan< float3 > translations)
void average_data_grids(const SubdivCCG &subdiv_ccg, const Span< T > src, const Span< int > grids, const MutableSpan< T > dst)
void calc_relaxed_translations_grids(const SubdivCCG &subdiv_ccg, const OffsetIndices< int > faces, const Span< int > corner_verts, const Span< int > face_sets, const GroupedSpan< int > vert_to_face_map, const BitSpan boundary_verts, const Span< int > grids, const bool filter_boundary_face_sets, const Span< float > factors, const MutableSpan< float3 > translations)
void calc_relaxed_translations_bmesh(const Set< BMVert *, 0 > &verts, const Span< float3 > positions, const int face_set_offset, const bool filter_boundary_face_sets, const Span< float > factors, const MutableSpan< float3 > translations)
void calc_relaxed_translations_faces(const Span< float3 > vert_positions, const Span< float3 > vert_normals, const OffsetIndices< int > faces, const Span< int > corner_verts, const GroupedSpan< int > vert_to_face_map, const BitSpan boundary_verts, const Span< int > face_sets, const Span< bool > hide_poly, const bool filter_boundary_face_sets, const Span< int > verts, const Span< float > factors, const MutableSpan< float3 > translations)
void neighbor_position_average_bmesh(const Set< BMVert *, 0 > &verts, const MutableSpan< float3 > new_positions)
void push_end(Object &ob)
void push_nodes(const Depsgraph &depsgraph, Object &object, const IndexMask &node_mask, const Type type)
void restore_position_from_undo_step(const Depsgraph &depsgraph, Object &object)
void push_begin(const Scene &scene, Object &ob, const wmOperator *op)
void push_end_ex(Object &ob, const bool use_nested_undo)
bool stroke_get_location_bvh(bContext *C, float out[3], const float mval[2], const bool force_original)
void fill_factor_from_hide_and_mask(Span< bool > hide_vert, Span< float > mask, Span< int > verts, MutableSpan< float > r_factors)
float object_space_radius_get(const ViewContext &vc, const Scene &scene, const Brush &brush, const float3 &location, const float scale_factor)
MutableSpan< float3 > gather_grids_positions(const SubdivCCG &subdiv_ccg, const Span< int > grids, Vector< float3 > &positions)
void calc_smooth_translations(const Depsgraph &depsgraph, const Object &object, const IndexMask &node_mask, const MutableSpan< float3 > translations)
bool node_in_sphere(const bke::pbvh::Node &node, const float3 &location, const float radius_sq, const bool original)
void scatter_data_bmesh(Span< T > node_data, const Set< BMVert *, 0 > &verts, MutableSpan< T > dst)
void gather_bmesh_positions(const Set< BMVert *, 0 > &verts, MutableSpan< float3 > positions)
void gather_data_grids(const SubdivCCG &subdiv_ccg, Span< T > src, Span< int > grids, MutableSpan< T > node_data)
void vert_random_access_ensure(Object &object)
GroupedSpan< int > calc_vert_neighbors(OffsetIndices< int > faces, Span< int > corner_verts, GroupedSpan< int > vert_to_face, Span< bool > hide_poly, Span< int > verts, Vector< int > &r_offset_data, Vector< int > &r_data)
bool node_fully_masked_or_hidden(const bke::pbvh::Node &node)
Vector< BMVert *, 64 > BMeshNeighborVerts
void gather_data_bmesh(Span< T > src, const Set< BMVert *, 0 > &verts, MutableSpan< T > node_data)
void reset_translations_to_original(MutableSpan< float3 > translations, Span< float3 > positions, Span< float3 > orig_positions)
void orig_position_data_gather_bmesh(const BMLog &bm_log, const Set< BMVert *, 0 > &verts, MutableSpan< float3 > positions, MutableSpan< float3 > normals)
void scale_translations(MutableSpan< float3 > translations, Span< float > factors)
bool report_if_shape_key_is_locked(const Object &ob, ReportList *reports)
void scale_factors(MutableSpan< float > factors, float strength)
void translations_from_new_positions(Span< float3 > new_positions, Span< int > verts, Span< float3 > old_positions, MutableSpan< float3 > translations)
void clip_and_lock_translations(const Sculpt &sd, const SculptSession &ss, Span< float3 > positions, Span< int > verts, MutableSpan< float3 > translations)
bool cursor_geometry_info_update(bContext *C, CursorGeometryInfo *out, const float2 &mval, const bool use_sampled_normal)
void flush_update_done(const bContext *C, Object &ob, const UpdateType update_type)
void scatter_data_mesh(Span< T > src, Span< int > indices, MutableSpan< T > dst)
std::optional< float3 > calc_area_normal(const Depsgraph &depsgraph, const Brush &brush, const Object &ob, const IndexMask &node_mask)
Span< BMVert * > vert_neighbors_get_bmesh(BMVert &vert, BMeshNeighborVerts &r_neighbors)
void apply_translations(Span< float3 > translations, Span< int > verts, MutableSpan< float3 > positions)
OrigPositionData orig_position_data_get_mesh(const Object &object, const bke::pbvh::MeshNode &node)
void gather_data_mesh(Span< T > src, Span< int > indices, MutableSpan< T > dst)
OrigPositionData orig_position_data_get_grids(const Object &object, const bke::pbvh::GridsNode &node)
void flush_update_step(const bContext *C, const UpdateType update_type)
void scatter_data_grids(const SubdivCCG &subdiv_ccg, Span< T > node_data, Span< int > grids, MutableSpan< T > dst)
GroupedSpan< int > calc_vert_neighbors_interior(OffsetIndices< int > faces, Span< int > corner_verts, GroupedSpan< int > vert_to_face, BitSpan boundary_verts, Span< bool > hide_poly, Span< int > verts, Vector< int > &r_offset_data, Vector< int > &r_data)
T length(const VecBase< T, Size > &a)
T midpoint(const T &a, const T &b)
MatBase< T, NumCol, NumRow > normalize(const MatBase< T, NumCol, NumRow > &a)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
VecBase< float, 2 > float2
MatBase< float, 3, 3 > float3x3
VecBase< float, 3 > float3
float paint_calc_object_space_radius(const ViewContext &vc, const blender::float3 ¢er, float pixel_radius)
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)
int RNA_collection_length(PointerRNA *ptr, const char *name)
void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
void RNA_collection_add(PointerRNA *ptr, const char *name, PointerRNA *r_value)
int RNA_int_get(PointerRNA *ptr, const char *name)
float RNA_float_get(PointerRNA *ptr, const char *name)
void RNA_float_set(PointerRNA *ptr, const char *name, float value)
void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_int_array(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_float(StructOrFunctionRNA *cont_, const char *identifier, const float default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
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_collection_runtime(StructOrFunctionRNA *cont_, const char *identifier, StructRNA *type, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_enum_flag(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_translation_context(PropertyRNA *prop, const char *context)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
PropertyRNA * RNA_def_int(StructOrFunctionRNA *cont_, const char *identifier, const int default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
bool SCULPT_mode_poll(bContext *C)
int SCULPT_vertex_count_get(const Object &object)
ObjectRuntimeHandle * runtime
struct SculptSession * sculpt
struct ToolSettings * toolsettings
blender::float3 last_normal
blender::ed::sculpt_paint::filter::Cache * filter_cache
SculptVertexInfo vertex_info
blender::BitVector boundary
int to_index(const CCGKey &key) const
SubdivCCGNeighborCoords coords
blender::Array< blender::float3 > positions
float average_stroke_accum[3]
int average_stroke_counter
const c_style_mat & ptr() const
static MatBase identity()
VArraySpan< bool > hide_poly
VArraySpan< int > face_sets
VArraySpan< bool > hide_vert
FilterOrientation orientation
float start_filter_strength
Array< float3 > detail_directions
Array< float3 > surface_smooth_laplacian_disp
std::unique_ptr< auto_mask::Cache > automasking
float surface_smooth_shape_preservation
Array< float3 > limit_surface_co
IndexMaskMemory node_mask_memory
float sharpen_smooth_ratio
float sharpen_intensify_detail_strength
float surface_smooth_current_vertex
int sharpen_curvature_smooth_iterations
Array< float > sharpen_factor
std::array< bool, 3 > enabled_axis
uiLayout & row(bool align)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)
struct ReportList * reports
void WM_cursor_modal_set(wmWindow *win, int val)
void WM_cursor_modal_restore(wmWindow *win)
float WM_event_tablet_data(const wmEvent *event, bool *r_pen_flip, float r_tilt[2])
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
wmKeyMap * WM_modalkeymap_ensure(wmKeyConfig *keyconf, const char *idname, const EnumPropertyItem *items)
void WM_modalkeymap_assign(wmKeyMap *km, const char *opname)
wmKeyMap * WM_modalkeymap_find(wmKeyConfig *keyconf, const char *idname)