Restored Compositor 're-render single layer' functionality (buttons on renderlayer comp nodes).

This works with operator properties - if you pass the name of a scene and renderlayer to 
the screen.render operator, it will render that layer as a single layer re-render.
This commit is contained in:
Matt Ebb 2010-01-06 00:09:07 +00:00
parent 4b202b562a
commit 06e6011ae9
10 changed files with 125 additions and 132 deletions

@ -2094,7 +2094,7 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int
doseq= scene->r.scemode & R_DOSEQ; doseq= scene->r.scemode & R_DOSEQ;
scene->r.scemode &= ~R_DOSEQ; scene->r.scemode &= ~R_DOSEQ;
RE_BlenderFrame(re, sce, RE_BlenderFrame(re, sce, NULL,
seq->sfra+se->nr+seq->anim_startofs); seq->sfra+se->nr+seq->anim_startofs);
if(rendering) if(rendering)

@ -717,7 +717,7 @@ void BIF_view3d_previewrender(Scene *scene, ScrArea *sa)
rdata.layers.first= rdata.layers.last= NULL; rdata.layers.first= rdata.layers.last= NULL;
rdata.renderer= R_INTERN; rdata.renderer= R_INTERN;
RE_InitState(re, NULL, &rdata, sa->winx, sa->winy, &ri->disprect); RE_InitState(re, NULL, &rdata, NULL, sa->winx, sa->winy, &ri->disprect);
if(orth) if(orth)
RE_SetOrtho(re, &viewplane, clipsta, clipend); RE_SetOrtho(re, &viewplane, clipsta, clipend);
@ -923,7 +923,7 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
else sizex= sp->sizex; else sizex= sp->sizex;
/* allocates or re-uses render result */ /* allocates or re-uses render result */
RE_InitState(re, NULL, &sce->r, sizex, sp->sizey, NULL); RE_InitState(re, NULL, &sce->r, NULL, sizex, sp->sizey, NULL);
/* callbacs are cleared on GetRender() */ /* callbacs are cleared on GetRender() */
if(sp->pr_method==PR_BUTS_RENDER) { if(sp->pr_method==PR_BUTS_RENDER) {

@ -2812,7 +2812,7 @@ static int screen_render_exec(bContext *C, wmOperator *op)
if(RNA_boolean_get(op->ptr, "animation")) if(RNA_boolean_get(op->ptr, "animation"))
RE_BlenderAnim(re, scene, scene->r.sfra, scene->r.efra, scene->r.frame_step, op->reports); RE_BlenderAnim(re, scene, scene->r.sfra, scene->r.efra, scene->r.frame_step, op->reports);
else else
RE_BlenderFrame(re, scene, scene->r.cfra); RE_BlenderFrame(re, scene, NULL, scene->r.cfra);
// no redraw needed, we leave state as we entered it // no redraw needed, we leave state as we entered it
ED_update_for_newframe(C, 1); ED_update_for_newframe(C, 1);
@ -2826,6 +2826,7 @@ typedef struct RenderJob {
Scene *scene; Scene *scene;
Render *re; Render *re;
wmWindow *win; wmWindow *win;
SceneRenderLayer *srl;
int anim; int anim;
Image *image; Image *image;
ImageUser iuser; ImageUser iuser;
@ -3038,7 +3039,7 @@ static void render_startjob(void *rjv, short *stop, short *do_update)
if(rj->anim) if(rj->anim)
RE_BlenderAnim(rj->re, rj->scene, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step, rj->reports); RE_BlenderAnim(rj->re, rj->scene, rj->scene->r.sfra, rj->scene->r.efra, rj->scene->r.frame_step, rj->reports);
else else
RE_BlenderFrame(rj->re, rj->scene, rj->scene->r.cfra); RE_BlenderFrame(rj->re, rj->scene, rj->srl, rj->scene->r.cfra);
} }
/* called by render, check job 'stop' value or the global */ /* called by render, check job 'stop' value or the global */
@ -3074,6 +3075,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
{ {
/* new render clears all callbacks */ /* new render clears all callbacks */
Scene *scene= CTX_data_scene(C); Scene *scene= CTX_data_scene(C);
SceneRenderLayer *srl=NULL;
Render *re; Render *re;
wmJob *steve; wmJob *steve;
RenderJob *rj; RenderJob *rj;
@ -3102,10 +3104,29 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* ensure at least 1 area shows result */ /* ensure at least 1 area shows result */
screen_set_image_output(C, event->x, event->y); screen_set_image_output(C, event->x, event->y);
/* single layer re-render */
if(RNA_property_is_set(op->ptr, "layer")) {
SceneRenderLayer *rl;
Scene *scn;
char scene_name[19], rl_name[RE_MAXNAME];
RNA_string_get(op->ptr, "layer", rl_name);
RNA_string_get(op->ptr, "scene", scene_name);
scn = (Scene *)BLI_findstring(&CTX_data_main(C)->scene, scene_name, offsetof(ID, name) + 2);
rl = (SceneRenderLayer *)BLI_findstring(&scene->r.layers, rl_name, offsetof(SceneRenderLayer, name));
if (scn && rl) {
scene = scn;
srl = rl;
}
}
/* job custom data */ /* job custom data */
rj= MEM_callocN(sizeof(RenderJob), "render job"); rj= MEM_callocN(sizeof(RenderJob), "render job");
rj->scene= scene; rj->scene= scene;
rj->win= CTX_wm_window(C); rj->win= CTX_wm_window(C);
rj->srl = srl;
rj->anim= RNA_boolean_get(op->ptr, "animation"); rj->anim= RNA_boolean_get(op->ptr, "animation");
rj->iuser.scene= scene; rj->iuser.scene= scene;
rj->iuser.ok= 1; rj->iuser.ok= 1;
@ -3167,6 +3188,8 @@ static void SCREEN_OT_render(wmOperatorType *ot)
ot->poll= ED_operator_screenactive; ot->poll= ED_operator_screenactive;
RNA_def_boolean(ot->srna, "animation", 0, "Animation", ""); RNA_def_boolean(ot->srna, "animation", 0, "Animation", "");
RNA_def_string(ot->srna, "layer", "", RE_MAXNAME, "Render Layer", "Single render layer to re-render");
RNA_def_string(ot->srna, "scene", "", 19, "Scene", "Re-render single layer in this scene");
} }
/* ****************************** opengl render *************************** */ /* ****************************** opengl render *************************** */
@ -3289,7 +3312,7 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op)
/* create render and render result */ /* create render and render result */
oglrender->re= RE_NewRender(scene->id.name); oglrender->re= RE_NewRender(scene->id.name);
RE_InitState(oglrender->re, NULL, &scene->r, sizex, sizey, NULL); RE_InitState(oglrender->re, NULL, &scene->r, NULL, sizex, sizey, NULL);
rr= RE_AcquireResultWrite(oglrender->re); rr= RE_AcquireResultWrite(oglrender->re);
if(rr->rectf==NULL) if(rr->rectf==NULL)

