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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to