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>2013-08-23 19:19:20 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-08-23 19:19:20 +0400
commit6f26acb00934594859cca09e9774b41a6c1a9e7c (patch)
tree5ce857f0dbf974ad9a1b1e1a549d35c592f17022 /source/blender/blenkernel/intern/camera.c
parent25ca7622386a1cb74b1745f1038fd71cd498a17c (diff)
simplify dist_to_plane_v3 and add dist_squared_to_plane_v3
Diffstat (limited to 'source/blender/blenkernel/intern/camera.c')
-rw-r--r--source/blender/blenkernel/intern/camera.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c
index d92a9220b4f..536ec95e3d1 100644
--- a/source/blender/blenkernel/intern/camera.c
+++ b/source/blender/blenkernel/intern/camera.c
@@ -459,7 +459,7 @@ typedef struct CameraViewFrameData {
float plane_tx[4][4]; /* 4 planes (not 4x4 matrix)*/
float frame_tx[4][3];
float normal_tx[4][3];
- float dist_vals[4];
+ float dist_vals_sq[4]; /* distance squared (signed) */
unsigned int tot;
} CameraViewFrameData;
@@ -469,9 +469,9 @@ static void camera_to_frame_view_cb(const float co[3], void *user_data)
unsigned int i;
for (i = 0; i < 4; i++) {
- float nd = dist_to_plane_v3(co, data->plane_tx[i]);
- if (nd < data->dist_vals[i]) {
- data->dist_vals[i] = nd;
+ float nd = dist_squared_to_plane_v3(co, data->plane_tx[i]);
+ if (nd < data->dist_vals_sq[i]) {
+ data->dist_vals_sq[i] = nd;
}
}
@@ -520,10 +520,7 @@ int BKE_camera_view_frame_fit_to_scene(Scene *scene, struct View3D *v3d, Object
}
/* initialize callback data */
- data_cb.dist_vals[0] =
- data_cb.dist_vals[1] =
- data_cb.dist_vals[2] =
- data_cb.dist_vals[3] = FLT_MAX;
+ copy_v4_fl(data_cb.dist_vals_sq, FLT_MAX);
data_cb.tot = 0;
/* run callback on all visible points */
BKE_scene_foreach_display_point(scene, v3d, BA_SELECT,
@@ -538,11 +535,16 @@ int BKE_camera_view_frame_fit_to_scene(Scene *scene, struct View3D *v3d, Object
float plane_isect_pt_1[3], plane_isect_pt_2[3];
+ /* could make a generic macro */
+#define SQRT_SIGNED(f) copysign(sqrtf(fabsf(f)), f)
+
/* apply the dist-from-plane's to the transformed plane points */
for (i = 0; i < 4; i++) {
- mul_v3_v3fl(plane_tx[i], data_cb.normal_tx[i], data_cb.dist_vals[i]);
+ mul_v3_v3fl(plane_tx[i], data_cb.normal_tx[i], SQRT_SIGNED(data_cb.dist_vals_sq[i]));
}
+#undef SQRT_SIGNED
+
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]);