@ -545,16 +545,33 @@ static void node_composit_buts_image(uiLayout *layout, bContext *C, PointerRNA *
static void node_composit_buts_renderlayers(uiLayout *layout, bContext *C, PointerRNA *ptr) static void node_composit_buts_renderlayers(uiLayout *layout, bContext *C, PointerRNA *ptr)
{ {
bNode *node= ptr->data; bNode *node= ptr->data;
uiLayout *col; uiLayout *col, *row;
PointerRNA op_ptr;
PointerRNA scn_ptr;
PropertyRNA *prop;
const char *layer_name;
char scene_name[19];
uiTemplateID(layout, C, ptr, "scene", NULL, NULL, NULL); uiTemplateID(layout, C, ptr, "scene", NULL, NULL, NULL);
if(!node->id) return; if(!node->id) return;
col= uiLayoutColumn(layout, 0); col= uiLayoutColumn(layout, 0);
uiItemR(col, "", 0, ptr, "layer", 0); row = uiLayoutRow(col, 0);
uiItemR(row, "", 0, ptr, "layer", 0);
/* XXX Missing 're-render this layer' button - needs completely new implementation */ prop = RNA_struct_find_property(ptr, "layer");
if (!(RNA_property_enum_identifier(C, ptr, prop, RNA_property_enum_get(ptr, prop), &layer_name)))
return;
scn_ptr = RNA_pointer_get(ptr, "scene");
RNA_string_get(&scn_ptr, "name", scene_name);
WM_operator_properties_create(&op_ptr, "SCREEN_OT_render");
RNA_string_set(&op_ptr, "layer", layer_name);
RNA_string_set(&op_ptr, "scene", scene_name);
uiItemFullO(row, "", ICON_RENDER_STILL, "SCREEN_OT_render", op_ptr.data, WM_OP_INVOKE_DEFAULT, 0);
} }

@ -345,49 +345,6 @@ bNode *node_tree_get_editgroup(bNodeTree *nodetree)
#if 0 #if 0
/* node has to be of type 'render layers' */
/* is a bit clumsy copying renderdata here... scene nodes use render size of current render */
static void composite_node_render(SpaceNode *snode, bNode *node)
{
RenderData rd;
Scene *scene= NULL;
int scemode, actlay;
/* the button press won't show up otherwise, button hilites disabled */
force_draw(0);
if(node->id && node->id!=(ID *)G.scene) {
scene= G.scene;
set_scene_bg((Scene *)node->id);
rd= G.scene->r;
G.scene->r.xsch= scene->r.xsch;
G.scene->r.ysch= scene->r.ysch;
G.scene->r.size= scene->r.size;
G.scene->r.mode &= ~(R_BORDER|R_DOCOMP);
G.scene->r.mode |= scene->r.mode & R_BORDER;
G.scene->r.border= scene->r.border;
G.scene->r.cfra= scene->r.cfra;
}
scemode= G.scene->r.scemode;
actlay= G.scene->r.actlay;
G.scene->r.scemode |= R_SINGLE_LAYER|R_COMP_RERENDER;
G.scene->r.actlay= node->custom1;
BIF_do_render(0);
G.scene->r.scemode= scemode;
G.scene->r.actlay= actlay;
node->custom2= 0;
if(scene) {
G.scene->r= rd;
set_scene_bg(scene);
}
}
static void composit_node_event(SpaceNode *snode, short event) static void composit_node_event(SpaceNode *snode, short event)
{ {

@ -1077,12 +1077,6 @@ static void def_cmp_render_layers(StructRNA *srna)
RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Node_scene_layer_itemf"); RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Node_scene_layer_itemf");
RNA_def_property_ui_text(prop, "Layer", ""); RNA_def_property_ui_text(prop, "Layer", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update"); RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
/* TODO: comments indicate this might be a hack */
prop = RNA_def_property(srna, "re_render", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "custom2", 1);
RNA_def_property_ui_text(prop, "Re-render", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
} }
static void def_cmp_output_file(StructRNA *srna) static void def_cmp_output_file(StructRNA *srna)

@ -46,6 +46,7 @@ struct RenderEngineType;
struct RenderResult; struct RenderResult;
struct ReportList; struct ReportList;
struct Scene; struct Scene;
struct SceneRenderLayer;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* this include is what is exposed of render to outside world */ /* this include is what is exposed of render to outside world */
@ -169,7 +170,7 @@ struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name)
float *RE_RenderLayerGetPass(struct RenderLayer *rl, int passtype); float *RE_RenderLayerGetPass(struct RenderLayer *rl, int passtype);
/* obligatory initialize call, disprect is optional */ /* obligatory initialize call, disprect is optional */
void RE_InitState (struct Render *re, struct Render *source, struct RenderData *rd, int winx, int winy, rcti *disprect); void RE_InitState (struct Render *re, struct Render *source, struct RenderData *rd, struct SceneRenderLayer *srl, int winx, int winy, rcti *disprect);
/* use this to change disprect of active render */ /* use this to change disprect of active render */
void RE_SetDispRect (struct Render *re, rcti *disprect); void RE_SetDispRect (struct Render *re, rcti *disprect);
@ -200,7 +201,7 @@ void RE_init_threadcount(Render *re);
void RE_TileProcessor(struct Render *re, int firsttile, int threaded); void RE_TileProcessor(struct Render *re, int firsttile, int threaded);
/* only RE_NewRender() needed, main Blender render calls */ /* only RE_NewRender() needed, main Blender render calls */
void RE_BlenderFrame(struct Render *re, struct Scene *scene, int frame); void RE_BlenderFrame(struct Render *re, struct Scene *scene, struct SceneRenderLayer *srl, int frame);
void RE_BlenderAnim(struct Render *re, struct Scene *scene, int sfra, int efra, int tfra, struct ReportList *reports); void RE_BlenderAnim(struct Render *re, struct Scene *scene, int sfra, int efra, int tfra, struct ReportList *reports);
void RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode); void RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);

