[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41034] branches/bmesh/blender/source/ blender: More solidify cleanup: comment updates and make shell_angle_to_dist a continuous function in the edge case
Andrew Wiggin
ender79bl at gmail.com
Sat Oct 15 16:46:26 CEST 2011
Revision: 41034
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41034
Author: ender79
Date: 2011-10-15 14:46:26 +0000 (Sat, 15 Oct 2011)
Log Message:
-----------
More solidify cleanup: comment updates and make shell_angle_to_dist a continuous function in the edge case
Modified Paths:
--------------
branches/bmesh/blender/source/blender/blenlib/intern/math_base_inline.c
branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c
Modified: branches/bmesh/blender/source/blender/blenlib/intern/math_base_inline.c
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/intern/math_base_inline.c 2011-10-15 14:21:03 UTC (rev 41033)
+++ branches/bmesh/blender/source/blender/blenlib/intern/math_base_inline.c 2011-10-15 14:46:26 UTC (rev 41034)
@@ -41,7 +41,7 @@
#define BLI_MATH_BASE_INLINE_H
/* A few small defines. Keep'em local! */
-#define SMALL_NUMBER 1.e-8
+#define SMALL_NUMBER 1.e-8f
MINLINE float sqrt3f(float f)
{
@@ -108,7 +108,7 @@
* the distance gets very high, 180d would be inf, but this case isn't valid */
MINLINE float shell_angle_to_dist(const float angle)
{
- return (angle < (float)SMALL_NUMBER) ? 1.0f : fabsf(1.0f / cosf(angle));
+ return (1.0f + SMALL_NUMBER) / (fabs(cosf(angle)) + SMALL_NUMBER);
}
/* used for zoom values*/
Modified: branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c 2011-10-15 14:21:03 UTC (rev 41033)
+++ branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c 2011-10-15 14:46:26 UTC (rev 41034)
@@ -334,9 +334,10 @@
}
/*
- * Compute higher-quality vertex normals used by solidify.
- * Note that this will not work for non-manifold regions.
- *
+ * Compute higher-quality vertex normals used by solidify.
+ * Only considers geometry in the marked solidify region.
+ * Note that this does not work so well for non-manifold
+ * regions.
*/
static void calc_solidify_normals(BMesh *bm)
{
@@ -347,8 +348,6 @@
float edge_normal[3];
int i;
- BM_Compute_Normals(bm);
-
/* Clear indices of verts & edges */
BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
BM_SetIndex(v, 0);
@@ -363,11 +362,12 @@
}
BM_ITER(e, &eiter, bm, BM_EDGES_OF_FACE, f) {
+ /* Count number of marked faces using e */
i = BM_GetIndex(e);
- /* Count number of marked faces using each edge */
BM_SetIndex(e, i+1);
- /* And mark the edges and verts around marked faces */
+ /* And mark all edges and vertices on the
+ marked faces */
BMO_SetFlag(bm, e, EDGE_MARK);
BMO_SetFlag(bm, e->v1, VERT_MARK);
BMO_SetFlag(bm, e->v2, VERT_MARK);
@@ -404,10 +404,18 @@
BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
float angle;
- if (!BMO_TestFlag(bm, e, EDGE_MARK) || BMO_TestFlag(bm, e, EDGE_NONMAN)) {
+ /* If the edge is not part of a the solidify region
+ its normal should not be considered */
+ if (!BMO_TestFlag(bm, e, EDGE_MARK)) {
continue;
}
+ /* If the edge joins more than two marked faces high
+ quality normal computation won't work */
+ if (BMO_TestFlag(bm, e, EDGE_NONMAN)) {
+ continue;
+ }
+
f1 = f2 = NULL;
BM_ITER(f, &fiter, bm, BM_FACES_OF_EDGE, e) {
@@ -415,7 +423,8 @@
if (f1 == NULL) {
f1 = f;
}
- else if (f2 == NULL) {
+ else {
+ BLI_assert(f2 == NULL);
f2 = f;
}
}
@@ -427,7 +436,7 @@
angle = angle_normalized_v3v3(f1->no, f2->no);
if (angle > 0.0f) {
- /* two faces using this edge, calculate the edges normal
+ /* two faces using this edge, calculate the edge normal
* using the angle between the faces as a weighting */
add_v3_v3v3(edge_normal, f1->no, f2->no);
normalize_v3(edge_normal);
More information about the Bf-blender-cvs
mailing list