[Bf-blender-cvs] [44b5e6c] soc-2014-nurbs: UV Edit Selection Propagation
Jonathan deWerd
noreply at git.blender.org
Wed Aug 13 17:24:31 CEST 2014
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. @@
More information about the Bf-blender-cvs
mailing list