2.5 / Nodes
* add Context accessor for selected nodes * node translation uses transform code * put transform defines in an enum (mode and numinput flags)
This commit is contained in:
@@ -125,6 +125,11 @@ void CTX_data_list_add(bContextDataResult *result, void *data);
|
||||
BLI_freelistN(&ctx_data_list); \
|
||||
}
|
||||
|
||||
#define CTX_DATA_COUNT(C, member, i) \
|
||||
CTX_DATA_BEGIN(C, void*, unused, member) \
|
||||
i++; \
|
||||
CTX_DATA_END
|
||||
|
||||
/* Data Context Members */
|
||||
|
||||
struct Main *CTX_data_main(const bContext *C);
|
||||
@@ -144,6 +149,8 @@ struct Object *CTX_data_active_object(const bContext *C);
|
||||
struct Base *CTX_data_active_base(const bContext *C);
|
||||
struct Object *CTX_data_edit_object(const bContext *C);
|
||||
|
||||
int CTX_data_selected_nodes(const bContext *C, ListBase *list);
|
||||
|
||||
/* Data Evaluation Context */
|
||||
|
||||
float CTX_eval_frame(const bContext *C);
|
||||
|
||||
@@ -352,6 +352,11 @@ ToolSettings *CTX_data_tool_settings(const bContext *C)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int CTX_data_selected_nodes(const bContext *C, ListBase *list)
|
||||
{
|
||||
return ctx_data_collection_get(C, CTX_data_selected_nodes, list);
|
||||
}
|
||||
|
||||
int CTX_data_selected_objects(const bContext *C, ListBase *list)
|
||||
{
|
||||
return ctx_data_collection_get(C, CTX_data_selected_objects, list);
|
||||
@@ -387,7 +392,6 @@ struct Object *CTX_data_edit_object(const bContext *C)
|
||||
return ctx_data_pointer_get(C, CTX_data_edit_object);
|
||||
}
|
||||
|
||||
|
||||
/* data evaluation */
|
||||
|
||||
float CTX_eval_frame(const bContext *C)
|
||||
|
||||
@@ -44,33 +44,36 @@ void transform_operatortypes(void);
|
||||
/* ******************** Macros & Prototypes *********************** */
|
||||
|
||||
/* MODE AND NUMINPUT FLAGS */
|
||||
#define TFM_INIT -1
|
||||
#define TFM_DUMMY 0
|
||||
#define TFM_TRANSLATION 1
|
||||
#define TFM_ROTATION 2
|
||||
#define TFM_RESIZE 3
|
||||
#define TFM_TOSPHERE 4
|
||||
#define TFM_SHEAR 5
|
||||
#define TFM_WARP 7
|
||||
#define TFM_SHRINKFATTEN 8
|
||||
#define TFM_TILT 9
|
||||
#define TFM_LAMP_ENERGY 10
|
||||
#define TFM_TRACKBALL 11
|
||||
#define TFM_PUSHPULL 12
|
||||
#define TFM_CREASE 13
|
||||
#define TFM_MIRROR 14
|
||||
#define TFM_BONESIZE 15
|
||||
#define TFM_BONE_ENVELOPE 16
|
||||
#define TFM_CURVE_SHRINKFATTEN 17
|
||||
#define TFM_BONE_ROLL 18
|
||||
#define TFM_TIME_TRANSLATE 19
|
||||
#define TFM_TIME_SLIDE 20
|
||||
#define TFM_TIME_SCALE 21
|
||||
#define TFM_TIME_EXTEND 22
|
||||
#define TFM_BAKE_TIME 23
|
||||
#define TFM_BEVEL 24
|
||||
#define TFM_BWEIGHT 25
|
||||
#define TFM_ALIGN 26
|
||||
enum {
|
||||
TFM_INIT = -1,
|
||||
TFM_DUMMY,
|
||||
TFM_TRANSLATION,
|
||||
TFM_ROTATION,
|
||||
TFM_RESIZE,
|
||||
TFM_TOSPHERE,
|
||||
TFM_SHEAR,
|
||||
TFM_WARP,
|
||||
TFM_SHRINKFATTEN,
|
||||
TFM_TILT,
|
||||
TFM_LAMP_ENERGY,
|
||||
TFM_TRACKBALL,
|
||||
TFM_PUSHPULL,
|
||||
TFM_CREASE,
|
||||
TFM_MIRROR,
|
||||
TFM_BONESIZE,
|
||||
TFM_BONE_ENVELOPE,
|
||||
TFM_CURVE_SHRINKFATTEN,
|
||||
TFM_BONE_ROLL,
|
||||
TFM_TIME_TRANSLATE,
|
||||
TFM_TIME_SLIDE,
|
||||
TFM_TIME_SCALE,
|
||||
TFM_TIME_EXTEND,
|
||||
TFM_BAKE_TIME,
|
||||
TFM_BEVEL,
|
||||
TFM_BWEIGHT,
|
||||
TFM_ALIGN,
|
||||
TFM_NODE_TRANSLATE
|
||||
} TfmModesInputFlags;
|
||||
|
||||
/* TRANSFORM CONTEXTS */
|
||||
#define CTX_NONE 0
|
||||
|
||||
@@ -36,6 +36,8 @@
|
||||
#include "ED_space_api.h"
|
||||
#include "ED_screen.h"
|
||||
|
||||
#include "BIF_transform.h"
|
||||
|
||||
#include "RNA_access.h"
|
||||
#include "RNA_define.h"
|
||||
|
||||
@@ -60,4 +62,6 @@ void node_keymap(struct wmWindowManager *wm)
|
||||
RNA_enum_set(WM_keymap_add_item(keymap, "NODE_OT_extend_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "select_type", NODE_SELECT_MOUSE);
|
||||
WM_keymap_add_item(keymap, "NODE_OT_toggle_visibility", ACTIONMOUSE, KM_PRESS, 0, 0);
|
||||
WM_keymap_add_item(keymap, "NODE_OT_fit_all", HOMEKEY, KM_PRESS, 0, 0);
|
||||
|
||||
transform_keymap_for_space(wm, keymap, SPACE_NODE);
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
|
||||
#include "node_intern.h"
|
||||
|
||||
static void node_mouse_select(SpaceNode *snode, ARegion *ar, short *mval, short modifier)
|
||||
static void node_mouse_select(SpaceNode *snode, ARegion *ar, short *mval, short extend)
|
||||
{
|
||||
bNode *node;
|
||||
float mx, my;
|
||||
@@ -80,10 +80,10 @@ static void node_mouse_select(SpaceNode *snode, ARegion *ar, short *mval, short
|
||||
break;
|
||||
}
|
||||
if(node) {
|
||||
if((modifier & KM_SHIFT)==0)
|
||||
if((extend & KM_SHIFT)==0)
|
||||
node_deselectall(snode, 0);
|
||||
|
||||
if(modifier & KM_SHIFT) {
|
||||
if(extend & KM_SHIFT) {
|
||||
if(node->flag & SELECT)
|
||||
node->flag &= ~SELECT;
|
||||
else
|
||||
@@ -95,7 +95,7 @@ static void node_mouse_select(SpaceNode *snode, ARegion *ar, short *mval, short
|
||||
node_set_active(snode, node);
|
||||
|
||||
/* viewer linking */
|
||||
if(modifier & KM_CTRL)
|
||||
if(extend & KM_CTRL)
|
||||
;// node_link_viewer(snode, node);
|
||||
|
||||
//std_rmouse_transform(node_transform_ext); /* does undo push for select */
|
||||
@@ -109,7 +109,7 @@ static int node_select_exec(bContext *C, wmOperator *op)
|
||||
ARegion *ar= CTX_wm_region(C);
|
||||
int select_type;
|
||||
short mval[2];
|
||||
short modifier;
|
||||
short extend;
|
||||
|
||||
select_type = RNA_enum_get(op->ptr, "select_type");
|
||||
|
||||
@@ -117,8 +117,8 @@ static int node_select_exec(bContext *C, wmOperator *op)
|
||||
case NODE_SELECT_MOUSE:
|
||||
mval[0] = RNA_int_get(op->ptr, "mx");
|
||||
mval[1] = RNA_int_get(op->ptr, "my");
|
||||
modifier = RNA_int_get(op->ptr, "modifier");
|
||||
node_mouse_select(snode, ar, mval, modifier);
|
||||
extend = RNA_int_get(op->ptr, "extend");
|
||||
node_mouse_select(snode, ar, mval, extend);
|
||||
break;
|
||||
}
|
||||
return OPERATOR_FINISHED;
|
||||
@@ -140,7 +140,7 @@ static int node_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||
|
||||
static int node_extend_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
|
||||
{
|
||||
RNA_int_set(op->ptr, "modifier", KM_SHIFT);
|
||||
RNA_int_set(op->ptr, "extend", KM_SHIFT);
|
||||
|
||||
return node_select_invoke(C, op, event);
|
||||
}
|
||||
@@ -168,7 +168,7 @@ void NODE_OT_extend_select(wmOperatorType *ot)
|
||||
|
||||
prop = RNA_def_property(ot->srna, "mx", PROP_INT, PROP_NONE);
|
||||
prop = RNA_def_property(ot->srna, "my", PROP_INT, PROP_NONE);
|
||||
prop = RNA_def_property(ot->srna, "modifier", PROP_INT, PROP_NONE);
|
||||
prop = RNA_def_property(ot->srna, "extend", PROP_INT, PROP_NONE);
|
||||
}
|
||||
|
||||
void NODE_OT_select(wmOperatorType *ot)
|
||||
@@ -188,5 +188,5 @@ void NODE_OT_select(wmOperatorType *ot)
|
||||
|
||||
prop = RNA_def_property(ot->srna, "mx", PROP_INT, PROP_NONE);
|
||||
prop = RNA_def_property(ot->srna, "my", PROP_INT, PROP_NONE);
|
||||
prop = RNA_def_property(ot->srna, "modifier", PROP_INT, PROP_NONE);
|
||||
prop = RNA_def_property(ot->srna, "extend", PROP_INT, PROP_NONE);
|
||||
}
|
||||
|
||||
@@ -197,6 +197,24 @@ static void node_main_area_listener(ARegion *ar, wmNotifier *wmn)
|
||||
}
|
||||
}
|
||||
|
||||
static int node_context(const bContext *C, const bContextDataMember *member, bContextDataResult *result)
|
||||
{
|
||||
SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
|
||||
|
||||
if(member == CTX_data_selected_nodes) {
|
||||
bNode *node;
|
||||
|
||||
for(next_node(snode->edittree); (node=next_node(NULL));) {
|
||||
if(node->flag & SELECT) {
|
||||
CTX_data_list_add(result, node);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* only called once, from space/spacetypes.c */
|
||||
void ED_spacetype_node(void)
|
||||
{
|
||||
@@ -211,6 +229,7 @@ void ED_spacetype_node(void)
|
||||
st->duplicate= node_duplicate;
|
||||
st->operatortypes= node_operatortypes;
|
||||
st->keymap= node_keymap;
|
||||
st->context= node_context;
|
||||
|
||||
/* regions: main window */
|
||||
art= MEM_callocN(sizeof(ARegionType), "spacetype node region");
|
||||
|
||||
@@ -332,6 +332,9 @@ static void viewRedrawForce(TransInfo *t)
|
||||
else
|
||||
ED_area_tag_redraw(t->sa);
|
||||
}
|
||||
else if(t->spacetype == SPACE_NODE) {
|
||||
ED_area_tag_redraw(t->sa);
|
||||
}
|
||||
#if 0 // TRANSFORM_FIX_ME
|
||||
else if (t->spacetype==SPACE_IMAGE) {
|
||||
if (G.sima->lock) force_draw_plus(SPACE_VIEW3D, 0);
|
||||
@@ -543,6 +546,8 @@ static char *transform_to_undostr(TransInfo *t)
|
||||
return "Key Time";
|
||||
case TFM_MIRROR:
|
||||
return "Mirror";
|
||||
case TFM_NODE_TRANSLATE:
|
||||
return "Node Translate";
|
||||
}
|
||||
return "Transform";
|
||||
}
|
||||
@@ -1043,6 +1048,9 @@ void initTransform(bContext *C, TransInfo *t, int mode, int options, wmEvent *ev
|
||||
case TFM_ALIGN:
|
||||
initAlign(t);
|
||||
break;
|
||||
case TFM_NODE_TRANSLATE:
|
||||
initNodeTranslate(t);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1085,7 +1093,10 @@ int transformEnd(bContext *C, TransInfo *t)
|
||||
{
|
||||
/* handle restoring objects */
|
||||
if(t->state == TRANS_CANCEL)
|
||||
restoreTransObjects(t); // calls recalcData()
|
||||
if(t->spacetype == SPACE_NODE)
|
||||
restoreTransNodes(t);
|
||||
else
|
||||
restoreTransObjects(t); // calls recalcData()
|
||||
|
||||
/* free data */
|
||||
postTrans(t);
|
||||
@@ -4525,3 +4536,55 @@ void NDofTransform()
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* *** Node translation *** */
|
||||
|
||||
void initNodeTranslate(TransInfo *t)
|
||||
{
|
||||
t->mode = TFM_NODE_TRANSLATE;
|
||||
t->transform = NodeTranslate;
|
||||
|
||||
initMouseInputMode(t, &t->mouse, INPUT_NONE);
|
||||
|
||||
/* num-input has max of (n-1) */
|
||||
t->idx_max = 0;
|
||||
t->num.flag = 0;
|
||||
t->num.idx_max = t->idx_max;
|
||||
|
||||
/* initialise snap like for everything else */
|
||||
t->snap[0] = 0.0f;
|
||||
t->snap[1] = t->snap[2] = 1.0f;
|
||||
}
|
||||
|
||||
static void applyNodeTranslate(TransInfo *t)
|
||||
{
|
||||
TransData2D *td = t->data2d;
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < t->total; i++, td++) {
|
||||
td->loc2d[0]= td->loc[0]+t->values[0];
|
||||
td->loc2d[1]= td->loc[1]+t->values[1];
|
||||
}
|
||||
}
|
||||
|
||||
int NodeTranslate(TransInfo *t, short mval[2])
|
||||
{
|
||||
View2D *v2d = &t->ar->v2d;
|
||||
float cval[2], sval[2];
|
||||
char str[200];
|
||||
|
||||
/* calculate translation amount from mouse movement - in 'node-grid space' */
|
||||
UI_view2d_region_to_view(v2d, mval[0], mval[1], &cval[0], &cval[1]);
|
||||
UI_view2d_region_to_view(v2d, t->imval[0], t->imval[1], &sval[0], &sval[1]);
|
||||
|
||||
t->values[0] = cval[0] - sval[0];
|
||||
t->values[1] = cval[1] - sval[1];
|
||||
|
||||
applyNodeTranslate(t);
|
||||
|
||||
recalcData(t);
|
||||
|
||||
viewRedrawForce(t);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -426,6 +426,9 @@ int Mirror(TransInfo *t, short mval[2]);
|
||||
void initAlign(TransInfo *t);
|
||||
int Align(TransInfo *t, short mval[2]);
|
||||
|
||||
void initNodeTranslate(TransInfo *t);
|
||||
int NodeTranslate(TransInfo *t, short mval[2]);
|
||||
|
||||
/*********************** transform_conversions.c ********** */
|
||||
struct ListBase;
|
||||
void flushTransGPactionData(TransInfo *t);
|
||||
@@ -531,6 +534,7 @@ TransDataCurveHandleFlags *initTransDataCurveHandes(TransData *td, struct BezTri
|
||||
|
||||
void applyTransObjects(TransInfo *t);
|
||||
void restoreTransObjects(TransInfo *t);
|
||||
void restoreTransNodes(TransInfo *t);
|
||||
void recalcData(TransInfo *t);
|
||||
|
||||
void calculateCenter(TransInfo *t);
|
||||
|
||||
@@ -27,10 +27,6 @@
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#ifndef WIN32
|
||||
#include <unistd.h>
|
||||
#else
|
||||
@@ -56,6 +52,7 @@
|
||||
#include "DNA_meta_types.h"
|
||||
#include "DNA_modifier_types.h"
|
||||
#include "DNA_nla_types.h"
|
||||
#include "DNA_node_types.h"
|
||||
#include "DNA_object_types.h"
|
||||
#include "DNA_object_force.h"
|
||||
#include "DNA_particle_types.h"
|
||||
@@ -4352,6 +4349,32 @@ static void createTransObject(bContext *C, TransInfo *t)
|
||||
}
|
||||
}
|
||||
|
||||
/* transcribe given node into TransData2D for Transforming */
|
||||
static void NodeToTransData(bContext *C, TransInfo *t, TransData2D *td, bNode *node)
|
||||
{
|
||||
/* Note: since locx and locy come after each other in bNode struct, this works */
|
||||
td->loc2d = &node->locx;
|
||||
|
||||
/* initial location */
|
||||
td->loc[0]= node->locx;
|
||||
td->loc[1]= node->locy;
|
||||
}
|
||||
|
||||
void createTransNodeData(bContext *C, TransInfo *t)
|
||||
{
|
||||
TransData2D *td;
|
||||
int i= 0;
|
||||
|
||||
CTX_DATA_COUNT(C, selected_nodes, t->total)
|
||||
|
||||
td = t->data2d = MEM_callocN(t->total*sizeof(TransData2D), "TransNode");
|
||||
|
||||
CTX_DATA_BEGIN(C, bNode *, selnode, selected_nodes)
|
||||
NodeToTransData(C, t, td, selnode);
|
||||
td++;
|
||||
CTX_DATA_END
|
||||
}
|
||||
|
||||
void createTransData(bContext *C, TransInfo *t)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
@@ -4401,6 +4424,10 @@ void createTransData(bContext *C, TransInfo *t)
|
||||
sort_trans_data_dist(t);
|
||||
}
|
||||
}
|
||||
else if(t->spacetype == SPACE_NODE) {
|
||||
t->flag |= T_2D_EDIT|T_POINTS;
|
||||
createTransNodeData(C, t);
|
||||
}
|
||||
else if (t->obedit) {
|
||||
t->ext = NULL;
|
||||
if (t->obedit->type == OB_MESH) {
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
#include "DNA_mesh_types.h"
|
||||
#include "DNA_modifier_types.h"
|
||||
#include "DNA_nla_types.h"
|
||||
#include "DNA_node_types.h"
|
||||
#include "DNA_object_types.h"
|
||||
#include "DNA_object_force.h"
|
||||
#include "DNA_particle_types.h"
|
||||
@@ -731,7 +732,7 @@ void initTransInfo (bContext *C, TransInfo *t, wmEvent *event)
|
||||
if(v3d->flag & V3D_ALIGN) t->flag |= T_V3D_ALIGN;
|
||||
t->around = v3d->around;
|
||||
}
|
||||
else if(t->spacetype==SPACE_IMAGE)
|
||||
else if(t->spacetype==SPACE_IMAGE || t->spacetype==SPACE_NODE)
|
||||
{
|
||||
View2D *v2d = sa->spacedata.first; // XXX no!
|
||||
|
||||
@@ -879,6 +880,20 @@ static void restoreElement(TransData *td) {
|
||||
}
|
||||
}
|
||||
|
||||
static void restoreNode(TransData2D *td)
|
||||
{
|
||||
td->loc2d[0]= td->loc[0];
|
||||
td->loc2d[1]= td->loc[1];
|
||||
}
|
||||
|
||||
void restoreTransNodes(TransInfo *t)
|
||||
{
|
||||
TransData2D *td;
|
||||
for (td = t->data2d; td < t->data2d + t->total; td++) {
|
||||
restoreNode(td);
|
||||
}
|
||||
}
|
||||
|
||||
void restoreTransObjects(TransInfo *t)
|
||||
{
|
||||
TransData *td;
|
||||
@@ -1133,6 +1148,8 @@ void calculatePropRatio(TransInfo *t)
|
||||
float dist;
|
||||
short connected = t->flag & T_PROP_CONNECTED;
|
||||
|
||||
if (t->spacetype == SPACE_NODE) return;
|
||||
|
||||
if (t->flag & T_PROP_EDIT) {
|
||||
for(i = 0 ; i < t->total; i++, td++) {
|
||||
if (td->flag & TD_SELECTED) {
|
||||
|
||||
@@ -182,6 +182,9 @@ void transform_keymap_for_space(struct wmWindowManager *wm, struct ListBase *key
|
||||
|
||||
km= WM_keymap_add_item(keymap, "TFM_OT_transform", TKEY, KM_PRESS, 0, 0);
|
||||
RNA_int_set(km->ptr, "mode", TFM_TIME_SLIDE);
|
||||
case SPACE_NODE:
|
||||
km= WM_keymap_add_item(keymap, "TFM_OT_transform", GKEY, KM_PRESS, 0, 0);
|
||||
RNA_int_set(km->ptr, "mode", TFM_NODE_TRANSLATE);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user