[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43534] branches/bmesh/blender/source/ blender: argument to mesh_recalcTesselation to skip copying normals from polygons.
Campbell Barton
ideasman42 at gmail.com
Thu Jan 19 18:52:00 CET 2012
Revision: 43534
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43534
Author: campbellbarton
Date: 2012-01-19 17:51:52 +0000 (Thu, 19 Jan 2012)
Log Message:
-----------
argument to mesh_recalcTesselation to skip copying normals from polygons.
Modified Paths:
--------------
branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
branches/bmesh/blender/source/blender/blenloader/intern/readfile.c
branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
branches/bmesh/blender/source/blender/editors/mesh/mesh_data.c
branches/bmesh/blender/source/blender/editors/object/object_add.c
Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h 2012-01-19 17:30:29 UTC (rev 43533)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h 2012-01-19 17:51:52 UTC (rev 43534)
@@ -76,9 +76,10 @@
* if both of the above are 0, it'll use the indices of the mpolys of the MPoly
* data in pdata, and ignore the origindex layer altogether.
*/
-int mesh_recalcTesselation(struct CustomData *fdata, struct CustomData *ldata,
- struct CustomData *pdata, struct MVert *mvert, int totface,
- int totloop, int totpoly);
+int mesh_recalcTesselation(struct CustomData *fdata, struct CustomData *ldata, struct CustomData *pdata,
+ struct MVert *mvert,
+ int totface, int totloop, int totpoly,
+ const int do_face_normals);
/* for forwards compat only quad->tri polys to mface, skip ngons.
*/
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c 2012-01-19 17:30:29 UTC (rev 43533)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c 2012-01-19 17:51:52 UTC (rev 43534)
@@ -448,7 +448,10 @@
/* yes, must be before _and_ after tesselate */
mesh_update_customdata_pointers(&tmp, TRUE);
- tmp.totface = mesh_recalcTesselation(&tmp.fdata, &tmp.ldata, &tmp.pdata, tmp.mvert, tmp.totface, tmp.totloop, tmp.totpoly);
+ tmp.totface = mesh_recalcTesselation(&tmp.fdata, &tmp.ldata, &tmp.pdata,
+ tmp.mvert,
+ tmp.totface, tmp.totloop, tmp.totpoly,
+ TRUE);
mesh_update_customdata_pointers(&tmp, TRUE);
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c 2012-01-19 17:30:29 UTC (rev 43533)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c 2012-01-19 17:51:52 UTC (rev 43534)
@@ -1582,9 +1582,10 @@
{
CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
- dm->numTessFaceData = mesh_recalcTesselation(&dm->faceData, &dm->loopData,
- &dm->polyData, cddm->mvert, dm->numTessFaceData, dm->numLoopData,
- dm->numPolyData);
+ dm->numTessFaceData = mesh_recalcTesselation(&dm->faceData, &dm->loopData, &dm->polyData,
+ cddm->mvert,
+ dm->numTessFaceData, dm->numLoopData, dm->numPolyData,
+ TRUE);
if (!CustomData_get_layer(&dm->faceData, CD_ORIGINDEX)) {
int *polyIndex = CustomData_get_layer(&dm->faceData, CD_POLYINDEX);
@@ -2255,6 +2256,7 @@
cddm->mvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT, dm->numVertData);
#endif
+
if (dm->numTessFaceData == 0) {
/* No tesselation on this mesh yet, need to calculate one */
CDDM_recalc_tesselation(dm);
@@ -2265,6 +2267,7 @@
CustomData_free_layers(&dm->faceData, CD_NORMAL, dm->numTessFaceData);
}
+
face_nors = MEM_mallocN(sizeof(float)*3*dm->numTessFaceData, "face_nors");
/* calculate face normals */
@@ -2274,7 +2277,9 @@
only_face_normals);
CustomData_add_layer(&dm->faceData, CD_NORMAL, CD_ASSIGN,
- face_nors, dm->numTessFaceData);
+ face_nors, dm->numTessFaceData);
+
+
}
/* bmesh note: this matches what we have in trunk */
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c 2012-01-19 17:30:29 UTC (rev 43533)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c 2012-01-19 17:51:52 UTC (rev 43534)
@@ -1105,12 +1105,16 @@
index+= 4;
}
+ /* BMESH_TODO - why is this converting from MFaces to MPoly's then tesselating?
+ * should just make mpolys */
+
make_edges(me, 0); // all edges
convert_mfaces_to_mpolys(me);
- me->totface = mesh_recalcTesselation(
- &me->fdata, &me->ldata, &me->pdata,
- me->mvert, me->totface, me->totloop, me->totpoly);
+ me->totface = mesh_recalcTesselation(&me->fdata, &me->ldata, &me->pdata,
+ me->mvert,
+ me->totface, me->totloop, me->totpoly,
+ TRUE);
mesh_update_customdata_pointers(me, TRUE);
}
@@ -2212,10 +2216,13 @@
this function recreates a tesselation.
returns number of tesselation faces.
*/
-int mesh_recalcTesselation(CustomData *fdata,
+int mesh_recalcTesselation(CustomData *fdata,
CustomData *ldata, CustomData *pdata,
MVert *mvert, int totface, int UNUSED(totloop),
- int totpoly)
+ int totpoly,
+ /* when teseelating to recalcilate normals after
+ * we can skip copying here */
+ const int do_face_nor_cpy)
{
/* use this to avoid locking pthread for _every_ polygon
@@ -2350,13 +2357,15 @@
CustomData_from_bmeshpoly(fdata, pdata, ldata, totface);
- /* If polys have a normals layer, copying that to faces can help
- * avoid the need to recalculate normals later */
- if (CustomData_has_layer(pdata, CD_NORMAL)) {
- float *pnors = CustomData_get_layer(pdata, CD_NORMAL);
- float *fnors = CustomData_add_layer(fdata, CD_NORMAL, CD_CALLOC, NULL, totface);
- for (i=0; i<totface; i++, fnors++) {
- copy_v3_v3(fnors, &pnors[polyIndex[i]]);
+ if (do_face_nor_cpy) {
+ /* If polys have a normals layer, copying that to faces can help
+ * avoid the need to recalculate normals later */
+ if (CustomData_has_layer(pdata, CD_NORMAL)) {
+ float *pnors = CustomData_get_layer(pdata, CD_NORMAL);
+ float *fnors = CustomData_add_layer(fdata, CD_NORMAL, CD_CALLOC, NULL, totface);
+ for (i=0; i<totface; i++, fnors++) {
+ copy_v3_v3(fnors, &pnors[polyIndex[i]]);
+ }
}
}
Modified: branches/bmesh/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/bmesh/blender/source/blender/blenloader/intern/readfile.c 2012-01-19 17:30:29 UTC (rev 43533)
+++ branches/bmesh/blender/source/blender/blenloader/intern/readfile.c 2012-01-19 17:51:52 UTC (rev 43534)
@@ -3704,9 +3704,10 @@
* waiting until edit mode has been entered/exited, making it easier
* to recognize problems that would otherwise only show up after edits).
*/
- me->totface = mesh_recalcTesselation(
- &me->fdata, &me->ldata, &me->pdata,
- me->mvert, me->totface, me->totloop, me->totpoly);
+ me->totface = mesh_recalcTesselation(&me->fdata, &me->ldata, &me->pdata,
+ me->mvert,
+ me->totface, me->totloop, me->totpoly,
+ TRUE);
mesh_update_customdata_pointers(me, TRUE);
Modified: branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c 2012-01-19 17:30:29 UTC (rev 43533)
+++ branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c 2012-01-19 17:51:52 UTC (rev 43534)
@@ -614,9 +614,11 @@
}
if (dotess) {
- me->totface= mesh_recalcTesselation(&me->fdata, &me->ldata, &me->pdata,
- me->mvert,
- me->totface, me->totloop, me->totpoly);
+ me->totface = mesh_recalcTesselation(&me->fdata, &me->ldata, &me->pdata,
+ me->mvert,
+ me->totface, me->totloop, me->totpoly,
+ /* possibly can set to FALSE here, but defaults to true */
+ TRUE);
}
mesh_update_customdata_pointers(me, dotess);
Modified: branches/bmesh/blender/source/blender/editors/mesh/mesh_data.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/mesh_data.c 2012-01-19 17:30:29 UTC (rev 43533)
+++ branches/bmesh/blender/source/blender/editors/mesh/mesh_data.c 2012-01-19 17:51:52 UTC (rev 43534)
@@ -758,14 +758,11 @@
if(calc_edges || (mesh->totpoly && mesh->totedge == 0))
BKE_mesh_calc_edges(mesh, calc_edges);
- mesh->totface = mesh_recalcTesselation(
- &mesh->fdata,
- &mesh->ldata,
- &mesh->pdata,
- mesh->mvert,
- mesh->totface,
- mesh->totloop,
- mesh->totpoly);
+ mesh->totface = mesh_recalcTesselation(&mesh->fdata, &mesh->ldata, &mesh->pdata,
+ mesh->mvert,
+ mesh->totface, mesh->totloop, mesh->totpoly,
+ /* calc normals right after, dont copy from polys here */
+ FALSE);
mesh_update_customdata_pointers(mesh, TRUE);
Modified: branches/bmesh/blender/source/blender/editors/object/object_add.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/object/object_add.c 2012-01-19 17:30:29 UTC (rev 43533)
+++ branches/bmesh/blender/source/blender/editors/object/object_add.c 2012-01-19 17:51:52 UTC (rev 43534)
@@ -1371,9 +1371,7 @@
DM_to_mesh(dm, newob->data, newob);
- /* re-tesselation doesn't happen automatic, calling like this is */
- me= newob->data;
- me->totface = mesh_recalcTesselation(&me->fdata, &me->ldata, &me->pdata, me->mvert, me->totface, me->totloop, me->totpoly);
+ /* re-tesselation is called by DM_to_mesh */
dm->release(dm);
object_free_modifiers(newob); /* after derivedmesh calls! */
More information about the Bf-blender-cvs
mailing list