[Bf-blender-cvs] [bc9d359] soc-2014-nurbs: Got RNA working and frontend for adding trims

Jonathan deWerd noreply at git.blender.org
Fri Aug 22 10:59:44 CEST 2014


Commit: bc9d3591de230e55b547ed0f40d3accada55bb6d
Author: Jonathan deWerd
Date:   Thu Aug 21 21:25:57 2014 -0600
Branches: soc-2014-nurbs
https://developer.blender.org/rBbc9d3591de230e55b547ed0f40d3accada55bb6d

Got RNA working and frontend for adding trims

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

M	release/scripts/startup/bl_ui/space_image.py
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/include/ED_screen.h
M	source/blender/editors/io/io_rhino_import.cpp
M	source/blender/editors/screen/screen_ops.c
M	source/blender/editors/uvedit/uvedit_draw.c
M	source/blender/editors/uvedit/uvedit_ops.c
M	source/blender/makesdna/DNA_curve_types.h
M	source/blender/makesrna/intern/rna_curve.c

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

diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index 96fc0ef..2828d6d 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -139,6 +139,13 @@ class IMAGE_MT_select(Menu):
 
         layout.operator("uv.select_split")
 
+class IMAGE_MT_trim(Menu):
+    bl_label = "Trim"
+    def draw(self, context):
+        layout = self.layout
+        layout.operator("uv.nurbsuv_add_square", text="Square Trim", icon='MESH_PLANE')
+        layout.operator("uv.nurbsuv_add_circle", text="Circular Trim", icon='SURFACE_NCIRCLE')
+        layout.operator("uv.nurbsuv_delete_trim", text="Delete Trim")
 
 class IMAGE_MT_image(Menu):
     bl_label = "Image"
@@ -460,11 +467,14 @@ class MASK_MT_editor_menus(Menu):
 
         show_uvedit = sima.show_uvedit
         show_maskedit = sima.show_maskedit
+        show_nurbsuv = sima.show_nurbsuv
 
         layout.menu("IMAGE_MT_view")
 
         if show_uvedit:
             layout.menu("IMAGE_MT_select")
+        if show_nurbsuv:
+            layout.menu("IMAGE_MT_trim")
         if show_maskedit:
             layout.menu("MASK_MT_select")
 
@@ -617,6 +627,17 @@ class IMAGE_PT_view_properties(Panel):
             col.label("Cursor Location:")
             col.row().prop(sima, "cursor_location", text="")
 
+        if show_nurbsuv:
+            col.separator()
+            if context.edit_object.data.active_breakpt:
+                col.label(text="Active Breakpoint:")
+                col.prop(context.edit_object.data.active_breakpt, "loc", text="Location")
+                col.prop(context.edit_object.data.active_breakpt, "multiplicity", text="Multiplicity")
+            if context.edit_object.data.active_trim:
+                col.label(text="Active Trim:")
+                sub = col.column()
+                sub.row().prop(context.edit_object.data.active_trim, "type", expand=True)
+
         if show_uvedit:
             col.separator()
 
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index 44fe516..78ef234 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -176,6 +176,7 @@ void BKE_nurbList_flag_set(ListBase *editnurb, short flag);
 void BKE_nurbTrim_free(struct NurbTrim *nt);
 struct NurbTrim *BKE_nurbTrim_duplicate(struct NurbTrim *nt);
 int BKE_nurbTrim_tess(struct NurbTrim *nt, int resolution, float (**uv)[2]); // Returns: # verts in uv
+void BKE_nurbTrim_update_data(struct NurbTrim *nt);
 
 void BKE_nurb_free(struct Nurb *nu);
 struct Nurb *BKE_nurb_duplicate(struct Nurb *nu);
