[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57152] trunk/blender/source/blender: improve edgering subdivide curvature calculations ( calculate length projected onto the normal plane).

Campbell Barton ideasman42 at gmail.com
Fri May 31 08:28:12 CEST 2013


Revision: 57152
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57152
Author:   campbellbarton
Date:     2013-05-31 06:28:11 +0000 (Fri, 31 May 2013)
Log Message:
-----------
improve edgering subdivide curvature calculations (calculate length projected onto the normal plane).
also correct recely added asserts.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/bmesh/operators/bmo_subdivide_edgering.c

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2013-05-31 00:19:38 UTC (rev 57151)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2013-05-31 06:28:11 UTC (rev 57152)
@@ -873,7 +873,7 @@
         ModifierApplyFlag flag)
 {
 	ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-	BLI_assert(CustomData_has_layer(&dm->polyData, CD_NORMAL) == false);
+	BLI_assert(!dm || CustomData_has_layer(&dm->polyData, CD_NORMAL) == false);
 
 	if (dm && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
 		DM_ensure_normals(dm);
@@ -887,7 +887,7 @@
         float (*vertexCos)[3], int numVerts)
 {
 	ModifierTypeInfo *mti = modifierType_getInfo(md->type);
-	BLI_assert(CustomData_has_layer(&dm->polyData, CD_NORMAL) == false);
+	BLI_assert(!dm || CustomData_has_layer(&dm->polyData, CD_NORMAL) == false);
 
 	if (dm && mti->dependsOnNormals && mti->dependsOnNormals(md)) {
 		DM_ensure_normals(dm);

Modified: trunk/blender/source/blender/bmesh/operators/bmo_subdivide_edgering.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_subdivide_edgering.c	2013-05-31 00:19:38 UTC (rev 57151)
+++ trunk/blender/source/blender/bmesh/operators/bmo_subdivide_edgering.c	2013-05-31 06:28:11 UTC (rev 57152)
@@ -86,6 +86,7 @@
 	const float dot = dot_v3v3(no_a, no_b);
 	/* gives closest approx at a circle with 2 parallel handles */
 	float fac = 1.333333f;
+	float len;
 	if (dot < 0.0f) {
 		/* scale down to 0.666 if we point directly at each other rough but ok */
 		/* TODO, current blend from dot may not be optimal but its also a detail */
@@ -93,7 +94,25 @@
 		fac = (fac * t) + (0.75f * (1.0f - t));
 	}
 
-	return (len_v3v3(co_a, co_b) * 0.5f) * fac;
+#if 0
+	len = len_v3v3(co_a, co_b);
+#else
+	/* 2d length projected on plane of normals */
+	{
+		float co_a_ofs[3];
+		cross_v3_v3v3(co_a_ofs, no_a, no_b);
+		if (len_squared_v3(co_a_ofs) > FLT_EPSILON) {
+			add_v3_v3(co_a_ofs, co_a);
+			closest_to_line_v3(co_a_ofs, co_b, co_a, co_a_ofs);
+		}
+		else {
+			copy_v3_v3(co_a_ofs, co_a);
+		}
+		len = len_v3v3(co_a_ofs, co_b);
+	}
+#endif
+
+	return (len * 0.5f) * fac;
 }
 
 static void bm_edgeloop_vert_tag(struct BMEdgeLoopStore *el_store, const bool tag)




More information about the Bf-blender-cvs mailing list