[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41853] trunk/blender/source/blender/ editors: Fix #29253: 3D Manipulator: "Active Element" not supported for curves
Sergey Sharybin
sergey.vfx at gmail.com
Tue Nov 15 07:37:47 CET 2011
Revision: 41853
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41853
Author: nazgul
Date: 2011-11-15 06:37:47 +0000 (Tue, 15 Nov 2011)
Log Message:
-----------
Fix #29253: 3D Manipulator: "Active Element" not supported for curves
This funcitonality simply wasn't implemented for curves yet, implemented it now.
Modified Paths:
--------------
trunk/blender/source/blender/editors/curve/editcurve.c
trunk/blender/source/blender/editors/include/ED_curve.h
trunk/blender/source/blender/editors/transform/transform_generics.c
trunk/blender/source/blender/editors/transform/transform_manipulator.c
Modified: trunk/blender/source/blender/editors/curve/editcurve.c
===================================================================
--- trunk/blender/source/blender/editors/curve/editcurve.c 2011-11-15 06:33:33 UTC (rev 41852)
+++ trunk/blender/source/blender/editors/curve/editcurve.c 2011-11-15 06:37:47 UTC (rev 41853)
@@ -5468,6 +5468,24 @@
}
}
+static Nurb *get_lastsel_nurb(Curve *cu)
+{
+ ListBase *nubase= curve_editnurbs(cu);
+ Nurb *nu= nubase->first;
+
+ if(!cu->lastsel)
+ return NULL;
+
+ while (nu) {
+ if (point_on_nurb(nu, cu->lastsel))
+ return nu;
+
+ nu= nu->next;
+ }
+
+ return NULL;
+}
+
static void select_nth_bezt(Nurb *nu, BezTriple *bezt, int nth)
{
int a, start;
@@ -5517,22 +5535,12 @@
int CU_select_nth(Object *obedit, int nth)
{
Curve *cu= (Curve*)obedit->data;
- ListBase *nubase= curve_editnurbs(cu);
Nurb *nu;
- int ok=0;
- /* Search nurb to which selected point belongs to */
- nu= nubase->first;
- while (nu) {
- if (point_on_nurb(nu, cu->lastsel)) {
- ok= 1;
- break;
- }
- nu= nu->next;
- }
+ nu= get_lastsel_nurb(cu);
+ if (!nu)
+ return 0;
- if (!ok) return 0;
-
if (nu->bezt) {
select_nth_bezt(nu, cu->lastsel, nth);
} else {
@@ -7070,3 +7078,24 @@
memcpy(dst, src, count*sizeof(BPoint));
keyIndex_updateBP(editnurb, src, dst, count);
}
+
+int ED_curve_actSelection(Curve *cu, float center[3])
+{
+ Nurb *nu= get_lastsel_nurb(cu);
+
+ if(!nu)
+ return 0;
+
+ if(nu->bezt) {
+ BezTriple *bezt= cu->lastsel;
+
+ copy_v3_v3(center, bezt->vec[1]);
+ }
+ else {
+ BPoint *bp= cu->lastsel;
+
+ copy_v3_v3(center, bp->vec);
+ }
+
+ return 1;
+}
Modified: trunk/blender/source/blender/editors/include/ED_curve.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_curve.h 2011-11-15 06:33:33 UTC (rev 41852)
+++ trunk/blender/source/blender/editors/include/ED_curve.h 2011-11-15 06:37:47 UTC (rev 41853)
@@ -89,6 +89,8 @@
int ED_curve_updateAnimPaths(struct Object *obedit);
+int ED_curve_actSelection(struct Curve *cu, float center[3]);
+
/* debug only */
void printknots(struct Object *obedit);
Modified: trunk/blender/source/blender/editors/transform/transform_generics.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_generics.c 2011-11-15 06:33:33 UTC (rev 41852)
+++ trunk/blender/source/blender/editors/transform/transform_generics.c 2011-11-15 06:37:47 UTC (rev 41853)
@@ -1548,15 +1548,27 @@
/* EDIT MODE ACTIVE EDITMODE ELEMENT */
- if (t->obedit && t->obedit->type == OB_MESH) {
- EditSelection ese;
- EditMesh *em = BKE_mesh_get_editmesh(t->obedit->data);
+ if (t->obedit) {
+ if(t->obedit->type == OB_MESH) {
+ EditSelection ese;
+ EditMesh *em = BKE_mesh_get_editmesh(t->obedit->data);
- if (EM_get_actSelection(em, &ese)) {
- EM_editselection_center(t->center, &ese);
- calculateCenter2D(t);
- break;
+ if (EM_get_actSelection(em, &ese)) {
+ EM_editselection_center(t->center, &ese);
+ calculateCenter2D(t);
+ break;
+ }
}
+ else if (ELEM(t->obedit->type, OB_CURVE, OB_SURF)) {
+ float center[3];
+ Curve *cu= (Curve *)t->obedit->data;
+
+ if (ED_curve_actSelection(cu, center)) {
+ copy_v3_v3(t->center, center);
+ calculateCenter2D(t);
+ break;
+ }
+ }
} /* END EDIT MODE ACTIVE ELEMENT */
calculateCenterMedian(t);
Modified: trunk/blender/source/blender/editors/transform/transform_manipulator.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_manipulator.c 2011-11-15 06:33:33 UTC (rev 41852)
+++ trunk/blender/source/blender/editors/transform/transform_manipulator.c 2011-11-15 06:37:47 UTC (rev 41853)
@@ -71,6 +71,7 @@
#include "WM_types.h"
#include "ED_armature.h"
+#include "ED_curve.h"
#include "ED_mesh.h"
#include "ED_particle.h"
#include "ED_view3d.h"
@@ -390,56 +391,64 @@
}
else if ELEM(obedit->type, OB_CURVE, OB_SURF) {
Curve *cu= obedit->data;
- Nurb *nu;
- BezTriple *bezt;
- BPoint *bp;
- ListBase *nurbs= curve_editnurbs(cu);
+ float center[3];
- nu= nurbs->first;
- while(nu) {
- if(nu->type == CU_BEZIER) {
- bezt= nu->bezt;
- a= nu->pntsu;
- while(a--) {
- /* exceptions
- * if handles are hidden then only check the center points.
- * If the center knot is selected then only use this as the center point.
- */
- if (cu->drawflag & CU_HIDE_HANDLES) {
- if (bezt->f2 & SELECT) {
+ if (v3d->around==V3D_ACTIVE && ED_curve_actSelection(cu, center)) {
+ calc_tw_center(scene, center);
+ totsel++;
+ }
+ else {
+ Nurb *nu;
+ BezTriple *bezt;
+ BPoint *bp;
+ ListBase *nurbs= curve_editnurbs(cu);
+
+ nu= nurbs->first;
+ while(nu) {
+ if(nu->type == CU_BEZIER) {
+ bezt= nu->bezt;
+ a= nu->pntsu;
+ while(a--) {
+ /* exceptions
+ * if handles are hidden then only check the center points.
+ * If the center knot is selected then only use this as the center point.
+ */
+ if (cu->drawflag & CU_HIDE_HANDLES) {
+ if (bezt->f2 & SELECT) {
+ calc_tw_center(scene, bezt->vec[1]);
+ totsel++;
+ }
+ }
+ else if (bezt->f2 & SELECT) {
calc_tw_center(scene, bezt->vec[1]);
totsel++;
}
+ else {
+ if(bezt->f1) {
+ calc_tw_center(scene, bezt->vec[0]);
+ totsel++;
+ }
+ if(bezt->f3) {
+ calc_tw_center(scene, bezt->vec[2]);
+ totsel++;
+ }
+ }
+ bezt++;
}
- else if (bezt->f2 & SELECT) {
- calc_tw_center(scene, bezt->vec[1]);
- totsel++;
- }
- else {
- if(bezt->f1) {
- calc_tw_center(scene, bezt->vec[0]);
+ }
+ else {
+ bp= nu->bp;
+ a= nu->pntsu*nu->pntsv;
+ while(a--) {
+ if(bp->f1 & SELECT) {
+ calc_tw_center(scene, bp->vec);
totsel++;
}
- if(bezt->f3) {
- calc_tw_center(scene, bezt->vec[2]);
- totsel++;
- }
+ bp++;
}
- bezt++;
}
+ nu= nu->next;
}
- else {
- bp= nu->bp;
- a= nu->pntsu*nu->pntsv;
- while(a--) {
- if(bp->f1 & SELECT) {
- calc_tw_center(scene, bp->vec);
- totsel++;
- }
- bp++;
- }
- }
- nu= nu->next;
}
}
else if(obedit->type==OB_MBALL) {
More information about the Bf-blender-cvs
mailing list