Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Stockner <lukas.stockner@freenet.de>2020-08-10 23:47:12 +0300
committerLukas Stockner <lukas.stockner@freenet.de>2020-08-10 23:54:01 +0300
commitbc5d144855d540d6ea663b0bb13607b692b6b5f0 (patch)
treec57ec05851bf2064d93979ed58dcb01fe5c5903e /source/blender/render
parent8ef05d3180b1b54c7647d059a1f8a6c610937bc9 (diff)
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.
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/intern/source/external_engine.c12
1 files changed, 11 insertions, 1 deletions
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;
}