[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43190] branches/bmesh/blender/source/ blender: rename normal calc functions.
Campbell Barton
ideasman42 at gmail.com
Fri Jan 6 01:08:44 CET 2012
Revision: 43190
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43190
Author: campbellbarton
Date: 2012-01-06 00:08:37 +0000 (Fri, 06 Jan 2012)
Log Message:
-----------
rename normal calc functions.
comparing bmesh to trunk, mesh_calc_normals() in bmesh is a much more comprehensive function, calculating mpoly,mface normals, where trunk only calculated vertex normals.
renamed:
* mesh_calc_normals() --> mesh_calc_normals_mapping_ex
* mesh_calc_tessface_normals --> mesh_calc_normals_tessface() - only calculates normals from tessface
* added mesh_calc_normals() - only calculates normals from poltys
this way we can have mesh_calc_normals() remain fast for parts of the code which only need vertex normals to be updated.
only refactor, no func changes- didnt replace mesh_calc_normals_mapping_ex() with mesh_calc_normals() anywhere yet.
Modified Paths:
--------------
branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
branches/bmesh/blender/source/blender/blenlib/intern/pbvh.c
branches/bmesh/blender/source/blender/blenloader/intern/readfile.c
branches/bmesh/blender/source/blender/collada/MeshImporter.cpp
branches/bmesh/blender/source/blender/editors/mesh/mesh_data.c
branches/bmesh/blender/source/blender/editors/object/object_transform.c
branches/bmesh/blender/source/blender/editors/sculpt_paint/sculpt.c
branches/bmesh/blender/source/blender/editors/sculpt_paint/sculpt_undo.c
Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h 2012-01-05 23:49:57 UTC (rev 43189)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h 2012-01-06 00:08:37 UTC (rev 43190)
@@ -123,7 +123,7 @@
void mesh_delete_material_index(struct Mesh *me, short index);
void mesh_set_smooth_flag(struct Object *meshOb, int enableSmooth);
void convert_mfaces_to_mpolys(struct Mesh *mesh);
-void mesh_calc_tessface_normals(struct MVert *mverts, int numVerts,struct MFace *mfaces, int numFaces, float (*faceNors_r)[3]);
+void mesh_calc_normals_tessface(struct MVert *mverts, int numVerts,struct MFace *mfaces, int numFaces, float (*faceNors_r)[3]);
/*used for unit testing; compares two meshes, checking only
differences we care about. should be usable with leaf's
@@ -143,15 +143,21 @@
/* Calculate vertex and face normals, face normals are returned in *faceNors_r if non-NULL
* and vertex normals are stored in actual mverts.
*/
-void mesh_calc_normals(struct MVert *mverts, int numVerts, struct MLoop *mloop,
- struct MPoly *mpolys, int numLoops, int numPolys, float (*polyNors_r)[3],
- struct MFace *mfaces, int numFaces, int *origIndexFace, float (*faceNors_r)[3]);
+void mesh_calc_normals_mapping(
+ struct MVert *mverts, int numVerts,
+ struct MLoop *mloop, struct MPoly *mpolys, int numLoops, int numPolys, float (*polyNors_r)[3],
+ struct MFace *mfaces, int numFaces, int *origIndexFace, float (*faceNors_r)[3]);
/* extended version of 'mesh_calc_normals' with option not to calc vertex normals */
-void mesh_calc_normals_ex(struct MVert *mverts, int numVerts, struct MLoop *mloop,
- struct MPoly *mpolys, int numLoops, int numPolys, float (*polyNors_r)[3],
- struct MFace *mfaces, int numFaces, int *origIndexFace, float (*faceNors_r)[3],
- const short only_face_normals);
+void mesh_calc_normals_mapping_ex(
+ struct MVert *mverts, int numVerts, struct MLoop *mloop,
+ struct MPoly *mpolys, int numLoops, int numPolys, float (*polyNors_r)[3],
+ struct MFace *mfaces, int numFaces, int *origIndexFace, float (*faceNors_r)[3],
+ const short only_face_normals);
+void mesh_calc_normals(
+ struct MVert *mverts, int numVerts, struct MLoop *mloop,
+ struct MPoly *mpolys, int UNUSED(numLoops), int numPolys, float (*polyNors_r)[3]);
+
/* Return a newly MEM_malloc'd array of all the mesh vertex locations
* (_numVerts_r_ may be NULL) */
float (*mesh_getVertexCos(struct Mesh *me, int *numVerts_r))[3];
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c 2012-01-05 23:49:57 UTC (rev 43189)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c 2012-01-06 00:08:37 UTC (rev 43190)
@@ -2258,7 +2258,7 @@
face_nors = MEM_mallocN(sizeof(float)*3*dm->numTessFaceData, "face_nors");
/* calculate face normals */
- mesh_calc_normals_ex(cddm->mvert, dm->numVertData, CDDM_get_loops(dm), CDDM_get_polys(dm),
+ mesh_calc_normals_mapping_ex(cddm->mvert, dm->numVertData, CDDM_get_loops(dm), CDDM_get_polys(dm),
dm->numLoopData, dm->numPolyData, NULL, cddm->mface, dm->numTessFaceData,
CustomData_get_layer(&dm->faceData, CD_POLYINDEX), face_nors,
only_face_normals);
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c 2012-01-05 23:49:57 UTC (rev 43189)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c 2012-01-06 00:08:37 UTC (rev 43190)
@@ -1392,7 +1392,7 @@
me->mloop= CustomData_add_layer(&me->ldata, CD_MLOOP, CD_ASSIGN, allloop, me->totloop);
me->mpoly= CustomData_add_layer(&me->pdata, CD_MPOLY, CD_ASSIGN, allpoly, me->totpoly);
- mesh_calc_normals(me->mvert, me->totvert, me->mloop, me->mpoly, me->totloop, me->totpoly, NULL, NULL, 0, NULL, NULL);
+ mesh_calc_normals_mapping(me->mvert, me->totvert, me->mloop, me->mpoly, me->totloop, me->totpoly, NULL, NULL, 0, NULL, NULL);
} else {
me= add_mesh("Mesh");
DM_to_mesh(dm, me, ob);
@@ -1663,24 +1663,25 @@
}
}
-void mesh_calc_normals(MVert *mverts, int numVerts, MLoop *mloop, MPoly *mpolys,
- int numLoops, int numPolys, float (*polyNors_r)[3], MFace *mfaces, int numFaces,
- int *origIndexFace, float (*faceNors_r)[3])
+void mesh_calc_normals_mapping(MVert *mverts, int numVerts,
+ MLoop *mloop, MPoly *mpolys, int numLoops, int numPolys, float (*polyNors_r)[3],
+ MFace *mfaces, int numFaces, int *origIndexFace, float (*faceNors_r)[3])
{
- mesh_calc_normals_ex(mverts, numVerts, mloop, mpolys,
- numLoops, numPolys, polyNors_r, mfaces, numFaces,
- origIndexFace, faceNors_r, TRUE);
+ mesh_calc_normals_mapping_ex(mverts, numVerts, mloop, mpolys,
+ numLoops, numPolys, polyNors_r, mfaces, numFaces,
+ origIndexFace, faceNors_r, TRUE);
}
-void mesh_calc_normals_ex(MVert *mverts, int numVerts, MLoop *mloop, MPoly *mpolys,
- int UNUSED(numLoops), int numPolys, float (*polyNors_r)[3], MFace *mfaces, int numFaces,
- int *origIndexFace, float (*faceNors_r)[3],
- const short only_face_normals)
+
+void mesh_calc_normals_mapping_ex(MVert *mverts, int numVerts,
+ MLoop *mloop, MPoly *mpolys,
+ int numLoops, int numPolys, float (*polyNors_r)[3],
+ MFace *mfaces, int numFaces, int *origIndexFace, float (*faceNors_r)[3],
+ const short only_face_normals)
{
float (*pnors)[3] = polyNors_r, (*fnors)[3] = faceNors_r;
- int i, j;
+ int i;
MFace *mf;
MPoly *mp;
- MLoop *ml;
if (numPolys == 0) {
return;
@@ -1699,51 +1700,7 @@
if (only_face_normals == FALSE) {
/* vertex normals are optional, they require some extra calculations,
* so make them optional */
-
- float (*tnorms)[3], (*edgevecbuf)[3]= NULL;
- float **vertcos = NULL, **vertnos = NULL;
- BLI_array_declare(vertcos);
- BLI_array_declare(vertnos);
- BLI_array_declare(edgevecbuf);
-
- /*first go through and calculate normals for all the polys*/
- tnorms = MEM_callocN(sizeof(float)*3*numVerts, "tnorms mesh.c");
-
- mp = mpolys;
- for (i=0; i<numPolys; i++, mp++) {
- mesh_calc_poly_normal(mp, mloop+mp->loopstart, mverts, pnors[i]);
- ml = mloop + mp->loopstart;
-
- BLI_array_empty(vertcos);
- BLI_array_empty(vertnos);
- for (j=0; j<mp->totloop; j++) {
- int vindex = ml[j].v;
- BLI_array_append(vertcos, mverts[vindex].co);
- BLI_array_append(vertnos, tnorms[vindex]);
- }
-
- BLI_array_empty(edgevecbuf);
- BLI_array_growitems(edgevecbuf, mp->totloop);
-
- accumulate_vertex_normals_poly(vertnos, pnors[i], vertcos, edgevecbuf, mp->totloop);
- }
-
- BLI_array_free(vertcos);
- BLI_array_free(vertnos);
- BLI_array_free(edgevecbuf);
-
- /* following Mesh convention; we use vertex coordinate itself for normal in this case */
- for(i=0; i<numVerts; i++) {
- MVert *mv= &mverts[i];
- float *no= tnorms[i];
-
- if(normalize_v3(no) == 0.0f)
- normalize_v3_v3(no, mv->co);
-
- normal_float_to_short_v3(mv->no, no);
- }
-
- MEM_freeN(tnorms);
+ mesh_calc_normals(mverts, numVerts, mloop, mpolys, numLoops, numPolys, polyNors_r);
}
else {
/* only calc poly normals */
@@ -1776,8 +1733,67 @@
}
-void mesh_calc_tessface_normals(MVert *mverts, int numVerts, MFace *mfaces, int numFaces, float (*faceNors_r)[3])
+void mesh_calc_normals(MVert *mverts, int numVerts, MLoop *mloop, MPoly *mpolys,
+ int UNUSED(numLoops), int numPolys, float (*polyNors_r)[3])
{
+ float (*pnors)[3] = polyNors_r;
+
+ float (*tnorms)[3], (*edgevecbuf)[3]= NULL;
+ float **vertcos = NULL, **vertnos = NULL;
+ BLI_array_declare(vertcos);
+ BLI_array_declare(vertnos);
+ BLI_array_declare(edgevecbuf);
+
+ int i, j;
+ MPoly *mp;
+ MLoop *ml;
+
+ if (!pnors) pnors = MEM_callocN(sizeof(float) * 3 * numPolys, "poly_nors mesh.c");
+
+ /*first go through and calculate normals for all the polys*/
+ tnorms = MEM_callocN(sizeof(float)*3*numVerts, "tnorms mesh.c");
+
+ mp = mpolys;
+ for (i=0; i<numPolys; i++, mp++) {
+ mesh_calc_poly_normal(mp, mloop+mp->loopstart, mverts, pnors[i]);
+ ml = mloop + mp->loopstart;
+
+ BLI_array_empty(vertcos);
+ BLI_array_empty(vertnos);
+ for (j=0; j<mp->totloop; j++) {
+ int vindex = ml[j].v;
+ BLI_array_append(vertcos, mverts[vindex].co);
+ BLI_array_append(vertnos, tnorms[vindex]);
+ }
+
+ BLI_array_empty(edgevecbuf);
+ BLI_array_growitems(edgevecbuf, mp->totloop);
+
+ accumulate_vertex_normals_poly(vertnos, pnors[i], vertcos, edgevecbuf, mp->totloop);
+ }
+
+ BLI_array_free(vertcos);
+ BLI_array_free(vertnos);
+ BLI_array_free(edgevecbuf);
+
+ /* following Mesh convention; we use vertex coordinate itself for normal in this case */
+ for(i=0; i<numVerts; i++) {
+ MVert *mv= &mverts[i];
+ float *no= tnorms[i];
+
+ if(normalize_v3(no) == 0.0f)
+ normalize_v3_v3(no, mv->co);
+
+ normal_float_to_short_v3(mv->no, no);
+ }
+
+ MEM_freeN(tnorms);
+
+ if (pnors != polyNors_r) MEM_freeN(pnors);
+}
+
+void mesh_calc_normals_tessface(MVert *mverts, int numVerts, MFace *mfaces, int numFaces, float (*faceNors_r)[3])
+{
float (*tnorms)[3]= MEM_callocN(numVerts*sizeof(*tnorms), "tnorms");
float (*fnors)[3]= (faceNors_r)? faceNors_r: MEM_callocN(sizeof(*fnors)*numFaces, "meshnormals");
int i;
@@ -2602,15 +2618,15 @@
const float (*vertex_coords)[3], float normal[3])
{
- float *v1, *v2, *v3;
+ const float *v1, *v2, *v3;
double u[3], v[3], w[3];
double n[3] = {0.0, 0.0, 0.0}, l;
int i;
for(i = 0; i < mpoly->totloop; i++){
- v1 = vertex_coords + loopstart[i].v;
- v2 = vertex_coords + loopstart[(i+1)%mpoly->totloop].v;
- v3 = vertex_coords + loopstart[(i+2)%mpoly->totloop].v;
+ v1 = (const float *)(vertex_coords + loopstart[i].v);
+ v2 = (const float *)(vertex_coords + loopstart[(i+1)%mpoly->totloop].v);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list