[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46291] trunk/blender: Added start and end bevel factor for curves, so now it's possible to make

Sergey Sharybin sergey.vfx at gmail.com
Fri May 4 19:04:20 CEST 2012


Revision: 46291
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46291
Author:   nazgul
Date:     2012-05-04 17:04:20 +0000 (Fri, 04 May 2012)
Log Message:
-----------
Added start and end bevel factor for curves, so now it's possible to make
a bevelled curve which isn't fully covered with a bevel.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/properties_data_curve.py
    trunk/blender/source/blender/blenkernel/BKE_blender.h
    trunk/blender/source/blender/blenkernel/intern/curve.c
    trunk/blender/source/blender/blenkernel/intern/displist.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/makesdna/DNA_curve_types.h
    trunk/blender/source/blender/makesrna/intern/rna_curve.c

Modified: trunk/blender/release/scripts/startup/bl_ui/properties_data_curve.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/properties_data_curve.py	2012-05-04 17:02:02 UTC (rev 46290)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_data_curve.py	2012-05-04 17:04:20 UTC (rev 46291)
@@ -173,9 +173,11 @@
         col.label(text="Bevel Object:")
         col.prop(curve, "bevel_object", text="")
 
-        row = col.row()
-        row.active = (curve.bevel_object is not None)
-        row.prop(curve, "use_fill_caps")
+        col = layout.column(align=True)
+        col.active = (curve.bevel_object is not None)
+        col.prop(curve, "use_fill_caps")
+        col.prop(curve, "bevel_factor_start")
+        col.prop(curve, "bevel_factor_end")
 
 
 class DATA_PT_pathanim(CurveButtonsPanelCurve, Panel):

Modified: trunk/blender/source/blender/blenkernel/BKE_blender.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_blender.h	2012-05-04 17:02:02 UTC (rev 46290)
+++ trunk/blender/source/blender/blenkernel/BKE_blender.h	2012-05-04 17:04:20 UTC (rev 46291)
@@ -42,7 +42,7 @@
  * and keep comment above the defines.
  * Use STRINGIFY() rather than defining with quotes */
 #define BLENDER_VERSION			263
-#define BLENDER_SUBVERSION		3
+#define BLENDER_SUBVERSION		4
 
 #define BLENDER_MINVERSION		250
 #define BLENDER_MINSUBVERSION	0

Modified: trunk/blender/source/blender/blenkernel/intern/curve.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/curve.c	2012-05-04 17:02:02 UTC (rev 46290)
+++ trunk/blender/source/blender/blenkernel/intern/curve.c	2012-05-04 17:04:20 UTC (rev 46291)
@@ -169,6 +169,8 @@
 	cu->smallcaps_scale= 0.75f;
 	cu->twist_mode= CU_TWIST_MINIMUM;	// XXX: this one seems to be the best one in most cases, at least for curve deform...
 	cu->type= type;
+	cu->bevfac1= 0.0f;
+	cu->bevfac2= 1.0f;
 	
 	cu->bb= unit_boundbox();
 	

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2012-05-04 17:02:02 UTC (rev 46290)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2012-05-04 17:04:20 UTC (rev 46291)
@@ -1220,10 +1220,11 @@
 	*data_r = data;
 }
 
-static void fillBevelCap(Curve *cu, Nurb *nu, BevPoint *bevp, DispList *dlb, float fac, float widfac, ListBase *dispbase)
+static void fillBevelCap(Nurb *nu, DispList *dlb, float *prev_fp, ListBase *dispbase)
 {
 	DispList *dl;
 	float *data;
+	int b;
 
 	dl= MEM_callocN(sizeof(DispList), "makeDispListbev2");
 	dl->verts= data= MEM_callocN(3*sizeof(float)*dlb->nr, "dlverts");
@@ -1239,7 +1240,8 @@
 	/* CU_2D conflicts with R_NOPUNOFLIP */
 	dl->rt= nu->flag & ~CU_2D;
 
-	rotateBevelPiece(cu, bevp, dlb, widfac, fac, &data);
+	for (b = 0; b < dlb->nr; b++, prev_fp += 3, data += 3)
+		copy_v3_v3(data, prev_fp);
 
 	BLI_addtail(dispbase, dl);
 }
