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:
2008-01-31 15:35:24 +00:00
parent 134fdd6d5a
commit 90f8fb733b
5 changed files with 76 additions and 5 deletions

View File

@@ -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);

View File

@@ -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));

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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, "");