[Bf-blender-cvs] [d9992fb] soc-2014-nurbs: UV editor editing functionality (drag pts / knots, add trim, etc) is finally stable\! Commence cleanup\!
Jonathan deWerd
noreply at git.blender.org
Tue Aug 19 08:12:16 CEST 2014
Commit: d9992fbb53eb484bd738f8ceb3c0bb774b9cf5ef
Author: Jonathan deWerd
Date: Tue Aug 19 02:12:05 2014 -0400
Branches: soc-2014-nurbs
https://developer.blender.org/rBd9992fbb53eb484bd738f8ceb3c0bb774b9cf5ef
UV editor editing functionality (drag pts / knots, add trim, etc) is finally stable\! Commence cleanup\!
===================================================================
M source/blender/blenkernel/BKE_curve.h
M source/blender/blenkernel/intern/curve.cpp
M source/blender/editors/curve/editcurve.c
M source/blender/editors/include/UI_resources.h
M source/blender/editors/interface/resources.c
M source/blender/editors/io/io_rhino_import.cpp
M source/blender/editors/space_image/image_intern.h
M source/blender/editors/space_image/image_ops.c
M source/blender/editors/space_image/space_image.c
M source/blender/editors/transform/transform_conversions.c
M source/blender/editors/transform/transform_generics.c
M source/blender/editors/transform/transform_ops.c
M source/blender/editors/uvedit/uvedit_draw.c
M source/blender/editors/uvedit/uvedit_intern.h
M source/blender/editors/uvedit/uvedit_ops.c
M source/blender/makesdna/DNA_curve_types.h
M source/blender/makesdna/DNA_userdef_types.h
M source/blender/makesrna/intern/rna_userdef.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index 589b56b..44fe516 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -191,7 +191,7 @@ void BKE_nurb_makeFaces(struct Nurb *nu, float *coord_array, int rowstride, int
void BKE_nurb_makeCurve(struct Nurb *nu, float *coord_array, float *tilt_array, float *radius_array, float *weight_array, int resolu, int stride);
struct GridMesh *BKE_nurb_compute_trimmed_GridMesh(struct Nurb* nu);
void BKE_nurb_compute_trimmed_UV_mesh(struct Nurb* nu);
-void BKE_nurb_clear_cached_UV_mesh(struct Nurb* nu, bool free_mem);
+void BKE_nurbs_cached_UV_mesh_clear(struct Nurb* nu, bool free_mem);
void BKE_nurb_make_displist(struct Nurb *nurb, struct DispList *dl);
void BKE_surf_to_mesh(struct Object *surf);
diff --git a/source/blender/blenkernel/intern/curve.cpp b/source/blender/blenkernel/intern/curve.cpp
index f04f34b..1858e3d 100644
--- a/source/blender/blenkernel/intern/curve.cpp
+++ b/source/blender/blenkernel/intern/curve.cpp
@@ -151,6 +151,7 @@ void BKE_curve_editNurb_free(Curve *cu)
void BKE_nurb_knot_calc_u(Nurb *nu)
{
int pnts=nu->pntsu, order=nu->orderu;
+ BKE_nurbs_editKnot_destroy(nu);
float *knots = (float*)MEM_mallocN(sizeof(float)*(pnts+2*order), "NURB_knots_u");
BKE_bspline_knot_calc(nu->flagu, pnts, order, knots);
if (nu->knotsu) MEM_freeN(nu->knotsu);
@@ -160,6 +161,7 @@ void BKE_nurb_knot_calc_u(Nurb *nu)
void BKE_nurb_knot_calc_v(Nurb *nu)
{
int pnts=nu->pntsv, order=nu->orderv;
+ BKE_nurbs_editKnot_destroy(nu);
float *knots = (float*)MEM_mallocN(sizeof(float)*(pnts+2*order), "NURB_knots_v");
BKE_bspline_knot_calc(nu->flagv, pnts, order, knots);
if (nu->knotsv) MEM_freeN(nu->knotsv);
@@ -475,46 +477,48 @@ void BKE_nurbs_editKnot_propagate_ek2nurb(struct Nurb *nu) {
if (!ek) return;
int ek_knotu=0, ek_knotv=0;
- for (int i=0; i<ek->num_breaksu; i++) ek_knotu += ek->multiplicityu[i];
+ for (int i=0; i<ek->num_breaksu; i++) ek_knotu += ek->breaksu[i].multiplicity;
BLI_assert(KNOTSU(nu)==ek_knotu);
for (int i=0,flatidx=0; i<ek->num_breaksu; i++) {
- int mult = ek->multiplicityu[i];
- float breakpt = ek->breaksu[i];
+ int mult = ek->breaksu[i].multiplicity;
+ float breakpt = ek->breaksu[i].loc;
for (int j=0; j<mult; j++)
nu->knotsu[flatidx++] = breakpt;
}
if (ek->num_breaksv) {
- for (int i=0; i<ek->num_breaksv; i++) ek_knotv += ek->multiplicityv[i];
+ for (int i=0; i<ek->num_breaksv; i++) ek_knotv += ek->breaksv[i].multiplicity;
BLI_assert(KNOTSV(nu)==ek_knotv);
for (int i=0,flatidx=0; i<ek->num_breaksv; i++) {
- int mult = ek->multiplicityv[i];
- float breakpt = ek->breaksv[i];
+ int mult = ek->breaksv[i].multiplicity;
+ float breakpt = ek->breaksv[i].loc;
for (int j=0; j<mult; j++)
nu->knotsv[flatidx++] = breakpt;
}
}
}
-/* Maintains flags for knots at a given location across knot update */
+/* Maintains flags for knots at a given location across knot update
+ * Also clears NurbTrim SELECT flag whenever it allocates a new editknot (which
+ * happens on editmode enter) */
void BKE_nurbs_editKnot_propagate_nurb2ek(struct Nurb *nu) {
NurbEditKnot *ek = nu->editknot;
NurbEditKnot old_ek;
+ NurbTrim *nt;
bool update_ek;
if (ek) {
old_ek = *ek;
update_ek = true;
} else {
ek = nu->editknot = (NurbEditKnot*)MEM_callocN(sizeof(*ek),"NURBS_editknot_prop");
+ for (nt=(NurbTrim*)nu->trims.first; nt; nt=nt->next) {
+ nt->flag &= ~SELECT;
+ }
update_ek = false;
}
- int bytes_per_knot = sizeof(float) + sizeof(int) + sizeof(int);
int capu = ek->capu = KNOTSU(nu);
- uint8_t *ubuf = (uint8_t*)MEM_callocN(capu*bytes_per_knot, "NURBS_editknot_u");
- ek->breaksu = (float*)ubuf;
- ek->multiplicityu = (int*)(ubuf + capu*sizeof(float));
- ek->flagu = (int*)(ubuf + capu*sizeof(float) + capu*sizeof(int));
+ ek->breaksu = (NurbBreakpt*)MEM_callocN(capu*sizeof(NurbBreakpt), "NURBS_editknot_u");
float last_knot=INFINITY;
int old_idx=0, breakidx=-1;
for (int i=0; i<KNOTSU(nu); i++) {
@@ -524,13 +528,13 @@ void BKE_nurbs_editKnot_propagate_nurb2ek(struct Nurb *nu) {
last_knot = knot;
}
if (update_ek) { /* try to propagate SELECT etc from old ek to new ek */
- while (old_ek.breaksu[old_idx]<knot && old_idx<old_ek.num_breaksu)
+ while (old_ek.breaksu[old_idx].loc<knot && old_idx<old_ek.num_breaksu)
old_idx++;
- if (old_ek.breaksu[old_idx]==knot)
- ek->flagu[breakidx] = old_ek.flagu[old_idx];
+ if (old_ek.breaksu[old_idx].loc==knot)
+ ek->breaksu[breakidx].flag = old_ek.breaksu[old_idx].flag;
}
- ek->breaksu[breakidx] = knot;
- ek->multiplicityu[breakidx] += 1;
+ ek->breaksu[breakidx].loc = knot;
+ ek->breaksu[breakidx].multiplicity += 1;
}
ek->num_breaksu = breakidx+1;
@@ -541,10 +545,7 @@ void BKE_nurbs_editKnot_propagate_nurb2ek(struct Nurb *nu) {
ek->multiplicityv = NULL;
} else {
int capv = ek->capv = KNOTSV(nu);
- uint8_t *vbuf = (uint8_t*)MEM_callocN(capv*bytes_per_knot, "NURBS_editknot_v");
- ek->breaksv = (float*)vbuf;
- ek->multiplicityv = (int*)(vbuf + capv*sizeof(float));
- ek->flagv = (int*)(vbuf + capv*sizeof(float) + capv*sizeof(int));
+ ek->breaksv = (NurbBreakpt*)MEM_callocN(capv*sizeof(NurbBreakpt), "NURBS_editknot_v");
last_knot=INFINITY;
old_idx=0; breakidx=-1;
for (int i=0; i<KNOTSV(nu); i++) {
@@ -554,13 +555,13 @@ void BKE_nurbs_editKnot_propagate_nurb2ek(struct Nurb *nu) {
last_knot = knot;
}
if (update_ek) { /* try to propagate SELECT etc from old ek to new ek */
- while (old_ek.breaksv[old_idx]<knot && old_idx<old_ek.num_breaksv)
+ while (old_ek.breaksv[old_idx].loc<knot && old_idx<old_ek.num_breaksv)
old_idx++;
- if (old_ek.breaksv[old_idx]==knot)
- ek->flagv[breakidx] = old_ek.flagv[old_idx];
+ if (old_ek.breaksv[old_idx].loc==knot)
+ ek->breaksv[breakidx].flag = old_ek.breaksv[old_idx].flag;
}
- ek->breaksv[breakidx] = knot;
- ek->multiplicityv[breakidx] += 1;
+ ek->breaksv[breakidx].loc = knot;
+ ek->breaksv[breakidx].multiplicity += 1;
}
ek->num_breaksv = breakidx+1;
}
@@ -573,12 +574,12 @@ void BKE_nurbs_editKnot_propagate_nurb2ek(struct Nurb *nu) {
// printf("U: Propagated {");
// for (int i=0; i<KNOTSU(nu); i++) printf("%3.1f ",nu->knotsu[i]);
// printf("} -> {");
-// for (int i=0; i<ek->num_breaksu; i++) printf("%3.1fx%i ",ek->breaksu[i],ek->multiplicityu[i]);
+// for (int i=0; i<ek->num_breaksu; i++) printf("%3.1fx%i ",ek->breaksu[i].loc,ek->breaksu[i].multiplicity);
// printf("}\n");
// printf("V: Propagated {");
// for (int i=0; i<KNOTSV(nu); i++) printf("%3.1f ",nu->knotsv[i]);
// printf("} -> {");
-// for (int i=0; i<ek->num_breaksv; i++) printf("%3.1fx%i ",ek->breaksv[i],ek->multiplicityv[i]);
+// for (int i=0; i<ek->num_breaksv; i++) printf("%3.1fx%i ",ek->breaksv[i].loc,ek->breaksv[i].multiplicity);
// printf("}\n");
}
@@ -747,7 +748,7 @@ Nurb *BKE_nurb_duplicate(Nurb *nu)
NurbTrim *dup_nt = BKE_nurbTrim_duplicate(nt);
BLI_addtail(&newnu->trims, dup_nt);
}
- BKE_nurb_clear_cached_UV_mesh(newnu,false);
+ BKE_nurbs_cached_UV_mesh_clear(newnu,false);
newnu->editknot = NULL;
return newnu;
@@ -775,7 +776,7 @@ Nurb *BKE_nurb_copy(Nurb *src, int pntsu, int pntsv)
NurbTrim *dup_nt = BKE_nurbTrim_duplicate(nt);
BLI_addtail(&newnu->trims, dup_nt);
}
- BKE_nurb_clear_cached_UV_mesh(newnu,false);
+ BKE_nurbs_cached_UV_mesh_clear(newnu,false);
newnu->editknot = NULL;
return newnu;
@@ -928,7 +929,7 @@ void BKE_nurb_points_add(Nurb *nu, int number)
}
nu->pntsu += number;
- BKE_nurb_clear_cached_UV_mesh(nu, true);
+ BKE_nurbs_cached_UV_mesh_clear(nu, true);
}
void BKE_nurb_bezierPoints_add(Nurb *nu, int number)
@@ -943,7 +944,7 @@ void BKE_nurb_bezierPoints_add(Nurb *nu, int number)
}
nu->pntsu += number;
- BKE_nurb_clear_cached_UV_mesh(nu, true);
+ BKE_nurbs_cached_UV_mesh_clear(nu, true);
}
@@ -4378,7 +4379,7 @@ void BKE_nurb_compute_trimmed_UV_mesh(struct Nurb* nu) {
delete gm;
}
-void BKE_nurb_clear_cached_UV_mesh(struct Nurb* nu, bool free_mem) {
+void BKE_nurbs_cached_UV_mesh_clear(struct Nurb* nu, bool free_mem) {
nu->UV_verts_count = nu->UV_tri_count = 0;
if (free_mem) {
if (nu->UV_verts) MEM_freeN(nu->UV_verts);
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 06358da..2943205 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -1328,11 +1328,14 @@ static void remap_hooks_and_vertex_parents(Object *obedit)
/* load editNurb in object */
void load_editNurb(Object *obedit)
{
- if (obedit == NULL) return;
- if (!ELEM(obedit->type, OB_CURVE, OB_SURF)) return;
Curve *cu = obedit->data;
ListBase *editnurb = object_editcurve_get(obedit);
- // for nu in editnurb: if (nu->type == CU_NURBS) BKE_nurb_order_clamp_u(nu);
+ Nurb *nu;
+ if (obedit == NULL) return;
+ if (!ELEM(obedit->type, OB_CURVE, OB_SURF)) return;
+ for (nu=(Nurb*)editnurb->first; nu; nu=nu->next) {
+ BKE_nurbs_editKnot_propagate_ek2nurb(nu);
+ }
BKE_nurbList_duplicate(&cu->nurb, editnurb);
calc_shapeKeys(obedit);
ED_curve_updateAnimPaths(obedit->data);
@@ -5102,7 +5105,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
newbp->f1 |= SELECT;
newnu = (Nurb *)MEM_mallocN(sizeof(Nurb), "addvert_Nurb newnu");
- BKE_nurb_clear_cached_UV_mesh(newnu, false);
+ BKE_nurbs_cached_UV_mesh_clear(newnu, false);
memcpy(newnu, nu, sizeof(Nurb));
BLI_addtail(&editnurb->nurbs, newnu);
newnu->bp = newbp;
diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h
index 2e78940..f62061d 100644
--- a/source/blender/editors/include/UI_resources.h
+++ b/source/blender/editors/include/UI_resources.h
@@ -280,6 +280,13 @@ enum {
TH_INFO_DEBUG,
TH_INFO_DEBUG_TEXT,
TH_VIEW_OVERLAY,
+
+ TH_NURB_TRIM_AND,
+ TH_NURB_TRIM_SUB,
+ TH_NURB_TRIM_ADD,
+ TH_NURB_SEL_TRIM_AND,
+ TH_NURB_SEL_TRIM_SUB,
+ TH_NURB_SEL_TRIM_ADD
};
/* XXX WARNING: previous is saved in file, so do not change order! */
diff --git a/source/blender/editors/interface/resources.c
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list