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:
Diffstat (limited to 'source/blender/freestyle/intern/blender_interface')
-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
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;
}