diff options
author | Ton Roosendaal <ton@blender.org> | 2005-10-03 18:13:47 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2005-10-03 18:13:47 +0400 |
commit | 12dc56578609e45b676490200fffabf8f464655b (patch) | |
tree | e8200304264b33bed4483b57c47caf043164dcdc /source | |
parent | 45edb9cecb14a12a42230b9e12acf0ec5c2d07ee (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.c | 19 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 153 | ||||
-rw-r--r-- | source/blender/src/drawipo.c | 2 | ||||
-rw-r--r-- | source/blender/src/drawobject.c | 28 | ||||
-rw-r--r-- | source/blender/src/editipo.c | 2 |
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; |