[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42000] trunk/blender/source/blender: - pyapi mathutils.geometry.intersect_plane_plane

Campbell Barton ideasman42 at gmail.com
Sun Nov 20 06:56:22 CET 2011


Revision: 42000
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42000
Author:   campbellbarton
Date:     2011-11-20 05:56:21 +0000 (Sun, 20 Nov 2011)
Log Message:
-----------
- pyapi mathutils.geometry.intersect_plane_plane
- isect_plane_plane_v3 uses better method
- minor refactor - arg name changes & some args as const.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/camera.c
    trunk/blender/source/blender/blenlib/BLI_math_geom.h
    trunk/blender/source/blender/blenlib/intern/math_geom.c
    trunk/blender/source/blender/python/mathutils/mathutils_geometry.c

Modified: trunk/blender/source/blender/blenkernel/intern/camera.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/camera.c	2011-11-20 01:14:33 UTC (rev 41999)
+++ trunk/blender/source/blender/blenkernel/intern/camera.c	2011-11-20 05:56:21 UTC (rev 42000)
@@ -530,55 +530,49 @@
 			mul_v3_v3fl(plane_tx[i], data_cb.normal_tx[i], data_cb.dist_vals[i]);
 		}
 
-		if ( (isect_plane_plane_v3(plane_isect_1, plane_isect_1_no,
-		                           plane_tx[0], data_cb.normal_tx[0],
-		                           plane_tx[2], data_cb.normal_tx[2]) == 0) ||
-		     (isect_plane_plane_v3(plane_isect_2, plane_isect_2_no,
-		                           plane_tx[1], data_cb.normal_tx[1],
-		                           plane_tx[3], data_cb.normal_tx[3]) == 0))
+		isect_plane_plane_v3(plane_isect_1, plane_isect_1_no,
+		                     plane_tx[0], data_cb.normal_tx[0],
+		                     plane_tx[2], data_cb.normal_tx[2]);
+		isect_plane_plane_v3(plane_isect_2, plane_isect_2_no,
+		                     plane_tx[1], data_cb.normal_tx[1],
+		                     plane_tx[3], data_cb.normal_tx[3]);
+
+		add_v3_v3v3(plane_isect_1_other, plane_isect_1, plane_isect_1_no);
+		add_v3_v3v3(plane_isect_2_other, plane_isect_2, plane_isect_2_no);
+
+		if (isect_line_line_v3(plane_isect_1, plane_isect_1_other,
+		                       plane_isect_2, plane_isect_2_other,
+		                       plane_isect_pt_1, plane_isect_pt_2) == 0)
 		{
-			/* this is very unlikely */
 			return FALSE;
 		}
 		else {
+			float cam_plane_no[3]= {0.0f, 0.0f, -1.0f};
+			float plane_isect_delta[3];
+			float plane_isect_delta_len;
 
-			add_v3_v3v3(plane_isect_1_other, plane_isect_1, plane_isect_1_no);
-			add_v3_v3v3(plane_isect_2_other, plane_isect_2, plane_isect_2_no);
+			mul_m3_v3(rot_obmat, cam_plane_no);
 
-			if (isect_line_line_v3(plane_isect_1, plane_isect_1_other,
-			                       plane_isect_2, plane_isect_2_other,
-			                       plane_isect_pt_1, plane_isect_pt_2) == 0)
-			{
-				return FALSE;
+			sub_v3_v3v3(plane_isect_delta, plane_isect_pt_2, plane_isect_pt_1);
+			plane_isect_delta_len= len_v3(plane_isect_delta);
+
+			if (dot_v3v3(plane_isect_delta, cam_plane_no) > 0.0f) {
+				copy_v3_v3(r_co, plane_isect_pt_1);
+
+				/* offset shift */
+				normalize_v3(plane_isect_1_no);
+				madd_v3_v3fl(r_co, plane_isect_1_no, shift[1] * -plane_isect_delta_len);
 			}
 			else {
-				float cam_plane_no[3]= {0.0f, 0.0f, -1.0f};
-				float plane_isect_delta[3];
-				float plane_isect_delta_len;
+				copy_v3_v3(r_co, plane_isect_pt_2);
 
-				mul_m3_v3(rot_obmat, cam_plane_no);
+				/* offset shift */
+				normalize_v3(plane_isect_2_no);
+				madd_v3_v3fl(r_co, plane_isect_2_no, shift[0] * -plane_isect_delta_len);
+			}
 
-				sub_v3_v3v3(plane_isect_delta, plane_isect_pt_2, plane_isect_pt_1);
-				plane_isect_delta_len= len_v3(plane_isect_delta);
 
-				if (dot_v3v3(plane_isect_delta, cam_plane_no) > 0.0f) {
-					copy_v3_v3(r_co, plane_isect_pt_1);
-
-					/* offset shift */
-					normalize_v3(plane_isect_1_no);
-					madd_v3_v3fl(r_co, plane_isect_1_no, shift[1] * -plane_isect_delta_len);
-				}
-				else {
-					copy_v3_v3(r_co, plane_isect_pt_2);
-
-					/* offset shift */
-					normalize_v3(plane_isect_2_no);
-					madd_v3_v3fl(r_co, plane_isect_2_no, shift[0] * -plane_isect_delta_len);
-				}
-
-
-				return TRUE;
-			}
+			return TRUE;
 		}
 	}
 }

