Commit: 44b5e6c0df87191060eac1fd68f1a403a7274071
Author: Jonathan deWerd
Date:   Fri Aug 8 23:24:54 2014 -0400
Branches: soc-2014-nurbs
https://developer.blender.org/rB44b5e6c0df87191060eac1fd68f1a403a7274071

UV Edit Selection Propagation

===================================================================

M       source/blender/blenkernel/BKE_curve.h
M       source/blender/blenkernel/intern/curve.cpp
M       source/blender/blenloader/intern/readfile.c
M       source/blender/editors/io/io_rhino_import.cpp
M       source/blender/editors/uvedit/uvedit_draw.c
M       source/blender/makesdna/DNA_curve_types.h

===================================================================

diff --git a/source/blender/blenkernel/BKE_curve.h 
b/source/blender/blenkernel/BKE_curve.h
index a044c31..bb70dea 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -49,6 +49,7 @@ struct rctf;
 struct DispList;
 struct BPoint;
 struct NurbTrim;
+struct NurbEditKnot;
 struct GridMesh;
 
 typedef struct CurveCache {
@@ -154,6 +155,11 @@ void BKE_nurbs_surf_eval(float u, float v,
                                                 int pntsv, int orderv, float 
*V,
                                                 struct BPoint *P, int nd, 
struct BPoint *out, BSplineCacheU *ucache DEFAULT_NULL);
 
+struct NurbEditKnot* BKE_nurbs_editKnot_get(struct Nurb *nu); /* Creates 
editknot if necessary */
+void BKE_nurbs_editKnot_propagate_ek2nurb(struct Nurb *nu);
+void BKE_nurbs_editKnot_propagate_nurb2ek(struct Nurb *nu);
+void BKE_nurbs_editKnot_destroy(struct Nurb *nu);
+
 bool BKE_nurbList_index_get_co(struct ListBase *editnurb, const int index, 
float r_co[3]);
 
 int BKE_nurbList_verts_count(struct ListBase *nurb);
diff --git a/source/blender/blenkernel/intern/curve.cpp 
b/source/blender/blenkernel/intern/curve.cpp
index 993b465..7e2e63a 100644
--- a/source/blender/blenkernel/intern/curve.cpp
+++ b/source/blender/blenkernel/intern/curve.cpp
@@ -464,6 +464,111 @@ void BKE_curve_texspace_get(Curve *cu, float r_loc[3], 
float r_rot[3], float r_s
        if (r_size) copy_v3_v3(r_size, cu->size);
 }
 
+struct NurbEditKnot* BKE_nurbs_editKnot_get(struct Nurb *nu) {
+       if (nu->editknot) return nu->editknot;
+       int capu=KNOTSU(nu), capv=KNOTSV(nu);
+       NurbEditKnot* ek = nu->editknot = 
(NurbEditKnot*)MEM_mallocN(sizeof(NurbEditKnot),"NURBS_editknot");
+       int bytes_per_knot = sizeof(float) + sizeof(int) + sizeof(int);
+       uint8_t *ubuf = (uint8_t*)MEM_mallocN(capu*bytes_per_knot, 
"NURBS_editknot_u");
+       uint8_t *vbuf = (uint8_t*)MEM_mallocN(capv*bytes_per_knot, 
"NURBS_editknot_v");
+       ek->breaksu = (float*)ubuf;
+       ek->multiplicityu = (int*)(ubuf + capu*sizeof(float));
+       ek->flagu = (int*)(ubuf + capu*sizeof(float) + capu*sizeof(int));
+       ek->breaksv = (float*)vbuf;
+       ek->multiplicityv = (int*)(vbuf + capv*sizeof(float));
+       ek->flagv = (int*)(vbuf + capv*sizeof(float) + capv*sizeof(int));
+       return ek;
+}
+
+void BKE_nurbs_editKnot_propagate_ek2nurb(struct Nurb *nu) {
+       NurbEditKnot *ek = nu->editknot;
+       if (!ek) return;
+       int ek_knotu=0, ek_knotv=0;
+
+       for (int i=0; i<ek->num_breaksu; i++) ek_knotu += ek->multiplicityu[i];
+       if (KNOTSU(nu)<ek_knotu || !nu->knotsu) {
+               if (nu->knotsu) MEM_freeN(nu->knotsu);
+               nu->knotsu = 
(float*)MEM_mallocN(sizeof(float)*ek_knotu,"NURBS_edk_prop_u");
+       }
+       for (int i=0,flatidx=0; i<ek->num_breaksu; i++) {
+               int mult = ek->multiplicityu[i];
+               float breakpt = ek->breaksu[i];
+               for (int j=0; j<mult; j++)
+                       nu->knotsu[flatidx++] = breakpt;
+       }
+
+       for (int i=0; i<ek->num_breaksv; i++) ek_knotv += ek->multiplicityv[i];
+       if (KNOTSV(nu)<ek_knotv || !nu->knotsv) {
+               if (nu->knotsv) MEM_freeN(nu->knotsv);
+               nu->knotsv = 
(float*)MEM_mallocN(sizeof(float)*ek_knotv,"NURBS_edk_prop_v");
+       }
+       for (int i=0,flatidx=0; i<ek->num_breaksv; i++) {
+               int mult = ek->multiplicityv[i];
+               float breakpt = ek->breaksv[i];
+               for (int j=0; j<mult; j++)
+                       nu->knotsv[flatidx++] = breakpt;
+       }
+}
+
+void BKE_nurbs_editKnot_propagate_nurb2ek(struct Nurb *nu) {
+       NurbEditKnot* ek = nu->editknot;
+       if (!ek) ek = nu->editknot = 
(NurbEditKnot*)MEM_callocN(sizeof(*ek),"NURBS_editknot_prop");
+       float *old_breaksu=ek->breaksu, *old_breaksv=ek->breaksv;
+       int *old_flagu=ek->flagu, *old_flagv=ek->flagv;
+       int old_idx=0, old_num_breaksu=ek->num_breaksu, 
old_num_breaksv=ek->num_breaksv;
+       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));
+       float last_knot=INFINITY; old_idx=0;
+       for (int i=0,breakidx=-1; i<KNOTSU(nu); i++) {
+               float knot = nu->knotsu[i];
+               if (knot!=last_knot) {
+                       breakidx += 1;
+                       last_knot = knot;
+               }
+               while (old_breaksu[old_idx]<knot && old_idx<old_num_breaksu) 
old_idx++;
+               if (old_breaksu[old_idx]==knot)
+                       ek->flagu[breakidx] = old_flagu[old_idx];
+               ek->breaksu[breakidx] = knot;
+               ek->multiplicityu[breakidx] += 1;
+       }
+
+       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));
+       last_knot=INFINITY; old_idx=0;
+       for (int i=0,breakidx=-1; i<KNOTSV(nu); i++) {
+               float knot = nu->knotsv[i];
+               if (knot!=last_knot) {
+                       breakidx += 1;
+                       last_knot = knot;
+               }
+               while (old_breaksv[old_idx]<knot && old_idx<old_num_breaksv) 
old_idx++;
+               if (old_breaksv[old_idx]==knot)
+                       ek->flagv[breakidx] = old_flagv[old_idx];
+               ek->breaksv[breakidx] = knot;
+               ek->multiplicityv[breakidx] += 1;
+       }
+
+       if (old_breaksu) MEM_freeN(old_breaksu);
+       if (old_breaksv) MEM_freeN(old_breaksv);
+}
+
+void BKE_nurbs_editKnot_destroy(struct Nurb *nu) {
+       NurbEditKnot* ek = nu->editknot;
+       if (!ek) return;
+       if (ek->breaksu) MEM_freeN(ek->breaksu);
+       if (ek->breaksv) MEM_freeN(ek->breaksv);
+       MEM_freeN(nu->editknot);
+       nu->editknot = NULL;
+}
+
 bool BKE_nurbList_index_get_co(ListBase *nurb, const int index, float r_co[3])
 {
        Nurb *nu;
@@ -3899,6 +4004,7 @@ bool BKE_curve_minmax(Curve *cu, bool use_radius, float 
min[3], float max[3])
        return (BLI_listbase_is_empty(nurb_lb) == false);
 }
 