@@ -1332,9 +1334,26 @@
 						ListBase top_capbase = {NULL, NULL};
 
 						for (dlb=dlbev.first; dlb; dlb=dlb->next) {
+							int i, start, steps;
+							float bevfac1 = MIN2(cu->bevfac1, cu->bevfac2), bevfac2 = MAX2(cu->bevfac1, cu->bevfac2);
+							float firstblend = 0.0f, lastblend = 0.0f;
+
+							if (cu->bevfac1 - cu->bevfac2 == 0.0f)
+								continue;
+
+							start = (int)(bevfac1*(bl->nr-1));
+							steps = 2+(int)((bevfac2)*(bl->nr-1)) - start;
+							firstblend = 1.0f - ((float)bevfac1*(bl->nr-1) - (int)((float)bevfac1*(bl->nr-1)));
+							lastblend  = (float)bevfac2*(bl->nr-1) - (int)((float)bevfac2*(bl->nr-1));
+
+							if (steps > bl->nr) {
+								steps = bl->nr;
+								lastblend = 1.0f;
+							}
+
 							/* for each part of the bevel use a separate displblock */
 							dl= MEM_callocN(sizeof(DispList), "makeDispListbev1");
-							dl->verts= data= MEM_callocN(3*sizeof(float)*dlb->nr*bl->nr, "dlverts");
+							dl->verts= data= MEM_callocN(3*sizeof(float)*dlb->nr*steps, "dlverts");
 							BLI_addtail(dispbase, dl);
 	
 							dl->type= DL_SURF;
@@ -1342,8 +1361,8 @@
 							dl->flag= dlb->flag & (DL_FRONT_CURVE|DL_BACK_CURVE);
 							if (dlb->type==DL_POLY) dl->flag |= DL_CYCL_U;
 							if (bl->poly>=0) dl->flag |= DL_CYCL_V;
-							
-							dl->parts= bl->nr;
+
+							dl->parts= steps;
 							dl->nr= dlb->nr;
 							dl->col= nu->mat_nr;
 							dl->charidx= nu->charidx;
@@ -1352,18 +1371,20 @@
 							/* CU_2D conflicts with R_NOPUNOFLIP */
 							dl->rt= nu->flag & ~CU_2D;
 
-							dl->bevelSplitFlag= MEM_callocN(sizeof(*dl->col2)*((bl->nr+0x1F)>>5), "bevelSplitFlag");
+							dl->bevelSplitFlag= MEM_callocN(sizeof(*dl->col2)*((steps+0x1F)>>5), "bevelSplitFlag");
 	
 							/* for each point of poly make a bevel piece */
-							bevp= (BevPoint *)(bl+1);
-							for (a=0; a<bl->nr; a++, bevp++) {
+							bevp= (BevPoint *)(bl+1) + start;
+							for (i=start, a=0; a<steps; i++,bevp++,a++) {
 								float fac=1.0;
+								float *cur_data = data;
+
 								if (cu->taperobj==NULL) {
 									if ( (cu->bevobj!=NULL) || !((cu->flag & CU_FRONT) || (cu->flag & CU_BACK)) )
 										fac = bevp->radius;
 								}
 								else {
-									fac = calc_taper(scene, cu->taperobj, a, bl->nr);
+									fac = calc_taper(scene, cu->taperobj, i, bl->nr);
 								}
 
 								if (bevp->split_tag) {
@@ -1373,11 +1394,31 @@
 								/* rotate bevel piece and write in data */
 								rotateBevelPiece(cu, bevp, dlb, widfac, fac, &data);
 
+								if (a == 1 || a == steps - 1) {
+									float *cur_fp = cur_data, *prev_fp = cur_data - 3*dlb->nr;
+									int b;
+
+									for (b = 0; b < dlb->nr; b++, prev_fp += 3, cur_fp += 3) {
+										float cur[3], prev[3];
+
+										copy_v3_v3(cur, cur_fp);
+										copy_v3_v3(prev, prev_fp);
+
+										if (a == 1)
+											interp_v3_v3v3(prev, cur_fp, prev_fp, firstblend);
+										if (a == steps - 1)
+											interp_v3_v3v3(cur, prev_fp, cur_fp, lastblend);
+
+										copy_v3_v3(cur_fp, cur);
+										copy_v3_v3(prev_fp, prev);
+									}
+								}
+
 								if (cu->bevobj && (cu->flag & CU_FILL_CAPS)) {
-									if (a == 0)
-										fillBevelCap(cu, nu, bevp, dlb, fac, widfac, &bottom_capbase);
-									else if (a == bl->nr - 1)
-										fillBevelCap(cu, nu, bevp, dlb, fac, widfac, &top_capbase);
+									if (a == 1) 
+										fillBevelCap(nu, dlb, cur_data - 3*dlb->nr, &bottom_capbase);
+									if (a == steps - 1)
+										fillBevelCap(nu, dlb, cur_data, &top_capbase);
 								}
 							}
 

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2012-05-04 17:02:02 UTC (rev 46290)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2012-05-04 17:04:20 UTC (rev 46291)
@@ -7390,17 +7390,16 @@
 		}
 	}
 	
+	if (main->versionfile < 263 || (main->versionfile == 263 && main->subversionfile < 4))
 	{
 		Lamp *la;
+		Camera *cam;
+		Curve *cu;
+
 		for (la= main->lamp.first; la; la= la->id.next) {
 			if (la->shadow_frustum_size == 0.0)
 				la->shadow_frustum_size= 10.0f;
 		}
-	}
-	
-	if (main->versionfile < 263 || (main->versionfile == 263 && main->subversionfile < 4))
-	{
-		Camera *cam;
 
 		for (cam = main->camera.first; cam; cam = cam->id.next) {
 			if (cam->flag & CAM_PANORAMA) {
@@ -7408,6 +7407,13 @@
 				cam->flag &= ~CAM_PANORAMA;
 			}
 		}
+
+		for(cu= main->curve.first; cu; cu= cu->id.next) {
+			if(cu->bevfac2 == 0.0f) {
+				cu->bevfac1 = 0.0f;
+				cu->bevfac2 = 1.0f;
+			}
+		}
 	}
 
 	/* WATCH IT!!!: pointers from libdata have not been converted yet here! */

Modified: trunk/blender/source/blender/makesdna/DNA_curve_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_curve_types.h	2012-05-04 17:02:02 UTC (rev 46290)
+++ trunk/blender/source/blender/makesdna/DNA_curve_types.h	2012-05-04 17:04:20 UTC (rev 46291)
@@ -234,6 +234,8 @@
 	
 	struct CharInfo *strinfo;	
 	struct CharInfo curinfo;
+
+	float bevfac1, bevfac2;
 } Curve;
 
 /* **************** CURVE ********************* */