Modified: trunk/blender/source/blender/blenlib/BLI_math_geom.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_math_geom.h	2011-11-20 01:14:33 UTC (rev 41999)
+++ trunk/blender/source/blender/blenlib/BLI_math_geom.h	2011-11-20 05:56:21 UTC (rev 42000)
@@ -60,6 +60,7 @@
 float dist_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2]);
 void closest_to_line_segment_v2(float closest[2], const float p[2], const float l1[2], const float l2[2]);
 
+float dist_to_plane_normalized_v3(const float p[3], const float plane_co[3], const float plane_no_unit[3]);
 float dist_to_plane_v3(const float p[3], const float plane_co[3], const float plane_no[3]);
 float dist_to_line_segment_v3(const float p[3], const float l1[3], const float l2[3]);
 float closest_to_line_v3(float r[3], const float p[3], const float l1[3], const float l2[3]);
@@ -96,12 +97,13 @@
                        float i1[3], float i2[3]);
 int isect_line_line_strict_v3(const float v1[3], const float v2[3],
                               const float v3[3], const float v4[3],
-                              float vi[3], float *lambda);
+                              float vi[3], float *r_lambda);
 
 /*if clip is nonzero, will only return true if lambda is >= 0.0
   (i.e. intersection point is along positive d)*/
-int isect_ray_plane_v3(float p1[3], float d[3], float v0[3], 
-					   float v1[3], float v2[3], float *lambda, int clip);
+int isect_ray_plane_v3(const float p1[3], const float d[3],
+                       const float v0[3], const float v1[3], const float v2[3],
+                       float *r_lambda, const int clip);
 
 /**
  * Intersect line/plane, optionally treat line as directional (like a ray) with the no_flip argument.
@@ -126,19 +128,19 @@
  * @param plane_b_co The point on the second plane.
  * @param plane_b_no The normal of the second plane.
  */
-int isect_plane_plane_v3(float r_isect_co[3], float r_isect_no[3],
-                         const float plane_a_co[3], const float plane_a_no[3],
-                         const float plane_b_co[3], const float plane_b_no[3]);
+void isect_plane_plane_v3(float r_isect_co[3], float r_isect_no[3],
+                          const float plane_a_co[3], const float plane_a_no[3],
+                          const float plane_b_co[3], const float plane_b_no[3]);
 
 /* line/ray triangle */
 int isect_line_tri_v3(const float p1[3], const float p2[3],
-	const float v0[3], const float v1[3], const float v2[3], float *lambda, float uv[2]);
+	const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float r_uv[2]);
 int isect_ray_tri_v3(const float p1[3], const float d[3],
-	const float v0[3], const float v1[3], const float v2[3], float *lambda, float uv[2]);
+	const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float r_uv[2]);
 int isect_ray_tri_threshold_v3(const float p1[3], const float d[3],
-	const float v0[3], const float v1[3], const float v2[3], float *lambda, float uv[2], const float threshold);
+	const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float r_uv[2], const float threshold);
 int isect_ray_tri_epsilon_v3(const float p1[3], const float d[3],
-	const float v0[3], const float v1[3], const float v2[3], float *lambda, float uv[2], const float epsilon);
+	const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float r_uv[2], const float epsilon);
 
 /* point in polygon */
 int isect_point_quad_v2(const float p[2], const float a[2], const float b[2], const float c[2], const float d[2]);
