[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42234] branches/bmesh/blender/source/ blender/blenkernel: utility function for getting the center of a polygon, needed for up coming changes
Campbell Barton
ideasman42 at gmail.com
Tue Nov 29 00:50:46 CET 2011
Revision: 42234
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42234
Author: campbellbarton
Date: 2011-11-28 23:50:40 +0000 (Mon, 28 Nov 2011)
Log Message:
-----------
utility function for getting the center of a polygon, needed for up coming changes
Modified Paths:
--------------
branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
Modified: branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h 2011-11-28 21:48:49 UTC (rev 42233)
+++ branches/bmesh/blender/source/blender/blenkernel/BKE_mesh.h 2011-11-28 23:50:40 UTC (rev 42234)
@@ -79,8 +79,11 @@
/*calculates a face normal.*/
void mesh_calc_poly_normal(struct MPoly *mpoly, struct MLoop *loopstart,
- struct MVert *mvarray, float *no);
+ struct MVert *mvarray, float no[3]);
+void mesh_calc_poly_center(struct MPoly *mpoly, struct MLoop *loopstart,
+ struct MVert *mvarray, float cent[3]);
+
void unlink_mesh(struct Mesh *me);
void free_mesh(struct Mesh *me, int unlink);
struct Mesh *add_mesh(const char *name);
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c 2011-11-28 21:48:49 UTC (rev 42233)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c 2011-11-28 23:50:40 UTC (rev 42234)
@@ -2450,7 +2450,7 @@
*
*/
static void mesh_calc_ngon_normal(MPoly *mpoly, MLoop *loopstart,
- MVert *mvert, float *normal)
+ MVert *mvert, float normal[3])
{
MVert *v1, *v2, *v3;
@@ -2512,35 +2512,69 @@
}
void mesh_calc_poly_normal(MPoly *mpoly, MLoop *loopstart,
- MVert *mvarray, float *no)
+ MVert *mvarray, float no[3])
{
- if(mpoly->totloop > 4) {
+ if (mpoly->totloop > 4) {
mesh_calc_ngon_normal(mpoly, loopstart, mvarray, no);
}
- else if(mpoly->totloop == 3){
- MVert *v1, *v2, *v3;
-
- v1 = mvarray + (loopstart++)->v;
- v2 = mvarray + (loopstart++)->v;
- v3 = mvarray + loopstart->v;
- normal_tri_v3( no,v1->co, v2->co, v3->co);
+ else if (mpoly->totloop == 3){
+ normal_tri_v3(no,
+ mvarray[loopstart[0].v].co,
+ mvarray[loopstart[1].v].co,
+ mvarray[loopstart[2].v].co
+ );
}
- else if(mpoly->totloop == 4){
- MVert *v1, *v2, *v3, *v4;
-
- v1 = mvarray + (loopstart++)->v;
- v2 = mvarray + (loopstart++)->v;
- v3 = mvarray + (loopstart++)->v;
- v4 = mvarray + loopstart->v;
- normal_quad_v3( no,v1->co, v2->co, v3->co, v4->co);
+ else if (mpoly->totloop == 4) {
+ normal_quad_v3(no,
+ mvarray[loopstart[0].v].co,
+ mvarray[loopstart[1].v].co,
+ mvarray[loopstart[2].v].co,
+ mvarray[loopstart[3].v].co
+ );
}
- else{ /*horrible, two sided face!*/
+ else { /* horrible, two sided face! */
no[0] = 0.0;
no[1] = 0.0;
no[2] = 1.0;
}
}
+static void mesh_calc_ngon_center(MPoly *mpoly, MLoop *loopstart,
+ MVert *mvert, float cent[3])
+{
+ const float fac= 1.0f / (float)mpoly->totloop;
+ int i;
+
+ zero_v3(cent);
+
+ for (i = 0; i < mpoly->totloop; i++) {
+ madd_v3_v3fl(cent, mvert[(loopstart++)->v].co, fac);
+ }
+}
+
+void mesh_calc_poly_center(MPoly *mpoly, MLoop *loopstart,
+ MVert *mvarray, float cent[3])
+{
+ if (mpoly->totloop == 3) {
+ cent_tri_v3(cent,
+ mvarray[loopstart[0].v].co,
+ mvarray[loopstart[1].v].co,
+ mvarray[loopstart[2].v].co
+ );
+ }
+ else if (mpoly->totloop == 4) {
+ cent_quad_v3(cent,
+ mvarray[loopstart[0].v].co,
+ mvarray[loopstart[1].v].co,
+ mvarray[loopstart[2].v].co,
+ mvarray[loopstart[3].v].co
+ );
+ }
+ else {
+ mesh_calc_ngon_center(mpoly, loopstart, mvarray, cent);
+ }
+}
+
/* basic vertex data functions */
int minmax_mesh(Mesh *me, float min[3], float max[3])
{
More information about the Bf-blender-cvs
mailing list