diff options
author | Campbell Barton <ideasman42@gmail.com> | 2011-12-08 21:32:37 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2011-12-08 21:32:37 +0400 |
commit | 980e68175be6f02b4d3e0f3ba9a5902e0cf2719a (patch) | |
tree | 545ba1badd4703f8fe8e3d0ba9f12e06e56ac905 /source/blender/blenkernel | |
parent | 5c377f5f872df94b77e2e40dbdeceb751e631924 (diff) | |
parent | 7797c1dc424b1f772f23a3b8730a8374012d8c8b (diff) |
svn merge ^/trunk/blender -r42495:42516
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_deform.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_mesh.h | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 7 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/deform.c | 79 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh_validate.c | 64 |
5 files changed, 117 insertions, 44 deletions
diff --git a/source/blender/blenkernel/BKE_deform.h b/source/blender/blenkernel/BKE_deform.h index ed8ea691134..b08afd9c475 100644 --- a/source/blender/blenkernel/BKE_deform.h +++ b/source/blender/blenkernel/BKE_deform.h @@ -52,7 +52,8 @@ void defgroup_unique_name(struct bDeformGroup *dg, struct Object *ob); struct MDeformWeight *defvert_find_index(const struct MDeformVert *dv, const int defgroup); struct MDeformWeight *defvert_verify_index(struct MDeformVert *dv, const int defgroup); -void defvert_remove_index(struct MDeformVert *dvert, int defgroup, struct MDeformWeight *dw); +void defvert_add_index_notest(struct MDeformVert *dv, int defgroup, const float weight); +void defvert_remove_group(struct MDeformVert *dvert, struct MDeformWeight *dw); float defvert_find_weight(const struct MDeformVert *dvert, const int defgroup); float defvert_array_find_weight_safe(const struct MDeformVert *dvert, const int index, const int defgroup); diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index a8bc2323d0f..e1eb34782ff 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -192,7 +192,13 @@ int mesh_center_bounds(struct Mesh *me, float cent[3]); void mesh_translate(struct Mesh *me, float offset[3], int do_keys); /* mesh_validate.c */ -int BKE_mesh_validate_arrays(struct Mesh *me, struct MVert *mverts, unsigned int totvert, struct MEdge *medges, unsigned int totedge, struct MFace *mfaces, unsigned int totface, const short do_verbose, const short do_fixes); +int BKE_mesh_validate_arrays( + struct Mesh *me, + struct MVert *mverts, unsigned int totvert, + struct MEdge *medges, unsigned int totedge, + struct MFace *mfaces, unsigned int totface, + struct MDeformVert *dverts, /* assume totvert length */ + const short do_verbose, const short do_fixes); int BKE_mesh_validate(struct Mesh *me, int do_verbose); int BKE_mesh_validate_dm(struct DerivedMesh *dm); diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 79d93f487b1..69758ad66a7 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1279,11 +1279,8 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, } } } - if(!dodraw) { - continue; - } - if( numdata != 0 ) { + if(dodraw && numdata != 0 ) { offset = 0; if(attribs.totorco) { copy_v3_v3((float *)&varray[elementsize*curface*3],(float *)attribs.orco.array[mface->v1]); @@ -1325,7 +1322,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, } curface++; if(mface->v4) { - if( numdata != 0 ) { + if(dodraw && numdata != 0 ) { offset = 0; if(attribs.totorco) { copy_v3_v3((float *)&varray[elementsize*curface*3],(float *)attribs.orco.array[mface->v3]); diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c index 49ca4e139cc..088241791a7 100644 --- a/source/blender/blenkernel/intern/deform.c +++ b/source/blender/blenkernel/intern/deform.c @@ -577,46 +577,61 @@ MDeformWeight *defvert_verify_index(MDeformVert *dvert, const int defgroup) return dw_new; } -/* Removes the given vertex from the vertex group, specified either by its defgrp_idx, - * or directly by its MDeformWeight pointer, if dw is not NULL. - * WARNING: This function frees the given MDeformWeight, do not use it afterward! */ -void defvert_remove_index(MDeformVert *dvert, int defgroup, MDeformWeight *dw) +/* TODO. merge with code above! */ + +/* Adds the given vertex to the specified vertex group, with given weight. + * warning, this does NOT check for existign, assume caller already knows its not there */ +void defvert_add_index_notest(MDeformVert *dvert, int defgroup, const float weight) { MDeformWeight *dw_new; - int i; - /* Get index of removed MDeformWeight. */ - if (dw == NULL) { - dw = dvert->dw; - for (i = dvert->totweight; i > 0; i--, dw++) { - if (dw->def_nr == defgroup) - break; - } - i--; + /* do this check always, this function is used to check for it */ + if (!dvert || defgroup < 0) + return; + + dw_new = BLI_cellalloc_calloc(sizeof(MDeformWeight)*(dvert->totweight+1), "defvert_add_to group, new deformWeight"); + if(dvert->dw) { + memcpy(dw_new, dvert->dw, sizeof(MDeformWeight)*dvert->totweight); + BLI_cellalloc_free(dvert->dw); } - else { - i = dw - dvert->dw; + dvert->dw = dw_new; + dw_new += dvert->totweight; + dw_new->weight = weight; + dw_new->def_nr = defgroup; + dvert->totweight++; +} + + +/* Removes the given vertex from the vertex group. + * WARNING: This function frees the given MDeformWeight, do not use it afterward! */ +void defvert_remove_group(MDeformVert *dvert, MDeformWeight *dw) +{ + if (dvert && dw) { + MDeformWeight *dw_new; + int i = dw - dvert->dw; + /* Security check! */ - if(i < 0 || i >= dvert->totweight) + if(i < 0 || i >= dvert->totweight) { return; - } + } - dvert->totweight--; - /* If there are still other deform weights attached to this vert then remove - * this deform weight, and reshuffle the others. - */ - if (dvert->totweight) { - dw_new = BLI_cellalloc_malloc(sizeof(MDeformWeight)*(dvert->totweight), __func__); - if (dvert->dw){ - memcpy(dw_new, dvert->dw, sizeof(MDeformWeight)*i); - memcpy(dw_new+i, dvert->dw+i+1, sizeof(MDeformWeight)*(dvert->totweight-i)); + dvert->totweight--; + /* If there are still other deform weights attached to this vert then remove + * this deform weight, and reshuffle the others. + */ + if (dvert->totweight) { + dw_new = BLI_cellalloc_malloc(sizeof(MDeformWeight)*(dvert->totweight), __func__); + if (dvert->dw){ + memcpy(dw_new, dvert->dw, sizeof(MDeformWeight)*i); + memcpy(dw_new+i, dvert->dw+i+1, sizeof(MDeformWeight)*(dvert->totweight-i)); + BLI_cellalloc_free(dvert->dw); + } + dvert->dw = dw_new; + } + else { + /* If there are no other deform weights left then just remove this one. */ BLI_cellalloc_free(dvert->dw); + dvert->dw = NULL; } - dvert->dw = dw_new; - } - else { - /* If there are no other deform weights left then just remove this one. */ - BLI_cellalloc_free(dvert->dw); - dvert->dw = NULL; } } diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c index 509cc821c65..fd19d8461d5 100644 --- a/source/blender/blenkernel/intern/mesh_validate.c +++ b/source/blender/blenkernel/intern/mesh_validate.c @@ -45,6 +45,7 @@ #include "MEM_guardedalloc.h" #include "BKE_mesh.h" +#include "BKE_deform.h" #define SELECT 1 @@ -118,7 +119,12 @@ static int search_face_cmp(const void *v1, const void *v2) #define PRINT if(do_verbose) printf -int BKE_mesh_validate_arrays(Mesh *me, MVert *mverts, unsigned int totvert, MEdge *medges, unsigned int totedge, MFace *mfaces, unsigned int totface, const short do_verbose, const short do_fixes) +int BKE_mesh_validate_arrays( Mesh *me, + MVert *mverts, unsigned int totvert, + MEdge *medges, unsigned int totedge, + MFace *mfaces, unsigned int totface, + MDeformVert *dverts, /* assume totvert length */ + const short do_verbose, const short do_fixes) { # define REMOVE_EDGE_TAG(_med) { _med->v2= _med->v1; do_edge_free= 1; } # define REMOVE_FACE_TAG(_mf) { _mf->v3=0; do_face_free= 1; } @@ -157,7 +163,7 @@ int BKE_mesh_validate_arrays(Mesh *me, MVert *mverts, unsigned int totvert, MEdg int fix_normal= TRUE; for(j=0; j<3; j++) { - if(isnan(mvert->co[j]) || !finite(mvert->co[j])) { + if(!finite(mvert->co[j])) { PRINT(" vertex %u: has invalid coordinate\n", i); zero_v3(mvert->co); @@ -307,6 +313,43 @@ int BKE_mesh_validate_arrays(Mesh *me, MVert *mverts, unsigned int totvert, MEdg BLI_edgehash_free(edge_hash, NULL); MEM_freeN(sort_faces); + + /* fix deform verts */ + if (dverts) { + MDeformVert *dv; + for(i=0, dv= dverts; i<totvert; i++, dv++) { + MDeformWeight *dw= dv->dw; + unsigned int j= 0; + + for(j=0, dw= dv->dw; j < dv->totweight; j++, dw++) { + /* note, greater then max defgroups is accounted for in our code, but not < 0 */ + if (!finite(dw->weight)) { + PRINT(" vertex deform %u, group %d has weight: %f\n", i, dw->def_nr, dw->weight); + if (do_fixes) { + dw->weight= 0.0f; + } + } + + if (dw->def_nr < 0) { + PRINT(" vertex deform %u, has invalid group %d\n", i, dw->def_nr); + if (do_fixes) { + defvert_remove_group(dv, dw); + if (dv->dw) { + /* re-allocated, the new values compensate for stepping + * within the for loop and may not be valid */ + j--; + dw= dv->dw + j; + } + else { /* all freed */ + break; + } + } + } + } + } + } + + PRINT("BKE_mesh_validate: finished\n\n"); # undef REMOVE_EDGE_TAG @@ -357,7 +400,8 @@ static int mesh_validate_customdata(CustomData *data, short do_verbose, const sh #undef PRINT -static int BKE_mesh_validate_all_customdata(CustomData *vdata, CustomData *edata, CustomData *fdata, short do_verbose, const short do_fixes) +static int BKE_mesh_validate_all_customdata(CustomData *vdata, CustomData *edata, CustomData *fdata, + short do_verbose, const short do_fixes) { int vfixed= 0, efixed= 0, ffixed= 0; @@ -377,14 +421,24 @@ int BKE_mesh_validate(Mesh *me, int do_verbose) } layers_fixed= BKE_mesh_validate_all_customdata(&me->vdata, &me->edata, &me->fdata, do_verbose, TRUE); - arrays_fixed= BKE_mesh_validate_arrays(me, me->mvert, me->totvert, me->medge, me->totedge, me->mface, me->totface, do_verbose, TRUE); + arrays_fixed= BKE_mesh_validate_arrays(me, + me->mvert, me->totvert, + me->medge, me->totedge, + me->mface, me->totface, + me->dvert, + do_verbose, TRUE); return layers_fixed || arrays_fixed; } int BKE_mesh_validate_dm(DerivedMesh *dm) { - return BKE_mesh_validate_arrays(NULL, dm->getVertArray(dm), dm->getNumVerts(dm), dm->getEdgeArray(dm), dm->getNumEdges(dm), dm->getTessFaceArray(dm), dm->getNumTessFaces(dm), TRUE, FALSE); + return BKE_mesh_validate_arrays(NULL, + dm->getVertArray(dm), dm->getNumVerts(dm), + dm->getEdgeArray(dm), dm->getNumEdges(dm), + dm->getTessFaceArray(dm), dm->getNumTessFaces(dm), + dm->getVertDataArray(dm, CD_MDEFORMVERT), + TRUE, FALSE); } void BKE_mesh_calc_edges(Mesh *mesh, int update) |