Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/colortools.c
| Show First 20 Lines • Show All 290 Lines • ▼ Show 20 Lines | void curvemap_reset(CurveMap *cuma, const rctf *clipr, int preset, int slope) | ||||
| switch (preset) { | switch (preset) { | ||||
| case CURVE_PRESET_LINE: | case CURVE_PRESET_LINE: | ||||
| cuma->curve[0].x = clipr->xmin; | cuma->curve[0].x = clipr->xmin; | ||||
| cuma->curve[0].y = clipr->ymax; | cuma->curve[0].y = clipr->ymax; | ||||
| cuma->curve[1].x = clipr->xmax; | cuma->curve[1].x = clipr->xmax; | ||||
| cuma->curve[1].y = clipr->ymin; | cuma->curve[1].y = clipr->ymin; | ||||
| if (slope == CURVEMAP_SLOPE_POS_NEG) { | if (slope == CURVEMAP_SLOPE_POS_NEG) { | ||||
| cuma->curve[0].flag |= CUMA_VECTOR; | cuma->curve[0].flag |= CUMA_HANDLE_VECTOR; | ||||
| cuma->curve[1].flag |= CUMA_VECTOR; | cuma->curve[1].flag |= CUMA_HANDLE_VECTOR; | ||||
| } | } | ||||
| break; | break; | ||||
| case CURVE_PRESET_SHARP: | case CURVE_PRESET_SHARP: | ||||
| cuma->curve[0].x = 0; | cuma->curve[0].x = 0; | ||||
| cuma->curve[0].y = 1; | cuma->curve[0].y = 1; | ||||
| cuma->curve[1].x = 0.25; | cuma->curve[1].x = 0.25; | ||||
| cuma->curve[1].y = 0.50; | cuma->curve[1].y = 0.50; | ||||
| cuma->curve[2].x = 0.75; | cuma->curve[2].x = 0.75; | ||||
| ▲ Show 20 Lines • Show All 80 Lines • ▼ Show 20 Lines | void curvemap_reset(CurveMap *cuma, const rctf *clipr, int preset, int slope) | ||||
| } | } | ||||
| if (cuma->table) { | if (cuma->table) { | ||||
| MEM_freeN(cuma->table); | MEM_freeN(cuma->table); | ||||
| cuma->table = NULL; | cuma->table = NULL; | ||||
| } | } | ||||
| } | } | ||||
| /* if type==1: vector, else auto */ | /** | ||||
| void curvemap_sethandle(CurveMap *cuma, int type) | * \param type: eBezTriple_Handle | ||||
| */ | |||||
| void curvemap_handle_set(CurveMap *cuma, int type) | |||||
| { | { | ||||
| int a; | int a; | ||||
| for (a = 0; a < cuma->totpoint; a++) { | for (a = 0; a < cuma->totpoint; a++) { | ||||
| if (cuma->curve[a].flag & CUMA_SELECT) { | if (cuma->curve[a].flag & CUMA_SELECT) { | ||||
| if (type) cuma->curve[a].flag |= CUMA_VECTOR; | cuma->curve[a].flag &= ~(CUMA_HANDLE_VECTOR | CUMA_HANDLE_AUTO_ANIM); | ||||
| else cuma->curve[a].flag &= ~CUMA_VECTOR; | if (type == HD_VECT) { | ||||
| cuma->curve[a].flag |= CUMA_HANDLE_VECTOR; | |||||
| } | |||||
| else if (type == HD_AUTO_ANIM) { | |||||
| cuma->curve[a].flag |= CUMA_HANDLE_AUTO_ANIM; | |||||
| } | |||||
| else { | |||||
| /* pass */ | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /* *********************** Making the tables and display ************** */ | /* *********************** Making the tables and display ************** */ | ||||
| /** | /** | ||||
| * reduced copy of #calchandleNurb_intern code in curve.c | * reduced copy of #calchandleNurb_intern code in curve.c | ||||
| ▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | #define p2_h2 ((p2) + 3) | ||||
| sub_v2_v2v2(dvec_b, p3, p2); | sub_v2_v2v2(dvec_b, p3, p2); | ||||
| len_a = len_v2(dvec_a); | len_a = len_v2(dvec_a); | ||||
| len_b = len_v2(dvec_b); | len_b = len_v2(dvec_b); | ||||
| if (len_a == 0.0f) len_a = 1.0f; | if (len_a == 0.0f) len_a = 1.0f; | ||||
| if (len_b == 0.0f) len_b = 1.0f; | if (len_b == 0.0f) len_b = 1.0f; | ||||
| if (bezt->h1 == HD_AUTO || bezt->h2 == HD_AUTO) { /* auto */ | if (ELEM(bezt->h1, HD_AUTO, HD_AUTO_ANIM) || ELEM(bezt->h2, HD_AUTO, HD_AUTO_ANIM)) { /* auto */ | ||||
| float tvec[2]; | float tvec[2]; | ||||
| tvec[0] = dvec_b[0] / len_b + dvec_a[0] / len_a; | tvec[0] = dvec_b[0] / len_b + dvec_a[0] / len_a; | ||||
| tvec[1] = dvec_b[1] / len_b + dvec_a[1] / len_a; | tvec[1] = dvec_b[1] / len_b + dvec_a[1] / len_a; | ||||
| len = len_v2(tvec) * 2.5614f; | len = len_v2(tvec) * 2.5614f; | ||||
| if (len != 0.0f) { | if (len != 0.0f) { | ||||
| if (bezt->h1 == HD_AUTO) { | if (ELEM(bezt->h1, HD_AUTO, HD_AUTO_ANIM)) { | ||||
| len_a /= len; | len_a /= len; | ||||
| madd_v2_v2v2fl(p2_h1, p2, tvec, -len_a); | madd_v2_v2v2fl(p2_h1, p2, tvec, -len_a); | ||||
| if ((bezt->h1 == HD_AUTO_ANIM) && next && prev) { /* keep horizontal if extrema */ | |||||
| const float ydiff1 = prev->vec[1][1] - bezt->vec[1][1]; | |||||
| const float ydiff2 = next->vec[1][1] - bezt->vec[1][1]; | |||||
| if ((ydiff1 <= 0.0f && ydiff2 <= 0.0f) || | |||||
| (ydiff1 >= 0.0f && ydiff2 >= 0.0f)) | |||||
| { | |||||
| bezt->vec[0][1] = bezt->vec[1][1]; | |||||
| } | |||||
| else { /* handles should not be beyond y coord of two others */ | |||||
| if (ydiff1 <= 0.0f) { | |||||
| if (prev->vec[1][1] > bezt->vec[0][1]) { | |||||
| bezt->vec[0][1] = prev->vec[1][1]; | |||||
| } | |||||
| } | |||||
| else { | |||||
| if (prev->vec[1][1] < bezt->vec[0][1]) { | |||||
| bezt->vec[0][1] = prev->vec[1][1]; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | } | ||||
| if (bezt->h2 == HD_AUTO) { | if (ELEM(bezt->h2, HD_AUTO, HD_AUTO_ANIM)) { | ||||
| len_b /= len; | len_b /= len; | ||||
| madd_v2_v2v2fl(p2_h2, p2, tvec, len_b); | madd_v2_v2v2fl(p2_h2, p2, tvec, len_b); | ||||
| if ((bezt->h2 == HD_AUTO_ANIM) && next && prev) { /* keep horizontal if extrema */ | |||||
| const float ydiff1 = prev->vec[1][1] - bezt->vec[1][1]; | |||||
| const float ydiff2 = next->vec[1][1] - bezt->vec[1][1]; | |||||
| if ((ydiff1 <= 0.0f && ydiff2 <= 0.0f)|| | |||||
| (ydiff1 >= 0.0f && ydiff2 >= 0.0f)) | |||||
| { | |||||
| bezt->vec[2][1] = bezt->vec[1][1]; | |||||
| } | |||||
| else { /* handles should not be beyond y coord of two others */ | |||||
| if (ydiff1 <= 0.0f) { | |||||
| if (next->vec[1][1] < bezt->vec[2][1]) { | |||||
| bezt->vec[2][1] = next->vec[1][1]; | |||||
| } | |||||
| } | |||||
| else { | |||||
| if (next->vec[1][1] > bezt->vec[2][1]) { | |||||
| bezt->vec[2][1] = next->vec[1][1]; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| if (bezt->h1 == HD_VECT) { /* vector */ | if (bezt->h1 == HD_VECT) { /* vector */ | ||||
| madd_v2_v2v2fl(p2_h1, p2, dvec_a, -1.0f / 3.0f); | madd_v2_v2v2fl(p2_h1, p2, dvec_a, -1.0f / 3.0f); | ||||
| } | } | ||||
| if (bezt->h2 == HD_VECT) { | if (bezt->h2 == HD_VECT) { | ||||
| ▲ Show 20 Lines • Show All 52 Lines • ▼ Show 20 Lines | static void curvemap_make_table(CurveMap *cuma, const rctf *clipr) | ||||
| /* hrmf... we now rely on blender ipo beziers, these are more advanced */ | /* hrmf... we now rely on blender ipo beziers, these are more advanced */ | ||||
| bezt = MEM_callocN(cuma->totpoint * sizeof(BezTriple), "beztarr"); | bezt = MEM_callocN(cuma->totpoint * sizeof(BezTriple), "beztarr"); | ||||
| for (a = 0; a < cuma->totpoint; a++) { | for (a = 0; a < cuma->totpoint; a++) { | ||||
| cuma->mintable = min_ff(cuma->mintable, cmp[a].x); | cuma->mintable = min_ff(cuma->mintable, cmp[a].x); | ||||
| cuma->maxtable = max_ff(cuma->maxtable, cmp[a].x); | cuma->maxtable = max_ff(cuma->maxtable, cmp[a].x); | ||||
| bezt[a].vec[1][0] = cmp[a].x; | bezt[a].vec[1][0] = cmp[a].x; | ||||
| bezt[a].vec[1][1] = cmp[a].y; | bezt[a].vec[1][1] = cmp[a].y; | ||||
| if (cmp[a].flag & CUMA_VECTOR) | if (cmp[a].flag & CUMA_HANDLE_VECTOR) { | ||||
| bezt[a].h1 = bezt[a].h2 = HD_VECT; | bezt[a].h1 = bezt[a].h2 = HD_VECT; | ||||
| else | } | ||||
| else if (cmp[a].flag & CUMA_HANDLE_AUTO_ANIM) { | |||||
| bezt[a].h1 = bezt[a].h2 = HD_AUTO_ANIM; | |||||
| } | |||||
| else { | |||||
| bezt[a].h1 = bezt[a].h2 = HD_AUTO; | bezt[a].h1 = bezt[a].h2 = HD_AUTO; | ||||
| } | } | ||||
| } | |||||
| const BezTriple *bezt_prev = NULL; | const BezTriple *bezt_prev = NULL; | ||||
| for (a = 0; a < cuma->totpoint; a++) { | for (a = 0; a < cuma->totpoint; a++) { | ||||
| const BezTriple *bezt_next = (a != cuma->totpoint - 1) ? &bezt[a + 1] : NULL; | const BezTriple *bezt_next = (a != cuma->totpoint - 1) ? &bezt[a + 1] : NULL; | ||||
| calchandle_curvemap(&bezt[a], bezt_prev, bezt_next); | calchandle_curvemap(&bezt[a], bezt_prev, bezt_next); | ||||
| bezt_prev = &bezt[a]; | bezt_prev = &bezt[a]; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 212 Lines • ▼ Show 20 Lines | void curvemapping_changed(CurveMapping *cumap, const bool rem_doubles) | ||||
| /* remove doubles, threshold set on 1% of default range */ | /* remove doubles, threshold set on 1% of default range */ | ||||
| if (rem_doubles && cuma->totpoint > 2) { | if (rem_doubles && cuma->totpoint > 2) { | ||||
| for (a = 0; a < cuma->totpoint - 1; a++) { | for (a = 0; a < cuma->totpoint - 1; a++) { | ||||
| dx = cmp[a].x - cmp[a + 1].x; | dx = cmp[a].x - cmp[a + 1].x; | ||||
| dy = cmp[a].y - cmp[a + 1].y; | dy = cmp[a].y - cmp[a + 1].y; | ||||
| if (sqrtf(dx * dx + dy * dy) < thresh) { | if (sqrtf(dx * dx + dy * dy) < thresh) { | ||||
| if (a == 0) { | if (a == 0) { | ||||
| cmp[a + 1].flag |= CUMA_VECTOR; | cmp[a + 1].flag |= CUMA_HANDLE_VECTOR; | ||||
| if (cmp[a + 1].flag & CUMA_SELECT) | if (cmp[a + 1].flag & CUMA_SELECT) | ||||
| cmp[a].flag |= CUMA_SELECT; | cmp[a].flag |= CUMA_SELECT; | ||||
| } | } | ||||
| else { | else { | ||||
| cmp[a].flag |= CUMA_VECTOR; | cmp[a].flag |= CUMA_HANDLE_VECTOR; | ||||
| if (cmp[a].flag & CUMA_SELECT) | if (cmp[a].flag & CUMA_SELECT) | ||||
| cmp[a + 1].flag |= CUMA_SELECT; | cmp[a + 1].flag |= CUMA_SELECT; | ||||
| } | } | ||||
| break; /* we assume 1 deletion per edit is ok */ | break; /* we assume 1 deletion per edit is ok */ | ||||
| } | } | ||||
| } | } | ||||
| if (a != cuma->totpoint - 1) | if (a != cuma->totpoint - 1) | ||||
| curvemap_remove(cuma, 2); | curvemap_remove(cuma, 2); | ||||
| ▲ Show 20 Lines • Show All 653 Lines • Show Last 20 Lines | |||||