[Bf-blender-cvs] [087ee57] experimental-build: Bake-API: reduce memory footprint when baking more than one object [test build]

Dalai Felinto noreply at git.blender.org
Tue Feb 10 18:07:30 CET 2015


Commit: 087ee57dbaa2f90354f985cfc3b8320c1ce3df90
Author: Dalai Felinto
Date:   Tue Feb 10 15:06:30 2015 -0200
Branches: experimental-build
https://developer.blender.org/rB087ee57dbaa2f90354f985cfc3b8320c1ce3df90

Bake-API: reduce memory footprint when baking more than one object [test
build]

===================================================================

M	intern/cycles/blender/blender_session.cpp
M	source/blender/editors/object/object_bake_api.c
M	source/blender/makesrna/intern/rna_render.c
M	source/blender/render/extern/include/RE_bake.h
M	source/blender/render/intern/include/render_types.h
M	source/blender/render/intern/source/bake_api.c
M	source/blender/render/intern/source/external_engine.c
M	source/blenderplayer/bad_level_call_stubs/stubs.c

===================================================================

diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index eb3f54a..5835cc8 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -498,13 +498,13 @@ void BlenderSession::render()
 	sync = NULL;
 }
 
-static void populate_bake_data(BakeData *data, BL::BakePixel pixel_array, const int num_pixels)
+static void populate_bake_data(BL::RenderEngine b_engine, BakeData *data, BL::BakePixel pixel_array, const int num_pixels)
 {
 	BL::BakePixel bp = pixel_array;
 
 	int i;
 	for(i=0; i < num_pixels; i++) {
-		data->set(i, bp.primitive_id(), bp.uv(), bp.du_dx(), bp.du_dy(), bp.dv_dx(), bp.dv_dy());
+		data->set(i, bp.primitive_id(b_engine), bp.uv(), bp.du_dx(), bp.du_dy(), bp.dv_dx(), bp.dv_dy());
 		bp = bp.next();
 	}
 }
