10#include <fmt/format.h>
56#include "RNA_prototypes.hh"
107 for (
int axis = 0; axis < 3; axis++) {
109 vectors[
i][axis] = 0.0f;
119 for (
int axis = 0; axis < 3; axis++) {
124 vectors[
i] = orientation_to_object *
vector;
134 const float mval_fl[2],
135 float area_normal_radius,
136 float start_strength)
148 return !node_fully_masked_or_hidden(node);
180 vc, co,
float(ups->
size / 2.0f) * area_normal_radius);
202 mul_m4_v3(ob.object_to_world().ptr(), co);
215 float3 viewDir{0.0f, 0.0f, 1.0f};
251 "Smooth the edges of all the Face Sets"},
256 "Smooth the surface of the mesh, preserving the volume"},
262 "Enhance the high frequency surface detail"},
264 "ERASE_DISPLACEMENT",
266 "Erase Displacement",
267 "Deletes the displacement of the Multires Modifier"},
268 {0,
nullptr, 0,
nullptr,
nullptr},
281 {0,
nullptr, 0,
nullptr,
nullptr},
289 "Use the local axis to limit the displacement"},
294 "Use the global axis to limit the displacement"},
299 "Use the view axis to limit the displacement"},
300 {0,
nullptr, 0,
nullptr,
nullptr},
305 return ELEM(filter_type,
327 for (
float &factor : factors) {
328 factor = std::clamp(factor,
min,
max);
334 const float strength,
337 const bool use_original_position)
349 switch (pbvh.
type()) {
360 LocalData &tls = all_tls.
local();
365 tls.factors.resize(
verts.size());
380 tls.neighbor_offsets,
383 tls.new_positions.resize(
verts.size());
386 position_data.eval,
verts, neighbors, new_positions);
388 tls.translations.resize(
verts.size());
390 if (use_original_position) {
397 if (use_original_position) {
403 position_data.deform(translations,
verts);
408 const Mesh &base_mesh = *
static_cast<const Mesh *
>(
object.data);
410 const Span<int> corner_verts = base_mesh.corner_verts();
416 LocalData &tls = all_tls.
local();
421 tls.factors.resize(positions.
size());
429 tls.new_positions.resize(positions.
size());
434 tls.translations.resize(positions.
size());
436 if (use_original_position) {
443 if (use_original_position) {
458 LocalData &tls = all_tls.
local();
464 tls.factors.resize(
verts.size());
472 tls.new_positions.resize(
verts.size());
476 tls.translations.resize(
verts.size());
478 if (use_original_position) {
485 if (use_original_position) {
500 const float strength,
511 switch (pbvh.
type()) {
521 LocalData &tls = all_tls.
local();
525 tls.factors.resize(
verts.size());
532 tls.translations.resize(
verts.size());
539 position_data.deform(translations,
verts);
548 LocalData &tls = all_tls.
local();
553 tls.factors.resize(positions.
size());
560 tls.translations.resize(positions.
size());
576 LocalData &tls = all_tls.
local();
583 tls.factors.resize(
verts.size());
590 tls.translations.resize(
verts.size());
606 const float strength,
617 switch (pbvh.
type()) {
625 LocalData &tls = all_tls.
local();
629 tls.factors.resize(
verts.size());
637 tls.translations.resize(
verts.size());
644 position_data.deform(translations,
verts);
653 LocalData &tls = all_tls.
local();
658 tls.factors.resize(positions.
size());
665 tls.translations.resize(positions.
size());
681 LocalData &tls = all_tls.
local();
687 tls.factors.resize(
verts.size());
694 tls.translations.resize(positions.
size());
720 const float strength,
731 switch (pbvh.
type()) {
739 LocalData &tls = all_tls.
local();
743 tls.factors.resize(
verts.size());
751 tls.translations.resize(
verts.size());
757 position_data.deform(translations,
verts);
766 LocalData &tls = all_tls.
local();
770 tls.factors.resize(positions.
size());
777 tls.translations.resize(positions.
size());
792 LocalData &tls = all_tls.
local();
796 tls.factors.resize(
verts.size());
803 tls.translations.resize(
verts.size());
822 const uint *hash_co = (
const uint *)&positions[
i];
824 factors[
i] *= (
hash * (1.0f /
float(0xFFFFFFFF)) - 0.5f);
830 const float strength,
841 switch (pbvh.
type()) {
849 LocalData &tls = all_tls.
local();
854 tls.factors.resize(
verts.size());
863 tls.translations.resize(
verts.size());
870 position_data.deform(translations,
verts);
879 LocalData &tls = all_tls.
local();
884 tls.factors.resize(positions.
size());
892 tls.translations.resize(positions.
size());
908 LocalData &tls = all_tls.
local();
915 tls.factors.resize(
verts.size());
923 tls.translations.resize(
verts.size());
939 const float strength,
946 switch (pbvh.
type()) {
962 LocalData &tls = all_tls.
local();
965 tls.factors.resize(
verts.size());
974 tls.translations.resize(
verts.size());
991 position_data.deform(translations,
verts);
1001 const Mesh &base_mesh = *
static_cast<const Mesh *
>(
object.data);
1003 const Span<int> corner_verts = base_mesh.corner_verts();
1012 LocalData &tls = all_tls.
local();
1016 tls.factors.resize(positions.
size());
1024 tls.translations.resize(positions.
size());
1056 LocalData &tls = all_tls.
local();
1060 tls.factors.resize(
verts.size());
1068 tls.translations.resize(
verts.size());
1071 verts, positions, face_set_offset,
false, factors, translations);
1084 const float strength,
1097 switch (pbvh.
type()) {
1114 LocalData &tls = all_tls.
local();
1117 tls.factors.resize(
verts.size());
1127 vert_to_face_map, attribute_data.
face_sets, relax_face_sets,
verts, factors);
1129 tls.translations.resize(
verts.size());
1146 position_data.deform(translations,
verts);
1156 const Mesh &base_mesh = *
static_cast<const Mesh *
>(
object.data);
1158 const Span<int> corner_verts = base_mesh.corner_verts();
1168 LocalData &tls = all_tls.
local();
1172 tls.factors.resize(positions.
size());
1189 tls.translations.resize(positions.
size());
1220 LocalData &tls = all_tls.
local();
1224 tls.factors.resize(
verts.size());
1233 face_set_offset, relax_face_sets,
verts, factors);
1235 tls.translations.resize(
verts.size());
1238 verts, positions, face_set_offset, relax_face_sets, factors, translations);
1251 const float strength,
1269 switch (pbvh.
type()) {
1280 LocalData &tls = all_tls.
local();
1285 tls.factors.resize(
verts.size());
1299 tls.neighbor_offsets,
1302 tls.average_positions.reinitialize(
verts.size());
1305 position_data.eval,
verts, neighbors, average_positions);
1307 tls.laplacian_disp.reinitialize(
verts.size());
1309 tls.translations.reinitialize(
verts.size());
1323 position_data.deform(translations,
verts);
1326 LocalData &tls = all_tls.
local();
1329 tls.factors.resize(
verts.size());
1339 all_laplacian_disp.
as_span(),
verts, tls.laplacian_disp);
1346 tls.neighbor_offsets,
1349 tls.average_positions.resize(
verts.size());
1352 all_laplacian_disp.
as_span(),
verts, neighbors, average_laplacian_disps);
1354 tls.translations.resize(
verts.size());
1357 laplacian_disp, average_laplacian_disps,
beta, translations);
1362 position_data.deform(translations,
verts);
1371 LocalData &tls = all_tls.
local();
1376 tls.factors.resize(positions.
size());
1384 tls.average_positions.resize(positions.
size());
1387 subdiv_ccg, subdiv_ccg.
positions.as_span(), grids, average_positions);
1389 tls.laplacian_disp.resize(positions.
size());
1391 tls.translations.resize(positions.
size());
1408 LocalData &tls = all_tls.
local();
1412 tls.factors.resize(positions.
size());
1421 subdiv_ccg, all_laplacian_disp.
as_span(), grids, tls.laplacian_disp);
1423 tls.average_positions.resize(positions.
size());
1426 subdiv_ccg, all_laplacian_disp.
as_span(), grids, average_laplacian_disps);
1428 tls.translations.resize(positions.
size());
1431 laplacian_disp, average_laplacian_disps,
beta, translations);
1445 LocalData &tls = all_tls.
local();
1452 tls.factors.resize(
verts.size());
1460 tls.average_positions.resize(
verts.size());
1464 tls.laplacian_disp.resize(
verts.size());
1466 tls.translations.resize(
verts.size());
1469 positions, orig_positions, average_positions, alpha, laplacian_disp, translations);
1479 LocalData &tls = all_tls.
local();
1483 tls.factors.resize(
verts.size());
1492 all_laplacian_disp.
as_span(),
verts, tls.laplacian_disp);
1494 tls.average_positions.resize(
verts.size());
1498 tls.translations.resize(
verts.size());
1501 laplacian_disp, average_laplacian_disps,
beta, translations);
1521 float3 disp_avg = smooth_positions[
i] - positions[
i];
1523 translations[
i] += disp_avg;
1526 float3 detail_strength = detail_directions[
i];
1535 const float strength,
1551 switch (pbvh.
type()) {
1563 LocalData &tls = all_tls.
local();
1567 tls.factors.resize(
verts.size());
1588 tls.neighbor_offsets,
1591 tls.smooth_positions.resize(
verts.size());
1594 position_data.eval,
verts, neighbors, smooth_positions);
1599 tls.translations.resize(
verts.size());
1601 for (
const int i :
verts.index_range()) {
1602 const int vert =
verts[
i];
1603 const float3 &position = position_data.eval[vert];
1605 float3 disp_sharpen(0.0f);
1606 for (
const int neighbor : neighbors[
i]) {
1607 float3 disp_n = position_data.eval[neighbor] - position;
1609 disp_sharpen += disp_n;
1612 disp_sharpen *= (1.0f - sharpen_factors[
i]);
1613 translations[
i] = disp_sharpen;
1629 position_data.deform(translations,
verts);
1641 LocalData &tls = all_tls.
local();
1645 tls.factors.resize(positions.
size());
1660 tls.smooth_positions.resize(positions.
size());
1663 subdiv_ccg, subdiv_ccg.
positions.as_span(), grids, smooth_positions);
1668 tls.translations.resize(positions.
size());
1671 const int node_verts_start =
i * key.
grid_area;
1672 const int grid = grids[
i];
1676 const int node_vert = node_verts_start + offset;
1678 const float3 &position = positions[node_vert];
1680 float3 disp_sharpen(0.0f);
1685 float3 disp_n = vert_positions[neighbor.
to_index(key)] - position;
1687 disp_sharpen += disp_n;
1690 disp_sharpen *= (1.0f - sharpen_factors[node_vert]);
1691 translations[node_vert] = disp_sharpen;
1700 tls.detail_directions);
1722 LocalData &tls = all_tls.
local();
1726 tls.factors.resize(
verts.size());
1741 tls.smooth_positions.resize(
verts.size());
1748 tls.translations.resize(
verts.size());
1755 const float3 position = vert->co;
1757 float3 disp_sharpen(0.0f);
1761 disp_sharpen += disp_n;
1764 disp_sharpen *= (1.0f - sharpen_factors[
i]);
1765 translations[
i] = disp_sharpen;
1791 const float strength,
1795 const float final_strength = -std::abs(strength);
1803 switch (pbvh.
type()) {
1811 LocalData &tls = all_tls.
local();
1814 tls.factors.resize(
verts.size());
1828 position_data.deform(translations,
verts);
1837 LocalData &tls = all_tls.
local();
1841 tls.factors.resize(positions.
size());
1863 LocalData &tls = all_tls.
local();
1867 tls.factors.resize(
verts.size());
1889 const float strength,
1905 LocalData &tls = all_tls.
local();
1909 tls.factors.resize(positions.
size());
1919 tls.translations.resize(positions.
size());
1931 const float shape_preservation,
1932 const float current_vertex_displacement)
1951 for (const int grid : range) {
1952 MutableSpan grid_dst = limit_positions.slice(bke::ccg::grid_range(key, grid));
1953 BKE_subdiv_ccg_eval_limit_positions(subdiv_ccg, key, grid, grid_dst);
1960 const float smooth_ratio,
1961 const float intensify_detail_strength,
1962 const int curvature_smooth_iterations,
1980 for (
int i = 0;
i < totvert;
i++) {
1984 float max_factor = 0.0f;
1985 for (
int i = 0;
i < totvert;
i++) {
1986 max_factor = std::max(sharpen_factors[
i], max_factor);
1990 for (
int i = 0;
i < totvert;
i++) {
1991 sharpen_factors[
i] *= max_factor;
1992 sharpen_factors[
i] = 1.0f -
pow2f(1.0f - sharpen_factors[
i]);
2005 switch (pbvh.
type()) {
2014 LocalData &tls = all_tls.
local();
2020 attribute_data.hide_poly,
2022 tls.neighbor_offsets,
2025 tls.smooth_directions.resize(
verts.size());
2029 tls.smooth_directions.as_mutable_span());
2032 tls.smooth_factors.resize(
verts.size());
2034 sharpen_factors.
as_span(),
verts, neighbors, tls.smooth_factors.as_mutable_span());
2044 LocalData &tls = all_tls.
local();
2048 tls.smooth_directions.resize(grid_verts_num);
2052 tls.smooth_directions.as_mutable_span());
2054 subdiv_ccg, tls.smooth_directions.as_span(), grids, detail_directions);
2056 tls.smooth_factors.resize(grid_verts_num);
2058 subdiv_ccg, sharpen_factors.
as_span(), grids, tls.smooth_factors.as_mutable_span());
2059 scatter_data_grids(subdiv_ccg, tls.smooth_factors.as_span(), grids, sharpen_factors);
2066 LocalData &tls = all_tls.
local();
2070 tls.smooth_directions.resize(
verts.size());
2072 detail_directions.
as_span(),
verts, tls.smooth_directions.as_mutable_span());
2075 tls.smooth_factors.resize(
verts.size());
2077 sharpen_factors.
as_span(),
verts, tls.smooth_factors.as_mutable_span());
2095 {0,
nullptr, 0,
nullptr,
nullptr},
2116 status.item(
IFACE_(
"Cancel"), ICON_EVENT_ESC, ICON_MOUSE_RMB);
2136 switch (filter_type) {
2191 const float len = prev_press_mouse[0] - mouse[0];
2216 start_mouse = mouse;
2279 switch (event->
val) {
2320 float2 mouse(
float(event->
xy[0]),
float(event->
xy[1]));
2329 float2 mval(
float(event->
xy[0]),
float(event->
xy[1]));
2346 switch (filter_type) {
2415 if (deform_axis == 0) {
2421 if (use_automasking) {
2429 if (needs_topology_info) {
2482 for (
int i = 0;
i < iterations;
i++) {
2498 ot->srna,
"start_mouse", 2,
nullptr, 0, 1 << 14,
"Starting Mouse",
"", 0, 1 << 14);
2501 "area_normal_radius",
2506 "Radius used for calculating area normal on initial click,\nin percentage "
2511 ot->srna,
"strength", 1.0f, -10.0f, 10.0f,
"Strength",
"Filter strength", -10.0f, 10.0f);
2519 "How many times to repeat the filter",
2535 layout = &layout->
row(
true);
2541 ot->name =
"Filter Mesh";
2542 ot->idname =
"SCULPT_OT_mesh_filter";
2543 ot->description =
"Applies a filter to modify the current mesh";
2565 "Operation that is going to be applied to the mesh");
2572 "Apply the deformation in the selected axis");
2578 "Orientation of the axis to limit the filter displacement");
2582 "surface_smooth_shape_preservation",
2586 "Shape Preservation",
2587 "How much of the original shape is preserved when smoothing",
2591 "surface_smooth_current_vertex",
2595 "Per Vertex Displacement",
2596 "How much the position of each individual vertex influences the final result",
2600 "sharpen_smooth_ratio",
2605 "How much smoothing is applied to polished surfaces",
2610 "sharpen_intensify_detail_strength",
2614 "Intensify Details",
2615 "How much creases and valleys are intensified",
2620 "sharpen_curvature_smooth_iterations",
2624 "Curvature Smooth Iterations",
2625 "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)
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)
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[]
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)
@ FILTER_MESH_MODAL_CANCEL
@ FILTER_MESH_MODAL_CONFIRM
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)
void cache_init(bContext *C, Object &ob, Sculpt &sd, undo::Type undo_type, const float mval_fl[2], float area_normal_radius, float start_strength)
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)
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)
float object_space_radius_get(const ViewContext &vc, const Paint &paint, const Brush &brush, const float3 &location, const float scale_factor)
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 UnifiedPaintSettings unified_paint_settings
PaintRuntimeHandle * runtime
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
const c_style_mat & ptr() const
static MatBase identity()
blender::float3 average_stroke_accum
int average_stroke_counter
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)