Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan deWerd <jjoonathan@gmail.com>2014-08-14 01:02:12 +0400
committerJonathan deWerd <jjoonathan@gmail.com>2014-08-14 01:02:12 +0400
commitef4478c62b2c4f03586b5370d3be61f875b1586e (patch)
treee96c85b6db623de52e4fc0e64f0de7359c0c4dea
parent047e44dbcc1f5c7f6ddc79f275173ef2d643372a (diff)
Selective selection based on what is selected in 3dview
-rw-r--r--source/blender/blenkernel/BKE_curve.h1
-rw-r--r--source/blender/blenkernel/intern/curve.cpp37
-rw-r--r--source/blender/editors/curve/editcurve.c3
-rw-r--r--source/blender/editors/include/ED_curve.h2
-rw-r--r--source/blender/editors/io/io_rhino_import.cpp17
-rw-r--r--source/blender/editors/uvedit/uvedit_draw.c62
-rw-r--r--source/blender/editors/uvedit/uvedit_ops.c2
7 files changed, 74 insertions, 50 deletions
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index 658e5903fe3..589b56b4816 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -185,6 +185,7 @@ void BKE_nurb_ensure2D(struct Nurb *nu);
void BKE_nurb_minmax(struct Nurb *nu, bool use_radius, float min[3], float max[3]);
void BKE_nurbs_domain(struct Nurb *nu, float *umin, float *umax, float *vmin, float *vmax);
void BKE_nurbs_uvbounds(struct Nurb *nu, float *umin, float *umax, float *vmin, float *vmax);
+void BKE_nurbs_printknots(struct Nurb *nu);
void BKE_nurb_makeFaces(struct Nurb *nu, float *coord_array, int rowstride, int resolu, int resolv);
void BKE_nurb_makeCurve(struct Nurb *nu, float *coord_array, float *tilt_array, float *radius_array, float *weight_array, int resolu, int stride);
diff --git a/source/blender/blenkernel/intern/curve.cpp b/source/blender/blenkernel/intern/curve.cpp
index 77d30e8b9d5..bcb6b17ef73 100644
--- a/source/blender/blenkernel/intern/curve.cpp
+++ b/source/blender/blenkernel/intern/curve.cpp
@@ -4176,24 +4176,33 @@ void BKE_nurbs_uvbounds(struct Nurb *nu, float *umin, float *umax, float *vmin,
}
void BKE_nurbs_domain(struct Nurb *nu, float *umin, float *umax, float *vmin, float *vmax) {
- *umin = nu->knotsu[nu->orderu - 1];
- if (nu->flagu & CU_NURB_CYCLIC)
- *umax = nu->knotsu[nu->pntsu + nu->orderu - 1];
- else
- *umax = nu->knotsu[nu->pntsu];
- *umin = std::min(nu->knotsu[0], *umin);
- *umax = std::max(nu->knotsu[nu->pntsu+nu->orderu-1], *umax);
+ int pu = nu->orderu-1; /* p{u,v} is the degree of the curve in the {u,v} direction */
+ int pv = nu->orderv-1;
+ *umin = nu->knotsu[pu];
+ *umax = nu->knotsu[KNOTSU(nu)-pu-1];
if (nu->knotsv) {
- *vmin = nu->knotsv[nu->orderv - 1];
- if (nu->flagv & CU_NURB_CYCLIC)
- *vmax = nu->knotsv[nu->pntsv + nu->orderv - 1];
- else
- *vmax = nu->knotsv[nu->pntsv];
- if (vmin) *vmin = std::min(nu->knotsv[0], *umin);
- if (vmin) *vmax = std::max(nu->knotsv[nu->pntsv+nu->orderv-1], *umax);
+ *vmin = nu->knotsv[pv];
+ *vmax = nu->knotsv[KNOTSV(nu)-pv-1];
}
}
+void BKE_nurbs_printknots(struct Nurb *nu) {
+ int i,numknot;
+ float umin, umax, vmin, vmax;
+ printf("knotsu = {");
+ for (i=0,numknot=KNOTSU(nu); i<numknot; i++) {
+ printf((i==numknot-1)?"%3f}\n":"%3f, ",nu->knotsu[i]);
+ }
+ printf("knotsv = {");
+ for (i=0,numknot=KNOTSV(nu); i<numknot; i++) {
+ printf((i==numknot-1)?"%3f}\n":"%3f, ",nu->knotsv[i]);
+ }
+ BKE_nurbs_domain(nu, &umin, &umax, &vmin, &vmax);
+ printf("domain = [%3f,%3f]x[%3f,%3f]\n",umin,umax,vmin,vmax);
+ BKE_nurbs_uvbounds(nu, &umin, &umax, &vmin, &vmax);
+ printf("uvbounds = [%3f,%3f]x[%3f,%3f]\n",umin,umax,vmin,vmax);
+}
+
GridMesh *BKE_nurb_compute_trimmed_GridMesh(struct Nurb* nu) {
// Figure out the domain
float ustart,uend,vstart,vend;
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 752d875112d..06358da4d34 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -1477,8 +1477,9 @@ void ED_curve_select_swap(EditNurb *editnurb, bool hide_handles)
* A Nurb is shown iff it has one or more of its BPoints selected.
* The CU_SELECTED2 flag of nu->flag2 is where this data is stored.
*/
-void ED_curve_propagate_selected_pts_to_flag2(EditNurb *editnurb) {
+void ED_curve_propagate_selected_pts_to_flag2(Curve *cu) {
Nurb *nu;
+ EditNurb *editnurb = cu->editnurb;
int numpts, i;
for (nu=editnurb->nurbs.first; nu; nu=nu->next) {
diff --git a/source/blender/editors/include/ED_curve.h b/source/blender/editors/include/ED_curve.h
index 3e93351c2aa..3fe5ddbc94d 100644
--- a/source/blender/editors/include/ED_curve.h
+++ b/source/blender/editors/include/ED_curve.h
@@ -55,7 +55,7 @@ void ED_curve_transform(struct Curve *cu, float mat[4][4]);
void ED_curve_deselect_all(struct EditNurb *editnurb);
void ED_curve_select_all(struct EditNurb *editnurb);
void ED_curve_select_swap(struct EditNurb *editnurb, bool hide_handles);
-void ED_curve_propagate_selected_pts_to_flag2(struct EditNurb *editnurb);
+void ED_curve_propagate_selected_pts_to_flag2(struct Curve *cu);
void undo_push_curve(struct bContext *C, const char *name);
ListBase *object_editcurve_get(struct Object *ob);
diff --git a/source/blender/editors/io/io_rhino_import.cpp b/source/blender/editors/io/io_rhino_import.cpp
index 0eea7f5899c..eb67b13437a 100644
--- a/source/blender/editors/io/io_rhino_import.cpp
+++ b/source/blender/editors/io/io_rhino_import.cpp
@@ -606,15 +606,16 @@ 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);
+// 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");
}
static void nurb_normalize_knots(Nurb *nu) {
+ printf("\tnormalizing knots\n");
normalize_knots(nu, 'u');
normalize_knots(nu, 'v');
BKE_nurb_knot_calc_u(nu);
@@ -675,10 +676,12 @@ static Nurb* rhino_import_nurbs_surf(bContext *C,
int i=1; for (int l=nu->pntsu+nu->orderu-1; i<l; i++) {
nu->knotsu[i] = surf->Knot(0,i-1);
}
+ nu->knotsu[0] =nu->knotsu[1];
nu->knotsu[i] = nu->knotsu[i-1];
i=1; for (int l=nu->pntsv+nu->orderv-1; i<l; i++) {
nu->knotsv[i] = surf->Knot(1,i-1);
}
+ nu->knotsv[0] = nu->knotsv[1];
nu->knotsv[i] = nu->knotsv[i-1];
nu->flagu = analyze_knots(nu->knotsu, nu->pntsu+nu->orderu, nu->orderu, surf->IsPeriodic(0));
nu->flagv = analyze_knots(nu->knotsv, nu->pntsv+nu->orderv, nu->orderv, surf->IsPeriodic(1));
@@ -705,13 +708,13 @@ static void rhino_import_surface(bContext *C,
bool did_handle = false;
if (ns) {
rhino_import_nurbs_surf_start(C, obj, attrs);
- rhino_import_nurbs_surf(C, ns, obj, attrs, newobj);
+ rhino_import_nurbs_surf(C, ns, obj, attrs, newobj, false);
rhino_import_nurbs_surf_end(C);
did_handle = true;
}
if (!did_handle && surf->HasNurbForm()) {
rhino_import_nurbs_surf_start(C, obj, attrs);
- rhino_import_nurbs_surf(C, surf, obj, attrs, newobj);
+ rhino_import_nurbs_surf(C, surf, obj, attrs, newobj, false);
rhino_import_nurbs_surf_end(C);
did_handle = true;
}
@@ -764,7 +767,7 @@ static void rhino_import_brep_face(bContext *C,
BLI_addtail(&nu->trims, trim);
}
- nurb_normalize_knots(nu);
+ //nurb_normalize_knots(nu);
if (should_destroy_ns) delete ns;
}
diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c
index e67461be9d4..112e40429ae 100644
--- a/source/blender/editors/uvedit/uvedit_draw.c
+++ b/source/blender/editors/uvedit/uvedit_draw.c
@@ -61,6 +61,7 @@
#include "ED_image.h"
#include "ED_mesh.h"
#include "ED_uvedit.h"
+#include "ED_curve.h"
#include "UI_resources.h"
#include "UI_interface.h"
@@ -927,21 +928,22 @@ void draw_nurbuv(const struct bContext *C, SpaceImage *sima, ARegion *ar, Scene
float x_view, y_view; /* XY in view (local, normalized) coord systems */
int x_region, y_region; /* XY in window coord systems */
int xmax_region, ymax_region, resoltrim;
- int bot_tweak, top_tweak, left_tweak, right_tweak, line_width;
- GLint quad_in[4][2];
+ int line_width;
double regionx2viewx, regiony2viewy;
- float widget_unit, trash, fonth, fontw;
+ float widget_unit, fonth, fontw;
int umin,vmin,umax,vmax;
float uminf,vminf,umaxf,vmaxf;
char lbl[128];
unsigned char col1[4], col2[4];
float (*trim_uv_pnts)[2];
+ int grid_x_spacing, grid_y_spacing;
BLI_assert(obedit && obedit->type == OB_SURF);
cur = ar->v2d.cur;
mask = ar->v2d.mask;
cu = (Curve*)obedit->data;
umin=INFINITY; vmin=INFINITY; umax=-INFINITY; vmax=-INFINITY;
+ ED_curve_propagate_selected_pts_to_flag2(cu);
/* Figure out the union bounding box in UV space for all knots */
for (nu=cu->editnurb->nurbs.first; nu; nu=nu->next) {
if (nu->knotsu[0]<umin) umin = nu->knotsu[0];
@@ -949,7 +951,6 @@ void draw_nurbuv(const struct bContext *C, SpaceImage *sima, ARegion *ar, Scene
if (nu->knotsu[KNOTSU(nu)-1]>umax) umax = nu->knotsu[KNOTSU(nu)-1];
if (nu->knotsv[KNOTSV(nu)-1]>vmax) vmax = nu->knotsv[KNOTSV(nu)-1];
}
- printf("\n");
umin = floor(umin)-1;
vmin = floor(vmin)-1;
umax = ceil(umax)+1;
@@ -978,22 +979,33 @@ void draw_nurbuv(const struct bContext *C, SpaceImage *sima, ARegion *ar, Scene
UI_ThemeColor(TH_TITLE);
/* 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;
- UI_view2d_view_to_region(&ar->v2d, x_view, y_view, &x_region, &y_region);
- snprintf(lbl, sizeof(lbl), "%i", (int)i);
- if (y_region < mask.ymin) y_region = mask.ymin;
- if (y_region > ymax_region-fonth-4) y_region = ymax_region-fonth-4;
- BLF_draw_default_ascii(x_region+4, y_region+4, 0.0f, lbl, strlen(lbl));
+ snprintf(lbl, sizeof(lbl), "%i", umin);
+ fontw = BLF_width_default(lbl, strlen(lbl));
+ snprintf(lbl, sizeof(lbl), "%i", umax);
+ i = BLF_width_default(lbl, strlen(lbl));
+ fontw = (i>fontw) ? i : fontw;
+ grid_x_spacing = 1.0 * BLI_rcti_size_x(&ar->v2d.mask) / BLI_rctf_size_x(&ar->v2d.cur);
+ grid_y_spacing = 1.0 * BLI_rcti_size_y(&ar->v2d.mask) / BLI_rctf_size_y(&ar->v2d.cur);
+ if (grid_x_spacing>fontw) {
+ for (i=umin; i<=umax; i++) {
+ x_view=i; y_view=vmin-widget_unit;
+ UI_view2d_view_to_region(&ar->v2d, x_view, y_view, &x_region, &y_region);
+ snprintf(lbl, sizeof(lbl), "%i", (int)i);
+ if (y_region < mask.ymin) y_region = mask.ymin;
+ if (y_region > ymax_region-fonth-4) y_region = ymax_region-fonth-4;
+ BLF_draw_default_ascii(x_region+4, y_region+4, 0.0f, lbl, strlen(lbl));
+ }
}
- for (i=vmin; i<=vmax; i++) {
- x_view=umin-widget_unit; y_view=i;
- UI_view2d_view_to_region(&ar->v2d, x_view, y_view, &x_region, &y_region);
- snprintf(lbl, sizeof(lbl), "%i", (int)i);
- fontw = BLF_width_default(lbl, strlen(lbl));
- if (x_region < mask.xmin) x_region = mask.xmin;
- if (x_region > xmax_region-fontw-4) x_region = xmax_region-fontw-4;
- BLF_draw_default_ascii(x_region+4, y_region-fonth-4, 0.0f, lbl, strlen(lbl));
+ if (grid_y_spacing>fonth) {
+ for (i=vmin; i<=vmax; i++) {
+ x_view=umin-widget_unit; y_view=i;
+ UI_view2d_view_to_region(&ar->v2d, x_view, y_view, &x_region, &y_region);
+ snprintf(lbl, sizeof(lbl), "%i", (int)i);
+ fontw = BLF_width_default(lbl, strlen(lbl));
+ if (x_region < mask.xmin) x_region = mask.xmin;
+ if (x_region > xmax_region-fontw-4) x_region = xmax_region-fontw-4;
+ BLF_draw_default_ascii(x_region+4, y_region-fonth-4, 0.0f, lbl, strlen(lbl));
+ }
}
/******* (Normalized Coordinates) draw semitransparent domain background *********/
@@ -1004,6 +1016,7 @@ void draw_nurbuv(const struct bContext *C, SpaceImage *sima, ARegion *ar, Scene
glEnable(GL_BLEND);
glColor4ubv(col1);
for (nu=cu->editnurb->nurbs.first; nu; nu=nu->next) {
+ if (!(nu->flag2&CU_SELECTED2)) continue;
BKE_nurbs_domain(nu, &uminf, &umaxf, &vminf, &vmaxf);
glRectf(uminf,vminf,umaxf,vmaxf);
}
@@ -1014,6 +1027,7 @@ void draw_nurbuv(const struct bContext *C, SpaceImage *sima, ARegion *ar, Scene
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_QUADS);
for (nu=cu->editnurb->nurbs.first; nu; nu=nu->next) {
+ if (!(nu->flag2&CU_SELECTED2)) continue;
NurbEditKnot *ek = BKE_nurbs_editKnot_get(nu);
UI_view2d_view_to_region(&ar->v2d, ek->breaksu[0], ek->breaksv[0], &umin, &vmin);
UI_view2d_view_to_region(&ar->v2d, ek->breaksu[ek->num_breaksu-1], ek->breaksv[ek->num_breaksv-1], &umax, &vmax);
@@ -1051,6 +1065,7 @@ void draw_nurbuv(const struct bContext *C, SpaceImage *sima, ARegion *ar, Scene
glBegin(GL_LINE_STRIP);
UI_ThemeColor(TH_WIRE);
for (nu=cu->editnurb->nurbs.first; nu; nu=nu->next) {
+ if (!(nu->flag2&CU_SELECTED2)) continue;
resoltrim = nu->resol_trim;
for (nt=nu->trims.first; nt; nt=nt->next) {
j = BKE_nurbTrim_tess(nt, resoltrim, &trim_uv_pnts);
@@ -1062,12 +1077,11 @@ void draw_nurbuv(const struct bContext *C, SpaceImage *sima, ARegion *ar, Scene
}
glEnd();
- if (glGetError()!=GL_NO_ERROR)
- printf("ERR! %i\n",glGetError());
/******* (Normalized Coordinates) draw trim control polygon *********/
glBegin(GL_LINE_STRIP);
UI_ThemeColor(TH_WIRE_EDIT);
for (nu=cu->editnurb->nurbs.first; nu; nu=nu->next) {
+ if (!(nu->flag2&CU_SELECTED2)) continue;
resoltrim = nu->resol_trim;
for (nt=nu->trims.first; nt; nt=nt->next) {
for (trimnu=nt->nurb_list.first; trimnu; trimnu=trimnu->next) {
@@ -1080,13 +1094,12 @@ void draw_nurbuv(const struct bContext *C, SpaceImage *sima, ARegion *ar, Scene
}
glEnd();
- if (glGetError()!=GL_NO_ERROR)
- printf("ERR! %i\n",glGetError());
/******* (Normalized Coordinates) draw handles for control polygon *********/
glPointSize(3);
glBegin(GL_POINTS);
UI_ThemeColor(TH_WIRE_EDIT);
for (nu=cu->editnurb->nurbs.first; nu; nu=nu->next) {
+ if (!(nu->flag2&CU_SELECTED2)) continue;
resoltrim = nu->resol_trim;
for (nt=nu->trims.first; nt; nt=nt->next) {
for (trimnu=nt->nurb_list.first; trimnu; trimnu=trimnu->next) {
@@ -1101,9 +1114,6 @@ void draw_nurbuv(const struct bContext *C, SpaceImage *sima, ARegion *ar, Scene
glEnd();
glPointSize(1);
- if (glGetError()!=GL_NO_ERROR)
- printf("ERR! %i\n",glGetError());
-
}
void draw_uvedit_main(const struct bContext *C, SpaceImage *sima, ARegion *ar, Scene *scene, Object *obedit, Object *obact)
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index 2004bd3bbca..bc84a84077e 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -2429,7 +2429,7 @@ static int nurbsuv_mouse_select(bContext *C, const float co[2], bool extend) {
BLI_assert(cu->editnurb);
nearest_trim = NULL;
for (nu=cu->editnurb->nurbs.first; nu; nu=nu->next) {
- ED_curve_propagate_selected_pts_to_flag2(cu->editnurb);
+ ED_curve_propagate_selected_pts_to_flag2(cu);
/* if (!(nu->flag2 & ~CU_SELECTED2)) continue;*/
ek = BKE_nurbs_editKnot_get(nu);
BKE_nurbs_uvbounds(nu, &umin, &umax, &vmin, &vmax);