@@ -565,7 +565,7 @@ void BlenderSession::bake(BL::Object b_object, const string& pass_type, BL::Bake
 
 	BakeData *bake_data = scene->bake_manager->init(object, tri_offset, num_pixels);
 
-	populate_bake_data(bake_data, pixel_array, num_pixels);
+	populate_bake_data(b_engine, bake_data, pixel_array, num_pixels);
 
 	/* set number of samples */
 	session->tile_manager.set_samples(session_params.samples);
diff --git a/source/blender/editors/object/object_bake_api.c b/source/blender/editors/object/object_bake_api.c
index fca527f..344d3bd 100644
--- a/source/blender/editors/object/object_bake_api.c
+++ b/source/blender/editors/object/object_bake_api.c
@@ -571,6 +571,7 @@ static int bake(
 	float *result = NULL;
 
 	BakePixel *pixel_array_low = NULL;
+	BakePixel *pixel_array_high = NULL;
 
 	const bool is_save_internal = (save_mode == R_BAKE_SAVE_INTERNAL);
 	const bool is_noncolor = is_noncolor_pass(pass_type);
@@ -679,6 +680,7 @@ static int bake(
 	}
 
 	pixel_array_low = MEM_mallocN(sizeof(BakePixel) * num_pixels, "bake pixels low poly");
+	pixel_array_high = MEM_mallocN(sizeof(BakePixel) * num_pixels, "bake pixels high poly");
 	result = MEM_callocN(sizeof(float) * depth * num_pixels, "bake return pixels");
 
 	/* get the mesh as it arrives in the renderer */
@@ -746,8 +748,6 @@ static int bake(
 			/* initialize highpoly_data */
 			highpoly[i].ob = ob_iter;
 			highpoly[i].restrict_flag = ob_iter->restrictflag;
-			highpoly[i].pixel_array = MEM_mallocN(sizeof(BakePixel) * num_pixels, "bake pixels high poly");
-
 
 			/* triangulating so BVH returns the primitive_id that will be used for rendering */
 			highpoly[i].tri_mod = ED_object_modifier_add(
@@ -779,7 +779,7 @@ static int bake(
 
 		/* populate the pixel arrays with the corresponding face data for each high poly object */
 		if (!RE_bake_pixels_populate_from_objects(
-		            me_low, pixel_array_low, highpoly, tot_highpoly, num_pixels, ob_cage != NULL,
+		            me_low, pixel_array_low, pixel_array_high, highpoly, tot_highpoly, num_pixels, ob_cage != NULL,
 		            cage_extrusion, ob_low->obmat, (ob_cage ? ob_cage->obmat : ob_low->obmat), me_cage))
 		{
 			BKE_report(reports, RPT_ERROR, "Error handling selected objects");
@@ -788,7 +788,8 @@ static int bake(
 
 		/* the baking itself */
 		for (i = 0; i < tot_highpoly; i++) {
-			ok = RE_bake_engine(re, highpoly[i].ob, highpoly[i].pixel_array, num_pixels,
+			RE_bake_object_id_set(re, i);
+			ok = RE_bake_engine(re, highpoly[i].ob, pixel_array_high, num_pixels,
 			                    depth, pass_type, result);
 			if (!ok) {
 				BKE_reportf(reports, RPT_ERROR, "Error baking from object \"%s\"", highpoly[i].ob->id.name + 2);
@@ -815,6 +816,7 @@ cage_cleanup:
 		ob_low->restrictflag &= ~OB_RESTRICT_RENDER;
 
 		if (RE_bake_has_engine(re)) {
+			RE_bake_object_id_set(re, 0);
 			ok = RE_bake_engine(re, ob_low, pixel_array_low, num_pixels, depth, pass_type, result);
 		}
 		else {
@@ -977,9 +979,6 @@ cleanup:
 		for (i = 0; i < tot_highpoly; i++) {
 			highpoly[i].ob->restrictflag = highpoly[i].restrict_flag;
 
-			if (highpoly[i].pixel_array)
-				MEM_freeN(highpoly[i].pixel_array);
-
 			if (highpoly[i].tri_mod)
 				ED_object_modifier_remove(reports, bmain, highpoly[i].ob, highpoly[i].tri_mod);
 
@@ -997,6 +996,9 @@ cleanup:
 	if (pixel_array_low)
 		MEM_freeN(pixel_array_low);
 
+	if (pixel_array_high)
+		MEM_freeN(pixel_array_high);
+
 	if (bake_images.data)
 		MEM_freeN(bake_images.data);
 
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index 124a83a..67e0ba7 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -31,6 +31,8 @@
 #include "BLI_utildefines.h"
 #include "BLI_path_util.h"
 
+#include "BKE_global.h"
+
 #include "RNA_define.h"
 #include "RNA_enum_types.h"
 
@@ -384,6 +386,14 @@ static PointerRNA rna_BakePixel_next_get(PointerRNA *ptr)
 	return rna_pointer_inherit_refine(ptr, &RNA_BakePixel, bp + 1);
 }
 
+static int rna_BakePixel_primitive_id_get(BakePixel *bp, RenderEngine *engine)
+{
+	if (RE_bake_object_id_get(engine->re) == bp->object_id)
+		return bp->primitive_id;
+	else
+		return -1;
+}
+
 #else /* RNA_RUNTIME */
 
 static void rna_def_render_engine(BlenderRNA *brna)
@@ -740,16 +750,14 @@ static void rna_def_render_bake_pixel(BlenderRNA *brna)
 {
 	StructRNA *srna;
 	PropertyRNA *prop;
+	FunctionRNA *func;
+	PropertyRNA *parm;
 
 	srna = RNA_def_struct(brna, "BakePixel", NULL);
 	RNA_def_struct_ui_text(srna, "Bake Pixel", "");
 
 	RNA_define_verify_sdna(0);
 
-	prop = RNA_def_property(srna, "primitive_id", PROP_INT, PROP_NONE);
-	RNA_def_property_int_sdna(prop, NULL, "primitive_id");
-	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-
 	prop = RNA_def_property(srna, "uv", PROP_FLOAT, PROP_NONE);
 	RNA_def_property_array(prop, 2);
 	RNA_def_property_float_sdna(prop, NULL, "uv");
@@ -776,6 +784,12 @@ static void rna_def_render_bake_pixel(BlenderRNA *brna)
 	RNA_def_property_pointer_funcs(prop, "rna_BakePixel_next_get", NULL, NULL, NULL);
 	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 
+	func = RNA_def_function(srna, "primitive_id", "rna_BakePixel_primitive_id_get");
+	RNA_def_function_ui_description(func, "Get the primitive id for the current Bake Pixel");
+	parm = RNA_def_pointer(func, "engine", "RenderEngine", "", "Render Engine");
+	parm = RNA_def_int(func, "object_id", 0, -1, INT_MAX, "Object ID", "", -1, INT_MAX);
+	RNA_def_function_return(func, parm);
+
 	RNA_define_verify_sdna(1);
 }
 
diff --git a/source/blender/render/extern/include/RE_bake.h b/source/blender/render/extern/include/RE_bake.h
index 481da45..518a1fc 100644
--- a/source/blender/render/extern/include/RE_bake.h
+++ b/source/blender/render/extern/include/RE_bake.h
@@ -49,14 +49,13 @@ typedef struct BakeImages {
 } BakeImages;
 
 typedef struct BakePixel {
-	int primitive_id;
+	int primitive_id, object_id;
 	float uv[2];
 	float du_dx, du_dy;
 	float dv_dx, dv_dy;
 } BakePixel;
 
 typedef struct BakeHighPolyData {
-	struct BakePixel *pixel_array;
 	struct Object *ob;
 	struct ModifierData *tri_mod;
 	struct Mesh *me;
@@ -69,6 +68,8 @@ typedef struct BakeHighPolyData {
 
 /* external_engine.c */
 bool RE_bake_has_engine(struct Render *re);
+void RE_bake_object_id_set(struct Render *re, int object_id);
+int RE_bake_object_id_get(struct Render *re);
 
 bool RE_bake_engine(
         struct Render *re, struct Object *object, const BakePixel pixel_array[],
@@ -81,7 +82,7 @@ bool RE_bake_internal(
         const size_t num_pixels, const int depth, const ScenePassType pass_type, float result[]);
 
 bool RE_bake_pixels_populate_from_objects(
-        struct Mesh *me_low, BakePixel pixel_array_from[],
+        struct Mesh *me_low, BakePixel pixel_array_from[], BakePixel pixel_array_to[],
         BakeHighPolyData highpoly[], const int tot_highpoly, const size_t num_pixels, const bool is_custom_cage,
         const float cage_extrusion, float mat_low[4][4], float mat_cage[4][4], struct Mesh *me_cage);
 
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index 8d92fb9..575e436 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -275,6 +275,9 @@ struct Render
 
 	struct ImagePool *pool;
 	struct EvaluationContext *eval_ctx;
+
+	/* current object being baked - used by Bake API only */
+	int baking_object_id;
 };
 
 /* ------------------------------------------------------------------------- */
diff --git a/source/blender/render/intern/source/bake_api.c b/source/blender/render/intern/source/bake_api.c
index 48ef291..fff050e 100644
--- a/source/blender/render/intern/source/bake_api.c
+++ b/source/blender/render/intern/source/bake_api.c
@@ -132,6 +132,7 @@ static void store_bake_pixel(void *handle, int x, int y, float u, float v)
 	pixel->du_dy = bd->du_dy;
 	pixel->dv_dx = bd->dv_dx;
 	pixel->dv_dy = bd->dv_dy;
+	pixel->object_id = 0;
 }
 
 void RE_bake_mask_fill(const BakePixel pixel_array[], const size_t num_pixels, char *mask)
@@ -271,7 +272,7 @@ static void calc_barycentric_from_point(
  * This function populates pixel_array and returns TRUE if things are correct
  */
 static bool cast_ray_highpoly(
-        BVHTreeFromMesh *treeData, TriTessFace *triangles[], BakeHighPolyData *highpoly,
+        BVHTreeFromMesh *treeData, TriTessFace *triangles[], BakePixel *pixel_array, BakeHighPolyData *highpoly,
         const float co[3], const float dir[3], const int pixel_id, const int tot_highpoly,
         const float du_dx, const float du_dy, const float dv_dx, const float dv_dy)
 {
@@ -322,22 +323,22 @@ static bool cast_ray_highpoly(
 		}
 	}
 
-	for (i = 0; i < tot_highpoly; i++) {
-		if (hit_mesh == i) {
-			calc_barycentric_from_point(triangles[i], hits[i].index, hits[i].co, &primitive_id, uv);
-			highpoly[i].pixel_array[pixel_id].primitive_id = primitive_id;
-			copy_v2_v2(highpoly[i].pixel_array[pixel_id].uv, uv);
-
-			/* the differentials are relative to the UV/image space, so the highpoly differentials
-			 * are the same as the low poly differentials */
-			highpoly[i].pixel_array[pixel_id].du_dx = du_dx;
-			highpoly[i].pixel_array[pixel_id].du_dy = du_dy;
-			highpoly[i].pixel_array[pixel_id].dv_dx = dv_dx;
-			highpoly[i].pixel_array[pixel_id].dv_dy = dv_dy;
-		}
-		else {
-		

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list