37 int aa_samples = 1.0f / (radius * 0.20f);
53 const float cursor_position[2])
56 int offset = int(
floorf(diameter / 2.0f));
57 float clamped_radius =
max_ff(radius, 0.5f);
62 const float aa_offset = 1.0f / (2.0f *
float(aa_samples));
63 const float aa_step = 1.0f /
float(aa_samples);
66 bpos[0] = cursor_position[0] -
floorf(cursor_position[0]) + offset;
67 bpos[1] = cursor_position[1] -
floorf(cursor_position[1]) + offset;
69 float weight_factor = 65535.0f /
float(aa_samples * aa_samples);
71 if (aa_samples == 1) {
75 if (
int(clamped_radius * 2) % 2 == 0) {
80 bpos[0] =
floorf(bpos[0]) + 0.5f;
81 bpos[1] =
floorf(bpos[1]) + 0.5f;
85 for (
int y = 0;
y < diameter;
y++) {
86 for (
int x = 0;
x < diameter;
x++, m++) {
88 pixel_xy[0] =
float(
x) + aa_offset;
89 float total_weight = 0;
91 for (
int i = 0;
i < aa_samples;
i++) {
92 pixel_xy[1] =
float(
y) + aa_offset;
93 for (
int j = 0; j < aa_samples; j++) {
97 const float sample_weight = curve_mask_cache->
sampled_curve[sample_index];
99 total_weight += sample_weight;
101 pixel_xy[1] += aa_step;
103 pixel_xy[0] += aa_step;
105 *m =
ushort(total_weight * weight_factor);
141 return diameter * diameter *
sizeof(
ushort);
176 const float cursor_position[2])
float BKE_brush_curve_strength_clamped(const Brush *br, float p, float len)
MINLINE float max_ff(float a, float b)
MINLINE int min_ii(int a, int b)
MINLINE int clamp_i(int value, int min, int max)
MINLINE float len_v2v2(const float v1[2], const float v2[2]) ATTR_WARN_UNUSED_RESULT
@ BRUSH_PAINT_ANTIALIASING
Read Guarded memory(de)allocation.
void * MEM_mallocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
constexpr int CurveSamplesBaseLen
Number of samples to use between 0..1.
static void sampled_curve_free(CurveMaskCache *curve_mask_cache)
constexpr int AntiAliasingSamplesPerTexelAxisMin
static int aa_samples_per_texel_axis(const Brush *brush, const float radius)
static void update_curve_mask(CurveMaskCache *curve_mask_cache, const Brush *brush, const int diameter, const float radius, const float cursor_position[2])
static size_t diameter_to_curve_mask_size(const int diameter)
static void curve_mask_free(CurveMaskCache *curve_mask_cache)
constexpr int AntiAliasingSamplesPerTexelAxisMax
static bool is_sampled_curve_valid(const CurveMaskCache *curve_mask_cache, const Brush *brush)
static void curve_mask_allocate(CurveMaskCache *curve_mask_cache, const int diameter)
static bool is_curve_mask_size_valid(const CurveMaskCache *curve_mask_cache, const int diameter)
static void update_sampled_curve(CurveMaskCache *curve_mask_cache, const Brush *brush)
constexpr int CurveSamplesLen
Number of samples to store in the cache.
void paint_curve_mask_cache_free_data(CurveMaskCache *curve_mask_cache)
void paint_curve_mask_cache_update(CurveMaskCache *curve_mask_cache, const Brush *brush, const int diameter, const float radius, const float cursor_position[2])
struct CurveMapping * curve_distance_falloff
Caching structure for curve mask.
ushort * curve_mask
Curve mask that can be passed as curve_mask parameter when.
float * sampled_curve
sampled version of the brush curve-mapping.
int last_curve_timestamp
Last CurveMapping.changed_timestamp being read.
size_t curve_mask_size
Size in bytes of the curve_mask field.