45 float max_segment = 0.01f;
46 unsigned int i, resol = 1;
56 unsigned int cur_resol;
58 bezt_curr = &point->
bezt;
61 if (bezt_next ==
NULL) {
70 cur_resol =
len / max_segment;
72 resol =
MAX2(resol, cur_resol);
84 const float max_segment = 0.005;
86 float max_jump = 0.0f;
93 for (
int i = 0; i < spline->
tot_point; i++) {
99 for (
int j = 0; j < point->
tot_uw; j++) {
100 const float w_diff = (point->
uw[j].
w - prev_w);
101 const float u_diff = (point->
uw[j].
u - prev_u);
105 if (u_diff > FLT_EPSILON) {
111 prev_u = point->
uw[j].
u;
112 prev_w = point->
uw[j].
w;
116 resol += max_jump / max_segment;
127 return ((spline->
tot_point - 1) * resol) + 1;
131 const unsigned int resol,
132 unsigned int *r_tot_diff_point))[2]
137 float(*diff_points)[2], (*fp)[2];
141 if (spline->tot_point <= 1) {
143 *r_tot_diff_point = 0;
148 *r_tot_diff_point = tot;
149 diff_points = fp =
MEM_mallocN((tot + 1) *
sizeof(*diff_points),
"mask spline vets");
151 a = spline->tot_point - 1;
156 point_prev = points_array;
157 point_curr = point_prev + 1;
165 point_curr = points_array;
168 bezt_prev = &point_prev->
bezt;
169 bezt_curr = &point_curr->
bezt;
171 for (j = 0; j < 2; j++) {
173 bezt_prev->
vec[2][j],
174 bezt_curr->
vec[0][j],
175 bezt_curr->
vec[1][j],
187 point_prev = point_curr;
212 const int alloc_delta = 256;
217 "feather bucket segments");
234 int tot_feather_point,
239 const float *
v1 = (
float *)feather_points[cur_a];
240 const float *
v2 = (
float *)feather_points[cur_b];
243 int check_a = bucket->
segments[i][0];
244 int check_b = bucket->
segments[i][1];
246 const float *v3 = (
float *)feather_points[check_a];
247 const float *v4 = (
float *)feather_points[check_b];
249 if (check_a >= cur_a - 1 || cur_b == check_a) {
256 float min_a[2], max_a[2];
257 float min_b[2], max_b[2];
265 for (k = 0; k < tot_feather_point; k++) {
266 if (k >= check_b && k <= cur_a) {
274 if (max_a[0] - min_a[0] < max_b[0] - min_b[0] || max_a[1] - min_a[1] < max_b[1] - min_b[1]) {
275 for (k = check_b; k <= cur_a; k++) {
280 for (k = 0; k <= check_a; k++) {
285 for (k = cur_b; k < tot_feather_point; k++) {
296 const float bucket_scale[2],
297 const int buckets_per_side)
299 int x = (int)((co[0] -
min[0]) * bucket_scale[0]);
300 int y = (int)((co[1] -
min[1]) * bucket_scale[1]);
302 if (
x == buckets_per_side) {
306 if (
y == buckets_per_side) {
310 return y * buckets_per_side +
x;
314 int start_bucket_index,
315 int end_bucket_index,
316 int buckets_per_side,
320 int start_bucket_x = start_bucket_index % buckets_per_side;
321 int start_bucket_y = start_bucket_index / buckets_per_side;
323 int end_bucket_x = end_bucket_index % buckets_per_side;
324 int end_bucket_y = end_bucket_index / buckets_per_side;
326 int diagonal_bucket_a_index = start_bucket_y * buckets_per_side + end_bucket_x;
327 int diagonal_bucket_b_index = end_bucket_y * buckets_per_side + start_bucket_x;
329 *r_diagonal_bucket_a = &buckets[diagonal_bucket_a_index];
330 *r_diagonal_bucket_b = &buckets[diagonal_bucket_b_index];
334 float (*feather_points)[2],
335 const unsigned int tot_feather_point)
337 #define BUCKET_INDEX(co) feather_bucket_index_from_coord(co, min, bucket_scale, buckets_per_side)
339 int buckets_per_side, tot_bucket;
340 float bucket_size, bucket_scale[2];
345 float max_delta_x = -1.0f, max_delta_y = -1.0f, max_delta;
347 if (tot_feather_point < 4) {
358 for (
uint i = 0; i < tot_feather_point; i++) {
359 unsigned int next = i + 1;
364 if (
next == tot_feather_point) {
373 delta =
fabsf(feather_points[i][0] - feather_points[
next][0]);
374 if (delta > max_delta_x) {
378 delta =
fabsf(feather_points[i][1] - feather_points[
next][1]);
379 if (delta > max_delta_y) {
385 if (
max[0] -
min[0] < FLT_EPSILON) {
390 if (
max[1] -
min[1] < FLT_EPSILON) {
400 max_delta_x /=
max[0] -
min[0];
401 max_delta_y /=
max[1] -
min[1];
403 max_delta =
MAX2(max_delta_x, max_delta_y);
405 buckets_per_side =
min_ii(512, 0.9f / max_delta);
407 if (buckets_per_side == 0) {
410 buckets_per_side = 1;
413 tot_bucket = buckets_per_side * buckets_per_side;
414 bucket_size = 1.0f / buckets_per_side;
417 bucket_scale[0] = 1.0f / ((
max[0] -
min[0]) * bucket_size);
418 bucket_scale[1] = 1.0f / ((
max[1] -
min[1]) * bucket_size);
423 for (
int i = 0; i < tot_feather_point; i++) {
424 int start = i, end = i + 1;
425 int start_bucket_index, end_bucket_index;
427 if (end == tot_feather_point) {
436 start_bucket_index =
BUCKET_INDEX(feather_points[start]);
441 if (start_bucket_index != end_bucket_index) {
459 for (
int i = 0; i < tot_feather_point; i++) {
460 int cur_a = i, cur_b = i + 1;
461 int start_bucket_index, end_bucket_index;
465 if (cur_b == tot_feather_point) {
469 start_bucket_index =
BUCKET_INDEX(feather_points[cur_a]);
472 start_bucket = &buckets[start_bucket_index];
476 if (start_bucket_index != end_bucket_index) {
489 feather_points, tot_feather_point, diagonal_bucket_a, cur_a, cur_b);
491 feather_points, tot_feather_point, diagonal_bucket_b, cur_a, cur_b);
496 for (
int i = 0; i < tot_bucket; i++) {
497 if (buckets[i].segments) {
510 const unsigned int resol,
511 const bool do_feather_isect,
512 unsigned int *r_tot_feather_point))[2]
516 float(*feather)[2], (*fp)[2];
522 feather = fp =
MEM_mallocN((tot + 1) *
sizeof(*feather),
"mask spline feather diff points");
529 point_prev = points_array;
530 point_curr = point_prev + 1;
538 point_curr = points_array;
544 for (j = 0; j < resol; j++, fp++) {
545 float u = (
float)j / resol, weight;
558 float u = 1.0f, weight;
568 point_prev = point_curr;
572 *r_tot_feather_point = tot;
584 const unsigned int resol,
585 const bool do_feather_isect,
586 unsigned int *r_tot_feather_point))[2]
591 float(*feather)[2], (*fp)[2];
597 *r_tot_feather_point = 0;
602 *r_tot_feather_point = tot;
603 feather = fp =
MEM_mallocN((tot + 1) *
sizeof(*feather),
"mask spline vets");
610 point_prev = points_array;
611 point_curr = point_prev + 1;
616 float point_prev_n[2], point_curr_n[2], tvec[2];
617 float weight_prev, weight_curr;
618 float len_base, len_feather, len_scalar;
625 point_curr = points_array;
628 bezt_prev = &point_prev->
bezt;
629 bezt_curr = &point_curr->
bezt;
632 local_prevbezt = *bezt_prev;
633 local_bezt = *bezt_curr;
635 bezt_prev = &local_prevbezt;
636 bezt_curr = &local_bezt;
641 point_prev_n[0] = -tvec[1];
642 point_prev_n[1] = tvec[0];
646 point_curr_n[0] = -tvec[1];
647 point_curr_n[1] = tvec[0];
649 weight_prev = bezt_prev->
weight;
650 weight_curr = bezt_curr->
weight;
669 len_scalar = len_feather / len_base;
677 for (j = 0; j < 2; j++) {
679 bezt_prev->
vec[2][j],
680 bezt_curr->
vec[0][j],
681 bezt_curr->
vec[1][j],
689 for (j = 0; j < resol; j++, fp++) {
690 float u = (
float)j / resol;
691 float weight_uw, weight_scalar;
712 point_prev = point_curr;
729 const unsigned int resol,
730 const bool do_feather_isect,
731 unsigned int *r_tot_feather_point))[2]
736 spline, resol, do_feather_isect, r_tot_feather_point);
740 spline, resol, do_feather_isect, r_tot_feather_point);
749 float(*feather)[2], (*fp)[2];
752 for (i = 0; i < spline->
tot_point; i++) {
759 feather = fp =
MEM_mallocN(tot *
sizeof(*feather),
"mask spline feather points");
761 for (i = 0; i < spline->
tot_point; i++) {
773 for (j = 0; j < point->
tot_uw; j++) {
774 float u = point->
uw[j].
u;
786 *r_tot_feather_point = tot;
796 unsigned int *r_tot_feather_point)
801 feather = fp =
MEM_callocN(2 * resol *
sizeof(
float),
"mask point spline feather diff points");
803 for (
uint i = 0; i < resol; i++, fp += 2) {
804 float u = (
float)(i % resol) / resol, weight;
811 fp[0] = co[0] + n[0] * weight;
812 fp[1] = co[1] + n[1] * weight;
815 *r_tot_feather_point = resol;
824 unsigned int *r_tot_diff_point)
829 float *diff_points, *fp;
840 *r_tot_diff_point = resol + 1;
841 diff_points = fp =
MEM_callocN(
sizeof(
float[2]) * (resol + 1),
"mask segment vets");
843 for (j = 0; j < 2; j++) {
846 bezt_next->
vec[0][j],
847 bezt_next->
vec[1][j],
860 float parent_matrix[3][3];
874 masklay, ctime, &masklay_shape_a, &masklay_shape_b))) {
877 printf(
"%s: exact %d %d (%d)\n",
881 masklay_shape_a->
frame);
885 else if (found == 2) {
886 float w = masklay_shape_b->
frame - masklay_shape_a->
frame;
888 printf(
"%s: tween %d %d (%d %d)\n",
892 masklay_shape_a->
frame,
893 masklay_shape_b->
frame);
896 masklay, masklay_shape_a, masklay_shape_b, (ctime - masklay_shape_a->
frame) /
w);
909 bool need_handle_recalc =
false;
911 for (
int i = 0; i < spline->
tot_point; i++) {
915 *point_deform = *point;
919 need_handle_recalc =
true;
925 if (need_handle_recalc) {
926 for (
int i = 0; i < spline->
tot_point; i++) {
942 mask_layer = mask_layer->next) {
953 mask_layer = mask_layer->next) {
957 if (is_depsgraph_active) {
960 *masklay_eval =
mask->masklayers.first;
961 masklay_orig !=
NULL;
962 masklay_orig = masklay_orig->next, masklay_eval = masklay_eval->next) {
963 for (
MaskSpline *spline_orig = masklay_orig->splines.first,
964 *spline_eval = masklay_eval->splines.first;
966 spline_orig = spline_orig->next, spline_eval = spline_eval->next) {
967 for (
int i = 0; i < spline_eval->tot_point; i++) {
970 point_orig->
bezt = point_eval->
bezt;
typedef float(TangentPoint)[2]
void BKE_curve_forward_diff_bezier(float q0, float q1, float q2, float q3, float *p, int it, int stride)
void BKE_mask_layer_shape_to_mask(struct MaskLayer *masklay, struct MaskLayerShape *masklay_shape)
int BKE_mask_layer_shape_find_frame_range(struct MaskLayer *masklay, const float frame, struct MaskLayerShape **r_masklay_shape_a, struct MaskLayerShape **r_masklay_shape_b)
void BKE_mask_calc_handle_point(struct MaskSpline *spline, struct MaskSplinePoint *point)
void BKE_mask_layer_shape_to_mask_interp(struct MaskLayer *masklay, struct MaskLayerShape *masklay_shape_a, struct MaskLayerShape *masklay_shape_b, const float fac)
void BKE_mask_point_free(struct MaskSplinePoint *point)
void BKE_mask_spline_ensure_deform(struct MaskSpline *spline)
void BKE_mask_layer_calc_handles(struct MaskLayer *masklay)
struct MaskSplinePoint * BKE_mask_spline_point_array_from_point(struct MaskSpline *spline, const struct MaskSplinePoint *point_ref)
void BKE_mask_point_parent_matrix_get(struct MaskSplinePoint *point, float ctime, float parent_matrix[3][3])
void BKE_mask_point_normal(struct MaskSpline *spline, struct MaskSplinePoint *point, float u, float n[2])
void BKE_mask_point_segment_co(struct MaskSpline *spline, struct MaskSplinePoint *point, float u, float co[2])
struct MaskSplinePoint * BKE_mask_spline_point_array(struct MaskSpline *spline)
float BKE_mask_point_weight_scalar(struct MaskSpline *spline, struct MaskSplinePoint *point, const float u)
struct BezTriple * BKE_mask_spline_point_next_bezt(struct MaskSpline *spline, struct MaskSplinePoint *points_array, struct MaskSplinePoint *point)
float BKE_mask_point_weight(struct MaskSpline *spline, struct MaskSplinePoint *point, const float u)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE float max_ff(float a, float b)
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
bool isect_seg_seg_v2_simple(const float v1[2], const float v2[2], const float v3[2], const float v4[2])
int isect_seg_seg_v2_point(const float v0[2], const float v1[2], const float v2[2], const float v3[2], float vi[2])
void mul_m3_v2(const float m[3][3], float r[2])
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void madd_v2_v2v2fl(float r[2], const float a[2], const float b[2], float f)
MINLINE void mul_v2_fl(float r[2], float f)
MINLINE void copy_v2_v2(float r[2], const float a[2])
void minmax_v2v2_v2(float min[2], float max[2], const float vec[2])
MINLINE void add_v2_v2(float r[2], const float a[2])
void dist_ensure_v2_v2fl(float v1[2], const float v2[2], const float dist)
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE float len_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE float normalize_v2(float r[2])
#define INIT_MINMAX2(min, max)
struct Depsgraph Depsgraph
bool DEG_is_active(const struct Depsgraph *depsgraph)
void DEG_debug_print_eval(struct Depsgraph *depsgraph, const char *function_name, const char *object_name, const void *object_address)
float DEG_get_ctime(const Depsgraph *graph)
struct ID * DEG_get_original_id(struct ID *id)
@ MASK_SPLINE_OFFSET_SMOOTH
@ MASK_SPLINE_OFFSET_EVEN
@ MASK_SPLINE_NOINTERSECT
Object is a sort of wrapper for general info.
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei width
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei height
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
ATTR_WARN_UNUSED_RESULT const BMVert * v2
void jump(const btVector3 &v=btVector3(0, 0, 0))
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
const Depsgraph * depsgraph
void(* MEM_freeN)(void *vmemh)
void *(* MEM_dupallocN)(const void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
float(* BKE_mask_spline_differentiate_with_resolution(MaskSpline *spline, const unsigned int resol, unsigned int *r_tot_diff_point))[2]
static void feather_bucket_get_diagonal(FeatherEdgesBucket *buckets, int start_bucket_index, int end_bucket_index, int buckets_per_side, FeatherEdgesBucket **r_diagonal_bucket_a, FeatherEdgesBucket **r_diagonal_bucket_b)
static float(* mask_spline_feather_differentiated_points_with_resolution__double(MaskSpline *spline, const unsigned int resol, const bool do_feather_isect, unsigned int *r_tot_feather_point))[2]
float(* BKE_mask_spline_feather_points(MaskSpline *spline, int *r_tot_feather_point))[2]
void BKE_mask_layer_evaluate_animation(MaskLayer *masklay, const float ctime)
int BKE_mask_spline_differentiate_calc_total(const MaskSpline *spline, const unsigned int resol)
void BKE_mask_eval_update(struct Depsgraph *depsgraph, Mask *mask)
static void mask_evaluate_apply_point_parent(MaskSplinePoint *point, float ctime)
float * BKE_mask_point_segment_feather_diff(MaskSpline *spline, MaskSplinePoint *point, int width, int height, unsigned int *r_tot_feather_point)
unsigned int BKE_mask_spline_feather_resolution(MaskSpline *spline, int width, int height)
void BKE_mask_spline_feather_collapse_inner_loops(MaskSpline *spline, float(*feather_points)[2], const unsigned int tot_feather_point)
void BKE_mask_eval_animation(struct Depsgraph *depsgraph, Mask *mask)
float(* BKE_mask_spline_differentiate(MaskSpline *spline, int width, int height, unsigned int *r_tot_diff_point))[2]
static void feather_bucket_check_intersect(float(*feather_points)[2], int tot_feather_point, FeatherEdgesBucket *bucket, int cur_a, int cur_b)
float * BKE_mask_point_segment_diff(MaskSpline *spline, MaskSplinePoint *point, int width, int height, unsigned int *r_tot_diff_point)
void BKE_mask_layer_evaluate_deform(MaskLayer *masklay, const float ctime)
struct FeatherEdgesBucket FeatherEdgesBucket
static float(* mask_spline_feather_differentiated_points_with_resolution__even(MaskSpline *spline, const unsigned int resol, const bool do_feather_isect, unsigned int *r_tot_feather_point))[2]
static void feather_bucket_add_edge(FeatherEdgesBucket *bucket, int start, int end)
static int feather_bucket_index_from_coord(const float co[2], const float min[2], const float bucket_scale[2], const int buckets_per_side)
unsigned int BKE_mask_spline_resolution(MaskSpline *spline, int width, int height)
float(* BKE_mask_spline_feather_differentiated_points_with_resolution(MaskSpline *spline, const unsigned int resol, const bool do_feather_isect, unsigned int *r_tot_feather_point))[2]
MaskSplinePoint * points_deform
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)