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/src/drawnode.c')
-rw-r--r--source/blender/src/drawnode.c78
1 files changed, 72 insertions, 6 deletions
diff --git a/source/blender/src/drawnode.c b/source/blender/src/drawnode.c
index ed8f6d81ba9..c510c34c9a1 100644
--- a/source/blender/src/drawnode.c
+++ b/source/blender/src/drawnode.c
@@ -663,22 +663,77 @@ static int node_composit_buts_image(uiBlock *block, bNodeTree *ntree, bNode *nod
return 19;
}
-static char *scene_layer_menu(void)
+/* if we use render result from other scene, we make a nice title */
+static void set_render_result_title(void *node_v, void *unused)
{
+ bNode *node= node_v;
+ Scene *sce;
SceneRenderLayer *srl;
- int len= 32 + 32*BLI_countlist(&G.scene->r.layers);
+ char str[64];
+
+ if(node->id) {
+ BLI_strncpy(str, node->id->name+2, 21);
+ strcat(str, "|");
+ sce= (Scene *)node->id;
+ }
+ else {
+ str[0]= 0;
+ sce= G.scene;
+ }
+ srl= BLI_findlink(&sce->r.layers, node->custom1);
+ if(srl==NULL) {
+ node->custom1= 0;
+ srl= sce->r.layers.first;
+ }
+
+ strcat(str, srl->name);
+ BLI_strncpy(node->name, str, 32);
+}
+
+static char *scene_layer_menu(Scene *sce)
+{
+ SceneRenderLayer *srl;
+ int len= 32 + 32*BLI_countlist(&sce->r.layers);
short a, nr;
char *str= MEM_callocN(len, "menu layers");
strcpy(str, "Active Layer %t");
a= strlen(str);
- for(nr=0, srl= G.scene->r.layers.first; srl; srl= srl->next, nr++) {
+ for(nr=0, srl= sce->r.layers.first; srl; srl= srl->next, nr++) {
a+= sprintf(str+a, "|%s %%x%d", srl->name, nr);
}
return str;
}
+static void node_browse_scene_cb(void *ntree_v, void *node_v)
+{
+ bNodeTree *ntree= ntree_v;
+ bNode *node= node_v;
+ Scene *sce;
+
+ if(node->menunr<1) return;
+
+ if(node->id) {
+ node->id->us--;
+ node->id= NULL;
+ }
+ sce= BLI_findlink(&G.main->scene, node->menunr-1);
+ if(sce!=G.scene) {
+ node->id= &sce->id;
+ id_us_plus(node->id);
+ }
+
+ set_render_result_title(node, NULL);
+ nodeSetActive(ntree, node);
+
+ allqueue(REDRAWBUTSSHADING, 0);
+ allqueue(REDRAWNODE, 0);
+ NodeTagChanged(ntree, node);
+
+ node->menunr= 0;
+}
+
static int node_composit_buts_renderresult(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
{
@@ -686,11 +741,22 @@ static int node_composit_buts_renderresult(uiBlock *block, bNodeTree *ntree, bNo
uiBut *bt;
char *strp;
- strp= scene_layer_menu();
+ /* browse button scene */
+ uiBlockBeginAlign(block);
+ IDnames_to_pupstring(&strp, NULL, "", &(G.main->scene), NULL, NULL);
+ node->menunr= 0;
+ bt= uiDefButS(block, MENU, B_NOP, strp,
+ butr->xmin, butr->ymin, 20, 19,
+ &node->menunr, 0, 0, 0, 0, "Browse Scene to use RenderLayer from");
+ uiButSetFunc(bt, node_browse_scene_cb, ntree, node);
+ if(strp) MEM_freeN(strp);
+
+ /* browse button layer */
+ strp= scene_layer_menu(node->id?(Scene *)node->id:G.scene);
bt= uiDefButS(block, MENU, B_NODE_EXEC+node->nr, strp,
- butr->xmin, butr->ymin, (butr->xmax-butr->xmin), 19,
+ butr->xmin+20, butr->ymin, (butr->xmax-butr->xmin)-20, 19,
&node->custom1, 0, 0, 0, 0, "Choose Render Layer");
- uiButSetFunc(bt, node_but_title_cb, node, bt);
+ uiButSetFunc(bt, set_render_result_title, node, NULL);
MEM_freeN(strp);
}
return 19;