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
path: root/source
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2012-05-04 21:04:20 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2012-05-04 21:04:20 +0400
commit72fa15872489672694b9066ac9bbf7949ca847a8 (patch)
tree11e4a55b9ff2d44a3dace5d8ff9f7de7a638a9b5 /source
parenta9ecc86ec935735c66c5fdbd926b4ae2e94eee97 (diff)
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.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_blender.h2
-rw-r--r--source/blender/blenkernel/intern/curve.c2
-rw-r--r--source/blender/blenkernel/intern/displist.c67
-rw-r--r--source/blender/blenloader/intern/readfile.c16
-rw-r--r--source/blender/makesdna/DNA_curve_types.h2
-rw-r--r--source/blender/makesrna/intern/rna_curve.c12
6 files changed, 82 insertions, 19 deletions
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index 4ea38628001..62f1dbc5867 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -42,7 +42,7 @@ extern "C" {
* 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
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 906757bdd62..85e3d85dfc4 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -169,6 +169,8 @@ Curve *BKE_curve_add(const char *name, int type)
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();
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 1411c910894..de61929aa18 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -1220,10 +1220,11 @@ static void rotateBevelPiece(Curve *cu, BevPoint *bevp, DispList *dlb, float wid
*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 @@ static void fillBevelCap(Curve *cu, Nurb *nu, BevPoint *bevp, DispList *dlb, flo
/* 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 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
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 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
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 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
/* 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 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
/* 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);
}
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 9e921b55635..c07b1d4f66a 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -7390,17 +7390,16 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
+ 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 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
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! */
diff --git a/source/blender/makesdna/DNA_curve_types.h b/source/blender/makesdna/DNA_curve_types.h
index c9d80476fde..acdd25a101e 100644
--- a/source/blender/makesdna/DNA_curve_types.h
+++ b/source/blender/makesdna/DNA_curve_types.h
@@ -234,6 +234,8 @@ typedef struct Curve {
struct CharInfo *strinfo;
struct CharInfo curinfo;
+
+ float bevfac1, bevfac2;
} Curve;
/* **************** CURVE ********************* */
diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c
index cdfaa8aae1d..a62ee6d78d1 100644
--- a/source/blender/makesrna/intern/rna_curve.c
+++ b/source/blender/makesrna/intern/rna_curve.c
@@ -1470,6 +1470,18 @@ static void rna_def_curve(BlenderRNA *brna)
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)