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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to