10#include <fmt/format.h>
56#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);
206 mul_m4_v3(ob.object_to_world().ptr(), co);
219 float3 viewDir{0.0f, 0.0f, 1.0f};
255 "Smooth the edges of all the Face Sets"},
260 "Smooth the surface of the mesh, preserving the volume"},
266 "Enhance the high frequency surface detail"},
268 "ERASE_DISPLACEMENT",
270 "Erase Displacement",
271 "Deletes the displacement of the Multires Modifier"},
272 {0,
nullptr, 0,
nullptr,
nullptr},
285 {0,
nullptr, 0,
nullptr,
nullptr},
293 "Use the local axis to limit the displacement"},
298 "Use the global axis to limit the displacement"},
303 "Use the view axis to limit the displacement"},
304 {0,
nullptr, 0,
nullptr,
nullptr},
309 return ELEM(filter_type,
331 for (
float &factor : factors) {
332 factor = std::clamp(factor,
min,
max);
338 const float strength,
351 switch (pbvh.
type()) {
376 tls.vert_neighbors.resize(
verts.size());
385 tls.new_positions.resize(
verts.size());
388 position_data.
eval,
verts, neighbors, new_positions);
403 const Mesh &base_mesh = *
static_cast<const Mesh *
>(
object.data);
405 const Span<int> corner_verts = base_mesh.corner_verts();
424 tls.new_positions.resize(positions.
size());
460 tls.new_positions.resize(
verts.size());
481 const float strength,
492 switch (pbvh.
type()) {
522 position_data.deform(translations,
verts);
591 const float strength,
602 switch (pbvh.
type()) {
703 if (factors[i] > 0.0f) {
710 transform * positions[i] - positions[i]);
716 const float strength,
727 switch (pbvh.
type()) {
825 const uint *hash_co = (
const uint *)&positions[i];
827 factors[i] *= (
hash * (1.0f /
float(0xFFFFFFFF)) - 0.5f);
833 const float strength,
844 switch (pbvh.
type()) {
945 const float strength,
952 switch (pbvh.
type()) {
1010 const Mesh &base_mesh = *
static_cast<const Mesh *
>(
object.data);
1012 const Span<int> corner_verts = base_mesh.corner_verts();
1082 verts, positions, face_set_offset,
false, factors, tls.vert_neighbors, translations);
1095 const float strength,
1108 switch (pbvh.
type()) {
1139 vert_to_face_map, attribute_data.
face_sets, relax_face_sets,
verts, factors);
1170 const Mesh &base_mesh = *
static_cast<const Mesh *
>(
object.data);
1172 const Span<int> corner_verts = base_mesh.corner_verts();
1249 face_set_offset, relax_face_sets,
verts, factors);
1272 const float strength,
1289 switch (pbvh.
type()) {
1314 tls.vert_neighbors.reinitialize(
verts.size());
1320 tls.vert_neighbors);
1322 tls.average_positions.reinitialize(
verts.size());
1325 position_data.
eval,
verts, tls.vert_neighbors, average_positions);
1327 tls.laplacian_disp.reinitialize(
verts.size());
1359 all_laplacian_disp.
as_span(),
verts, tls.laplacian_disp);
1361 tls.vert_neighbors.resize(
verts.size());
1367 tls.vert_neighbors);
1369 tls.average_positions.resize(
verts.size());
1372 all_laplacian_disp.
as_span(),
verts, tls.vert_neighbors, average_laplacian_disps);
1377 laplacian_disp, average_laplacian_disps,
beta, translations);
1404 tls.average_positions.resize(positions.
size());
1407 subdiv_ccg, subdiv_ccg.
positions.as_span(), grids, average_positions);
1409 tls.laplacian_disp.resize(positions.
size());
1441 subdiv_ccg, all_laplacian_disp.
as_span(), grids, tls.laplacian_disp);
1443 tls.average_positions.resize(orig_data.
positions.size());
1446 subdiv_ccg, all_laplacian_disp.
as_span(), grids, average_laplacian_disps);
1451 laplacian_disp, average_laplacian_disps,
beta, translations);
1480 tls.average_positions.resize(
verts.size());
1484 tls.laplacian_disp.resize(
verts.size());
1489 positions, orig_positions, average_positions, alpha, laplacian_disp, translations);
1514 all_laplacian_disp.
as_span(),
verts, tls.laplacian_disp);
1516 tls.average_positions.resize(
verts.size());
1523 laplacian_disp, average_laplacian_disps,
beta, translations);
1543 float3 disp_avg = smooth_positions[i] - positions[i];
1545 translations[i] += disp_avg;
1548 float3 detail_strength = detail_directions[i];
1557 const float strength,
1572 switch (pbvh.
type()) {
1604 tls.vert_neighbors.resize(
verts.size());
1609 tls.smooth_positions.resize(
verts.size());
1612 position_data.
eval,
verts, neighbors, smooth_positions);
1619 for (
const int i :
verts.index_range()) {
1620 const int vert =
verts[i];
1621 const float3 &position = position_data.
eval[vert];
1623 float3 disp_sharpen(0.0f);
1624 for (
const int neighbor : neighbors[i]) {
1625 float3 disp_n = position_data.
eval[neighbor] - position;
1627 disp_sharpen += disp_n;
1630 disp_sharpen *= (1.0f - sharpen_factors[i]);
1631 translations[i] = disp_sharpen;
1678 tls.vert_neighbors.resize(positions.
size());
1680 tls.smooth_positions.resize(positions.
size());
1683 subdiv_ccg, subdiv_ccg.
positions.as_span(), grids, smooth_positions);
1691 const int node_verts_start = i * key.
grid_area;
1692 const int grid = grids[i];
1696 const int node_vert = node_verts_start + offset;
1698 const float3 &position = positions[node_vert];
1700 float3 disp_sharpen(0.0f);
1705 float3 disp_n = vert_positions[neighbor.
to_index(key)] - position;
1707 disp_sharpen += disp_n;
1710 disp_sharpen *= (1.0f - sharpen_factors[node_vert]);
1711 translations[node_vert] = disp_sharpen;
1720 tls.detail_directions);
1761 tls.smooth_positions.resize(
verts.size());
1775 const float3 position = vert->co;
1777 float3 disp_sharpen(0.0f);
1781 disp_sharpen += disp_n;
1784 disp_sharpen *= (1.0f - sharpen_factors[i]);
1785 translations[i] = disp_sharpen;
1811 const float strength,
1815 const float final_strength = -std::abs(strength);
1823 switch (pbvh.
type()) {
1917 const float strength,
1961 const float shape_preservation,
1962 const float current_vertex_displacement)
1980 for (const int grid : range) {
1981 MutableSpan grid_dst = limit_positions.slice(bke::ccg::grid_range(key, grid));
1982 BKE_subdiv_ccg_eval_limit_positions(subdiv_ccg, key, grid, grid_dst);
1989 const float smooth_ratio,
1990 const float intensify_detail_strength,
1991 const int curvature_smooth_iterations,
2009 for (
int i = 0; i < totvert; i++) {
2010 sharpen_factors[i] =
math::length(detail_directions[i]);
2013 float max_factor = 0.0f;
2014 for (
int i = 0; i < totvert; i++) {
2015 if (sharpen_factors[i] > max_factor) {
2016 max_factor = sharpen_factors[i];
2020 max_factor = 1.0f / max_factor;
2021 for (
int i = 0; i < totvert; i++) {
2022 sharpen_factors[i] *= max_factor;
2023 sharpen_factors[i] = 1.0f -
pow2f(1.0f - sharpen_factors[i]);
2035 switch (pbvh.
type()) {
2047 tls.vert_neighbors.resize(
verts.size());
2050 faces, corner_verts, vert_to_face_map, attribute_data.hide_poly,
verts, neighbors);
2052 tls.smooth_directions.resize(
verts.size());
2056 tls.smooth_directions.as_mutable_span());
2059 tls.smooth_factors.resize(
verts.size());
2061 sharpen_factors.
as_span(),
verts, neighbors, tls.smooth_factors.as_mutable_span());
2075 tls.smooth_directions.resize(grid_verts_num);
2079 tls.smooth_directions.as_mutable_span());
2081 subdiv_ccg, tls.smooth_directions.as_span(), grids, detail_directions);
2083 tls.smooth_factors.resize(grid_verts_num);
2085 subdiv_ccg, sharpen_factors.
as_span(), grids, tls.smooth_factors.as_mutable_span());
2086 scatter_data_grids(subdiv_ccg, tls.smooth_factors.as_span(), grids, sharpen_factors);
2097 tls.smooth_directions.resize(
verts.size());
2099 detail_directions.
as_span(),
verts, tls.smooth_directions.as_mutable_span());
2102 tls.smooth_factors.resize(
verts.size());
2104 sharpen_factors.
as_span(),
verts, tls.smooth_factors.as_mutable_span());
2122 {0,
nullptr, 0,
nullptr,
nullptr},
2142 status.
item(
IFACE_(
"Confirm"), ICON_EVENT_RETURN);
2143 status.
item(
IFACE_(
"Cancel"), ICON_EVENT_ESC, ICON_MOUSE_RMB);
2158 switch (filter_type) {
2208 const float len = prev_press_mouse[0] - mouse[0];
2233 start_mouse = mouse;
2296 switch (event->
val) {
2337 float2 mouse(
float(event->
xy[0]),
float(event->
xy[1]));
2343 float2 mval(
float(event->
xy[0]),
float(event->
xy[1]));
2360 switch (filter_type) {
2429 if (deform_axis == 0) {
2435 if (use_automasking) {
2443 if (needs_topology_info) {
2492 for (
int i = 0; i < iterations; i++) {
2508 ot->srna,
"start_mouse", 2,
nullptr, 0, 1 << 14,
"Starting Mouse",
"", 0, 1 << 14);
2511 "area_normal_radius",
2516 "Radius used for calculating area normal on initial click,\nin percentage "
2521 ot->srna,
"strength", 1.0f, -10.0f, 10.0f,
"Strength",
"Filter strength", -10.0f, 10.0f);
2528 "How many times to repeat the filter",
2534 ot->srna,
"event_history", &RNA_OperatorStrokeElement,
"",
"");
2551 ot->name =
"Filter Mesh";
2552 ot->idname =
"SCULPT_OT_mesh_filter";
2553 ot->description =
"Applies a filter to modify the current mesh";
2575 "Operation that is going to be applied to the mesh");
2582 "Apply the deformation in the selected axis");
2588 "Orientation of the axis to limit the filter displacement");
2592 "surface_smooth_shape_preservation",
2596 "Shape Preservation",
2597 "How much of the original shape is preserved when smoothing",
2601 "surface_smooth_current_vertex",
2605 "Per Vertex Displacement",
2606 "How much the position of each individual vertex influences the final result",
2610 "sharpen_smooth_ratio",
2615 "How much smoothing is applied to polished surfaces",
2620 "sharpen_intensify_detail_strength",
2624 "Intensify Details",
2625 "How much creases and valleys are intensified",
2630 "sharpen_curvature_smooth_iterations",
2634 "Curvature Smooth Iterations",
2635 "How much smooth the resulting shape is, ignoring high frequency details",
float BKE_brush_unprojected_radius_get(const Scene *scene, const Brush *brush)
int BKE_brush_size_get(const Scene *scene, const Brush *brush)
bool BKE_brush_use_locked_size(const Scene *scene, const Brush *brush)
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 scale_m3_fl(float R[3][3], float scale)
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_OPERATOR_DEFAULT
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)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
@ OPTYPE_DEPENDS_ON_CURSOR
#define BM_elem_index_get(ele)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
BPy_StructRNA * depsgraph
static unsigned long seed
Span< T > as_span() const
void reinitialize(const int64_t new_size)
void resize(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 foreach_index(Fn &&fn) const
draw_view in_light_buf[] float
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
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)
void update_bounds(const Depsgraph &depsgraph, const Object &object, Tree &pbvh)
Span< float3 > vert_normals_eval(const Depsgraph &depsgraph, const Object &object_orig)
void calc_grids_factors(const Depsgraph &depsgraph, const Object &object, const Cache &cache, const bke::pbvh::GridsNode &node, Span< int > grids, MutableSpan< float > factors)
std::unique_ptr< Cache > cache_init(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob)
bool is_enabled(const Sculpt &sd, const Object &object, const Brush *br)
void calc_vert_factors(const Depsgraph &depsgraph, const Object &object, const Cache &cache, const bke::pbvh::MeshNode &node, Span< int > verts, MutableSpan< float > factors)
void ensure_boundary_info(Object &object)
static BLI_NOINLINE void fill_factor_from_hide_and_mask(const Mesh &mesh, const Span< int > face_indices, const MutableSpan< float > r_factors)
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 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)
@ FILTER_MESH_MODAL_CANCEL
@ FILTER_MESH_MODAL_CONFIRM
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)
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)
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 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 int sculpt_mesh_filter_start(bContext *C, wmOperator *op)
static void sculpt_mesh_filter_cancel(bContext *C, wmOperator *)
static EnumPropertyItem prop_mesh_filter_orientation_items[]
static int sculpt_mesh_filter_exec(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)
void SCULPT_OT_mesh_filter(wmOperatorType *ot)
static bool sculpt_mesh_filter_needs_pmap(MeshFilterType filter_type)
static int sculpt_mesh_filter_modal(bContext *C, wmOperator *op, const wmEvent *event)
static EnumPropertyItem prop_mesh_filter_deform_axis_items[]
static int sculpt_mesh_filter_invoke(bContext *C, wmOperator *op, const wmEvent *event)
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 *)
static void sculpt_mesh_filter_apply(bContext *C, wmOperator *op)
void register_operator_props(wmOperatorType *ot)
static int sculpt_mesh_filter_confirm(SculptSession &ss, wmOperator *op, const MeshFilterType filter_type)
static void calc_relax_face_sets_filter(const Depsgraph &depsgraph, const Sculpt &sd, const float strength, Object &object, const IndexMask &node_mask)
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, Vector< Vector< SubdivCCGCoord > > &neighbors, const MutableSpan< float3 > translations)
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 Span< Vector< int > > vert_neighbors, const MutableSpan< T > dst)
void neighbor_position_average_interior_bmesh(const Set< BMVert *, 0 > &verts, const MutableSpan< float3 > new_positions)
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, Vector< Vector< int > > &neighbors, 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, Vector< Vector< BMVert * > > &neighbors, const MutableSpan< float3 > translations)
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 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)
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 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, MutableSpan< Vector< int > > result)
bool node_fully_masked_or_hidden(const bke::pbvh::Node &node)
void gather_data_bmesh(Span< T > src, const Set< BMVert *, 0 > &verts, MutableSpan< T > node_data)
void flush_update_done(const bContext *C, Object &ob, UpdateType update_type)
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)
void flush_update_step(bContext *C, UpdateType update_type)
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)
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)
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)
Span< BMVert * > vert_neighbors_get_bmesh(BMVert &vert, Vector< BMVert *, 64 > &r_neighbors)
void gather_data_mesh(Span< T > src, Span< int > indices, MutableSpan< T > dst)
void calc_vert_neighbors(OffsetIndices< int > faces, Span< int > corner_verts, GroupedSpan< int > vert_to_face, Span< bool > hide_poly, Span< int > verts, MutableSpan< Vector< int > > result)
OrigPositionData orig_position_data_get_grids(const Object &object, const bke::pbvh::GridsNode &node)
void scatter_data_grids(const SubdivCCG &subdiv_ccg, Span< T > node_data, Span< int > grids, MutableSpan< T > dst)
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_cursor_geometry_info_update(bContext *C, SculptCursorGeometryInfo *out, const float mval[2], bool use_sampled_normal)
bool SCULPT_stroke_get_location(bContext *C, float out[3], const float mval[2], bool force_original)
void SCULPT_vertex_random_access_ensure(Object &object)
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
blender::Vector< SubdivCCGCoord, 256 > coords
blender::Array< blender::float3 > positions
float average_stroke_accum[3]
int average_stroke_counter
const c_style_mat & ptr() const
static MatBase identity()
Vector< float3 > translations
Vector< float3 > positions
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
struct ReportList * reports
ccl_device_inline float beta(float x, float y)
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)