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:
authorJoshua Leung <aligorith@gmail.com>2014-10-11 08:43:21 +0400
committerJoshua Leung <aligorith@gmail.com>2014-10-11 08:43:21 +0400
commite2b872ccc8acfd1e6f7667d6da63fba36410a783 (patch)
treeb9309fee190c16526b0c13274e0032a8966ef577 /source/blender
parentab62df4837b3a70ac9affbc6c86d65e0bd9557d3 (diff)
Proportional editing now works for Grease Pencil stroke transforms too
There's also support for "connected" propedit mode, but without access to that in the Object Mode (or in other contexts), it may not be available for use. (Hence, that support is currently still untested)
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/editors/transform/transform_conversions.c100
1 files changed, 85 insertions, 15 deletions
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 1bbe5321674..be9876c046f 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -7209,6 +7209,10 @@ static void createTransGPencil(bContext *C, TransInfo *t)
TransData *td = NULL;
float mtx[3][3], smtx[3][3];
+ const int propedit = (t->flag & T_PROP_EDIT);
+ const int propedit_connected = (t->flag & T_PROP_CONNECTED);
+
+
/* == Grease Pencil Strokes to Transform Data ==
* Grease Pencil stroke points can be a mixture of 2D (screen-space),
* or 3D coordinates. However, they're always saved as 3D points.
@@ -7231,18 +7235,32 @@ static void createTransGPencil(bContext *C, TransInfo *t)
bGPDframe *gpf = gpl->actframe;
bGPDstroke *gps;
- /* only selected stroke points are considered */
for (gps = gpf->strokes.first; gps; gps = gps->next) {
- if (gps->flag & GP_STROKE_SELECT) {
- bGPDspoint *pt;
- int i;
-
- // TODO: 2D vs 3D?
- for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
- if (pt->flag & GP_SPOINT_SELECT)
- t->total++;
+ if (propedit) {
+ /* Proportional Editing... */
+ if (propedit_connected) {
+ /* connected only - so only if selected */
+ if (gps->flag & GP_STROKE_SELECT)
+ t->total += gps->totpoints;
+ }
+ else {
+ /* everything goes - connection status doesn't matter */
+ t->total += gps->totpoints;
}
}
+ else {
+ /* only selected stroke points are considered */
+ if (gps->flag & GP_STROKE_SELECT) {
+ bGPDspoint *pt;
+ int i;
+
+ // TODO: 2D vs 3D?
+ for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
+ if (pt->flag & GP_SPOINT_SELECT)
+ t->total++;
+ }
+ }
+ }
}
}
}
@@ -7268,12 +7286,33 @@ static void createTransGPencil(bContext *C, TransInfo *t)
bGPDframe *gpf = gpl->actframe;
bGPDstroke *gps;
- /* only selected strokes are considered */
for (gps = gpf->strokes.first; gps; gps = gps->next) {
- if ((gps->flag & GP_STROKE_SELECT) && (gps->totpoints)) {
+ TransData *head = td;
+ TransData *tail = td;
+ bool stroke_ok;
+
+ /* What we need to include depends on proportional editing settings... */
+ if (propedit) {
+ if (propedit_connected) {
+ /* A) "Connected" - Only those in selected strokes */
+ stroke_ok = (gps->flag & GP_STROKE_SELECT) != 0;
+ }
+ else {
+ /* B) All points, always */
+ stroke_ok = true;
+ }
+ }
+ else {
+ /* C) Only selected points in selected strokes */
+ stroke_ok = (gps->flag & GP_STROKE_SELECT) != 0;
+ }
+
+ /* Do stroke... */
+ if (stroke_ok && gps->totpoints) {
bGPDspoint *pt;
int i;
+#if 0 /* XXX: this isn't needed anymore; cannot calculate center this way or propedit breaks */
const float ninv = 1.0f / gps->totpoints;
float center[3] = {0.0f};
@@ -7281,15 +7320,33 @@ static void createTransGPencil(bContext *C, TransInfo *t)
for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
madd_v3_v3v3fl(center, center, &pt->x, ninv);
}
+#endif
- /* add all selected points... */
+ /* add all necessary points... */
for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
- if (pt->flag & GP_SPOINT_SELECT) {
+ bool point_ok;
+
+ /* include point? */
+ if (propedit) {
+ /* Always all points in strokes that get included */
+ point_ok = true;
+ }
+ else {
+ /* Only selected points in selected strokes */
+ point_ok = (pt->flag & GP_SPOINT_SELECT) != 0;
+ }
+
+ /* do point... */
+ if (point_ok) {
copy_v3_v3(td->iloc, &pt->x);
- copy_v3_v3(td->center, center); // XXX: what about t->around == local?
+ copy_v3_v3(td->center, &pt->x); // XXX: what about t->around == local?
td->loc = &pt->x;
- td->flag = TD_SELECTED;
+
+ td->flag = 0;
+
+ if (pt->flag & GP_SPOINT_SELECT)
+ td->flag |= TD_SELECTED;
/* configure 2D points so that they don't play up... */
if (gps->flag & (GP_STROKE_2DSPACE | GP_STROKE_2DIMAGE)) {
@@ -7302,8 +7359,15 @@ static void createTransGPencil(bContext *C, TransInfo *t)
unit_m3(td->axismtx); // XXX?
td++;
+ tail++;
}
}
+
+ /* March over these points, and calculate the proportional editing distances */
+ if (propedit && (head != tail)) {
+ /* XXX: for now, we are similar enough that this works... */
+ calc_distanceCurveVerts(head, tail - 1);
+ }
}
}
}
@@ -7334,6 +7398,12 @@ void createTransData(bContext *C, TransInfo *t)
else if (t->options & CTX_GPENCIL_STROKES) {
t->flag |= T_POINTS; // XXX...
createTransGPencil(C, t);
+
+ if (t->data && (t->flag & T_PROP_EDIT)) {
+ sort_trans_data(t); // makes selected become first in array
+ set_prop_dist(t, 1);
+ sort_trans_data_dist(t);
+ }
}
else if (t->spacetype == SPACE_IMAGE) {
t->flag |= T_POINTS | T_2D_EDIT;