+/* Fills cent with the median of the control points. Does not alter cu. */
 bool BKE_curve_center_median(Curve *cu, float cent[3])
 {
        ListBase *nurb_lb = BKE_curve_nurbs_get(cu);
@@ -3937,6 +4043,7 @@ bool BKE_curve_center_median(Curve *cu, float cent[3])
        return (total != 0);
 }
 
+/* Fills cent with the center of the AABB. Does not alter cu. */
 bool BKE_curve_center_bounds(Curve *cu, float cent[3])
 {
        float min[3], max[3];
diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index f87a927..ae535a9 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -3355,10 +3355,11 @@ static void direct_link_nurblist(FileData *fd, ListBase 
*nurblist)
                        switch_endian_knots(nu);
                }
 
-               /* Clear cached UV-space tessellation of trimmed surface */
+               /* Clear cached UV-space tessellation of trimmed surface & 
other runtime fields */
                nu->UV_tri_count = nu->UV_verts_count = 0;
                nu->UV_idxs = NULL;
                nu->UV_verts = NULL;
+               nu->editknot = NULL;
 
                /* Recurse to load trim curves */
                if (nu->flag & CU_TRIMMED) {
diff --git a/source/blender/editors/io/io_rhino_import.cpp 
b/source/blender/editors/io/io_rhino_import.cpp
index dac256d..d1822e6 100644
--- a/source/blender/editors/io/io_rhino_import.cpp
+++ b/source/blender/editors/io/io_rhino_import.cpp
@@ -34,6 +34,7 @@ extern "C" {
        #include "DNA_scene_types.h"
        #include "BLF_translation.h"
        #include "BLI_listbase.h"
+       #include "BLI_math.h"
        #include "BKE_context.h"
        #include "BKE_global.h"
        #include "BKE_main.h"
@@ -602,6 +603,12 @@ static Curve* rhino_import_nurbs_surf_start(bContext *C,
 }
 
 static void rhino_import_nurbs_surf_end(bContext *C) {
+       Curve *cu = (Curve*)CTX_data_edit_object(C)->data;
+       float cent[3];
+       BKE_curve_center_median(cu, cent);
+       copy_v3_v3(cu->loc, cent);
+       mul_v3_fl(cent, -1);
+       BKE_curve_translate(cu, cent, false);
        ED_object_editmode_exit(C, EM_FREEDATA);
        printf("nurbssurf done\n");
 }
diff --git a/source/blender/editors/uvedit/uvedit_draw.c 
b/source/blender/editors/uvedit/uvedit_draw.c
index fffee0a..10ad98d 100644
--- a/source/blender/editors/uvedit/uvedit_draw.c
+++ b/source/blender/editors/uvedit/uvedit_draw.c
@@ -66,6 +66,8 @@
 #include "UI_interface.h"
 #include "UI_view2d.h"
 
+#include "MEM_guardedalloc.h"
+
 #include "uvedit_intern.h"
 
 /* use editmesh tessface */
@@ -945,17 +947,15 @@ void draw_nurbuv(const struct bContext *C, SpaceImage 
*sima, ARegion *ar, Scene
                if (nu->knotsv[KNOTSV(nu)-1]>vmax) vmax = 
nu->knotsv[KNOTSV(nu)-1];
        }
        printf("\n");
-       umin = floor(umin);
-       vmin = floor(vmin);
-       umax = ceil(umax);
-       vmax = ceil(vmax);
+       umin = floor(umin)-1;
+       vmin = floor(vmin)-1;
+       umax = ceil(umax)+1;
+       vmax = ceil(vmax)+1;
        UI_view2d_view_to_region(&ar->v2d, umax, vmax, &xmax_region, 
&ymax_region);
 
        /******* (Normalized Coordinates) draw background grid *********/
-       UI_ThemeColorShade(TH_BACK, 30);
-       glRectf(umin, vmin, umax, vmax);
        glBegin(GL_LINES);
-       UI_ThemeColor(TH_GRID);
+       UI_ThemeColorShade(TH_GRID, 10);
        regionx2viewx = (cur.xmax-cur.xmin)/(mask.xmax-mask.xmin);
        regiony2viewy = (cur.ymax-cur.ymin)/(mask.ymax-mask.ymin);
        widget_unit = U.widget_unit * regiony2viewy;
@@ -973,8 +973,7 @@ void draw_nurbuv(const struct bContext *C, SpaceImage 
*sima, ARegion *ar, Scene
        /******* (Pixel Coordinates) draw coordinate numbers *********/
        UI_view2d_view_restore(C);
        UI_ThemeColor(TH_TITLE);
-       printf("v2d.cur %f %f\n",ar->v2d.cur.xmin,ar->v2d.cur.xmax);
-       printf("mask %i %i\n",ar->v2d.mask.xmin,ar->v2d.mask.xmax);
+       /* UI_ThemeColor(TH_GRID); probably more correct but too hard to see */
        fonth = BLF_height_default("1",1);
        for (i=umin; i<=umax; i++) {
                x_view=i; y_view=vmin-widget_unit;
@@ -1008,28 +1007,30 @@ void draw_nurbuv(const struct bContext *C, SpaceImage 
*sima, ARegion *ar, Scene
        glDisable(GL_BLEND);
                
        /******* (Normalized Coordinates) draw knot grid *********/
-       glLineWidth(1);
-       glBegin(GL_LINES);
        for (nu=cu->editnurb->nurbs.first; nu; nu=nu->next) {
-               vmin = nu->knotsv[0];
-               vmax = nu->knotsv[KNOTSV(nu)-1];
-               umin = nu->knotsu[0];
-               umax = nu->knotsu[KNOTSU(nu)-1];
-               UI_ThemeColor(TH_NURB_ULINE);
-               j = KNOTSU(nu);
-               for (i=0; i<j; i++) {
+               NurbEditKnot *ek = BKE_nurbs_editKnot_get(nu);
+               vmin = ek->breaksv[0];
+               vmax = ek->breaksv[ek->num_breaksv-1];
+               umin = ek->breaksu[0];
+               umax = ek->breaksu[ek->num_breaksu-1];
+               UI_ThemeColor(TH_NURB_VLINE);
+               for (i=0; i<ek->num_breaksu; i++)  {
+                       glLineWidth(ek->multiplicityu[i]);
+                       glBegin(GL_LINE);
                        glVertex2f(nu->knotsu[i],

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to