Modified: trunk/blender/source/blender/makesrna/intern/rna_curve.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_curve.c	2012-05-04 17:02:02 UTC (rev 46290)
+++ trunk/blender/source/blender/makesrna/intern/rna_curve.c	2012-05-04 17:04:20 UTC (rev 46291)
@@ -1470,6 +1470,18 @@
 	RNA_def_property_ui_text(prop, "Materials", "");
 	RNA_def_property_srna(prop, "IDMaterials"); /* see rna_ID.c */
 	RNA_def_property_collection_funcs(prop, 0, NULL, NULL, NULL, NULL, NULL, NULL, "rna_IDMaterials_assign_int");
+
+	prop = RNA_def_property(srna, "bevel_factor_start", PROP_FLOAT, PROP_FACTOR);
+	RNA_def_property_float_sdna(prop, NULL, "bevfac1");
+	RNA_def_property_range(prop, 0, 1.0);
+	RNA_def_property_ui_text(prop, "Start Bevel Factor", "Factor that defines from where beveling of spline happens (0=from the very beginning, 1=from the very end)");
+	RNA_def_property_update(prop, 0, "rna_Curve_update_data");
+
+	prop = RNA_def_property(srna, "bevel_factor_end", PROP_FLOAT, PROP_FACTOR);
+	RNA_def_property_float_sdna(prop, NULL, "bevfac2");
+	RNA_def_property_range(prop, 0, 1.0);
+	RNA_def_property_ui_text(prop, "End Bevel Factor", "Factor that defines to where beveling of spline happens (0=to the very beginning, 1=to the very end)");
+	RNA_def_property_update(prop, 0, "rna_Curve_update_data");
 }
 
 static void rna_def_curve_nurb(BlenderRNA *brna)




More information about the Bf-blender-cvs mailing list