[Bf-blender-cvs] [12fc3954365] blender-v3.0-release: Fix T93152: Cycles baking multiple selected object to active not working

Brecht Van Lommel noreply at git.blender.org
Thu Nov 18 17:47:06 CET 2021


Commit: 12fc395436520157a98b6f6a07d5154033988bf8
Author: Brecht Van Lommel
Date:   Thu Nov 18 17:43:27 2021 +0100
Branches: blender-v3.0-release
https://developer.blender.org/rB12fc395436520157a98b6f6a07d5154033988bf8

Fix T93152: Cycles baking multiple selected object to active not working

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

M	source/blender/render/intern/engine.c

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

diff --git a/source/blender/render/intern/engine.c b/source/blender/render/intern/engine.c
index 5f8679b572d..cb92b15f873 100644
--- a/source/blender/render/intern/engine.c
+++ b/source/blender/render/intern/engine.c
@@ -206,8 +206,8 @@ static RenderResult *render_result_from_bake(RenderEngine *engine, int x, int y,
   BLI_addtail(&rr->layers, rl);
 
   /* Add render passes. */
-  RenderPass *result_pass = render_layer_add_pass(
-      rr, rl, engine->bake.depth, RE_PASSNAME_COMBINED, "", "RGBA", true);
+  render_layer_add_pass(rr, rl, engine->bake.depth, RE_PASSNAME_COMBINED, "", "RGBA", true);
+
   RenderPass *primitive_pass = render_layer_add_pass(rr, rl, 4, "BakePrimitive", "", "RGBA", true);
   RenderPass *differential_pass = render_layer_add_pass(
       rr, rl, 4, "BakeDifferential", "", "RGBA", true);
@@ -244,15 +244,6 @@ static RenderResult *render_result_from_bake(RenderEngine *engine, int x, int y,
     }
   }
 
-  /* Initialize tile render result from full image bake result. */
-  for (int ty = 0; ty < h; ty++) {
-    size_t offset = ty * w * engine->bake.depth;
-    size_t bake_offset = ((y + ty) * engine->bake.width + x) * engine->bake.depth;
-    size_t size = w * engine->bake.depth * sizeof(float);
-
-    memcpy(result_pass->rect + offset, engine->bake.result + bake_offset, size);
-  }
-
   return rr;
 }
 
@@ -264,18 +255,31 @@ static void render_result_to_bake(RenderEngine *engine, RenderResult *rr)
     return;
   }
 
-  /* Copy from tile render result to full image bake result. */
-  int x = rr->tilerect.xmin;
-  int y = rr->tilerect.ymin;
-  int w = rr->tilerect.xmax - rr->tilerect.xmin;
-  int h = rr->tilerect.ymax - rr->tilerect.ymin;
+  /* Copy from tile render result to full image bake result. Just the pixels for the
+   * object currently being baked, to preserve other objects when baking multiple. */
+  const int x = rr->tilerect.xmin;
+  const int y = rr->tilerect.ymin;
+  const int w = rr->tilerect.xmax - rr->tilerect.xmin;
+  const int h = rr->tilerect.ymax - rr->tilerect.ymin;
+  const size_t pixel_depth = engine->bake.depth;
+  const size_t pixel_size = pixel_depth * sizeof(float);
 
   for (int ty = 0; ty < h; ty++) {
-    size_t offset = ty * w * engine->bake.depth;
-    size_t bake_offset = ((y + ty) * engine->bake.width + x) * engine->bake.depth;
-    size_t size = w * engine->bake.depth * sizeof(float);
+    const size_t offset = ty * w;
+    const size_t bake_offset = (y + ty) * engine->bake.width + x;
 
-    memcpy(engine->bake.result + bake_offset, rpass->rect + offset, size);
+    const float *pass_rect = rpass->rect + offset * pixel_depth;
+    const BakePixel *bake_pixel = engine->bake.pixels + bake_offset;
+    float *bake_result = engine->bake.result + bake_offset * pixel_depth;
+
+    for (int tx = 0; tx < w; tx++) {
+      if (bake_pixel->object_id == engine->bake.object_id) {
+        memcpy(bake_result, pass_rect, pixel_size);
+      }
+      pass_rect += pixel_depth;
+      bake_result += pixel_depth;
+      bake_pixel++;
+    }
   }
 }



More information about the Bf-blender-cvs mailing list