Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2013-04-18 12:58:21 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2013-04-18 12:58:21 +0400
commit4df0c46f838f7c316b10a6667705c093f067cadd (patch)
tree9620cb8dbe215e30a3738509bed50408bca2452d /source/blender/freestyle/intern
parent093f95afaa4a08d2cf194b88803a35ef16cfec58 (diff)
Make freestyle use local Main for temporary objects
This means main database is no longer pollutes with temporary scene and objects needed for freestyle render. Actually, there're few of separated temporary mains now. Ideally it's better to use single one, but it's not so much trivial to pass it to all classes. Not so big deal actually. Required some changes to blender kernel, to make it possible to add object to a given main, also to check on mesh materials for objects in given main. This is all straightforward changes. As an additional, solved issue with main database being infinitely polluted with text blocks created by create_lineset_handler function. This fixes: - #35003: Freestyle crashes if user expands objects in FRS1_Scene - #35012: ctrl+f12 rendering crashes when using Freestyle
Diffstat (limited to 'source/blender/freestyle/intern')
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp34
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h3
-rw-r--r--source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp20
-rw-r--r--source/blender/freestyle/intern/system/PythonInterpreter.h13
4 files changed, 44 insertions, 26 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;
}
diff --git a/source/blender/freestyle/intern/system/PythonInterpreter.h b/source/blender/freestyle/intern/system/PythonInterpreter.h
index c54546b3ddd..7c271252a32 100644
--- a/source/blender/freestyle/intern/system/PythonInterpreter.h
+++ b/source/blender/freestyle/intern/system/PythonInterpreter.h
@@ -83,11 +83,11 @@ public:
int status = BPY_filepath_exec(_context, fn, reports);
#else
int status;
- Text *text = BKE_text_load(G.main, fn, G.main->name);
+ Text *text = BKE_text_load(&_freestyle_bmain, fn, G.main->name);
if (text) {
status = BPY_text_exec(_context, text, reports, false);
- BKE_text_unlink(G.main, text);
- BKE_libblock_free(&G.main->text, text);
+ BKE_text_unlink(&_freestyle_bmain, text);
+ BKE_libblock_free(&_freestyle_bmain.text, text);
}
else {
BKE_reportf(reports, RPT_ERROR, "Cannot open file: %s", fn);
@@ -151,6 +151,7 @@ public:
private:
bContext *_context;
+ Main _freestyle_bmain;
void initPath()
{
@@ -160,7 +161,7 @@ private:
vector<string> pathnames;
StringUtils::getPathName(_path, "", pathnames);
- struct Text *text = BKE_text_add(G.main, "tmp_freestyle_initpath.txt");
+ struct Text *text = BKE_text_add(&_freestyle_bmain, "tmp_freestyle_initpath.txt");
string cmd = "import sys\n";
txt_insert_buf(text, const_cast<char*>(cmd.c_str()));
@@ -177,8 +178,8 @@ private:
BPY_text_exec(_context, text, NULL, false);
// cleaning up
- BKE_text_unlink(G.main, text);
- BKE_libblock_free(&G.main->text, text);
+ BKE_text_unlink(&_freestyle_bmain, text);
+ BKE_libblock_free(&_freestyle_bmain.text, text);
//PyRun_SimpleString("from Freestyle import *");
_initialized = true;