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>2011-12-08 21:32:37 +0400
committerCampbell Barton <ideasman42@gmail.com>2011-12-08 21:32:37 +0400
commit980e68175be6f02b4d3e0f3ba9a5902e0cf2719a (patch)
tree545ba1badd4703f8fe8e3d0ba9f12e06e56ac905 /source/blender/blenkernel/intern
parent5c377f5f872df94b77e2e40dbdeceb751e631924 (diff)
parent7797c1dc424b1f772f23a3b8730a8374012d8c8b (diff)
svn merge ^/trunk/blender -r42495:42516
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c7
-rw-r--r--source/blender/blenkernel/intern/deform.c79
-rw-r--r--source/blender/blenkernel/intern/mesh_validate.c64
3 files changed, 108 insertions, 42 deletions
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)