[Bf-blender-cvs] [b5a77c6] gsoc2016-improved_extrusion: Curves: fillet and chamfer
João Araújo
noreply at git.blender.org
Mon Aug 15 15:55:24 CEST 2016
Commit: b5a77c60a01220f6206b3a6942ce6325380c9301
Author: João Araújo
Date: Mon Aug 15 13:10:06 2016 +0100
Branches: gsoc2016-improved_extrusion
https://developer.blender.org/rBb5a77c60a01220f6206b3a6942ce6325380c9301
Curves: fillet and chamfer
Added support to fillet and chamfer cyclic splines.
Occasionaly, with no apparent reason, the following assertion fails
blender-build/blender/source/blender/blenlib/intern/BLI_ghash.c:458, ghash_insert_ex(), at '(gh->flag & GHASH_FLAG_ALLOW_DUPES) || (BLI_ghash_haskey(gh, key) == 0)
===================================================================
M source/blender/editors/curve/editcurve.c
===================================================================
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 3a5f2f8..35c0e09 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -8152,7 +8152,7 @@ static int curve_chamfer_exec(bContext *C, wmOperator *op)
/* check if handles are vector type! */
BezTriple *bezt = nu->bezt, *bezt1, *bezt2, *helper;
int selected_point = 0;
- for (int i = 1; i < nu->pntsu - 1; i++) {
+ for (int i = 1 - nu->flagu; i < nu->pntsu - 1 + nu->flagu; i++) {
bezt = &nu->bezt[i];
if (BEZT_ISSEL_ANY(bezt) && bezt->h1 == 2 && bezt->h2 == 2) {
bezt1 = MEM_callocN(sizeof(BezTriple), "curve_chamfer1");
@@ -8161,9 +8161,14 @@ static int curve_chamfer_exec(bContext *C, wmOperator *op)
selected_point = i;
BKE_nurb_bezierPoints_add(nu, 1);
- ED_curve_beztcpy(editnurb, &nu->bezt[selected_point + 1], &nu->bezt[selected_point], nu->pntsu - selected_point - 1);
- ED_curve_beztcpy(editnurb, &nu->bezt[selected_point], bezt1, 1);
- ED_curve_beztcpy(editnurb, &nu->bezt[selected_point + 1], bezt2, 1);
+ if (i != nu->pntsu - 1) {
+ ED_curve_beztcpy(editnurb, &nu->bezt[selected_point + 1], &nu->bezt[selected_point], nu->pntsu - selected_point - 1);
+ }
+ /* for these two a keyIndex_addBezt would be useful */
+ //ED_curve_beztcpy(editnurb, &nu->bezt[selected_point], bezt1, 1);
+ //ED_curve_beztcpy(editnurb, &nu->bezt[selected_point + 1], bezt2, 1);
+ memcpy(&nu->bezt[selected_point], bezt1, sizeof(BezTriple));
+ memcpy(&nu->bezt[selected_point + 1], bezt2, sizeof(BezTriple));
MEM_freeN(bezt1);
MEM_freeN(bezt2);
@@ -8171,28 +8176,28 @@ static int curve_chamfer_exec(bContext *C, wmOperator *op)
/* set the handles for the first chamfered triple */
float v[3];
bezt1 = &nu->bezt[selected_point];
- helper = &nu->bezt[selected_point - 1];
+ helper = &nu->bezt[(nu->pntsu + selected_point - 1) % nu->pntsu];
/* left handle */
sub_v3_v3v3(v, helper->vec[2], bezt1->vec[1]);
mul_v3_fl(v, 0.4 * len_v3(v));
copy_v3_v3(bezt1->vec[0], bezt1->vec[1]);
add_v3_v3(bezt1->vec[0], v);
/* right handle */
- bezt2 = &nu->bezt[selected_point + 1];
+ bezt2 = &nu->bezt[(nu->pntsu + selected_point + 1) % nu->pntsu];
sub_v3_v3v3(v, bezt2->vec[1], bezt1->vec[1]);
mul_v3_fl(v, 0.4 * len_v3(v));
copy_v3_v3(bezt1->vec[2], bezt1->vec[1]);
add_v3_v3(bezt1->vec[2], v);
/* second chamfered triple */
- helper = &nu->bezt[selected_point + 2];
+ helper = &nu->bezt[(nu->pntsu + selected_point + 2) % nu->pntsu];
/* left handle */
sub_v3_v3v3(v, bezt1->vec[1], bezt2->vec[1]);
mul_v3_fl(v, 0.4 * len_v3(v));
copy_v3_v3(bezt2->vec[0], bezt2->vec[1]);
add_v3_v3(bezt2->vec[0], v);
/* right handle */
- bezt2 = &nu->bezt[selected_point + 1];
+ bezt2 = &nu->bezt[(nu->pntsu + selected_point + 1) % nu->pntsu];
sub_v3_v3v3(v, helper->vec[0], bezt2->vec[1]);
mul_v3_fl(v, 0.4 * len_v3(v));
copy_v3_v3(bezt2->vec[2], bezt2->vec[1]);
@@ -8437,17 +8442,19 @@ static int curve_fillet_exec(bContext *C, wmOperator *op)
BezTriple *bezt = nu->bezt, *bezt1, *bezt2, *helper;
int selected_point = 0;
- for (int i = 0; i < nu->pntsu; i++) {
+ for (int i = 1 - nu->flagu; i < nu->pntsu - 1 + nu->flagu; i++) {
bezt = &nu->bezt[i];
if (BEZT_ISSEL_ANY(bezt) && bezt->h1 == 2 && bezt->h2 == 2) {
- bezt1 = MEM_callocN(sizeof(BezTriple), "curve_chamfer1");
- bezt2 = MEM_callocN(sizeof(BezTriple), "curve_chamfer2");
+ bezt1 = MEM_callocN(sizeof(BezTriple), "curve_fillet1");
+ bezt2 = MEM_callocN(sizeof(BezTriple), "curve_fillet2");
sub_v3_v3v3(v1, bezt->vec[1], bezt->vec[0]);
normalize_v3(v1);
sub_v3_v3v3(v2, bezt->vec[1], bezt->vec[2]);
normalize_v3(v2);
float angle = DEG2RAD(90) - angle_normalized_v3v3(v1, v2) / 2;
if (angle < 1.0e-4) {
+ MEM_freeN(bezt1);
+ MEM_freeN(bezt2);
BKE_report(op->reports, RPT_ERROR, "Lines cannot be filleted");
return OPERATOR_CANCELLED;
}
@@ -8455,9 +8462,14 @@ static int curve_fillet_exec(bContext *C, wmOperator *op)
selected_point = i;
BKE_nurb_bezierPoints_add(nu, 1);
- ED_curve_beztcpy(editnurb, &nu->bezt[selected_point + 1], &nu->bezt[selected_point], nu->pntsu - selected_point - 1);
- ED_curve_beztcpy(editnurb, &nu->bezt[selected_point], bezt1, 1);
- ED_curve_beztcpy(editnurb, &nu->bezt[selected_point + 1], bezt2, 1);
+ if (i != nu->pntsu - 1) {
+ ED_curve_beztcpy(editnurb, &nu->bezt[selected_point + 1], &nu->bezt[selected_point], nu->pntsu - selected_point - 1);
+ }
+ /* for these two a keyIndex_addBezt would be useful */
+ //ED_curve_beztcpy(editnurb, &nu->bezt[selected_point], bezt1, 1);
+ //ED_curve_beztcpy(editnurb, &nu->bezt[selected_point + 1], bezt2, 1);
+ memcpy(&nu->bezt[selected_point], bezt1, sizeof(BezTriple));
+ memcpy(&nu->bezt[selected_point + 1], bezt2, sizeof(BezTriple));
MEM_freeN(bezt1);
MEM_freeN(bezt2);
@@ -8465,7 +8477,7 @@ static int curve_fillet_exec(bContext *C, wmOperator *op)
/* set the handles for the first chamfered triple */
float v[3];
bezt1 = &nu->bezt[selected_point];
- helper = &nu->bezt[selected_point - 1];
+ helper = &nu->bezt[(nu->pntsu + selected_point - 1) % nu->pntsu];
/* left handle */
sub_v3_v3v3(v, helper->vec[2], bezt1->vec[1]);
mul_v3_fl(v, 0.4 * len_v3(v));
@@ -8473,9 +8485,9 @@ static int curve_fillet_exec(bContext *C, wmOperator *op)
add_v3_v3(bezt1->vec[0], v);
/* second chamfered triple */
- helper = &nu->bezt[selected_point + 2];
+ helper = &nu->bezt[(nu->pntsu + selected_point + 2) % nu->pntsu];
/* right handle */
- bezt2 = &nu->bezt[selected_point + 1];
+ bezt2 = &nu->bezt[(nu->pntsu + selected_point + 1) % nu->pntsu];
sub_v3_v3v3(v, helper->vec[0], bezt2->vec[1]);
mul_v3_fl(v, 0.4 * len_v3(v));
copy_v3_v3(bezt2->vec[2], bezt2->vec[1]);
More information about the Bf-blender-cvs
mailing list