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:
authorJason Wilkins <Jason.A.Wilkins@gmail.com>2012-11-12 16:30:02 +0400
committerJason Wilkins <Jason.A.Wilkins@gmail.com>2012-11-12 16:30:02 +0400
commit6b65102c20e9bdafd90f55f60c2a2084d873e809 (patch)
treea0f5554702501d2da1073b22ff55f740aff135f9 /source/blender/editors/transform/transform_conversions.c
parent053710fcbc78ff83b9617be87558876e381f85a6 (diff)
parent83de5cb30831328548502126dff84ffdb72544f2 (diff)
Merge w/ trunk: r51141-52085 (Important Note: gameengine and blenderplayer were not merged due to complex differences)
Diffstat (limited to 'source/blender/editors/transform/transform_conversions.c')
-rw-r--r--source/blender/editors/transform/transform_conversions.c194
1 files changed, 110 insertions, 84 deletions
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 39a5da94798..9bbd3f59cbf 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -76,6 +76,7 @@
#include "BKE_gpencil.h"
#include "BKE_key.h"
#include "BKE_main.h"
+#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_movieclip.h"
#include "BKE_nla.h"
@@ -124,62 +125,46 @@ static short constraints_list_needinv(TransInfo *t, ListBase *list);
/* ************************** Functions *************************** */
-static void qsort_trans_data(TransInfo *t, TransData *head, TransData *tail, TransData *temp)
+static int trans_data_compare_dist(const void *A, const void *B)
{
- TransData *ihead = head;
- TransData *itail = tail;
- *temp = *head;
+ const TransData *td_A = (const TransData*)A;
+ const TransData *td_B = (const TransData*)B;
- while (head < tail) {
- if (t->flag & T_PROP_CONNECTED) {
- while ((tail->dist >= temp->dist) && (head < tail))
- tail--;
- }
- else {
- while ((tail->rdist >= temp->rdist) && (head < tail))
- tail--;
- }
-
- if (head != tail) {
- *head = *tail;
- head++;
- }
-
- if (t->flag & T_PROP_CONNECTED) {
- while ((head->dist <= temp->dist) && (head < tail))
- head++;
- }
- else {
- while ((head->rdist <= temp->rdist) && (head < tail))
- head++;
- }
+ if (td_A->dist < td_B->dist)
+ return -1;
+ else if (td_A->dist > td_B->dist)
+ return 1;
+
+ return 0;
+}
- if (head != tail) {
- *tail = *head;
- tail--;
- }
- }
+static int trans_data_compare_rdist(const void *A, const void *B)
+{
+ const TransData *td_A = (const TransData*)A;
+ const TransData *td_B = (const TransData*)B;
- *head = *temp;
- if (ihead < head) {
- qsort_trans_data(t, ihead, head - 1, temp);
- }
- if (itail > head) {
- qsort_trans_data(t, head + 1, itail, temp);
- }
+ if (td_A->rdist < td_B->rdist)
+ return -1;
+ else if (td_A->rdist > td_B->rdist)
+ return 1;
+
+ return 0;
}
void sort_trans_data_dist(TransInfo *t)
{
- TransData temp;
TransData *start = t->data;
- int i = 1;
+ int i;
- while (i < t->total && start->flag & TD_SELECTED) {
+ for (i = 0; i < t->total && start->flag & TD_SELECTED; i++)
start++;
- i++;
+
+ if (i < t->total) {
+ if (t->flag & T_PROP_CONNECTED)
+ qsort(start, t->total - i, sizeof(TransData), trans_data_compare_dist);
+ else
+ qsort(start, t->total - i, sizeof(TransData), trans_data_compare_rdist);
}
- qsort_trans_data(t, start, t->data + t->total - 1, &temp);
}
static void sort_trans_data(TransInfo *t)
@@ -332,13 +317,9 @@ static void createTransEdge(TransInfo *t)
invert_m3_m3(smtx, mtx);
BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
- if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN) && (BM_elem_flag_test(eed, BM_ELEM_SELECT) || propmode)) {
- float *bweight = CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_BWEIGHT);
- float *crease = CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_CREASE);
-
+ if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN) && (BM_elem_flag_test(eed, BM_ELEM_SELECT) || propmode)) {
/* need to set center for center calculations */
- add_v3_v3v3(td->center, eed->v1->co, eed->v2->co);
- mul_v3_fl(td->center, 0.5f);
+ mid_v3_v3v3(td->center, eed->v1->co, eed->v2->co);
td->loc = NULL;
if (BM_elem_flag_test(eed, BM_ELEM_SELECT))
@@ -346,16 +327,18 @@ static void createTransEdge(TransInfo *t)
else
td->flag = 0;
-
copy_m3_m3(td->smtx, smtx);
copy_m3_m3(td->mtx, mtx);
td->ext = NULL;
if (t->mode == TFM_BWEIGHT) {
+ float *bweight = CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_BWEIGHT);
td->val = bweight;
td->ival = bweight ? *bweight : 1.0f;
}
else {
+ float *crease = CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_CREASE);
+ BLI_assert(t->mode == TFM_CREASE);
td->val = crease;
td->ival = crease ? *crease : 0.0f;
}
@@ -419,7 +402,7 @@ static short apply_targetless_ik(Object *ob)
float rmat[4][4] /*, tmat[4][4], imat[4][4]*/;
/* pose_mat(b) = pose_mat(b-1) * offs_bone * channel * constraint * IK */
- /* we put in channel the entire result of rmat= (channel * constraint * IK) */
+ /* we put in channel the entire result of rmat = (channel * constraint * IK) */
/* pose_mat(b) = pose_mat(b-1) * offs_bone * rmat */
/* rmat = pose_mat(b) * inv(pose_mat(b-1) * offs_bone ) */
@@ -850,7 +833,7 @@ static short pose_grab_with_ik_add(bPoseChannel *pchan)
con = add_pose_constraint(NULL, pchan, "TempConstraint", CONSTRAINT_TYPE_KINEMATIC);
pchan->constflag |= (PCHAN_HAS_IK | PCHAN_HAS_TARGET); /* for draw, but also for detecting while pose solving */
data = con->data;
- if (targetless) {
+ if (targetless) {
/* if exists, use values from last targetless (but disabled) IK-constraint as base */
*data = *targetless;
}
@@ -973,7 +956,7 @@ static void createTransPose(TransInfo *t, Object *ob)
if (arm->flag & ARM_RESTPOS) {
if (ELEM(t->mode, TFM_DUMMY, TFM_BONESIZE) == 0) {
// XXX use transform operator reports
- // BKE_report(op->reports, RPT_ERROR, "Can't select linked when sync selection is enabled");
+ // BKE_report(op->reports, RPT_ERROR, "Cannot select linked when sync selection is enabled");
return;
}
}
@@ -1830,7 +1813,7 @@ static void editmesh_set_connectivity_distance(BMEditMesh *em, float mtx[][3], f
d2 = d + len_v3(vec);
if (dists[BM_elem_index_get(v3)] != FLT_MAX)
- dists[BM_elem_index_get(v3)] = minf(d2, dists[BM_elem_index_get(v3)]);
+ dists[BM_elem_index_get(v3)] = min_ff(d2, dists[BM_elem_index_get(v3)]);
else
dists[BM_elem_index_get(v3)] = d2;
@@ -1934,6 +1917,10 @@ static void VertsToTransData(TransInfo *t, TransData *td, TransDataExtension *tx
tx->size = vs->radius;
td->val = vs->radius;
}
+ else if (t->mode == TFM_SHRINKFATTEN) {
+ td->ext = tx;
+ tx->isize[0] = BM_vert_calc_shell_factor(eve);
+ }
}
static void createTransEditVerts(TransInfo *t)
@@ -2046,7 +2033,11 @@ static void createTransEditVerts(TransInfo *t)
else t->total = countsel;
tob = t->data = MEM_callocN(t->total * sizeof(TransData), "TransObData(Mesh EditMode)");
- if (t->mode == TFM_SKIN_RESIZE) {
+ if (ELEM(t->mode, TFM_SKIN_RESIZE, TFM_SHRINKFATTEN)) {
+ /* warning, this is overkill, we only need 2 extra floats,
+ * but this stores loads of extra stuff, for TFM_SHRINKFATTEN its even more overkill
+ * since we may not use the 'alt' transform mode to maintain shell thickness,
+ * but with generic transform code its hard to lazy init vars */
tx = t->ext = MEM_callocN(t->total * sizeof(TransDataExtension),
"TransObData ext");
}
@@ -2359,6 +2350,7 @@ static void createTransUVs(bContext *C, TransInfo *t)
SpaceImage *sima = CTX_wm_space_image(C);
Image *ima = CTX_data_edit_image(C);
Scene *scene = t->scene;
+ ToolSettings *ts = CTX_data_tool_settings(C);
TransData *td = NULL;
TransData2D *td2d = NULL;
MTexPoly *tf;
@@ -2367,12 +2359,26 @@ static void createTransUVs(bContext *C, TransInfo *t)
BMFace *efa;
BMLoop *l;
BMIter iter, liter;
- int count = 0, countsel = 0;
+ UvElementMap *elementmap;
+ char *island_enabled;
+ int count = 0, countsel = 0, count_rejected = 0;
int propmode = t->flag & T_PROP_EDIT;
+ int propconnected = t->flag & T_PROP_CONNECTED;
if (!ED_space_image_show_uvedit(sima, t->obedit)) return;
/* count */
+ if (propconnected) {
+ /* create element map with island information */
+ if (ts->uv_flag & UV_SYNC_SELECTION) {
+ elementmap = EDBM_uv_element_map_create (em, FALSE, TRUE);
+ }
+ else {
+ elementmap = EDBM_uv_element_map_create (em, TRUE, TRUE);
+ }
+ island_enabled = MEM_callocN(sizeof(*island_enabled) * elementmap->totalIslands, "TransIslandData(UV Editing)");
+ }
+
BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
@@ -2380,14 +2386,22 @@ static void createTransUVs(bContext *C, TransInfo *t)
BM_elem_flag_disable(efa, BM_ELEM_TAG);
continue;
}
-
+
BM_elem_flag_enable(efa, BM_ELEM_TAG);
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- if (uvedit_uv_select_test(em, scene, l))
+ if (uvedit_uv_select_test(em, scene, l)) {
countsel++;
- if (propmode)
+ if (propconnected) {
+ UvElement *element = ED_uv_element_get(elementmap, efa, l);
+ island_enabled[element->island] = TRUE;
+ }
+
+ }
+
+ if (propmode) {
count++;
+ }
}
}
@@ -2413,12 +2427,26 @@ static void createTransUVs(bContext *C, TransInfo *t)
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if (!propmode && !uvedit_uv_select_test(em, scene, l))
continue;
+
+ if (propconnected) {
+ UvElement *element = ED_uv_element_get(elementmap, efa, l);
+ if (!island_enabled[element->island]) {
+ count_rejected++;
+ continue;
+ }
+ }
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
UVsToTransData(sima, td++, td2d++, luv->uv, uvedit_uv_select_test(em, scene, l));
}
}
+ if (propconnected) {
+ t->total -= count_rejected;
+ EDBM_uv_element_map_free(elementmap);
+ MEM_freeN(island_enabled);
+ }
+
if (sima->flag & SI_LIVE_UNWRAP)
ED_uvedit_live_unwrap_begin(t->scene, t->obedit);
}
@@ -2510,8 +2538,8 @@ void clipUVData(TransInfo *t)
if ((td->flag & TD_SKIP) || (!td->loc))
continue;
- td->loc[0] = minf(maxf(0.0f, td->loc[0]), aspx);
- td->loc[1] = minf(maxf(0.0f, td->loc[1]), aspy);
+ td->loc[0] = min_ff(max_ff(0.0f, td->loc[0]), aspx);
+ td->loc[1] = min_ff(max_ff(0.0f, td->loc[1]), aspy);
}
}
@@ -3416,14 +3444,14 @@ static void bezt_to_transdata(TransData *td, TransData2D *td2d, AnimData *adt, B
if (td->flag & TD_MOVEHANDLE1) {
td2d->h1 = bezt->vec[0];
copy_v2_v2(td2d->ih1, td2d->h1);
- }
- else
+ }
+ else
td2d->h1 = NULL;
if (td->flag & TD_MOVEHANDLE2) {
td2d->h2 = bezt->vec[2];
copy_v2_v2(td2d->ih2, td2d->h2);
- }
+ }
else
td2d->h2 = NULL;
@@ -3527,7 +3555,7 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
if (sel1) count++;
if (sel3) count++;
}
- }
+ }
else if (sipo->around == V3D_LOCAL) {
/* for local-pivot we only need to count the number of selected handles only, so that centerpoints don't
* don't get moved wrong
@@ -3622,18 +3650,18 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
if (sel1) {
hdata = initTransDataCurveHandles(td, bezt);
bezt_to_transdata(td++, td2d++, adt, bezt, 0, 1, 1, intvals, mtx, smtx);
- }
+ }
else {
- /* h1= 0; */ /* UNUSED */
+ /* h1 = 0; */ /* UNUSED */
}
if (sel3) {
if (hdata == NULL)
hdata = initTransDataCurveHandles(td, bezt);
bezt_to_transdata(td++, td2d++, adt, bezt, 2, 1, 1, intvals, mtx, smtx);
- }
+ }
else {
- /* h2= 0; */ /* UNUSED */
+ /* h2 = 0; */ /* UNUSED */
}
}
@@ -3986,13 +4014,13 @@ static void SeqTransInfo(TransInfo *t, Sequence *seq, int *recursive, int *count
*flag = (seq->flag | SELECT) & ~(SEQ_LEFTSEL | SEQ_RIGHTSEL);
if (t->frame_side == 'R') {
- if (right <= cfra) *count = *flag = 0; /* ignore */
- else if (left > cfra) ; /* keep the selection */
+ if (right <= cfra) { *count = *flag = 0; } /* ignore */
+ else if (left > cfra) { } /* keep the selection */
else *flag |= SEQ_RIGHTSEL;
}
else {
- if (left >= cfra) *count = *flag = 0; /* ignore */
- else if (right < cfra) ; /* keep the selection */
+ if (left >= cfra) { *count = *flag = 0; } /* ignore */
+ else if (right < cfra) { } /* keep the selection */
else *flag |= SEQ_LEFTSEL;
}
}
@@ -4255,15 +4283,14 @@ static void freeSeqData(TransInfo *t)
}
}
-#if 1 /* (mango hack! - for Ian) this is truely bad - should _never_ be in a release :| */
- if (CTX_wm_window(t->context)->eventstate->alt) {
+ if (t->flag & T_ALT_TRANSFORM) {
int minframe = MAXFRAME;
td = t->data;
seq_prev = NULL;
for (a = 0; a < t->total; a++, td++) {
seq = ((TransDataSeq *)td->extra)->seq;
if ((seq != seq_prev)) {
- minframe = mini(minframe, seq->startdisp);
+ minframe = min_ii(minframe, seq->startdisp);
}
}
@@ -4293,9 +4320,6 @@ static void freeSeqData(TransInfo *t)
else {
BKE_sequence_base_shuffle_time(seqbasep, t->scene);
}
-#else
- BKE_sequence_base_shuffle_time(seqbasep, t->scene);
-#endif
if (has_effect) {
/* update effects strips based on strips just moved in time */
@@ -4469,6 +4493,7 @@ static short constraints_list_needinv(TransInfo *t, ListBase *list)
if (con->type == CONSTRAINT_TYPE_FOLLOWPATH) return 1;
if (con->type == CONSTRAINT_TYPE_CLAMPTO) return 1;
if (con->type == CONSTRAINT_TYPE_OBJECTSOLVER) return 1;
+ if (con->type == CONSTRAINT_TYPE_FOLLOWTRACK) return 1;
/* constraints that require this only under special conditions */
if (con->type == CONSTRAINT_TYPE_ROTLIKE) {
@@ -4545,7 +4570,7 @@ static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
td->ext->irotAngle = ob->rotAngle;
copy_v3_v3(td->ext->irotAxis, ob->rotAxis);
- // td->ext->drotAngle= ob->drotAngle; // XXX, not implemented
+ // td->ext->drotAngle = ob->drotAngle; // XXX, not implemented
// copy_v3_v3(td->ext->drotAxis, ob->drotAxis); // XXX, not implemented
}
else {
@@ -4603,7 +4628,7 @@ static void set_trans_object_base_flags(TransInfo *t)
/*
* if Base selected and has parent selected:
- * base->flag= BA_WAS_SEL
+ * base->flag = BA_WAS_SEL
*/
Base *base;
@@ -5012,9 +5037,10 @@ static void special_aftertrans_update__mask(bContext *C, TransInfo *t)
if (t->scene->nodetree) {
/* tracks can be used for stabilization nodes,
* flush update for such nodes */
- //if (nodeUpdateID(t->scene->nodetree, &mask->id)) {
+ //if (nodeUpdateID(t->scene->nodetree, &mask->id))
+ {
WM_event_add_notifier(C, NC_MASK | ND_DATA, &mask->id);
- //}
+ }
}
/* TODO - dont key all masks... */