125 if (automasking->
factor) {
126 return automasking->
factor[vert];
186 data->automask_factor[to_v] = 1.0f;
187 data->automask_factor[from_v] = 1.0f;
188 return (!
data->use_radius ||
205 automask_factor[i] = 0.0f;
226 return automask_factor;
247 automask_factor[i] *= 0.0f;
251 return automask_factor;
254 #define EDGE_DISTANCE_INF -1
258 int propagation_steps,
259 float *automask_factor)
269 int *edge_distance = (
int *)
MEM_callocN(
sizeof(
int) * totvert,
"automask_factor");
276 edge_distance[i] = 0;
281 edge_distance[i] = 0;
287 for (
int propagation_it :
IndexRange(propagation_steps)) {
294 if (edge_distance[ni.
index] == propagation_it) {
295 edge_distance[i] = propagation_it + 1;
306 const float p = 1.0f - ((
float)edge_distance[i] / (
float)propagation_steps);
307 const float edge_boundary_automask =
pow2f(p);
308 automask_factor[i] *= (1.0f - edge_boundary_automask);
312 return automask_factor;
334 "automasking cache");
344 automasking->
factor[i] = 1.0f;
347 const int boundary_propagation_steps = brush ?
typedef float(TangentPoint)[2]
General operations, lookup, etc. for blender objects.
struct Brush * BKE_paint_brush(struct Paint *paint)
A BVH for high poly meshes.
PBVHType BKE_pbvh_type(const PBVH *pbvh)
#define BLI_assert_msg(a, msg)
MINLINE float pow2f(float x)
MINLINE void copy_v3_v3(float r[3], const float a[3])
@ BRUSH_AUTOMASKING_BOUNDARY_EDGES
@ BRUSH_AUTOMASKING_BOUNDARY_FACE_SETS
@ BRUSH_AUTOMASKING_FACE_SETS
@ BRUSH_AUTOMASKING_TOPOLOGY
@ PAINT_FALLOFF_SHAPE_TUBE
Read Guarded memory(de)allocation.
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void *(* MEM_callocN)(size_t len, const char *str)
const float * SCULPT_vertex_co_get(SculptSession *ss, int index)
int SCULPT_vertex_count_get(SculptSession *ss)
void SCULPT_boundary_info_ensure(Object *object)
void SCULPT_floodfill_init(SculptSession *ss, SculptFloodFill *flood)
bool SCULPT_vertex_has_face_set(SculptSession *ss, int index, int face_set)
bool SCULPT_vertex_has_unique_face_set(SculptSession *ss, int index)
const float * SCULPT_active_vertex_co_get(SculptSession *ss)
void SCULPT_vertex_random_access_ensure(SculptSession *ss)
bool SCULPT_stroke_is_dynamic_topology(const SculptSession *ss, const Brush *brush)
bool SCULPT_vertex_is_boundary(const SculptSession *ss, const int index)
void SCULPT_floodfill_free(SculptFloodFill *flood)
char SCULPT_mesh_symmetry_xyz_get(Object *object)
bool SCULPT_is_vertex_inside_brush_radius_symm(const float vertex[3], const float br_co[3], float radius, char symm)
void SCULPT_floodfill_add_active(Sculpt *sd, Object *ob, SculptSession *ss, SculptFloodFill *flood, float radius)
int SCULPT_active_face_set_get(SculptSession *ss)
void SCULPT_floodfill_execute(SculptSession *ss, SculptFloodFill *flood, bool(*func)(SculptSession *ss, int from_v, int to_v, bool is_duplicate, void *userdata), void *userdata)
static bool sculpt_automasking_is_constrained_by_radius(Brush *br)
float * SCULPT_boundary_automasking_init(Object *ob, eBoundaryAutomaskMode mode, int propagation_steps, float *automask_factor)
static float * sculpt_face_sets_automasking_init(Sculpt *sd, Object *ob, float *automask_factor)
static int sculpt_automasking_mode_effective_bits(const Sculpt *sculpt, const Brush *brush)
static float * SCULPT_topology_automasking_init(Sculpt *sd, Object *ob, float *automask_factor)
void SCULPT_automasking_cache_free(AutomaskingCache *automasking)
static void SCULPT_automasking_cache_settings_update(AutomaskingCache *automasking, SculptSession *ss, Sculpt *sd, Brush *brush)
float SCULPT_automasking_factor_get(AutomaskingCache *automasking, SculptSession *ss, int vert)
bool SCULPT_is_automasking_mode_enabled(const Sculpt *sd, const Brush *br, const eAutomasking_flag mode)
#define EDGE_DISTANCE_INF
AutomaskingCache * SCULPT_automasking_cache_init(Sculpt *sd, Brush *brush, Object *ob)
static bool automask_floodfill_cb(SculptSession *ss, int from_v, int to_v, bool UNUSED(is_duplicate), void *userdata)
bool SCULPT_is_automasking_enabled(const Sculpt *sd, const SculptSession *ss, const Brush *br)
static bool SCULPT_automasking_needs_factors_cache(const Sculpt *sd, const Brush *brush)
AutomaskingCache * SCULPT_automasking_active_cache_get(SculptSession *ss)
#define SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN(ss, v_index, neighbor_iterator)
#define SCULPT_VERTEX_NEIGHBORS_ITER_END(neighbor_iterator)
@ AUTOMASK_INIT_BOUNDARY_EDGES
@ AUTOMASK_INIT_BOUNDARY_FACE_SETS
AutomaskingSettings settings
int automasking_boundary_edges_propagation_steps
AutomaskingCache * automasking
struct SculptSession * sculpt
struct MeshElemMap * pmap
struct StrokeCache * cache
struct FilterCache * filter_cache
AutomaskingCache * automasking