From d16bde417fb985eb348cdbf2314e324fa9d098a9 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 12 Sep 2009 14:12:37 +0000 Subject: new struct PathPoint for each path element (replaces float[4]), Paths now store radius and quaternion Added optional quat and radius args to anim.c's where_on_path(...), currently unused. also cleanup some warnings. --- source/blender/blenkernel/BKE_anim.h | 2 +- source/blender/blenkernel/intern/anim.c | 64 +++++++++++++++------- source/blender/blenkernel/intern/constraint.c | 8 +-- source/blender/blenkernel/intern/font.c | 4 +- source/blender/blenkernel/intern/lattice.c | 14 +++-- source/blender/blenkernel/intern/object.c | 4 +- source/blender/blenkernel/intern/particle.c | 5 +- source/blender/blenkernel/intern/particle_system.c | 2 +- source/blender/blenkernel/intern/smoke.c | 1 + source/blender/blenlib/BLI_arithb.h | 2 +- source/blender/blenlib/intern/arithb.c | 16 +++--- source/blender/editors/space_view3d/drawobject.c | 4 +- source/blender/makesdna/DNA_curve_types.h | 11 +++- 13 files changed, 88 insertions(+), 49 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/BKE_anim.h b/source/blender/blenkernel/BKE_anim.h index 5ea511738ad..4b1e758da54 100644 --- a/source/blender/blenkernel/BKE_anim.h +++ b/source/blender/blenkernel/BKE_anim.h @@ -51,7 +51,7 @@ typedef struct DupliObject { void free_path(struct Path *path); void calc_curvepath(struct Object *ob); int interval_test(int min, int max, int p1, int cycl); -int where_on_path(struct Object *ob, float ctime, float *vec, float *dir); +int where_on_path(struct Object *ob, float ctime, float *vec, float *dir, float *quat, float *radius); struct ListBase *object_duplilist(struct Scene *sce, struct Object *ob); void free_object_duplilist(struct ListBase *lb); diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c index 4b1cc36edeb..8cb88cdb786 100644 --- a/source/blender/blenkernel/intern/anim.c +++ b/source/blender/blenkernel/intern/anim.c @@ -87,15 +87,16 @@ void free_path(Path *path) void calc_curvepath(Object *ob) { BevList *bl; - BevPoint *bevp, *bevpn, *bevpfirst, *bevplast, *tempbevp; + BevPoint *bevp, *bevpn, *bevpfirst, *bevplast; + PathPoint *pp; Curve *cu; Nurb *nu; Path *path; float *fp, *dist, *maxdist, xyz[3]; float fac, d=0, fac1, fac2; int a, tot, cycl=0; - float *ft; + /* in a path vertices are with equal differences: path->len = number of verts */ /* NOW WITH BEVELCURVE!!! */ @@ -145,7 +146,7 @@ void calc_curvepath(Object *ob) /* the path verts in path->data */ /* now also with TILT value */ - ft= path->data = (float *)MEM_callocN(16*path->len, "pathdata"); + pp= path->data = (PathPoint *)MEM_callocN(sizeof(PathPoint)*4*path->len, "pathdata"); // XXX - why *4? - in 2.4x each element was 4 and the size was 16, so better leave for now - Campbell bevp= bevpfirst; bevpn= bevp+1; @@ -175,10 +176,13 @@ void calc_curvepath(Object *ob) fac1= fac2/fac1; fac2= 1.0f-fac1; - VecLerpf(ft, bevp->vec, bevpn->vec, fac2); - ft[3]= fac1*bevp->alfa+ fac2*(bevpn)->alfa; + VecLerpf(pp->vec, bevp->vec, bevpn->vec, fac2); + pp->vec[3]= fac1*bevp->alfa + fac2*bevpn->alfa; + pp->radius= fac1*bevp->radius + fac2*bevpn->radius; + QuatInterpol(pp->quat, bevp->quat, bevpn->quat, fac2); + NormalQuat(pp->quat); - ft+= 4; + pp++; } MEM_freeN(dist); @@ -202,13 +206,14 @@ int interval_test(int min, int max, int p1, int cycl) /* warning, *vec needs FOUR items! */ /* ctime is normalized range <0-1> */ -int where_on_path(Object *ob, float ctime, float *vec, float *dir) /* returns OK */ +int where_on_path(Object *ob, float ctime, float *vec, float *dir, float *quat, float *radius) /* returns OK */ { Curve *cu; Nurb *nu; BevList *bl; Path *path; - float *fp, *p0, *p1, *p2, *p3, fac; + PathPoint *pp, *p0, *p1, *p2, *p3; + float fac; float data[4]; int cycl=0, s0, s1, s2, s3; @@ -219,7 +224,7 @@ int where_on_path(Object *ob, float ctime, float *vec, float *dir) /* returns OK return 0; } path= cu->path; - fp= path->data; + pp= path->data; /* test for cyclic */ bl= cu->bev.first; @@ -238,19 +243,19 @@ int where_on_path(Object *ob, float ctime, float *vec, float *dir) /* returns OK s2= interval_test(0, path->len-1-cycl, s1+1, cycl); s3= interval_test(0, path->len-1-cycl, s1+2, cycl); - p0= fp + 4*s0; - p1= fp + 4*s1; - p2= fp + 4*s2; - p3= fp + 4*s3; + p0= pp + s0; + p1= pp + s1; + p2= pp + s2; + p3= pp + s3; /* note, commented out for follow constraint */ //if(cu->flag & CU_FOLLOW) { key_curve_tangent_weights(1.0f-fac, data, KEY_BSPLINE); - dir[0]= data[0]*p0[0] + data[1]*p1[0] + data[2]*p2[0] + data[3]*p3[0] ; - dir[1]= data[0]*p0[1] + data[1]*p1[1] + data[2]*p2[1] + data[3]*p3[1] ; - dir[2]= data[0]*p0[2] + data[1]*p1[2] + data[2]*p2[2] + data[3]*p3[2] ; + dir[0]= data[0]*p0->vec[0] + data[1]*p1->vec[0] + data[2]*p2->vec[0] + data[3]*p3->vec[0] ; + dir[1]= data[0]*p0->vec[1] + data[1]*p1->vec[1] + data[2]*p2->vec[1] + data[3]*p3->vec[1] ; + dir[2]= data[0]*p0->vec[2] + data[1]*p1->vec[2] + data[2]*p2->vec[2] + data[3]*p3->vec[2] ; /* make compatible with vectoquat */ dir[0]= -dir[0]; @@ -266,11 +271,30 @@ int where_on_path(Object *ob, float ctime, float *vec, float *dir) /* returns OK else if(s0==s1 || p2==p3) key_curve_position_weights(1.0f-fac, data, KEY_CARDINAL); else key_curve_position_weights(1.0f-fac, data, KEY_BSPLINE); - vec[0]= data[0]*p0[0] + data[1]*p1[0] + data[2]*p2[0] + data[3]*p3[0] ; - vec[1]= data[0]*p0[1] + data[1]*p1[1] + data[2]*p2[1] + data[3]*p3[1] ; - vec[2]= data[0]*p0[2] + data[1]*p1[2] + data[2]*p2[2] + data[3]*p3[2] ; + vec[0]= data[0]*p0->vec[0] + data[1]*p1->vec[0] + data[2]*p2->vec[0] + data[3]*p3->vec[0] ; /* X */ + vec[1]= data[0]*p0->vec[1] + data[1]*p1->vec[1] + data[2]*p2->vec[1] + data[3]*p3->vec[1] ; /* Y */ + vec[2]= data[0]*p0->vec[2] + data[1]*p1->vec[2] + data[2]*p2->vec[2] + data[3]*p3->vec[2] ; /* Z */ + vec[3]= data[0]*p0->vec[3] + data[1]*p1->vec[3] + data[2]*p2->vec[3] + data[3]*p3->vec[3] ; /* Tilt, should not be needed since we have quat still used */ + /* Need to verify the quat interpolation is correct - XXX */ + + if (quat) { + float totfac, q1[4], q2[4]; + + totfac= data[0]+data[1]; + QuatInterpol(q1, p0->quat, p1->quat, data[0] / totfac); + NormalQuat(q1); + + totfac= data[2]+data[3]; + QuatInterpol(q2, p2->quat, p3->quat, data[2] / totfac); + NormalQuat(q2); + + totfac = data[0]+data[1]+data[2]+data[3]; + QuatInterpol(quat, q1, q2, (data[0]+data[1]) / totfac); + NormalQuat(quat); + } - vec[3]= data[0]*p0[3] + data[1]*p1[3] + data[2]*p2[3] + data[3]*p3[3] ; + if(radius) + *radius= data[0]*p0->radius + data[1]*p1->radius + data[2]*p2->radius + data[3]*p3->radius; return 1; } diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c index dfbcc51a93c..6ab9f5844b1 100644 --- a/source/blender/blenkernel/intern/constraint.c +++ b/source/blender/blenkernel/intern/constraint.c @@ -1174,7 +1174,7 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr */ /* only happens on reload file, but violates depsgraph still... fix! */ - if (cu->path==NULL || cu->path->data==NULL) + if (cu->path==NULL || cu->path->data==NULL) makeDispListCurveTypes(cob->scene, ct->tar, 0); if (cu->path && cu->path->data) { @@ -1196,7 +1196,7 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr curvetime= data->offset; // XXX might need a more sensible value } - if ( where_on_path(ct->tar, curvetime, vec, dir) ) { + if ( where_on_path(ct->tar, curvetime, vec, dir, NULL, NULL) ) { if (data->followflag & FOLLOWPATH_FOLLOW) { vectoquat(dir, (short) data->trackflag, (short) data->upflag, quat); @@ -2864,7 +2864,7 @@ static void clampto_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstrain */ /* only happens on reload file, but violates depsgraph still... fix! */ - if (cu->path==NULL || cu->path->data==NULL) + if (cu->path==NULL || cu->path->data==NULL) makeDispListCurveTypes(cob->scene, ct->tar, 0); } @@ -2975,7 +2975,7 @@ static void clampto_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *ta } /* 3. position on curve */ - if (where_on_path(ct->tar, curvetime, vec, dir) ) { + if (where_on_path(ct->tar, curvetime, vec, dir, NULL, NULL) ) { Mat4One(totmat); VECCOPY(totmat[3], vec); diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c index 5ce021e3931..411b2448dea 100644 --- a/source/blender/blenkernel/intern/font.c +++ b/source/blender/blenkernel/intern/font.c @@ -1039,8 +1039,8 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode) /* calc the right loc AND the right rot separately */ /* vec, tvec need 4 items */ - where_on_path(cu->textoncurve, ctime, vec, tvec); - where_on_path(cu->textoncurve, ctime+dtime, tvec, rotvec); + where_on_path(cu->textoncurve, ctime, vec, tvec, NULL, NULL); + where_on_path(cu->textoncurve, ctime+dtime, tvec, rotvec, NULL, NULL); VecMulf(vec, sizefac); diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c index 801511de532..e2c2723d036 100644 --- a/source/blender/blenkernel/intern/lattice.c +++ b/source/blender/blenkernel/intern/lattice.c @@ -472,7 +472,7 @@ static void init_curve_deform(Object *par, Object *ob, CurveDeform *cd, int dloc } /* this makes sure we can extend for non-cyclic. *vec needs 4 items! */ -static int where_on_path_deform(Object *ob, float ctime, float *vec, float *dir) /* returns OK */ +static int where_on_path_deform(Object *ob, float ctime, float *vec, float *dir, float *quat, float *radius) /* returns OK */ { Curve *cu= ob->data; BevList *bl; @@ -490,21 +490,25 @@ static int where_on_path_deform(Object *ob, float ctime, float *vec, float *dir) else ctime1= ctime; /* vec needs 4 items */ - if(where_on_path(ob, ctime1, vec, dir)) { + if(where_on_path(ob, ctime1, vec, dir, quat, radius)) { if(cycl==0) { Path *path= cu->path; float dvec[3]; if(ctime < 0.0) { - VecSubf(dvec, path->data+4, path->data); + VecSubf(dvec, path->data[1].vec, path->data[0].vec); VecMulf(dvec, ctime*(float)path->len); VECADD(vec, vec, dvec); + if(quat) QUATCOPY(quat, path->data[0].quat); + if(radius) *radius= path->data[0].radius; } else if(ctime > 1.0) { - VecSubf(dvec, path->data+4*path->len-4, path->data+4*path->len-8); + VecSubf(dvec, path->data[path->len-1].vec, path->data[path->len-2].vec); VecMulf(dvec, (ctime-1.0)*(float)path->len); VECADD(vec, vec, dvec); + if(quat) QUATCOPY(quat, path->data[path->len-1].quat); + if(radius) *radius= path->data[path->len-1].radius; } } return 1; @@ -575,7 +579,7 @@ static int calc_curve_deform(Scene *scene, Object *par, float *co, short axis, C } #endif // XXX old animation system - if( where_on_path_deform(par, fac, loc, dir)) { /* returns OK */ + if( where_on_path_deform(par, fac, loc, dir, NULL, NULL)) { /* returns OK */ float q[4], mat[3][3], quat[4]; if(cd->no_rot_axis) /* set by caller */ diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index a0004aaae49..f04512cffc9 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -1114,7 +1114,7 @@ ParticleSystem *copy_particlesystem(ParticleSystem *psys) } if(psys->clmd) { - ClothModifierData *nclmd = modifier_new(eModifierType_Cloth); + ClothModifierData *nclmd = (ClothModifierData *)modifier_new(eModifierType_Cloth); modifier_copyData((ModifierData*)psys->clmd, (ModifierData*)nclmd); psys->hair_in_dm = psys->hair_out_dm = NULL; } @@ -1694,7 +1694,7 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4]) /* vec: 4 items! */ - if( where_on_path(par, ctime, vec, dir) ) { + if( where_on_path(par, ctime, vec, dir, NULL, NULL) ) { if(cu->flag & CU_FOLLOW) { vectoquat(dir, ob->trackflag, ob->upflag, quat); diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 964201ccb26..404203c4508 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -60,6 +60,7 @@ #include "BKE_anim.h" #include "BKE_boids.h" +#include "BKE_cloth.h" #include "BKE_global.h" #include "BKE_main.h" #include "BKE_lattice.h" @@ -1974,9 +1975,9 @@ int do_guide(Scene *scene, ParticleKey *state, int pa_num, float time, ListBase } if(pd->flag & PFIELD_GUIDE_PATH_ADD) - where_on_path(eob, f_force*guidetime, guidevec, guidedir); + where_on_path(eob, f_force*guidetime, guidevec, guidedir, NULL, NULL); else - where_on_path(eob, guidetime, guidevec, guidedir); + where_on_path(eob, guidetime, guidevec, guidedir, NULL, NULL); Mat4MulVecfl(ec->ob->obmat,guidevec); Mat4Mul3Vecfl(ec->ob->obmat,guidedir); diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 88b85bcfa29..3796e3e0ba5 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -2536,7 +2536,7 @@ static void precalc_effectors(Scene *scene, Object *ob, ParticleSystem *psys, Pa && part->phystype!=PART_PHYS_BOIDS) { float vec[4]; - where_on_path(ec->ob, 0.0, vec, vec2); + where_on_path(ec->ob, 0.0, vec, vec2, NULL, NULL); Mat4MulVecfl(ec->ob->obmat,vec); Mat4Mul3Vecfl(ec->ob->obmat,vec2); diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c index fe5541211ce..af79fd74ae8 100644 --- a/source/blender/blenkernel/intern/smoke.c +++ b/source/blender/blenkernel/intern/smoke.c @@ -38,6 +38,7 @@ #include #include #include "stdio.h" +#include "string.h" /* memset */ #include "BLI_linklist.h" #include "BLI_rand.h" diff --git a/source/blender/blenlib/BLI_arithb.h b/source/blender/blenlib/BLI_arithb.h index 8eb4d5972e3..40076755fa0 100644 --- a/source/blender/blenlib/BLI_arithb.h +++ b/source/blender/blenlib/BLI_arithb.h @@ -299,7 +299,7 @@ void Mat3MulMat3(float *m1, float *m3, float *m2); #endif void Mat4MulMat34(float (*m1)[4], float (*m3)[3], float (*m2)[4]); void Mat4CpyMat4(float m1[][4], float m2[][4]); -void Mat4SwapMat4(float *m1, float *m2); +void Mat4SwapMat4(float m1[][4], float m2[][4]); void Mat3CpyMat3(float m1[][3], float m2[][3]); void Mat3MulSerie(float answ[][3], diff --git a/source/blender/blenlib/intern/arithb.c b/source/blender/blenlib/intern/arithb.c index f0dba4255ad..9a05cd75ad0 100644 --- a/source/blender/blenlib/intern/arithb.c +++ b/source/blender/blenlib/intern/arithb.c @@ -614,17 +614,17 @@ void Mat4CpyMat4(float m1[][4], float m2[][4]) memcpy(m1, m2, 4*4*sizeof(float)); } -void Mat4SwapMat4(float *m1, float *m2) +void Mat4SwapMat4(float m1[][4], float m2[][4]) { float t; - int i; + int i, j; - for(i=0;i<16;i++) { - t= *m1; - *m1= *m2; - *m2= t; - m1++; - m2++; + for(i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + t = m1[i][j]; + m1[i][j] = m2[i][j]; + m2[i][j] = t; + } } } diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 69bc8e1f67e..e886bbbd5f2 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -4546,13 +4546,13 @@ static void draw_forcefield(Scene *scene, Object *ob) /*path end*/ setlinestyle(3); - where_on_path(ob, 1.0f, guidevec1, guidevec2); + where_on_path(ob, 1.0f, guidevec1, guidevec2, NULL, NULL); UI_ThemeColorBlend(curcol, TH_BACK, 0.5); drawcircball(GL_LINE_LOOP, guidevec1, mindist, imat); /*path beginning*/ setlinestyle(0); - where_on_path(ob, 0.0f, guidevec1, guidevec2); + where_on_path(ob, 0.0f, guidevec1, guidevec2, NULL, NULL); UI_ThemeColorBlend(curcol, TH_BACK, 0.5); drawcircball(GL_LINE_LOOP, guidevec1, mindist, imat); diff --git a/source/blender/makesdna/DNA_curve_types.h b/source/blender/makesdna/DNA_curve_types.h index 013491187ae..8473f91a7f7 100644 --- a/source/blender/makesdna/DNA_curve_types.h +++ b/source/blender/makesdna/DNA_curve_types.h @@ -49,12 +49,21 @@ struct AnimData; struct SelBox; struct EditFont; +/* These two Lines with # tell makesdna this struct can be excluded. */ +# +# +typedef struct PathPoint { + float vec[4]; /* grr, cant get rid of tilt yet */ + float quat[4]; + float radius; +} PathPoint; + /* These two Lines with # tell makesdna this struct can be excluded. */ # # typedef struct Path { int len; - float *data; + struct PathPoint *data; float totdist; } Path; -- cgit v1.2.3