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
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2012-02-03 05:30:21 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-02-03 05:30:21 +0400
commit075fee4d58a65b4313bb7e984ae195690f4c7bfd (patch)
treee801da2591eda34a4c4c7fd5436ff476353b1c55 /source/blender/blenkernel
parent68cc7e168207c4c519f54f7e0f7f638768386cd0 (diff)
parent050963b6a9529e0abdd597d163ddc4343c0b15c2 (diff)
svn merge ^/trunk/blender -r43830:43864
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_texture.h2
-rw-r--r--source/blender/blenkernel/intern/constraint.c125
-rw-r--r--source/blender/blenkernel/intern/displist.c99
-rw-r--r--source/blender/blenkernel/intern/navmesh_conversion.c4
-rw-r--r--source/blender/blenkernel/intern/sequencer.c2
-rw-r--r--source/blender/blenkernel/intern/texture.c32
6 files changed, 152 insertions, 112 deletions
diff --git a/source/blender/blenkernel/BKE_texture.h b/source/blender/blenkernel/BKE_texture.h
index 7f321abf48e..a67a06ef9fb 100644
--- a/source/blender/blenkernel/BKE_texture.h
+++ b/source/blender/blenkernel/BKE_texture.h
@@ -69,9 +69,9 @@ void init_colorband(struct ColorBand *coba, int rangetype);
struct ColorBand *add_colorband(int rangetype);
int do_colorband(const struct ColorBand *coba, float in, float out[4]);
void colorband_table_RGBA(struct ColorBand *coba, float **array, int *size);
-int vergcband(const void *a1, const void *a2);
struct CBData *colorband_element_add(struct ColorBand *coba, float position);
int colorband_element_remove(struct ColorBand *coba, int index);
+void colorband_update_sort(struct ColorBand *coba);
void default_tex(struct Tex *tex);
struct Tex *add_texture(const char *name);
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;
}