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:
Diffstat (limited to 'source/blender/editors/space_node/node_edit.c')
-rw-r--r--source/blender/editors/space_node/node_edit.c264
1 files changed, 197 insertions, 67 deletions
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index 69b2cb95a9d..767dd753766 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -61,6 +61,7 @@
#include "RE_pipeline.h"
+#include "IMB_imbuf_types.h"
#include "ED_node.h"
#include "ED_screen.h"
@@ -73,7 +74,7 @@
#include "UI_interface.h"
#include "UI_view2d.h"
-
+
#include "node_intern.h"
#define SOCK_IN 1
@@ -175,7 +176,7 @@ void snode_composite_job(const bContext *C, ScrArea *sa)
/* setup job */
WM_jobs_customdata(steve, cj, compo_freejob);
WM_jobs_timer(steve, 0.1, NC_SCENE, NC_SCENE|ND_COMPO_RESULT);
- WM_jobs_callbacks(steve, compo_startjob, compo_initjob, compo_updatejob);
+ WM_jobs_callbacks(steve, compo_startjob, compo_initjob, compo_updatejob, NULL);
WM_jobs_start(CTX_wm_manager(C), steve);
@@ -686,68 +687,125 @@ static bNode *visible_node(SpaceNode *snode, rctf *rct)
return tnode;
}
-#if 0
-static void snode_bg_viewmove(SpaceNode *snode)
+/* **************************** */
+
+typedef struct NodeViewMove {
+ short mvalo[2];
+ int xmin, ymin, xmax, ymax;
+} NodeViewMove;
+
+static int snode_bg_viewmove_modal(bContext *C, wmOperator *op, wmEvent *event)
{
- ScrArea *sa;
+ SpaceNode *snode= CTX_wm_space_node(C);
+ ARegion *ar= CTX_wm_region(C);
+ NodeViewMove *nvm= op->customdata;
+
+ switch (event->type) {
+ case MOUSEMOVE:
+
+ snode->xof -= (nvm->mvalo[0]-event->mval[0]);
+ snode->yof -= (nvm->mvalo[1]-event->mval[1]);
+ nvm->mvalo[0]= event->mval[0];
+ nvm->mvalo[1]= event->mval[1];
+
+ /* prevent dragging image outside of the window and losing it! */
+ CLAMP(snode->xof, nvm->xmin, nvm->xmax);
+ CLAMP(snode->yof, nvm->ymin, nvm->ymax);
+
+ ED_region_tag_redraw(ar);
+
+ break;
+
+ case LEFTMOUSE:
+ case MIDDLEMOUSE:
+ case RIGHTMOUSE:
+
+ MEM_freeN(nvm);
+ op->customdata= NULL;
+
+ return OPERATOR_FINISHED;
+ }
+
+ return OPERATOR_RUNNING_MODAL;
+}
+
+static int snode_bg_viewmove_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ ARegion *ar= CTX_wm_region(C);
+ NodeViewMove *nvm;
Image *ima;
ImBuf *ibuf;
- Window *win;
- short mval[2], mvalo[2];
- short rectx, recty, xmin, xmax, ymin, ymax, pad;
- int oldcursor;
+ int pad= 10;
ima= BKE_image_verify_viewer(IMA_TYPE_COMPOSITE, "Viewer Node");
ibuf= BKE_image_get_ibuf(ima, NULL);
- sa = snode->area;
+ if(ibuf == NULL)
+ return OPERATOR_CANCELLED;
+
+ nvm= MEM_callocN(sizeof(NodeViewMove), "NodeViewMove struct");
+ op->customdata= nvm;
+ nvm->mvalo[0]= event->mval[0];
+ nvm->mvalo[1]= event->mval[1];
+
+ nvm->xmin = -(ar->winx/2) - ibuf->x/2 + pad;
+ nvm->xmax = ar->winx/2 + ibuf->x/2 - pad;
+ nvm->ymin = -(ar->winy/2) - ibuf->y/2 + pad;
+ nvm->ymax = ar->winy/2 + ibuf->y/2 - pad;
- if(ibuf) {
- rectx = ibuf->x;
- recty = ibuf->y;
- } else {
- rectx = recty = 1;
- }
+ /* add modal handler */
+ WM_event_add_modal_handler(C, op);
- pad = 10;
- xmin = -(sa->winx/2) - rectx/2 + pad;
- xmax = sa->winx/2 + rectx/2 - pad;
- ymin = -(sa->winy/2) - recty/2 + pad;
- ymax = sa->winy/2 + recty/2 - pad;
+ return OPERATOR_RUNNING_MODAL;
+}
+
+
+void NODE_OT_backimage_move(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Background Image Move";
+ ot->idname= "NODE_OT_backimage_move";
- getmouseco_sc(mvalo);
+ /* api callbacks */
+ ot->invoke= snode_bg_viewmove_invoke;
+ ot->modal= snode_bg_viewmove_modal;
+ ot->poll= ED_operator_node_active;
- /* store the old cursor to temporarily change it */
- oldcursor=get_cursor();
- win=winlay_get_active_window();
+ /* flags */
+ ot->flag= OPTYPE_BLOCKING;
+}
+
+static int backimage_zoom(bContext *C, wmOperator *op)
+{
+ SpaceNode *snode= CTX_wm_space_node(C);
+ ARegion *ar= CTX_wm_region(C);
+ float fac= RNA_float_get(op->ptr, "factor");
+
+ snode->zoom *= fac;
+ ED_region_tag_redraw(ar);
+
+ return OPERATOR_FINISHED;
+}
+
+
+void NODE_OT_backimage_zoom(wmOperatorType *ot)
+{
- SetBlenderCursor(BC_NSEW_SCROLLCURSOR);
+ /* identifiers */
+ ot->name= "Background Image Zoom";
+ ot->idname= "NODE_OT_backimage_zoom";
- while(get_mbut()&(L_MOUSE|M_MOUSE)) {
-
- getmouseco_sc(mval);
-
- if(mvalo[0]!=mval[0] || mvalo[1]!=mval[1]) {
-
- snode->xof -= (mvalo[0]-mval[0]);
- snode->yof -= (mvalo[1]-mval[1]);
-
- /* prevent dragging image outside of the window and losing it! */
- CLAMP(snode->xof, xmin, xmax);
- CLAMP(snode->yof, ymin, ymax);
-
- mvalo[0]= mval[0];
- mvalo[1]= mval[1];
-
- scrarea_do_windraw(curarea);
- screen_swapbuffers();
- }
- else BIF_wait_for_statechange();
- }
+ /* api callbacks */
+ ot->exec= backimage_zoom;
+ ot->poll= ED_operator_node_active;
- window_set_cursor(win, oldcursor);
+ /* flags */
+ ot->flag= OPTYPE_BLOCKING;
+
+ /* internal */
+ RNA_def_float(ot->srna, "factor", 1.2f, 0.0f, 10.0f, "Factor", "", 0.0f, 10.0f);
}
-#endif
+
/* ********************** size widget operator ******************** */
@@ -892,6 +950,15 @@ static void node_link_viewer(SpaceNode *snode, bNode *tonode)
if( ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))
if(node->flag & NODE_DO_OUTPUT)
break;
+ /* no viewer, we make one active */
+ if(node==NULL) {
+ for(node= snode->edittree->nodes.first; node; node= node->next) {
+ if( ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
+ node->flag |= NODE_DO_OUTPUT;
+ break;
+ }
+ }
+ }
if(node) {
bNodeLink *link;
@@ -900,8 +967,13 @@ static void node_link_viewer(SpaceNode *snode, bNode *tonode)
for(link= snode->edittree->links.first; link; link= link->next)
if(link->tonode==node)
break;
-
- if(link) {
+
+ if(link==NULL) {
+ nodeAddLink(snode->edittree, tonode, tonode->outputs.first, node, node->inputs.first);
+ ntreeSolveOrder(snode->edittree);
+ NodeTagChanged(snode->edittree, node);
+ }
+ else if(link) {
link->fromnode= tonode;
link->fromsock= tonode->outputs.first;
NodeTagChanged(snode->edittree, node);
@@ -910,13 +982,40 @@ static void node_link_viewer(SpaceNode *snode, bNode *tonode)
}
-void node_active_link_viewer(SpaceNode *snode)
+static int node_active_link_viewer(bContext *C, wmOperator *op)
{
- bNode *node= editnode_get_active(snode->edittree);
- if(node)
+ SpaceNode *snode= CTX_wm_space_node(C);
+ bNode *node;
+
+
+ node= editnode_get_active(snode->edittree);
+
+ if(node) {
node_link_viewer(snode, node);
+ snode_notify(C, snode);
+ }
+ return OPERATOR_FINISHED;
}
+
+
+void NODE_OT_link_viewer(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Link to Viewer Node";
+ ot->description = "Link to Viewer Node";
+ ot->idname= "NODE_OT_link_viewer";
+
+ /* api callbacks */
+ ot->exec= node_active_link_viewer;
+ ot->poll= ED_operator_node_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+
+
/* return 0, nothing done */
/*static*/ int node_mouse_groupheader(SpaceNode *snode)
{
@@ -1622,11 +1721,11 @@ void NODE_OT_links_cut(wmOperatorType *ot)
/* ******************************** */
// XXX some code needing updating to operators...
-/* goes over all scenes, reads render layerss */
-void node_read_renderlayers(SpaceNode *snode)
+/* goes over all scenes, reads render layers */
+static int node_read_renderlayers_exec(bContext *C, wmOperator *op)
{
- Scene *curscene= NULL; // XXX
- Scene *scene;
+ SpaceNode *snode= CTX_wm_space_node(C);
+ Scene *curscene= CTX_data_scene(C), *scene;
bNode *node;
/* first tag scenes unread */
@@ -1644,26 +1743,57 @@ void node_read_renderlayers(SpaceNode *snode)
}
}
- // XXX snode_notify(snode);
+ snode_notify(C, snode);
+ return OPERATOR_FINISHED;
+}
+
+void NODE_OT_read_renderlayers(wmOperatorType *ot)
+{
+
+ ot->name= "Read Render Layers";
+ ot->idname= "NODE_OT_read_renderlayers";
+
+ ot->exec= node_read_renderlayers_exec;
+
+ ot->poll= ED_operator_node_active;
+
+ /* flags */
+ ot->flag= 0;
}
-void node_read_fullsamplelayers(SpaceNode *snode)
+static int node_read_fullsamplelayers_exec(bContext *C, wmOperator *op)
{
- Scene *curscene= NULL; // XXX
+ SpaceNode *snode= CTX_wm_space_node(C);
+ Scene *curscene= CTX_data_scene(C);
Render *re= RE_NewRender(curscene->id.name);
- WM_cursor_wait(1);
+// WM_cursor_wait(1);
- //BIF_init_render_callbacks(re, 1);
RE_MergeFullSample(re, curscene, snode->nodetree);
- //BIF_end_render_callbacks();
+ snode_notify(C, snode);
- // allqueue(REDRAWNODE, 1);
- // allqueue(REDRAWIMAGE, 1);
+// WM_cursor_wait(0);
+ return OPERATOR_FINISHED;
+}
+
+
+void NODE_OT_read_fullsamplelayers(wmOperatorType *ot)
+{
+
+ ot->name= "Read Full Sample Layers";
+ ot->idname= "NODE_OT_read_fullsamplelayers";
+
+ ot->exec= node_read_fullsamplelayers_exec;
+
+ ot->poll= ED_operator_node_active;
- WM_cursor_wait(0);
+ /* flags */
+ ot->flag= 0;
}
+
+/* ************************* */
+
void imagepaint_composite_tags(bNodeTree *ntree, Image *image, ImageUser *iuser)
{
bNode *node;