make scene.ray_cast() behave like object.ray_cast(), add distance arg to snapObjectsR...
authorCampbell Barton <ideasman42@gmail.com>
Thu, 11 Apr 2013 10:17:06 +0000 (10:17 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 11 Apr 2013 10:17:06 +0000 (10:17 +0000)
source/blender/editors/include/ED_transform.h
source/blender/editors/space_view3d/view3d_ruler.c
source/blender/editors/transform/transform_snap.c
source/blender/makesrna/intern/rna_scene_api.c

index 5fe44aa17f78da4f85bd1f35b157008ad26d549f..824d1db432fd1e3249290e019a62e3ee652628bb 100644 (file)
@@ -187,7 +187,7 @@ bool snapObjectsContext(struct bContext *C, const float mval[2], float *r_dist_p
 bool snapObjectsEx(struct Scene *scene, struct Base *base_act, struct View3D *v3d, struct ARegion *ar, struct Object *obedit, short snap_mode,
                    const float mval[2], float *r_dist_px, float r_loc[3], float r_no[3], SnapMode mode);
 bool snapObjectsRayEx(struct Scene *scene, struct Base *base_act, struct View3D *v3d, struct ARegion *ar, struct Object *obedit, short snap_mode,
-                      const float ray_start[3], const float ray_normal[3],
+                      const float ray_start[3], const float ray_normal[3], const float ray_dist,
                       const float mval[2], float *r_dist_px, float r_loc[3], float r_no[3], SnapMode mode);
 
 bool snapNodesTransform(struct TransInfo *t, const int mval[2], float *r_dist_px, float r_loc[2], char *r_node_border, SnapMode mode);
index ad3f941bd17ca1166cc47c34bc27ed883ea99ee0..15d5aee9020bb4efada47d74eb278138d56847a6 100644 (file)
@@ -104,7 +104,7 @@ static bool ED_view3d_snap_ray(bContext *C, float r_co[3],
 
        /* try snap edge, then face if it fails */
        ret = snapObjectsRayEx(scene, NULL, v3d, ar, obedit, SCE_SNAP_MODE_FACE,
-                              ray_start, ray_normal,
+                              ray_start, ray_normal, v3d->far,
                               NULL, &dist_px, r_co, r_no_dummy, SNAP_ALL);
 
        return ret;
index f8bee3f993adeeda154a16dcf62c120be10e156e..0208b3d302ff140566e1d57f530d270819b06e3b 100644 (file)
@@ -83,6 +83,8 @@
 
 #define TRANSFORM_DIST_MAX_PX 1000.0f
 #define TRANSFORM_SNAP_MAX_PX 100.0f
+/* use half of flt-max so we can scale up without an exception */
+#define TRANSFORM_DIST_MAX_RAY (FLT_MAX / 2.0f)
 
 /********************* PROTOTYPES ***********************/
 
@@ -1548,11 +1550,11 @@ static bool snapObject(Scene *scene, short snap_mode, ARegion *ar, Object *ob, i
 }
 
 static bool snapObjectsRay(Scene *scene, short snap_mode, Base *base_act, View3D *v3d, ARegion *ar, Object *obedit,
-                           const float ray_start[3], const float ray_normal[3],
+                           const float ray_start[3], const float ray_normal[3], const float ray_dist,
                            const float mval[2], float *r_dist_px, float r_loc[3], float r_no[3], SnapMode mode)
 {
        Base *base;
-       float depth = (FLT_MAX / 2.0f);  /* use half of flt-max so we can scale up without an exception */
+       float depth = ray_dist;
        bool retval = false;
 
        if (mode == SNAP_ALL && obedit) {
@@ -1608,7 +1610,7 @@ static bool snapObjects(Scene *scene, short snap_mode, Base *base_act, View3D *v
        ED_view3d_win_to_ray(ar, v3d, mval, ray_start, ray_normal);
 
        return snapObjectsRay(scene, snap_mode, base_act, v3d, ar, obedit,
-                             ray_start, ray_normal,
+                             ray_start, ray_normal, TRANSFORM_DIST_MAX_RAY,
                              mval, r_dist_px, r_loc, r_no, mode);
 }
 
@@ -1634,11 +1636,11 @@ bool snapObjectsEx(Scene *scene, Base *base_act, View3D *v3d, ARegion *ar, Objec
                           mval, r_dist_px, r_loc, r_no, mode);
 }
 bool snapObjectsRayEx(Scene *scene, Base *base_act, View3D *v3d, ARegion *ar, Object *obedit, short snap_mode,
-                      const float ray_start[3], const float ray_normal[3],
+                      const float ray_start[3], const float ray_normal[3], const float ray_dist,
                       const float mval[2], float *r_dist_px, float r_loc[3], float r_no[3], SnapMode mode)
 {
        return snapObjectsRay(scene, snap_mode, base_act, v3d, ar, obedit,
-                             ray_start, ray_normal,
+                             ray_start, ray_normal, ray_dist,
                              mval, r_dist_px, r_loc, r_no, mode);
 }
 
index 207aaa4eb7a38cae0a823af908439ce7c3bb0398..a028be14cc780593a79c3d3c2beb56e023addb5c 100644 (file)
@@ -96,11 +96,13 @@ static void rna_Scene_ray_cast(Scene *scene, ReportList *reports, float ray_star
 {
        float dummy_dist_px = 0;
        float ray_nor[3];
+       float dist;
 
        sub_v3_v3v3(ray_nor, ray_end, ray_start);
+       dist = normalize_v3(ray_nor);
 
        if (snapObjectsRayEx(scene, NULL, NULL, NULL, NULL, SCE_SNAP_MODE_FACE,
-                            ray_start, ray_nor,
+                            ray_start, ray_nor, dist,
                             NULL, &dummy_dist_px, r_location, r_normal, SNAP_ALL))
        {
                *r_success = true;