@ -5605,7 +5605,7 @@ void RE_make_sticky(Scene *scene, View3D *v3d)
} }
re= RE_NewRender("_make sticky_"); re= RE_NewRender("_make sticky_");
RE_InitState(re, NULL, &scene->r, scene->r.xsch, scene->r.ysch, NULL); RE_InitState(re, NULL, &scene->r, NULL, scene->r.xsch, scene->r.ysch, NULL);
/* use renderdata and camera to set viewplane */ /* use renderdata and camera to set viewplane */
RE_SetCamera(re, scene->camera); RE_SetCamera(re, scene->camera);

@ -127,7 +127,7 @@ static Render *envmap_render_copy(Render *re, EnvMap *env)
envre->r.size= 100; envre->r.size= 100;
envre->r.yasp= envre->r.xasp= 1; envre->r.yasp= envre->r.xasp= 1;
RE_InitState(envre, NULL, &envre->r, cuberes, cuberes, NULL); RE_InitState(envre, NULL, &envre->r, NULL, cuberes, cuberes, NULL);
envre->scene= re->scene; /* unsure about this... */ envre->scene= re->scene; /* unsure about this... */
/* view stuff in env render */ /* view stuff in env render */

@ -1114,13 +1114,6 @@ Render *RE_NewRender(const char *name)
BLI_rw_mutex_init(&re->resultmutex); BLI_rw_mutex_init(&re->resultmutex);
} }
/* prevent UI to draw old results */
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
RE_FreeRenderResult(re->result);
re->result= NULL;
re->result_ok= 0;
BLI_rw_mutex_unlock(&re->resultmutex);
/* set default empty callbacks */ /* set default empty callbacks */
re->display_init= result_nothing; re->display_init= result_nothing;
re->display_clear= result_nothing; re->display_clear= result_nothing;
@ -1169,7 +1162,7 @@ void RE_FreeAllRender(void)
/* what doesn't change during entire render sequence */ /* what doesn't change during entire render sequence */
/* disprect is optional, if NULL it assumes full window render */ /* disprect is optional, if NULL it assumes full window render */
void RE_InitState(Render *re, Render *source, RenderData *rd, int winx, int winy, rcti *disprect) void RE_InitState(Render *re, Render *source, RenderData *rd, SceneRenderLayer *srl, int winx, int winy, rcti *disprect)
{ {
re->ok= TRUE; /* maybe flag */ re->ok= TRUE; /* maybe flag */
@ -1195,62 +1188,70 @@ void RE_InitState(Render *re, Render *source, RenderData *rd, int winx, int winy
(re->rectx < 16 || re->recty < 16) )) { (re->rectx < 16 || re->recty < 16) )) {
re->error(re->erh, "Image too small"); re->error(re->erh, "Image too small");
re->ok= 0; re->ok= 0;
return;
}
#ifdef WITH_OPENEXR
if(re->r.scemode & R_FULL_SAMPLE)
re->r.scemode |= R_EXR_TILE_FILE; /* enable automatic */
#else
/* can't do this without openexr support */
re->r.scemode &= ~(R_EXR_TILE_FILE|R_FULL_SAMPLE);
#endif
/* fullsample wants uniform osa levels */
if(source && (re->r.scemode & R_FULL_SAMPLE)) {
/* but, if source has no full sample we disable it */
if((source->r.scemode & R_FULL_SAMPLE)==0)
re->r.scemode &= ~R_FULL_SAMPLE;
else
re->r.osa= re->osa= source->osa;
} }
else { else {
#ifdef WITH_OPENEXR /* check state variables, osa? */
if(re->r.scemode & R_FULL_SAMPLE) if(re->r.mode & (R_OSA)) {
re->r.scemode |= R_EXR_TILE_FILE; /* enable automatic */ re->osa= re->r.osa;
#else if(re->osa>16) re->osa= 16;
/* can't do this without openexr support */
re->r.scemode &= ~(R_EXR_TILE_FILE|R_FULL_SAMPLE);
#endif
/* fullsample wants uniform osa levels */
if(source && (re->r.scemode & R_FULL_SAMPLE)) {
/* but, if source has no full sample we disable it */
if((source->r.scemode & R_FULL_SAMPLE)==0)
re->r.scemode &= ~R_FULL_SAMPLE;
else
re->r.osa= re->osa= source->osa;
} }
else { else re->osa= 0;
/* check state variables, osa? */
if(re->r.mode & (R_OSA)) {
re->osa= re->r.osa;
if(re->osa>16) re->osa= 16;
}
else re->osa= 0;
}
/* always call, checks for gamma, gamma tables and jitter too */
make_sample_tables(re);
/* if preview render, we try to keep old result */
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
if(re->r.scemode & R_PREVIEWBUTS) {
if(re->result && re->result->rectx==re->rectx && re->result->recty==re->recty);
else {
RE_FreeRenderResult(re->result);
re->result= NULL;
}
}
else {
/* make empty render result, so display callbacks can initialize */
RE_FreeRenderResult(re->result);
re->result= MEM_callocN(sizeof(RenderResult), "new render result");
re->result->rectx= re->rectx;
re->result->recty= re->recty;
}
BLI_rw_mutex_unlock(&re->resultmutex);
/* we clip faces with a minimum of 2 pixel boundary outside of image border. see zbuf.c */
re->clipcrop= 1.0f + 2.0f/(float)(re->winx>re->winy?re->winy:re->winx);
RE_init_threadcount(re);
} }
if (srl) {
int index = BLI_findindex(&re->r.layers, srl);
if (index != -1) {
re->r.actlay = index;
re->r.scemode |= (R_SINGLE_LAYER|R_COMP_RERENDER);
}
}
/* always call, checks for gamma, gamma tables and jitter too */
make_sample_tables(re);
/* if preview render, we try to keep old result */
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
if(re->r.scemode & R_PREVIEWBUTS) {
if(re->result && re->result->rectx==re->rectx && re->result->recty==re->recty);
else {
RE_FreeRenderResult(re->result);
re->result= NULL;
}
}
else {
/* make empty render result, so display callbacks can initialize */
RE_FreeRenderResult(re->result);
re->result= MEM_callocN(sizeof(RenderResult), "new render result");
re->result->rectx= re->rectx;
re->result->recty= re->recty;
}
BLI_rw_mutex_unlock(&re->resultmutex);
/* we clip faces with a minimum of 2 pixel boundary outside of image border. see zbuf.c */
re->clipcrop= 1.0f + 2.0f/(float)(re->winx>re->winy?re->winy:re->winx);
RE_init_threadcount(re);
} }
/* part of external api, not called for regular render pipeline */ /* part of external api, not called for regular render pipeline */
@ -2156,7 +2157,7 @@ static void render_scene(Render *re, Scene *sce, int cfra)
} }
/* initial setup */ /* initial setup */
RE_InitState(resc, re, &sce->r, winx, winy, &re->disprect); RE_InitState(resc, re, &sce->r, NULL, winx, winy, &re->disprect);
/* still unsure entity this... */ /* still unsure entity this... */
resc->scene= sce; resc->scene= sce;
@ -2668,7 +2669,7 @@ static void update_physics_cache(Render *re, Scene *scene, int anim_init)
BKE_ptcache_make_cache(&baker); BKE_ptcache_make_cache(&baker);
} }
/* evaluating scene options for general Blender render */ /* evaluating scene options for general Blender render */
static int render_initialize_from_scene(Render *re, Scene *scene, int anim, int anim_init) static int render_initialize_from_scene(Render *re, Scene *scene, SceneRenderLayer *srl, int anim, int anim_init)
{ {
int winx, winy; int winx, winy;
rcti disprect; rcti disprect;
@ -2715,10 +2716,10 @@ static int render_initialize_from_scene(Render *re, Scene *scene, int anim, int
update_physics_cache(re, scene, anim_init); update_physics_cache(re, scene, anim_init);
} }
if(scene->r.scemode & R_SINGLE_LAYER) if(srl || scene->r.scemode & R_SINGLE_LAYER)
push_render_result(re); push_render_result(re);
RE_InitState(re, NULL, &scene->r, winx, winy, &disprect); RE_InitState(re, NULL, &scene->r, srl, winx, winy, &disprect);
if(!re->ok) /* if an error was printed, abort */ if(!re->ok) /* if an error was printed, abort */
return 0; return 0;
@ -2735,7 +2736,7 @@ static int render_initialize_from_scene(Render *re, Scene *scene, int anim, int
} }
/* general Blender frame render call */ /* general Blender frame render call */
void RE_BlenderFrame(Render *re, Scene *scene, int frame) void RE_BlenderFrame(Render *re, Scene *scene, SceneRenderLayer *srl, int frame)
{ {
/* ugly global still... is to prevent preview events and signal subsurfs etc to make full resol */ /* ugly global still... is to prevent preview events and signal subsurfs etc to make full resol */
G.rendering= 1; G.rendering= 1;
@ -2743,7 +2744,7 @@ void RE_BlenderFrame(Render *re, Scene *scene, int frame)
scene->r.cfra= frame; scene->r.cfra= frame;
if(render_initialize_from_scene(re, scene, 0, 0)) { if(render_initialize_from_scene(re, scene, srl, 0, 0)) {
do_render_all_options(re); do_render_all_options(re);
} }
@ -2838,7 +2839,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra, Repo
int nfra; int nfra;
/* do not fully call for each frame, it initializes & pops output window */ /* do not fully call for each frame, it initializes & pops output window */
if(!render_initialize_from_scene(re, scene, 0, 1)) if(!render_initialize_from_scene(re, scene, NULL, 0, 1))
return; return;
/* ugly global still... is to prevent renderwin events and signal subsurfs etc to make full resol */ /* ugly global still... is to prevent renderwin events and signal subsurfs etc to make full resol */
@ -2872,7 +2873,7 @@ void RE_BlenderAnim(Render *re, Scene *scene, int sfra, int efra, int tfra, Repo
char name[FILE_MAX]; char name[FILE_MAX];
/* only border now, todo: camera lens. (ton) */ /* only border now, todo: camera lens. (ton) */
render_initialize_from_scene(re, scene, 1, 0); render_initialize_from_scene(re, scene, NULL, 1, 0);
if(nfra!=scene->r.cfra) { if(nfra!=scene->r.cfra) {
/* /*
@ -2976,7 +2977,7 @@ void RE_ReadRenderResult(Scene *scene, Scene *scenode)
re= RE_GetRender(scene->id.name); re= RE_GetRender(scene->id.name);
if(re==NULL) if(re==NULL)
re= RE_NewRender(scene->id.name); re= RE_NewRender(scene->id.name);
RE_InitState(re, NULL, &scene->r, winx, winy, &disprect); RE_InitState(re, NULL, &scene->r, NULL, winx, winy, &disprect);
re->scene= scene; re->scene= scene;
read_render_result(re, 0); read_render_result(re, 0);