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:
-rw-r--r--source/blender/blenkernel/BKE_material.h2
-rw-r--r--source/blender/blenkernel/BKE_object.h4
-rw-r--r--source/blender/blenkernel/intern/material.c12
-rw-r--r--source/blender/blenkernel/intern/mesh.c2
-rw-r--r--source/blender/blenkernel/intern/object.c28
-rw-r--r--source/blender/collada/collada_utils.cpp2
-rw-r--r--source/blender/editors/curve/editfont.c4
-rw-r--r--source/blender/editors/mesh/meshtools.c2
-rw-r--r--source/blender/editors/object/object_add.c2
-rw-r--r--source/blender/editors/object/object_constraint.c3
-rw-r--r--source/blender/editors/object/object_hook.c6
-rw-r--r--source/blender/editors/object/object_modifier.c9
-rw-r--r--source/blender/editors/object/object_relations.c4
-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
-rw-r--r--source/blender/makesrna/intern/rna_main_api.c4
-rw-r--r--source/blender/makesrna/intern/rna_object.c3
-rw-r--r--source/blender/render/intern/source/pipeline.c9
20 files changed, 93 insertions, 73 deletions
diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h
index 0bcbbb8576a..7c47380f838 100644
--- a/source/blender/blenkernel/BKE_material.h
+++ b/source/blender/blenkernel/BKE_material.h
@@ -49,7 +49,7 @@ struct Scene;
void init_def_material(void);
void BKE_material_free(struct Material *sc);
void BKE_material_free_ex(struct Material *ma, int do_id_user);
-void test_object_materials(struct ID *id);
+void test_object_materials(struct Main *bmain, struct ID *id);
void resize_object_material(struct Object *ob, const short totcol);
void init_material(struct Material *ma);
struct Material *BKE_material_add(struct Main *bmain, const char *name);
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index da5fa3e8195..8870355a919 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -81,8 +81,8 @@ bool BKE_object_exists_check(struct Object *obtest);
bool BKE_object_is_in_editmode(struct Object *ob);
struct Object *BKE_object_add_only_object(struct Main *bmain, int type, const char *name);
-struct Object *BKE_object_add(struct Scene *scene, int type);
-void *BKE_object_obdata_add_from_type(int type);
+struct Object *BKE_object_add(struct Main *bmain, struct Scene *scene, int type);
+void *BKE_object_obdata_add_from_type(struct Main *bmain, int type);
struct Object *BKE_object_copy_ex(struct Main *bmain, struct Object *ob, int copy_caches);
struct Object *BKE_object_copy(struct Object *ob);
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index a4f147a4fac..7e70b9d9cd5 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -568,7 +568,7 @@ void material_append_id(ID *id, Material *ma)
(*matar)[(*totcol)++] = ma;
id_us_plus((ID *)ma);
- test_object_materials(id);
+ test_object_materials(G.main, id);
}
}
@@ -601,7 +601,7 @@ Material *material_pop_id(ID *id, int index_i, int remove_material_slot)
MEM_freeN(*matar);
*matar = mat;
- test_object_materials(id);
+ test_object_materials(G.main, id);
}
/* decrease mat_nr index */
@@ -712,7 +712,7 @@ void resize_object_material(Object *ob, const short totcol)
if (ob->actcol > ob->totcol) ob->actcol = ob->totcol;
}
-void test_object_materials(ID *id)
+void test_object_materials(Main *bmain, ID *id)
{
/* make the ob mat-array same size as 'ob->data' mat-array */
Object *ob;
@@ -722,7 +722,7 @@ void test_object_materials(ID *id)
return;
}
- for (ob = G.main->object.first; ob; ob = ob->id.next) {
+ for (ob = bmain->object.first; ob; ob = ob->id.next) {
if (ob->data == id) {
resize_object_material(ob, *totcol);
}
@@ -768,7 +768,7 @@ void assign_material_id(ID *id, Material *ma, short act)
if (ma)
id_us_plus((ID *)ma);
- test_object_materials(id);
+ test_object_materials(G.main, id);
}
void assign_material(Object *ob, Material *ma, short act, int assign_type)
@@ -855,7 +855,7 @@ void assign_material(Object *ob, Material *ma, short act, int assign_type)
if (ma)
id_us_plus((ID *)ma);
- test_object_materials(ob->data);
+ test_object_materials(G.main, ob->data);
}
/* XXX - this calls many more update calls per object then are needed, could be optimized */
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 31c2758795d..0d662711df0 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -841,7 +841,7 @@ void BKE_mesh_assign_object(Object *ob, Mesh *me)
id_us_plus((ID *)me);
}
- test_object_materials((ID *)me);
+ test_object_materials(G.main, (ID *)me);
test_object_modifiers(ob);
}
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 538cead5d5b..fb950b180a9 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -845,19 +845,19 @@ bool BKE_object_exists_check(Object *obtest)
/* *************************************************** */
-void *BKE_object_obdata_add_from_type(int type)
+void *BKE_object_obdata_add_from_type(Main *bmain, int type)
{
switch (type) {
- case OB_MESH: return BKE_mesh_add(G.main, "Mesh");
- case OB_CURVE: return BKE_curve_add(G.main, "Curve", OB_CURVE);
- case OB_SURF: return BKE_curve_add(G.main, "Surf", OB_SURF);
- case OB_FONT: return BKE_curve_add(G.main, "Text", OB_FONT);
- case OB_MBALL: return BKE_mball_add(G.main, "Meta");
- case OB_CAMERA: return BKE_camera_add(G.main, "Camera");
- case OB_LAMP: return BKE_lamp_add(G.main, "Lamp");
- case OB_LATTICE: return BKE_lattice_add(G.main, "Lattice");
- case OB_ARMATURE: return BKE_armature_add(G.main, "Armature");
- case OB_SPEAKER: return BKE_speaker_add(G.main, "Speaker");
+ case OB_MESH: return BKE_mesh_add(bmain, "Mesh");
+ case OB_CURVE: return BKE_curve_add(bmain, "Curve", OB_CURVE);
+ case OB_SURF: return BKE_curve_add(bmain, "Surf", OB_SURF);
+ case OB_FONT: return BKE_curve_add(bmain, "Text", OB_FONT);
+ case OB_MBALL: return BKE_mball_add(bmain, "Meta");
+ case OB_CAMERA: return BKE_camera_add(bmain, "Camera");
+ case OB_LAMP: return BKE_lamp_add(bmain, "Lamp");
+ case OB_LATTICE: return BKE_lattice_add(bmain, "Lattice");
+ case OB_ARMATURE: return BKE_armature_add(bmain, "Armature");
+ case OB_SPEAKER: return BKE_speaker_add(bmain, "Speaker");
case OB_EMPTY: return NULL;
default:
printf("BKE_object_obdata_add_from_type: Internal error, bad type: %d\n", type);
@@ -972,16 +972,16 @@ Object *BKE_object_add_only_object(Main *bmain, int type, const char *name)
/* general add: to scene, with layer from area and default name */
/* creates minimum required data, but without vertices etc. */
-Object *BKE_object_add(struct Scene *scene, int type)
+Object *BKE_object_add(Main *bmain, Scene *scene, int type)
{
Object *ob;
Base *base;
char name[MAX_ID_NAME];
BLI_strncpy(name, get_obdata_defname(type), sizeof(name));
- ob = BKE_object_add_only_object(G.main, type, name);
+ ob = BKE_object_add_only_object(bmain, type, name);
- ob->data = BKE_object_obdata_add_from_type(type);
+ ob->data = BKE_object_obdata_add_from_type(bmain, type);
ob->lay = scene->lay;
diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp
index 9aa1f7b9714..6a18ac09615 100644
--- a/source/blender/collada/collada_utils.cpp
+++ b/source/blender/collada/collada_utils.cpp
@@ -129,7 +129,7 @@ Object *bc_add_object(Scene *scene, int type, const char *name)
{
Object *ob = BKE_object_add_only_object(G.main, type, name);
- ob->data = BKE_object_obdata_add_from_type(type);
+ ob->data = BKE_object_obdata_add_from_type(G.main, type);
ob->lay = scene->lay;
DAG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME);
diff --git a/source/blender/editors/curve/editfont.c b/source/blender/editors/curve/editfont.c
index 16e7e0fde4a..f990afcc044 100644
--- a/source/blender/editors/curve/editfont.c
+++ b/source/blender/editors/curve/editfont.c
@@ -56,6 +56,7 @@
#include "BKE_depsgraph.h"
#include "BKE_font.h"
#include "BKE_library.h"
+#include "BKE_main.h"
#include "BKE_object.h"
#include "BKE_report.h"
@@ -439,6 +440,7 @@ void FONT_OT_file_paste(wmOperatorType *ot)
static void txt_add_object(bContext *C, TextLine *firstline, int totline, float offset[3])
{
+ Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
Curve *cu;
Object *obedit;
@@ -447,7 +449,7 @@ static void txt_add_object(bContext *C, TextLine *firstline, int totline, float
int nchars = 0, a;
float rot[3] = {0.f, 0.f, 0.f};
- obedit = BKE_object_add(scene, OB_FONT);
+ obedit = BKE_object_add(bmain, scene, OB_FONT);
base = scene->basact;
/* seems to assume view align ? TODO - look into this, could be an operator option */
diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c
index 9e70fe550bc..efc4acd7c4f 100644
--- a/source/blender/editors/mesh/meshtools.c
+++ b/source/blender/editors/mesh/meshtools.c
@@ -537,7 +537,7 @@ int join_mesh_exec(bContext *C, wmOperator *op)
if (matmap) MEM_freeN(matmap);
/* other mesh users */
- test_object_materials((ID *)me);
+ test_object_materials(bmain, (ID *)me);
/* free temp copy of destination shapekeys (if applicable) */
if (nkey) {
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 7ededa50a15..ffdfe053127 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -376,7 +376,7 @@ Object *ED_object_add_type(bContext *C, int type, const float loc[3], const floa
ED_object_editmode_exit(C, EM_FREEDATA | EM_FREEUNDO | EM_WAITCURSOR | EM_DO_UNDO); /* freedata, and undo */
/* deselects all, sets scene->basact */
- ob = BKE_object_add(scene, type);
+ ob = BKE_object_add(bmain, scene, type);
BASACT->lay = ob->lay = layer;
/* editor level activate, notifiers */
ED_base_object_activate(C, BASACT);
diff --git a/source/blender/editors/object/object_constraint.c b/source/blender/editors/object/object_constraint.c
index 3e66c4ca110..2ba5fb24292 100644
--- a/source/blender/editors/object/object_constraint.c
+++ b/source/blender/editors/object/object_constraint.c
@@ -1572,12 +1572,13 @@ static short get_new_constraint_target(bContext *C, int con_type, Object **tar_o
/* if still not found, add a new empty to act as a target (if allowed) */
if ((found == 0) && (add)) {
+ Main *bmain = CTX_data_main(C);
Scene *scene = CTX_data_scene(C);
Base *base = BASACT, *newbase = NULL;
Object *obt;
/* add new target object */
- obt = BKE_object_add(scene, OB_EMPTY);
+ obt = BKE_object_add(bmain, scene, OB_EMPTY);
/* set layers OK */
newbase = BASACT;
diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c
index e3a679e8bc3..69ad3f3225f 100644
--- a/source/blender/editors/object/object_hook.c
+++ b/source/blender/editors/object/object_hook.c
@@ -438,12 +438,12 @@ static int hook_op_edit_poll(bContext *C)
return 0;
}
-static Object *add_hook_object_new(Scene *scene, Object *obedit)
+static Object *add_hook_object_new(Main *bmain, Scene *scene, Object *obedit)
{
Base *base, *basedit;
Object *ob;
- ob = BKE_object_add(scene, OB_EMPTY);
+ ob = BKE_object_add(bmain, scene, OB_EMPTY);
basedit = BKE_scene_base_find(scene, obedit);
base = BKE_scene_base_find(scene, ob);
@@ -473,7 +473,7 @@ static int add_hook_object(Main *bmain, Scene *scene, Object *obedit, Object *ob
if (mode == OBJECT_ADDHOOK_NEWOB && !ob) {
- ob = add_hook_object_new(scene, obedit);
+ ob = add_hook_object_new(bmain, scene, obedit);
/* transform cent to global coords for loc */
mul_v3_m4v3(ob->loc, obedit->obmat, cent);
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index e89c581a7b6..7d9feec6d78 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -464,7 +464,7 @@ int ED_object_modifier_convert(ReportList *UNUSED(reports), Main *bmain, Scene *
if (totvert == 0) return 0;
/* add new mesh */
- obn = BKE_object_add(scene, OB_MESH);
+ obn = BKE_object_add(bmain, scene, OB_MESH);
me = obn->data;
me->totvert = totvert;
@@ -1721,8 +1721,7 @@ static void skin_armature_bone_create(Object *skin_ob,
}
}
-static Object *modifier_skin_armature_create(struct Scene *scene,
- Object *skin_ob)
+static Object *modifier_skin_armature_create(Main *bmain, Scene *scene, Object *skin_ob)
{
BLI_bitmap edges_visited;
DerivedMesh *deform_dm;
@@ -1745,7 +1744,7 @@ static Object *modifier_skin_armature_create(struct Scene *scene,
NULL,
me->totvert);
- arm_ob = BKE_object_add(scene, OB_ARMATURE);
+ arm_ob = BKE_object_add(bmain, scene, OB_ARMATURE);
BKE_object_transform_copy(arm_ob, skin_ob);
arm = arm_ob->data;
arm->layer = 1;
@@ -1815,7 +1814,7 @@ static int skin_armature_create_exec(bContext *C, wmOperator *op)
}
/* create new armature */
- arm_ob = modifier_skin_armature_create(scene, ob);
+ arm_ob = modifier_skin_armature_create(bmain, scene, ob);
/* add a modifier to connect the new armature to the mesh */
arm_md = (ArmatureModifierData *)modifier_new(eModifierType_Armature);
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index 9ed57adf207..9838c99a81b 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -344,7 +344,7 @@ static int make_proxy_exec(bContext *C, wmOperator *op)
char name[MAX_ID_NAME + 4];
/* Add new object for the proxy */
- newob = BKE_object_add(scene, OB_EMPTY);
+ newob = BKE_object_add(bmain, scene, OB_EMPTY);
BLI_snprintf(name, sizeof(name), "%s_proxy", ((ID *)(gob ? gob : ob))->name + 2);
@@ -1459,7 +1459,7 @@ static int make_links_data_exec(bContext *C, wmOperator *op)
ob_dst->data = id;
/* if amount of material indices changed: */
- test_object_materials(ob_dst->data);
+ test_object_materials(bmain, ob_dst->data);
DAG_id_tag_update(&ob_dst->id, OB_RECALC_DATA);
break;
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;
diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c
index b9fb269638a..5d554f4393c 100644
--- a/source/blender/makesrna/intern/rna_main_api.c
+++ b/source/blender/makesrna/intern/rna_main_api.c
@@ -198,7 +198,7 @@ static Object *rna_Main_objects_new(Main *bmain, ReportList *reports, const char
id_us_min(&ob->id);
ob->data = data;
- test_object_materials(ob->data);
+ test_object_materials(bmain, ob->data);
return ob;
}
@@ -465,7 +465,7 @@ Mesh *rna_Main_meshes_new_from_object(
}
/* make sure materials get updated in objects */
- test_object_materials(&tmpmesh->id);
+ test_object_materials(bmain, &tmpmesh->id);
return tmpmesh;
}
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index 0eb7ab8e581..c611e0fdd94 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -181,6 +181,7 @@ EnumPropertyItem object_axis_items[] = {
#include "BKE_curve.h"
#include "BKE_depsgraph.h"
#include "BKE_effect.h"
+#include "BKE_global.h"
#include "BKE_key.h"
#include "BKE_object.h"
#include "BKE_material.h"
@@ -396,7 +397,7 @@ static void rna_Object_data_set(PointerRNA *ptr, PointerRNA value)
}
ob->data = id;
- test_object_materials(id);
+ test_object_materials(G.main, id);
if (GS(id->name) == ID_CU)
BKE_curve_type_test(ob);
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 7f2c3b5ad04..4e9d185becf 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -1058,7 +1058,7 @@ static void threaded_tile_processor(Render *re)
#ifdef WITH_FREESTYLE
static void add_freestyle(Render *re);
-static void free_all_freestyle_renders(Scene *scene);
+static void free_all_freestyle_renders(void);
#endif
/* currently only called by preview renders and envmap */
@@ -1075,7 +1075,7 @@ void RE_TileProcessor(Render *re)
if (!re->test_break(re->tbh)) {
add_freestyle(re);
- free_all_freestyle_renders(re->scene);
+ free_all_freestyle_renders();
re->i.lastframetime = PIL_check_seconds_timer() - re->i.starttime;
re->stats_draw(re->sdh, &re->i);
@@ -1653,7 +1653,7 @@ static void composite_freestyle_renders(Render *re, int sample)
}
/* releases temporary scenes and renders for Freestyle stroke rendering */
-static void free_all_freestyle_renders(Scene *scene)
+static void free_all_freestyle_renders(void)
{
Render *re1, *freestyle_render;
LinkData *link;
@@ -1662,7 +1662,6 @@ static void free_all_freestyle_renders(Scene *scene)
for (link = (LinkData *)re1->freestyle_renders.first; link; link = link->next) {
if (link->data) {
freestyle_render = (Render *)link->data;
- BKE_scene_unlink(G.main, freestyle_render->scene, scene);
RE_FreeRender(freestyle_render);
}
}
@@ -1918,7 +1917,7 @@ static void do_render_composite_fields_blur_3d(Render *re)
}
#ifdef WITH_FREESTYLE
- free_all_freestyle_renders(re->scene);
+ free_all_freestyle_renders();
#endif
/* weak... the display callback wants an active renderlayer pointer... */