Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2011-06-26 12:07:09 +0400
committerCampbell Barton <ideasman42@gmail.com>2011-06-26 12:07:09 +0400
commit8eb119a5cd05dc39fd6afec2aa40e4c425622462 (patch)
treee96745bd4ffcb84df26e875bd57f51ae274d421a
parent540c2eee566318a40fef26cd60f182020d2cb7ff (diff)
renamed math functions and made public
lambda_cp_line --> line_point_factor_v3 lambda_cp_line2 --> line_point_factor_v2 correction to previous commit function name isect_seg_sphere_v3 --> isect_line_sphere_v3 ... since its not clipped. added a clip argument to the python version of the function.
-rw-r--r--source/blender/blenlib/BLI_math_geom.h5
-rw-r--r--source/blender/blenlib/intern/math_geom.c20
-rw-r--r--source/blender/editors/sculpt_paint/paint_image.c23
-rw-r--r--source/blender/python/generic/mathutils_geometry.c37
4 files changed, 48 insertions, 37 deletions
diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h
index 26cf315fc36..c905ada184d 100644
--- a/source/blender/blenlib/BLI_math_geom.h
+++ b/source/blender/blenlib/BLI_math_geom.h
@@ -66,6 +66,9 @@ float closest_to_line_v3(float r[3], const float p[3], const float l1[3], const
float closest_to_line_v2(float r[2], const float p[2], const float l1[2], const float l2[2]);
void closest_to_line_segment_v3(float r[3], const float p[3], const float l1[3], const float l2[3]);
+float line_point_factor_v3(const float p[3], const float l1[3], const float l2[3]);
+float line_point_factor_v2(const float p[2], const float l1[2], const float l2[2]);
+
/******************************* Intersection ********************************/
/* TODO int return value consistency */
@@ -78,8 +81,8 @@ void closest_to_line_segment_v3(float r[3], const float p[3], const float l1[3],
int isect_line_line_v2(const float a1[2], const float a2[2], const float b1[2], const float b2[2]);
int isect_line_line_v2_int(const int a1[2], const int a2[2], const int b1[2], const int b2[2]);
+int isect_line_sphere_v3(const float l1[3], const float l2[3], const float sp[3], const float r, float r_p1[3], float r_p2[3]);
int isect_seg_seg_v2_point(const float v1[2], const float v2[2], const float v3[2], const float v4[2], float vi[2]);
-int isect_seg_sphere_v3(const float l1[3], const float l2[3], const float sp[3], const float r, float r_p1[3], float r_p2[3]);
/* Returns the number of point of interests
* 0 - lines are colinear
diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c
index ce03143dcaf..a71b60896fc 100644
--- a/source/blender/blenlib/intern/math_geom.c
+++ b/source/blender/blenlib/intern/math_geom.c
@@ -37,8 +37,6 @@
#include "BLI_memarena.h"
#include "BLI_utildefines.h"
-static float lambda_cp_line(const float p[3], const float l1[3], const float l2[3]);
-
/********************************** Polygons *********************************/
void cent_tri_v3(float cent[3], const float v1[3], const float v2[3], const float v3[3])
@@ -349,9 +347,9 @@ int isect_seg_seg_v2_point(const float v1[2], const float v2[2], const float v3[
return -1;
}
-int isect_seg_sphere_v3(const float l1[3], const float l2[3],
- const float sp[3], const float r,
- float r_p1[3], float r_p2[3])
+int isect_line_sphere_v3(const float l1[3], const float l2[3],
+ const float sp[3], const float r,
+ float r_p1[3], float r_p2[3])
{
/* l1: coordinates (point of line)
* l2: coordinates (point of line)
@@ -741,7 +739,7 @@ int isect_line_plane_v3(float out[3], const float l1[3], const float l2[3], cons
add_v3_v3v3(l1_plane, l1, p_no);
- dist = lambda_cp_line(plane_co, l1, l1_plane);
+ dist = line_point_factor_v3(plane_co, l1, l1_plane);
/* treat line like a ray, when 'no_flip' is set */
if(no_flip && dist < 0.0f) {
@@ -1191,7 +1189,7 @@ float closest_to_line_v2(float cp[2],const float p[2], const float l1[2], const
}
/* little sister we only need to know lambda */
-static float lambda_cp_line(const float p[3], const float l1[3], const float l2[3])
+float line_point_factor_v3(const float p[3], const float l1[3], const float l2[3])
{
float h[3],u[3];
sub_v3_v3v3(u, l2, l1);
@@ -1199,6 +1197,14 @@ static float lambda_cp_line(const float p[3], const float l1[3], const float l2[
return(dot_v3v3(u,h)/dot_v3v3(u,u));
}
+float line_point_factor_v2(const float p[2], const float l1[2], const float l2[2])
+{
+ float h[2], u[2];
+ sub_v2_v2v2(u, l2, l1);
+ sub_v2_v2v2(h, p, l1);
+ return(dot_v2v2(u, h)/dot_v2v2(u, u));
+}
+
/* Similar to LineIntersectsTriangleUV, except it operates on a quad and in 2d, assumes point is in quad */
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)
{
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c
index cae5c14aa97..c9a6aa87cd0 100644
--- a/source/blender/editors/sculpt_paint/paint_image.c
+++ b/source/blender/editors/sculpt_paint/paint_image.c
@@ -1174,25 +1174,6 @@ static void project_face_seams_init(const ProjPaintState *ps, const int face_ind
#endif // PROJ_DEBUG_NOSEAMBLEED
-/* TODO - move to math_geom.c */
-
-/* little sister we only need to know lambda */
-#ifndef PROJ_DEBUG_NOSEAMBLEED
-static float lambda_cp_line2(const float p[2], const float l1[2], const float l2[2])
-{
- float h[2], u[2];
-
- u[0] = l2[0] - l1[0];
- u[1] = l2[1] - l1[1];
-
- h[0] = p[0] - l1[0];
- h[1] = p[1] - l1[1];
-
- return(dot_v2v2(u, h)/dot_v2v2(u, u));
-}
-#endif // PROJ_DEBUG_NOSEAMBLEED
-
-
/* Converts a UV location to a 3D screenspace location
* Takes a 'uv' and 3 UV coords, and sets the values of pixelScreenCo
*
@@ -2518,9 +2499,9 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i
*/
/* Since this is a seam we need to work out where on the line this pixel is */
- //fac = lambda_cp_line2(uv, uv_seam_quad[0], uv_seam_quad[1]);
+ //fac = line_point_factor_v2(uv, uv_seam_quad[0], uv_seam_quad[1]);
- fac = lambda_cp_line2(uv, seam_subsection[0], seam_subsection[1]);
+ fac = line_point_factor_v2(uv, seam_subsection[0], seam_subsection[1]);
if (fac < 0.0f) { VECCOPY(pixelScreenCo, edge_verts_inset_clip[0]); }
else if (fac > 1.0f) { VECCOPY(pixelScreenCo, edge_verts_inset_clip[1]); }
else { interp_v3_v3v3(pixelScreenCo, edge_verts_inset_clip[0], edge_verts_inset_clip[1], fac); }
diff --git a/source/blender/python/generic/mathutils_geometry.c b/source/blender/python/generic/mathutils_geometry.c
index 0b98867dcee..f3fe05cd846 100644
--- a/source/blender/python/generic/mathutils_geometry.c
+++ b/source/blender/python/generic/mathutils_geometry.c
@@ -522,7 +522,7 @@ static PyObject *M_Geometry_intersect_line_plane(PyObject *UNUSED(self), PyObjec
VectorObject *line_a, *line_b, *plane_co, *plane_no;
int no_flip= 0;
float isect[3];
- if(!PyArg_ParseTuple(args, "O!O!O!O!|i:intersect_line_line_2d",
+ if(!PyArg_ParseTuple(args, "O!O!O!O!|i:intersect_line_plane",
&vector_Type, &line_a,
&vector_Type, &line_b,
&vector_Type, &plane_co,
@@ -555,7 +555,7 @@ static PyObject *M_Geometry_intersect_line_plane(PyObject *UNUSED(self), PyObjec
PyDoc_STRVAR(M_Geometry_intersect_line_sphere_doc,
-".. function:: intersect_line_sphere(line_a, line_b, sphere_co, sphere_radius)\n"
+".. function:: intersect_line_sphere(line_a, line_b, sphere_co, sphere_radius, clip=True)\n"
"\n"
" Takes a lines (as 2 vectors), a sphere as a point and a radius and\n"
" returns the intersection\n"
@@ -576,15 +576,17 @@ static PyObject *M_Geometry_intersect_line_sphere(PyObject *UNUSED(self), PyObje
PyObject *ret;
VectorObject *line_a, *line_b, *sphere_co;
float sphere_radius;
+ int clip= TRUE;
+ float lambda;
float isect_a[3];
float isect_b[3];
- if(!PyArg_ParseTuple(args, "O!O!O!f:intersect_line_sphere",
+ if(!PyArg_ParseTuple(args, "O!O!O!f|i:intersect_line_sphere",
&vector_Type, &line_a,
&vector_Type, &line_b,
&vector_Type, &sphere_co,
- &sphere_radius)
+ &sphere_radius, &clip)
) {
return NULL;
}
@@ -603,14 +605,33 @@ static PyObject *M_Geometry_intersect_line_sphere(PyObject *UNUSED(self), PyObje
ret= PyTuple_New(2);
- switch(isect_seg_sphere_v3(line_a->vec, line_b->vec, sphere_co->vec, sphere_radius, isect_a, isect_b)) {
+ switch(isect_line_sphere_v3(line_a->vec, line_b->vec, sphere_co->vec, sphere_radius, isect_a, isect_b)) {
case 1:
- PyTuple_SET_ITEM(ret, 0, newVectorObject(isect_a, 3, Py_NEW, NULL));
+ /* ret 1 */
+ if(!clip || (((lambda= line_point_factor_v3(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f))) {
+ PyTuple_SET_ITEM(ret, 0, newVectorObject(isect_a, 3, Py_NEW, NULL));
+ }
+ else {
+ PyTuple_SET_ITEM(ret, 0, Py_None); Py_INCREF(Py_None);
+ }
+ /* ret 2 */
PyTuple_SET_ITEM(ret, 1, Py_None); Py_INCREF(Py_None);
break;
case 2:
- PyTuple_SET_ITEM(ret, 0, newVectorObject(isect_a, 3, Py_NEW, NULL));
- PyTuple_SET_ITEM(ret, 1, newVectorObject(isect_b, 3, Py_NEW, NULL));
+ /* ret 1 */
+ if(!clip || (((lambda= line_point_factor_v3(isect_a, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f))) {
+ PyTuple_SET_ITEM(ret, 0, newVectorObject(isect_a, 3, Py_NEW, NULL));
+ }
+ else {
+ PyTuple_SET_ITEM(ret, 0, Py_None); Py_INCREF(Py_None);
+ }
+ /* ret 2 */
+ if(!clip || (((lambda= line_point_factor_v3(isect_b, line_a->vec, line_b->vec)) >= 0.0f) && (lambda <= 1.0f))) {
+ PyTuple_SET_ITEM(ret, 1, newVectorObject(isect_b, 3, Py_NEW, NULL));
+ }
+ else {
+ PyTuple_SET_ITEM(ret, 1, Py_None); Py_INCREF(Py_None);
+ }
break;
default:
PyTuple_SET_ITEM(ret, 0, Py_None); Py_INCREF(Py_None);