diff options
Diffstat (limited to 'source/blender/freestyle/intern/blender_interface')
3 files changed, 37 insertions, 20 deletions
diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp index dd75e4d0dd5..2d3fc20f929 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp +++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp @@ -64,6 +64,8 @@ namespace Freestyle { BlenderStrokeRenderer::BlenderStrokeRenderer(Render *re, int render_count) : StrokeRenderer() { + memset(&_freestyle_bmain, 0, sizeof(Main)); + // TEMPORARY - need a texture manager _textureManager = new BlenderTextureManager; _textureManager->load(); @@ -77,7 +79,7 @@ BlenderStrokeRenderer::BlenderStrokeRenderer(Render *re, int render_count) : Str char name[22]; BLI_snprintf(name, sizeof(name), "FRS%d_%s", render_count, re->scene->id.name + 2); - freestyle_scene = BKE_scene_add(G.main, name); + freestyle_scene = BKE_scene_add(&_freestyle_bmain, name); freestyle_scene->r.cfra = old_scene->r.cfra; freestyle_scene->r.mode = old_scene->r.mode & ~(R_EDGE_FRS | R_SHADOW | R_SSS | R_PANORAMA | R_ENVMAP | R_MBLUR | R_BORDER); @@ -120,10 +122,10 @@ BlenderStrokeRenderer::BlenderStrokeRenderer(Render *re, int render_count) : Str SceneRenderLayer *srl = (SceneRenderLayer *)freestyle_scene->r.layers.first; srl->layflag = SCE_LAY_SOLID | SCE_LAY_ZTRA; - BKE_scene_set_background(G.main, freestyle_scene); + BKE_scene_set_background(&_freestyle_bmain, freestyle_scene); // Camera - Object *object_camera = BKE_object_add(freestyle_scene, OB_CAMERA); + Object *object_camera = BKE_object_add(&_freestyle_bmain, freestyle_scene, OB_CAMERA); Camera *camera = (Camera *)object_camera->data; camera->type = CAM_ORTHO; @@ -144,7 +146,7 @@ BlenderStrokeRenderer::BlenderStrokeRenderer(Render *re, int render_count) : Str freestyle_scene->camera = object_camera; // Material - material = BKE_material_add(G.main, "stroke_material"); + material = BKE_material_add(&_freestyle_bmain, "stroke_material"); material->mode |= MA_VERTEXCOLP; material->mode |= MA_TRANSP; material->mode |= MA_SHLESS; @@ -178,12 +180,12 @@ BlenderStrokeRenderer::~BlenderStrokeRenderer() #endif switch (ob->type) { case OB_MESH: - BKE_libblock_free(&G.main->object, ob); - BKE_libblock_free(&G.main->mesh, data); + BKE_libblock_free(&_freestyle_bmain.object, ob); + BKE_libblock_free(&_freestyle_bmain.mesh, data); break; case OB_CAMERA: - BKE_libblock_free(&G.main->object, ob); - BKE_libblock_free(&G.main->camera, data); + BKE_libblock_free(&_freestyle_bmain.object, ob); + BKE_libblock_free(&_freestyle_bmain.camera, data); freestyle_scene->camera = NULL; break; default: @@ -193,9 +195,11 @@ BlenderStrokeRenderer::~BlenderStrokeRenderer() BLI_freelistN(&freestyle_scene->base); // release material - BKE_libblock_free(&G.main->mat, material); + BKE_libblock_free(&_freestyle_bmain.mat, material); + + //BKE_scene_set_background(&_freestyle_bmain, old_scene); - BKE_scene_set_background(G.main, old_scene); + BKE_scene_unlink(&_freestyle_bmain, freestyle_scene, NULL); } float BlenderStrokeRenderer::get_stroke_vertex_z(void) const @@ -279,7 +283,7 @@ void BlenderStrokeRenderer::RenderStrokeRepBasic(StrokeRep *iStrokeRep) const //me = Mesh.New() #if 0 - Object *object_mesh = BKE_object_add(freestyle_scene, OB_MESH); + Object *object_mesh = BKE_object_add(&_freestyle_bmain, freestyle_scene, OB_MESH); #else Object *object_mesh = NewMesh(); #endif @@ -294,7 +298,7 @@ void BlenderStrokeRenderer::RenderStrokeRepBasic(StrokeRep *iStrokeRep) const mesh->mat = (Material **)MEM_mallocN(1 * sizeof(Material *), "MaterialList"); mesh->mat[0] = material; mesh->totcol = 1; - test_object_materials((ID *)mesh); + test_object_materials((Main *) &_freestyle_bmain, (ID *)mesh); #else assign_material(object_mesh, material, object_mesh->totcol + 1); object_mesh->actcol = object_mesh->totcol; @@ -481,9 +485,9 @@ Object *BlenderStrokeRenderer::NewMesh() const /* XXX this is for later review, for now we start names with 27 (DEL) to allow ignoring them in DAG_ids_check_recalc() */ BLI_snprintf(name, MAX_ID_NAME, "%c0%08xOB", 27, mesh_id); - ob = BKE_object_add_only_object(G.main, OB_MESH, name); + ob = BKE_object_add_only_object((Main *) &_freestyle_bmain, OB_MESH, name); BLI_snprintf(name, MAX_ID_NAME, "%c0%08xME", 27, mesh_id); - ob->data = BKE_mesh_add(G.main, name); + ob->data = BKE_mesh_add((Main *) &_freestyle_bmain, name); ob->lay = 1; base = BKE_scene_base_add(freestyle_scene, ob); @@ -511,7 +515,7 @@ Render *BlenderStrokeRenderer::RenderScene(Render *re) Render *freestyle_render = RE_NewRender(freestyle_scene->id.name); - RE_RenderFreestyleStrokes(freestyle_render, G.main, freestyle_scene); + RE_RenderFreestyleStrokes(freestyle_render, &_freestyle_bmain, freestyle_scene); return freestyle_render; } diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h index f4af5e3aba0..4a80e8ce7e2 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h +++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h @@ -32,6 +32,8 @@ extern "C" { #include "DNA_material_types.h" #include "DNA_scene_types.h" +#include "BKE_main.h" + #include "render_types.h" } @@ -52,6 +54,7 @@ public: Render *RenderScene(Render *re); protected: + Main _freestyle_bmain; Scene *old_scene; Scene *freestyle_scene; Material *material; diff --git a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp index 56d12612dbc..5db258c23fd 100644 --- a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp +++ b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp @@ -212,11 +212,11 @@ static char *escape_quotes(char *name) return s; } -static Text *create_lineset_handler(char *layer_name, char *lineset_name) +static Text *create_lineset_handler(Main *bmain, char *layer_name, char *lineset_name) { char *s1 = escape_quotes(layer_name); char *s2 = escape_quotes(lineset_name); - Text *text = BKE_text_add(G.main, lineset_name); + Text *text = BKE_text_add(bmain, lineset_name); BKE_text_write(text, "import parameter_editor; parameter_editor.process('"); BKE_text_write(text, s1); BKE_text_write(text, "', '"); @@ -294,7 +294,7 @@ static bool test_edge_type_conditions(struct edge_type_condition *conditions, return true; } -static void prepare(Render *re, SceneRenderLayer *srl) +static void prepare(Main *bmain, Render *re, SceneRenderLayer *srl) { // load mesh re->i.infostr = "Freestyle: Mesh loading"; @@ -370,7 +370,7 @@ static void prepare(Render *re, SceneRenderLayer *srl) cout << " " << layer_count+1 << ": " << lineset->name << " - " << lineset->linestyle->id.name + 2 << endl; } - Text *text = create_lineset_handler(srl->name, lineset->name); + Text *text = create_lineset_handler(bmain, srl->name, lineset->name); controller->InsertStyleModule(layer_count, lineset->name, text); controller->toggleLayer(layer_count, true); if (!(lineset->selection & FREESTYLE_SEL_EDGE_TYPES) || !lineset->edge_types) { @@ -581,7 +581,9 @@ void FRS_init_stroke_rendering(Render *re) Render *FRS_do_stroke_rendering(Render *re, SceneRenderLayer *srl) { + Main bmain = {0}; Render *freestyle_render = NULL; + Text *text, *next_text; RenderMonitor monitor(re); controller->setRenderMonitor(&monitor); @@ -598,7 +600,7 @@ Render *FRS_do_stroke_rendering(Render *re, SceneRenderLayer *srl) // - add style modules // - set parameters // - compute view map - prepare(re, srl); + prepare(&bmain, re, srl); if (re->test_break(re->tbh)) { controller->CloseFile(); @@ -626,6 +628,14 @@ Render *FRS_do_stroke_rendering(Render *re, SceneRenderLayer *srl) freestyle_render->result = NULL; } + // Free temp main (currently only text blocks are stored there) + for (text = (Text *) bmain.text.first; text; text = next_text) { + next_text = (Text *) text->id.next; + + BKE_text_unlink(&bmain, text); + BKE_libblock_free(&bmain.text, text); + } + return freestyle_render; } |