[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25741] trunk/blender/source/blender: Alt+B view clipping is now taken into account properly for sculpt, particle
Brecht Van Lommel
brecht at blender.org
Tue Jan 5 15:26:38 CET 2010
Revision: 25741
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25741
Author: blendix
Date: 2010-01-05 15:26:38 +0100 (Tue, 05 Jan 2010)
Log Message:
-----------
Alt+B view clipping is now taken into account properly for sculpt, particle
edit and snapping, by clipping the view ray.
Modified Paths:
--------------
trunk/blender/source/blender/blenlib/BLI_math_geom.h
trunk/blender/source/blender/blenlib/intern/math_geom.c
trunk/blender/source/blender/blenlib/intern/pbvh.c
trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
trunk/blender/source/blender/editors/space_view3d/view3d_view.c
Modified: trunk/blender/source/blender/blenlib/BLI_math_geom.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_math_geom.h 2010-01-05 13:55:51 UTC (rev 25740)
+++ trunk/blender/source/blender/blenlib/BLI_math_geom.h 2010-01-05 14:26:38 UTC (rev 25741)
@@ -111,6 +111,8 @@
int isect_aabb_aabb_v3(float min1[3], float max1[3], float min2[3], float max2[3]);
+int clip_line_plane(float clipco[3], float plane[4], float co[3]);
+
/****************************** Interpolation ********************************/
/* tri or quad, d can be NULL */
Modified: trunk/blender/source/blender/blenlib/intern/math_geom.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/math_geom.c 2010-01-05 13:55:51 UTC (rev 25740)
+++ trunk/blender/source/blender/blenlib/intern/math_geom.c 2010-01-05 14:26:38 UTC (rev 25741)
@@ -1246,6 +1246,55 @@
return 1;
}
+int clip_line_plane(float p1[3], float p2[3], float plane[4])
+{
+ float dp[3], n[3], div, t, pc[3];
+
+ copy_v3_v3(n, plane);
+ sub_v3_v3v3(dp, p2, p1);
+ div= dot_v3v3(dp, n);
+
+ if(div == 0.0f) /* parallel */
+ return 1;
+
+ t= -(dot_v3v3(p1, n) + plane[3])/div;
+
+ if(div > 0.0f) {
+ /* behind plane, completely clipped */
+ if(t >= 1.0f) {
+ zero_v3(p1);
+ zero_v3(p2);
+ return 0;
+ }
+
+ /* intersect plane */
+ if(t > 0.0f) {
+ madd_v3_v3v3fl(pc, p1, dp, t);
+ copy_v3_v3(p1, pc);
+ return 1;
+ }
+
+ return 1;
+ }
+ else {
+ /* behind plane, completely clipped */
+ if(t <= 0.0f) {
+ zero_v3(p1);
+ zero_v3(p2);
+ return 0;
+ }
+
+ /* intersect plane */
+ if(t < 1.0f) {
+ madd_v3_v3v3fl(pc, p1, dp, t);
+ copy_v3_v3(p2, pc);
+ return 1;
+ }
+
+ return 1;
+ }
+}
+
/****************************** Interpolation ********************************/
static float tri_signed_area(float *v1, float *v2, float *v3, int i, int j)
Modified: trunk/blender/source/blender/blenlib/intern/pbvh.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/pbvh.c 2010-01-05 13:55:51 UTC (rev 25740)
+++ trunk/blender/source/blender/blenlib/intern/pbvh.c 2010-01-05 14:26:38 UTC (rev 25741)
@@ -694,6 +694,11 @@
pbvh_iter_end(&iter);
+ if(tot == 0 && array) {
+ MEM_freeN(array);
+ array= NULL;
+ }
+
*r_array= array;
*r_tot= tot;
}
Modified: trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/sculpt.c 2010-01-05 13:55:51 UTC (rev 25740)
+++ trunk/blender/source/blender/editors/sculpt_paint/sculpt.c 2010-01-05 14:26:38 UTC (rev 25741)
@@ -1841,7 +1841,7 @@
ViewContext *vc = paint_stroke_view_context(stroke);
SculptSession *ss= vc->obact->sculpt;
StrokeCache *cache= ss->cache;
- float ray_start[3], ray_normal[3];
+ float ray_start[3], ray_end[3], ray_normal[3], dist;
float obimat[4][4];
float mval[2] = {mouse[0] - vc->ar->winrct.xmin,
mouse[1] - vc->ar->winrct.ymin};
@@ -1849,7 +1849,9 @@
sculpt_stroke_modifiers_check(C, ss);
- viewray(vc->ar, vc->v3d, mval, ray_start, ray_normal);
+ viewline(vc->ar, vc->v3d, mval, ray_start, ray_end);
+ sub_v3_v3v3(ray_normal, ray_end, ray_start);
+ dist= normalize_v3(ray_normal);
invert_m4_m4(obimat, ss->ob->obmat);
mul_m4_v3(obimat, ray_start);
@@ -1859,7 +1861,7 @@
srd.ss = vc->obact->sculpt;
srd.ray_start = ray_start;
srd.ray_normal = ray_normal;
- srd.dist = FLT_MAX;
+ srd.dist = dist;
srd.hit = 0;
srd.original = (cache)? cache->original: 0;
BLI_pbvh_raycast(ss->tree, sculpt_raycast_cb, &srd,
Modified: trunk/blender/source/blender/editors/space_view3d/view3d_view.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_view.c 2010-01-05 13:55:51 UTC (rev 25740)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_view.c 2010-01-05 14:26:38 UTC (rev 25741)
@@ -536,6 +536,7 @@
{
RegionView3D *rv3d= ar->regiondata;
float vec[4];
+ int a;
if(rv3d->persp != RV3D_ORTHO){
vec[0]= 2.0f * mval[0] / ar->winx - 1;
@@ -564,6 +565,11 @@
VECADDFAC(ray_start, vec, rv3d->viewinv[2], 1000.0f);
VECADDFAC(ray_end, vec, rv3d->viewinv[2], -1000.0f);
}
+
+ /* clipping */
+ if(rv3d->rflag & RV3D_CLIPPING)
+ for(a=0; a<4; a++)
+ clip_line_plane(ray_start, ray_end, rv3d->clip[a]);
}
/* create intersection ray in view Z direction at mouse coordinates */
More information about the Bf-blender-cvs
mailing list