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:
authorTon Roosendaal <ton@blender.org>2005-10-03 18:13:47 +0400
committerTon Roosendaal <ton@blender.org>2005-10-03 18:13:47 +0400
commit12dc56578609e45b676490200fffabf8f464655b (patch)
treee8200304264b33bed4483b57c47caf043164dcdc /source
parent45edb9cecb14a12a42230b9e12acf0ec5c2d07ee (diff)
New! Edit mode curve now draws solid extrusions, bevelcurves and tapers.
Fix: when unlinking an Action from Armature, the ipo window still allowed adding drivers, causing crashes.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c19
-rw-r--r--source/blender/blenkernel/intern/displist.c153
-rw-r--r--source/blender/src/drawipo.c2
-rw-r--r--source/blender/src/drawobject.c28
-rw-r--r--source/blender/src/editipo.c2
5 files changed, 100 insertions, 104 deletions
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index 2780887ea49..81adc459804 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -1529,15 +1529,18 @@ void DAG_object_flush_update(Scene *sce, Object *ob, short flag)
ob->recalc |= flag;
/* all users of this ob->data should be checked */
+ /* BUT! displists for curves are still only on cu */
if(flag & OB_RECALC_DATA) {
- ID *id= ob->data;
- if(id && id->us>1) {
- /* except when there's a key and shapes are locked */
- if(ob_get_key(ob) && (ob->shapeflag & (OB_SHAPE_LOCK|OB_SHAPE_TEMPLOCK)));
- else {
- for (base= sce->base.first; base; base= base->next) {
- if (ob->data==base->object->data) {
- base->object->recalc |= OB_RECALC_DATA;
+ if(ob->type!=OB_CURVE && ob->type!=OB_SURF) {
+ ID *id= ob->data;
+ if(id && id->us>1) {
+ /* except when there's a key and shapes are locked */
+ if(ob_get_key(ob) && (ob->shapeflag & (OB_SHAPE_LOCK|OB_SHAPE_TEMPLOCK)));
+ else {
+ for (base= sce->base.first; base; base= base->next) {
+ if (ob->data==base->object->data) {
+ base->object->recalc |= OB_RECALC_DATA;
+ }
}
}
}
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 8f5d934c075..c8dc2c63086 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -1581,6 +1581,7 @@ void makeDispListSurf(Object *ob, ListBase *dispbase, int forRender)
curve_calc_modifiers_post(ob, nubase, dispbase, forRender, originalVerts, deformedVerts);
}
+
void makeDispListCurveTypes(Object *ob, int forOrco)
{
Curve *cu = ob->data;
@@ -1597,12 +1598,13 @@ void makeDispListCurveTypes(Object *ob, int forOrco)
makeDispListSurf(ob, dispbase, 0);
}
else if ELEM(ob->type, OB_CURVE, OB_FONT) {
- int obedit= (G.obedit && G.obedit->data==ob->data);
- int numVerts;
+ ListBase dlbev;;
float (*originalVerts)[3];
float (*deformedVerts)[3];
+ int obedit= (G.obedit && G.obedit->data==ob->data);
ListBase *nubase = obedit?&editNurb:&cu->nurb;
-
+ int numVerts;
+
BLI_freelistN(&(cu->bev));
if(cu->path) free_path(cu->path);
@@ -1614,98 +1616,83 @@ void makeDispListCurveTypes(Object *ob, int forOrco)
makeBevelList(ob);
- if(obedit) {
- if(ob->type==OB_CURVE) {
- curve_to_displist(cu, &editNurb, dispbase);
- curve_to_filledpoly(cu, &editNurb, dispbase);
- }
- else {
- curve_to_displist(cu, &cu->nurb, dispbase);
- if (!(cu->flag&CU_FAST)) {
- curve_to_filledpoly(cu, &cu->nurb, dispbase);
- }
- }
- }
- else {
- ListBase dlbev;;
+ /* If curve has no bevel will return nothing */
+ makebevelcurve(ob, &dlbev);
- /* If curve has no bevel will return nothing */
- makebevelcurve(ob, &dlbev);
-
- if (!dlbev.first) {
- curve_to_displist(cu, &cu->nurb, dispbase);
- } else {
- float widfac= cu->width-1.0;
- BevList *bl= cu->bev.first;
- Nurb *nu= cu->nurb.first;
+ if (!dlbev.first) {
+ curve_to_displist(cu, nubase, dispbase);
+ } else {
+ float widfac= cu->width-1.0;
+ BevList *bl= cu->bev.first;
+ Nurb *nu= nubase->first;
- for (; bl && nu; bl=bl->next,nu=nu->next) {
- DispList *dlb;
+ for (; bl && nu; bl=bl->next,nu=nu->next) {
+ DispList *dlb;
+
+ for (dlb=dlbev.first; dlb; dlb=dlb->next) {
+ DispList *dl;
+ float *fp1, *data;
+ BevPoint *bevp;
+ int a,b;
+
+ /* 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");
+ BLI_addtail(dispbase, dl);
+
+ dl->type= DL_SURF;
- for (dlb=dlbev.first; dlb; dlb=dlb->next) {
- DispList *dl;
- float *fp1, *data;
- BevPoint *bevp;
- int a,b;
-
- /* 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");
- BLI_addtail(dispbase, dl);
-
- dl->type= DL_SURF;
-
- 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->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->nr= dlb->nr;
+ dl->col= nu->mat_nr;
+ dl->rt= nu->flag;
+ dl->bevelSplitFlag= MEM_callocN(sizeof(*dl->col2)*((bl->nr+0x1F)>>5), "col2");
+ bevp= (BevPoint *)(bl+1);
+
+ /* for each point of poly make a bevel piece */
+ bevp= (BevPoint *)(bl+1);
+ for(a=0; a<bl->nr; a++,bevp++) {
+ float fac = calc_taper(cu->taperobj, a, bl->nr);
- dl->parts= bl->nr;
- dl->nr= dlb->nr;
- dl->col= nu->mat_nr;
- dl->rt= nu->flag;
- dl->bevelSplitFlag= MEM_callocN(sizeof(*dl->col2)*((bl->nr+0x1F)>>5), "col2");
- bevp= (BevPoint *)(bl+1);
-
- /* for each point of poly make a bevel piece */
- bevp= (BevPoint *)(bl+1);
- for(a=0; a<bl->nr; a++,bevp++) {
- float fac = calc_taper(cu->taperobj, a, bl->nr);
-
- if (bevp->f1) {
- dl->bevelSplitFlag[a>>5] |= 1<<(a&0x1F);
- }
+ if (bevp->f1) {
+ dl->bevelSplitFlag[a>>5] |= 1<<(a&0x1F);
+ }
- /* rotate bevel piece and write in data */
- fp1= dlb->verts;
- for (b=0; b<dlb->nr; b++,fp1+=3,data+=3) {
- if(cu->flag & CU_3D) {
- float vec[3];
-
- vec[0]= fp1[1]+widfac;
- vec[1]= fp1[2];
- vec[2]= 0.0;
-
- Mat3MulVecfl(bevp->mat, vec);
-
- data[0]= bevp->x+ fac*vec[0];
- data[1]= bevp->y+ fac*vec[1];
- data[2]= bevp->z+ fac*vec[2];
- }
- else {
- data[0]= bevp->x+ fac*(widfac+fp1[1])*bevp->sina;
- data[1]= bevp->y+ fac*(widfac+fp1[1])*bevp->cosa;
- data[2]= bevp->z+ fac*fp1[2];
- }
+ /* rotate bevel piece and write in data */
+ fp1= dlb->verts;
+ for (b=0; b<dlb->nr; b++,fp1+=3,data+=3) {
+ if(cu->flag & CU_3D) {
+ float vec[3];
+
+ vec[0]= fp1[1]+widfac;
+ vec[1]= fp1[2];
+ vec[2]= 0.0;
+
+ Mat3MulVecfl(bevp->mat, vec);
+
+ data[0]= bevp->x+ fac*vec[0];
+ data[1]= bevp->y+ fac*vec[1];
+ data[2]= bevp->z+ fac*vec[2];
+ }
+ else {
+ data[0]= bevp->x+ fac*(widfac+fp1[1])*bevp->sina;
+ data[1]= bevp->y+ fac*(widfac+fp1[1])*bevp->cosa;
+ data[2]= bevp->z+ fac*fp1[2];
}
}
}
}
-
- freedisplist(&dlbev);
}
- curve_to_filledpoly(cu, &cu->nurb, dispbase);
+ freedisplist(&dlbev);
}
+
+ curve_to_filledpoly(cu, nubase, dispbase);
+
if(cu->flag & CU_PATH) calc_curvepath(ob);
if(!forOrco) curve_calc_modifiers_post(ob, nubase, &cu->disp, 0, originalVerts, deformedVerts);
diff --git a/source/blender/src/drawipo.c b/source/blender/src/drawipo.c
index 83b01a08307..8beb17061c6 100644
--- a/source/blender/src/drawipo.c
+++ b/source/blender/src/drawipo.c
@@ -1648,6 +1648,8 @@ void do_ipobuts(unsigned short event)
Object *ob= OBACT;
EditIpo *ei;
+ if(G.sipo->from==NULL) return;
+
switch(event) {
case B_IPO_REDR:
ei= get_active_editipo();
diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c
index 4e09bcf2080..63783c5d2ac 100644
--- a/source/blender/src/drawobject.c
+++ b/source/blender/src/drawobject.c
@@ -2263,7 +2263,7 @@ static void drawDispList(Object *ob, int dt)
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0);
drawDispListsolid(lb, ob);
}
- if(ob==G.obedit) {
+ if(ob==G.obedit && cu->bevobj==NULL && cu->taperobj==NULL) {
cpack(0);
draw_index_wire= 0;
drawDispListwire(lb);
@@ -2647,21 +2647,29 @@ static void drawnurb(Object *ob, Nurb *nurb, int dt)
Nurb *nu;
BevList *bl;
+ /* DispList */
+ BIF_ThemeColor(TH_WIRE);
+ drawDispList(ob, dt);
+
+ if(G.vd->zbuf) glDisable(GL_DEPTH_TEST);
+
/* first non-selected handles */
for(nu=nurb; nu; nu=nu->next) {
if((nu->type & 7)==CU_BEZIER) {
tekenhandlesN(nu, 0);
}
}
-
- /* then DispList */
-
- BIF_ThemeColor(TH_WIRE);
- drawDispList(ob, dt);
-
draw_editnurb(ob, nurb, 0);
draw_editnurb(ob, nurb, 1);
+ /* selected handles */
+ for(nu=nurb; nu; nu=nu->next) {
+ if((nu->type & 7)==1) tekenhandlesN(nu, 1);
+ tekenvertsN(nu, 0);
+ }
+
+ if(G.vd->zbuf) glEnable(GL_DEPTH_TEST);
+ /* direction vectors for 3d curve paths */
if(cu->flag & CU_3D) {
BIF_ThemeColor(TH_WIRE);
glBegin(GL_LINES);
@@ -2688,11 +2696,6 @@ static void drawnurb(Object *ob, Nurb *nurb, int dt)
if(G.vd->zbuf) glDisable(GL_DEPTH_TEST);
for(nu=nurb; nu; nu=nu->next) {
- if((nu->type & 7)==1) tekenhandlesN(nu, 1);
- tekenvertsN(nu, 0);
- }
-
- for(nu=nurb; nu; nu=nu->next) {
tekenvertsN(nu, 1);
}
@@ -3579,7 +3582,6 @@ void draw_object(Base *base)
case OB_CURVE:
case OB_SURF:
cu= ob->data;
- if (cu->disp.first==NULL) makeDispListCurveTypes(ob, 0);
if(ob==G.obedit) {
drawnurb(ob, editNurb.first, dt);
diff --git a/source/blender/src/editipo.c b/source/blender/src/editipo.c
index db0bdcf6a49..c79b97c08f1 100644
--- a/source/blender/src/editipo.c
+++ b/source/blender/src/editipo.c
@@ -1888,6 +1888,8 @@ Ipo *get_ipo(ID *from, short type, int make)
Ipo *ipo= NULL;
bAction *act;
+ if(from==NULL) return NULL;
+
if( type==ID_OB) {
ob= (Object *)from;
if(ob->id.lib) return NULL;