Fix: render could crash when you enable 'do composite' without having
nodes in scene. Feature: SHIFT+R in compositor reloads all full sample buffers, composites and merges with filter. (ALso in Node menu).
This commit is contained in:
@@ -73,6 +73,7 @@ void node_ungroup(struct SpaceNode *snode);
|
||||
void snode_make_group_editable(struct SpaceNode *snode, struct bNode *gnode);
|
||||
void node_hide(struct SpaceNode *snode);
|
||||
void node_read_renderlayers(struct SpaceNode *snode);
|
||||
void node_read_fullsamplelayers(struct SpaceNode *snode);
|
||||
void clear_scene_in_nodes(struct Scene *sce);
|
||||
void node_make_link(struct SpaceNode *snode);
|
||||
|
||||
|
@@ -38,6 +38,7 @@ struct Scene;
|
||||
struct RenderData;
|
||||
struct NodeBlurData;
|
||||
struct Object;
|
||||
struct bNodeTree;
|
||||
|
||||
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
|
||||
/* this include is what is exposed of render to outside world */
|
||||
@@ -187,6 +188,9 @@ void RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
|
||||
void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress);
|
||||
struct RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty);
|
||||
|
||||
/* do a full sample buffer compo */
|
||||
void RE_MergeFullSample(struct Render *re, struct Scene *sce, struct bNodeTree *ntree);
|
||||
|
||||
/* ancient stars function... go away! */
|
||||
void RE_make_stars(struct Render *re, void (*initfunc)(void),
|
||||
void (*vertexfunc)(float*), void (*termfunc)(void));
|
||||
|
@@ -2022,14 +2022,18 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
|
||||
float *rectf;
|
||||
int sample;
|
||||
|
||||
/* filtmask needs it */
|
||||
R= *re;
|
||||
|
||||
/* we accumulate in here */
|
||||
rectf= MEM_mapallocN(re->rectx*re->recty*sizeof(float)*4, "fullsample rgba");
|
||||
|
||||
for(sample=0; sample<re->osa; sample++) {
|
||||
for(sample=0; sample<re->r.osa; sample++) {
|
||||
RenderResult rres;
|
||||
int x, y, mask;
|
||||
|
||||
/* set all involved renders on the samplebuffers (first was done by render itself) */
|
||||
/* also function below assumes this */
|
||||
if(sample) {
|
||||
Render *re1;
|
||||
|
||||
@@ -2083,7 +2087,40 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
|
||||
re->result->rectf= rectf;
|
||||
}
|
||||
|
||||
|
||||
void RE_MergeFullSample(Render *re, Scene *sce, bNodeTree *ntree)
|
||||
{
|
||||
Scene *scene;
|
||||
bNode *node;
|
||||
|
||||
/* first call RE_ReadRenderResult on every renderlayer scene. this creates Render structs */
|
||||
|
||||
/* tag scenes unread */
|
||||
for(scene= G.main->scene.first; scene; scene= scene->id.next)
|
||||
scene->id.flag |= LIB_DOIT;
|
||||
|
||||
for(node= ntree->nodes.first; node; node= node->next) {
|
||||
if(node->type==CMP_NODE_R_LAYERS) {
|
||||
Scene *nodescene= (Scene *)node->id;
|
||||
|
||||
if(nodescene==NULL) nodescene= sce;
|
||||
if(nodescene->id.flag & LIB_DOIT) {
|
||||
nodescene->r.mode |= R_OSA; /* render struct needs tables */
|
||||
RE_ReadRenderResult(sce, nodescene);
|
||||
nodescene->id.flag &= ~LIB_DOIT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* own render result should be read/allocated */
|
||||
if(G.scene->id.flag & LIB_DOIT)
|
||||
RE_ReadRenderResult(G.scene, G.scene);
|
||||
|
||||
/* and now we can draw (result is there) */
|
||||
re->display_init(re->result);
|
||||
re->display_clear(re->result);
|
||||
|
||||
do_merge_fullsample(re, ntree);
|
||||
}
|
||||
|
||||
/* returns fully composited render-result on given time step (in RenderData) */
|
||||
static void do_render_composite_fields_blur_3d(Render *re)
|
||||
@@ -2111,7 +2148,7 @@ static void do_render_composite_fields_blur_3d(Render *re)
|
||||
ntreeCompositTagAnimated(ntree);
|
||||
}
|
||||
|
||||
if(re->r.scemode & R_DOCOMP) {
|
||||
if(ntree && re->r.scemode & R_DOCOMP) {
|
||||
/* checks if there are render-result nodes that need scene */
|
||||
if((re->r.scemode & R_SINGLE_LAYER)==0)
|
||||
ntree_render_scenes(re);
|
||||
@@ -2621,7 +2658,10 @@ void RE_ReadRenderResult(Scene *scene, Scene *scenode)
|
||||
if(scenode)
|
||||
scene= scenode;
|
||||
|
||||
re= RE_NewRender(scene->id.name);
|
||||
/* get render: it can be called from UI with draw callbacks */
|
||||
re= RE_GetRender(scene->id.name);
|
||||
if(re==NULL)
|
||||
re= RE_NewRender(scene->id.name);
|
||||
RE_InitState(re, &scene->r, winx, winy, &disprect);
|
||||
re->scene= scene;
|
||||
|
||||
|
@@ -2012,6 +2012,22 @@ void node_read_renderlayers(SpaceNode *snode)
|
||||
snode_handle_recalc(snode);
|
||||
}
|
||||
|
||||
void node_read_fullsamplelayers(SpaceNode *snode)
|
||||
{
|
||||
Render *re= RE_NewRender(G.scene->id.name);
|
||||
|
||||
waitcursor(1);
|
||||
|
||||
BIF_init_render_callbacks(re, 1);
|
||||
RE_MergeFullSample(re, G.scene, snode->nodetree);
|
||||
BIF_end_render_callbacks();
|
||||
|
||||
allqueue(REDRAWNODE, 1);
|
||||
allqueue(REDRAWIMAGE, 1);
|
||||
|
||||
waitcursor(0);
|
||||
}
|
||||
|
||||
/* called from header_info, when deleting a scene
|
||||
* goes over all scenes other than the input, checks if they have
|
||||
* render layer nodes referencing the to-be-deleted scene, and
|
||||
@@ -2337,7 +2353,12 @@ void winqreadnodespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
case RKEY:
|
||||
if(G.qual==LR_CTRLKEY) {
|
||||
node_rename(snode);
|
||||
} else{
|
||||
}
|
||||
else if(G.qual==LR_SHIFTKEY) {
|
||||
if(okee("Read saved Full Sample Layers"))
|
||||
node_read_fullsamplelayers(snode);
|
||||
}
|
||||
else {
|
||||
if(okee("Read saved Render Layers"))
|
||||
node_read_renderlayers(snode);
|
||||
}
|
||||
|
@@ -519,6 +519,10 @@ static void do_node_nodemenu(void *arg, int event)
|
||||
case 12: /* rename */
|
||||
node_rename(snode);
|
||||
break;
|
||||
case 13: /* read saved full sample layers */
|
||||
node_read_fullsamplelayers(snode);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
if(fromlib==-1) error_libdata();
|
||||
@@ -562,6 +566,7 @@ static uiBlock *node_nodemenu(void *arg_unused)
|
||||
if(snode->treetype==NTREE_COMPOSIT) {
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Execute Composite|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Read Saved Render Results|R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Read Saved Full Sample Results|R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
|
||||
}
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Cyclic Dependencies|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
|
||||
|
||||
|
Reference in New Issue
Block a user