Fix crash on exit with Blender Internal baking and envmap render.

This commit is contained in:
Brecht Van Lommel
2016-02-17 22:18:45 +01:00
parent 0eb54bd226
commit d40a24a037
5 changed files with 20 additions and 24 deletions

View File

@@ -41,6 +41,7 @@ struct RenderResult;
struct RenderLayer *render_get_active_layer(struct Render *re, struct RenderResult *rr);
float panorama_pixel_rot(struct Render *re);
void render_update_anim_renderdata(struct Render *re, struct RenderData *rd);
void render_copy_renderdata(struct RenderData *to, struct RenderData *from);
#endif /* __RENDERPIPELINE_H__ */

View File

@@ -5871,11 +5871,7 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay,
re->lay= lay;
/* renderdata setup and exceptions */
BLI_freelistN(&re->r.layers);
BLI_freelistN(&re->r.views);
re->r = scene->r;
BLI_duplicatelist(&re->r.layers, &scene->r.layers);
BLI_duplicatelist(&re->r.views, &scene->r.views);
render_copy_renderdata(&re->r, &scene->r);
RE_init_threadcount(re);

View File

@@ -56,7 +56,8 @@
/* this module */
#include "render_types.h"
#include "envmap.h"
#include "renderdatabase.h"
#include "renderdatabase.h"
#include "renderpipeline.h"
#include "texture.h"
#include "zbuf.h"
@@ -138,7 +139,7 @@ static Render *envmap_render_copy(Render *re, EnvMap *env)
envre->flag = re->flag;
/* set up renderdata */
envre->r = re->r;
render_copy_renderdata(&envre->r, &re->r);
envre->r.mode &= ~(R_BORDER | R_PANORAMA | R_ORTHO | R_MBLUR);
BLI_listbase_clear(&envre->r.layers);
BLI_listbase_clear(&envre->r.views);

View File

@@ -452,18 +452,9 @@ RenderData *RE_engine_get_render_data(Render *re)
/* Bake */
void RE_bake_engine_set_engine_parameters(Render *re, Main *bmain, Scene *scene)
{
curvemapping_free_data(&re->r.mblur_shutter_curve);
re->scene = scene;
re->main = bmain;
re->r = scene->r;
/* prevent crash when freeing the scene
* but it potentially leaves unfreed memory blocks
* not sure how to fix this yet -- dfelinto */
BLI_listbase_clear(&re->r.layers);
BLI_listbase_clear(&re->r.views);
curvemapping_copy_data(&re->r.mblur_shutter_curve, &scene->r.mblur_shutter_curve);
render_copy_renderdata(&re->r, &scene->r);
}
bool RE_bake_has_engine(Render *re)

View File

@@ -684,6 +684,19 @@ static void re_init_resolution(Render *re, Render *source,
re->clipcrop = 1.0f + 2.0f / (float)(re->winx > re->winy ? re->winy : re->winx);
}
void render_copy_renderdata(RenderData *to, RenderData *from)
{
BLI_freelistN(&to->layers);
BLI_freelistN(&to->views);
curvemapping_free_data(&to->mblur_shutter_curve);
*to = *from;
BLI_duplicatelist(&to->layers, &from->layers);
BLI_duplicatelist(&to->views, &from->views);
curvemapping_copy_data(&to->mblur_shutter_curve, &from->mblur_shutter_curve);
}
/* what doesn't change during entire render sequence */
/* disprect is optional, if NULL it assumes full window render */
void RE_InitState(Render *re, Render *source, RenderData *rd,
@@ -697,13 +710,7 @@ void RE_InitState(Render *re, Render *source, RenderData *rd,
re->i.starttime = PIL_check_seconds_timer();
/* copy render data and render layers for thread safety */
BLI_freelistN(&re->r.layers);
BLI_freelistN(&re->r.views);
curvemapping_free_data(&re->r.mblur_shutter_curve);
re->r = *rd;
BLI_duplicatelist(&re->r.layers, &rd->layers);
BLI_duplicatelist(&re->r.views, &rd->views);
curvemapping_copy_data(&re->r.mblur_shutter_curve, &rd->mblur_shutter_curve);
render_copy_renderdata(&re->r, rd);
if (source) {
/* reuse border flags from source renderer */