@@ -148,16 +150,16 @@
 int isect_point_tri_prism_v3(const float p[3], const float v1[3], const float v2[3], const float v3[3]);
 
 void isect_point_quad_uv_v2(const float v0[2], const float v1[2], const float v2[2], const float v3[2],
-	const float pt[2], float *uv);
+                            const float pt[2], float r_uv[2]);
 void isect_point_face_uv_v2(const int isquad, const float v0[2], const float v1[2], const float v2[2],
-	const float v3[2], const float pt[2], float *uv);
+                            const float v3[2], const float pt[2], float r_uv[2]);
 
 /* other */
 int isect_sweeping_sphere_tri_v3(const float p1[3], const float p2[3], const float radius,
-	const float v0[3], const float v1[3], const float v2[3], float *lambda, float ipoint[3]);
+	const float v0[3], const float v1[3], const float v2[3], float *r_lambda, float ipoint[3]);
 
 int isect_axial_line_tri_v3(const int axis, const float co1[3], const float co2[3],
-	const float v0[3], const float v1[3], const float v2[3], float *lambda);
+	const float v0[3], const float v1[3], const float v2[3], float *r_lambda);
 
 int isect_aabb_aabb_v3(const float min1[3], const float max1[3], const float min2[3], const float max2[3]);
 
@@ -184,7 +186,7 @@
 void barycentric_weights_v2(const float v1[2], const float v2[2], const float v3[2],
 	const float co[2], float w[3]);
 
-void resolve_tri_uv(float uv[2], const float st[2], const float st0[2], const float st1[2], const float st2[2]);
+void resolve_tri_uv(float r_uv[2], const float st[2], const float st0[2], const float st1[2], const float st2[2]);
 void resolve_quad_uv(float uv[2], const float st[2], const float st0[2], const float st1[2], const float st2[2], const float st3[2]);
 
 /***************************** View & Projection *****************************/

Modified: trunk/blender/source/blender/blenlib/intern/math_geom.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/math_geom.c	2011-11-20 01:14:33 UTC (rev 41999)
+++ trunk/blender/source/blender/blenlib/intern/math_geom.c	2011-11-20 05:56:21 UTC (rev 42000)
@@ -238,6 +238,15 @@
 }
 
 /* signed distance from the point to the plane in 3D */
+float dist_to_plane_normalized_v3(const float p[3], const float plane_co[3], const float plane_no_unit[3])
+{
+	float plane_co_other[3];
+
+	add_v3_v3v3(plane_co_other, plane_co, plane_no_unit);
+
+	return -line_point_factor_v3(p, plane_co, plane_co_other);
+}
+
 float dist_to_plane_v3(const float p[3], const float plane_co[3], const float plane_no[3])
 {
 	float plane_no_unit[3];
@@ -601,7 +610,9 @@
    test if the line starting at p1 ending at p2 intersects the triangle v0..v2
    return non zero if it does 
 */
-int isect_line_tri_v3(const float p1[3], const float p2[3], const float v0[3], const float v1[3], const float v2[3], float *lambda, float uv[2])
+int isect_line_tri_v3(const float p1[3], const float p2[3],
+                      const float v0[3], const float v1[3], const float v2[3],
+                      float *r_lambda, float r_uv[2])
 {
 
 	float p[3], s[3], d[3], e1[3], e2[3], q[3];
@@ -626,12 +637,12 @@
 	v = f * dot_v3v3(d, q);
 	if ((v < 0.0f)||((u + v) > 1.0f)) return 0;
 
-	*lambda = f * dot_v3v3(e2, q);
-	if ((*lambda < 0.0f)||(*lambda > 1.0f)) return 0;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list