diff options
Diffstat (limited to 'source/blender/blenkernel/intern/curve.c')
-rw-r--r-- | source/blender/blenkernel/intern/curve.c | 181 |
1 files changed, 109 insertions, 72 deletions
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 358dd1914e7..2678b077b66 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -35,8 +35,10 @@ #include <stdlib.h> #include "MEM_guardedalloc.h" + #include "BLI_blenlib.h" #include "BLI_math.h" +#include "BLI_utildefines.h" #include "DNA_curve_types.h" #include "DNA_material_types.h" @@ -57,7 +59,7 @@ #include "BKE_library.h" #include "BKE_main.h" #include "BKE_object.h" -#include "BKE_utildefines.h" // VECCOPY + #include "ED_curve.h" @@ -74,12 +76,22 @@ void unlink_curve(Curve *cu) for(a=0; a<cu->totcol; a++) { if(cu->mat[a]) cu->mat[a]->id.us--; - cu->mat[a]= 0; + cu->mat[a]= NULL; } if(cu->vfont) cu->vfont->id.us--; - cu->vfont= 0; + cu->vfont= NULL; + + if(cu->vfontb) cu->vfontb->id.us--; + cu->vfontb= NULL; + + if(cu->vfonti) cu->vfonti->id.us--; + cu->vfonti= NULL; + + if(cu->vfontbi) cu->vfontbi->id.us--; + cu->vfontbi= NULL; + if(cu->key) cu->key->id.us--; - cu->key= 0; + cu->key= NULL; } /* frees editcurve entirely */ @@ -120,7 +132,7 @@ void free_curve(Curve *cu) if(cu->tb) MEM_freeN(cu->tb); } -Curve *add_curve(char *name, int type) +Curve *add_curve(const char *name, int type) { Curve *cu; @@ -129,7 +141,7 @@ Curve *add_curve(char *name, int type) cu->size[0]= cu->size[1]= cu->size[2]= 1.0; cu->flag= CU_FRONT|CU_BACK|CU_DEFORM_BOUNDS_OFF|CU_PATH_RADIUS; cu->pathlen= 100; - cu->resolu= cu->resolv= 12; + cu->resolu= cu->resolv= (type == OB_SURF) ? 4 : 12; cu->width= 1.0; cu->wordspace = 1.0; cu->spacing= cu->linedist= 1.0; @@ -145,7 +157,7 @@ Curve *add_curve(char *name, int type) cu->vfont= cu->vfontb= cu->vfonti= cu->vfontbi= get_builtin_font(); cu->vfont->id.us+=4; cu->str= MEM_mallocN(12, "str"); - strcpy(cu->str, "Text"); + BLI_strncpy(cu->str, "Text", 12); cu->len= cu->pos= 4; cu->strinfo= MEM_callocN(12*sizeof(CharInfo), "strinfo new"); cu->totbox= cu->actbox= 1; @@ -210,9 +222,12 @@ void make_local_curve(Curve *cu) */ if(cu->id.lib==0) return; - - if(cu->vfont) cu->vfont->id.lib= 0; - + + if(cu->vfont) cu->vfont->id.lib= NULL; + if(cu->vfontb) cu->vfontb->id.lib= NULL; + if(cu->vfonti) cu->vfonti->id.lib= NULL; + if(cu->vfontbi) cu->vfontbi->id.lib= NULL; + if(cu->id.us==1) { cu->id.lib= 0; cu->id.flag= LIB_LOCAL; @@ -623,7 +638,7 @@ static void makecyclicknots(float *knots, short pnts, short order) -void makeknots(Nurb *nu, short uv) +static void makeknots(Nurb *nu, short uv) { if(nu->type == CU_NURBS) { if(uv == 1) { @@ -655,6 +670,16 @@ void makeknots(Nurb *nu, short uv) } } +void nurbs_knot_calc_u(Nurb *nu) +{ + makeknots(nu, 1); +} + +void nurbs_knot_calc_v(Nurb *nu) +{ + makeknots(nu, 2); +} + static void basisNurb(float t, short order, short pnts, float *knots, float *basis, int *start, int *end) { float d, e; @@ -718,16 +743,16 @@ static void basisNurb(float t, short order, short pnts, float *knots, float *bas } -void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride) +void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride, int resolu, int resolv) /* coord_array has to be 3*4*resolu*resolv in size, and zero-ed */ { BPoint *bp; float *basisu, *basis, *basisv, *sum, *fp, *in; float u, v, ustart, uend, ustep, vstart, vend, vstep, sumdiv; - int i, j, iofs, jofs, cycl, len, resolu, resolv; + int i, j, iofs, jofs, cycl, len, curu, curv; int istart, iend, jsta, jen, *jstart, *jend, ratcomp; - int totu = nu->pntsu*nu->resolu, totv = nu->pntsv*nu->resolv; + int totu = nu->pntsu*resolu, totv = nu->pntsv*resolv; if(nu->knotsu==NULL || nu->knotsv==NULL) return; if(nu->orderu>nu->pntsu) return; @@ -784,9 +809,9 @@ void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride) else cycl= 0; v= vstart; basis= basisv; - resolv= totv; - while(resolv--) { - basisNurb(v, nu->orderv, (short)(nu->pntsv+cycl), nu->knotsv, basis, jstart+resolv, jend+resolv); + curv= totv; + while(curv--) { + basisNurb(v, nu->orderv, (short)(nu->pntsv+cycl), nu->knotsv, basis, jstart+curv, jend+curv); basis+= KNOTSV(nu); v+= vstep; } @@ -795,17 +820,17 @@ void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride) else cycl= 0; in= coord_array; u= ustart; - resolu= totu; - while(resolu--) { + curu= totu; + while(curu--) { basisNurb(u, nu->orderu, (short)(nu->pntsu+cycl), nu->knotsu, basisu, &istart, &iend); basis= basisv; - resolv= totv; - while(resolv--) { + curv= totv; + while(curv--) { - jsta= jstart[resolv]; - jen= jend[resolv]; + jsta= jstart[curv]; + jen= jend[curv]; /* calculate sum */ sumdiv= 0.0; @@ -1033,10 +1058,13 @@ static void forward_diff_bezier_cotangent(float *p0, float *p1, float *p2, float float *make_orco_surf(Object *ob) { + /* Note: this function is used in convertblender only atm, so + * suppose nonzero curve's render resolution should always be used */ Curve *cu= ob->data; Nurb *nu; int a, b, tot=0; int sizeu, sizev; + int resolu, resolv; float *fp, *coord_array; /* first calculate the size of the datablock */ @@ -1050,9 +1078,12 @@ float *make_orco_surf(Object *ob) See also convertblender.c: init_render_surf() */ + + resolu= cu->resolu_ren ? cu->resolu_ren : nu->resolu; + resolv= cu->resolv_ren ? cu->resolv_ren : nu->resolv; - sizeu = nu->pntsu*nu->resolu; - sizev = nu->pntsv*nu->resolv; + sizeu = nu->pntsu*resolu; + sizev = nu->pntsv*resolv; if (nu->flagu & CU_NURB_CYCLIC) sizeu++; if (nu->flagv & CU_NURB_CYCLIC) sizev++; if(nu->pntsv>1) tot+= sizeu * sizev; @@ -1064,9 +1095,12 @@ float *make_orco_surf(Object *ob) nu= cu->nurb.first; while(nu) { + resolu= cu->resolu_ren ? cu->resolu_ren : nu->resolu; + resolv= cu->resolv_ren ? cu->resolv_ren : nu->resolv; + if(nu->pntsv>1) { - sizeu = nu->pntsu*nu->resolu; - sizev = nu->pntsv*nu->resolv; + sizeu = nu->pntsu*resolu; + sizev = nu->pntsv*resolv; if (nu->flagu & CU_NURB_CYCLIC) sizeu++; if (nu->flagv & CU_NURB_CYCLIC) sizev++; @@ -1087,10 +1121,10 @@ float *make_orco_surf(Object *ob) } } else { - float *_tdata= MEM_callocN((nu->pntsu*nu->resolu) * (nu->pntsv*nu->resolv) *3*sizeof(float), "temp data"); + float *_tdata= MEM_callocN((nu->pntsu*resolu) * (nu->pntsv*resolv) *3*sizeof(float), "temp data"); float *tdata= _tdata; - makeNurbfaces(nu, tdata, 0); + makeNurbfaces(nu, tdata, 0, resolu, resolv); for(b=0; b<sizeu; b++) { int use_b= b; @@ -1102,7 +1136,7 @@ float *make_orco_surf(Object *ob) if (a==sizev-1 && (nu->flagv & CU_NURB_CYCLIC)) use_a= 0; - tdata = _tdata + 3 * (use_b * (nu->pntsv*nu->resolv) + use_a); + tdata = _tdata + 3 * (use_b * (nu->pntsv*resolv) + use_a); fp[0]= (tdata[0]-cu->loc[0])/cu->size[0]; fp[1]= (tdata[1]-cu->loc[1])/cu->size[1]; @@ -1180,8 +1214,8 @@ float *make_orco_curve(Scene *scene, Object *ob) for (u=0; u<sizev; u++) { for (v=0; v<sizeu; v++,fp+=3) { if (cu->flag & CU_UV_ORCO) { - fp[0]= 2.0f*u/(dl->parts-1) - 1.0f; - fp[1]= 2.0f*v/(dl->nr-1) - 1.0f; + fp[0]= 2.0f*u/(sizev - 1) - 1.0f; + fp[1]= 2.0f*v/(sizeu - 1) - 1.0f; fp[2]= 0.0; } else { float *vert; @@ -1234,10 +1268,10 @@ void makebevelcurve(Scene *scene, Object *ob, ListBase *disp, int forRender) makeDispListCurveTypes_forRender(scene, cu->bevobj, &bevdisp, NULL, 0); dl= bevdisp.first; } else { - dl= bevcu->disp.first; + dl= cu->bevobj->disp.first; if(dl==0) { makeDispListCurveTypes(scene, cu->bevobj, 0); - dl= bevcu->disp.first; + dl= cu->bevobj->disp.first; } } @@ -1712,7 +1746,7 @@ static void bevel_list_smooth(BevList *bl, int smooth_iter) if(bl->poly== -1) { /* check its not cyclic */ /* skip the first point */ - bevp0= bevp1; + /* bevp0= bevp1; */ bevp1= bevp2; bevp2++; nr--; @@ -1743,7 +1777,7 @@ static void bevel_list_smooth(BevList *bl, int smooth_iter) normalize_qt(bevp1->quat); - bevp0= bevp1; + /* bevp0= bevp1; */ /* UNUSED */ bevp1= bevp2; bevp2++; } @@ -1922,7 +1956,7 @@ static void make_bevel_list_3D_tangent(BevList *bl) normalize_v3(cross_tmp); tri_to_quat( bevp1->quat,zero, cross_tmp, bevp1->tan); /* XXX - could be faster */ - bevp0= bevp1; + /* bevp0= bevp1; */ /* UNUSED */ bevp1= bevp2; bevp2++; } @@ -2874,38 +2908,41 @@ void switchdirectionNurb(Nurb *nu) bp2--; } if(nu->type == CU_NURBS) { - /* inverse knots */ - a= KNOTSU(nu); - fp1= nu->knotsu; - fp2= fp1+(a-1); - a/= 2; - while(fp1!=fp2 && a>0) { - SWAP(float, *fp1, *fp2); - a--; - fp1++; - fp2--; - } - /* and make in increasing order again */ - a= KNOTSU(nu); - fp1= nu->knotsu; - fp2=tempf= MEM_mallocN(sizeof(float)*a, "switchdirect"); - while(a--) { - fp2[0]= fabs(fp1[1]-fp1[0]); - fp1++; - fp2++; - } - - a= KNOTSU(nu)-1; - fp1= nu->knotsu; - fp2= tempf; - fp1[0]= 0.0; - fp1++; - while(a--) { - fp1[0]= fp1[-1]+fp2[0]; + /* no knots for too short paths */ + if(nu->knotsu) { + /* inverse knots */ + a= KNOTSU(nu); + fp1= nu->knotsu; + fp2= fp1+(a-1); + a/= 2; + while(fp1!=fp2 && a>0) { + SWAP(float, *fp1, *fp2); + a--; + fp1++; + fp2--; + } + /* and make in increasing order again */ + a= KNOTSU(nu); + fp1= nu->knotsu; + fp2=tempf= MEM_mallocN(sizeof(float)*a, "switchdirect"); + while(a--) { + fp2[0]= fabs(fp1[1]-fp1[0]); + fp1++; + fp2++; + } + + a= KNOTSU(nu)-1; + fp1= nu->knotsu; + fp2= tempf; + fp1[0]= 0.0; fp1++; - fp2++; + while(a--) { + fp1[0]= fp1[-1]+fp2[0]; + fp1++; + fp2++; + } + MEM_freeN(tempf); } - MEM_freeN(tempf); } } else { @@ -2928,7 +2965,7 @@ void switchdirectionNurb(Nurb *nu) } -float (*curve_getVertexCos(Curve *cu, ListBase *lb, int *numVerts_r))[3] +float (*curve_getVertexCos(Curve *UNUSED(cu), ListBase *lb, int *numVerts_r))[3] { int i, numVerts = *numVerts_r = count_curveverts(lb); float *co, (*cos)[3] = MEM_mallocN(sizeof(*cos)*numVerts, "cu_vcos"); @@ -2956,7 +2993,7 @@ float (*curve_getVertexCos(Curve *cu, ListBase *lb, int *numVerts_r))[3] return cos; } -void curve_applyVertexCos(Curve *cu, ListBase *lb, float (*vertexCos)[3]) +void curve_applyVertexCos(Curve *UNUSED(cu), ListBase *lb, float (*vertexCos)[3]) { float *co = vertexCos[0]; Nurb *nu; @@ -2981,7 +3018,7 @@ void curve_applyVertexCos(Curve *cu, ListBase *lb, float (*vertexCos)[3]) } } -float (*curve_getKeyVertexCos(Curve *cu, ListBase *lb, float *key))[3] +float (*curve_getKeyVertexCos(Curve *UNUSED(cu), ListBase *lb, float *key))[3] { int i, numVerts = count_curveverts(lb); float *co, (*cos)[3] = MEM_mallocN(sizeof(*cos)*numVerts, "cu_vcos"); @@ -3012,7 +3049,7 @@ float (*curve_getKeyVertexCos(Curve *cu, ListBase *lb, float *key))[3] return cos; } -void curve_applyKeyVertexTilts(Curve *cu, ListBase *lb, float *key) +void curve_applyKeyVertexTilts(Curve *UNUSED(cu), ListBase *lb, float *key) { Nurb *nu; int i; @@ -3024,7 +3061,7 @@ void curve_applyKeyVertexTilts(Curve *cu, ListBase *lb, float *key) for(i=0; i<nu->pntsu; i++,bezt++) { key+=3*3; bezt->alfa= *key; - key++; + key+=3; } } else { |