[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44689] trunk/blender/source/blender/ editors: fix for bug in ED_view3d_project_float that only effected the 'Rip ' tool.
Campbell Barton
ideasman42 at gmail.com
Wed Mar 7 02:06:27 CET 2012
Revision: 44689
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44689
Author: campbellbarton
Date: 2012-03-07 01:06:18 +0000 (Wed, 07 Mar 2012)
Log Message:
-----------
fix for bug in ED_view3d_project_float that only effected the 'Rip' tool.
when the source and destination vectors were the same pointer, the X value would get overwritten.
now the rip tool uses the best side to grab as in trunk.
Modified Paths:
--------------
trunk/blender/source/blender/editors/include/ED_view3d.h
trunk/blender/source/blender/editors/mesh/bmesh_tools.c
trunk/blender/source/blender/editors/mesh/knifetool.c
trunk/blender/source/blender/editors/sculpt_paint/paint_utils.c
trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
trunk/blender/source/blender/editors/space_view3d/view3d_view.c
Modified: trunk/blender/source/blender/editors/include/ED_view3d.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_view3d.h 2012-03-07 00:08:00 UTC (rev 44688)
+++ trunk/blender/source/blender/editors/include/ED_view3d.h 2012-03-07 01:06:18 UTC (rev 44689)
@@ -219,9 +219,9 @@
int ED_view3d_clip_range_get(struct View3D *v3d, struct RegionView3D *rv3d, float *clipsta, float *clipend);
int ED_view3d_viewplane_get(struct View3D *v3d, struct RegionView3D *rv3d, int winxi, int winyi, struct rctf *viewplane, float *clipsta, float *clipend);
void ED_view3d_ob_project_mat_get(struct RegionView3D *v3d, struct Object *ob, float pmat[4][4]);
-void ED_view3d_project_float(const struct ARegion *a, const float vec[3], float adr[2], float mat[4][4]);
void ED_view3d_calc_camera_border(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, struct RegionView3D *rv3d, struct rctf *viewborder_r, short no_shift);
-void ED_view3d_project_float_v3(struct ARegion *a, const float vec[3], float *adr, float mat[4][4]);
+void ED_view3d_project_float_v2(const struct ARegion *a, const float vec[3], float adr[2], float mat[4][4]);
+void ED_view3d_project_float_v3(struct ARegion *a, const float vec[3], float adr[3], float mat[4][4]);
void ED_view3d_calc_camera_border_size(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, struct RegionView3D *rv3d, float size_r[2]);
/* drawobject.c iterators */
Modified: trunk/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/bmesh_tools.c 2012-03-07 00:08:00 UTC (rev 44688)
+++ trunk/blender/source/blender/editors/mesh/bmesh_tools.c 2012-03-07 01:06:18 UTC (rev 44689)
@@ -2319,8 +2319,8 @@
{
float vec1[3], vec2[3], mvalf[2];
- ED_view3d_project_float(ar, co1, vec1, mat);
- ED_view3d_project_float(ar, co2, vec2, mat);
+ ED_view3d_project_float_v2(ar, co1, vec1, mat);
+ ED_view3d_project_float_v2(ar, co2, vec2, mat);
mvalf[0] = (float)mval[0];
mvalf[1] = (float)mval[1];
@@ -2345,7 +2345,7 @@
BMOIter siter;
BMIter iter, eiter;
BMLoop *l;
- BMEdge *e, *e2, *closest = NULL;
+ BMEdge *e, *e2;
BMVert *v, *ripvert = NULL;
int side = 0, i, singlesel = FALSE;
float projectMat[4][4], fmval[3] = {event->mval[0], event->mval[1]};
@@ -2469,7 +2469,10 @@
for (i = 0; i < 2; i++) {
BMO_ITER(e, &siter, bm, &bmop, i ? "edgeout2":"edgeout1", BM_EDGE) {
- float cent[3] = {0, 0, 0}, mid[3], vec[3];
+ float cent[3] = {0, 0, 0}, mid[3];
+ float vec[3];
+ BMVert *v1_other;
+ BMVert *v2_other;
#ifdef USE_BVH_VISIBILITY
if (!BMBVH_EdgeVisible(bvhtree, e, ar, v3d, obedit) || !e->l)
@@ -2481,8 +2484,13 @@
* for each edge: calculate face center, then made a vector
* from edge midpoint to face center. offset edge midpoint
* by a small amount along this vector. */
- BM_face_center_mean_calc(bm, e->l->f, cent);
+ /* rather then the face center, get the middle of
+ * both edge verts connected to this one */
+ v1_other = BM_face_other_vert_loop(e->l->f, e->v2, e->v1)->v;
+ v2_other = BM_face_other_vert_loop(e->l->f, e->v1, e->v2)->v;
+ mid_v3_v3v3(cent, v1_other->co, v2_other->co);
+
mid_v3_v3v3(mid, e->v1->co, e->v2->co);
sub_v3_v3v3(vec, cent, mid);
normalize_v3(vec);
@@ -2490,13 +2498,12 @@
add_v3_v3v3(mid, mid, vec);
/* We have our comparison point, now project it */
- ED_view3d_project_float(ar, mid, mid, projectMat);
+ ED_view3d_project_float_v2(ar, mid, mid, projectMat);
d = len_squared_v2v2(fmval, mid);
if (d < dist) {
side = i;
- closest = e;
dist = d;
}
}
Modified: trunk/blender/source/blender/editors/mesh/knifetool.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/knifetool.c 2012-03-07 00:08:00 UTC (rev 44688)
+++ trunk/blender/source/blender/editors/mesh/knifetool.c 2012-03-07 01:06:18 UTC (rev 44689)
@@ -177,7 +177,7 @@
static void knife_project_v3(knifetool_opdata *kcd, const float co[3], float sco[3])
{
- ED_view3d_project_float(kcd->ar, co, sco, kcd->projmat);
+ ED_view3d_project_float_v3(kcd->ar, co, sco, kcd->projmat);
}
static ListBase *knife_empty_list(knifetool_opdata *kcd)
Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_utils.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_utils.c 2012-03-07 00:08:00 UTC (rev 44688)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_utils.c 2012-03-07 01:06:18 UTC (rev 44689)
@@ -97,8 +97,7 @@
vec[1] = j ? bb_min[1] : bb_max[1];
vec[2] = k ? bb_min[2] : bb_max[2];
/* convert corner to screen space */
- ED_view3d_project_float(ar, vec, proj,
- projection_mat);
+ ED_view3d_project_float_v2(ar, vec, proj, projection_mat);
/* expand 2D rectangle */
rect->xmin = MIN2(rect->xmin, proj[0]);
rect->xmax = MAX2(rect->xmax, proj[0]);
Modified: trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/sculpt.c 2012-03-07 00:08:00 UTC (rev 44688)
+++ trunk/blender/source/blender/editors/sculpt_paint/sculpt.c 2012-03-07 01:06:18 UTC (rev 44689)
@@ -662,8 +662,7 @@
if (ss->cache->radial_symmetry_pass)
mul_m4_v3(ss->cache->symm_rot_mat_inv, symm_point);
- ED_view3d_project_float(ss->cache->vc->ar, symm_point, point_2d,
- ss->cache->projection_mat);
+ ED_view3d_project_float_v2(ss->cache->vc->ar, symm_point, point_2d, ss->cache->projection_mat);
/* if fixed mode, keep coordinates relative to mouse */
if(mtex->brush_map_mode == MTEX_MAP_MODE_FIXED) {
Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c 2012-03-07 00:08:00 UTC (rev 44688)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c 2012-03-07 01:06:18 UTC (rev 44689)
@@ -1603,7 +1603,7 @@
asp= ( (float)ibuf->y)/(float)ibuf->x;
vec[0] = vec[1] = vec[2] = 0.0;
- ED_view3d_project_float(ar, vec, sco, rv3d->persmat);
+ ED_view3d_project_float_v2(ar, vec, sco, rv3d->persmat);
cx = sco[0];
cy = sco[1];
Modified: trunk/blender/source/blender/editors/space_view3d/view3d_view.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_view.c 2012-03-07 00:08:00 UTC (rev 44688)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_view.c 2012-03-07 01:06:18 UTC (rev 44689)
@@ -770,18 +770,18 @@
}
/* use view3d_get_object_project_mat to get projecting mat */
-void ED_view3d_project_float(const ARegion *ar, const float vec[3], float adr[2], float mat[4][4])
+void ED_view3d_project_float_v2(const ARegion *ar, const float vec[3], float adr[2], float mat[4][4])
{
float vec4[4];
- adr[0]= IS_CLIPPED;
copy_v3_v3(vec4, vec);
vec4[3]= 1.0;
+ /* adr[0]= IS_CLIPPED; */ /* always overwritten */
mul_m4_v4(mat, vec4);
- if ( vec4[3]>FLT_EPSILON ) {
- adr[0] = (float)(ar->winx/2.0f)+(ar->winx/2.0f)*vec4[0]/vec4[3];
+ if (vec4[3] > FLT_EPSILON) {
+ adr[0] = (float)(ar->winx/2.0f)+(ar->winx/2.0f)*vec4[0]/vec4[3];
adr[1] = (float)(ar->winy/2.0f)+(ar->winy/2.0f)*vec4[1]/vec4[3];
}
else {
@@ -790,17 +790,17 @@
}
/* use view3d_get_object_project_mat to get projecting mat */
-void ED_view3d_project_float_v3(ARegion *ar, const float vec[3], float *adr, float mat[4][4])
+void ED_view3d_project_float_v3(ARegion *ar, const float vec[3], float adr[3], float mat[4][4])
{
float vec4[4];
copy_v3_v3(vec4, vec);
vec4[3]= 1.0;
- adr[0]= IS_CLIPPED;
+ /* adr[0]= IS_CLIPPED; */ /* always overwritten */
mul_m4_v4(mat, vec4);
- if ( vec4[3]>FLT_EPSILON ) {
+ if (vec4[3] > FLT_EPSILON) {
adr[0] = (float)(ar->winx/2.0f)+(ar->winx/2.0f)*vec4[0]/vec4[3];
adr[1] = (float)(ar->winy/2.0f)+(ar->winy/2.0f)*vec4[1]/vec4[3];
adr[2] = vec4[2]/vec4[3];
More information about the Bf-blender-cvs
mailing list