Commit: 993f316d79171973399cbfbf2379b78004943369
Author: Dalai Felinto
Date:   Fri Apr 25 21:44:57 2014 -0300
https://developer.blender.org/rB993f316d79171973399cbfbf2379b78004943369

Cycles-Bake: "Clear" option fully supported

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

M       source/blender/editors/object/object_bake_api.c
M       source/blender/render/extern/include/RE_bake.h
M       source/blender/render/intern/source/bake_api.c

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

diff --git a/source/blender/editors/object/object_bake_api.c 
b/source/blender/editors/object/object_bake_api.c
index 54eb267..077e8e8 100644
--- a/source/blender/editors/object/object_bake_api.c
+++ b/source/blender/editors/object/object_bake_api.c
@@ -123,40 +123,71 @@ static int bake_break(void *UNUSED(rjv))
 
 static bool write_internal_bake_pixels(
     Image *image, BakePixel pixel_array[], float *buffer,
-    const int width, const int height, const bool is_linear, const int margin)
+    const int width, const int height, const bool is_linear,
+    const int margin, const bool is_clear)
 {
        ImBuf *ibuf;
        void *lock;
        bool is_float;
+       char *mask_buffer = NULL;
+       const int num_pixels = width * height;
 
        ibuf = BKE_image_acquire_ibuf(image, NULL, &lock);
 
        if (!ibuf)
                return false;
 
-       is_float = false;
+       is_float = (ibuf->flags & IB_rectfloat);
+
+       if (margin > 0 || !is_clear) {
+               mask_buffer = MEM_callocN(sizeof(char) * num_pixels, "Bake 
Mask");
+               RE_bake_mask_fill(pixel_array, num_pixels, mask_buffer);
+       }
 
        /* populates the ImBuf */
-       if (is_float) {
-               IMB_buffer_float_from_float(
-                   ibuf->rect_float, buffer, ibuf->channels,
-                   IB_PROFILE_LINEAR_RGB, IB_PROFILE_LINEAR_RGB, false,
-                   ibuf->x, ibuf->y, ibuf->x, ibuf->y
-                   );
+       if (is_clear) {
+               if (is_float) {
+                       IMB_buffer_float_from_float(
+                           ibuf->rect_float, buffer, ibuf->channels,
+                           IB_PROFILE_LINEAR_RGB, IB_PROFILE_LINEAR_RGB, false,
+                           ibuf->x, ibuf->y, ibuf->x, ibuf->y
+                           );
+               }
+               else {
+                       IMB_buffer_byte_from_float(
+                           (unsigned char *) ibuf->rect, buffer, 
ibuf->channels, ibuf->dither,
+                           (is_linear ? IB_PROFILE_LINEAR_RGB : 
IB_PROFILE_SRGB), IB_PROFILE_LINEAR_RGB,
+                           false, ibuf->x, ibuf->y, ibuf->x, ibuf->x
+                           );
+               }
        }
        else {
-               IMB_buffer_byte_from_float(
-                   (unsigned char *) ibuf->rect, buffer, ibuf->channels, 
ibuf->dither,
-                   (is_linear ? IB_PROFILE_LINEAR_RGB : IB_PROFILE_SRGB), 
IB_PROFILE_LINEAR_RGB,
-                   false, ibuf->x, ibuf->y, ibuf->x, ibuf->x
-                   );
+               if (is_float) {
+                       IMB_buffer_float_from_float_mask(
+                           ibuf->rect_float, buffer, ibuf->channels,
+                           IB_PROFILE_LINEAR_RGB, IB_PROFILE_LINEAR_RGB, false,
+                           ibuf->x, ibuf->y, ibuf->x, ibuf->y, mask_buffer
+                           );
+               }
+               else {
+                       IMB_buffer_byte_from_float_mask(
+                           (unsigned char *) ibuf->rect, buffer, 
ibuf->channels, ibuf->dither,
+                           (is_linear ? IB_PROFILE_LINEAR_RGB : 
IB_PROFILE_SRGB), IB_PROFILE_LINEAR_RGB,
+                           false, ibuf->x, ibuf->y, ibuf->x, ibuf->x, 
mask_buffer
+                           );
+               }
        }
 
        /* margins */
-       RE_bake_margin(pixel_array, ibuf, margin, width, height);
+       if (margin > 0)
+               RE_bake_margin(ibuf, mask_buffer, margin);
 
        ibuf->userflags |= IB_BITMAPDIRTY;
        BKE_image_release_ibuf(image, ibuf, NULL);
+
+       if (mask_buffer)
+               MEM_freeN(mask_buffer);
+
        return true;
 }
 
@@ -173,27 +204,38 @@ static bool write_external_bake_pixels(
 
        /* create a new ImBuf */
        ibuf = IMB_allocImBuf(width, height, im_format->planes, (is_float ? 
IB_rectfloat : IB_rect));
+
        if (!ibuf)
                return false;
 
        /* populates the ImBuf */
        if (is_float) {
                IMB_buffer_float_from_float(
-                       ibuf->rect_float, buffer, ibuf->channels,
-                       IB_PROFILE_LINEAR_RGB, IB_PROFILE_LINEAR_RGB, false,
-                       ibuf->x, ibuf->y, ibuf->x, ibuf->y
-                       );
+                   ibuf->rect_float, buffer, ibuf->channels,
+                   IB_PROFILE_LINEAR_RGB, IB_PROFILE_LINEAR_RGB, false,
+                   ibuf->x, ibuf->y, ibuf->x, ibuf->y
+                   );
        }
        else {
                IMB_buffer_byte_from_float(
-                       (unsigned char *) ibuf->rect, buffer, ibuf->channels, 
ibuf->dither,
-                       (is_linear ? IB_PROFILE_LINEAR_RGB : IB_PROFILE_SRGB), 
IB_PROFILE_LINEAR_RGB,
-                       false, ibuf->x, ibuf->y, ibuf->x, ibuf->x
-                       );
+                   (unsigned char *) ibuf->rect, buffer, ibuf->channels, 
ibuf->dither,
+                   (is_linear ? IB_PROFILE_LINEAR_RGB : IB_PROFILE_SRGB), 
IB_PROFILE_LINEAR_RGB,
+                   false, ibuf->x, ibuf->y, ibuf->x, ibuf->x
+                   );
        }
 
        /* margins */
-       RE_bake_margin(pixel_array, ibuf, margin, width, height);
+       if (margin > 0) {
+               char *mask_buffer = NULL;
+               int num_pixels = width * height;
+
+               mask_buffer = MEM_callocN(sizeof(char) * num_pixels, "Bake 
Mask");
+               RE_bake_mask_fill(pixel_array, num_pixels, mask_buffer);
+               RE_bake_margin(ibuf, mask_buffer, margin);
+
+               if (mask_buffer)
+                       MEM_freeN(mask_buffer);
+       }
 
        if ((ok = BKE_imbuf_write(ibuf, filepath, im_format))) {
 #ifndef WIN32
@@ -611,7 +653,7 @@ static int bake_exec(bContext *C, wmOperator *op)
                        BakeImage *image = &images[i];
 
                        if (is_save_internal) {
-                               ok = write_internal_bake_pixels(image->image, 
pixel_array_low + image->offset, result + image->offset * depth, image->width, 
image->height, is_linear, margin);
+                               ok = write_internal_bake_pixels(image->image, 
pixel_array_low + image->offset, result + image->offset * depth, image->width, 
image->height, is_linear, margin, is_clear);
 
                                if (!ok) {
                                        BKE_report(op->reports, RPT_ERROR, 
"Problem saving the bake map internally, make sure there is a Texture Image 
node in the current object material");
diff --git a/source/blender/render/extern/include/RE_bake.h 
b/source/blender/render/extern/include/RE_bake.h
index 5eee739..d589c42 100644
--- a/source/blender/render/extern/include/RE_bake.h
+++ b/source/blender/render/extern/include/RE_bake.h
@@ -78,7 +78,9 @@ void RE_populate_bake_pixels_from_objects(struct Mesh 
*me_low, BakePixel pixel_a
 
 void RE_populate_bake_pixels(struct Mesh *me, struct BakePixel *pixel_array, 
const int num_pixels, const struct BakeImage *images);
 
-void RE_bake_margin(const BakePixel pixel_array[], struct ImBuf *ibuf, const 
int margin, const int width, const int height);
+void RE_bake_mask_fill(const BakePixel pixel_array[], const int num_pixels, 
char *mask);
+
+void RE_bake_margin(struct ImBuf *ibuf, char *mask, const int margin);
 
 void RE_normal_world_to_object(const BakePixel pixel_array[], const int 
num_pixels, const int depth, float result[], struct Object *ob, const 
BakeNormalSwizzle normal_swizzle[3]);
 void RE_normal_world_to_tangent(const BakePixel pixel_array[], const int 
num_pixels, const int depth, float result[], struct Mesh *me, const 
BakeNormalSwizzle normal_swizzle[3]);
diff --git a/source/blender/render/intern/source/bake_api.c 
b/source/blender/render/intern/source/bake_api.c
index 998ca13..fbe72d4 100644
--- a/source/blender/render/intern/source/bake_api.c
+++ b/source/blender/render/intern/source/bake_api.c
@@ -125,32 +125,28 @@ static void store_bake_pixel(void *handle, int x, int y, 
float u, float v)
        0.0f;
 }
 
-void RE_bake_margin(const BakePixel pixel_array[], ImBuf *ibuf, const int 
margin, const int width, const int height)
+void RE_bake_mask_fill(const BakePixel pixel_array[], const int num_pixels, 
char *mask)
 {
-       char *mask_buffer = NULL;
-       const int num_pixels = width * height;
        int i;
-
-       if (margin < 1)
+       if (!mask)
                return;
 
-       mask_buffer = MEM_callocN(sizeof(char) * num_pixels, "BakeMask");
-
        /* only extend to pixels outside the mask area */
        for (i = 0; i < num_pixels; i++) {
                if (pixel_array[i].primitive_id != -1) {
-                       mask_buffer[i] = FILTER_MASK_USED;
+                       mask[i] = FILTER_MASK_USED;
                }
        }
+}
 
+void RE_bake_margin(ImBuf *ibuf, char *mask, const int margin)
+{
        /* margin */
-       IMB_filter_extend(ibuf, mask_buffer, margin);
+       IMB_filter_extend(ibuf, mask, margin);
 
        if (ibuf->planes != R_IMF_PLANES_RGBA)
                /* clear alpha added by filtering */
                IMB_rectfill_alpha(ibuf, 1.0f);
-
-       MEM_freeN(mask_buffer);
 }
 
 /*

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

Reply via email to