Fix #31066: cycles keeps rendering in viewport after window closed.

This commit is contained in:
Brecht Van Lommel 2012-04-26 12:30:37 +00:00
parent 6d4841ba82
commit ec6c3f632e
3 changed files with 31 additions and 21 deletions

@ -37,6 +37,7 @@ struct MTex;
struct Render;
struct RenderInfo;
struct Scene;
struct ScrArea;
/* render_ops.c */
@ -46,6 +47,7 @@ void ED_operatortypes_render(void);
void ED_render_id_flush_update(struct Main *bmain, struct ID *id);
void ED_render_engine_changed(struct Main *bmain);
void ED_render_engine_area_exit(struct ScrArea *sa);
void ED_render_scene_update(struct Main *bmain, struct Scene *scene, int updated);
/* render_preview.c */

@ -116,33 +116,38 @@ void ED_render_scene_update(Main *bmain, Scene *scene, int updated)
CTX_free(C);
}
void ED_render_engine_area_exit(ScrArea *sa)
{
/* clear all render engines in this area */
ARegion *ar;
if (sa->spacetype != SPACE_VIEW3D)
return;
for (ar = sa->regionbase.first; ar; ar = ar->next) {
RegionView3D *rv3d;
if (ar->regiontype != RGN_TYPE_WINDOW)
continue;
rv3d = ar->regiondata;
if (rv3d->render_engine) {
RE_engine_free(rv3d->render_engine);
rv3d->render_engine = NULL;
}
}
}
void ED_render_engine_changed(Main *bmain)
{
/* on changing the render engine type, clear all running render engines */
bScreen *sc;
ScrArea *sa;
ARegion *ar;
for (sc = bmain->screen.first; sc; sc = sc->id.next) {
for (sa = sc->areabase.first; sa; sa = sa->next) {
if (sa->spacetype != SPACE_VIEW3D)
continue;
for (ar = sa->regionbase.first; ar; ar = ar->next) {
RegionView3D *rv3d;
if (ar->regiontype != RGN_TYPE_WINDOW)
continue;
rv3d = ar->regiondata;
if (rv3d->render_engine) {
RE_engine_free(rv3d->render_engine);
rv3d->render_engine = NULL;
}
}
}
}
for (sc = bmain->screen.first; sc; sc = sc->id.next)
for (sa = sc->areabase.first; sa; sa = sa->next)
ED_render_engine_area_exit(sa);
}
/***************************** Updates ***********************************

@ -1154,6 +1154,9 @@ void ED_area_exit(bContext *C, ScrArea *sa)
ED_fileselect_exit(C, (SpaceFile *)sl);
}
}
else if (sa->spacetype == SPACE_VIEW3D) {
ED_render_engine_area_exit(sa);
}
CTX_wm_area_set(C, sa);
for (ar= sa->regionbase.first; ar; ar= ar->next)