Fix crash on exit with Blender Internal baking and envmap render.
This commit is contained in:
@@ -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__ */
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user