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()) {
353 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
357 const Span<int> corner_verts = mesh.corner_verts();
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();
412 const Span<int> grids = nodes[i].grids();
424 tls.new_positions.resize(positions.size());
460 tls.new_positions.resize(
verts.size());
481 const float strength,
492 switch (pbvh.
type()) {
494 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
522 position_data.deform(translations,
verts);
532 const Span<int> grids = nodes[i].grids();
591 const float strength,
602 switch (pbvh.
type()) {
604 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
641 const Span<int> grids = nodes[i].grids();
701 for (
const int i : positions.index_range()) {
703 if (factors[i] > 0.0f) {
710 transform * positions[i] - positions[i]);
716 const float strength,
727 switch (pbvh.
type()) {
729 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
765 const Span<int> grids = nodes[i].grids();
824 for (
const int i : positions.index_range()) {
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()) {
846 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
884 const Span<int> grids = nodes[i].grids();
945 const float strength,
952 switch (pbvh.
type()) {
959 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
963 const Span<int> corner_verts = mesh.corner_verts();
1010 const Mesh &base_mesh = *
static_cast<const Mesh *
>(
object.data);
1012 const Span<int> corner_verts = base_mesh.corner_verts();
1015 const VArraySpan face_sets = *attributes.lookup<
int>(
".sculpt_face_set",
1022 const Span<int> grids = nodes[i].grids();
1082 verts, positions, face_set_offset,
false, factors, tls.vert_neighbors, translations);
1095 const float strength,
1108 switch (pbvh.
type()) {
1116 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
1120 const Span<int> corner_verts = mesh.corner_verts();
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();
1175 const VArraySpan face_sets = *attributes.lookup<
int>(
".sculpt_face_set",
1183 const Span<int> grids = nodes[i].grids();
1249 face_set_offset, relax_face_sets,
verts, factors);
1272 const float strength,
1289 switch (pbvh.
type()) {
1291 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
1295 const Span<int> corner_verts = mesh.corner_verts();
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);
1392 const Span<int> grids = nodes[i].grids();
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());
1429 const Span<int> grids = nodes[i].grids();
1441 subdiv_ccg, all_laplacian_disp.
as_span(), grids, tls.laplacian_disp);
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);
1542 for (
const int i : positions.index_range()) {
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()) {
1574 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
1579 const Span<int> corner_verts = mesh.corner_verts();
1604 tls.vert_neighbors.resize(
verts.size());
1607 faces, corner_verts, vert_to_face_map, attribute_data.
hide_poly,
verts, neighbors);
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;
1660 const Span<int> grids = nodes[node_index].grids();
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()) {
1825 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
1861 const Span<int> grids = nodes[i].grids();
1917 const float strength,
1934 const Span<int> grids = nodes[i].grids();
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()) {
2037 Mesh &mesh = *
static_cast<Mesh *
>(
object.data);
2039 const Span<int> corner_verts = mesh.corner_verts();
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());
2072 const Span<int> grids = nodes[i].grids();
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) {
2159 case MeshFilterType::Smooth:
2162 case MeshFilterType::Scale:
2165 case MeshFilterType::Inflate:
2168 case MeshFilterType::Sphere:
2171 case MeshFilterType::Random:
2174 case MeshFilterType::Relax:
2177 case MeshFilterType::RelaxFaceSets:
2180 case MeshFilterType::SurfaceSmooth:
2183 case MeshFilterType::Sharpen:
2186 case MeshFilterType::EnhanceDetails:
2189 case MeshFilterType::EraseDisplacement:
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) {
2361 case MeshFilterType::SurfaceSmooth: {
2367 case MeshFilterType::Sharpen: {
2376 case MeshFilterType::EnhanceDetails: {
2382 case MeshFilterType::EraseDisplacement: {
2429 if (deform_axis == 0) {
2435 if (use_automasking) {
2443 if (needs_topology_info) {
2492 for (
int i = 0; i < iterations; i++) {
2507 ot->
srna,
"start_mouse", 2,
nullptr, 0, 1 << 14,
"Starting Mouse",
"", 0, 1 << 14);
2510 "area_normal_radius",
2515 "Radius used for calculating area normal on initial click,\nin percentage "
2520 ot->
srna,
"strength", 1.0f, -10.0f, 10.0f,
"Strength",
"Filter strength", -10.0f, 10.0f);
2527 "How many times to repeat the filter",
2533 ot->
srna,
"event_history", &RNA_OperatorStrokeElement,
"",
"");
2550 ot->
name =
"Filter Mesh";
2551 ot->
idname =
"SCULPT_OT_mesh_filter";
2552 ot->
description =
"Applies a filter to modify the current mesh";
2572 int(MeshFilterType::Inflate),
2574 "Operation that is going to be applied to the mesh");
2581 "Apply the deformation in the selected axis");
2585 int(FilterOrientation::Local),
2587 "Orientation of the axis to limit the filter displacement");
2591 "surface_smooth_shape_preservation",
2595 "Shape Preservation",
2596 "How much of the original shape is preserved when smoothing",
2600 "surface_smooth_current_vertex",
2604 "Per Vertex Displacement",
2605 "How much the position of each individual vertex influences the final result",
2609 "sharpen_smooth_ratio",
2614 "How much smoothing is applied to polished surfaces",
2619 "sharpen_intensify_detail_strength",
2623 "Intensify Details",
2624 "How much creases and valleys are intensified",
2629 "sharpen_curvature_smooth_iterations",
2633 "Curvature Smooth Iterations",
2634 "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.
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a vector
#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)
static unsigned long seed
void item(std::string text, int icon1, int icon2=0)
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
void resize(const int64_t new_size)
void tag_positions_changed(const IndexMask &node_mask)
Span< NodeT > nodes() const
void foreach_index(Fn &&fn) const
const Depsgraph * depsgraph
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)
@ FILTER_MESH_MODAL_CANCEL
@ FILTER_MESH_MODAL_CONFIRM
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)
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)
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_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))
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
blender::float3 last_normal
blender::ed::sculpt_paint::filter::Cache * filter_cache
SculptVertexInfo vertex_info
blender::BitVector boundary
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
bool(* poll)(bContext *C) ATTR_WARN_UNUSED_RESULT
int(* modal)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
int(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
void(* ui)(bContext *C, wmOperator *op)
void(* cancel)(bContext *C, wmOperator *op)
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)