[Bf-blender-cvs] [bc5d144855d] blender-v2.90-release master: Fix T77298: Can't bake texture with multiple objects

Lukas Stockner noreply at git.blender.org
Mon Aug 10 23:20:37 CEST 2020


Commit: bc5d144855d540d6ea663b0bb13607b692b6b5f0
Author: Lukas Stockner
Date:   Mon Aug 10 22:47:12 2020 +0200
Branches: blender-v2.90-release master
https://developer.blender.org/rBbc5d144855d540d6ea663b0bb13607b692b6b5f0

Fix T77298: Can't bake texture with multiple objects

The problem here is that the baking code uses tiles to exchange pixel data with
the renderer since a recent-ish refactor, but the code that sent data to the
renderer did not initialize the bake result pixels.

Therefore, when the baking process for the second object started, Cycles
received empty tiles and sent them back as-is if the second object did not
cover them.

By initializing the tiles with the result of the previous bakes, we avoid this
problem.

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

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

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

diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c
index 633b9324d9f..075202e8a79 100644
--- a/source/blender/render/intern/source/external_engine.c
+++ b/source/blender/render/intern/source/external_engine.c
@@ -174,7 +174,8 @@ static RenderResult *render_result_from_bake(RenderEngine *engine, int x, int y,
   BLI_addtail(&rr->layers, rl);
 
   /* Add render passes. */
-  render_layer_add_pass(rr, rl, engine->bake.depth, RE_PASSNAME_COMBINED, "", "RGBA");
+  RenderPass *result_pass = render_layer_add_pass(
+      rr, rl, engine->bake.depth, RE_PASSNAME_COMBINED, "", "RGBA");
   RenderPass *primitive_pass = render_layer_add_pass(rr, rl, 4, "BakePrimitive", "", "RGBA");
   RenderPass *differential_pass = render_layer_add_pass(rr, rl, 4, "BakeDifferential", "", "RGBA");
 
@@ -210,6 +211,15 @@ 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;
 }



More information about the Bf-blender-cvs mailing list