diff --git a/source/blender/blenkernel/intern/curve.cpp b/source/blender/blenkernel/intern/curve.cpp
index 65a0f7a..699a594 100644
--- a/source/blender/blenkernel/intern/curve.cpp
+++ b/source/blender/blenkernel/intern/curve.cpp
@@ -541,8 +541,6 @@ void BKE_nurbs_editKnot_propagate_nurb2ek(struct Nurb *nu) {
 	if (nu->pntsv==1) {
 		ek->num_breaksv = 0; /* This is a curve. There are no breakpoints in v direction. */
 		ek->breaksv = NULL;
-		ek->flagv = NULL;
-		ek->multiplicityv = NULL;
 	} else {
 		int capv = ek->capv = KNOTSV(nu);
 		ek->breaksv = (NurbBreakpt*)MEM_callocN(capv*sizeof(NurbBreakpt), "NURBS_editknot_v");
@@ -746,6 +744,7 @@ Nurb *BKE_nurb_duplicate(Nurb *nu)
 	newnu->trims.first = newnu->trims.last = NULL;
 	for (NurbTrim *nt = (NurbTrim*)nu->trims.first; nt; nt=nt->next) {
 		NurbTrim *dup_nt = BKE_nurbTrim_duplicate(nt);
+		dup_nt->parent_nurb = newnu;
 		BLI_addtail(&newnu->trims, dup_nt);
 	}
 	BKE_nurbs_cached_UV_mesh_clear(newnu,false);
@@ -786,18 +785,22 @@ NurbTrim *BKE_nurbTrim_duplicate(NurbTrim *nt) {
 	NurbTrim *ret = (NurbTrim*)MEM_callocN(sizeof(NurbTrim), "duplicateNurbTrim");
 	BKE_nurbList_duplicate(&ret->nurb_list, &nt->nurb_list);
 	ret->type = nt->type;
+	ret->parent_nurb = nt->parent_nurb;
 	return ret;
 }
 
 int BKE_nurbTrim_tess(struct NurbTrim *nt, int resolution, float (**uv_out)[2]) {
 	int tot_tess_pts = 0;
 	for (Nurb* nu = (Nurb*)nt->nurb_list.first; nu; nu=nu->next) {
-		tot_tess_pts += nu->pntsu * resolution + 1;
+		int tess_pts = nu->pntsu * resolution + 1;
+		if (nu->flagu&CU_NURB_ENDPOINT) tess_pts = (nu->pntsu+2-nu->orderu)*resolution;
+		tot_tess_pts += tess_pts;
 	}
 	float (*uv)[2] = (float(*)[2])MEM_mallocN(sizeof(*uv)*tot_tess_pts, "BKE_nurbTrim_tess");
 	*uv_out = uv;
 	for (Nurb* nu = (Nurb*)nt->nurb_list.first; nu; nu=nu->next) {
 		int tess_pts = nu->pntsu * resolution + 1;
+		if (nu->flagu&CU_NURB_ENDPOINT) tess_pts = (nu->pntsu+2-nu->orderu)*resolution;
 		float *U = nu->knotsu;
 		int pntsu = nu->pntsu;
 		BPoint *bp = nu->bp;
@@ -817,6 +820,10 @@ int BKE_nurbTrim_tess(struct NurbTrim *nt, int resolution, float (**uv_out)[2])
 	return tot_tess_pts;
 }
 
+void BKE_nurbTrim_update_data(struct NurbTrim *nt) {
+	BKE_nurbs_cached_UV_mesh_clear((Nurb*)nt->parent_nurb, true);
+}
+
 void BKE_nurbList_duplicate(ListBase *lb1, ListBase *lb2)
 {
 	Nurb *nu, *nun;
@@ -4248,10 +4255,10 @@ GridMesh *BKE_nurb_compute_trimmed_GridMesh(struct Nurb* nu) {
 		int num_trimpts = BKE_nurbTrim_tess(nt, nu->resol_trim, &trim_uv_pts);
 		int trim_poly = gm->poly_new((float*)trim_uv_pts, num_trimpts*2);
 		switch (nt->type) {
-			case CU_TRIM_EXTERIOR:
+			case CU_TRIM_AND:
 				gm->bool_AND(trim_poly);
 				break;
-			case CU_TRIM_INTERIOR:
+			case CU_TRIM_SUB:
 				gm->bool_SUB(trim_poly);
 				break;
 			default:
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index ae535a9..a1ccb83 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -3365,6 +3365,7 @@ static void direct_link_nurblist(FileData *fd, ListBase *nurblist)
 		if (nu->flag & CU_TRIMMED) {
 			link_list(fd, &nu->trims);
 			for (nt=nu->trims.first; nt; nt=nt->next) {
+				nt->parent_nurb = nu;
 				direct_link_nurblist(fd, &nt->nurb_list);
 			}
 		}
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 97c6b3c..0967f46 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -172,6 +172,7 @@ int     ED_operator_editfont(struct bContext *C);
 int     ED_operator_editlattice(struct bContext *C);
 int     ED_operator_editmball(struct bContext *C);
 int     ED_operator_uvedit(struct bContext *C);
+int     ED_operator_nurbsuv(struct bContext *C);
 int     ED_operator_uvedit_or_nurbsuv(struct bContext *C);
 int     ED_operator_uvedit_space_image(struct bContext *C);
 int     ED_operator_uvedit_or_nurbsuv_space_image(struct bContext *C);
diff --git a/source/blender/editors/io/io_rhino_import.cpp b/source/blender/editors/io/io_rhino_import.cpp
index 1976e7e..e7dccfc 100644
--- a/source/blender/editors/io/io_rhino_import.cpp
+++ b/source/blender/editors/io/io_rhino_import.cpp
@@ -755,7 +755,8 @@ static void rhino_import_brep_face(bContext *C,
 		int trim_count = loop->TrimCount();
 		printf("   loop: 0x%lx\n",long(loop));
 		NurbTrim *trim = (NurbTrim*)MEM_callocN(sizeof(NurbTrim),"NURBS_imported_trim");
-		trim->type = (loop==outer_loop)? CU_TRIM_EXTERIOR : CU_TRIM_INTERIOR;
+		trim->type = (loop==outer_loop)? CU_TRIM_AND : CU_TRIM_SUB;
+		trim->parent_nurb = nu;
 		ListBase *nurb_list = &trim->nurb_list;
 		for (int trimnum=0; trimnum<trim_count; trimnum++) {
 			ON_BrepTrim *trim = loop->Trim(trimnum);
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index a723b32..9c17f5d 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -440,7 +440,14 @@ int ED_operator_uvedit(bContext *C)
 {
 	SpaceImage *sima = CTX_wm_space_image(C);
 	Object *obedit = CTX_data_edit_object(C);
-	return ED_space_image_show_uvedit(sima, obedit) || ED_space_image_show_nurbsuv(sima, obedit);
+	return ED_space_image_show_uvedit(sima, obedit);
+}
+
+int ED_operator_nurbsuv(bContext *C)
+{
+	SpaceImage *sima = CTX_wm_space_image(C);
+	Object *obedit = CTX_data_edit_object(C);
+	return ED_space_image_show_nurbsuv(sima, obedit);
 }
 
 int ED_operator_uvedit_or_nurbsuv(bContext *C)
diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c
index 25dc9a0..b9a453e 100644
--- a/source/blender/editors/uvedit/uvedit_draw.c
+++ b/source/blender/editors/uvedit/uvedit_draw.c
@@ -1094,12 +1094,12 @@ static void draw_nurbuv(const struct bContext *C, ARegion *ar, Object *obedit)
 	/******* (Normalized Coordinates) draw trim control polygon *********/
 	UI_view2d_view_ortho(&ar->v2d);
 	glShadeModel(GL_SMOOTH);
-	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) {
+			glBegin(GL_LINE_STRIP);
+			UI_ThemeColor(TH_WIRE);
 			/* if (!(nt->flag & SELECT)) continue; */
 			for (trimnu=nt->nurb_list.first; trimnu; trimnu=trimnu->next) {
 				j = trimnu->pntsu;
@@ -1110,26 +1110,26 @@ static void draw_nurbuv(const struct bContext *C, ARegion *ar, Object *obedit)
 				UI_ThemeColor((trimnu->bp[0].f1&SELECT)? TH_VERTEX_SELECT : TH_VERTEX);
 				glVertex2f(trimnu->bp[0].vec[0], trimnu->bp[0].vec[1]);
 			}
+			glEnd();
 		}
 	}
-	glEnd();
 	glShadeModel(GL_FLAT);
 
 	/******* (Normalized Coordinates) draw trim curves *********/
-	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) {
+			glBegin(GL_LINE_STRIP);
+			UI_ThemeColor(TH_WIRE);
 			switch (nt->type) {
-				case CU_TRIM_INTERIOR:
+				case CU_TRIM_SUB:
 					UI_ThemeColor((nt->flag&SELECT)? TH_NURB_SEL_TRIM_SUB : TH_NURB_TRIM_SUB);
 					break;
-				case CU_TRIM_EXTERIOR:
+				case CU_TRIM_AND:
 					UI_ThemeColor((nt->flag&SELECT)? TH_NURB_SEL_TRIM_AND : TH_NURB_TRIM_AND);
 					break;
-				case CU_TRIM_ISLAND:
+				case CU_TRIM_ADD:
 					UI_ThemeColor((nt->flag&SELECT)? TH_NURB_SEL_TRIM_ADD : TH_NURB_TRIM_ADD);
 					break;
 			}
@@ -113

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list