diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-02-03 05:30:21 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-02-03 05:30:21 +0400 |
commit | 075fee4d58a65b4313bb7e984ae195690f4c7bfd (patch) | |
tree | e801da2591eda34a4c4c7fd5436ff476353b1c55 /source/blender/blenkernel/intern | |
parent | 68cc7e168207c4c519f54f7e0f7f638768386cd0 (diff) | |
parent | 050963b6a9529e0abdd597d163ddc4343c0b15c2 (diff) |
svn merge ^/trunk/blender -r43830:43864
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r-- | source/blender/blenkernel/intern/constraint.c | 125 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/displist.c | 99 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/navmesh_conversion.c | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/sequencer.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/texture.c | 32 |
5 files changed, 151 insertions, 111 deletions
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c index efeacabdba9..4c2c05e473f 100644 --- a/source/blender/blenkernel/intern/constraint.c +++ b/source/blender/blenkernel/intern/constraint.c @@ -224,6 +224,50 @@ void constraints_clear_evalob (bConstraintOb *cob) /* -------------- Space-Conversion API -------------- */ +static void constraint_pchan_diff_mat(bPoseChannel *pchan, float diff_mat[4][4]) +{ + if (pchan->parent) { + float offs_bone[4][4]; + + /* construct offs_bone the same way it is done in armature.c */ + copy_m4_m3(offs_bone, pchan->bone->bone_mat); + copy_v3_v3(offs_bone[3], pchan->bone->head); + offs_bone[3][1] += pchan->bone->parent->length; + + if (pchan->bone->flag & BONE_HINGE) { + /* pose_mat = par_pose-space_location * chan_mat */ + float tmat[4][4]; + + /* the rotation of the parent restposition */ + copy_m4_m4(tmat, pchan->bone->parent->arm_mat); + + /* the location of actual parent transform */ + copy_v3_v3(tmat[3], offs_bone[3]); + zero_v3(offs_bone[3]); + mul_m4_v3(pchan->parent->pose_mat, tmat[3]); + + mult_m4_m4m4(diff_mat, tmat, offs_bone); + } + else { + /* pose_mat = par_pose_mat * bone_mat * chan_mat */ + if (pchan->bone->flag & BONE_NO_SCALE) { + float tmat[4][4]; + copy_m4_m4(tmat, pchan->parent->pose_mat); + normalize_m4(tmat); + mult_m4_m4m4(diff_mat, tmat, offs_bone); + } + else { + mult_m4_m4m4(diff_mat, pchan->parent->pose_mat, offs_bone); + } + } + } + else { + /* pose_mat = chan_mat * arm_mat */ + copy_m4_m4(diff_mat, pchan->bone->arm_mat); + } +} + + /* This function is responsible for the correct transformations/conversions * of a matrix from one space to another for constraint evaluation. * For now, this is only implemented for Objects and PoseChannels. @@ -267,40 +311,10 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4 /* pose to local */ else if (to == CONSTRAINT_SPACE_LOCAL) { if (pchan->bone) { - if (pchan->parent) { - float offs_bone[4][4]; - - /* construct offs_bone the same way it is done in armature.c */ - copy_m4_m3(offs_bone, pchan->bone->bone_mat); - copy_v3_v3(offs_bone[3], pchan->bone->head); - offs_bone[3][1]+= pchan->bone->parent->length; - - if (pchan->bone->flag & BONE_HINGE) { - /* pose_mat = par_pose-space_location * chan_mat */ - float tmat[4][4]; - - /* the rotation of the parent restposition */ - copy_m4_m4(tmat, pchan->bone->parent->arm_mat); - - /* the location of actual parent transform */ - copy_v3_v3(tmat[3], offs_bone[3]); - offs_bone[3][0]= offs_bone[3][1]= offs_bone[3][2]= 0.0f; - mul_m4_v3(pchan->parent->pose_mat, tmat[3]); - - mult_m4_m4m4(diff_mat, tmat, offs_bone); - invert_m4_m4(imat, diff_mat); - } - else { - /* pose_mat = par_pose_mat * bone_mat * chan_mat */ - mult_m4_m4m4(diff_mat, pchan->parent->pose_mat, offs_bone); - invert_m4_m4(imat, diff_mat); - } - } - else { - /* pose_mat = chan_mat * arm_mat */ - invert_m4_m4(imat, pchan->bone->arm_mat); - } - + constraint_pchan_diff_mat(pchan, diff_mat); + + invert_m4_m4(imat, diff_mat); + copy_m4_m4(tempmat, mat); mult_m4_m4m4(mat, imat, tempmat); @@ -325,44 +339,11 @@ void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4 { /* local to pose - do inverse procedure that was done for pose to local */ if (pchan->bone) { - /* we need the posespace_matrix = local_matrix + (parent_posespace_matrix + restpos) */ - if (pchan->parent) { - float offs_bone[4][4]; - - /* construct offs_bone the same way it is done in armature.c */ - copy_m4_m3(offs_bone, pchan->bone->bone_mat); - copy_v3_v3(offs_bone[3], pchan->bone->head); - offs_bone[3][1]+= pchan->bone->parent->length; - - if (pchan->bone->flag & BONE_HINGE) { - /* pose_mat = par_pose-space_location * chan_mat */ - float tmat[4][4]; - - /* the rotation of the parent restposition */ - copy_m4_m4(tmat, pchan->bone->parent->arm_mat); - - /* the location of actual parent transform */ - copy_v3_v3(tmat[3], offs_bone[3]); - zero_v3(offs_bone[3]); - mul_m4_v3(pchan->parent->pose_mat, tmat[3]); - - mult_m4_m4m4(diff_mat, tmat, offs_bone); - copy_m4_m4(tempmat, mat); - mult_m4_m4m4(mat, diff_mat, tempmat); - } - else { - /* pose_mat = par_pose_mat * bone_mat * chan_mat */ - mult_m4_m4m4(diff_mat, pchan->parent->pose_mat, offs_bone); - copy_m4_m4(tempmat, mat); - mult_m4_m4m4(mat, diff_mat, tempmat); - } - } - else { - copy_m4_m4(diff_mat, pchan->bone->arm_mat); - - copy_m4_m4(tempmat, mat); - mult_m4_m4m4(mat, diff_mat, tempmat); - } + /* we need the posespace_matrix = local_matrix + (parent_posespace_matrix + restpos) */ + constraint_pchan_diff_mat(pchan, diff_mat); + + copy_m4_m4(tempmat, mat); + mult_m4_m4m4(mat, diff_mat, tempmat); } /* use pose-space as stepping stone for other spaces */ diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index c2c6f8d5b92..5661ab63f1a 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -1181,6 +1181,60 @@ void makeDispListSurf(Scene *scene, Object *ob, ListBase *dispbase, forRender, originalVerts, deformedVerts); } +static void rotateBevelPiece(Curve *cu, BevPoint *bevp, DispList *dlb, float widfac, float fac, float **data_r) +{ + float *fp, *data = *data_r; + int b; + + fp = dlb->verts; + for (b = 0; b<dlb->nr; b++,fp += 3,data += 3) { + if(cu->flag & CU_3D) { + float vec[3]; + + vec[0] = fp[1]+widfac; + vec[1] = fp[2]; + vec[2 ]= 0.0; + + mul_qt_v3(bevp->quat, vec); + + data[0] = bevp->vec[0] + fac*vec[0]; + data[1] = bevp->vec[1] + fac*vec[1]; + data[2] = bevp->vec[2] + fac*vec[2]; + } + else { + data[0] = bevp->vec[0] + fac*(widfac+fp[1])*bevp->sina; + data[1] = bevp->vec[1] + fac*(widfac+fp[1])*bevp->cosa; + data[2] = bevp->vec[2] + fac*fp[2]; + } + } + + *data_r = data; +} + +static void fillBevelCap(Curve *cu, Nurb *nu, BevPoint *bevp, DispList *dlb, float fac, float widfac, ListBase *dispbase) +{ + DispList *dl; + float *data; + + dl= MEM_callocN(sizeof(DispList), "makeDispListbev2"); + dl->verts= data= MEM_callocN(3*sizeof(float)*dlb->nr, "dlverts"); + + dl->type= DL_POLY; + + dl->parts= 1; + dl->nr= dlb->nr; + dl->col= nu->mat_nr; + dl->charidx= nu->charidx; + + /* dl->rt will be used as flag for render face and */ + /* CU_2D conflicts with R_NOPUNOFLIP */ + dl->rt= nu->flag & ~CU_2D; + + rotateBevelPiece(cu, bevp, dlb, widfac, fac, &data); + + BLI_addtail(dispbase, dl); +} + static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispbase, DerivedMesh **derivedFinal, int forRender, int forOrco) { @@ -1225,9 +1279,9 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba for (; bl && nu; bl=bl->next,nu=nu->next) { DispList *dl; - float *fp1, *data; + float *data; BevPoint *bevp; - int a,b; + int a; if (bl->nr) { /* blank bevel lists can happen */ @@ -1264,9 +1318,10 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba } else { DispList *dlb; + ListBase bottom_capbase = {NULL, NULL}; + ListBase top_capbase = {NULL, NULL}; for (dlb=dlbev.first; dlb; dlb=dlb->next) { - /* 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"); @@ -1304,33 +1359,27 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba 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; - - mul_qt_v3(bevp->quat, vec); - - data[0]= bevp->vec[0] + fac*vec[0]; - data[1]= bevp->vec[1] + fac*vec[1]; - data[2]= bevp->vec[2] + fac*vec[2]; - } - else { - data[0]= bevp->vec[0] + fac*(widfac+fp1[1])*bevp->sina; - data[1]= bevp->vec[1] + fac*(widfac+fp1[1])*bevp->cosa; - data[2]= bevp->vec[2] + fac*fp1[2]; - } + /* rotate bevel piece and write in data */ + rotateBevelPiece(cu, bevp, dlb, widfac, fac, &data); + + 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); } } - + /* gl array drawing: using indices */ displist_surf_indices(dl); } + + if(bottom_capbase.first) { + filldisplist(&bottom_capbase, dispbase, 1); + filldisplist(&top_capbase, dispbase, 0); + freedisplist(&bottom_capbase); + freedisplist(&top_capbase); + } } } diff --git a/source/blender/blenkernel/intern/navmesh_conversion.c b/source/blender/blenkernel/intern/navmesh_conversion.c index 72523ae54e0..4c9c0a3a1fc 100644 --- a/source/blender/blenkernel/intern/navmesh_conversion.c +++ b/source/blender/blenkernel/intern/navmesh_conversion.c @@ -344,7 +344,7 @@ int buildNavMeshData(const int nverts, const float* verts, int *vertsPerPoly_r, int **dtrisToPolysMap_r, int **dtrisToTrisMap_r) { - int *trisMapping = MEM_callocN(sizeof(int)*ntris, "buildNavMeshData trisMapping"); + int *trisMapping; int i; struct SortContext context; int validTriStart, prevPolyIdx, curPolyIdx, newPolyIdx, prevpolyidx; @@ -360,6 +360,8 @@ int buildNavMeshData(const int nverts, const float* verts, return 0; } + trisMapping = MEM_callocN(sizeof(int)*ntris, "buildNavMeshData trisMapping"); + //sort the triangles by polygon idx for (i=0; i<ntris; i++) trisMapping[i]=i; diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index 08b53115919..d18a71d3c55 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -745,7 +745,7 @@ void reload_sequence_new_file(Scene *scene, Sequence * seq, int lock_range) seq->scene = sce; } - seq->len= seq->scene->r.efra - seq->scene->r.sfra + 1; + seq->len= (seq->scene)? seq->scene->r.efra - seq->scene->r.sfra + 1: 0; seq->len -= seq->anim_startofs; seq->len -= seq->anim_endofs; if (seq->len < 0) { diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c index 88858c9ff51..4c40dca3365 100644 --- a/source/blender/blenkernel/intern/texture.c +++ b/source/blender/blenkernel/intern/texture.c @@ -478,10 +478,28 @@ int vergcband(const void *a1, const void *a2) return 0; } -CBData *colorband_element_add(struct ColorBand *coba, float position) +void colorband_update_sort(ColorBand *coba) { int a; + + if(coba->tot<2) + return; + + for(a=0; a<coba->tot; a++) + coba->data[a].cur= a; + + qsort(coba->data, coba->tot, sizeof(CBData), vergcband); + for(a=0; a<coba->tot; a++) { + if(coba->data[a].cur==coba->cur) { + coba->cur= a; + break; + } + } +} + +CBData *colorband_element_add(struct ColorBand *coba, float position) +{ if(coba->tot==MAXCOLORBAND) { return NULL; } @@ -503,17 +521,7 @@ CBData *colorband_element_add(struct ColorBand *coba, float position) coba->tot++; coba->cur = coba->tot-1; - for(a = 0; a < coba->tot; a++) - coba->data[a].cur = a; - - qsort(coba->data, coba->tot, sizeof(CBData), vergcband); - - for(a = 0; a < coba->tot; a++) { - if(coba->data[a].cur == coba->cur) { - coba->cur = a; - break; - } - } + colorband_update_sort(coba); return coba->data + coba->cur; } |