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-06 13:28:25 +0400
committerCampbell Barton <ideasman42@gmail.com>2011-12-06 13:28:25 +0400
commit26db98293f9eacf4dcd4dcf6b0b7f82690ec9387 (patch)
tree76e02eb48ab26149f0c66af4cfcf43f29fa3d69a
parent0b805fcb5d87b067f4d53b27dd349eb2c46563fa (diff)
Quiet annoying warning:
Warning! Tesselation uvs or vcol data got out of sync, "had to reset! This would happen on every editmode edit with UV's and wasn't too reassuring that blender was handling uvs/vcols correctly. From looking into the problem I found that creating the undo mesh would act as if it was tessellating the existing mesh each time and complain that the data was out of sync, when infact the mesh was just created and being filled in. Also, allocating uv and vcol customdata arrats for tessfaces isn't needed for undo mesh, so save some memory and dont allocate these in the first place.
-rw-r--r--source/blender/blenkernel/BKE_mesh.h2
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c4
-rw-r--r--source/blender/blenkernel/intern/mesh.c46
-rw-r--r--source/blender/blenloader/intern/readfile.c4
-rw-r--r--source/blender/bmesh/operators/mesh_conv.c4
-rw-r--r--source/blender/editors/mesh/mesh_data.c18
-rw-r--r--source/blender/editors/mesh/meshtools.c2
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.c2
-rw-r--r--source/blender/makesrna/intern/rna_mesh_utils.h4
9 files changed, 50 insertions, 36 deletions
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 4f16f334870..8db9d3f5447 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -91,7 +91,7 @@ void unlink_mesh(struct Mesh *me);
void free_mesh(struct Mesh *me, int unlink);
struct Mesh *add_mesh(const char *name);
struct Mesh *copy_mesh(struct Mesh *me);
-void mesh_update_customdata_pointers(struct Mesh *me);
+void mesh_update_customdata_pointers(struct Mesh *me, const short do_ensure_tess_cd);
void make_local_mesh(struct Mesh *me);
void boundbox_mesh(struct Mesh *me, float *loc, float *size);
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 89440779eb9..628c07f7a6d 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -424,11 +424,11 @@ void DM_to_mesh(DerivedMesh *dm, Mesh *me, Object *ob)
}
/* yes, must be before _and_ after tesselate */
- mesh_update_customdata_pointers(&tmp);
+ mesh_update_customdata_pointers(&tmp, TRUE);
tmp.totface = mesh_recalcTesselation(&tmp.fdata, &tmp.ldata, &tmp.pdata, tmp.mvert, tmp.totface, tmp.totloop, tmp.totpoly);
- mesh_update_customdata_pointers(&tmp);
+ mesh_update_customdata_pointers(&tmp, TRUE);
CustomData_free(&me->vdata, me->totvert);
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index a3a75f07c9a..e7e8065e436 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -307,13 +307,14 @@ const char *mesh_cmp(Mesh *me1, Mesh *me2, float thresh)
static void mesh_ensure_tesselation_customdata(Mesh *me)
{
- int tottex, totcol;
+ const int tottex_original = CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY);
+ const int totcol_original = CustomData_number_of_layers(&me->ldata, CD_MLOOPCOL);
- tottex = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
- totcol = CustomData_number_of_layers(&me->fdata, CD_MCOL);
-
- if (tottex != CustomData_number_of_layers(&me->pdata, CD_MTEXPOLY) ||
- totcol != CustomData_number_of_layers(&me->ldata, CD_MLOOPCOL))
+ const int tottex_tessface = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
+ const int totcol_tessface = CustomData_number_of_layers(&me->fdata, CD_MCOL);
+
+ if (tottex_tessface != tottex_original ||
+ totcol_tessface != totcol_original )
{
CustomData_free(&me->fdata, me->totface);
@@ -325,25 +326,38 @@ static void mesh_ensure_tesselation_customdata(Mesh *me)
memset(&me->fdata, 0, sizeof(&me->fdata));
CustomData_from_bmeshpoly(&me->fdata, &me->pdata, &me->ldata, me->totface);
- printf("Warning! Tesselation uvs or vcol data got out of sync, had to reset!\n");
+
+ /* note: this warning may be un-called for if we are inirializing the mesh for the
+ * first time from bmesh, rather then giving a warning about this we could be smarter
+ * and check if there was any data to begin with, for now just print the warning with
+ * some info to help troubleshoot whats going on - campbell */
+ printf("%s: warning! Tesselation uvs or vcol data got out of sync, "
+ "had to reset!\n CD_MTFACE: %d != CD_MTEXPOLY: %d || CD_MCOL: %d != CD_MLOOPCOL: %d\n",
+ __func__, tottex_tessface, tottex_original, totcol_tessface, totcol_original);
}
}
-/*this ensures grouped customdata (e.g. mtexpoly and mloopuv and mtface, or
- mloopcol and mcol) have the same relative active/render/clone/mask indices.*/
-static void mesh_update_linked_customdata(Mesh *me)
+/* this ensures grouped customdata (e.g. mtexpoly and mloopuv and mtface, or
+ * mloopcol and mcol) have the same relative active/render/clone/mask indices.
+ *
+ * note that for undo mesh data we want to skip 'ensure_tess_cd' call since
+ * we dont want to store memory for tessface when its only used for older
+ * versions of the mesh. - campbell*/
+static void mesh_update_linked_customdata(Mesh *me, const short do_ensure_tess_cd)
{
if (me->edit_btmesh)
BMEdit_UpdateLinkedCustomData(me->edit_btmesh);
- mesh_ensure_tesselation_customdata(me);
+ if (do_ensure_tess_cd) {
+ mesh_ensure_tesselation_customdata(me);
+ }
CustomData_bmesh_update_active_layers(&me->fdata, &me->pdata, &me->ldata);
}
-void mesh_update_customdata_pointers(Mesh *me)
+void mesh_update_customdata_pointers(Mesh *me, const short do_ensure_tess_cd)
{
- mesh_update_linked_customdata(me);
+ mesh_update_linked_customdata(me, do_ensure_tess_cd);
me->mvert = CustomData_get_layer(&me->vdata, CD_MVERT);
me->dvert = CustomData_get_layer(&me->vdata, CD_MDEFORMVERT);
@@ -483,7 +497,7 @@ Mesh *copy_mesh(Mesh *me)
CustomData_copy(&me->fdata, &men->fdata, CD_MASK_MESH, CD_DUPLICATE, men->totface);
CustomData_copy(&me->ldata, &men->ldata, CD_MASK_MESH, CD_DUPLICATE, men->totloop);
CustomData_copy(&me->pdata, &men->pdata, CD_MASK_MESH, CD_DUPLICATE, men->totpoly);
- mesh_update_customdata_pointers(men);
+ mesh_update_customdata_pointers(men, TRUE);
/* ensure indirect linked data becomes lib-extern */
for(i=0; i<me->fdata.totlayer; i++) {
@@ -1100,7 +1114,7 @@ void mball_to_mesh(ListBase *lb, Mesh *me)
&me->fdata, &me->ldata, &me->pdata,
me->mvert, me->totface, me->totloop, me->totpoly);
- mesh_update_customdata_pointers(me);
+ mesh_update_customdata_pointers(me, TRUE);
}
}
@@ -1927,7 +1941,7 @@ void convert_mfaces_to_mpolys(Mesh *mesh)
/* note, we dont convert FGons at all, these are not even real ngons,
* they have their own UV's, colors etc - its more an editing feature. */
- mesh_update_customdata_pointers(mesh);
+ mesh_update_customdata_pointers(mesh, TRUE);
BLI_edgehash_free(eh, NULL);
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 241e993cbb2..dffcd17f3a9 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -3679,7 +3679,7 @@ static void lib_link_mesh(FileData *fd, Main *main)
&me->fdata, &me->ldata, &me->pdata,
me->mvert, me->totface, me->totloop, me->totpoly);
- mesh_update_customdata_pointers(me);
+ mesh_update_customdata_pointers(me, TRUE);
me->id.flag -= LIB_NEEDLINK;
}
@@ -6570,7 +6570,7 @@ static void customdata_version_242(Mesh *me)
}
}
- mesh_update_customdata_pointers(me);
+ mesh_update_customdata_pointers(me, TRUE);
}
/*only copy render texface layer from active*/
diff --git a/source/blender/bmesh/operators/mesh_conv.c b/source/blender/bmesh/operators/mesh_conv.c
index e9395a73e8c..938f0e94562 100644
--- a/source/blender/bmesh/operators/mesh_conv.c
+++ b/source/blender/bmesh/operators/mesh_conv.c
@@ -618,7 +618,7 @@ void bmesh_to_mesh_exec(BMesh *bm, BMOperator *op)
CustomData_add_layer(&me->fdata, CD_NORMAL, CD_ASSIGN, facenors, me->totface);
CustomData_from_bmeshpoly(&me->fdata, &bm->pdata, &bm->ldata, totface);
- mesh_update_customdata_pointers(me);
+ mesh_update_customdata_pointers(me, TRUE);
i = 0;
BM_ITER_INDEX(f, &iter, bm, BM_FACES_OF_MESH, NULL, j) {
@@ -769,7 +769,7 @@ void bmesh_to_mesh_exec(BMesh *bm, BMOperator *op)
if (vertMap) MEM_freeN(vertMap);
}
- mesh_update_customdata_pointers(me);
+ mesh_update_customdata_pointers(me, dotess);
{
BMEditSelection *selected;
diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c
index 6bee0837819..996ffd1fdb2 100644
--- a/source/blender/editors/mesh/mesh_data.c
+++ b/source/blender/editors/mesh/mesh_data.c
@@ -113,7 +113,7 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la
}
else {
CustomData_free_layer_active(data, type, tot);
- mesh_update_customdata_pointers(me);
+ mesh_update_customdata_pointers(me, TRUE);
}
if(!CustomData_has_layer(data, type) && (type == CD_MLOOPCOL && (ob->mode & OB_MODE_VERTEX_PAINT)))
@@ -354,7 +354,7 @@ int ED_mesh_uv_texture_add(bContext *C, Mesh *me, const char *name, int active_s
CustomData_set_layer_active(&me->fdata, CD_MTFACE, layernum);
}
- mesh_update_customdata_pointers(me);
+ mesh_update_customdata_pointers(me, TRUE);
}
ED_mesh_uv_loop_reset(C, me);
@@ -434,7 +434,7 @@ int ED_mesh_color_add(bContext *C, Scene *UNUSED(scene), Object *UNUSED(ob), Mes
CustomData_set_layer_active(&me->fdata, CD_MCOL, layernum);
}
- mesh_update_customdata_pointers(me);
+ mesh_update_customdata_pointers(me, TRUE);
}
DAG_id_tag_update(&me->id, 0);
@@ -767,7 +767,7 @@ void ED_mesh_update(Mesh *mesh, bContext *C, int calc_edges)
mesh->totloop,
mesh->totpoly);
- mesh_update_customdata_pointers(mesh);
+ mesh_update_customdata_pointers(mesh, TRUE);
polyindex = CustomData_get_layer(&mesh->fdata, CD_POLYINDEX);
/* add a normals layer for tesselated faces, a tessface normal will
@@ -809,7 +809,7 @@ static void mesh_add_verts(Mesh *mesh, int len)
CustomData_free(&mesh->vdata, mesh->totvert);
mesh->vdata= vdata;
- mesh_update_customdata_pointers(mesh);
+ mesh_update_customdata_pointers(mesh, FALSE);
/* scan the input list and insert the new vertices */
@@ -852,7 +852,7 @@ static void mesh_add_edges(Mesh *mesh, int len)
CustomData_free(&mesh->edata, mesh->totedge);
mesh->edata= edata;
- mesh_update_customdata_pointers(mesh);
+ mesh_update_customdata_pointers(mesh, FALSE); /* new edges dont change tessellation */
/* set default flags */
medge= &mesh->medge[mesh->totedge];
@@ -882,7 +882,7 @@ static void mesh_add_faces(Mesh *mesh, int len)
CustomData_free(&mesh->fdata, mesh->totface);
mesh->fdata= fdata;
- mesh_update_customdata_pointers(mesh);
+ mesh_update_customdata_pointers(mesh, TRUE);
/* set default flags */
mface= &mesh->mface[mesh->totface];
@@ -911,7 +911,7 @@ static void mesh_add_loops(Mesh *mesh, int len)
CustomData_free(&mesh->ldata, mesh->totloop);
mesh->ldata= ldata;
- mesh_update_customdata_pointers(mesh);
+ mesh_update_customdata_pointers(mesh, TRUE);
mesh->totloop= totloop;
}
@@ -936,7 +936,7 @@ static void mesh_add_polys(Mesh *mesh, int len)
CustomData_free(&mesh->pdata, mesh->totpoly);
mesh->pdata= pdata;
- mesh_update_customdata_pointers(mesh);
+ mesh_update_customdata_pointers(mesh, TRUE);
/* set default flags */
mpoly= &mesh->mpoly[mesh->totpoly];
diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c
index 4fcc2071d26..5e9762d16e7 100644
--- a/source/blender/editors/mesh/meshtools.c
+++ b/source/blender/editors/mesh/meshtools.c
@@ -522,7 +522,7 @@ int join_mesh_exec(bContext *C, wmOperator *op)
me->ldata= ldata;
me->pdata= pdata;
- mesh_update_customdata_pointers(me);
+ mesh_update_customdata_pointers(me, TRUE); /* BMESH_TODO, check if this arg can be failse, non urgent - campbell */
/* old material array */
for(a=1; a<=ob->totcol; a++) {
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index 77daa3cdc28..7cc15cd4e77 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -340,7 +340,7 @@ static void make_vertexcol(Object *ob) /* single ob */
CustomData_add_layer(&me->fdata, CD_MCOL, CD_DEFAULT, NULL, me->totface);
if (!me->mloopcol) {
CustomData_add_layer(&me->ldata, CD_MLOOPCOL, CD_DEFAULT, NULL, me->totloop);
- mesh_update_customdata_pointers(me);
+ mesh_update_customdata_pointers(me, TRUE);
}
//if(shade)
diff --git a/source/blender/makesrna/intern/rna_mesh_utils.h b/source/blender/makesrna/intern/rna_mesh_utils.h
index 9f2a3c083b6..02afaa5b51d 100644
--- a/source/blender/makesrna/intern/rna_mesh_utils.h
+++ b/source/blender/makesrna/intern/rna_mesh_utils.h
@@ -83,7 +83,7 @@
for(cdl=data->layers, a=0; a<data->totlayer; cdl++, a++) { \
if(value.data == cdl) { \
CustomData_set_layer_##active_type##_index(data, layer_type, a); \
- mesh_update_customdata_pointers(me); \
+ mesh_update_customdata_pointers(me, TRUE); \
return; \
} \
} \
@@ -101,5 +101,5 @@
CustomData *data = rna_mesh_##customdata_type(ptr); \
\
CustomData_set_layer_##active_type(data, layer_type, value); \
- mesh_update_customdata_pointers(me); \
+ mesh_update_customdata_pointers(me, TRUE); \
}